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

Создание/Удаление объектов

Я уверен, что большинство моддеров знает, что объект можно двигать через экстерьер на определенные расстояния. Это происходит потому что игра обновляет и обрабатывает объекты/коды на определенных расстояниях. Когда ваш персонаж выходит за этот параметр, объект, на самом деле, замораживается или, с точки зрения игрока, объект растворяется в свежем воздухе. Но, если вы вернетесь назад в ячейку, объект появится вновь.

Значит, чтобы перемещать объект через множество внешних ячеек, нужно создавать новые объекты. Каждый раз, когда вы перемещаетесь в новую ячейку, функция "CellChanged" возвращает ИСТИНУ в одном кадре. Это наилучшее время заменить существующий объект новым. Я столкнулся на этом этапе лишь с одной БОЛЬШОЙ проблемой. НИКОГДА не создавайте объект из скрипта на объекте. Это не сработает. Так что вам нужно использовать глобальный скрипт, чтобы создать новый объект взамен старого. В то же время не забудьте удалить или вы получите все эти объекты, распределенные по разным ячейкам, что создаст серьезные проблемы в дальнейшем. Всегда держите только один объект. Ниже приведен простой пример, который вы можете использовать:

;----------------

; Скрипт на объекте

;----------------

if ( player->CellChanged == 1 )

Startscript, "Create_obj_script" ; это глобальный скрипт

set obj_count to ( obj_count - 1 ) ; глоб.переменная, считающая сколько объектов существует

Disable

SetDelete, 1

endif

;----------------

; Глобальный скрипт

;----------------

PlaceAtPC "objectname", 1, 0, 0 ; или можно использовать PlaceItem

set obj_count to ( obj_count + 1 )

Stopscript "create_obj_script"

В идеале, описанный выше скрипт должен работать хорошо, но в реальности он принесет вам большие неприятности. Удаление объекта немедленно после смены ячейки может привести к вылету. Это особенно часто, когда грузится большая локация. Чтобы разрешить эту проблему, задержите удаление. Представляю вам способ задержки времени (лично я нашел, что 1,5 секунд пока вполне хватает). Вот как теперь выглядит скрипт на объекте.

if ( player->CellChanged == 1 )

Startscript, "Create_obj_script" ; это глобальный скрипт

Disable

set timer_flag to 1

endif

if ( timer_flag == 1 )

set timer to ( timer + GetSecondsPassed )

if ( timer > 1.5 )

set obj_count to ( obj_count - 1 )

SetDelete, 1

else

return ; остановить выполнение кода

endif

endif

Это не все. Если вы планируете двигать ваш объект с очень высокой скоростью, есть возможность, что объект испытает еще одно изменение ячейки в течение этих 1,5 секунд. Вы должны быть уверены, что объект удален, пока еще он не вышел из зоны обработки, или он вернется позже и будет мучить вас. Вот как теперь выглядит скрипт.

if ( player->CellChanged == 1 )

if ( timer_flag == 1 )

SetDelete, 1

return

endif

Startscript, "Create_obj_script"

Disable

set timer_flag to 1

endif

if ( timer_flag == 1 )

set timer to ( timer + GetSecondsPassed )

if ( timer > 1.5 )

SetDelete, 1

else

return

endif

endif