Настройка логики. Часть 2 — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
ColR iT (обсуждение | вклад) (→3.7.1. Спавн монстров дневных и ночных.) |
ColR iT (обсуждение | вклад) (→Часть 3) |
||
Строка 544: | Строка 544: | ||
on_use =<br> | on_use =<br> | ||
− | = | + | <font size = 5>[[Часть 3]]</font> |
[[Категория:A-Life]][[Категория:Скрипты]] | [[Категория:A-Life]][[Категория:Скрипты]] |
Версия 09:17, 3 мая 2012
Содержание |
---|
Настройка логики. Часть 0 |
Содержание
Секции.
Секция combat
Показывает, что происходит, когда NPC срывается в бой.
on_combat = combat
[combat]
on_info = {+info -info =func !func ~number}%+info -info =func% - эффекты, которые вызываются когда NPC уходит в бой. Вызываются при каждом апдейте.
Для задания различных типов скриптовых боёв для различных ситуаций используется параметр combat_type.
В следующем примере сталкер сражается:
- по-камперски, если враг - актёр и он дальше Х метров;
- по-монолитовски, если любой враг дальше Y метров;
- иначе - движковый бой.
[logic] active = walker on_combat = combat [walker] path_walk = ... [combat] combat_type = {=fighting_actor =fighting_ge_X_meters} camper, <br>{=fighting_ge_Y_meters} monolith
Пример такой функции: нам надо чтобы на расстоянии свыше 20 метров npc переходил бы в кемперский комбат.
function fighting_dist_ge_20(actor, npc) return db.storage[npc:id()].enemy:position():distance_to ( npc:position() ) >= 400 end
Примечание: 400 – это 202. Мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.
Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый:
[logic] active = nil on_combat = combat [combat] combat_type = zombied
Если в разных секциях для персонажа требуются разные типы боя или разные условия, то можно воспользоваться оверрайдом combat_type.
Помните(!): оверрайд всегда будет перекрывать настройку в секции combat. Т.е., если у вас логика на три секции и в двух из них нужен камперский комбат, а в третьей - монолитовский, то можно задать так:
[logic] active = walker1 on_combat = combat [walker1] ... [walker2] ... [walker3] ... combat_type = monolith [combat] combat_type = camper
В файле xr_effects.script есть функция отключающая секцию combat - disable_combat_handler
Файл: gamedata\scripts\xr_combat.script
Секция death
Схема показывает, что происходит при смерти NPC.
on_death = death
[death]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются при смерти NPC.
[logic] ... on_death = death@mil_freedom_max_combat1 [death@mil_freedom_max_combat1] on_info = %=military_max_dead +sar2_death_47%
Файл: gamedata\scripts\xr_death.script
Cекция hit
Схема показывает, что происходит при нанесении повреждения NPC.
on_hit = hit
[hit]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются в случае, если NPC нанесён хит.
on_hit НЕ СРАБАТЫВАЕТ на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как агрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).
[logic] ... on_hit = on_hit@agr_factory_hold_fake [on_hit@agr_factory_hold_fake] on_info = {=hit_by_actor} %+agr_krot_skirmish_start%
Файл: gamedata\scripts\xr_hit.script
Секция actor_dialogs
Показывает, какие диалоги будут доступны или недоступны игроку при разговоре с этим NPC. Пишется практически в любой схеме.
actor_dialogs = actor_dialogs
[actor_dialogs]
id = <название_диалога> - доступные диалоги, перечислять через запятую.
disable = <название_диалога> - запрещенные диалоги, тоже через запятую.
[logic] ... actor_dialogs = actor_dialogs [actor_dialbr> :*'''''story_id''''' – числовое значениеogs] id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end
Файл: gamedata\scripts\xr_meet.script
Секция use
Схема показывает, что произойдет, если игрок попытается взаимодействовать с NPC.
on_use = use
[use]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются в случае, если игрок попытается взаимодействовать с NPC.
[logic] ... on_use = use@mil_dolg_leader [use@mil_dolg_leader] on_info = {=gulag_empty(mil_lager)} %+mil_dolg_leader_reward%
Файл: gamedata\scripts\xr_use.script
Секция combat_ignore
Если для NPC установлена данная секция то он, не переходит в боевой режим.
Для секции нет дополнительных полей.
combat_ignore = combat_ignore
[combat_ignore]
В любой другой схеме можно задать оверрайд, который позволит игнорировать бой только по выполнению условия:
[walker]
combat_ignore_cond = {+info –info =func !func ~number} – условия для игнорирования боя.
Если для оверрайда задать значение always, то в данной схеме NPC будет игнорировать бой всегда, пока не перейдет в схему, где бой не игнорируется.
Таким образом, можно задавать игнорирование боя только будучи под определённой схемой, в отличии от секции, которая запрещает бой в любом случае.
В файле xr_condition.script есть функции, используемые для работы с кондлистом оверрайда:
- fighting_dist_ge_20 - текущий враг на расстоянии больше или равном 20м;
- fighting_dist_ge – универсальная функция, проверка расстояния для игрока;
- fighting_actor - текущий враг актёр?;
- check_fighting - проверка (по story_id) того, что нашим врагом есть хотя бы кто-то один из списка.
- fighting_dist_ge_20 - текущий враг на расстоянии больше или равном 20м;
Пример использования секции:
[logic] ... combat_ignore = combat_ignore [combat_ignore]
Файл: gamedata\scripts\xr_combat_ignore.script
Секция dont_spawn_character_supplies
Если прописать эту секцию в кастом дату персонажу, то у него внутри не заспавниться стандартный набор барахла, прописанный в в его профиле.
[dont_spawn_character_supplies]
Секция threshold
Есть возможность изменять у сталкеров параметры, по которым они атакуют монстров.
threshold = threshold
[threshold]
max_ignore_distance = <number> - (в данный момент дефолт 15 метров). Сталкер будет всегда атаковать монстров, которые находятся внутри данного радиуса.
ignore_monster = <number> - (в данный момент дефолт 0). Параметр от 0 до 1. Если функция оценки монстра ниже, чем этот параметр, и монстр находится за пределами вышеуказанного радиуса - он будет атакован. В данный момент все настроено так, что сталкеры вообще не атакуют монстров находящихся дальше чем 15 метров от них.
Примечание: второй параметр следует менять ОЧЕНЬ осторожно. Помните, в него нужно вписывать значение от 0 до 1!
[logic] ... threshold = threshold@mil_fbarier [threshold@mil_fbarier] max_ignore_distance = 150 ignore_monster = 0.1
Файл: gamedata\scripts\stalker_generic.script
Секция Danger
Секцию необходимо указывать только для какой-то конкретной схемы!
danger = danger_condition
[danger_condition]
ignore_distance = <number> - расстояние свыше которого игнорируется "живая" опасность (150 метров по умолчанию).
ignore_distance_grenade = <number> - расстояние свыше которого игнорируется граната (15 метров по умолчанию).
ignore_distance_corpse = <number> - расстояние свыше которого игнорируется труп (10 метров по умолчанию).
ignore_distance_hit = <number> - расстояние свыше которого игнорируется хит (150 метров по умолчанию).
ignore_distance_sound = <number> - расстояние свыше которого игнорируется звук (50 метров по умолчанию).
danger_inertion_time_grenade = <number> - время, спустя которое, NPC забудет о гранате (20000 миллисекунд по умолчанию).
danger_inertion_time_corpse = <number> - время, спустя которое, NPC забудет о трупе (10000 миллисекунд по умолчанию).
danger_inertion_time_hit = <number> - время, спустя которое, NPC забудет о хите (60000 миллисекунд по умолчанию).
danger_inertion_time_sound = <number> - время, спустя которое, NPC забудет о звуке (15000 миллисекунд по умолчанию).
danger_inertion_time_ricochet = <number> - время, спустя которое, NPC забудет о рикошете (30000 миллисекунд по умолчанию).
danger_expiration_time = <number> - время, через которое денжер перестанет быть акутальным. (5000 миллисекунд по умолчанию)
Примечание: NPC в принципе игнорируют авто с секцией m_car.
Примечание: если надо, чтобы в разных случаях сталкер игнорировал разные типы данжеров, создается несколько секций данжера danger_condition@1, danger_condition@2 и так далее.
[camper@dar_military_scout_camper3] ... danger = danger_condition@scout [danger_condition@scout] ignore_distance = 10 ignore_distance_grenade = 10 ignore_distance_corpse = 0 ignore_distance_danger_hit = 20 ignore_distance_sound = 0 danger_inertion_time_hit = 1
Файл: gamedata_1006\scripts\xr_danger.script
Секция game_info
"Обучает" NPC рассказывать у костра истории и легенды. Секция прописывается в custom_data NPC.
[game_info]
stories = "<название_звуковой_темы>" - имена звуковых тем из файла sound_theme.script.
Несколько тем перечислять через запятую.
Существуют следующие истории и легенды:
- story_01 - Граница зоны и граната за 1 действие;
- story_02 - Про трамплин и про камешки;
- story_03 - Про то, как группа Вильнова вернулась;
- story_04 - Про то, как Костя Федорин наткнулся на артефакт и пропал на радаре;
- story_05 - Про то, как духманам с контролером сражаться;br>
- story_06 - Про дверцу, водку и избушку;br>
- legend_01 - Про эксперимент в Зоне, который производят инопланетяне;
- legend_02 - Об особо засекреченных лабораториях в зоне;
- legend_03 - Легенда о проводнике;
- legend_04 - Легенда о темном Сталкере;
- legend_05 - Легенда о том что глубоко в Зоне спать нельзя.
- story_01 - Граница зоны и граната за 1 действие;
[game_info] stories = "story_04, legend_03, legend_04"
Секция dont_spawn_loot
Всякого рода сюжетные персонажи, которые должны быть пустыми после смерти (например раненные или пленные), оказываются не пустыми. Чтобы это исправить необходимо в custom_data персонажа прописать следующую секцию:
[dont_spawn_loot]
Файл: gamedata\scripts\death_manager.script
Оверрайды
Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны).
combat_ignore_cond = {+info –info =func !func ~number} – условия для игнорирования боя.
combat_ignore_keep_when_attacked = true/false - NPC продолжает игнорировать бой, даже если в него стреляют – только в случае стрельбы игрока!!!
combat_type = {+info –info =func !func ~number} <параметр> - тип боя которым будет пользоваться NPC из данной схемы. Возможны следующие значения:
- camper
- monolith
- zombied
- nil
- camper
on_combat = {+info –info =func !func ~number} %+info -info =func% - определяет поведение NPC при его уходе в бой.
companion_enabled = true/false - cвободноходящие сталкеры могут наниматься как компаньоны. Оверрайд существует, но не используется из-за недоработанной схемы xr_attendant.script.
Файл: gamedata\scripts\xr_combat.script
Схемы для монстров
Схема mob_walker
Работает аналогично схеме обычного walker. Но есть некоторые отличия:
[mob_walker]
path_walk = <имя_пути> - путь перемещения.
path_look = <имя_пути> - путь обзора.
no_reset = true/false - не сбрасывать action предыдущей схемы (если нужно сохранить, например, звук). По умолчанию false.
Примечание: У кровосососов можно управлять невидимостью, для этого необходимо указать параметр state:
- state = invis/vis - включить/выключить невидимость.
[mob_walker] path_walk = x18_snork_walk_1 path_look = x18_snork_look
Файл: gamedata\scripts\mob_walker.script
Схема mob_eluder
Монстр перемещается по точкам патрульного пути (не учитывая связи между точками), держась на расстоянии от игрока, при этом придерживаясь своего пути, выходя из под схемы при слишком близком приближении к игроку, и возвращаясь обратно, когда расстояние увеличиться.
[mob_eluder]
path = <имя_пути> - работает как обычно path_walk. Набор точек патрульного пути.
time_capture = <number> - время, которое монстр находится под этой схемой. По умолчанию – 10 секунд.
time_release = <number> - время, которое монстр находится под универсальной схемой. По умолчанию – 10 секунд.
min_dist = <number> - если расстояние до врага меньше этого, то он переходит под универсальную схему. По умолчанию – 5 метров.
max_dist = <number> - если расстояние до врага больше этого, то он переходит под eluder. По умолчанию – 10 метров.
Примечание: работает нестабильно.
[mob_eluder] path = dar_way_checker
Файл: gamedata\scripts\mob_eluder.script
Схема mob_remark
Ремарковая схема, только не для сталкеров, а для монстров.
[mob_remark]
state = <параметр> - специфическое состояние данного конкретного монстра (для кровососов - невидимость).
dialog_cond = {+info, =func, -info, !func ~number} - условия для открытия окна диалога.
anim = <название_анимации> - анимации монстра, перечисляются через запятую.
anim.head = <название_анимации> - анимации головы монстра, перечисляются через запятую.
tip = <параметр> - какой значок под светится, при наведении на него курсора.
snd = <название_звуковой_темы> - какой звук издает.
time = <number> - время проигрывания анимаций, используется только для отладки.
[mob_remark@hold] anim = stand_idle_0 time = 50000
Файл gamedata\scripts\mob_remark.script
Схема mob_jump
Схема mob_jump служит для задания прыжков монстров без каких либо проверок и ограничений (расстояние, углы и т.д.). Указывается позиция с помощью патрульного пути, смещение относительно этой позиции и физический фактор прыжка.
[mob_jump]
path_jump = <имя_пути> - путь, с помощью которого мы задаем 1 целевую точку прыжка (с нулевым индексом).
- Реальная точка учитывает позицию path_jump[0] + смещение, заданное с помощью offset.
ph_jump_factor = <number> - влияет на время прыжка. Визуально с помощью него задается кривизна траектории полёта.
- Чем он больше, тем прыжок более острый, быстрый (меньше дуга). По умолчанию 1.8.
offset = <vector> - смещение по осям x, y, z соответственно, с помощью которого задается реальная точка в пространстве (может не находится на аи-ноде).
С помощью данной схемы можно делать: перепрыгивание со здания на здание, выпрыгивание из окна, перепрыгивание высоких ограждений и др.
Примечание: фактически mob_jump - это не состояние, а разовое действие. При переходе в него монстр разворачивается в сторону прыжка и прыгает, поднимая сигнал jumped. Т.е. on_signal = jumped | имя_схемы_или_nil – является обязательным параметром в схеме, чтобы знать куда переходить дальше.
При выборе позиции используется первая точка патрульного пути (0-вой индекс).
[mob_jump] path_jump = aes_snork_jump1 ph_jump_factor = 1.8 offset = 0,0,0 on_signal = jumped | mob_walker2
Файл: gamedata\scripts\mob_jump.script
Схема mob_camp
Свойства схемы:
- Сидит на позиции, смотрит в точку;
- Можно задать несколько позиций и время смены позиции;
- Перемещается между позициями бегом;
- При виде врага переходит под универсальную схему (комбат/паника и т.д);
- Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции;
- Если враг уходит далеко - монстр возвращается на позицию;
[mob_camp]
path_home = <имя_пути> - путь, состоящий из точек, в которых будет находиться монстр.
path_look = <имя_пути> - путь, состоящий из точек, в которые будет смотреть монстр.
time_change_point = <number> - время изменения текущей camp-точки. По умолчанию - 10000 миллисекунд.
home_min_radius = <number> - минимальный радиус от врага до camp-точки. По умолчанию - 30 метров.
home_max_radius = <number> - максимальный радиус от врага до camp-точки. По умолчанию - 40 метров.
skip_transfer_enemy = true/false – управляет передачей врагов от друзей. Если установлено в true и видит дружественного монстра, то его враги также становятся врагами.(для этого нужно всех монстров в разные group разнести).
Минимальный и максимальный радиус необходимы для игнорирования врага, если он убежал далеко и для возврата на текущую позицию. Учитывается дистанция от врага до текущей позиции. Если дистанция меньше home_min_radius - атакуем врага, пока враг не исчезнет или дистанция не будет больше home_max_radius.
Две дистанции необходимы для того, чтобы избежать ситуации, когда игрок стоит на границе радиуса действия и входит/выходит в зону и монстр бегает то в свою camp-позицию, то на врага.
Выбор текущей позиции производится случайным образом.
Индексы точек пути для path_home и path_look должны совпадать (т.е. монстр сидит во второй точке path_home и смотрит во вторую точку path_look).
Единственным необходимым параметром является path_look.
Если не установлен path_home, в качестве камперской точки учитывается позиция и нода объекта при спауне.
Для того чтобы монстр смотрел в разные точки на кампер-позиции, path_look может состоять из нескольких точек.
Примечание: обязательные требованием является:
- home_min_radius < home_max_radius;
- Количество точек путей path_look и path_home должно быть равным.
- home_min_radius < home_max_radius;
P.S. mob_camp можно использовать как альтернативу к монстрам под рестрикторами.
[mob_camp] path_home = aes2_snork_walk3 path_look = aes2_snork_look3 home_min_radius = 10 home_max_radius = 15
Файл: gamedata\scripts\mob_camp.script
Схема mob_home
Схема является ещё одним решением по замене рестрикторов. Рекомендую все следующие гулаги монстров делать на mob_home, а старые гулаги постепенно переводить на mob_home. У кого рестрикторы работают хорошо и красиво, их можно не трогать.
[mob_home]
path_home = <имя_пути> - точка, вокруг которой будут держаться монстр.
home_min_radius = <number> - минимальный радиус от врага до path_home точки. По умолчанию - 20 метров.
home_max_radius = <number> - максимальный радиус от врага до path_home точки. По умолчанию - 40 метров.
aggressive_home - в назначенную точку path_home монстры бегут а не идут.
Описание:
Монстры держатся вокруг точек пути path_home. В атаке бросаются на врага, если враг внутри home_min радиуса, иначе прячутся в укрытия. Отсюда следует, что home_min_radius желательно делать таким, чтобы внутри было достаточно каверов. В айдле тоже обычно расходятся по каверам. home_max_radius сделан по принципу большого рестриктера в схеме mob_camp.
Примечание: добавлена возможность задания минимального и максимального радиусов для схемы mob_home в флагах первой точки пути (path_home). Для этого введены флаги minr и maxr. В случае, если радиусы заданы и в секции и во флагах, то значение радиуса берется из секции. Если не задано ни там, ни там, то берутся дефолтные значения.
[mob_home@gar_boars_nest] path_home = home home_min_radius = 25 home_max_radius = 50 aggressive_home
Файл: gamedata\scripts\mob_home.script
Схема mob_fake_death
Появилась схема mob_fake_death для зомби. Необходимо для сценок, когда игрок идёт, а вокруг него начинают подниматься зомби.
[mob_fake_death]
При входе в схему зомби падает, при выходе из схемы встает.
[mob_fake_death] on_actor_dist_le = 5 | nil
Файл: gamedata\scripts\mob_fake_death.script
Секции для монстров
Секция mob_combat
Секция работает аналогично схеме combat для NPC.
on_combat = mob_combat
[mob_combat]
on_info = {+info -info =func !func ~number}%+info -info =func% - эффекты, которые вызываются когда монстр уходит в бой. Вызываются при каждом апдейте.
[logic@val_sos_bs] ... on_combat = mob_combat [mob_combat] on_info = nil %=disable_combat_handler%
Файл: gamedata\scripts\mob_combat.script
Секция mob_death
Секция работает аналогично схеме death для NPC.
on_death = mob_death
[mob_death]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются при смерти монстра.
[logic@gar_boars_nest_rush] ... on_death = mob_death@gar_boars_rush [mob_death@gar_boars_rush] on_info = {=killed_by_actor} %=inc_counter(gar_boars_counter)%
Файл: gamedata\scripts\mob_death.script
Оверрайды для монстров
actor_friendly = true/false - если true, то монстр не атакует актера, до первой атаки на него.
npc_friendly = true/false - если true, то монстр не атакует сталкеров и монстров, до первой атаки на него.
friendly = true/false - если true, то монстр не атакует никого до первой атаки на него.
braindead = true/false - если true, то монстр игнорирует любые атаки.
Общая секция spawner
Эта секция, которая присутствует как у NPC, так и у монстров, спавнит их по определенному условию (выводит в онлайн). Для того, чтобы они появились в данной точке, им надо поставить в настройках в Level editor флажок no_move_in_offline и отключен can_switch_offline. Спавнер прописывается в custom_data объекта перед секцией logic.
[spawner]
cond = {+info -info =func !func ~number} - условия для спавна.
Если условия спавна не будет выполняться, то объект не заспавниться, а если он заспавнился и условие перестает выполняться, то объект будет спавнером уведен в оффалйн.
После того, как объект заспавнился, его берет под управление скрипт Logic.
[spawner] cond = {+esc_boar_dogs_restrictor}
Файл: gamedata\scripts\xr_spawner.script
Спавн монстров дневных и ночных
[spawner]
cond = {=is_day} – спавнить монстра только днем (если надо ночью, то пишем {!is_day})
check_distance = true – проверка на наличие персонажа рядом.
min_distance = 100 – если игрок ближе указанной дистанции, то монстр не заспавниться (по дефолту 150 метров, но на самом деле это много).
3.8. Скрипт logic
NB: если хотите заспавнить у npc что-то из вещей из custom data, то описание того, как это делается находится в Общей части в настройке профилей персонажей (только тег supplies писать не надо!)
Скрипт logic управляет переключением схем.
В customdata любого персонажа (кроме свободных) должна присутствовать секция [logic].
Функции, на которые ссылается секция [logic] должны находится в файлах \gamedata\scripts\xr_effects.script или \gamedata\scripts\xr_conditions.script.
В секции должно присутствовать одно из полей:
active = активная схема, запускающаяся первой.
cfg = имя_ltx_файла_с_настройками
Если задано поле cfg, то в качестве настроек персонажа будет использовано содержимое указанного файла.
Пример. Настройки простого walker-а:
[logic]
active = walker
[walker]
path_walk = walk1
path_look = look1
Переключение схем выполняется с помощью дополнительных условий схемы logic, которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:
Список доступных схем перечислен в главе схемы.
Примечание: если logic переключает между несколькими одноименными схемами (например несколькими walker), то их можно нумеровать (walker1, walker2) или через @ давать более информативные названия walker@day, walker@alarm и т.д.
on_actor_dist_le = number | scheme - дистанция до игрока <= number
on_actor_dist_le_nvis = number | scheme - дистанция до игрока <= number без проверки на видимость
on_actor_dist_ge = number | scheme - если дистанция до игрока > number
on_actor_dist_ge_nvis = number | scheme - если дистанция до игрока > number без проверки на видимость
on_signal = signal | scheme - срабатывает по приходу сигнала signal от текущей активной схемы
on_info = scheme - срабатывает всегда
on_timer = msec | scheme - срабатывает через msec мс после включения схемы
on_game_timer = sec| scheme – срабатывает через sec секунд игрового времени, после включения схемы
on_actor_in_zone = restrictor_name | scheme – если актер в зоне, (указывается имя рестриктора)
on_actor_not_in_zone = restrictor_name | scheme – если актер не в зоне, (указывается имя рестриктора)
on_npc_in_zone = npc_story_id | restrictor_name | scheme – если NPC в зоне, указывается story_id NPC, и имя рестриктора
on_npc_not_in_zone = npc_story_id | restrictor_name | scheme - если NPC не в зоне, указывается story_id NPC, и имя рестриктора
on_actor_inside = scheme - зона проверяет, находится ли игрок внутри нее
on_actor_outside = scheme - зона проверяет, находится ли игрок за ее пределами
NB: с любыми из вышеперечисленных параметров можно работать следующим образом:
on_info = {….} %...%
on_info2 = {….} %...%
on_info3 = {…} %...%
и так далее до посинения
а также условия для переключения на описанные выше секции.
combat_ignore_cond =
on_hit =
on_death =
on_combat =
on_use =