Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скрипты Morrowind.doc
Скачиваний:
92
Добавлен:
29.10.2018
Размер:
2.81 Mб
Скачать

Повреждение актера, стоящего на объекте

HurtStandingActor, float_HP/s

HurtStandingActor –3

Object_ID -> HurtStandingActor 1

Float hurt_variable

HurtStandingActor, hurt_variable

Эта функция влияет на здоровье актера (включая игрока), который стоит на объекте. Отрицательное значение лечит, положительное значение уменьшает здоровье (очков в секунду). Использование отрицательных значений может привести к увеличению здоровья больше максимального значения. Эта функция может принимать переменные типа float в качестве значений.

Пример: Эффект хорошо знаком по лаве:

begin lava

if ( menumode == 1 )

return

endif

if ( CellChanged == 0 )

if ( GetSoundPlaying "lava layer" == 0 )

PlayLoopSound3DVP "lava layer", 1.0, 1.0

endif

endif

HurtStandingActor, 20.0 ;20 ед повреждения в сек

end lava

Функции сталкивания объектов

GetCollidingPC (returns Boolean/short)

GetCollidingActor (returns Boolean/short)

if ( GetCollidingPC == 1 )

HurtCollidingActor, damage_enum

HurtCollidingActor, 100

Object_ID -> HurtCollidingActor, 100

Эти функции, вызванные на объекте, позволяют определять, взаимодействует (сталкивается) ли объект с актером. GetCollidingPC возвращает 1, если игрок сталкивает с объектом, и 0 в противном случае. GetCollidingActor делает тоже самое, только для всех актеров (включая игрока). HurtCollidingActor повреждает дотронувшегося до объекта актера (как HurtStandingActor).

Пример:

Когда этот скрипт помещен на объект, любой актер, дотронувшийся до объекта, будет получать повреждения. Сообщение при этом зависит от того, игрок ли это или другой актер.

Begin hurtActor

if ( GetCollidingPC == 1 )

MessageBox "Вы кричите от боли, когда дотрагиваетесь до скалы."

Elseif ( GetCollidingActor == 1 )

MessageBox "Кто-то рядом кричит от боли."

Endif

HurtCollidingActor 100

End

Проверка активации предмета и его активация

Обычно предмет активируется, когда вы нажимаете кнопку пробел, чтобы “использовать” его. У большинства предметов есть стандартные действия, которые происходят при их активации: двери открываются, сундуки показывают свое содержимое, актеры начинают диалог и т.д. Функция OnActivate позволяет перехватить вызов стандартного действия и сделать что-то другое или в начале проверить условия:

OnActivate

If ( OnActivate == 1 )

Принимает значение 1 в том кадре, когда объект активирован. OnActivate сбрасывается, после вызова, так что только один скрипт может его обработать. Также используйте только один вызов OnActivate в скрипте. Чтобы выполнить стандартное действие над объектом при вызове OnActivate, вы должны использовать команду активации:

Activate

activate (если скрипт на активированном объекте)

Activate может использоваться как инициатор стандартного действия после вызова OnActivate.

Стандартные действия, вызываемые Activate:

Двери -> Открыть (Возможно, не работает с оригинальным Мором, в версии 1.6.1820 работает).

Загружающие двери -> Ничего (сломана?25)

Контейнеры -> Открыть (показать содержимое)

Книги/свитки -> Показывает текст для чтения*.

Активаторы -> Ничего

Актеры -> Диалог

Оружие -> Подбор

Броня -> Подбор

Разное -> Подбор

Не тестировалось, но я предполагаю:

Надеваемый свет -> Подбор

Другой свет -> Ничего

Щупы -> Подбор

Алхим. аппараты -> Подбор

*(Но, похоже, это отключает опцию «взять». Также может создавать проблемы без использования однократных условий. См раздел Советов и Трюков для решения этих проблем)

Пример:

Следующий скрипт хорошо демонстрирует использование функции OnActivate. Он присоединен к контейнеру (сундуку), который НЕ показывает, что на нем установлена ловушка, как обычные внутриигровые контейнеры:

Begin Trap_script short done if ( OnActivate == 1 ) if ( done == 1 ) ;однократное условие Activate return else Cast, "flame", Player ;повредить игрока set done to 1 Activate ; Вызвать стандартное действие: сундук открывается endif endif End trap_script

Примечание: Согласно моим тестам, Activate не может использоваться без OnActivate в одном и том же скрипте. OnActivate и Activate могут быть в разных частях скрипта. Однако Activate не будет работать, если OnActivate не была вызвана перед этим. Также есть сообщения, что объект должен быть вручную активизирован хотя бы раз в 72 часа, иначе игра забывает, что OnActivate было вызвано перед этим. Попробуйте этот скрипт, чтобы узнать все самим (я его применил к двери26):

Short done

if ( OnActivate == 1 )

MessageBox "Спасибо за активацию"

endif

if ( done == 0 )

If ( GetDistance, Player < 100 )

set done to 1

MessageBox "Игрок закрывает"

endif

endif

if ( done == 1 )

If ( GetDistance, Player > 200 )

MessageBox "Sesame"

Activate

set done to 0

endif

endIf

End

MessageBox "Игрок закрывает"

endif

endif

if ( done == 1 )

If ( GetDistance, Player > 200 )

MessageBox "Sesame"

Activate

set done to 0

endif

endIf

End

Begin GBG_closing_door

Begin GBG_activate

Short done

if ( OnActivate == 1 )

MessageBox "Спасибо за активацию"

endif

if ( done == 0 )

If ( GetDistance, Player < 100 )

set done to 1

MessageBox "Игрок закрывает"

endif

endif

if ( done == 1 )

If ( GetDistance, Player > 200 )

MessageBox "Sesame"

Activate

set done to 0

endif

endIf

End

Также были сообщения, что существует другие трудности с функцией OnActivate. Исходя из моего опыта, использование только одного OnActivate - самый безопасный способ обойти их. Также используйте OnPCEquip, когда хотите использовать предмет из инвентаря на себя, OnActivate при этом не вызывается.

Информация от UESP: существует недокументированная особенность Activate, которая заключается в указании игрока после функции, например

begin RemoteContainer

short OnPCEquip

if ( OnPCEquip == 1 )

set OnPCEquip to 0

"dh_remote_chest_01"->Activate, player

endif

end

Если контейнер имеет свойство references persist, этот скрипт должен открыть его, где бы игрок ни был. Это великолепная возможность создавать переносные контейнеры и т.п.