Home Random Page


CATEGORIES:

BiologyChemistryConstructionCultureEcologyEconomyElectronicsFinanceGeographyHistoryInformaticsLawMathematicsMechanicsMedicineOtherPedagogyPhilosophyPhysicsPolicyPsychologySociologySportTourism






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 )

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: 808


<== previous page | next page ==>
Player -> Position 29872, -82108, 578, 180 14 page | Short AllowWerewolfForceGreeting 2 page
doclecture.net - lectures - 2014-2025 year. Copyright infringement or personal data (0.014 sec.)