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

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

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

Перейти к: навигация, поиск
(3.3.7. Секция dont_spawn_character_supplies)
(Секция actor_dialogs)
 
(не показаны 32 промежуточных версий 6 участников)
Строка 111: Строка 111:
 
actor_dialogs = actor_dialogs
 
actor_dialogs = actor_dialogs
  
[actor_dialbr>
+
[actor_dialogs]
:*'''''story_id''''' – числовое значениеogs]
+
 
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''''' - текущий враг на расстоянии больше или равном 20м;<br>
+
:*'''''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>
+
Если прописать эту секцию в кастом дату персонажу, то у него внутри не заспавниться стандартный набор барахла, прописанный в его профиле.<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''
  
==3.3.11. Байки из склепа (Истории у костра)==
+
==Секция game_info==
Из нового: теперь лагеря автоматически рассказывать истории не будут. Для этого вы должны того или иного сталкера "научить" истории.
+
"Обучает" NPC рассказывать у костра истории и легенды. Секция прописывается в '''''custom_data''''' NPC.<br>
Делается это так: в кастом дате пишется секция:
+
  
[game_info]<br>
+
'''[game_info]'''<br>
stories = "story_01, legend_01"<br>
+
'''''stories = "<название_звуковой_темы>"''''' - имена звуковых тем из файла ''sound_theme.script''.<br>
  
В кавычках список историй и легенд через запятую. Пока что существуют следующие истории и легенды:<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>
  
story_01 - Граница зоны и граната за 1 действие.<br>
+
'''''Пример использования секции''''':<ini>[game_info]
story_02 - Про трамплин и про камешки<br>
+
stories = "story_04, legend_03, legend_04"</ini>
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>
+
  
О том какие истории и легеды в каком лагере на каком уровня можно и нельзя юзать узнавать у Профа.<br>
+
==Секция dont_spawn_loot==
 +
Всякого рода сюжетные персонажи, которые должны быть пустыми после смерти (например раненные или пленные), оказываются не пустыми. Чтобы это исправить необходимо в '''''custom_data''''' персонажа прописать следующую секцию:<br>
 +
'''[dont_spawn_loot]'''<br>
  
==3.3.12. dont_spawn_loot==
+
Файл: ''gamedata\scripts\death_manager.script''
Всякого рода сюжетные персонажи которые должны быть пустыми после смерти (например раненные или пленные) оказываются не пустыми. Чтобы это исправить необходимо в кастом дате персонажа прописать секцию
+
[dont_spawn_loot]
+
  
 
=Оверрайды=
 
=Оверрайды=
Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны)<br>
+
Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны).<br>
*meet_enabled = true (запускает схему встречи)
+
 
*meet_talk_enabled = true (в действующую схему поведения добавляет возможность диалога)
+
'''''combat_ignore_cond = {+info –info =func !func ~number}''''' – условия для игнорирования боя.<br>
*meet_dialog  = <название диалога>, который будет запущен при юзе.
+
'''''combat_ignore_keep_when_attacked = true/false''''' - NPC продолжает игнорировать бой, даже если в него стреляют – ''только в случае стрельбы игрока''!!!<br>
*meet_state = <название состояния> он определяет, в каком состоянии будет находиться персонаж, если  открылось диалоговое окно общения и торговли
+
'''''combat_type = {+info –info =func !func ~number} <параметр>''''' - тип боя которым будет пользоваться NPC из данной схемы. Возможны следующие значения:<br>
*wounded_enabled = true (включает NPC возможность использовать схему раненого)
+
:*'''''camper'''''<br>
*combat_ignore_cond  = см. выше
+
:*'''''monolith'''''<br>
*combat_ignore_keep_when_attacked = true (игрок продолжает игнорировать бой, даже если в него стреляют – ТОЛЬКО В СЛУЧАЕ СТРЕЛЬБЫ ИГРОКА!!!!)
+
:*'''''zombied'''''<br>
*combat_type = {условие} scheme - тип боя которым будет пользоваться npc из данной схемы
+
:*'''''nil'''''<br>
*on_combat = см. выше
+
'''''on_combat = {+info –info =func !func ~number} %+info -info =func%''''' - определяет поведение NPC при его уходе в бой.<br>
*companion_enabled = true (cвободноходящие сталкеры могут наниматься как компаньоны (в будущем они будут брать за это деньги)).
+
'''''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''
  
 
=Схемы для монстров=
 
=Схемы для монстров=
  
==3.5.1. Схема mob_walker.==
+
==Схема mob_walker==
Работает аналогично схеме обычного walker. Но есть некоторые отличия<br>
+
Работает аналогично схеме обычного '''''walker'''''. Но есть некоторые отличия:<br>
  
Флаги пути движения<br>
+
'''[mob_walker]'''<br>
s=звуковая_схема (idle, eat, attack, attack_hit, take_damage, die, threaten, steal, panic, growling) с - идти дальше в присяде r - дальше бежать sig=signal_name - установить заданный сигнал для xr_logic <br>
+
'''''path_walk = <имя_пути>''''' - путь перемещения.<br>
Флаги пути обзора:<br>
+
'''''path_look = <имя_пути>''''' - путь обзора.<br>
t=время_мсек - время в миллисекундах, которое нужно ждать, смотря в точку a=anim_set - анимация (stand_idle, sit_idle, lie_idle, eat, sleep, rest, attack, look_around, turn)<br>
+
'''''no_reset = true/false''''' - не сбрасывать '''''action''''' предыдущей схемы (если нужно сохранить, например, звук). По умолчанию '''''false'''''.<br>
В customdata персонажа задайте (* отмечены обязательные поля): <br>
+
[walker]<br>
+
path_walk = путь перемещения<br>
+
path_look = путь обзора<br>
+
*no_reset = true/false - не сбрасывать action предыдущей схемы (если нужно сохранить, например, звук). По умолчанию false.<br>
+
*actor_friendly = true/false - монстр никогда первым не нападает на игрока, но если игрок хоть раз атакует монстра - этот режим навсегда отключится. По умолчанию false.<br>
+
*npc_friendly = true/false - монстр никогда первым не нападет на другого монстра (даже враждебного).<br>
+
*friendly = true/false - монстр не нападает ни на игрока, ни на монстров. В случае агрессии с их стороны, не запоминает их как врагов и остается дружественным ко всем. По умолчанию false.<br>
+
Файл: \gamedata\scripts\mob_walker.script<br>
+
  
У кровосососов можно управлять невидимостью:<br>
+
'''''Примечание''''': У кровосососов можно управлять невидимостью, для этого необходимо указать параметр '''''state''''':
[mob_walker]<br>
+
:'''''state = invis/vis''''' - включить/выключить невидимость.<br>
...<br>
+
state = vis<br>
+
или<br>
+
state = invis<br>
+
Задает значение по умолчанию.<br>
+
  
Также в флагах walk пути mob_walker-а можно использовать флажок b<br>
+
'''''Пример использования схемы''''':<ini>[mob_walker]
(behaviour) с теми же параметрами:<br>
+
path_walk = x18_snork_walk_1
wp00|b=vis<br>
+
path_look = x18_snork_look</ini>
wp00|b=invis<br>
+
  
==3.5.2. Схема mob_eluder==
+
Файл: ''gamedata\scripts\mob_walker.script''
 +
 
 +
==Схема mob_eluder==
 
Монстр перемещается по точкам патрульного пути (не учитывая связи между точками), держась на расстоянии от игрока, при этом придерживаясь своего пути, выходя из под схемы при слишком близком приближении к игроку, и возвращаясь обратно, когда расстояние увеличиться.<br>
 
Монстр перемещается по точкам патрульного пути (не учитывая связи между точками), держась на расстоянии от игрока, при этом придерживаясь своего пути, выходя из под схемы при слишком близком приближении к игроку, и возвращаясь обратно, когда расстояние увеличиться.<br>
path  = … работает как обычно path_walk. Набор точек патрульного пути.<br>
 
*Time_capture = …. (время в секундах) время, которое монстр находится под этой схемой. Default – 10.
 
*Time_release = …. (время в секундах) время, которое монстр находится под универсальной схемой. Default – 10.
 
*Min_dist = …. (расстояние в метрах, если расстояние до врага меньше этого, то он переходит под универсальную схему). Default – 5.
 
*Max_dist = …. (расстояние в метрах, если расстояние до врага больше этого, то он переходит под eluder). Default  - 10
 
Замечание – работает нестабильно.<br>
 
Файл: \gamedata\scripts\mob_eluder.script<br>
 
  
==3.5.3. Схема mob_remark==
+
'''[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>
  
*state = специфическое состояние данного конкретного монстра (для кровососов - невидимость)
+
'''''Примечание''''': '''работает нестабильно'''.<br>
*dialog_cond = {+info, =func, -info, !func} условия для открытия окна диалога
+
*anim = анимации монстра, перечисляются через запятую.
+
*anim.head = анимации головы монстра, через запятую перечисляются
+
*tip = какой значок подсветится, при наведении на него курсора
+
*snd = какой звук издает
+
*time = время проигрывания анимаций, используется только для отладки.
+
Файл \gamedata\scripts\mob_remark.script
+
На этой схеме сделан торговец.  
+
  
 +
'''''Пример использования схемы''''':<ini>[mob_eluder]
 +
path = dar_way_checker</ini>
  
==3.5.4. Схема mob_combat, mob_death==
+
Файл: ''gamedata\scripts\mob_eluder.script''
Работают точно также как и у сталкеров соответствующие схемы.
+
Файлы: \gamedata\scripts\mob_combat.script, \gamedata\scripts\mob_death.script
+
  
==3.5.6 Схема mob_jump (монстр-пружинка)==
+
==Схема mob_remark==
Схема mob_jump. Теперь mob_jump служит для задания прыжков монстров без каких либо проверок и ограничений (расстояние, углы и т.д.). Указывается позиция с помощью патрульного пути, смещение относительно этой позиции и физический фактор прыжка.<br>
+
Ремарковая схема, только не для сталкеров, а для монстров.<br>
  
Пример:<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>
  
[logic]<br>
+
'''''Пример использования схемы''''':<br><ini>[mob_remark@hold]
active = mob_jump<br>
+
anim = stand_idle_0
 +
time = 50000</ini>
  
[mob_jump]<br>
+
Файл ''gamedata\scripts\mob_remark.script''
path_jump = path<br>
+
ph_jump_factor =2.8<br>
+
offset = 0,10,0<br>
+
on_signal = jumped | nil<br>
+
  
path_jump – путь, с помощью которого мы задаем 1 целевую точку прыжка (с нулевым индексом). Реальная точка учитывает позицию path_jump[0] + смещение, заданное с помощью offset.<br>
+
==Схема mob_jump==
offset – смещение по осям x,y,z соответственно, с помощью которого задается реальная точка в пространстве (может не находится на аи-ноде). <br>
+
Схема '''''mob_jump''''' служит для задания прыжков монстров без каких либо проверок и ограничений (расстояние, углы и т.д.). Указывается позиция с помощью патрульного пути, смещение относительно этой позиции и физический фактор прыжка.<br>
ph_jump_factor - влияет на время прыжка. Визуально с помощью него задается кривизна траектории полёта. Чем он больше, тем прыжок более острый, быстрый (меньше дуга). С помощью данной схемы можно делать: перепрыгивание со здания на здание, выпрыгивание из окна, перепрыгивание высоких ограждений и др. Дефолтное значение = 1,8<br>
+
  
Примечание:<br>
+
'''[mob_jump]'''<br>
Фактически mob_jump - это не состояние, а разовое действие. При переходе в него монстр разворачивается в сторону прыжка и прыгает, поднимая сигнал jumped. Т.е. "on_signal = jumped | имя_схемы_или_nil" – является обязательным параметром в схеме, чтобы знать куда переходить дальше.<br>
+
'''''path_jump = <имя_пути>''''' - путь, с помощью которого мы задаем 1 целевую точку прыжка (с нулевым индексом).
При выборе позиции используется первая точка патрульного пути (0-вой индекс)<br>
+
:Реальная точка учитывает позицию '''''path_jump[0]''''' + смещение, заданное с помощью '''''offset'''''.<br>
 +
'''''ph_jump_factor = <number>''''' - влияет на время прыжка. Визуально с помощью него задается кривизна траектории полёта.
 +
:Чем он больше, тем прыжок более острый, быстрый (меньше дуга). По умолчанию 1.8.<br>
 +
'''''offset = <vector>''''' - смещение по осям '''''x''''', '''''y''''', '''''z''''' соответственно, с помощью которого задается реальная точка в пространстве (может не находится на аи-ноде). <br>
  
==3.5.7. Mob_camp==
+
С помощью данной схемы можно делать: перепрыгивание со здания на здание, выпрыгивание из окна, перепрыгивание высоких ограждений и др.
  
Механика:
+
'''''Примечание''''': фактически '''''mob_jump''''' - это не состояние, а разовое действие. При переходе в него монстр разворачивается в сторону прыжка и прыгает, поднимая сигнал '''''jumped'''''. Т.е. '''''on_signal = jumped | имя_схемы_или_nil''''' – является обязательным параметром в схеме, чтобы знать куда переходить дальше.<br>
  1. Сидит на позиции, смотрит в точку
+
При выборе позиции используется первая точка патрульного пути (0-вой индекс).<br>
  2. Можно задать несколько позиций и время смены позиции.
+
  3. Перемещается между позициями бегом
+
  4. При виде врага переходит под универсальную схему (комбат/паника и т.д)
+
  5. Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции
+
  6. Если враг уходит далеко - монстр возвращается на позицию
+
  
Использование:
+
'''''Пример использования схемы''''':<br><ini>[mob_jump]
 +
path_jump = aes_snork_jump1
 +
ph_jump_factor = 1.8
 +
offset = 0,0,0
 +
on_signal = jumped | mob_walker2</ini>
  
[logic]<br>
+
Файл: ''gamedata\scripts\mob_jump.script''
active = mob_camp<br>
+
  
[mob_camp]<br>
+
==Схема mob_camp==
path_look = way_look<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_home - путь, состоящий из точек, в которых будет находиться монстр
+
:*Сидит на позиции, смотрит в точку;
path_look - путь, состоящий из точек, в которые будет смотреть монстр 
+
:*Можно задать несколько позиций и время смены позиции;
*time_change_point - время изменения текущей camp-точки  (по-умолчанию10000), мс
+
:*Перемещается между позициями бегом;
* home_min_radius - минимальный радиус от врага до camp-точки (по-умолчанию 30), м
+
:*При виде врага переходит под универсальную схему (комбат/паника и т.д);
* home_max_radius - максимальный радиус  от врага до camp-точки (по-умолчанию 40), м
+
:*Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции;
 +
:*Если враг уходит далеко - монстр возвращается на позицию;
  
Особенности:<br>
+
'''[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, в качестве кемперской точки учитывается позиция и нода объекта на спауне.<br>
+
Если не установлен '''''path_home''''', в качестве камперской точки учитывается позиция и нода объекта при спауне.<br>
  
Для того чтобы монстр смотрел в разные точки на кемпер-позиции, path_look может состоять из нескольких точек.<br>
+
Для того чтобы монстр смотрел в разные точки на кампер-позиции, '''''path_look''''' может состоять из нескольких точек.<br>
  
Обязательные требования:<br>
+
'''''Примечание''''': обязательные требованием является:<br>
home_min_radius < home_max_radius<br>
+
:*'''''home_min_radius < home_max_radius''''';<br>
Количество точек путей path_look и path_home должно быть равным<br>
+
:*Количество точек путей '''''path_look''''' и '''''path_home должно быть равным.<br>
P.S. Mob_Camp можно использовать как альтернативу к монстрам под рестрикторами<br>
+
  
==3.5.8. Mob_home==
+
P.S. '''''mob_camp''''' можно использовать как альтернативу к монстрам под рестрикторами.<br>
Схема является ещё одним решением по замене рестрикторов. Рекомендую все следующие гулаги монстров делать на mob_home, а старые гулаги постепенно переводить на mob_home. У кого рестрикторы работают хорошо и красиво, их можно не трогать. <br>
+
  
Пример:<br>
+
'''''Пример использования схемы''''':<ini>[mob_camp]
[mob_home]<br>
+
path_home = aes2_snork_walk3
path_home = path1<br>
+
path_look = aes2_snork_look3
home_min_radius = 10<br>
+
home_min_radius  = 10
home_max_radius = 30<br>
+
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 радиуса, иначе прячутся в укрытия. Отсюда следует, что home_min -радиус желательно делать таким, чтобы внитри было достаточно каверов. В айдле тоже обычно расходятся по каверам. Home_max радиус сделан по принципу большого рестриктера в схеме «гнездо».<br>
+
Монстры держатся вокруг точек пути path_home. В атаке бросаются на врага, если враг внутри '''''home_min''''' радиуса, иначе прячутся в укрытия. Отсюда следует, что '''''home_min_radius''''' желательно делать таким, чтобы внутри было достаточно каверов. В айдле тоже обычно расходятся по каверам. '''''home_max_radius''''' сделан по принципу большого рестриктера в схеме '''''mob_camp'''''.<br>
  
Добавлена возможность задания минимального и максимального радиусов для схемы mob_home в флагах первой точки пути (path_home). Для этого введены флаги minr и maxr. В случае, если радиусы заданы и в секции и во флагах, то значение радиуса берется из секции. Если не задано ни там, ни там, то берутся дефолтные значения 20 и 40 соответственно.<br>
+
'''''Примечание''''': добавлена возможность задания минимального и максимального радиусов для схемы '''''mob_home''''' в флагах первой точки пути ('''''path_home'''''). Для этого введены флаги '''''minr''''' и '''''maxr'''''. В случае, если радиусы заданы и в секции и во флагах, то значение радиуса берется из '''''секции'''''. Если не задано ни там, ни там, то берутся дефолтные значения.<br>
  
==3.5.9. Mob_fake_death==
+
'''''Пример использования схемы''''':<ini>[mob_home@gar_boars_nest]
 +
path_home = home
 +
home_min_radius = 25
 +
home_max_radius = 50
 +
aggressive_home</ini>
  
Появилась схема mob_fake_death для зомби. Необходимо для сценок, когда игрок идёт, а вокруг него начинают подниматься зомби...<br>
+
Файл: ''gamedata\scripts\mob_home.script''
Использование:<br>
+
  
[logic]<br>
+
==Схема mob_fake_death==
active = mob_fake_death<br>
+
  
[mob_fake_death]<br>
+
Появилась схема '''''mob_fake_death''''' для зомби. Необходимо для сценок, когда игрок идёт, а вокруг него начинают подниматься зомби.<br>
on_actor_dist_le = 5 | nil<br>
+
 
 +
'''[mob_fake_death]'''<br>
  
 
При входе в схему зомби падает, при выходе из схемы встает.<br>
 
При входе в схему зомби падает, при выходе из схемы встает.<br>
  
==3.6. Оверрайды для монстров:==
+
'''''Пример использования схемы''''':<ini>[mob_fake_death]
actor_friendly = если true, то монстр не атакует актера, до первой атаки на него<br>
+
on_actor_dist_le = 5 | nil</ini>
npc_friendly = если true, то монстр не атакует сталкеров и монстров, до первой атаки на него<br>
+
friendly = если true, то монстр не атакует никого до первой атаки на него<br>
+
braindead = если true, то монстр игнорирует любые атаки.<br>
+
  
Секции для монстров<br>
+
Файл: ''gamedata\scripts\mob_fake_death.script''
[mob_death], [mob_hit]<br>
+
  
==3.7. Секция spawner==
+
=Секции для монстров=
Эта секция, которая присутствует как у NPC, так и у монстров, спавнит их по определенному условию (выводит в онлайн). Для того, чтобы они появились в данной точке, им надо поставить в настройках в Level editor флажок no_move_in_offline и отключен can_switch_offline. Спавнер прописывается в кастом дату объекта перед секцией logic<br>
+
Работает spawner следующим образом:<br>
+
  
[spawner]<br>
+
==Секция mob_combat==
cond = {+info -info =func  !func}<br>
+
Секция работает аналогично схеме '''''combat''''' для NPC.<br>
  
Примечание. Если условия спавна не будет выполняться, то объект не заспавниться, а если он заспавнился и условие перестает выполняться, то объект будет спавнером уведен в оффалйн.<br>
+
'''''on_combat = mob_combat'''''<br>
Пример: <br>
+
[spawner]<br>
+
cond = {=is_day}<br>
+
(объект заспавниться днем и уйдет в оффлайн ночью)<br>
+
  
После того, как объект заспавнился, его берет под управление скрипт Logic<br>
+
'''[mob_combat]'''<br>
 +
'''''on_info = {+info -info =func !func ~number}%+info -info =func%''''' - эффекты, которые вызываются когда монстр уходит в бой. Вызываются при каждом апдейте.<br>
  
==3.7.1. Спавн монстров дневных и ночных.==
+
'''''Пример использования секции''''':<ini>[logic@val_sos_bs]
[spawner]<br>
+
...
cond = {=is_day} – спавнить монстра только днем (если надо ночью, то пишем {!is_day})<br>
+
on_combat = mob_combat
check_distance = true – проверка на наличие персонажа рядом.<br>
+
min_distance = 100 – если игрок ближе указанной дистанции, то монстр не заспавниться (по дефолту 150 метров, но на самом деле это много).
+
  
==3.8. Скрипт logic==
+
[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
  
NB: если хотите заспавнить у npc что-то из вещей из custom data, то описание того, как это делается находится в Общей части в настройке профилей персонажей (только тег supplies писать не надо!)<br>
+
[mob_death@gar_boars_rush]
 +
on_info = {=killed_by_actor} %=inc_counter(gar_boars_counter)%</ini>
  
Скрипт logic управляет переключением схем. <br>
+
Файл: ''gamedata\scripts\mob_death.script''
В customdata любого персонажа (кроме свободных) должна присутствовать секция [logic]. <br>
+
  
Функции, на которые ссылается секция [logic] должны находится в файлах \gamedata\scripts\xr_effects.script или \gamedata\scripts\xr_conditions.script.<br>
+
=Оверрайды для монстров=
 +
'''''actor_friendly = true/false''''' - если '''''true''''', то монстр не атакует актера, до первой атаки на него.<br>
 +
'''''npc_friendly = true/false''''' - если '''''true''''', то монстр не атакует сталкеров и монстров, до первой атаки на него.<br>
 +
'''''friendly = true/false''''' - если '''''true''''', то монстр не атакует никого до первой атаки на него.<br>
 +
'''''braindead = true/false''''' - если '''''true''''', то монстр игнорирует любые атаки.<br>
  
В секции должно присутствовать одно из полей: <br>
+
=Общая секция spawner=
active = активная схема, запускающаяся первой.<br>
+
Эта секция, которая присутствует как у NPC, так и у монстров, спавнит их по определенному условию (выводит в онлайн). Для того, чтобы они появились в данной точке, им надо поставить в настройках в ''Level editor'' флажок '''''no_move_in_offline''''' и отключен '''''can_switch_offline'''''. Спавнер прописывается в '''''custom_data''''' объекта перед секцией '''''logic'''''.<br>
cfg = имя_ltx_файла_с_настройками<br>
+
  
Если задано поле cfg, то в качестве настроек персонажа будет использовано содержимое указанного файла. <br>
+
'''[spawner]'''<br>
Пример. Настройки простого walker-а: <br>
+
'''''cond = {+info -info =func !func ~number}''''' - условия для спавна.<br>
  
[logic]<br>
+
Если условия спавна не будет выполняться, то объект не заспавниться, а если он заспавнился и условие перестает выполняться, то объект будет спавнером уведен в оффалйн.<br>
active = walker<br>
+
  
[walker]<br>
+
После того, как объект заспавнился, его берет под управление скрипт '''''Logic'''''.<br>
path_walk = walk1<br>
+
path_look = look1<br>
+
  
Переключение схем выполняется с помощью дополнительных условий схемы logic, которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения: <br>
+
'''''Пример использования секции''''':<ini>[spawner]
Список доступных схем перечислен в главе схемы.<br>
+
cond = {+esc_boar_dogs_restrictor}</ini>
Примечание: если logic переключает между несколькими одноименными схемами (например несколькими walker), то их можно нумеровать (walker1, walker2) или через @ давать более информативные названия walker@day, walker@alarm и т.д.<br>
+
  
on_actor_dist_le = number | scheme - дистанция до игрока <= number<br>
+
Файл: ''gamedata\scripts\xr_spawner.script''
on_actor_dist_le_nvis = number | scheme - дистанция до игрока <= number без проверки на видимость<br>
+
on_actor_dist_ge = number | scheme - если дистанция до игрока > number<br>
+
on_actor_dist_ge_nvis = number | scheme - если дистанция до игрока > number без проверки на видимость<br>
+
on_signal = signal | scheme - срабатывает по приходу сигнала signal от текущей активной схемы<br>
+
on_info = scheme - срабатывает всегда<br>
+
on_timer = msec | scheme - срабатывает через msec мс после включения схемы<br>
+
on_game_timer = sec| scheme – срабатывает через sec секунд игрового времени, после включения схемы<br>
+
on_actor_in_zone = restrictor_name | scheme – если актер в зоне, (указывается имя рестриктора)<br>
+
on_actor_not_in_zone = restrictor_name | scheme – если актер не в зоне, (указывается имя рестриктора)<br>
+
on_npc_in_zone = npc_story_id | restrictor_name | scheme – если NPC в зоне, указывается story_id NPC, и имя рестриктора<br>
+
on_npc_not_in_zone = npc_story_id | restrictor_name | scheme - если NPC не в зоне, указывается story_id NPC, и имя рестриктора<br>
+
on_actor_inside = scheme - зона проверяет, находится ли игрок внутри нее<br>
+
on_actor_outside = scheme - зона проверяет, находится ли игрок за ее пределами<br>
+
  
NB: с любыми из вышеперечисленных параметров можно работать следующим образом:<br>
+
==Спавн монстров дневных и ночных==
on_info = {….} %...%<br>
+
'''[spawner]'''<br>
on_info2 = {….} %...%<br>
+
'''''cond = {=is_day}''''' – спавнить монстра только днем (если надо ночью, то пишем {!is_day})<br>
on_info3 = {…} %...%<br>
+
'''''check_distance = true''''' – проверка на наличие персонажа рядом.<br>
и так далее до посинения<br>
+
'''''min_distance = 100''''' – если игрок ближе указанной дистанции, то монстр не заспавниться (по дефолту 150 метров, но на самом деле это много).
  
 +
----
  
а также условия для переключения на описанные выше секции.<br>
 
combat_ignore_cond = <br>
 
on_hit = <br>
 
on_death = <br>
 
on_combat = <br>
 
on_use =<br>
 
  
===[[Часть 3]]===
+
<font size = 5>[[Часть 3]]</font>
  
 
[[Категория:A-Life]][[Категория:Скрипты]]
 
[[Категория:A-Life]][[Категория:Скрипты]]

Текущая версия на 16:56, 2 апреля 2015

Содержание

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

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

[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

Отметки на минимапе

Появилась возможность не показывать сталкеров на минимапе и на карте (прятать жёлтые и красные точки). Для этого в секции логики или в текущей схеме указываем параметр 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 должно быть равным.

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

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