![]() |
| ![]() |
Список функций ТЕС СкриптаОбъяснение форматаСперва я представлю формат списка функций их аргументов: Код "строка", пер_числ, пер_float, [дополнительно] (возвращает short) Аргументы функций: «строка» передаёт функции какой-то текст, «пер_числ» – строго определённые числовые константы, «пер_float» – значение переменной определённого типа (здесь – float). Квадратные скобки [] указывают на наличие дополнительных параметров. «(возвращает тип)» – тип возвращаемого значения. Я буду также использовать обозначение типа «Boolean/short», чтобы показать, что функция возвращает 0 или 1 (строго говоря, Boolean – это частный случай типа short). Пример: Код "ID", пер_числ, пер_float Примеры скриптов приведены в рамках: Begin script Работа с объектамиРабота с инвентарёмДобавление и изъятие вещей из инвентаряAddItem, "ID Объекта", количество_числ Эти функции довольно просты. Они добавляют вещь в инвентарь персонажа или удаляют её оттуда. Последняя функция просто «стирает» предмет с лица Нирна, в то время как Drop заставляет персонаж выкинуть объект на пол. Вероятно функции AddItem и RemoveItem могут принимать глобальную переменную в качестве параметров, но только в поле результата диалога и только если Вы не меняете её значения в том же поле. Изъятие из инвентаря предмета, которого там на самом деле нет, не является опасным, однако его вес будет всё равно вычтен из общей нагрузки игрока. Обойти это можно только путём проверки на присутствие предмета, который необходимо удалить. И ещё, не удаляйте предметы, на которых в этот момент работает скрипт – игра просто «вылетит»! У меня не получалось корректно добавить в инвентарь персонажа более 32767 (2 в 15 степени) предметов одного типа за раз. Пример: этот скрипт обсуждался на форумах. Как только игрок одевает предмет, ему предлагают очистить его. Если игрок соглашается, предмет заменяется на «очищенную» версию. Begin scr_thing Скрипт прекрасно работает без строки, выделенной жирным шрифтом, а с ней вылетает. Причина в том, что скрипт прикреплён к “item_a”. Таким образом, предмет пытается удалить сам себя, из-за чего игра вылетает. Поэтому подобные операции должны производиться с помощью глобальных скриптов. Как заставить персонаж бросить предметDrop, "ID Объекта", количество_числ По идее, функция должна изымать предмет из инвентаря любого персонажа и бросать его ему под ноги. Однако, она работает корректно лишь с игроком. Когда я тестировал её на NPC, предмет удалялся из инвентаря вызываемого объекта и бросался под ноги игрового персонажа! Интересное замечание: если заставить персонаж бросить предмет, которого у него нет, то создастся его новая копия. Отслеживание событий, происходящих в инвентареOnPCAdd (местная переменная типа short) Игрок добавил объект в инвентарь. OnPCDrop (местная переменная типа short) Игрок выбросил предмет из инвентаря. OnPCSoulGemUse (местная переменная типа short) Объект является камнем души и был использован в целях перезарядки или создания зачарованного предмета. Надевание предметовEquip, "ID Объекта" Частично не работает. Функция могла стать необычайно полезной, однако, к сожалению, большая часть её потенциала не реализована: Вы не можете надевать что-то на игрока с помощью программного кода; Вы также не можете заставлять NPC одевать броню или брать в руки оружие (это полностью зависит от значения соответствующих навыков); также Вы не можете создавать проклятые предметы, снять которые будет невозможно. Насколько мне известно, Вы лишь можете заставить NPC выпивать зелья. Заметьте: с появлением Трибунала функция была исправлена, так что теперь Вы можете делать всё вышеперечисленное :) Пример: этот скрипт проклинает хитиновую дубину, так что игрок не сможет убрать её из рук даже с помощью «горячих» клавиш. Теперь ему придётся биться лишь с помощью этого оружия до конца своих дней, который, по-видимому, не за горами :) Однако, магию игрок всё же может использовать. Учтите, что для правильной работы скрипту необходим Трибунал. Begin cursed_item Определение того, был ли надет предметOnPCEquip (локальная переменная типа short) Если игрок надел какой-либо предмет, переменная принимает значение 1 (ИСТИНА), которое сохраняется, пока он не будет снят. Иногда Вам придётся самим сбрасывать значение на 0: if ( OnPCEquip == 1 ) ;когда игрок надевает предмет Если в данном примере снять и вновь надеть предмет, то код «[делать что-то]» будет повторён. Заметьте, что это может также выполняться в режиме меню: If (MenuMode ==1) Этот скрипт выполнится, даже когда игрок находится в меню, в то время как следующий фрагмент выполнить лишь по закрытии всех окон: If (MenuMode ==1) Дополнительный пример Вы найдёте после описания функции Equip. Отключение возможности надеть предметPCSkipEquip (переменная типа short) Установите значение этой переменной на 1, чтобы игрок не мог надеть предмет. Удобно для вывода сообщений перед открытием книг и т.д. Для примера более расширенного использования смотрите скрипт «SealedTreasuryReport». Внимание: существует баг, приводящий к тому, что объекты, к которым применяется данная функция, дублируются. Чтобы это обойти, обновляйте инвентарь, используя (из секции, где используется функция OnPCEquip) добавление и моментальное удаление любого предмета. Пример: этот скрипт я создал для мода об оборотнях. Он делает некоторые вещи неодеваемыми при определённых условиях. Begin non_equippable Проверка на присутствие предметов в инвентареGetItemCount, "ID Объект" (возвращает short) Функция возвращает количество необходимых предметов в инвентаре вызываемого персонажа. Ремонт объектовOnPCRepair (локальная переменная типа short) Переменная получает значение 1, когда игрок пытается отремонтировать некий объект. RepairedOnMe, "ID Объекта" (возвращает Boolean/short) Функция возвращает единицу, если вызываемый объект пытаются отремонтировать с помощью предмета “ID Объекта”. Причём вызываемый объект должен быть бронёй или оружием, а ремонтировать необходимо лишь предметами, для этого предназначенными. Схожая функция OnRepair не работает. UsedOnMeUsedOnMe, “ID Объекта” (возвращает Boolean/short) В файле помощи написано: «Функция возвращает 1, если “ID Объекта” был использован на вызываемом предмете. Необходима для скриптов, когда действия зависят от того, использовал ли игрок на необходимом предмете определённый объект». Однако, насколько я знаю, эта функция, к сожалению, не работает. Движение и поворот объектовСледующие функции не работают с игроком, NPC и монстрами. Со статичными объектами всё в порядке. Заметьте: персонажи, стоящие на движущемся предмете вскоре сквозь него проваливаются – этого можно избежать постоянной быстрой деактивацией и активизированием вновь перемещающегося объекта. Также можно снабдить персонажа возможностью левитации или замедления падения (смотрите раздел Секретов и Приёмов). Движение вдоль осей координат объектаMove ось(x/y/z), юнит/сек_числ Функция перемещает объект по необходимой оси координат с заданной скоростью, которая измеряется в юнитах за секунду, а не за фрейм, что освобождает вас от зависимости от производительности компьютера. Движение производится относительно осей координат самого объекта и зависит от его угла поворота. Таким образом, по оси y объект всегда будет перемещаться вперёд: ![]() Помните: функция не работает на NPC и игроке. Движение вдоль глобальной оси координатMoveWorld ось(x/y/z), юнит/сек_числ Функция перемещает объект по глобальной оси координат с заданной скоростью. Движение не зависит от угла поворота. Таким образом, по оси z объект всегда будет двигаться наверх. В глобальной системе координат z всегда вверх-вниз, x восток-запад, y север-юг. ![]() Помните: функция не работает на NPC и игроке. Пример скрипта контролирует движение платформы, если на ней стоит игрок: Begin platform_script Поворачивание объектовТакже как и в случае с движением Вы можете поворачивать объект относительно его собственной или глобальной оси координат. Также существует функция, позволяющая определить угол поворота: Rotate, ось, угол/сек_числ Учтите, что последняя функция возвращает угол поворота относительно глобальной оси координат. Также заметьте, что угол поворота измеряется не в градусах, а является скоростью. Таким образом, чтобы повернуть объект на 90 градусов, Вам придётся либо просто установить значение угла (мгновенный изменение), либо использовать эти функции вкупе с GetAngle. Установление позиции и направление объекта по осямSetAngle, ось, float_числ_угол Эти функции, в отличие от Move и MoveWorld, работают и с персонажами, в том числе с игроком. Они устанавливают необходимый параметр на заданную величину. Система координат всегда локальная для объекта. Заметьте: при условии наличия Трибунала аргументами могут быть переменные типа float, но только если объект находится в активной локации. Пример: скрипт, прикреплённый к ящикам в канализации Мурнхолда, заставляет их дрейфовать на волнах. begin floatAboveStartHeight Сброс параметров объекта на начальные значенияSetAtStart Перемещает объект на начальное положение, которое было установлено в редакторе. Для примера смотрите скрипт под описанием функции Move. Размещение объекта на открытых пространствах и в интерьереPosition, float_числ_x, float_числ_y, float_числ_z, float_числ_ПоворотПоОсиZ Эти функции является превосходным решением для кольца телепортации. Также их можно использовать для перемещения NPC и предметов в новое место. В стандартной версии игры в качестве аргументов принимались лишь числовые константы. Возможно, это изменилось с Трибуналом. Учтите: использование этих функций в поле результата диалога ненадёжно и может вызвать ошибку. Чтобы избежать этого, можно запускать глобальный скрипт, который будет провоцировать перемещения. Пример: скрипт для кольца телепортации. Begin TeleportScript Заметьте, что оба пункта назначения – открытые пространства, однако, эффект достигается двумя разными функциями. Если место появления является небезопасным, например, из-за наличия стены, персонаж очутится в ближайшем к пункту назначения свободном пространстве. Как положить предмет рядом с игрокомPlaceAtPC, "ID Объекта", количество_числ, расстояние_числ, направление_числ Функция позволяет расположить некий объект рядом с игроком, причём можно очень чётко задать его положение – выбрать необходимое направление и расстояние до игрового персонажа. Если предмет нельзя поставить в необходимое место ввиду наличия стены, то он появится прямо у игрока под ногами. Также возможно его появление по одной из других, свободных от преград осей. Направления: CellUpdateCellUpdate Не работает! В файле помощи написано, что функция обновляет информацию о нынешнем положении объекта в локации. Она была призвана помочь при перемещении предметов на большие расстояния. Дело в том, что движок следит за объектами относительно базы данных, в которой хранится их текущее местоположение. Так что после смены локации объект может неправильно выполнять свой скрипт. Это значит, что некоторые предметы, будучи перемещёнными далеко от места их создания, могут просто исчезнуть. К сожалению, все мои попытки протестировать эту функцию закончились ошибкой выполнения программы. Компилятор призывал поставить некий код после функции. Заметка: в Трибунале подобные глюки можно обойти, деактивируя и удаляя объект (SetDelete), а потом помещяя его копию там, где это необходимо. Смотри секцию Секретов и Приёмов. Определение положения и относительное движениеСнаружи или внутри?GetInterior (возвращает Boolean/short) Недокументированно: Функция возвращает 1, если игрок находится в помещении, и 0 – если на улице. Следующий скрипт отлично иллюстрирует работу функции. Если захотите его проверить в игре, просто напишите в консоли: “StartScript Outside_Check”. Begin Outside_Check Определение местонахождения игрокаGetPCCell, "ID Локации" (возвращает Boolean/short) Функция проверяет, находится ли игрок в определённой локации. Заметьте, что условие “Vivec” будет ИСТИНОЙ, если игрок находится и у поста силт страйдера, и в помещениях кантонов. Пример: этот маленький скрипт Bethesda создала для проверки того, покинул ли игрок локацию до того, как взял определённый предмет с тела NPC. Begin DrothPost Определение перехода между локациямиCellChanged Функция возвращает 1 в тот самый единственный момент, когда игрок совершает переход между локациями. Если функция находится в местном скрипте, то функция будет принимать значение TRUE, только когда игрок будет входить в помещение. Если же он будет покидать локацию, то скрипт будет закончен раньше, чем переход будет зарегистрирован. Существует один неприятный баг – при телепортации функция, к сожалению, не провоцируется. Пример: в скрипте “SlaveScript”, прикреплённом ко всем рабам в игре, эта функция определяет, покинул ли игрок помещение, освободив невольников. Если ответ положительный, то рабы покидают место заключения навсегда. Begin SlaveScript Ещё один прекрасный пример иллюстрирует появление вновь и вновь призрака в гостинице в воротах Садрит Моры, как только игрок покидает её. Begin ResurrectHaunt Расстояние между объектамиGetDistance, "ID Объекта" (возвращает float) Функция возвращает расстояние (в юнитах) между двумя объектами. Она может быть использована для провоцирования начала боя или определения местоположения игрока. Ниже приведён отрывок одного из скриптов оригинальной игры: ; Из скрипта прикреплённого к NPC, по имени Ashamanu: Ограничения:
Определение положения и направления объектаGetPos, ось(x/y/z) При передвижении объекта, Вам зачастую может понадобиться информация о его текущем местоположении. В следующем примере я контролировал перемещение источника света с помощью этой функции. Огонь начинает медленно разгораться и затухает каждый раз к концу дня. Первоначальное значение позиции по оси Z – 511. Begin _HB_Scheduled fire GetAngle , ось(x/y/z) (возвращает float) Функция возвращает угол поворота относительно глобальной оси координат. Значение может быть от 0 до 180 и от –180 до 0. ОбзорGetLOS, “ID Объекта” (возвращает Boolean/short) Недокументированно: GetLineOfSight (returns Boolean/short?) Функция определяет, находится ли объект, ID которого передаётся в качестве параметра, в зоне видимости вызываемого объекта. Насколько я знаю, эта функция работает лишь с персонажами. Также помните, что функция не принимает во внимание направление глаз NPC, поэтому не воспринимайте зону видимости слишком буквально. Пример скрипта: Begin balynScript Определение того, заметил ли один NPC другогоGetDetected, "ID Персонажа" (возвращает Boolean/short) Функция возвращает ИСТИНУ, если один NPC может заметить другого. Она будет возвращать 0, если, например, объект “ID Персонажа” удачно прячется или наложил на себя заклинание невидимости или хамелеона. Как написано в файле помощи, это крайне медленная функция, поэтому её частый вызов нежелателен (например, поставьте трёхсекундный таймер). Пример скрипта: игрок должен незамеченным прокрасться к предмету, иначе будет пойман. Begin jeanneScript События для персонажей, стоящих на объектеGetStandingPC (short) возвращает 1, если игрок стоит на объекте Идеальная функция для провоцирования разнообразных событий, особенно в интерьерах. Зачастую используется для создания ловушек. Мой же пример скрипта включает все огни в коридоре, как только игрок наступает на определённое место пола: Begin HBHallLighting HB_hallfire – это глобальная переменная, которую я создал, чтобы определить, когда нужно включать огонь: Begin HBHallfireon Урон стоящему на объекте персонажуHurtStandingActor, float_ОчкиЖизни/сек Эта функция влияет на значение очков здоровья всех персонажей (в том числе и игрока), которые стоят на определённом объекте. Отрицательный аргумент восстанавливает здоровье, положительный – наносит урон (в очках жизни за секунду). Примечательно, что функция принимает переменные в качестве параметра. Пример скрипта: возможно, этот эффект больше всего известен по действию полей лавы. begin lava Проверка и активация объектовОбъект обычно активируется, когда игрок нажимает на нём пробел (по умолчанию). Большинство предметов имеют стандартные действия на этот случай: двери и сундуки открываются, NPC разговаривают. Функция OnActivate позволяет вместо стандартных действий выполнить нечто особенное. OnActivate Функция возвращает 1 в тот самый единственный момент, когда объект активирован. Чтобы выполнить стандартное действие (например, после функции OnActivate) существует функция Activate. Activate Стандартные действия при активации: Двери –> открываются (не работает в стандартном Морровинде) Учтите: существует множество проблем, связанных с этими функциями. Во-первых, Activate не будет работать, если перед этим не была вызвана OnActivate. Причём, если спустя 72 игровых часа после OnActivate не была вызвана Activate, то движок забывает о вызове первой функции, что ведёт к тому, что вторая отказывает в работе. Во-вторых, во избежание других ошибок, я бы рекомендовал использовать только один экземпляр функции OnActivate. И, наконец, для предметов, находящихся в инвентаре эта функция не работает и должна быть заменена на OnPCEquip. Также если на контейнере стоит галочка “References persist”, то он может быть открыт, где бы игрок ни находился. Это идеальный способ обращаться к удалённому контейнеру, предварительно прикрепив следующий скрипт, скажем, к кольцу: begin RemoteContainer Пример: скрипт прикреплён к сундуку, который не будет афишировать наличие на нём ловушки, как это делают все прочие контейнеры. Begin Trap_script Активизирование и деактивацияEnable Функция Disable заставляет объект полностью исчезнуть из игры, однако, прикреплённые к нему скрипты продолжают работать. Enable противоположна ей по предназначению. GetDisabled возвращает 1, если объект деактивирован. Вместе эти функции являются довольно мощным инструментом. Например, они могут заменить нормальный дом на горящий. Они также используются при строительстве крепости. Пример: стандартный скрипт “SlaveScript” заставляет освобождённых рабов исчезать, как только игрок покидает локацию. begin slaveScript Внимание: деактивация источников света У движка существует проблема с отключением подобных объектов – NPC и некоторые другие предметы продолжают быть освещенными, в то время как мир вокруг них – нет. Я не пробовал избежать этого, однако, проблема может быть решена путём простого перемещения источника света, например, на 3 метра под пол. Также во избежание ненужной иллюминации объектов можно после выключения стандартного включить инвертированный источник, значения света которого установлено на противоположное (то есть он генерирует темноту). Отпирание и запирание дверей и сундуковLock, short_числ_УровеньЗамка Эти функции используются для того, чтобы запереть или отпереть замок на двери или контейнере. Функция GetLocked возвращает 1, если объект закрыт. Lock запирает замок, причём можно установить степень закрытия (0-100). Учтите, что замок, закрытый на 0 будет невозможно ни взломать, ни открыть. Unlock открывает любой замок, вне зависимости от его уровня сложности. Пример: скрипт позволяет создать тренажёр для прокачки навыка взлома – сундук, который автоматически закрывается вновь после открытия. Begin PC_Security_Skill_Trainer Не сохранять изменения, произошедшие с объектомDontSaveObject Вызывайте эту функцию, если изменения, произошедшие с объектом (по ходу игры активируемым/деактивируемым/двигающимся) не должны запоминаться при сохранении игры. Это позволит Вас избежать надоедливых сообщений об ошибке, что информация об объекте изменилась. В оригинальной игре функция использовалась в скрипте “SignRotate” и в примере ниже. Пример: Begin diseaseAscended Анимация объектовЭта группа функций позволяет добавлять анимацию к объектам, заранее определённую в модели (файлы типа nif). Вы можете узнать имена анимационных групп, загрузив модель в окно предварительного просмотра и прокручивая разные варианты. Также это можно увидеть в меню “Character” в окне “Base animation”. Превосходная коллекция анимационных групп располагается во всемирной паутине по следующему адресу: http://morrowind.preik.net/animationgroups.html Однако только группы, определённые в окне базовой анимации могут быть вызваны этими функциями. Не у всех моделей есть анимационные группы, однако разнообразные флаги (под активаторами) являются отличным примером того, что предполагается. Примеры имён групп: idle, idle2, idle3, walk и т.д. PlayGroup, ИмяГруппы, [Флаги] Функция проигрывает определённую группу анимации. Необязательные флаги могут быть использованы для запуска группы разными способами (смотрите ниже). LoopGroup, ИмяГруппы, раз_числ, [Флаги] Анимационная группа будет проиграна соответствующим образом заданное количество раз. Необязательные флаги могут быть использованы для запуска группы разными способами (смотрите ниже). SkipAnim Предотвращает проигрыш анимации на данный момент. Флаги0 = Нормальный Пример: этот скрипт прикреплён ко всем уличным вывескам, заставляя их двигаться в зависимости от погоды. begin OutsideBanner |
![]() |
| ![]() | ||
![]() |