Секції.
Секція 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 – це 20 2 . Ми пишемо квадрат потрібної нам відстані для економії системних ресурсів.
Ще один приклад. Сталкер ходить під симуляцією, але в нього бій не движковий, а завжди зомбований:
[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 - Про те, як духманам з контролером боротися;
- story_06 - Про дверцята, горілку та хатинку;
- 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 - вільні сталкери можуть найматися як компаньйони. Оверрайд існує, але не використовується через недороблену схему 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 має бути рівним.
PS 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 метрів, але насправді це багато).
ПЕРЕЛІК НАЛАШТУВАННЯ ЛОГІКИ ПО ЧАСТИНАМ:
Частина 0: https://stalker-news.info/forum/kvesty-ta-lohika-tch/nalashtuvannia-lohiky-chastyna-0/
Частина 1: https://stalker-news.info/forum/kvesty-ta-lohika-pp/nalashtuvannia-lohiky-chastyna-1/
Частина 2: https://stalker-news.info/forum/kvesty-ta-lohika-pp/nalashtuvannia-lohiky-chastyna-2/
Частина 3: https://stalker-news.info/forum/kvesty-ta-lohika-pp/nalashtuvannia-lohiky-chastyna-3/
Частина 4: https://stalker-news.info/forum/kvesty-ta-lohika-pp/nalashtuvannia-lohiky-chastyna-4/