Написание скриптов под 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->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

   ; только для одного фрейма
    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


Удачного скриптинга !
© Warrior 2009

 

 


 








Войдите или зарегистрируйтесь, чтобы оставлять комментарии.