![]() CATEGORIES: BiologyChemistryConstructionCultureEcologyEconomyElectronicsFinanceGeographyHistoryInformaticsLawMathematicsMechanicsMedicineOtherPedagogyPhilosophyPhysicsPolicyPsychologySociologySportTourism |
Player -> Position 29872, -82108, 578, 180 15 pageGetPos, 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
Определяем, когда игрок покинул ячейку [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 в качестве значений. Date: 0000-00-00; view: 845
|