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

Не сохранять изменений объекта

DontSaveObject

Вызывайте эту функцию, если не хотите, чтобы предмет сохранялся в сэйве. Используйте DontSaveObject на объектах, которые:

1. Могут быть включены/отключены в течение игры, например стадии постройки крепости.

2. Объекты, которые могут перемещаться, например объекты, на которых можно ездить.

Используя DontSaveObject, можно избежать раздражающего сообщения "save game data has changed" (данные сохраненной игры были изменены), когда объект в сэйве был изменен: например, подвинут или отключен/включен. Это потому, что данные об объектах хранятся в сэйве, например, был ли объект отключен/включен и т.д. (Информация с форумов / IndigoRage).

В оригинальной игре она используется в скрипте SignRotate и в следующем:

Пример:

Begin diseaseAscended

DontSaveObject

; поднявшиеся спящие по какой-то причине все заражены мором...

if ( CellChanged == 0 )

return

endif

AddSpell "ash woe blight"

AddSpell "black-heart blight"

AddSpell "chanthrax blight"

AddSpell "ash-chancre"

End

Скрипты для npc: ии и движение npc идет в новую локацию

AiTravel, float_enum_x, float_enum_y, float_enum_z, [reset]

Actor -> AITravel, 1359, 2700, 1045

Чтобы NPC шел между двумя определенными точками в игровом мире, используйте AITravel.

Переменные – мировые координаты x, y, z. Их можно определить, переместив камеру к желаемой точке, или выбрав точку на сетке пути, или объект, в результате координаты будут показаны внизу окна объектов. Использование необязательного флага reset неизвестно.

Когда эта функция используется в скриптах, важно, чтобы она вызывалась только один раз. Посмотрите на следующий скрипт на NPC

Begin Travel

AiTravel, 1359, 2700, 1045

End Travel

Он не будет работать, так как скрипт постоянно добавляет NPC AITravel, и NPC застывает вместо того, чтобы идти.

Begin Travel

Short do_once

If (do_once==0)

AiTravel, 1359, 2700, 1045

Set do_once to 1

endif

End Travel

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

Проверка, завершил ли npc свое движение

GetAIPackageDone (returns Boolean/short)

if ( GetAIPackageDone == 1 )

[делать что-то]

endif

Чтобы проверить, пришел ли NPC в нужное место, можно использовать GetAIPackageDone. Эта функция возвращает 1 в том фрейме, когда текущий пакет ИИ завершен.

Используйте это, чтобы проверить завершено ли движение. Этот скрипт показывает, как соединить несколько функций AITravel в одном скрипте, используя переменную состояния и конструкции if-elseif:

Begin TravelLoop

short state

float timer

if ( menumode == 1 ) ; если меню открыто - не исполнять

return

endif

;начало движения

if ( state == 0 )

if ( player -> GetDistance HB_adros_darani < 5000 )

set state to 5

endif

;******************* Он начинает свой путь

elseif ( state == 5 )

SetHello 0

AITravel -8144, -19409, 728 ;new co-ords point 1

set state to 10

elseif ( state == 10 )

if ( GetAIPackageDone == 1 ) ;он пришел в точку 1

set state to 40

endif

elseif ( State == 40 )

AITravel -9147, -19459, 720 ; новые координаты точки 2

set State to 50

elseif ( state == 50 )

if ( GetAIPackageDone == 1 ) ;он пришел в точку 2

set state to 60

endif

elseif ( state == 60 )

AITravel -8144, -19409, 728 ; новые координаты точки 1

set state to 70

elseif ( state == 70 )

if ( GetAIPackageDone == 1 ) ;он пришел в точку 1

set state to 80

endif

elseif ( state == 80 )

AITravel -6640, -18496, 1040 ;новые координаты точки 0

set state to 90

elseif ( state == 90 )

if ( GetAIPackageDone == 1 ) ;он пришел в точку 0

set state to 0

endif

endif

End TravelLoop

Хорошие примеры скриптов с AITravel можно найти в “lookoutscript” (Фаргот, прячущий сокровища) и CharGenWalkNPC (страж, идущий по кораблю в начале игры). Или поглядите мой плагин Traveling Merchants, что понять, что такое настоящее безумное использование AITravel  !

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

; *************** Спасение скрипта – восстанавливает скрипт после выхода из ячейки или сна

If ( Player -> GetDistance, HB_adros_darani < 5000 )

if (GetCurrentAIPackage == -1) ; проверка бездействия

set timeout to ( timeout + GetSecondsPassed )

if ( timeout >= 3) ; ждем некоторое время.

; иногда актер бездельничает понемногу

set state to (state - 10) ; переход к следующему состоянию

set timeout to 0

endif

else

set timeout to 0

endif

endif