Сповіщення
Очистити все

Налаштування логіки. Частина 2


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
7 місяців тому
 

Секції.

Секція 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 метрів, але насправді це багато).


   
Цитата
Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
7 місяців тому

   
ВідповіcтиЦитата