Просто для истории! Т.к. для МВСЕ на ЛУА это не актуально.
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