Суббота, 05.10.2024, 13:30

Приветствую Вас Странник | RSS
The Elder Scrolls:Morrowind
ГлавнаяРегистрацияВход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Бой
Sm1LeRДата: Суббота, 10.11.2007, 23:11 | Сообщение # 1
Болтун
Группа: Администраторы
Сообщений: 41
Репутация: 2
Статус: Offline
Начало и конец сражения
StartCombat, "ActorID"
StopCombat

"Actor_ID1" -> StartCombat, "ActorID2"
"Actor_ID1" -> StopCombat

StartCombat и StopCombat используются, чтобы перевести Актера в режим боя или назад, в обычный режим. Startcombat заставит вызывающего Актера атаковать Актера, указанного в качестве аргумента. Тогда как StopCombat «безопасно» использовать в «каждом кадре», нужно применять do once-условие при вызове команды StartCombat, иначе Актер не будет делать ничего. И, тем не менее, продолжительное использование StopCombat очень опасно, потому что делает NPC полностью беспомощьным: он не будет реагировать на атаки (что, таким образом, позволяет создать настоящего пацифиста…).
Даже в режиме боя установки ИИ актера остаются обычными, т.е., если он имеет склонность к бегству (high flee setting), он убежит, несмотря на команду StartCombat. По этой причине также часто можно увидеть изменение параметра Fight при начале боя во многих скриптах:
If (GetDeadCount, "My Friend" > 0 )
StartCombat, Player
SetFight, 100
endif
Обнаружение атак
OnPCHitMe (локальная перем. типа short)

Short OnPCHitMe
If (OnPCHitme == 1)

Локальная игровая переменная (не функция, вы должны объявлять ее, как переменную, так, как показано выше), которая принимает значение 1, когда игрок наносит урон вызывающему актеру. Должна сбрасываться вручную. Похоже, что использование этой переменной вызывает «зацикливание» нормальной реакции NPC, таким образом, NPC, с данным скриптом не будет атаковать сам, когда нужно. Если вы не хотите получить пассивного актера, вы должны инициировать бой через StartCombat (см.пример ниже). Как только актер переходит в режим боя, OnPCHitMe не дает никакой информации об уроне, наносимом игроком. Кроме случая, по сообщению с форума, когда другой актер наносит урон вызывающему актеру, то OnPCHitMe сбрасывается (на 0), затем переменная снова принимает значение 1, если игрок снова наносит урон вызывающему.

Пример: Пример из мода traveling merchants, для того, чтобы погонщик гуара защищал свой груз, когда он не в режиме AIFollow, скрипт присоединен к гуару:

Begin _HB_Adros_GuarDefend

float timer
short attackstate
short OnPCHitMe

if ( OnPCHitMe == 1 )
set attackstate to 1
set OnPCHitMe to 0
endif

if (attackstate == 1)
StartCombat, player
set timer to ( timer + GetSecondsPassed)
if ( timer >= 1 )
set timer to 0
if ( GetLOS, HB_adros_darani == 1)
HB_adros_darani -> StartCombat, Player
set attackstate to 0
endif
endif
endif

End

GetAttacked (возвращает Boolean/short)

Возвращает 0, если актера никогда не атаковали и 1, если атаковали хотя бы раз.
Пример: Uupse защищает Yagrum Bagarn:
Begin uupse_Bagrum

short doOnce

if ( doOnce == 0 )
if ( "yagrum bagarn"->GetAttacked == 1 )
StartCombat player
SetFight 90
SetDisposition 0
set doOnce to 1
endif
endif

end uupse_Bagrum

GetTarget, "Actor ID" (возвращает Boolean/short)

If ( GetTarget, Player == 1 )

Возвращает 1, если боевая цель объекта — ActorID (иначе 0). Это может быть использовано для проверки, сражается актер с игроком (или другим актером).

Пример: Этот скрипт показывает, как запрограммировать актера "не сражаться против закона". Это из скрипта "frelene acques script" – она Редоранка и не будет помогать игроку сражаться против охранников Редорана.
[…]

if ( GetCurrentAiPackage == 3 )
; если follow — текущий пакет, установить followNow и продолжить...

set followNow to 1
SetHello 0

if ( GetTarget "ordinator wander_hp" == 1 )
StopCombat
endif

if ( GetPCCell "Vivec, Hlaalu Prison Cells" == 0 )
; если follow закончен, NPC прибыл...
Journal HR_Stronghold 144
set followNow to 0
AiWander 256 0 0 40 20 20 0 0 0 0 0 0
ForceGreeting
SetHello 30
endif
[…]

HitOnMe, "Weapon ID" (возвращает Boolean/short)
HitAttemptOnMe, "Weapon ID" (возвращает Boolean/short)

Эти функции возвращают «истину» (1) для 1 кадра, если вызывающий актер успешно атакован или была попытка атаковать его определенным типом оружия. HitOnMe используется только скрипте LorkhanHeart (смотрите этот скрипт только, если закончили основную игру или получите сильный спойлер). Думаю, что эта функция замечательно подойдет для скрипта на бой типа «вам нужно это специальное оружие, чтобы убить данного конкретного монстра».

Пример: В соответствии с информацией, предоставленной Nigedo, HitOnMe также регистрируется, если NPC совершает преступление и у Актера достаточно высоко выставлена тревога (alarm setting).
Отслеживание убийств и нокаутов
OnDeath (возвращает Boolean/short)

If ( OnDeath == 1 )

Возвращает 1 для 1 кадра, когда актер умирает.

OnMurder (возвращает Boolean/short)

If ( OnMurder == 1 )

Возвращает 1 для 1 кадра, когда актер убит. Условия OnMurder мне не совсем понятны, но из того, как она используется в игре, можно предположить, что OnMurder устанавливается, если вас объявляют, как убийцу ("о вашем преступлении стало известно"). Итак, убийство происходит только если вы убиваете кого-то незаконно И вас видели.

Пример: он устанавливает переменную, что используется в теме диалога «Советник Редорана» ("Redoran Hortator"), чтобы определить, убил ли игрок советника:
begin RedoranCouncilor

;no lore...
short noLore

;for HT_Monopoly
short mageMonopolyVote

;for Hortator dialogue...
if ( OnDeath == 1 )
if ( OnMurder == 1 )
Set RedoranMurdered to 2
else
Set RedoranMurdered to 1
endif
endif

End

OnKnockout (возвращает Boolean/short)

Возвращает 1 для 1 кадра, когда актера нокаутируют (например, во время кулачного боя).

GetDeadCount, "Actor ID" (возвращает short?)

If ( GetDeadCount "divayth fyr" > 0)

Функция возвращает число эталонов (references) типа "Actor ID", которые были убиты. Полезная функция для квестового скриптования, чтобы отслеживать, какой NPC еще жив. Заметьте, что для диалога есть эквивалентная функция. Можно представить другое использование, например завоевание репутации у некоторых монстров, которые будут убегать от вас, вместо боя, после того, как вы убили больше 100 из них, и т.д.

Пример:
GetDeadCount часто используется для проверки, мертв ли конкретный NPC. Рекомендуется использовать "> 0" в таких случаях, так как никогда не знаешь, не добавит ли чужой мод еще одного актера с тем же ID, так что лучше поостеречься.
Begin araraUvulasScript

short noLore

if ( CellChanged == 0 )
return
endif

if ( GetDeadCount "Neloth" > 0 )
Disable
endif

End


....будь умнЕЕ!!...
 
  • Страница 1 из 1
  • 1
Поиск:


Copyright MyCorp © 2024Конструктор сайтов - uCoz