Настройка логики. Часть 2 — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
ColR iT (обсуждение | вклад) (→3.3.7. Секция dont_spawn_character_supplies) |
(→Секция actor_dialogs) |
||
(не показаны 32 промежуточных версий 6 участников) | |||
Строка 111: | Строка 111: | ||
actor_dialogs = actor_dialogs | actor_dialogs = actor_dialogs | ||
− | [ | + | [actor_dialogs] |
− | + | ||
id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end</ini> | id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end</ini> | ||
Строка 141: | Строка 140: | ||
'''[combat_ignore]''' | '''[combat_ignore]''' | ||
+ | <!-- SPECIAL FOR AndreySoul: Оверрайд именно МОЖНО задавать, а не НУЖНО! В том и отличие оверрайдов от секций: секции работают на всю логику, оверрайды только в указанной схеме--> | ||
В любой другой схеме можно задать оверрайд, который позволит игнорировать бой только по выполнению условия:<br> | В любой другой схеме можно задать оверрайд, который позволит игнорировать бой только по выполнению условия:<br> | ||
Строка 151: | Строка 151: | ||
В файле ''xr_condition.script'' есть функции, используемые для работы с кондлистом оверрайда:<br> | В файле ''xr_condition.script'' есть функции, используемые для работы с кондлистом оверрайда:<br> | ||
− | :*'''''fighting_dist_ge_20''''' - текущий враг на расстоянии больше или равном | + | :*'''''fighting_dist_ge_20''''' - текущий враг на расстоянии больше или равном 20 м;<br> |
:*'''''fighting_dist_ge''''' – универсальная функция, проверка расстояния для игрока;<br> | :*'''''fighting_dist_ge''''' – универсальная функция, проверка расстояния для игрока;<br> | ||
:*'''''fighting_actor''''' - текущий враг актёр?;<br> | :*'''''fighting_actor''''' - текущий враг актёр?;<br> | ||
Строка 166: | Строка 166: | ||
==Секция dont_spawn_character_supplies== | ==Секция dont_spawn_character_supplies== | ||
− | Если прописать эту секцию в кастом дату персонажу, то у него внутри не заспавниться стандартный набор барахла, прописанный | + | Если прописать эту секцию в кастом дату персонажу, то у него внутри не заспавниться стандартный набор барахла, прописанный в его профиле.<br> |
'''[dont_spawn_character_supplies]''' | '''[dont_spawn_character_supplies]''' | ||
Строка 191: | Строка 191: | ||
Файл: ''gamedata\scripts\stalker_generic.script'' | Файл: ''gamedata\scripts\stalker_generic.script'' | ||
− | ==Danger== | + | ==Секция Danger== |
Секцию необходимо указывать '''только для какой-то конкретной схемы'''!<br> | Секцию необходимо указывать '''только для какой-то конкретной схемы'''!<br> | ||
Строка 227: | Строка 227: | ||
Файл: ''gamedata_1006\scripts\xr_danger.script'' | Файл: ''gamedata_1006\scripts\xr_danger.script'' | ||
− | == | + | ==Секция game_info== |
− | + | "Обучает" NPC рассказывать у костра истории и легенды. Секция прописывается в '''''custom_data''''' NPC.<br> | |
− | + | ||
− | [game_info]<br> | + | '''[game_info]'''<br> |
− | stories = " | + | '''''stories = "<название_звуковой_темы>"''''' - имена звуковых тем из файла ''sound_theme.script''.<br> |
− | + | Несколько тем перечислять через запятую.<br> | |
+ | Существуют следующие истории и легенды:<br> | ||
+ | :*'''''story_01''''' - Граница зоны и граната за 1 действие;<br> | ||
+ | :*'''''story_02''''' - Про трамплин и про камешки;<br> | ||
+ | :*'''''story_03''''' - Про то, как группа Вильнова вернулась;<br> | ||
+ | :*'''''story_04''''' - Про то, как Костя Федорин наткнулся на артефакт и пропал на радаре;<br> | ||
+ | :*'''''story_05''''' - Про то, как духманам с контролером сражаться;br> | ||
+ | :*'''''story_06''''' - Про дверцу, водку и избушку;br> | ||
+ | :*'''''legend_01''''' - Про эксперимент в Зоне, который производят инопланетяне;<br> | ||
+ | :*'''''legend_02''''' - Об особо засекреченных лабораториях в зоне;<br> | ||
+ | :*'''''legend_03''''' - Легенда о проводнике;<br> | ||
+ | :*'''''legend_04''''' - Легенда о темном Сталкере;<br> | ||
+ | :*'''''legend_05''''' - Легенда о том что глубоко в Зоне спать нельзя.<br> | ||
− | + | '''''Пример использования секции''''':<ini>[game_info] | |
− | + | stories = "story_04, legend_03, legend_04"</ini> | |
− | + | ||
− | story_04 | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | legend_04 | + | |
− | + | ||
− | + | ==Секция dont_spawn_loot== | |
+ | Всякого рода сюжетные персонажи, которые должны быть пустыми после смерти (например раненные или пленные), оказываются не пустыми. Чтобы это исправить необходимо в '''''custom_data''''' персонажа прописать следующую секцию:<br> | ||
+ | '''[dont_spawn_loot]'''<br> | ||
− | + | Файл: ''gamedata\scripts\death_manager.script'' | |
− | + | ||
− | + | ||
=Оверрайды= | =Оверрайды= | ||
− | Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны)<br> | + | Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны).<br> |
− | + | ||
− | + | '''''combat_ignore_cond = {+info –info =func !func ~number}''''' – условия для игнорирования боя.<br> | |
− | + | '''''combat_ignore_keep_when_attacked = true/false''''' - NPC продолжает игнорировать бой, даже если в него стреляют – ''только в случае стрельбы игрока''!!!<br> | |
− | + | '''''combat_type = {+info –info =func !func ~number} <параметр>''''' - тип боя которым будет пользоваться NPC из данной схемы. Возможны следующие значения:<br> | |
− | + | :*'''''camper'''''<br> | |
− | + | :*'''''monolith'''''<br> | |
− | + | :*'''''zombied'''''<br> | |
− | + | :*'''''nil'''''<br> | |
− | *on_combat = | + | '''''on_combat = {+info –info =func !func ~number} %+info -info =func%''''' - определяет поведение NPC при его уходе в бой.<br> |
− | + | '''''companion_enabled = true/false''''' - cвободноходящие сталкеры могут наниматься как компаньоны. Оверрайд существует, но не используется из-за недоработанной схемы ''xr_attendant.script''.<br> | |
+ | |||
+ | Файл: ''gamedata\scripts\xr_combat.script'' | ||
+ | |||
+ | ==Отметки на минимапе== | ||
+ | Появилась возможность не показывать сталкеров на минимапе и на карте (прятать жёлтые и красные точки). Для этого в секции логики или в текущей схеме указываем параметр '''''show_spot'''''. Возможно наличие условия.<br> | ||
+ | |||
+ | '''[walker]'''<br> | ||
+ | '''''show_spot = {+info -info =func !func ~number} true/false''''' - показывать или нет на карте. По умолчанию '''''true'''''.<br> | ||
+ | |||
+ | Файл: ''gamedata\scripts\stalker_generic.script'' | ||
=Схемы для монстров= | =Схемы для монстров= | ||
− | == | + | ==Схема mob_walker== |
− | Работает аналогично схеме обычного walker. Но есть некоторые отличия<br> | + | Работает аналогично схеме обычного '''''walker'''''. Но есть некоторые отличия:<br> |
− | + | '''[mob_walker]'''<br> | |
− | + | '''''path_walk = <имя_пути>''''' - путь перемещения.<br> | |
− | + | '''''path_look = <имя_пути>''''' - путь обзора.<br> | |
− | + | '''''no_reset = true/false''''' - не сбрасывать '''''action''''' предыдущей схемы (если нужно сохранить, например, звук). По умолчанию '''''false'''''.<br> | |
− | + | ||
− | + | ||
− | + | ||
− | path_look = путь обзора<br> | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | У кровосососов можно управлять невидимостью: | + | '''''Примечание''''': У кровосососов можно управлять невидимостью, для этого необходимо указать параметр '''''state''''': |
− | + | :'''''state = invis/vis''''' - включить/выключить невидимость.<br> | |
− | + | ||
− | state = vis | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | '''''Пример использования схемы''''':<ini>[mob_walker] | |
− | + | path_walk = x18_snork_walk_1 | |
− | + | path_look = x18_snork_look</ini> | |
− | + | ||
− | == | + | Файл: ''gamedata\scripts\mob_walker.script'' |
+ | |||
+ | ==Схема mob_eluder== | ||
Монстр перемещается по точкам патрульного пути (не учитывая связи между точками), держась на расстоянии от игрока, при этом придерживаясь своего пути, выходя из под схемы при слишком близком приближении к игроку, и возвращаясь обратно, когда расстояние увеличиться.<br> | Монстр перемещается по точкам патрульного пути (не учитывая связи между точками), держась на расстоянии от игрока, при этом придерживаясь своего пути, выходя из под схемы при слишком близком приближении к игроку, и возвращаясь обратно, когда расстояние увеличиться.<br> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == | + | '''[mob_eluder]'''<br> |
− | + | '''''path = <имя_пути>''''' - работает как обычно path_walk. Набор точек патрульного пути.<br> | |
+ | '''''time_capture = <number>''''' - время, которое монстр находится под этой схемой. По умолчанию – 10 секунд.<br> | ||
+ | '''''time_release = <number>''''' - время, которое монстр находится под универсальной схемой. По умолчанию – 10 секунд.<br> | ||
+ | '''''min_dist = <number>''''' - если расстояние до врага меньше этого, то он переходит под универсальную схему. По умолчанию – 5 метров.<br> | ||
+ | '''''max_dist = <number>''''' - если расстояние до врага больше этого, то он переходит под '''''eluder'''''. По умолчанию – 10 метров.<br> | ||
− | + | '''''Примечание''''': '''работает нестабильно'''.<br> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
+ | '''''Пример использования схемы''''':<ini>[mob_eluder] | ||
+ | path = dar_way_checker</ini> | ||
− | + | Файл: ''gamedata\scripts\mob_eluder.script'' | |
− | + | ||
− | + | ||
− | == | + | ==Схема mob_remark== |
− | + | Ремарковая схема, только не для сталкеров, а для монстров.<br> | |
− | + | '''[mob_remark]'''<br> | |
+ | '''''state = <параметр>''''' - специфическое состояние данного конкретного монстра (для кровососов - невидимость).<br> | ||
+ | '''''dialog_cond = {+info, =func, -info, !func ~number}''''' - условия для открытия окна диалога.<br> | ||
+ | '''''anim = <название_анимации>''''' - анимации монстра, перечисляются через запятую.<br> | ||
+ | '''''anim.head = <название_анимации>''''' - анимации головы монстра, перечисляются через запятую.<br> | ||
+ | '''''tip = <параметр>''''' - какой значок под светится, при наведении на него курсора.<br> | ||
+ | '''''snd = <название_звуковой_темы>''''' - какой звук издает.<br> | ||
+ | '''''time = <number>''''' - время проигрывания анимаций, используется только для отладки.<br> | ||
− | + | '''''Пример использования схемы''''':<br><ini>[mob_remark@hold] | |
− | + | anim = stand_idle_0 | |
+ | time = 50000</ini> | ||
− | + | Файл ''gamedata\scripts\mob_remark.script'' | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ==Схема mob_jump== | |
− | + | Схема '''''mob_jump''''' служит для задания прыжков монстров без каких либо проверок и ограничений (расстояние, углы и т.д.). Указывается позиция с помощью патрульного пути, смещение относительно этой позиции и физический фактор прыжка.<br> | |
− | + | ||
− | + | '''[mob_jump]'''<br> | |
− | + | '''''path_jump = <имя_пути>''''' - путь, с помощью которого мы задаем 1 целевую точку прыжка (с нулевым индексом). | |
− | + | :Реальная точка учитывает позицию '''''path_jump[0]''''' + смещение, заданное с помощью '''''offset'''''.<br> | |
+ | '''''ph_jump_factor = <number>''''' - влияет на время прыжка. Визуально с помощью него задается кривизна траектории полёта. | ||
+ | :Чем он больше, тем прыжок более острый, быстрый (меньше дуга). По умолчанию 1.8.<br> | ||
+ | '''''offset = <vector>''''' - смещение по осям '''''x''''', '''''y''''', '''''z''''' соответственно, с помощью которого задается реальная точка в пространстве (может не находится на аи-ноде). <br> | ||
− | + | С помощью данной схемы можно делать: перепрыгивание со здания на здание, выпрыгивание из окна, перепрыгивание высоких ограждений и др. | |
− | + | '''''Примечание''''': фактически '''''mob_jump''''' - это не состояние, а разовое действие. При переходе в него монстр разворачивается в сторону прыжка и прыгает, поднимая сигнал '''''jumped'''''. Т.е. '''''on_signal = jumped | имя_схемы_или_nil''''' – является обязательным параметром в схеме, чтобы знать куда переходить дальше.<br> | |
− | + | При выборе позиции используется первая точка патрульного пути (0-вой индекс).<br> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | '''''Пример использования схемы''''':<br><ini>[mob_jump] | |
+ | path_jump = aes_snork_jump1 | ||
+ | ph_jump_factor = 1.8 | ||
+ | offset = 0,0,0 | ||
+ | on_signal = jumped | mob_walker2</ini> | ||
− | + | Файл: ''gamedata\scripts\mob_jump.script'' | |
− | + | ||
− | + | ==Схема mob_camp== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Свойства схемы: | |
− | * | + | :*Сидит на позиции, смотрит в точку; |
− | + | :*Можно задать несколько позиций и время смены позиции; | |
− | * | + | :*Перемещается между позициями бегом; |
− | * | + | :*При виде врага переходит под универсальную схему (комбат/паника и т.д); |
− | * | + | :*Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции; |
+ | :*Если враг уходит далеко - монстр возвращается на позицию; | ||
− | + | '''[mob_camp]'''<br> | |
− | Минимальный и максимальный радиус необходимы для игнорирования врага, если он убежал далеко и для возврата на текущую позицию. Учитывается дистанция от врага до текущей позиции. Если дистанция меньше home_min_radius - атакуем врага, пока враг не исчезнет или дистанция не будет больше home_max_radius.<br> | + | '''''path_home = <имя_пути>''''' - путь, состоящий из точек, в которых будет находиться монстр.<br> |
+ | '''''path_look = <имя_пути>''''' - путь, состоящий из точек, в которые будет смотреть монстр.<br> | ||
+ | '''''time_change_point = <number>''''' - время изменения текущей camp-точки. По умолчанию - 10000 миллисекунд.<br> | ||
+ | '''''home_min_radius = <number>''''' - минимальный радиус от врага до camp-точки. По умолчанию - 30 метров.<br> | ||
+ | '''''home_max_radius = <number>''''' - максимальный радиус от врага до camp-точки. По умолчанию - 40 метров.<br> | ||
+ | '''''skip_transfer_enemy = true/false''''' – управляет передачей врагов от друзей. Если установлено в '''''true''''' и видит дружественного монстра, то его враги также становятся врагами.(для этого нужно всех монстров в разные '''''group''''' разнести).<br> | ||
+ | |||
+ | Минимальный и максимальный радиус необходимы для игнорирования врага, если он убежал далеко и для возврата на текущую позицию. Учитывается дистанция от врага до текущей позиции. Если дистанция меньше '''''home_min_radius''''' - атакуем врага, пока враг не исчезнет или дистанция не будет больше '''''home_max_radius'''''.<br> | ||
Две дистанции необходимы для того, чтобы избежать ситуации, когда игрок стоит на границе радиуса действия и входит/выходит в зону и монстр бегает то в свою camp-позицию, то на врага.<br> | Две дистанции необходимы для того, чтобы избежать ситуации, когда игрок стоит на границе радиуса действия и входит/выходит в зону и монстр бегает то в свою camp-позицию, то на врага.<br> | ||
− | Выбор текущей позиции производится случайным образом<br> | + | Выбор текущей позиции производится случайным образом.<br> |
− | Индексы точек пути для path_home и path_look должны совпадать (т.е. монстр сидит во второй точке path_home и смотрит во вторую точку path_look)<br> | + | Индексы точек пути для '''''path_home''''' и '''''path_look''''' должны совпадать (т.е. монстр сидит во второй точке '''''path_home''''' и смотрит во вторую точку '''''path_look''''').<br> |
− | Единственным необходимым параметром является path_look<br> | + | Единственным необходимым параметром является '''''path_look'''''.<br> |
− | Если не установлен path_home, в качестве | + | Если не установлен '''''path_home''''', в качестве камперской точки учитывается позиция и нода объекта при спауне.<br> |
− | Для того чтобы монстр смотрел в разные точки на | + | Для того чтобы монстр смотрел в разные точки на кампер-позиции, '''''path_look''''' может состоять из нескольких точек.<br> |
− | + | '''''Примечание''''': обязательные требованием является:<br> | |
− | home_min_radius < home_max_radius<br> | + | :*'''''home_min_radius < home_max_radius''''';<br> |
− | Количество точек путей path_look и path_home должно быть равным | + | :*Количество точек путей '''''path_look''''' и '''''path_home должно быть равным.<br> |
− | + | ||
− | + | P.S. '''''mob_camp''''' можно использовать как альтернативу к монстрам под рестрикторами.<br> | |
− | + | ||
− | Пример:<br> | + | '''''Пример использования схемы''''':<ini>[mob_camp] |
− | [mob_home]<br> | + | path_home = aes2_snork_walk3 |
− | path_home = | + | path_look = aes2_snork_look3 |
− | home_min_radius = | + | home_min_radius = 10 |
− | home_max_radius = | + | home_max_radius = 15</ini> |
− | aggressive_home - в назначенную точку path_home монстры бегут а не идут.<br> | + | |
+ | Файл: ''gamedata\scripts\mob_camp.script'' | ||
+ | |||
+ | ==Схема mob_home== | ||
+ | Схема является ещё одним решением по замене рестрикторов. Рекомендую все следующие гулаги монстров делать на '''''mob_home''''', а старые гулаги постепенно переводить на '''''mob_home'''''. У кого рестрикторы работают хорошо и красиво, их можно не трогать. <br> | ||
+ | |||
+ | '''[mob_home]'''<br> | ||
+ | '''''path_home = <имя_пути>''''' - точка, вокруг которой будут держаться монстр.<br> | ||
+ | '''''home_min_radius = <number>''''' - минимальный радиус от врага до '''''path_home''''' точки. По умолчанию - 20 метров.<br> | ||
+ | '''''home_max_radius = <number>''''' - максимальный радиус от врага до '''''path_home''''' точки. По умолчанию - 40 метров.<br> | ||
+ | '''''aggressive_home''''' - в назначенную точку '''''path_home''''' монстры бегут а не идут.<br> | ||
Описание:<br> | Описание:<br> | ||
− | Монстры держатся вокруг точек пути path_home. В атаке бросаются на врага, если враг внутри home_min радиуса, иначе прячутся в укрытия. Отсюда следует, что | + | Монстры держатся вокруг точек пути path_home. В атаке бросаются на врага, если враг внутри '''''home_min''''' радиуса, иначе прячутся в укрытия. Отсюда следует, что '''''home_min_radius''''' желательно делать таким, чтобы внутри было достаточно каверов. В айдле тоже обычно расходятся по каверам. '''''home_max_radius''''' сделан по принципу большого рестриктера в схеме '''''mob_camp'''''.<br> |
− | + | '''''Примечание''''': добавлена возможность задания минимального и максимального радиусов для схемы '''''mob_home''''' в флагах первой точки пути ('''''path_home'''''). Для этого введены флаги '''''minr''''' и '''''maxr'''''. В случае, если радиусы заданы и в секции и во флагах, то значение радиуса берется из '''''секции'''''. Если не задано ни там, ни там, то берутся дефолтные значения.<br> | |
− | == | + | '''''Пример использования схемы''''':<ini>[mob_home@gar_boars_nest] |
+ | path_home = home | ||
+ | home_min_radius = 25 | ||
+ | home_max_radius = 50 | ||
+ | aggressive_home</ini> | ||
− | + | Файл: ''gamedata\scripts\mob_home.script'' | |
− | + | ||
− | + | ==Схема mob_fake_death== | |
− | + | ||
− | + | Появилась схема '''''mob_fake_death''''' для зомби. Необходимо для сценок, когда игрок идёт, а вокруг него начинают подниматься зомби.<br> | |
− | + | ||
+ | '''[mob_fake_death]'''<br> | ||
При входе в схему зомби падает, при выходе из схемы встает.<br> | При входе в схему зомби падает, при выходе из схемы встает.<br> | ||
− | + | '''''Пример использования схемы''''':<ini>[mob_fake_death] | |
− | + | on_actor_dist_le = 5 | nil</ini> | |
− | + | ||
− | + | ||
− | + | ||
− | + | Файл: ''gamedata\scripts\mob_fake_death.script'' | |
− | + | ||
− | == | + | =Секции для монстров= |
− | + | ||
− | + | ||
− | + | ==Секция mob_combat== | |
− | + | Секция работает аналогично схеме '''''combat''''' для NPC.<br> | |
− | + | '''''on_combat = mob_combat'''''<br> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | '''[mob_combat]'''<br> | |
+ | '''''on_info = {+info -info =func !func ~number}%+info -info =func%''''' - эффекты, которые вызываются когда монстр уходит в бой. Вызываются при каждом апдейте.<br> | ||
− | + | '''''Пример использования секции''''':<ini>[logic@val_sos_bs] | |
− | [ | + | ... |
− | + | on_combat = mob_combat | |
− | + | ||
− | + | ||
− | == | + | [mob_combat] |
+ | on_info = nil %=disable_combat_handler%</ini> | ||
+ | |||
+ | Файл: ''gamedata\scripts\mob_combat.script''<br> | ||
+ | |||
+ | ==Секция mob_death== | ||
+ | Секция работает аналогично схеме '''''death''''' для NPC.<br> | ||
+ | |||
+ | '''''on_death = mob_death'''''<br> | ||
+ | |||
+ | '''[mob_death]'''<br> | ||
+ | '''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются при смерти монстра.<br> | ||
+ | |||
+ | '''''Пример использования секции''''':<ini>[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)%</ini> | ||
− | + | Файл: ''gamedata\scripts\mob_death.script'' | |
− | + | ||
− | + | =Оверрайды для монстров= | |
+ | '''''actor_friendly = true/false''''' - если '''''true''''', то монстр не атакует актера, до первой атаки на него.<br> | ||
+ | '''''npc_friendly = true/false''''' - если '''''true''''', то монстр не атакует сталкеров и монстров, до первой атаки на него.<br> | ||
+ | '''''friendly = true/false''''' - если '''''true''''', то монстр не атакует никого до первой атаки на него.<br> | ||
+ | '''''braindead = true/false''''' - если '''''true''''', то монстр игнорирует любые атаки.<br> | ||
− | + | =Общая секция spawner= | |
− | + | Эта секция, которая присутствует как у NPC, так и у монстров, спавнит их по определенному условию (выводит в онлайн). Для того, чтобы они появились в данной точке, им надо поставить в настройках в ''Level editor'' флажок '''''no_move_in_offline''''' и отключен '''''can_switch_offline'''''. Спавнер прописывается в '''''custom_data''''' объекта перед секцией '''''logic'''''.<br> | |
− | + | ||
− | + | '''[spawner]'''<br> | |
− | + | '''''cond = {+info -info =func !func ~number}''''' - условия для спавна.<br> | |
− | + | Если условия спавна не будет выполняться, то объект не заспавниться, а если он заспавнился и условие перестает выполняться, то объект будет спавнером уведен в оффалйн.<br> | |
− | + | ||
− | + | После того, как объект заспавнился, его берет под управление скрипт '''''Logic'''''.<br> | |
− | + | ||
− | + | ||
− | + | '''''Пример использования секции''''':<ini>[spawner] | |
− | + | cond = {+esc_boar_dogs_restrictor}</ini> | |
− | + | ||
− | + | Файл: ''gamedata\scripts\xr_spawner.script'' | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ==Спавн монстров дневных и ночных== | |
− | + | '''[spawner]'''<br> | |
− | + | '''''cond = {=is_day}''''' – спавнить монстра только днем (если надо ночью, то пишем {!is_day})<br> | |
− | + | '''''check_distance = true''''' – проверка на наличие персонажа рядом.<br> | |
− | + | '''''min_distance = 100''''' – если игрок ближе указанной дистанции, то монстр не заспавниться (по дефолту 150 метров, но на самом деле это много). | |
+ | ---- | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | = | + | <font size = 5>[[Часть 3]]</font> |
[[Категория:A-Life]][[Категория:Скрипты]] | [[Категория:A-Life]][[Категория:Скрипты]] |
Текущая версия на 16:56, 2 апреля 2015
Содержание |
---|
Настройка логики. Часть 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_dialogs] 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
Отметки на минимапе
Появилась возможность не показывать сталкеров на минимапе и на карте (прятать жёлтые и красные точки). Для этого в секции логики или в текущей схеме указываем параметр show_spot. Возможно наличие условия.
[walker]
show_spot = {+info -info =func !func ~number} true/false - показывать или нет на карте. По умолчанию true.
Файл: gamedata\scripts\stalker_generic.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 метров, но на самом деле это много).