Передісторія
При створенні свого мода я виявив що якщо в Бармена стріляти, або якщо монстр чіпатиме його, то через деякий час відбувається виліт без лога. Перевірено на патчі 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'ів, якщо треба, щоб у трупі Бармена щось з'явилося після смерті.