Скриптинг с 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

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

Автор: Warrior
1

Комментарии

Подскажи команду проверяющую стоимость заклинания.

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