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

Определения локации, относительного положения и движения Определение нахождения игрока в интерьере или в экстерьере

[no fix] GetInterior (returns Boolean/short)

If ( GetInterior == 1 )

Недокументированная функция! (Спасибо XP-Cagey и Killgore)

Эта функция возвращает 1, если текущая ячейка интерьер, и 0, если – экстерьер. Вот пример глобального скрипта от Killgore. Чтобы опробовать его, в консоли напечатайте "StartScript Outside_Check".

Begin Outside_Check

short doonce

if (MenuMode == 1)

Return

EndIf

if (doOnce == 0) ;если вы в новой ячейке ;или он только что начался

if ( GetInterior == 1 )

MessageBox "1: внутри"

elseif ( GetInterior == 0 )

MessageBox "0: снаружи"

else

MessageBox "где-то еще"

endif

set doOnce to 1

Return

endif

if (doOnce == 1)

if (CellChanged == 0) Return

else ;если игрок перемещается из ячейки в ячейку..

set doOnce to 2 ;скрипт ждет дополнительный фрейм

endif

Return

endif

if (doOnce == 2) ;затем начитнается снова и печатает

set doOnce to 0

Return

endif

End Outside_Check

Определения ячейки игрока

[no fix] GetPCCell, "Cell_ID" (returns Boolean/short)

if ( GetPCCell "Balmora" == 1 )

Set dream to 1

endif

Функция GetPCCell тестирует присутствие игрока в определенной ячейке. Она возвращает 1, если игрок в определенной ячейке и 0, если нет. Поддерживается частичное совпадение, например GetPCCell, "Vivec" вернет “истину” для ячеек "Vivec", "Vivec, foreign quarter waistworks" и "Vivec, temple", и т.д.

Пример:

Этот маленький скрипт от Bethesda проверяет, покинул ли игрок определенное место и лишь после этого удаляет определенную вещь у NPC:

Begin DrothPost

if ( GetJournalIndex "MS_EstateSale" >= 70 )

if ( GetPCCell "Mournhold, Geon Auline's House" == 0 )

"Geon Auline"->RemoveItem "silver dagger_droth_unique" 1

Journal MS_EstateSale 80

StopScript DrothPost

endif

endif

End DrothPost

Расстояние от одного объекта до другого

GetDistance, "ObjectID" (returns float)

"ObjectID1" -> GetDistance, "ObjectID2"

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

Это фрагмент оригинального Морровиндовского скрипта:

; Из скрипта для NPC Ashamanu:

; Ashamanu даст журнальную запись 60, когда игрок близко

if ( GetDisabled != 1 )

if ( GetDistance Player <= 256 )

if ( GetDistance "guar_white_unique" <= 256 )

if ( GetJournalIndex "MS_WhiteGuar" <= 50 )

Journal "MS_WhiteGuar" 60

endif

endif

endif

endif

Ограничения:

  • GetDistance требует, чтобы объект, вызываемый как параметр, был помещен в игровой мир (в редакторе) и имел флаг references persist (или был NPC).

  • Учтите, что вы должны использовать эту функцию только с уникальным ID или там, где вы абсолютно уверены в существовании только одной копии ID – иначе игровой движок просто возьмет первую копию ID и выдаст дистанцию до нее, вероятнее всего, не до того объекта, который вы хотите. Так, скрипт, предупреждающий игрока о рыбе-убийце, когда она ближе 800 единиц, должен быть присоединен к рыбе-убийце, и проверять расстояние до игрока (который уникален), а не наоборот.

  • Если вы определяете расстояние до объекта, который движется с использованием функции Move или MoveWorld, GetDistance будет по-прежнему возвращать расстояние до оригинального местоположения объекта (того, которое установлено в редакторе). Используйте GetPos и старый добрый метод Пифагора (c2 = a2 + b2), чтобы определить текущее расстояние.