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

Доступные и недоступные объекты

Enable

Disable

"ObjectID" -> enable

GetDisabled (returns Boolean/short)

If ( GetDisabled == 1 )

Return

Endif

Функция Disable заставляет объект полностью исчезнуть из игрового мира, т.е. он не рисуется на экране и не обрабатывается (присоединенные скрипты, тем не менее, продолжают работать). Функция Enable делает отключенный (disabled) объект видимым и заставляет его обрабатываться вновь. GetDisabled (возвращает 1, если объект отключен) может использоваться для выяснения текущего статуса объекта. Эти функции обладают большими возможностями и могут использоваться, например, для переключения моделей статики (обычный дом заменяется домом, вкопанным в землю, и т.д.) В игре они используются для строительства крепостей.

Пример:

Пример из игры SlaveScript, который заставляет освобожденных рабов исчезать, как только игрок покидает ячейку:

begin slaveScript

short slaveStatus

short doOnce

short NoLore

[другие проверки статуса рабов – смотри оригинальный скрипт!]

if ( slaveStatus == 3 )

if ( GetCurrentAIPackage == 3 )

AIWander 512 0 0 0 0 0 0 0 0 0 0 0

endif

if ( GetItemCount Slave_Bracer_Left > 0 )

Drop Slave_Bracer_Left 1

endif

if ( GetItemCount Slave_Bracer_Right > 0 )

Drop Slave_Bracer_Right 1

endif

if ( CellChanged == 1 )

Disable ;****** Застав.рабов исчезать, когда они свободны и игрок уходит

endif

endif

end slaveScript

Внимание: отключение света

Это, похоже, особенность движка игры с отключением света — актеры и некоторые типы объектов будут продолжать освещаться, тогда как мир вокруг - нет. Я не особо тестировал, можно ли избежать этого, но подходящее решение — физически перемещать свет в удаленное место (например, на несколько метров ниже пола) вместо его отключения. Другой вариант от Indigo: Если вы включите свет, который поставлен в "negative" (т.е. излучает темноту вместо света) после выключения нормального света, проблемы освещения исчезают.

Полное удаление копии

[no fix?] SetDelete flag_enum

SetDelete 1

SetDelete использоваться в комбинации с Disable27, чтобы полностью удалить объект из игры. SetDelete 1 отмечает объект для удаления, SetDelete 0 снимает этот флаг. Это может быть полезно в оптимизации. Некоторые объекты симулируют свое поднятие отключением активированной копии, а затем добавлением нового объекта в инвентарь. Это оставляет невидимые объекты в игре (что съедает время процессора и память, так как скрипт на таких объектах все равно исполняется). Если копия отмечена для удаления, она полностью исчезает. Если это копия из мастер-файла, то она остается, но при этом не модели, ни скрипты не используются. Если копия была создана в игре, она исчезает навсегда.

Примечание: Использование SetDelete с любой другой функцией в одном и том же фрейме приведет к вылету.

Этот скрипт вылетит:

Begin _spell_effect

float timer

rotate y 120 ; вылет спровоцирован этим

if ( timer < 3 )

set timer to ( timer + GetSecondsPassed )

else

disable

setdelete 1

endIf

Решения этой проблемы – сначала отключение объекта, а затем используя GetDisabled и Return, безопасное его удаление:

Begin _spell_effect DontSaveObject float timer if ( GetDisabled == 1 ) setdelete 1 return endIf rotate y 120 if ( timer < 3 ) set timer to ( timer + GetSecondsPassed ) else disable endIf

Другое решение предложено Soralis, с использование локальной переменной "deletobj" как флага:

if ( deleteobj = 1 ) ;локальная переменная, установлена, когда хотите удалить

if ( deletetimer == 0 )

Disable

endif

if ( deletetimer < 10 )

set deletetimer to ( deletetimer + 1 )

endif

if ( deletetimer == 10 )

SetDelete, 1

endif

Return

endif

Также, вызывайте SetDelete только из скрипта того объекта, который хотите удалить. Object->SetDelete 1 обычно приводит к вылету. Предмет в вашем инвентаре тоже не должен удалятся, так как это приведет к неверному расчету нагрузки. Если вам действительно нужно удалить предмет из инвентаря, и вы знаете, что игрок его носит, то можно использовать команду Drop, перед отключением и удалением. Также иногда при использовании SetDelete магические эффекты вызывают проблемы (Информация с форумов / Dan_Wheeler).