Настройка логики. Часть 2 — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(→3.3.12. dont_spawn_loot) |
ColR iT (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
{{Шаблон:Настройка логики}} | {{Шаблон:Настройка логики}} | ||
+ | |||
+ | |||
+ | =Секции.= | ||
+ | ==Секция combat== | ||
+ | Показывает, что происходит, когда NPC срывается в бой.<br> | ||
+ | |||
+ | '''''on_combat = combat'''''<br> | ||
+ | |||
+ | '''[combat]'''<br> | ||
+ | '''''on_info = {+info -info =func !func ~number}%+info -info =func%''''' - эффекты, которые вызываются когда NPC уходит в бой. Вызываются при каждом апдейте.<br> | ||
+ | |||
+ | Для задания различных типов скриптовых боёв для различных ситуаций используется параметр '''''combat_type'''''.<br> | ||
+ | |||
+ | В следующем примере сталкер сражается:<br> | ||
+ | :*по-камперски, если враг - актёр и он дальше Х метров; | ||
+ | :*по-монолитовски, если любой враг дальше Y метров; | ||
+ | :*иначе - движковый бой. | ||
+ | <ini>[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</ini> | ||
+ | |||
+ | Пример такой функции: нам надо чтобы на расстоянии свыше 20 метров npc переходил бы в кемперский комбат.<br> | ||
+ | <lua>function fighting_dist_ge_20(actor, npc) | ||
+ | return db.storage[npc:id()].enemy:position():distance_to ( npc:position() ) >= 400 | ||
+ | end</lua> | ||
+ | '''''Примечание''''': 400 – это 20<sup>2</sup>. Мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.<br> | ||
+ | |||
+ | Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый:<br> | ||
+ | <ini>[logic] | ||
+ | active = nil | ||
+ | on_combat = combat | ||
+ | |||
+ | [combat] | ||
+ | combat_type = zombied</ini> | ||
+ | |||
+ | Если в разных секциях для персонажа требуются разные типы боя или разные условия, то можно воспользоваться оверрайдом '''''combat_type'''''.<br> | ||
+ | '''''Помните(!)''''': оверрайд всегда будет перекрывать настройку в секции '''''combat'''''. Т.е., если у вас логика на три секции и в двух из них нужен камперский комбат, а в третьей - монолитовский, то можно задать так:<br> | ||
+ | <ini>[logic] | ||
+ | active = walker1 | ||
+ | on_combat = combat | ||
+ | |||
+ | [walker1] | ||
+ | ... | ||
+ | [walker2] | ||
+ | ... | ||
+ | [walker3] | ||
+ | ... | ||
+ | combat_type = monolith | ||
+ | |||
+ | [combat] | ||
+ | combat_type = camper</ini> | ||
+ | |||
+ | В файле ''xr_effects.script'' есть функция отключающая секцию '''''combat''''' - '''''disable_combat_handler'''''<br> | ||
+ | |||
+ | Файл: ''gamedata\scripts\xr_combat.script'' | ||
+ | |||
+ | ==Секция death== | ||
+ | Схема показывает, что происходит при смерти NPC.<br> | ||
+ | |||
+ | '''''on_death = death'''''<br> | ||
+ | |||
+ | '''[death]'''<br> | ||
+ | '''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются при смерти NPC.<br> | ||
+ | |||
+ | '''''Пример использования секции''''':<ini>[logic] | ||
+ | ... | ||
+ | on_death = death@mil_freedom_max_combat1 | ||
+ | |||
+ | [death@mil_freedom_max_combat1] | ||
+ | on_info = %=military_max_dead +sar2_death_47%</ini> | ||
+ | |||
+ | Файл: ''gamedata\scripts\xr_death.script'' | ||
+ | |||
+ | ==Cекция hit== | ||
+ | Схема показывает, что происходит при нанесении повреждения NPC.<br> | ||
+ | |||
+ | '''''on_hit = hit'''''<br> | ||
+ | |||
+ | '''[hit]'''<br> | ||
+ | '''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются в случае, если NPC нанесён хит.<br> | ||
+ | |||
+ | '''''on_hit''''' НЕ СРАБАТЫВАЕТ на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как агрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).<br> | ||
+ | |||
+ | '''''Пример использования секции''''':<ini>[logic] | ||
+ | ... | ||
+ | on_hit = on_hit@agr_factory_hold_fake | ||
+ | |||
+ | [on_hit@agr_factory_hold_fake] | ||
+ | on_info = {=hit_by_actor} %+agr_krot_skirmish_start%</ini> | ||
+ | |||
+ | Файл: ''gamedata\scripts\xr_hit.script'' | ||
+ | |||
+ | ==Секция actor_dialogs== | ||
+ | Показывает, какие диалоги будут доступны или недоступны игроку при разговоре с этим NPC. Пишется практически в любой схеме.<br> | ||
+ | |||
+ | '''''actor_dialogs = actor_dialogs'''''<br> | ||
+ | |||
+ | '''[actor_dialogs]'''<br> | ||
+ | '''''id = <название_диалога>''''' - доступные диалоги, перечислять через запятую.<br> | ||
+ | '''''disable = <название_диалога>''''' - запрещенные диалоги, тоже через запятую.<br> | ||
+ | |||
+ | '''''Пример использования секции''''':<ini>[logic] | ||
+ | ... | ||
+ | actor_dialogs = actor_dialogs | ||
+ | |||
+ | [actor_dialbr> | ||
+ | :*'''''story_id''''' – числовое значениеogs] | ||
+ | id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end</ini> | ||
+ | |||
+ | Файл: ''gamedata\scripts\xr_meet.script'' | ||
+ | |||
+ | ==Секция use== | ||
+ | Схема показывает, что произойдет, если игрок попытается взаимодействовать с NPC. | ||
+ | |||
+ | '''''on_use = use'''''<br> | ||
+ | |||
+ | '''[use]'''<br> | ||
+ | '''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются в случае, если игрок попытается взаимодействовать с NPC.<br> | ||
+ | |||
+ | Пример использования секции:<ini>[logic] | ||
+ | ... | ||
+ | on_use = use@mil_dolg_leader | ||
+ | |||
+ | [use@mil_dolg_leader] | ||
+ | on_info = {=gulag_empty(mil_lager)} %+mil_dolg_leader_reward%</ini> | ||
+ | |||
+ | Файл: ''gamedata\scripts\xr_use.script'' | ||
+ | |||
+ | ==Секция combat_ignore== | ||
+ | Если для NPC установлена данная секция то он, не переходит в боевой режим.<br> | ||
+ | Для секции нет дополнительных полей.<br> | ||
+ | |||
+ | '''''combat_ignore = combat_ignore''''' | ||
+ | |||
+ | '''[combat_ignore]''' | ||
+ | |||
+ | В любой другой схеме можно задать оверрайд, который позволит игнорировать бой только по выполнению условия:<br> | ||
+ | |||
+ | '''[walker] '''<br> | ||
+ | '''''combat_ignore_cond = {+info –info =func !func ~number}''''' – условия для игнорирования боя.<br> | ||
+ | |||
+ | Если для оверрайда задать значение '''''always''''', то в данной схеме NPC будет игнорировать бой всегда, пока не перейдет в схему, где бой не игнорируется.<br> | ||
+ | Таким образом, можно задавать игнорирование боя только будучи под определённой схемой, в отличии от секции, которая запрещает бой в любом случае.<br> | ||
+ | |||
+ | В файле ''xr_condition.script'' есть функции, используемые для работы с кондлистом оверрайда:<br> | ||
+ | :*'''''fighting_dist_ge_20''''' - текущий враг на расстоянии больше или равном 20м;<br> | ||
+ | :*'''''fighting_dist_ge''''' – универсальная функция, проверка расстояния для игрока;<br> | ||
+ | :*'''''fighting_actor''''' - текущий враг актёр?;<br> | ||
+ | :*'''''check_fighting''''' - проверка (по '''''story_id''''') того, что нашим врагом есть хотя бы кто-то один из списка.<br> | ||
+ | |||
+ | Пример использования секции:<br> | ||
+ | <ini>[logic] | ||
+ | ... | ||
+ | combat_ignore = combat_ignore | ||
+ | |||
+ | [combat_ignore]</ini> | ||
+ | |||
+ | Файл: ''gamedata\scripts\xr_combat_ignore.script'' | ||
==3.3.7. Секция dont_spawn_character_supplies== | ==3.3.7. Секция dont_spawn_character_supplies== | ||
Строка 97: | Строка 261: | ||
[dont_spawn_loot] | [dont_spawn_loot] | ||
− | = | + | =Оверрайды= |
Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны)<br> | Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны)<br> | ||
*meet_enabled = true (запускает схему встречи) | *meet_enabled = true (запускает схему встречи) | ||
Строка 110: | Строка 274: | ||
*companion_enabled = true (cвободноходящие сталкеры могут наниматься как компаньоны (в будущем они будут брать за это деньги)). | *companion_enabled = true (cвободноходящие сталкеры могут наниматься как компаньоны (в будущем они будут брать за это деньги)). | ||
− | = | + | =Схемы для монстров= |
==3.5.1. Схема mob_walker.== | ==3.5.1. Схема mob_walker.== |
Версия 14:55, 1 мая 2012
Содержание |
---|
Настройка логики. Часть 0 |
Содержание
- 1 Секции.
- 1.1 Секция combat
- 1.2 Секция death
- 1.3 Cекция hit
- 1.4 Секция actor_dialogs
- 1.5 Секция use
- 1.6 Секция combat_ignore
- 1.7 3.3.7. Секция dont_spawn_character_supplies
- 1.8 3.3.8. Секция no_smart
- 1.9 3.3.9. Секция treshhold
- 1.10 3.3.10. Danger
- 1.11 3.3.11. Байки из склепа (Истории у костра)
- 1.12 3.3.12. dont_spawn_loot
- 2 Оверрайды
- 3 Схемы для монстров
- 3.1 3.5.1. Схема mob_walker.
- 3.2 3.5.2. Схема mob_eluder
- 3.3 3.5.3. Схема mob_remark
- 3.4 3.5.4. Схема mob_combat, mob_death
- 3.5 3.5.6 Схема mob_jump (монстр-пружинка)
- 3.6 3.5.7. Mob_camp
- 3.7 3.5.8. Mob_home
- 3.8 3.5.9. Mob_fake_death
- 3.9 3.6. Оверрайды для монстров:
- 3.10 3.7. Секция spawner
- 3.11 3.7.1. Спавн монстров дневных и ночных.
- 3.12 3.8. Скрипт logic
Секции.
Секция combat
Показывает, что происходит, когда NPC срывается в бой.
on_combat = combat
[combat]
on_info = {+info -info =func !func ~number}%+info -info =func% - эффекты, которые вызываются когда NPC уходит в бой. Вызываются при каждом апдейте.
Для задания различных типов скриптовых боёв для различных ситуаций используется параметр combat_type.
В следующем примере сталкер сражается:
- по-камперски, если враг - актёр и он дальше Х метров;
- по-монолитовски, если любой враг дальше Y метров;
- иначе - движковый бой.
[logic] active = walker on_combat = combat [walker] path_walk = ... [combat] combat_type = {=fighting_actor =fighting_ge_X_meters} camper, <br>{=fighting_ge_Y_meters} monolith
Пример такой функции: нам надо чтобы на расстоянии свыше 20 метров npc переходил бы в кемперский комбат.
function fighting_dist_ge_20(actor, npc) return db.storage[npc:id()].enemy:position():distance_to ( npc:position() ) >= 400 end
Примечание: 400 – это 202. Мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.
Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый:
[logic] active = nil on_combat = combat [combat] combat_type = zombied
Если в разных секциях для персонажа требуются разные типы боя или разные условия, то можно воспользоваться оверрайдом combat_type.
Помните(!): оверрайд всегда будет перекрывать настройку в секции combat. Т.е., если у вас логика на три секции и в двух из них нужен камперский комбат, а в третьей - монолитовский, то можно задать так:
[logic] active = walker1 on_combat = combat [walker1] ... [walker2] ... [walker3] ... combat_type = monolith [combat] combat_type = camper
В файле xr_effects.script есть функция отключающая секцию combat - disable_combat_handler
Файл: gamedata\scripts\xr_combat.script
Секция death
Схема показывает, что происходит при смерти NPC.
on_death = death
[death]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются при смерти NPC.
[logic] ... on_death = death@mil_freedom_max_combat1 [death@mil_freedom_max_combat1] on_info = %=military_max_dead +sar2_death_47%
Файл: gamedata\scripts\xr_death.script
Cекция hit
Схема показывает, что происходит при нанесении повреждения NPC.
on_hit = hit
[hit]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются в случае, если NPC нанесён хит.
on_hit НЕ СРАБАТЫВАЕТ на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как агрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).
[logic] ... on_hit = on_hit@agr_factory_hold_fake [on_hit@agr_factory_hold_fake] on_info = {=hit_by_actor} %+agr_krot_skirmish_start%
Файл: gamedata\scripts\xr_hit.script
Секция actor_dialogs
Показывает, какие диалоги будут доступны или недоступны игроку при разговоре с этим NPC. Пишется практически в любой схеме.
actor_dialogs = actor_dialogs
[actor_dialogs]
id = <название_диалога> - доступные диалоги, перечислять через запятую.
disable = <название_диалога> - запрещенные диалоги, тоже через запятую.
[logic] ... actor_dialogs = actor_dialogs [actor_dialbr> :*'''''story_id''''' – числовое значениеogs] id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end
Файл: gamedata\scripts\xr_meet.script
Секция use
Схема показывает, что произойдет, если игрок попытается взаимодействовать с NPC.
on_use = use
[use]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются в случае, если игрок попытается взаимодействовать с NPC.
[logic] ... on_use = use@mil_dolg_leader [use@mil_dolg_leader] on_info = {=gulag_empty(mil_lager)} %+mil_dolg_leader_reward%
Файл: gamedata\scripts\xr_use.script
Секция combat_ignore
Если для NPC установлена данная секция то он, не переходит в боевой режим.
Для секции нет дополнительных полей.
combat_ignore = combat_ignore
[combat_ignore]
В любой другой схеме можно задать оверрайд, который позволит игнорировать бой только по выполнению условия:
[walker]
combat_ignore_cond = {+info –info =func !func ~number} – условия для игнорирования боя.
Если для оверрайда задать значение always, то в данной схеме NPC будет игнорировать бой всегда, пока не перейдет в схему, где бой не игнорируется.
Таким образом, можно задавать игнорирование боя только будучи под определённой схемой, в отличии от секции, которая запрещает бой в любом случае.
В файле xr_condition.script есть функции, используемые для работы с кондлистом оверрайда:
- fighting_dist_ge_20 - текущий враг на расстоянии больше или равном 20м;
- fighting_dist_ge – универсальная функция, проверка расстояния для игрока;
- fighting_actor - текущий враг актёр?;
- check_fighting - проверка (по story_id) того, что нашим врагом есть хотя бы кто-то один из списка.
- fighting_dist_ge_20 - текущий враг на расстоянии больше или равном 20м;
Пример использования секции:
[logic] ... combat_ignore = combat_ignore [combat_ignore]
Файл: gamedata\scripts\xr_combat_ignore.script
3.3.7. Секция dont_spawn_character_supplies
Если прописать эту секцию в кастом дату персонажу, то у него внутри не заспавниться стандартный набор барахла, прописанный в профиле.
[dont_spawn_character_supplies]
3.3.8. Секция no_smart
Если прописана эта секция, то npc не берется под смарттеррейн даже если он походит по всем параметрам. [no_smart]
3.3.9. Секция treshhold
Есть возможность изменять у сталкеров параметры, по которым они атакуют монстров. Этих параметра два:
max_ignore_distance (в данный момент дефолт 15 метров). Сталкер будет всегда атаковать монстров, которые находятся внутри данного радиуса.
ignore_monster (в данный момент дефолт 0). Параметр от 0 до 1. Если функция оценки монстра ниже, чем этот параметр, и монстр находится за пределами вышеуказанного радиуса - он будет атакован. В данный момент все настроено так, что сталкеры вообще не атакуют монстров находящихся дальше чем 15 метров от них.
В секции логики либо в текущей схеме указываете:
threshold = threshold@tratata
[threshold@tratata]
max_ignore_distance = <number>
ignore_monster = <number>
Второй параметр следует менять ОЧЕНЬ осторожно. Помните, в него нужно вписывать значение от 0 до 1!
3.3.10. Danger
Настройка может задаваться только в какой-то схеме, например:
[walker]
danger = danger_condition
[danger_condition]
ignore_distance = 50 (расстояние указывается в метрах)
ignore_ distance_grenade =
ignore_ distance_corpse =
ignore_ distance_hit =
ignore_ distance_sound =
Можно также указывать время ожидания для денжера в зависимости от типа:
danger_inertion_time_grenade =
danger_inertion_time_corpse =
danger_inertion_time_hit =
danger_inertion_time_sound =
Дефолтовые настройки:
danger_inertion_time_grenade = 20000
danger_inertion_time_corpse = 10000
danger_inertion_time_hit = 60000
danger_inertion_time_sound = 15000
NB!!Также эти настройки теперь распространяются и на схему кемпера. То есть в настройках кемпера перестало работать поле danger_radius. Теперь данные берутся из секции денжера согласно общих правил.
Алгоритм работы такой: Сперва проверяется, что расстояние до опасности не отсекается по ignore_danger. Если опасность ближе, то тогда анализируется ее тип, и проверяется по соотвествующему данному типу расстоянию. Если опасность ближе - тогда разрешается реакция на нее.
В данный момент установлены следующие дефолты:
ignore_distance = 50
ignore_distance_grenade = 15
ignore_distance_corpse = 10
ignore_distance_hit = 50
ignore_distance_sound = 50
NB: если надо, чтобы в разных случаях сталкер игнорировал разные типы данжеров, создается несколько секций данжера danger_condition@1, danger_condition@2 и так далее.
- danger_expiration_time = Через сколько времени денжер перестанет быть акутальным. Дефолт 5000 мс.
- danger_inertion_time = Через сколько времени персонаж забудет про денжер, на который он отреагировал. Дефолт 10000 мс.
3.3.11. Байки из склепа (Истории у костра)
Из нового: теперь лагеря автоматически рассказывать истории не будут. Для этого вы должны того или иного сталкера "научить" истории. Делается это так: в кастом дате пишется секция:
[game_info]
stories = "story_01, legend_01"
В кавычках список историй и легенд через запятую. Пока что существуют следующие истории и легенды:
story_01 - Граница зоны и граната за 1 действие.
story_02 - Про трамплин и про камешки
story_03 - Про то как группа Вильнова вернулась
story_04 - Про то как Костя Федорин наткнулся на артефакт и пропал на радаре.
story_05 - Про то как духманам с контролером стражаться.
story_06 - Про дверцу, водку и избушку.
legend_01 - Про эксперимент в Зоне, который производят инопланетяне.
legend_02 - Об особо засекреченных лабораториях в зоне.
legend_03 - Легенда о проводнике
legend_04 - Легенда о темном сталкере
legend_05 - Легенда о том что глубоко в Зоне спать нельзя.
О том какие истории и легеды в каком лагере на каком уровня можно и нельзя юзать узнавать у Профа.
3.3.12. dont_spawn_loot
Всякого рода сюжетные персонажи которые должны быть пустыми после смерти (например раненные или пленные) оказываются не пустыми. Чтобы это исправить необходимо в кастом дате персонажа прописать секцию [dont_spawn_loot]
Оверрайды
Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны)
- meet_enabled = true (запускает схему встречи)
- meet_talk_enabled = true (в действующую схему поведения добавляет возможность диалога)
- meet_dialog = <название диалога>, который будет запущен при юзе.
- meet_state = <название состояния> он определяет, в каком состоянии будет находиться персонаж, если открылось диалоговое окно общения и торговли
- wounded_enabled = true (включает NPC возможность использовать схему раненого)
- combat_ignore_cond = см. выше
- combat_ignore_keep_when_attacked = true (игрок продолжает игнорировать бой, даже если в него стреляют – ТОЛЬКО В СЛУЧАЕ СТРЕЛЬБЫ ИГРОКА!!!!)
- combat_type = {условие} scheme - тип боя которым будет пользоваться npc из данной схемы
- on_combat = см. выше
- companion_enabled = true (cвободноходящие сталкеры могут наниматься как компаньоны (в будущем они будут брать за это деньги)).
Схемы для монстров
3.5.1. Схема mob_walker.
Работает аналогично схеме обычного walker. Но есть некоторые отличия
Флаги пути движения
s=звуковая_схема (idle, eat, attack, attack_hit, take_damage, die, threaten, steal, panic, growling) с - идти дальше в присяде r - дальше бежать sig=signal_name - установить заданный сигнал для xr_logic
Флаги пути обзора:
t=время_мсек - время в миллисекундах, которое нужно ждать, смотря в точку a=anim_set - анимация (stand_idle, sit_idle, lie_idle, eat, sleep, rest, attack, look_around, turn)
В customdata персонажа задайте (* отмечены обязательные поля):
[walker]
path_walk = путь перемещения
path_look = путь обзора
- no_reset = true/false - не сбрасывать action предыдущей схемы (если нужно сохранить, например, звук). По умолчанию false.
- actor_friendly = true/false - монстр никогда первым не нападает на игрока, но если игрок хоть раз атакует монстра - этот режим навсегда отключится. По умолчанию false.
- npc_friendly = true/false - монстр никогда первым не нападет на другого монстра (даже враждебного).
- friendly = true/false - монстр не нападает ни на игрока, ни на монстров. В случае агрессии с их стороны, не запоминает их как врагов и остается дружественным ко всем. По умолчанию false.
Файл: \gamedata\scripts\mob_walker.script
У кровосососов можно управлять невидимостью:
[mob_walker]
...
state = vis
или
state = invis
Задает значение по умолчанию.
Также в флагах walk пути mob_walker-а можно использовать флажок b
(behaviour) с теми же параметрами:
wp00|b=vis
wp00|b=invis
3.5.2. Схема mob_eluder
Монстр перемещается по точкам патрульного пути (не учитывая связи между точками), держась на расстоянии от игрока, при этом придерживаясь своего пути, выходя из под схемы при слишком близком приближении к игроку, и возвращаясь обратно, когда расстояние увеличиться.
path = … работает как обычно path_walk. Набор точек патрульного пути.
- Time_capture = …. (время в секундах) время, которое монстр находится под этой схемой. Default – 10.
- Time_release = …. (время в секундах) время, которое монстр находится под универсальной схемой. Default – 10.
- Min_dist = …. (расстояние в метрах, если расстояние до врага меньше этого, то он переходит под универсальную схему). Default – 5.
- Max_dist = …. (расстояние в метрах, если расстояние до врага больше этого, то он переходит под eluder). Default - 10
Замечание – работает нестабильно.
Файл: \gamedata\scripts\mob_eluder.script
3.5.3. Схема mob_remark
Ремарковая схема, только не для сталкеров, а для монстров.
- state = специфическое состояние данного конкретного монстра (для кровососов - невидимость)
- dialog_cond = {+info, =func, -info, !func} условия для открытия окна диалога
- anim = анимации монстра, перечисляются через запятую.
- anim.head = анимации головы монстра, через запятую перечисляются
- tip = какой значок подсветится, при наведении на него курсора
- snd = какой звук издает
- time = время проигрывания анимаций, используется только для отладки.
Файл \gamedata\scripts\mob_remark.script На этой схеме сделан торговец.
3.5.4. Схема mob_combat, mob_death
Работают точно также как и у сталкеров соответствующие схемы. Файлы: \gamedata\scripts\mob_combat.script, \gamedata\scripts\mob_death.script
3.5.6 Схема mob_jump (монстр-пружинка)
Схема mob_jump. Теперь mob_jump служит для задания прыжков монстров без каких либо проверок и ограничений (расстояние, углы и т.д.). Указывается позиция с помощью патрульного пути, смещение относительно этой позиции и физический фактор прыжка.
Пример:
[logic]
active = mob_jump
[mob_jump]
path_jump = path
ph_jump_factor =2.8
offset = 0,10,0
on_signal = jumped | nil
path_jump – путь, с помощью которого мы задаем 1 целевую точку прыжка (с нулевым индексом). Реальная точка учитывает позицию path_jump[0] + смещение, заданное с помощью offset.
offset – смещение по осям x,y,z соответственно, с помощью которого задается реальная точка в пространстве (может не находится на аи-ноде).
ph_jump_factor - влияет на время прыжка. Визуально с помощью него задается кривизна траектории полёта. Чем он больше, тем прыжок более острый, быстрый (меньше дуга). С помощью данной схемы можно делать: перепрыгивание со здания на здание, выпрыгивание из окна, перепрыгивание высоких ограждений и др. Дефолтное значение = 1,8
Примечание:
Фактически mob_jump - это не состояние, а разовое действие. При переходе в него монстр разворачивается в сторону прыжка и прыгает, поднимая сигнал jumped. Т.е. "on_signal = jumped | имя_схемы_или_nil" – является обязательным параметром в схеме, чтобы знать куда переходить дальше.
При выборе позиции используется первая точка патрульного пути (0-вой индекс)
3.5.7. Mob_camp
Механика:
1. Сидит на позиции, смотрит в точку 2. Можно задать несколько позиций и время смены позиции. 3. Перемещается между позициями бегом 4. При виде врага переходит под универсальную схему (комбат/паника и т.д) 5. Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции 6. Если враг уходит далеко - монстр возвращается на позицию
Использование:
[logic]
active = mob_camp
[mob_camp]
path_look = way_look
path_home = way_home
time_change_point = 30000
home_min_radius = 20
home_max_radius = 50
skip_transfer_enemy – если прописать в кастом дату, то монстр не будет принимать врага от друших монстров, если его увидит (для этого нужно всех монстров в разные group разнести)
Описание параметров:
- path_home - путь, состоящий из точек, в которых будет находиться монстр
path_look - путь, состоящий из точек, в которые будет смотреть монстр
- time_change_point - время изменения текущей camp-точки (по-умолчанию10000), мс
- home_min_radius - минимальный радиус от врага до camp-точки (по-умолчанию 30), м
- home_max_radius - максимальный радиус от врага до camp-точки (по-умолчанию 40), м
Особенности:
Минимальный и максимальный радиус необходимы для игнорирования врага, если он убежал далеко и для возврата на текущую позицию. Учитывается дистанция от врага до текущей позиции. Если дистанция меньше 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 можно использовать как альтернативу к монстрам под рестрикторами
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 =