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

Определяем позицию и поворот объекта

GetPos, axis(x/y/z)

Object_ID -> GetPos, z

Когда вы двигаете объект при помощи функций, описанных выше, вы, возможно, захотите получить информацию о его текущем местоположении. В следующем примере я использовал функцию, чтобы управлять движением источника света (огня), для создания костра, который медленно разгорается и затухает, в зависимости от времени суток — стартовая позиция огня по координате Z — 511:

Begin _HB_Scheduled fire

short control_fire

; Скрипт присоединен к NPC, охраняющему огонь

;******* это управляет расписанием огня:

if ( GetDistance, "HB_Furn_De_Firepit_camp" < 600 )

If ( GameHour < 17 )

if ( HB_Light_Fire_camp -> GetPos Z >= 400 )

HB_Light_Fire_camp -> MoveWorld z, -0.1 ; Двигать огонь вниз

else

HB_Light_Fire_camp -> disable

endif

elseif ( GameHour >= 17)

HB_Light_Fire_camp -> enable

if ( HB_Light_Fire_camp -> GetPos Z < 511 )

HB_Light_Fire_camp -> MoveWorld z, 0.1 ; Двигать огонь вверх

else

HB_Light_Fire_camp -> enable

endif

endif

endif

end

GetAngle , axis(x/y/z) (returns float)

If ( Object_Id -> GetAngle, z == 180 )

Функция GetAngle возвращает угол в мировых координатах, не локальных. Мировые углы могут принимать значения от 0 до 180 и 0 до –180 (с рисунок для оси Z)

Примечание: Это работает и с неписями и объектами, однако для игрока (и я думаю, для других актеров) важна только ось z – для других осей GetAngle всегда возвращает 0.

Линия видимости

GetLOS, ObjectID (returns Boolean/short)

Actor_ID -> GetLOS, Player

Недокументированная:

GetLineOfSight (returns Boolean/short?)

(может эта работает лучше? Пока не тестировалась)

Эта функция определяет, “видит” ли объект, указанный первым аргументом, объект, указанный вторым. Похоже, что она не работает с объектами не-актерами, насколько я знаю. Зрение не включает в себя направления взгляда, так что не нужно понимать видимость слишком буквально (См «Она на меня смотрит?» в разделе Советов и Трюков)

Примечание: GetLOS это очень медленная функция, так что не нужно вызывать ее в каждом фрейме.

Пример:

Begin balynScript

float timer

short doOnce

[…]; ссылки на темы журнала

Set timer to ( timer + GetSecondsPassed )

if ( timer < 5 ); Таймер, чтобы не тестировать слишком часто (улучшает производительность)

Return

endif

Set timer to 0

if ( doOnce == 0 )

if ( GetDistance Player <= 1024 )

if ( player->GetDistance "hlaalu_loaddoor_ 02_balyn" <= 256 )

if ( GetLOS Player == 1 )

ForceGreeting

Journal DA_Mephala 55

set doOnce to –1

endif

endif

endif

endif

End

Определяем, замечен ли один актер другим

[no fix] GetDetected, "Actor ID" (returns Boolean/short)

If ( GetDetected, Player == 1 )

Возвращает “истину”, если любой вызывающий актер может обнаружить "Actor ID" (спасибо ThePal за это исправление!). Эта функция возвращает 0, если актер скрыт каким-нибудь образом, например, удачно крадется или на нем заклинание невидимости или хамелеона. В соответствии с файлом справки это медленная функция, не вызывайте ее часто (напр. создайте счетчик для вызова ее раз в 3 секунды).

Пример: Игрок должен взять объект незамеченным – если не «пойман».

Begin jeanneScript

float timer

short nolore

if ( GetJournalIndex "EB_Bone" < 20 )

Return

endif

if ( GetJournalIndex EB_Bone >= 40 )

Return

endif

Set timer to ( timer + GetSecondsPassed )

if ( timer < 5 ) ; обеспечмвает вызов GetDetected раз в 5 сек.

Return

endif

Set timer to 0

if ( GetDistance Player <= 1024 )

if ( player->GetDistance "com_chest_02 " <=128 )

if ( GetDetected Player == 1 )

ForceGreeting ; Игрок схвачен и будет наказан

Journal EB_Bone 50

endif

endif

endif

End jeanneScript