Настройка логики. Часть 2 — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

Настройка логики. Часть 2 — различия между версиями

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
(3.5.6 Схема mob_jump (монстр-пружинка))
(3.5.7. Mob_camp)
Строка 362: Строка 362:
 
Файл: ''gamedata\scripts\mob_jump.script''
 
Файл: ''gamedata\scripts\mob_jump.script''
  
==3.5.7. Mob_camp==
+
==Схема Mob_camp==
  
Механика:
+
Свойства схемы:
  1. Сидит на позиции, смотрит в точку  
+
:*Сидит на позиции, смотрит в точку;
  2. Можно задать несколько позиций и время смены позиции.
+
:*Можно задать несколько позиций и время смены позиции;
  3. Перемещается между позициями бегом
+
:*Перемещается между позициями бегом;
  4. При виде врага переходит под универсальную схему (комбат/паника и т.д)
+
:*При виде врага переходит под универсальную схему (комбат/паника и т.д);
  5. Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции
+
:*Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции;
  6. Если враг уходит далеко - монстр возвращается на позицию
+
:*Если враг уходит далеко - монстр возвращается на позицию;
  
Использование:
+
'''[mob_camp]'''<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>
  
[logic]<br>
+
Минимальный и максимальный радиус необходимы для игнорирования врага, если он убежал далеко и для возврата на текущую позицию. Учитывается дистанция от врага до текущей позиции. Если дистанция меньше '''''home_min_radius''''' - атакуем врага, пока враг не исчезнет или дистанция не будет больше '''''home_max_radius'''''.<br>
active = mob_camp<br>
+
Две дистанции необходимы для того, чтобы избежать ситуации, когда игрок стоит на границе радиуса действия и входит/выходит в зону и монстр бегает то в свою camp-позицию, то на врага.<br>
 +
Выбор текущей позиции производится случайным образом.<br>
 +
Индексы точек пути для '''''path_home''''' и '''''path_look''''' должны совпадать (т.е. монстр сидит во второй точке '''''path_home''''' и смотрит во вторую точку '''''path_look''''').<br>
  
[mob_camp]<br>
+
Единственным необходимым параметром является '''''path_look'''''.<br>
path_look = way_look<br>
+
Если не установлен '''''path_home''''', в качестве камперской точки учитывается позиция и нода объекта при спауне.<br>
path_home = way_home<br>
+
time_change_point = 30000<br>
+
home_min_radius  = 20<br>
+
home_max_radius = 50<br>
+
skip_transfer_enemy – если прописать в кастом дату, то монстр не будет принимать врага от друших монстров, если его увидит (для этого нужно всех монстров в разные group разнести)<br>
+
  
Описание параметров:<br>
+
Для того чтобы монстр смотрел в разные точки на кампер-позиции, '''''path_look''''' может состоять из нескольких точек.<br>
*path_home - путь, состоящий из точек, в которых будет находиться монстр
+
path_look - путь, состоящий из точек, в которые будет смотреть монстр 
+
*time_change_point - время изменения текущей camp-точки  (по-умолчанию10000), мс
+
* home_min_radius - минимальный радиус от врага до camp-точки (по-умолчанию 30), м
+
* home_max_radius - максимальный радиус  от врага до camp-точки (по-умолчанию 40), м
+
  
Особенности:<br>
+
'''''Примечание''''': обязательные требованием является:<br>
Минимальный и максимальный радиус необходимы для игнорирования врага, если он убежал далеко и для возврата на текущую позицию. Учитывается дистанция от врага до текущей позиции. Если дистанция меньше home_min_radius - атакуем врага, пока враг не исчезнет или дистанция не будет больше home_max_radius.<br>
+
:*'''''home_min_radius < home_max_radius''''';<br>
Две дистанции необходимы для того, чтобы избежать ситуации, когда игрок стоит на границе радиуса действия и входит/выходит в зону и монстр бегает то в свою camp-позицию, то на врага.<br>
+
:*Количество точек путей '''''path_look''''' и '''''path_home должно быть равным.<br>
Выбор текущей позиции производится случайным образом<br>
+
Индексы точек пути для path_home и path_look должны совпадать (т.е. монстр сидит во второй точке path_home и смотрит во вторую точку path_look)<br>
+
  
Единственным необходимым параметром является path_look<br>
+
P.S. '''''mob_camp''''' можно использовать как альтернативу к монстрам под рестрикторами.<br>
Если не установлен path_home, в качестве кемперской точки учитывается позиция и нода объекта на спауне.<br>
+
  
Для того чтобы монстр смотрел в разные точки на кемпер-позиции, path_look может состоять из нескольких точек.<br>
+
'''''Пример использования схемы''''':<ini>[mob_camp]
 +
path_home = aes2_snork_walk3
 +
path_look = aes2_snork_look3
 +
home_min_radius  = 10
 +
home_max_radius = 15</ini>
  
Обязательные требования:<br>
+
Файл: ''gamedata\scripts\mob_camp.script''
home_min_radius < home_max_radius<br>
+
Количество точек путей path_look и path_home должно быть равным<br>
+
P.S. Mob_Camp можно использовать как альтернативу к монстрам под рестрикторами<br>
+
  
 
==3.5.8. Mob_home==
 
==3.5.8. Mob_home==

Версия 08:14, 3 мая 2012

Содержание

Настройка логики. Часть 0
Настройка логики. Часть 1
Настройка логики. Часть 2
Настройка логики. Часть 3
Настройка логики. Часть 4


Секции.

Секция 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) того, что нашим врагом есть хотя бы кто-то один из списка.

Пример использования секции:

[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 - Легенда о том что глубоко в Зоне спать нельзя.
Пример использования секции:
[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

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.

Пример использования схемы:
[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_combat, mob_death

Работают точно также как и у сталкеров соответствующие схемы.

on_combat = mob_combat

[mob_combat]
on_info = {+info -info =func !func ~number}%+info -info =func% - эффекты, которые вызываются когда монстр уходит в бой. Вызываются при каждом апдейте.

Файл: gamedata\scripts\mob_combat.script

on_death = mob_death

[mob_death]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются при смерти монстра.

Файл: gamedata\scripts\mob_death.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 должно быть равным.

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

3.5.8. Mob_home

Схема является ещё одним решением по замене рестрикторов. Рекомендую все следующие гулаги монстров делать на mob_home, а старые гулаги постепенно переводить на mob_home. У кого рестрикторы работают хорошо и красиво, их можно не трогать.

Пример:
[mob_home]
path_home = path1
home_min_radius = 10
home_max_radius = 30
aggressive_home - в назначенную точку path_home монстры бегут а не идут.

Описание:
Монстры держатся вокруг точек пути path_home. В атаке бросаются на врага, если враг внутри home_min радиуса, иначе прячутся в укрытия. Отсюда следует, что home_min -радиус желательно делать таким, чтобы внитри было достаточно каверов. В айдле тоже обычно расходятся по каверам. Home_max радиус сделан по принципу большого рестриктера в схеме «гнездо».

Добавлена возможность задания минимального и максимального радиусов для схемы mob_home в флагах первой точки пути (path_home). Для этого введены флаги minr и maxr. В случае, если радиусы заданы и в секции и во флагах, то значение радиуса берется из секции. Если не задано ни там, ни там, то берутся дефолтные значения 20 и 40 соответственно.

3.5.9. Mob_fake_death

Появилась схема mob_fake_death для зомби. Необходимо для сценок, когда игрок идёт, а вокруг него начинают подниматься зомби...
Использование:

[logic]
active = mob_fake_death

[mob_fake_death]
on_actor_dist_le = 5 | nil

При входе в схему зомби падает, при выходе из схемы встает.

3.6. Оверрайды для монстров:

actor_friendly = если true, то монстр не атакует актера, до первой атаки на него
npc_friendly = если true, то монстр не атакует сталкеров и монстров, до первой атаки на него
friendly = если true, то монстр не атакует никого до первой атаки на него
braindead = если true, то монстр игнорирует любые атаки.

Секции для монстров
[mob_death], [mob_hit]

3.7. Секция spawner

Эта секция, которая присутствует как у NPC, так и у монстров, спавнит их по определенному условию (выводит в онлайн). Для того, чтобы они появились в данной точке, им надо поставить в настройках в Level editor флажок no_move_in_offline и отключен can_switch_offline. Спавнер прописывается в кастом дату объекта перед секцией logic
Работает spawner следующим образом:

[spawner]
cond = {+info -info =func  !func}

Примечание. Если условия спавна не будет выполняться, то объект не заспавниться, а если он заспавнился и условие перестает выполняться, то объект будет спавнером уведен в оффалйн.
Пример:
[spawner]
cond = {=is_day}
(объект заспавниться днем и уйдет в оффлайн ночью)

После того, как объект заспавнился, его берет под управление скрипт Logic

3.7.1. Спавн монстров дневных и ночных.

[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 =

Часть 3

Другие места
LANGUAGE