Скриптинг с MWSE
Написание скриптов под MWSE
Вступление
Ты хотел бы изучить функции MWSE ? Если ты еще не знаком с оригинальным скриптовым языком, советую прочитать учебник Ghаn-Buri-Ghan’а. В целом, MWSE добавляет 80 новых функций, 2 новых типа.
Компилирование скриптов с расширенными функциями
Чтобы скомпилировать скрипты с расширенными функциями, используйте такие программы, как MWEditSE, либо MWEdit.
TES CS не поддерживает скрипты под MWSE, но вы можете использовать CS для редактирования остальных вещей в вашем плагине, не относящимся к скриптам. Впрочем, вы можете использовать КС и для редактирования скриптов с расширенными функциями, но вам выдаст ошибку, когда вы попытаетесь скомпилировать скрипт в КС.
MWEditSE не проверяет скрипты на ошибки при компиляции, когда вы используете новые функции, поэтому – будьте бдительны и не допускайте ошибок.
Новые Ограничения и Полномочия в типах переменных
Функции 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->xGetBaseSpeed
Возвращает значение скорости непися
- 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
; только для одного фрейма
stopscript siren_call
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 prospect->xIsFemale
if ( temp != 0 ) ; it's not a male
set call to 0
endif
; считываем ID этого НПС, Фаргот ли это
setx prospectid to prospect->xGetBaseID
setx temp to xStringCompare prospectid "fargoth"
if ( temp == 0 ) ; it's Fargoth
set call to 0
endif
;
ifx ( call )
xSetRef prospect
ForceRun
prospect->xAITravel px py pz
endif
setx prospect to xNextRef prospect
endwhile
end
Удачного скриптинга !
Комментарии