×
Меню
Индекс

Scripting under MWSE 0.9

Просто для истории! Т.к. для МВСЕ на ЛУА это не актуально.

http://www.fullrest.ru/forum/topic/25384-manual-po-skriptam-pod-mwse/
 
Redoran_Warrior(С) 2009
 
Писание скриптов под MWSE
 
Вступление
Ты хотел бы изучить функции MWSE ?
Если ты еще не знаком с оригинальным скриптовым языком , советую прочитать учебник Ghаn-Buri-Ghan’а.
В целом , MWSE добавляет 80 новых функций , 2 новых типа .
 
Компилирование скриптов с расширенными функциями.
 
Чтобы скомпилировать скрипты с расширенными функциями , используйте такие программы ,как MWEditSE , либо MWEdit .
ТЕС КС не поддерживает скрипты под MWSE , но вы можете использовать КС для редактирования остальных вещей в вашем плагине, не относящимся к скриптам. Впрочем, вы можете использовать КС и для редактирования скриптов с расширенными функциями , но вам выдаст ошибку , когда вы попытаетесь скомпилировать скрипт в КС.
MWEditSE не проверяет скрипты на ошибки при компиляции , когда вы используете новые функции , поэтому – будьте бдительны и не допускайте ошибок.
Команду MenuTest 0 или ToggleMenus MWedit компилирует отлично от CS. Поэтому скрипты с этими командами можно компилировать только в CS, иначе отключаются Все меню. Более подробно это может разъяснить только автор MWedit.
 
Новые Ограничения и Полномочия в типах переменных.
 
Функции MWSE паботают с двумя типами переменных – STRING и REF . Оба обьявлены в скриптах ,использующих тип “long” . В обычных скриптах переменная типа “invitem” обрабатывается как STRING ( ограничение ) расширенными функциями . “invref” и “pcref” рассматриваются , как REF ( полномочие ) .
 
Значение новой команды “setx”
 
К сожалению , новые функции не могут быть простым способом объединены со стандартными функциями и командами. Команда “setx” используется , как заменитель стандартной команды “set” , когда вы используете новую функцию. Вы можете поставить значение только одной функции или ограничения по правую сторону от “”setx , но вы также можете ставить несколько значений по левую сторону , таких , как например “xInventory” , которая возвращает множественные значеня. .
Опять напомню вам, что компилятор не проверяет скрипты с расширенными функциями на ошибки, поэтому – будьте бдительны.
 
Подача контрольных блоков с 'ifx' и 'whilex'
 
Стандартные скриптовые команды ‘if’ и ‘while’ не работают , когда тело блока включает в себя расширенные команды , для их замены используем 'ifx' и 'whilex' . 'ifx' и 'whilex' еще не полностью поддерживают синтаксис , я пока что использую только одно значение для примера . 'ifx' и 'whilex' будут работать , только когда значение НЕ равно нулю . Также вы можете использовать ‘else’ вместе с 'ifx' , но ни в коем случае ‘elseif’ , а ‘elseufx’ также нету .
Смотрите пример
Старая версия скрипта
 
if ( state == 5 )
раздел для 5
else
раздел , если не равно 5
endif
Новая версия скрипта
 
set temp to ( state - 5 )
ifx ( temp )
раздел если не равно 5
Else
раздел Если равно 5
endif
 
Если оставить только первый кусок , то будет так
 
Старая версия
 
if ( state == 5 )
раздел если равно 5
endif
 
Новая версия
set temp to ( state - 5 )
ifx ( temp )
else
раздел если равно 5
endif
 
Функции
 
Типы названые STRING и REF на самом деле поддерживаются , как переменные типа ‘long’ . Функции перечисленные с операцией REF-> на какой-то предмет , поддерживаются через оператор -> , также поддерживаются через функцию xSetRef
 
References ( Полномочия )
xSetRef, xRefType, xGetRef, xGetCombat, xGetPCTarget
xFirstNPC, xFirstItem, xFirstStatic, xNextRef
 
Math ( Математические функции )
xDistance, xSqrt, xHypot, xDegRad, xRadDeg
xCos, xSin, xTan, xArcCos, xArcSin, xArcTan
 
AI and Movement ( Программирование ИИ и движения )
xAITravel, xPlace, xPosition, xPositionCell, xStartCombat
 
Inventory ( Инвентарь )
xInventory, xNextStack, xContentList
xAddItem, xRemoveItem, xHasItemEquipped
 
Attributes ( Атрибуты )
xGetBaseStr, xGetBaseInt, xGetBaseWil, xGetBaseAgi
xGetBaseSpe, xGetBaseEnd, xGetBasePer, xGetBaseLuc
 
NPC Properties ( Параметры у NPC(non-playing character ) )
xIsFemale, xIsTrader, xIsTrainer, xIsProvider
xGetService, xSetService, xModService
xGetBaseGold, xGetGold, xSetBaseGold, xSetGold
 
Item Properties ( Параметры у итемов )
xGetValue, xGetOwner, xGetWeight, xGetEncumb, xGetQuality
xGetCondition, xGetMaxCondition, xGetCharge, xGetMaxCharge
 
Keyboard Input ( Раскладка клавиатуры )
xKeyPressed, xTextInput, xTextInputAlt
 
File I/O
xFileRewind, xFileSeek, xFileReadText, xFileWriteText
xFileReadShort, xFileReadLong, xFileReadFloat, xFileReadString
xFileWriteShort, xFileWriteLong, xFileWriteFloat, xFileWriteString
 
Strings( Ограничения )
xPCCellID, xRefID, xMyCellID, xGetName, xGetBaseID
xStringCompare, xStringLength, xStringParse
xStringBuild, xLogMessage, xMessageFix
 
 
xSetRef REF_reference
эта функция позволяет называть функции обьектов там , где стандартный синтаксис не позволяет
set myalchemyskill to myobject->GetAlchemy не работает , потому что стандартная ‘set’ не позволяет использовать переменные , как обьекты , поэтому мы будем писать так :
xSetRef myobject
set myalchemyskill to GetAlchemy
 
LONG REF->xRefType
 
Видит тип полномочий обьекта и переводит тип обьекта в цифры
 
1230259009 = ACTI (Активатор)
1212369985 = ALCH (Алхимия(выпивка и т.п.))
1095782465 = APPA (Аппарат для деланья зелий)
1330467393 = ARMO (Армор )
1263488834 = BOOK (Книжка)
1414483011 = CLOT (Одежда)
1414418243 = CONT (Контейнер)
1095062083 = CREA (Кричер)
1380929348 = DOOR (Дверь)
1380404809 = INGR (Ингридиент)
1129727308 = LEVC (Уровневый кричер)
1230390604 = LEVI (Уровневый итем)
1212631372 = LIGH (светильник)
1262702412 = LOCK (Отмычка)
1129531725 = MISC (Миск итем)
1598246990 = NPC_ (Непись)
1112494672 = PROB (Щуп)
1095779666 = REPA (Чинилки)
1414546259 = SCPT (Скрипт)
1195658835 = SNDG (Генератор звука)
1413567571 = STAT (Статик)
1346454871 = WEAP (Оружие)
 
REF REF->xGetRef STRING_objectid
Возвращает значение к одному активным обьектам , распределяя по ID , или 0 , если не находит активных обьектов. Очень полезно для размещения Неписей и уникальных обьектов.
 
REF REF->xGetCombat
Возвращает значение к цели, на которую была совершена атака , или же 0 , если атака совершена не была .
 
REF xGetPCTarget
Возвращает значение обьекту , на который направлен прицел игрока , или же 0 , если игрок не смотрит ни на что , что могло бы по отношению к нему быть использовано
 
REF xFirstNPC
Возвращает значение определенному неписю или кричеру , который находится с игроком в одной ячейке , или же 0 , если там никого нет .
 
REF xFirstItem
Возвращает такое же значение , как и xFirstNPC , отличие в том , что теперь подразумеваются обьекты.
 
REF xFirstStatic
То же самое , теперь со статиками.
 
REF xNextRef REF_current
Возвращает значение 'next' одному из трех типов обьектов (NPC, Item, и Static) которые находятся с игроком в одной ячейке .
 
FLOAT REF->xDistance REF_target
Подобно оригинальному GetDistance , но берет значения переменной , несмотря на ограничение objected . Использует систему координат из ТЕС КС.
 
FLOAT xSqrt FLOAT_value
Возвращает квадратный корень значения ( аналогично с GetSquareRoot из трибунала )
 
FLOAT xHypot FLOAT_a, FLOAT_b
Возвращает гипотенузу для сторон а,б и с
 
FLOAT xDegRad FLOAT_degrees
Контвертит значение из градусов в радианы.
 
FLOAT xRadDeg FLOAT_radians
Из радианов в градусы
 
FLOAT xCos FLOAT_angle
Возвращает косинус угла( угол дается в радианах )
 
FLOAT xSin FLOAT_angle
Возвращает синус угла ( угол дается в радианах )
 
FLOAT xTan FLOAT_angle
Возвращает тангенс угла( угол дается в радианах )
 
FLOAT xArcCos FLOAT_value
Возвращает косинус дуги ( в радианах )
 
FLOAT xArcSin FLOAT_value
Синус дуги ( в радианах )
 
FLOAT xArcTan FLOAT_value
Тангенс дуги ( в радианах )
 
REF->xAITravel FLOAT_x, FLOAT_y, FLOAT_z
Аналог AITravel , чтобы согласовать переменные.
 
REF xPlace STRING_objectid
Ставит обьект objectID за игроком.
 
REF->xPosition FLOAT_x, FLOAT_y, FLOAT_z, FLOAT_zRot
Аналог оригинальной функции Position.
 
REF->xPositionCell FLOAT_x, FLOAT_y, FLOAT_z, FLOAT_zRot, STRING_cellname
Аналог оригинальной PositionCell
 
REF->xStartCombat REF_target
Аналог оригинальной StartCombat
 
STRING, LONG, REF REF->xInventory
Возвращает три значения , которые основаны на инвентаре определенного контейнера , непися или кричера . Первое – ID итема в инвентаре. Второе – номер итема который найден . Третье – то ,полномочие , которое мы имеем относительно этого итема . Все три значения будут равны 0 ,если ничего в инвентаре нет
 
STRING, LONG, REF xNextStack REF_next
Возвращает значение следующего итема в инвентаре. Параметром этой функции является результат предыдущей функции xInventory . Попытки привязать другой вид значений этой функции приведет к ошибкам , и , возможно , краху игры. Если инвентарь непися , кричера или контейнера изменен , то полученное значение этой функции бесполезно, потому , что надополучить новое значение с измененным инвентарем .
 
STRING, LONG, LONG, LONG, FLOAT, STRING, REF REF->xContentList REF_next
Альтернатива как для функции xInventory , так и для функции xNextStack , которая возвращает 7 значений основанных на состоянии определенного контейнера , непися или кричера . Если входной параметр равен 0 , то первый итем контейнера , непися или кричера возвращена
Пример : set id count type value weight name next to container->xContentList next
Первый параметр – id – это ИД обьекта . Второй – который он по счету . Третий – тип по кодам , использованным в функции xRefType . Остальные три – цена , вес , имя .
 
REF->xAddItem STRING_idstring, LONG_count
Аналог стандартной AddItem .
 
REF->xRemoveItem STRING_idstring, LONG_count
Аналог стандартной RemoveItem .
 
LONG REF->xHasItemEquipped STRING_objectid
Возвращает 1 если непись или кричер чтото еквипнул ( меч и т.п ) , 0 – если ничего не еквипнул .
 
FLOAT REF->xGetBaseStr
Возвращает значение силы непися.
 
FLOAT REF->xGetBaseInt
Возвращает значение интеллекта непися .
 
FLOAT REF->xGetBaseWil
Возвращает значение воли непися.
 
FLOAT REF->xGetBaseAgi
Возвращает значение ловкости непися.
 
FLOAT REF->xGetBaseSpe
Возвращает значение скорости непися
 
FLOAT REF->xGetBaseEnd
Возвращает значение выносливости непися.
 
FLOAT REF->xGetBasePer
Возвращает значение привлекательности непися .
 
FLOAT REF->xGetBaseLuc
Возвращает значение удачи непися.
 
LONG REF->xIsFemale
Возвращает 1 если непись – женщина , 0 – если нет.
 
LONG REF->xIsTrader
Возвращает 0 , если непись или кричер не торговец , остальные значения – это сколько типов предметов он будет покупать .
 
LONG REF->xIsTrainer
Возвращает 1 , если непись тренирует навыки , 0 – если нет .
 
LONG REF->xIsProvider
Возвращает значения выше 0 ,если непись делает заклинания , учит заклинаниям , чинит предметы или зачаровывает. Возвращает 0 , если нет .
 
LONG REF->xGetService LONG_mask
Комбинация функций xIsTrader, xIsTrainer, и xIsProvider .
 
Значение Занятие
1 Торгует оружием
2 Торгует арморами
4 Торгует одеждой
8 Торгует книжками
16 Торгует ингредиентами
32 Торгует отмычками
64 Торгует щупами
128 Торгует светильниками
256 Торгует аппаратурой для деланья зелий
512 Торгует чинилками
1024 Торгует misc итемами
2048 Учит заклинаниям
4096 Торгует зачарованными предметами
8192 Торгует зельями
16384 Тренирует
32768 Делает заклинания.
65536 Зачаровывает предметы
131072 Чинит арморы и оружие
 
REF->xSetService LONG_value
Используется для перемены параметров непися , через значение цифр . Например , Используя значение 8 мы сделаем , чтобы непись торговал книжками .
 
REF->xModService LONG_value
Модифицирует уже выбранные значения занятий непися.
 
LONG REF->xGetBaseGold
Возвращает значение , сколько золота есть у непися ( или кричера ).
 
LONG REF->xGetGold
Возвращает значение количества золота , которым сейчас обладает непись для проведения
торговли.
 
REF->xSetBaseGold LONG_amount
Изменяет основное количество золота у непися ( или кричера )
 
REF->xSetGold LONG_amount
Аналогично , но количество золота- которое есть сейчас.
 
LONG REF->xGetValue
Возвращает значение цены обьекта .
 
STRING REF->xGetOwner
Возвращает 0 если обьект никому не принадлежит , ID владельца , если кому –то принадлежит , или ”unknown” если он принадлежит какой-то фракции .
 
FLOAT REF->xGetWeight
Возвращает значение веса обьекта.
 
FLOAT REF->xGetEncumb
Возвращает полный вес всех обьектов у непися , кричера или у контейнера .
 
FLOAT REF->xGetQuality
Возвращает значение качества аппаратов для деланья зелий , отмычек и щупов , чинилок.
 
LONG REF->xGetCondition
Возвращает текущее значение для армора , оружия , отмычек , щупов.
 
LONG REF->xGetMaxCondition
Возвращает максимальное условие оружию , отмычкам, чинилкам .
 
FLOAT REF->xGetCharge
Возвращает текущее использование , типа ”когда заклинание использовано” . Постоянный эффект и незачарованые вещи – возвращает 0.
 
FLOAT REF->xGetMaxCharge
Показывает максимальный эффект заклинания.
 
LONG REF->xKeyPressed LONG_code
Показывает статус клавиатуры ( и кнопок мыши ) . Что-то похожее на GetPCSneaking , но вообще-то отслеживает , какая кнопка была нажата .Если входной параметр – цифровое значение клавиши ( между 1 и 254 ) будет остлеживать состояние заданной клавиши , если входной параметр 0 – отслеживать нажатие любой клавиши.
 
LONG, STRING REF->xTextInput STRING_message, LONG_endcode
Это позволяет сразу считать входной сигнал клавиатуры и результаты будут возвращены как ограничение Функция ждет ключа , который нужно набрать , и после этого предпримет одно из 3 действий. Если ключ подходит , то все возвращается. Если код соответствует стандартам ASCII , то возвращается цифра 0 . Если RETURN или BACKSPACE то ничаинается новая линия , или стирается старая .
 
Пример.
 
long endchar
        long message
        long length
        ifx ( endchar )
        else                                      
                        DisablePlayerControls
                        set endchar to 13                                
                        setx message to xStringBuild ""
                        set length to 0
                        return
        endif
        ifx ( length )
        else                                      
                        setx length message to xTextInput message endchar
                        .
                        MessageBox ""
                        xMessageFix "%s            %" message  
                        MessageBox "                                                                                                      "
                        MessageBox "Enter a message and press ENTER when it is complete."
                        return
        endif
        EnablePlayerControls      ; The message is complete now
 
 
LONG, STRING REF->xTextInputAlt STRING_message, LONG_endcode
Функция , идентичная функции xTextInput .
 
xFileRewind STRING_filename
Двигает текущее положение чтения к началу скрипта.
 
xFileSeek STRING_filename, LONG_offset
Сдвигает позицию считывания в определенное место файла.
 
LONG, ... xFileReadText STRING_filename, STRING_pattern
Считывает текст с файла с определенной позиции считывания. Текущая позиция должна быть потом выбрана .
 
xFileWriteText STRING_filename, STRING_format, ...
Вписывает строку в файл в определенную позицию .
 
LONG, SHORT, ... xFileReadShort STRING_filename, LONG_NumToRead
Считывает значение и число переменных типа SHORT ( 2 байта ) .
 
LONG, LONG, ... xFileReadLong STRING_filename, LONG_NumToRead
Аналогично с xFileReadShort , но считывает переменные типа LONG .(4 байта)
 
LONG, FLOAT, ... xFileReadFloat STRING_filename, LONG_NumToRead
Аналогично , но считывает переменные типа FLOAT.
 
xFileWriteShort STRING_filename, SHORT_value
Вписывает значение типа SHORT (2 байта) в файл в определенное место
 
xFileWriteLong STRING_filename, LONG_value
Аналогично , тип LONG
 
xFileWriteFloat STRING_filename, FLOAT_value
Аналогично , тип float
 
STRING xPCCellID
Возвращает строку с названием ячейки , в которой игрок.
 
STRING REF->xMyCellID
Возвращает значение , в котором имя ячейки , в которой определенный обьект .
 
STRING REF->xGetName
Возвращает имя обьекта , или 0 , если у обьекта нет имени ( не ID , а имя )
 
STRING REF->xGetBaseID
Возвращает значение основного ID обьекта .
 
LONG xStringCompare STRING_str1, STRING_str2
Сравнивает 2 строки( обьекта ) в алфавитном порядке , и возвращает 0 , если они идентичны.
 
LONG xStringLength STRING_string
Возвращает число character’зов во входной строке.
 
xLogMessage STRING_format, ...
вписывает отформатированные строки коды в файл – лог . ((MWScriptExtender.log) )
 
xMessageFix STRING_message, ...
Эта функция позволяет вам использовать переменные STRING вместе с функцией MessageBox. Во – первых , команда MessageBox должна сразу следовать после команды
xMessageFix. Во – вторых , число строк для этой функции должно соответствовать числу строк в функции MessageBox. В – третьих , MessageBox имеет кнопки , но не может использовать переменные . И , в конце – концов , значения строк используемых на MessageBox будут заменены значениями xMessageFix .
 
long thiscell
        setx thiscell to fid->xPCCellID
        xMessageFix "куда телепортнуть Фаргота ?" thiscell "Сейда Нин" "Красная Гора"
        MessageBox "Отправить Фаргота в локацию" "Моя ячейка" "Де он был" "Вос"
 
 
Если вы в Кальдере , Арене Вивека или Альдруне , вам выдаст куда телепортнуть Фаргота
 
Кальдера
Сейда Нин
Красная Гора
 
куда телепортнуть Фаргота
Вивек, Округ Арены
Сейда Нин
Красная Гора
 
 
Примеры скриптов
 
Этот скрипт отслеживает и выводит массу предмета , на который направлен прицел игрока
 
begin getweight_of_pctarget
 
        long pctarget
        float weight
 
           StopScript getweight_of_pctarget
 
        setx pctarget to xGetPCTarget  ; Возвращает 0 если нету цели
       
        if ( pctarget == 0 )  ; Нет цели , поэтому массу не показывает
                MessageBox "Вы не нашли предмета для вычисления массы."
                return
        endif
 
   ; гм, теперь если направил
        setx weight to pctarget->xGetWeight
 
        MessageBox "The item had weight %f" weight
 
        End
 
 
Скрипт , который заставит всех неписей мужиков , кроме Фаргота , бежать на место , на котором сейчас находится игрок
 
begin siren_call
 
        short call              
 
        long prospectref  
        long prospectid
 
        long temp                
 
        float px                  
        float py
        float pz
 
        set px to player->GetPos X
        set py to player->GetPos Y
        set pz to player->GetPos Z
 
   ; проверяем , что за НПС или кричеры в ячейке
        setx prospectref to xFirstNPC
        whilex ( prospectref )
 
                set call to 1
 
           ; проверяем тип , так как мы не хотим , чтобы кричеры тоже шли на это место
                setx temp to prospectref->xRefType
                if ( temp != 1598246990 )  ; it's not an NPC
                        set call to 0
                endif
 
           ; проверяем , мужчина ли это
                setx temp to prospectref->xIsFemale
                if ( temp != 0 )                 ; it's not a male
                        set call to 0
                endif
 
           ; считываем ID этого НПС , Фаргот ли это
                setx prospectid to prospectref->xGetBaseID
                setx temp to xStringCompare prospectid "fargoth"
                if ( temp == 0 )                 ; it's Fargoth
                        set call to 0
                endif
 
           ;
                ifx ( call ) 
                        xSetRef prospectref         
                        ForceRun
                        prospectref->xAITravel px py pz
                endif
 
                setx prospectref to xNextRef prospectref
        endwhile
 
   ; только для одного фрейма
        stopscript siren_call
 
        end