Система
Actbusy (перевод статьи)
Содержание - Введение
- Структура
- Ограничения и баги
- Пути решения багов (debugging)
- Пример карты.
Введение Система actbusy
используется в картостроении чтобы делать NPC "занятыми". Данное
действие NPC на карте устанавливается нодами и продолжает действовать
как "занятый", пока одно из нескольких условий не будут выполнены (как
например, обнаружение неприятеля). Мэппер имеет полный контроль за тем,
когда NPC "занят", какие действия он должен выполнять при actbusy и
какие условия должны заставлять его, чтобы он перестал быть "занятым". Компоненты системы actbusy следующие: actbusy.txt
- текстовый файл, который находится в вашем mod\scripts директории. В
нем находится список доступных действий actbusy. ai_goal_actbusy
- управляющая ентитя Actbusy. Используятся чтобы управлять NPC, как и
когда должно включаться действие actbusy. Один или
более info_node_hints, установленных на карте с указанным в
поле Hint параметром World: Act Busy
Hint. Они (или он) определяют на карте места, где NPC может
быть "занятым", при этом используется файл actbusy.txt. Он сообщает
NPC, какое действие он должен выполнить в ноде.
|
Структура Ентити
ai_goal_actbusy сообщает NPC или группе NPC
действие "занято (actbusy)" и после NPC выбирает из hint'ов actbusy в
их группе. Есть несколько способов для отличного соединения NPC с
нодами, это: В полях Hint
у нодов должен стоять параметр World: Act Busy Hint Расстояние
до нода должно быть менее чем радиус, определенный Search
Range for Busy Hints в ai_goal_actbusy. Нод не
должен быть блокирован любым другим NPC (т.е. NPC не должен стоять в
ноде или на ноде). NPC должен
выполнять действие или анимацию, заданную нодом.
NPC
проверяет самый близкий к нему нод, заблокирован он, или нет. Это очень
помогает от столкновений данного NPC с другим или другими NPC в нодах. actbusy.txt - данный текстовый файл находится в директории mod\scripts
(в вашем моде), hl2\scripts,
cstrike\scripts и т.д. Он содержит список действий
actbusy, которые ноды с параметром Act Busy Hint могут использовать.
Ниже пример из файла: |
"act busy name" Название, которое будет описано в hint-ноде. { "busy_anim" "Имя Activity (Activity Name)". "entry_anim" "Activity Name" "exit_anim" "Activity Name" "busy_sequence" "Название sequence (Sequence Name)". Если определено, используется через activity name. Определяется в hint-ноде. "entry_sequence" "Название sequence". Если определено, используется черезentry_anim. "exit_sequence" "Название Sequence". Если определено, используется черезexit_anim. "busy_sound" "Название звука (Sound Name)". Если определено, NPC будет воспроизводить звук (напр. "Я занят!"), когда выполняет какое-либо действие\анимацию (напр. Sit_Chair03). Может быть названием GameSound или ответом игроку. "entry_sound" "Название звука". Если определено, NPC будет воспроизводить звук, когда выполняет какое-либо входящее действие\анимацию (напр. Idle_to_Sit_Chair03). Может быть названием GameSound или ответом игроку. "exit_sound" "Название звука". Если определено, NPC будет воспроизводить звук, когда выполняет какое-либо входящее действие\анимацию (напр. Sit_Chair03_to_Idle). Может быть названием GameSound или ответом игроку. "min_time" "Минимальное время, затраченное на busy-анимацию (Minimum time to spend in this busy anim)" "max_time" "Максимальное время, затраченное на busy-анимацию (Maximum time to spend in this busy anim)" 0 = остановить анимацию только при возникновении каких-либо событий. "interrupts" Несколько из списка: "BA_INT_NONE" останавливается, когда истечет время. Не прерывается при возникновении каких-либо событий. "BA_INT_DANGER" останавливается, если возникает какая-либо угроза. "BA_INT_PLAYER" останавливается, если игрок в поле зрения или возникает какая-либо угроза. "BA_INT_AMBUSH" останавливается, если враг в поле зрения. "BA_INT_COMBAT" останавливается, если враг или любой признак конфликта (взрыв, пуля и т.п.) в поле зрения. } |
Например, один
из действий мог выглядеть так: |
"sit_in_chair_03" { "busy_sequence" "Sit_Chair03" "entry_sequence" "Idle_to_Sit_Chair03" "exit_sequence" "Sit_Chair03_to_Idle" "min_time" "10.0" "max_time" "20.0" "interrupts" "BA_INT_COMBAT" } |
Чтобы
использовать этот элемент, мэппер должен определить sit_in_chair_03 в Hint
Activity нода Actbusy hint. Любая NPC, модель которой
содержала необходимый элемент, "занят" и после выхода какого-либо
действия (sequence) должен быть связан с нодом. Например, NPC
использует ноды для того, чтобы передвигаться по ним, воспроизвести входящее действие
Idle_to_Sit_Chair03, а затем многократно зацикливать действие
Sit_Chair03. Параметры min_time и
max_time контролируют NPC выполнять действие actbusy в нодах с
произвольным промежйтком времени между 10 и 20 секундами. При выборе
Ba_Int_Combat NPC выполнит данное действие ранее, чем увидит неприятеля
или услышит другие звуки (столкновение пули с другим предметом, взрыва,
и т.п.). Когда NPC оставит нод с описанными выше действиями (из-за
истеченного времени или если NPC видит врага), NPC перейдет в конечное
действие Sit_Chair03_to_Idle перед сброса его AI в обычное состояние. Следует
отметить, что у некоторых actbusy min_time и
max_time равны нулю. NPC, использующий эти параметры
никогда не уйдет с нода из-за тайм-аута. Если NPC выполняет действие
Ba_Int_None, то он будет стоять на ноде до тех пор, пока на него не
подействует какой-либо инпут из системы I/O. info_node_hint'ы - эти нод-ентити создают
actbusy позиции. (Они не могут быть нодами info_hint или info_node_air_hint.) Их значение в hinttype должно быть
установлено на 12 (World: Act Busy Hint), чтобы определить их
как actbusy хинтами, а значение
hintactivity определяет название действия в файлеactbusy.txt. Действие должно
являться
actbusy activity, и должно относиться к конкретному NPC. Если в значении
hintactivity указан телепорт, то
NPC телепортируется в состояние actbusy вместо последнего. Такой случай
используется, когда хинт расположен на\около другой геометрии (prop'ов)
карты, например, когда NPC сидит на стуле. |
Ограничения и баги Combine
Soldiers Metropolice Союзники
игрока (citizen'ы, Аликс, Барни, Григорий, Илай, Кляйнер)
|
Пути решения багов (debugging) ai_debug_actbusy
ConVar - легчайший путь
решения проблем, связанных
с act busy. Следует установить
значение от 1 до 4. Данные значения означают следующее:
Постоянно
прорисовывает линию от каждого NPC в выбранный ими actbusy-нод. Всякий раз,
когда любой NPC выполняет действие actbusy, прорисовывается линия к
выбранному NPC ноду и квадрат вокруг него.
- Это
полезно, чтобы определять ноды, установленные в местах, где NPC стоять
не будет. Следует
учитывать, что квадрат вокруг NPC не будет захватывать ноды.
Показывает
информацию о том, почему NPC не выбрал какой-либо actbusy-нод.
- Для того,
чтобы использовать данную фичу, следует выбрать любого
NPC с помощью команды npc_select. Когда NPC будет передвигать к
следующим actbusy-нодам, то можно увидеть небольшую текстовую строку,
которая будет появляться на каждом ноде, объясняющая, почему NPC не
выбрал и не пошел к какому-либо ноду.
Отображает
всю логику actbusy.
- Показывает
логические решения (AI), какие предпринимает каждый NPC, когда
совершает какое-либо actbusy-действие. В основном
полезно для обнаружения ентити с неправильной системой I/O на карте.
5. Туториал-перевод
+ пример карты.
Источник: http://steamreview.org/ |