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

Определение и изменение уровня

Get/Mod/SetLevel (работает только с Set и Get)

Устанавливает уровень актера и только. Скиллы и характеристики не увеличиваются, как и не появляется меню нового уровня при вызове на игроке.

Бой

Начало и конец боя

StartCombat, "ActorID"

StopCombat

"Actor_ID1" -> StartCombat, "ActorID2"

"Actor_ID1" -> StopCombat

StartCombat и StopCombat используются для установки актера в режим боя, или для возвращения в нормальное состояние. StartСombat заставит вызывающего актера атаковать другого актера, установленного в качества аргумента. В то время, как StopCombat кажется “безопасной” для использования в “каждом кадре”, вы должны устанавливать однократное условие, когда используете команду StartCombat, иначе актер может не делать ничего. Тем не менее, продолжительное использование команды StopCombat очень опасно, так как делает NPC полностью беспомощным: он не будет отвечать на атаки (что, таким образом, дает вам возможность создать настоящего пацифиста…).

После установки в режим боя настройки ИИ актера все равно применяется, например, если у актера высокая установка на бегство, он убежит, не смотря на команду StartCombat. По этой причине часто можно увидеть, что рейтинг боя (Fight rating) также часто меняется при начале боя во многих скриптах:

If ( GetDeadCount, "My Friend" > 0 )

StartCombat, Player

SetFight, 100

endif

Обнаружение атак

[no fix] OnPCHitMe (локальная переменная типа short)

Short OnPCHitMe

If ( OnPCHitme == 1 )

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

Примечание: Согласно информации от Nigedo, OnPCHitMe устанавливается, если NPC совершил преступление и Актер имеет высокий уровень настороженности (alarm).

Пример: Пример из мода 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 (returns Boolean/short)

If ( Actor -> GetAttacked == 1 )

Возвращает 0, если актера никогда не атаковали и 1, если атаковали хотя бы раз.

Пример: Уупса Фир защищает Ягрума Багарна:

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" (returns Boolean/short)

If ( Actor -> 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" (returns Boolean/short)

HitAttemptOnMe, "Weapon ID" (returns Boolean/short)

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