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

Виправлення виліта при стрільбі в Бармена


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

Передісторія

При створенні свого мода я виявив що якщо в Бармена стріляти, або якщо монстр чіпатиме його, то через деякий час відбувається виліт без лога. Перевірено на патчі 1.004, який дуже популярний у модобудівників. Досить довге ковтання результатів не дало, тому довелося проблему вирішувати самому. Самі розумієте, що вильоти без ліг - річ взагалі важковиправна, і на рішення у мене пішло досить багато часу. Тому, щоб решті мододелів, якщо вони зіткнуться з цією проблемою, не винаходити велосипед заново, я хочу описати рішення тут.

 

Причина вильоту

Виліт відбувається при перемиканні Бармена з режиму ведення бою у звичайний, точніше не в самий момент, а в момент закінчення анімації, коли він ховає зброю за спину.

 

Рішення

Найбільш простим рішенням було відключити взагалі будь-яку реакцію на бойові подразники. В принципі, як і Сидоровичу, йому ця реакція ні до чого - він все одно безсмертний. Тому відкриваємо файл gamegata \ config \ scripts \ bar_barman.ltx і в його вміст додаємо рядки, які в лістингу нижче зазначені коментарем ;додаємо рядок .

[logic]
active = walker@at_hole
combat_ignore = combat_ignore
trade = misc\trade_barman.ltx
inv_max_weight = 10000
 
[walker@at_hole]
path_walk = bar_barman_hole_walk
path_look = bar_barman_hole_look
def_state_standing = barman_wait_free
def_state_moving1 = barman_walk_free
def_state_moving2 = barman_walk_free
def_state_moving3 = barman_walk_free
combat_ignore_cond = always ; добавляем строку
meet = meet@at_hole
danger = danger_condition@barman
on_info = {=actor_in_zone(bar_barman_meet_zone_1)} walker@zone_1, {=actor_in_zone(bar_barman_meet_zone_2)} walker@zone_2,
{=actor_in_zone(bar_barman_meet_zone_3)} walker@zone_3, walker@at_hole
 
[walker@zone_1]
path_walk = barman_zone_1_walk
path_look = barman_zone_1_look
def_state_standing = barman_wait_free
def_state_moving1 = barman_walk_free
def_state_moving2 = barman_walk_free
def_state_moving3 = barman_walk_free
combat_ignore_cond = always ; добавляем строку
meet = meet@at_hole
danger = danger_condition@barman
on_info = {=actor_in_zone(bar_barman_meet_zone_1)} walker@zone_1, {=actor_in_zone(bar_barman_meet_zone_2)} walker@zone_2,
{=actor_in_zone(bar_barman_meet_zone_3)} walker@zone_3, walker@at_hole
 
[walker@zone_2]
path_walk = barman_zone_2_walk
path_look = barman_zone_2_look
def_state_standing = barman_wait_free
def_state_moving1 = barman_walk_free
def_state_moving2 = barman_walk_free
def_state_moving3 = barman_walk_free
combat_ignore_cond = always ; добавляем строку
meet = meet@at_hole
danger = danger_condition@barman
on_info = {=actor_in_zone(bar_barman_meet_zone_1)} walker@zone_1, {=actor_in_zone(bar_barman_meet_zone_2)} walker@zone_2,
{=actor_in_zone(bar_barman_meet_zone_3)} walker@zone_3, walker@at_hole
 
[walker@zone_3]
path_walk = barman_zone_3_walk
path_look = barman_zone_3_look
def_state_standing = barman_wait_free
def_state_moving1 = barman_walk_free
def_state_moving2 = barman_walk_free
def_state_moving3 = barman_walk_free
combat_ignore_cond = always ; добавляем строку
meet = meet@at_hole
danger = danger_condition@barman
on_info = {=actor_in_zone(bar_barman_meet_zone_1)} walker@zone_1, {=actor_in_zone(bar_barman_meet_zone_2)} walker@zone_2,
{=actor_in_zone(bar_barman_meet_zone_3)} walker@zone_3, walker@at_hole
 
[meet@at_hole]
meet_state = 2|barman_talk_free@bar_bar_barmen_hello
meet_state_wpn = 2|barman_talk_free@bar_bar_barmen_hello
danger = danger_condition@barman
victim = 2|actor
victim_wpn = 2|actor
use = true
use_wpn = true
meet_dialog = bar_bar_barmen_start
combat_ignore_cond = always ; добавляем строку
 
[danger_condition@barman]
ignore_distance = 0
 
[combat_ignore]
combat_ignore_cond = always

Доповнення

При вбивстві Бармена виліт може відбуватися і з іншої причини. Секція торговців [trader] не прописана в менеджері спавна предметів на трупах NPC.

Для усунення цього нам знадобляться файли:

  • gamedata\scripts\death_manager.script
  • gamedata\config\misc\death_items_by_communities.ltx

У першому функцію init_drop_settings() , в таблицю local community_list додаємо секцію "trader" .

Виглядає це приблизно так:

function init_drop_settings ( ) 
	local community_list = { "trader" , "stalker" , "dolg" , "freedom" , "bandit" , "military" ,
  "zombied" , "ecolog" , "killer" , "monolith" , "arena_enemy " , "actor_dolg"  }

У другому файлі, наприкінці додаємо секцію [trader]:stalker . Тут, після неї, можна не писати нічого, а можна вписати якісь секції item'ів, якщо треба, щоб у трупі Бармена щось з'явилося після смерті.


   
Цитата