Перейти к содержанию
  • Автор оригинала: Warrior

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

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

    • Нравится 20

    Обратная связь

    Рекомендуемые комментарии

    Сантьяго

    Опубликовано

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



    Для публикации сообщений создайте учётную запись или авторизуйтесь

    Вы должны быть пользователем, чтобы оставить комментарий

    Создать аккаунт

    Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

    Регистрация нового пользователя

    Войти

    Уже есть аккаунт? Войти в систему.

    Войти

×
×
  • Создать...