Player -> Position 29872, -82108, 578, 180 15 page
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 )
Возвращает “истину”, если любойвызывающий актер может обнаружить "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
Определяем, когда игрок покинул ячейку
[no fix] CellChanged
If ( CellChanged == 1 )
CellChanged возвращает 1 в кадре, когда игрок меняет ячейку. Когда игрок готов покинуть ячейку, скрипт в текущей ячейке останавливается, так что эта функция исполняется, и результаты будут готовы, как только игрок вернется, а не когда он покидает ее, так как скрипт останавливается раньше, чем устанавливается CellChanged (Спасибо Klinn за это исправление). В функции есть небольшой баг: телепортация из ячейки не переключает эту функцию (не подтверждено).
Пример: В скрипте SlaveScript, который освобождает рабов в игре, функция CellChanged работает как триггер, заставляя рабов исчезнуть — раб уходит в светлое будущее:
Begin SlaveScript
[…]
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
другой отличный пример — это скрипт Gateway Haunt. Он всегда возвращается, когда вы этого не ждете:
Begin ResurrectHaunt
;town_Sadrith quest
;gateway_haunt resurrects until journal town_Sadrith >= 35
if ( CellChanged == 1 )
if ( gateway_haunt->GetHealth < 1 )
gateway_haunt->Resurrect
endif
endif
end ResurrectHaunt
Определяем, путешествует ли игрок
[no fix] GetPCTraveling (returns boolean)
if ( GetPCTraveling == 1 )
Бладмун добавляет эту функцию, чтобы проверять путешествует ли игрок, например на силт страйдере. Возвращает 1 - если да, 0 – если нет. Это используется в скрипте про превращение в оборотня, чтобы не превращать игрока, пока он путешествует или находится в тюрьме:
if ( PCWerewolf != 1 ) ; НЕ ВЫПОЛНЯТЬ ЕСЛИ ИГРОК НЕ ОБОРОТЕНЬ
return
endif
if ( GetPCinJail == 1 )
return
endif
if ( GetPCTraveling == 1 )
return
endif
Триггеры для актеров, стоящих на объектах
GetStandingPC (returns Boolean/short)
возвращает 1, если игрок стоит на нем
GetStandingActor (returns Boolean/short)
возвращает 1, если ЛЮБОЙ актер (включая игрока), стоит на нем.
If ( Object_Id -> GetStandingPC == 1)
[… включение страшной ловушки ]
endif
Это великолепная функция для включения событий, особенно во внутренних ячейках. Это также отличная функция для строительства ловушек. Вы можете сделать “активатор”, используя файл модели любого статического объекта (включая полы, коврики и т.д.), и включать нужные события, как только игрок (или другой актер) наступит на этот объект.
Мой пример скрипта используется для включения света в холле как только игрок встанет на определенный участок пола:
Begin HBHallLighting
if ( GetStandingPC == 1 )
set HB_hallfire to 1
endif
end
глобальная переменная, используемая для включения света. Вот скрипт для огня:
Begin HBHallfireon
if ( HB_hallfire == 1)
if ( GetPos, z, < -736 )
MoveWorld, z, 3 ; огонь поднимается, пока не достигнет пика
if ( GetPos, z, > -780)
enable
endif
endif
else
disable
endif
end
Повреждение актера, стоящего на объекте
HurtStandingActor, float_HP/s
HurtStandingActor –3
Object_ID -> HurtStandingActor 1
Float hurt_variable
HurtStandingActor, hurt_variable
Эта функция влияет на здоровье актера (включая игрока), который стоит на объекте. Отрицательное значение лечит, положительное значение уменьшает здоровье (очков в секунду). Использование отрицательных значений может привести к увеличению здоровья больше максимального значения. Эта функция может принимать переменные типа float в качестве значений.