Перейти к контенту

Рекомендуемые сообщения

Весь "m stalker" перековырял, не понимаю почему сталки не истекают кровью, падают замертво при последнем выстреле, даже раненые не падают, смысл тогда этого "ai addition" и его лекарей, менял и "bip"ы по костям, не помогает, в SGM 2.2 себе делал, получалось-две пули с калаша по ногам, 3-4 в торс - сразу падают ранеными или идут истекая кровью. Падают они ранеными вообще кто-нибудь наблюдал? Я весь лагерь на кордоне перебил -никто так раненый и не упал(

Формула расчёта стрельбы по НПСам в ТЧ до сих пор НЕИЗВЕСТНА.
Есть лишь приблизительные прикидки. Но как движок считает точно, не знает никто. Поэтому подранить НПСа на 100 %, из определённого оружия даже с одинакового расстояния , даже в одну и ту же кость невозможно.

BFG.

 

Спасибо, у меня вроде всё получилось, я взял данные с мода NLS6+реализм, дописал в "M stalker", "damage", "immunities", заспавнил противников посильнее, падают раненые все как один, истекают кровью, лечат сами себя, но и этот способ тоже попробую)
 

...пуляю ему только в ступни и локти, но он раненый не падает - дохнет гадина (((

Там как я понял определенный порог ранения, если слишком бронебойность большая - ты этот порог перешагиваешь и он дохнет, надо править "damage", кости в "m stalker", вплоть до параметров патронов или оружия( убойность имею ввиду) - это по моим наблюдениям, сейчас тоже этим страдаю)

...

Про раненых здесь: http://www.amk-team.ru/forum/topic/12839-kovyriaem-op-2/?p=849870

И отзыв на эту правку нашел в личке:

Работает на ура. Я ставил в def.hp 99, вместо 10 ради эксперимента, так у меня на центральном комплексе агропрома 16 вояк раненных валялось :), думал игра повиснет от их причитаний одновременных. Ложатся 9мм пулей в любую часть тела, кроме головы.
Ну потом перезагрузился, конечно, и свалил оттуда, def.hp поставил пока 30, понаблюдаю за результатами.

Евген.

Изменено пользователем Eugen81
Ссылка на комментарий

Что надо дописать в строку (файл task_manager.ltx) "reward_item = ammo_7.92x33_ap, ammo_7.62x39_k"

чтобы после завершения ЦЗ давались не только патроны, но и немного денег.

money_loot - "Небольшая пачка наличных денег"

reward_item = ammo_7.92x33_ap, ammo_7.62x39_k, money_loot
Изменено пользователем Eugen81
  • Спасибо 1

AMD Athlon II X2 250, NVIDIA GTS 450, RAM 8.0 GB, WIN 7/64  правки Золотой Шар

Ссылка на комментарий

Чтобы после завершения ЦЗ давались не только патроны, но и немного денег.

В секции нужного задания добавить строку

reward_money = сумма

  • Спасибо 1
  • Полезно 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

Переделал прицельные сетки, ничего не добавлял, просто из ОП 2 адаптировал для ШФ.

 

 

Старыеb309ab159e41effb2c852ab3b9fef21f5e320024

Новые63e8eb984179755d6eb49c5ba52c8a4e5e320024

 

 

http://rghost.ru/7wGsdwR5k

Изменено пользователем Nevada47
  • Нравится 2

«Ну и жесть!» Сказал асфальтовый каток, оглянувшись назад на бывшую "копейку".

Nevada47.gif

Ссылка на комментарий

Добрый день! Уважаемые, можно как-нибудь отключить кряхтение/оханье ГГ при ударах и падениях? Заранее, спасибо!

 

Здесь звуки актора на хиты: http://www.amk-team.ru/forum/topic/12839-kovyriaem-op-2/?p=980221

Звуковой файл-пустышка называется $no_sound. Просто пишешь:

burn = $no_sound

shock = $no_sound

и т.д.

Евген.

Изменено пользователем Eugen81
Ссылка на комментарий
я про микро "фризы"

Выстави в файле alife.ltx параметр

switch_distance = 2000 -- 160 стандарт ОП-2

Микро фризы пропадут, но какие могут возникнуть проблемы - неизвестно. Так как локации грузятся на сразу, а на определенном радиусе (вроде как), где центром является ГГ.

(Кстати, попутный вопрос: можно ли допустим для определенной локации сделать, чтобы switch_distance был тот, на который задал значения, в Баре при значении "2000" фризы пропадают полностью, что есть хорошо)

А от вылетов на 100% не избавиться, так как они есть были и будут, но по сравнению с НС в ОП-2 проделана большая работа над производительностью и устранением вылетов.

Ну насчёт проблем известно:

Будут рушиться многие квесты завязанные на определённый момент появления ГГ. Также, с гораздо большей вероятностью, будут гибнуть важные НПС.

shahvkit

 

Изменено пользователем shahvkit
Ответ
Ссылка на комментарий

Всем привет!
У меня проблема: зомби вообще не стреляют!    Ответов через поиск найти не смог.
Подсказали посмотреть файл game_relations.ltx  Там, вроде, все ок.
[communities_relations]
; |actor|act_dol|act_fre|stalker|monolit|military|killer|ecolog|dolg|freedom|bandit|zombied|stranger|trader |arena_enemy|sniper|green|nebo|lastday|fotoman|vermaht|
zombied  =  -5000,-5000,-5000,-5000,  100, -5000, -5000,   0,  -5000,-5000,-5000, 1000,  50,  0,  -5000, -5000,-5000, -5000, -1500, 0, -5000
Как заставить их стрелять?  Какие файлы надо еще проверить?
Очень прошу помочь.
ОП-2 2.09+ф2 +Аврора +правки (античит, без ограничения обмен запчастей, зрение НПС, кол-во выпадающих патронов, варка 1мин, "умное" выпадение запчастей, хол.оружие, спавн-меню, видимые телепорты, рюкзак не рвется, бег с фотиком/топором, увел. вероятность рождения артов до 20%, без радиации на болотах, отмена вступит-го ролика)
Правил отношения только у Кости, когда тот внезапно стал врагом.

Ты бы мил человек уточнил у тебя зомби ВРАГИ для ГГ и не стреляют или всё-таки они друзья тебе ? Ибо суть есть разные вещи.

BFG.

 

Проверил (смотрел при обыске зомби - справа сверху указывается). Отношение к ГГ - враг. Так они не только в ГГ не стреляют, а вообще ни в кого!

Интересный у вас баг... Такого ни в чистом ОП-2, ни с различными правками пока не было.

Если в game_relations.ltx всё в порядке, тогда можно попробовать метод исключения.

Поочерёдно убирать правки, и смотреть на реакцию зомби.

shahvkit

 


 

Либо нет оружия/патронов, либо противника не видят.

В общем, проблема "мирных" сталков-зомби оказалась именно в параметре видимости. В файле m_stalker_zombied.ltx параметр eye_range был равен 1;10 (именно через точку с запятой, хотя у других он в виде одной цифры). Исправил на 30 (думаю, для тупых созданий - нормально). Начали шмалять. УРА!

Точка с запятой - это знак комментария. Она и все что после нее в строке не читается.

Евген.

Изменено пользователем Eugen81
Ссылка на комментарий

Подскажите в каких файлах находятся нычки гг с барахлом, очень много скопилось всякого на разных локациях, хочу поудалять ненужное, а то глючит и вылетает при попытке сохраниться.
:blink:
Они находятся в файлах сохранений - C:\Users\Public\Documents\STALKER-SHOC\savedgames
shahvkit
 
А чем открыть sav, если можно?
 

Даже не думай. Выкладывай в эту тему сейв и укажи патч, фикс, правки с которыми играешь. Кто-нибудь поможет.

Евген.

Изменено пользователем Eugen81
  • Согласен 1
Ссылка на комментарий

Hi-Tech HUD для ОП-2

За моменты бесконечного прохождения ОП-2 перепробовал все HUD'ы, которые только есть. Вот вам новый, адаптация худа от Мерцающего. Тестировался на 16:9 мониторе, но уверен, что подойдет и для других.

  • Нравится 1
  • Не нравится 2
Ссылка на комментарий

Вопрос не совсем по ОП-2, но так как task_manager под него переписывался...Возможно ли взятие у заказчика ВСЕХ однотипных ЦЗ сразу? Например, у Сидора на убийство вожака бандитов, новичка, торгаша , Отца Диодора, Демона? А вот со временем выполнения и условиями там всё понятно.

Изменено пользователем rza9111
Добавлено BFG,

Не знаю выдержит ли ПДА по количеству заданий, но можно прописать "task`и" хоть ВСЕЙ Солянки на самый первый диалог со Звездочётом. Сразу. На весь сюжет.

Поспешишь - модератора насмешишь

Ссылка на комментарий

Вопрос от Корбан 43

Пытаюсь править наличие и количество аномалий в баре (для варки артов в одном месте, без метания по локам), нашел в amk_anoms.script строку:

 l05_bar={35,45,150,{mosquito_bald=8, mincer=2, zavesa=3, fountain=1, smallrain=4, electra=1, buzz=5, gravi=8, sakbuzz=2, zharka_static=4, sphere=2}}, 

Что означают первые три цифры 35,45,150?

Ответ:

@Корбан 43, первые две цифры - количество аномалий на уровне (пределы рандома), третья не используется.

Изменено пользователем shahvkit
Обьединение и удаление
  • Нравится 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

Всех приветствую. Занимаюсь добавлением оружия, заменой существующих на более красивые и свежие модели, уже заменил порядком 15 моделей-"слямзил" у модеров-оружейников, добавил около 20, новые открытые прицелы, коллиматоры, пара съемных прицелов,  сил хватит "залью", поделюсь, так вот давно хотел спросить- перевооружать сталкеров научился, в продажу ставить тоже, а вот какие файлы отвечают за бартер-понять не могу, к примеру Сидорович-дает за артефакт "Тоз" или "Сайга" и так же остальные торговцы, где прописано всё это дело, уже по всем файлам пробежался-не нашел...спасибо.

sak_dialog.script

function add_saiga(first_speaker, second_speaker) и т.д.

Евген.

 

А как определить кто дает обмен? Имен не указано, точнее не понятно, где указано что дают и что просят.

 

В профилях торгашей ищи ссылки на диалоги.

character_desc_escape.xml

<actor_dialog>trade_dialog_sidor</actor_dialog>
далее поиском по файлам ищи этот диалог (trade_dialog_sidor) :

dialogs_trading.xml

 <dialog id="trade_dialog_sidor">
  <phrase_list>
   <phrase id="0">
                <text>trade_dialog_sidor_0</text>
    <next>1</next>
            </phrase>
....
<precondition>sak_dialog.medusa_have</precondition> -- проверка: имеем ли медузу
                <text>trade_dialog_sidor_221</text>
    <action>sak_dialog.give_medusa</action> -- отдаем медузу
    <action>sak_dialog.add_ammo_12x70_buck3</action> -- получаем дробь

158ed3111bdb9ebc06a1203dd3e773cc.png

 

Прога "редактор диалогов": http://www.amk-team.ru/forum/topic/12814-stalker-plot-manager/?p=839246

 

Евген.

Изменено пользователем Eugen81
Ссылка на комментарий

По amk_anoms.script или что там править:

Самый простой способ уменьшить количество рандомных аномалий, это выставить свои значения в строке:

local anoms_difficulty_koef={
[0]=0.75,
[1]=1.0,
[2]=1.25,
[3]=1.5
}

Например:
[0]=0.1,
[1]=0.3,
[2]=0.75,
[3]=1.0
}

Если решили убрать с определённой локации, то комментим название, (к примеру: -- l05_bar) в game_vertexes, level_vertexes, local level_arts и т.д. 

Просто уменьшить количество аномалий на локе в local level_anoms не прокатит,  будет вылет.

Вот правленый скрипт, с отключенными рандомными аномалиями на всех локациях:

 

-- -*- mode: lua; coding: windows-1251-dos -*-

--[[-------------------------- variable and table --------------------------]]
local table_sort=table.sort
local math_random=math.random
local string_find=string.find
 
local anoms_classes = {
  [ clsid.zone_bfuzz_s   ] = true,
  [ clsid.zone_electra_s ] = true,
  [ clsid.zone_galant_s  ] = true,
  [ clsid.zone_ice_s     ] = true,
  [ clsid.zone_mbald_s   ] = true,
  [ clsid.zone_mincer_s  ] = true,
  [clsid.zone_zharka_s]=true
}
local anoms_difficulty_koef={
[0]=0,
[1]=0,
[2]=0,
[3]=0
}
local anoms_sections={
  buzz={"buzz",{shtype=0,radius=1.0,center={0,0,0}}},
  electra={"witches_galantine",{shtype=0,radius=1,center={0,0,0}}},
  fountain={"fountain",{shtype=0,radius=1.0,center={0,0,0}}},
  gravi={"gravi_zone",{shtype=0,radius=2,center={0,0,0}}},
  mincer={"mincer",{shtype=0,radius=2,center={0,0,0}}},
  mosquito_bald={"mosquito_bald",{shtype=0,radius=2,center={0,0,0}}},
  sakbuzz={"sakbuzz",{shtype=0,radius=0.1,center={0,0,0}}},
  smallrain={"smallrain",{shtype=0,radius=0.1,center={0,0,0}}},
  sphere={"sphere",{shtype=0,radius=2.8,center={0,0,0}}},
  zavesa={"zavesa",{shtype=0,radius=1,center={0,0,0}}},
  zharka_static={"zharka_static",{shtype=1,v1={1,0,0},v2={0,5,0},v3={0,0,1},offset={0,0,0}}}
}
local anti_spawn_zones={}
local arts_sections={
  acumm = "art_acumm",
  balb_1="af_medusa",
  balb_2="af_cristall_flower",
  balb_3="af_night_star",
  buzz_1="af_ameba_slime",
  buzz_2="af_ameba_slug",
  buzz_3="af_ameba_mica",
  dummy_1="af_dummy_spring",
  dummy_2="af_dummy_dummy",
  dummy_3="af_dummy_battery",
  dummy_4="af_dummy_pellicle",
  dummy_5="af_fuzz_kolobok",
  dummy_6="af_dummy_glassbeads",
  electra_1="af_electra_sparkler",
  electra_2="af_electra_flash",
  electra_3="af_electra_moonlight",
  gravi_1="af_vyvert",
  gravi_2="af_gravi",
  gravi_3="af_gold_fish",
  mincer_1="af_blood",
  mincer_2="af_mincer_meat",
  mincer_3="af_soul",
  rusty_1="af_rusty_thorn",
  rusty_2="af_rusty_kristall",
  rusty_3="af_rusty_sea-urchin",
  voron_1="af_eye_voron",
  zharka_1="af_drops",
  zharka_2="af_fireball",
  zharka_3="af_cristall",
 
-- небольшой спавн модификатов
  af_cry_1="af_cry_1",
  af_cry_2="af_cry_2",
  af_cry_3="af_cry_3",
  af_babka_1="af_babka_1",
  af_babka_2="af_babka_2",
  af_babka_3="af_babka_3",
  af_babka_4="af_babka_4",
  af_dik_1="af_dik_1",
  af_dik_2="af_dik_2",
  af_dik_3="af_dik_3",
  af_dik_4="af_dik_4",
  af_spirit_1="af_spirit_1",
  af_spirit_2="af_spirit_2",
  af_spirit_3="af_spirit_3",
  af_spirit_4="af_spirit_4",
  af_armor_1="af_armor_1",
  af_armor_2="af_armor_2",
  af_armor_3="af_armor_3",
  af_armor_4="af_armor_4",
  af_pudd_1="af_pudd_1",
  af_pudd_2="af_pudd_2",
  af_pudd_3="af_pudd_3",
  af_pudd_4="af_pudd_4",
  af_kol_1="af_kol_1",
  af_kol_2="af_kol_2",
  af_kol_3="af_kol_3",
  af_kol_4="af_kol_4",
  af_buliz="af_buliz"
}
 
-- Здесь перечислены все интервалы game_vertex для каждого
-- уровня. Можно не запуская игру смотреть, на каком уровне спавнится
-- объект
game_vertexes = {
--  l01_escape            = {0,251},
--  l02_garbage           = {252,415},
--  l03_agroprom          = {416,702},
--  l03u_agr_underground  = {703,810},
--  l04_darkvalley        = {811,1108},
--  l04u_labx18           = {1109,1167},
--  l05_bar               = {1168,1307},
--  l06_rostok            = {1308,1437},
--  l08_yantar            = {1438,1528},
-- l08u_brainlab         = {1529,1544},
--  l07_military          = {1545,1861},
--  l10_radar             = {1862,2116},
--  l11_pripyat           = {2117,2272},
--  l12_stancia           = {2273,2401},
--  l12u_sarcofag         = {2402,2466},
--  l12u_control_monolith = {2467,2516},
--  l12_stancia_2         = {2517,2660},
--  l10u_bunker           = {2661,2791},
--  atp_for_test22        = {2792,2861},
--  peshera               = {2862,2880},
--  puzir                 = {2881,2885},
--  aver                  = {2886,2908},
--  av_peshera            = {2909,2987},
--  limansk               = {2988,3027},
--  hospital              = {3028,3075},
--  generators            = {3076,3152},
--  warlab                = {3153,3223},
--  red_forest            = {3224,3323},
--  lost_village          = {3324,3336},
--  marsh                 = {3337,3581},
-- dead_city             = {3582,3659},
--  zaton                 = {3660,3699},
--  jupiter               = {3700,3747},
--  pripyat               = {3748,3770},
-- jupiter_underground   = {3771,3829},
--  labx8                 = {3830,3850},
}
 
level_vertexes={
--  l01_escape            =  595499,
-- l02_garbage           =  382663,
--  l03_agroprom          =  437421,
--  l03u_agr_underground  =    4810,
--  l04_darkvalley        =  390125,
--  l04u_labx18           =    7565,
--  l05_bar               =   99539,
--  l06_rostok            =   67713,
--  l07_military          =  418268,
--  l08_yantar            =  141471,
--  l08u_brainlab         =    7724,
--  l10_radar             =  227189,
--  l10u_bunker           =    8723,
--  l11_pripyat           =  261219,
--  l12_stancia           =  477923,
-- l12_stancia_2         =  264576,
--  l12u_control_monolith =    3971,
--  l12u_sarcofag         =   10620,
--  puzir                 =  377572,
--  aver                  = 1790762,
--  marsh                 =  528961,
--  limansk               =   61524,
--  hospital              =    7865,
--  red_forest            =  166431,
--  lost_village          =   49127,
--  generators            =  752337,
--  atp_for_test22        = 1049687,
--  dead_city             =  551769,
--  zaton                 = 1851251,
--  jupiter               = 1486320,
--  pripyat               =  487255,
--  av_peshera            =  172361,
--  peshera               =   32109,
--  warlab                =    7747,
--  jupiter_underground   =   40830,
--  labx8                 =    5799,
}
level_anoms={
--  l01_escape={50,75,400,{electra=12, zavesa=2, smallrain=6, fountain=7, gravi=0, mincer=0, buzz=0, sakbuzz=2, mosquito_bald=0, sphere=4}}, 
--  l02_garbage={50,75,400,{mosquito_bald=12, mincer=2, smallrain=5, zavesa=3, electra=15, gravi=10, buzz=12, sakbuzz=3, sphere=3, fountain=2}}, 
--  l03_agroprom={10,14,100,{mosquito_bald=12, mincer=3, smallrain=4, fountain=2, zavesa=2, electra=0, buzz=12, gravi=10, sakbuzz=3, sphere=3}},
--  l04_darkvalley={11,15,100,{mincer=3, mosquito_bald=12, fountain=2, zavesa=3, smallrain=5, electra=0, buzz=10, zharka_static=8, gravi=8, sakbuzz=5, sphere=4}}, 
--  l05_bar={35,45,150,{mosquito_bald=8, mincer=2, zavesa=3, fountain=1, smallrain=4, electra=1, buzz=5, gravi=8, sakbuzz=2, zharka_static=4, sphere=2}}, 
--  l06_rostok={10,50,300,{mincer=3, mosquito_bald=7, smallrain=2, electra=2, zavesa=2, zharka_static=25, gravi=0, sakbuzz=3, buzz=10, sphere=2, fountain=1}}, 
--  l08_yantar={80,110,400,{mosquito_bald=8, mincer=8, fountain=1, smallrain=4, zavesa=3, electra=2, buzz=8, zharka_static=5, gravi=8, sakbuzz=3, sphere=3}},
--  l07_military={11,15,100,{mincer=4 , mosquito_bald=15, fountain=2, smallrain=4, zavesa=3, electra=12, zharka_static=8, gravi=0, sakbuzz=3, buzz=10, sphere=4}}, 
 -- l10_radar={12,14,100,{mincer=6, mosquito_bald=11, fountain=10, smallrain=6, electra=2, zavesa=3, buzz=10, zharka_static=12, gravi=10, sakbuzz=5, sphere=4}}, 
--  l11_pripyat={11,15,90,{mincer=10, mosquito_bald=10, zavesa=3, fountain=1, smallrain=1, electra=10,  zharka_static=8, gravi=10, buzz=10, sakbuzz=2, sphere=3}}, 
--  l12_stancia={70,90,700,{mincer=2, mosquito_bald=10, smallrain=6, electra=0, fountain=1, zavesa=3, buzz=10, zharka_static=7, gravi=8, sakbuzz=4, sphere=4}},
--  puzir={150,170,450,{mincer=12, mosquito_bald=15, smallrain=6, zavesa=3, electra=14, buzz=12, zharka_static=5, gravi=14, sakbuzz=3, sphere=4, fountain=1}},
--  aver={18,19,75,{mincer=14, mosquito_bald=12, smallrain=5, electra=0, zavesa=4, buzz=15, zharka_static=5, gravi=15, sakbuzz=4, sphere=5, fountain=1}},
--  marsh={10,20,100,{mincer=8, mosquito_bald=12, smallrain=9, electra=0, zavesa=4, buzz=15, zharka_static=5, gravi=15, sakbuzz=4, sphere=5, fountain=1}},
--  limansk={5,6,30,{mosquito_bald=10, mincer=12, smallrain=2, fountain=16, zavesa=2, electra=0, gravi=10, buzz=10, sakbuzz=2, zharka_static=8, sphere=3}},
--  hospital={10,20,100,{mincer=8, mosquito_bald=8, zavesa=2, fountain=1, electra=7, buzz=8, gravi=5, sakbuzz=2, zharka_static=5, sphere=2}},
--  red_forest={11,15,40,{mincer=8, mosquito_bald=10, zavesa=4, fountain=2, smallrain=6, electra=3, zharka_static=8, gravi=10, buzz=10, sakbuzz=4, sphere=5}},
--  lost_village={8,10,25,{mincer=8, mosquito_bald=8, zavesa=3, fountain=1, smallrain=1, electra=10, zharka_static=5, gravi=5, buzz=5, sakbuzz=2, sphere=3}},
--  generators={0,0,0,{mincer=15, mosquito_bald=11, fountain=1, zavesa=5, smallrain=2, electra=15, zharka_static=5, gravi=10, buzz=16, sakbuzz=6, sphere=4}},
--  atp_for_test22={16,18,40,{mincer=13, mosquito_bald=10, fountain=2, smallrain=2, zavesa=4, electra=15, zharka_static=10, gravi=10, buzz=20, sakbuzz=4, sphere=4}},
--  dead_city={11,15,90,{mincer=10, mosquito_bald=10, zavesa=3, fountain=2, smallrain=2, electra=10, zharka_static=8, gravi=10, buzz=10, sakbuzz=1, sphere=4}},
--  zaton={18,19,100,{electra=25, zavesa=6, smallrain=3, fountain=5, gravi=15, mincer=15, buzz=15, sakbuzz=8, mosquito_bald=15, sphere=12, zharka_static=8}},
--  jupiter={18,19,100,{electra=25, zavesa=4, smallrain=3, fountain=4, gravi=20, mincer=15, buzz=25, sakbuzz=5, mosquito_bald=20, sphere=12}},
--  pripyat={14,16,100,{electra=15, zavesa=4, smallrain=1, fountain=3, gravi=18, mincer=15, buzz=15, sakbuzz=4, mosquito_bald=18, sphere=10}}
}
 
local level_arts={
--  l01_escape={2,4,{balb_1=22, balb_2=2, gravi_1=22, gravi_2=5, mincer_1=25, electra_1=9, electra_2=1, rusty_1=5, acumm=2, af_buliz=1, af_cry_1=1, af_babka_1=1, af_spirit_1=1, af_armor_1=1, af_pudd_1=1, af_kol_1=1}},
 
--  l02_garbage={2,4,{balb_1=18, balb_2=5, gravi_1=24, gravi_2=5, mincer_1=19, mincer_2=5, electra_1=10, rusty_1=5, acumm=2, af_buliz=1, af_cry_1=1, af_babka_1=1, af_spirit_1=1, af_armor_1=1, af_pudd_1=1, af_kol_1=1}},
 
-- l03_agroprom={2,4,{balb_1=11, balb_2=5, gravi_1=11, gravi_2=5, mincer_1=8, mincer_2=5, electra_1=8, electra_2=5, zharka_1=8, zharka_2=5, buzz_1=10, rusty_1=5, acumm=2, af_buliz=1, af_cry_1=1, af_babka_1=1, af_babka_2=1, af_spirit_1=1, af_spirit_2=1, af_armor_1=1, af_armor_2=1, af_pudd_1=1, af_pudd_2=1, af_kol_1=1, af_kol_2=1}},
 
--  l04_darkvalley={2,4,{balb_1=1, balb_2=8, gravi_1=5, gravi_2=7, mincer_1=5, mincer_2=9, electra_1=5, electra_2=8, zharka_1=9, zharka_2=9, buzz_1=9, buzz_2=3, rusty_1=5, rusty_2=2, voron_1=1, acumm=2, af_buliz=1, af_cry_1=1, af_babka_1=1, af_babka_2=1, af_spirit_1=1, af_spirit_2=1, af_armor_1=1, af_armor_2=1, af_pudd_1=1, af_pudd_2=1, af_kol_1=1, af_kol_2=1}},
 
--  l05_bar={2,4,{balb_1=15, balb_2=7, gravi_1=15, mincer_1=17, electra_1=10, buzz_1=5, buzz_2=3, rusty_1=5, rusty_2=3, dummy_1=1, dummy_2=1, dummy_4=1, dummy_5=1, acumm=4, af_buliz=1, af_cry_1=1, af_babka_1=1, af_babka_2=1, af_spirit_1=1, af_spirit_2=1, af_armor_1=1, af_armor_2=1, af_pudd_1=1, af_pudd_2=1, af_kol_1=1, af_kol_2=1}},
 
--  l06_rostok={2,4,{balb_2=2, balb_3=2, mincer_2=2, mincer_3=2, electra_1=8, electra_2=8, zharka_1=14, zharka_2=8, zharka_3=5, buzz_1=5, rusty_1=10, rusty_2=8, rusty_3=5, dummy_2=1, dummy_3=1, dummy_4=1, acumm=2, af_buliz=1, af_cry_1=1, af_cry_2=0.5, af_babka_1=1, af_babka_2=1, af_babka_3=0.5, af_dik_1=0.5, af_dik_2=0.5, af_spirit_1=1, af_spirit_2=1, af_spirit_3=0.5, af_armor_1=1, af_armor_2=1, af_armor_3=0.5, af_pudd_1=1, af_pudd_2=1, af_pudd_3=0.5, af_kol_1=1, af_kol_2=1, af_kol_3=0.5}},
 
--  l08_yantar={2,4,{balb_1=1, balb_2=3, balb_3=2, gravi_1=7, gravi_2=5, gravi_3=3, mincer_1=5, mincer_2=4, mincer_3=2, electra_1=7, electra_2=5, electra_3=2, zharka_1=6, zharka_2=4, zharka_3=2, buzz_1=7, buzz_2=5, buzz_3=1, rusty_1=7, rusty_2=3, rusty_3=2, af_buliz=1, af_cry_1=1, af_cry_2=0.5, af_babka_1=1, af_babka_2=1, af_babka_3=0.5, af_dik_1=0.5, af_dik_2=0.5, af_spirit_1=1, af_spirit_2=1, af_spirit_3=0.5, af_armor_1=1, af_armor_2=1, af_armor_3=0.5, af_pudd_1=1, af_pudd_2=1, af_pudd_3=0.5, af_kol_1=1, af_kol_2=1, af_kol_3=0.5}},
 
--  l07_military={2,4,{balb_1=2, balb_2=4, balb_3=2, gravi_1=3, gravi_2=5, gravi_3=3, mincer_1=5, mincer_2=4, mincer_3=4, electra_1=7, electra_2=4, electra_3=2, zharka_1=4, zharka_2=5, zharka_3=3, buzz_1=7, buzz_2=2, rusty_1=7, rusty_2=4, rusty_3=2, dummy_2=1, dummy_3=1, dummy_5=1, acumm=2, af_buliz=1, af_cry_1=1, af_cry_2=0.5, af_babka_1=1, af_babka_2=1, af_babka_3=0.5, af_dik_1=0.5, af_dik_2=0.5, af_spirit_1=1, af_spirit_2=1, af_spirit_3=0.5, af_armor_1=1, af_armor_2=1, af_armor_3=0.5, af_pudd_1=1, af_pudd_2=1, af_pudd_3=0.5, af_kol_1=1, af_kol_2=1, af_kol_3=0.5}},
 
--  l10_radar={2,4,{balb_1=3, balb_2=5, balb_3=4, gravi_1=4, gravi_2=3, gravi_3=3, mincer_1=5, mincer_2=5, mincer_3=4, electra_1=4, electra_2=4, electra_3=3, zharka_1=4, zharka_2=4, zharka_3=4, buzz_1=5, buzz_2=5, rusty_1=5, rusty_2=5, rusty_3=4, af_buliz=1, af_cry_2=1, af_cry_3=0.5, af_babka_2=1, af_babka_3=1, af_babka_4=0.5, af_dik_1=1, af_dik_2=0.5, af_dik_3=0.5, af_spirit_2=1, af_spirit_3=1, af_spirit_4=0.5, af_armor_2=1, af_armor_3=1, af_armor_4=0.5, af_pudd_2=1, af_pudd_3=1, af_pudd_4=0.5, af_kol_2=1, af_kol_3=1, af_kol_4=0.5}},
 
--  l11_pripyat={2,4,{balb_1=2, balb_2=2, balb_3=2, gravi_1=3, gravi_2=3, gravi_3=3, mincer_1=4, mincer_2=4, mincer_3=3, electra_1=2, electra_2=4, electra_3=3, zharka_1=4, zharka_2=3, zharka_3=3, buzz_1=4, buzz_2=4, buzz_3=3, rusty_1=7, rusty_2=4, rusty_3=4, dummy_1=1, dummy_2=2, dummy_3=1, dummy_4=1, dummy_5=1, acumm=2, af_buliz=1, af_cry_2=1, af_cry_3=1, af_babka_2=1, af_babka_3=1, af_babka_4=1, af_dik_1=1, af_dik_2=1, af_dik_3=1, af_spirit_2=1, af_spirit_3=1, af_spirit_4=1, af_armor_2=1, af_armor_3=1, af_armor_4=1, af_pudd_2=1, af_pudd_3=1, af_pudd_4=1, af_kol_2=1, af_kol_3=1, af_kol_4=1}},
 
--  l12_stancia={2,4,{balb_1=1, balb_2=1, balb_3=1, gravi_1=3, gravi_2=3, gravi_3=3, mincer_1=4, mincer_2=4, mincer_3=3, electra_1=4, electra_2=4, electra_3=3, zharka_1=4, zharka_2=4, zharka_3=3, buzz_1=3, buzz_2=4, buzz_3=3, rusty_1=4, rusty_2=4, rusty_3=3, dummy_1=1, dummy_2=1, dummy_3=1, dummy_4=1, dummy_5=1, acumm=2, af_buliz=1, af_cry_2=1, af_cry_3=2, af_babka_2=1, af_babka_3=1, af_babka_4=2, af_dik_2=1, af_dik_3=1, af_dik_4=1, af_spirit_2=1, af_spirit_3=1, af_spirit_4=2, af_armor_2=1, af_armor_3=1, af_armor_4=2, af_pudd_2=1, af_pudd_3=1, af_pudd_4=2, af_kol_2=1, af_kol_3=1, af_kol_4=2}},
 
--  puzir={4,6,{balb_1=3, balb_2=3, gravi_1=5, gravi_2=5, mincer_1=7, mincer_2=5, electra_1=10, electra_2=5, zharka_1=9, zharka_2=5, buzz_1=10, buzz_2=8, buzz_3=5, rusty_1=5, rusty_2=2, af_buliz=1, af_cry_1=1, af_cry_2=1, af_babka_1=1, af_babka_2=1, af_spirit_1=1, af_spirit_2=1, af_armor_1=1, af_armor_2=1, af_pudd_1=1, af_pudd_2=1, af_kol_1=1, af_kol_2=1}},
 
--  aver={2,4,{balb_1=2, balb_2=3, balb_3=3, gravi_1=6, gravi_2=4, gravi_3=3, mincer_1=3, mincer_2=4, mincer_3=1, electra_1=5, electra_2=5, electra_3=2, zharka_1=4, zharka_2=4, zharka_3=1, buzz_1=6, buzz_2=6, buzz_3=4, rusty_1=5, rusty_2=4, rusty_3=4, dummy_1=1, dummy_2=1, dummy_3=1, dummy_4=1, dummy_5=1, acumm=2, af_buliz=1, af_cry_2=1, af_babka_2=1, af_babka_3=1, af_dik_2=1, af_dik_3=1, af_spirit_2=1, af_spirit_3=1, af_armor_2=1, af_armor_3=1, af_pudd_2=1, af_pudd_3=1, af_kol_2=1, af_kol_3=1}},
 
--  marsh={2,4,{balb_1=2, balb_2=3, balb_3=3, gravi_1=5, gravi_2=4, gravi_3=3, mincer_1=4, mincer_2=4, mincer_3=3, electra_1=5, electra_2=4, electra_3=3, zharka_1=5, zharka_2=4, zharka_3=3, buzz_1=7, buzz_2=4, buzz_3=3, rusty_1=5, rusty_2=4, rusty_3=3, dummy_1=1, dummy_2=1, dummy_3=1, dummy_4=1, voron_1=1, af_buliz=1, af_cry_2=1, af_babka_2=1, af_babka_3=1, af_dik_2=1, af_dik_3=1, af_spirit_2=1, af_spirit_3=1, af_armor_2=1, af_armor_3=1, af_pudd_2=1, af_pudd_3=1, af_kol_2=1, af_kol_3=1}},
 
--  limansk={1,2,{balb_1=2, balb_2=4, balb_3=5, gravi_1=4, gravi_2=4, gravi_3=4, mincer_1=4, mincer_2=4, mincer_3=4, electra_1=4, electra_2=4, electra_3=4, zharka_1=4, zharka_2=4, zharka_3=4, buzz_1=4, buzz_2=4, rusty_1=4, rusty_2=4, rusty_3=4, af_buliz=1, af_cry_2=1, af_cry_3=1, af_babka_2=1, af_babka_3=1, af_babka_4=1, af_dik_2=1, af_dik_3=1, af_dik_4=1, af_spirit_2=1, af_spirit_3=1, af_spirit_4=1, af_armor_2=1, af_armor_3=1, af_armor_4=1, af_pudd_2=1, af_pudd_3=1, af_pudd_4=1, af_kol_2=1, af_kol_3=1, af_kol_4=1}},
 
--  hospital={1,2,{balb_1=2, balb_2=2, balb_3=3, gravi_1=3, gravi_2=4, gravi_3=3, mincer_1=3, mincer_2=4, mincer_3=3, electra_1=7, electra_2=4, electra_3=3, zharka_1=4, zharka_2=4, zharka_3=3, buzz_1=4, buzz_2=4, buzz_3=3, rusty_1=4, rusty_2=4, rusty_3=3, dummy_1=1, dummy_2=1, dummy_3=1, dummy_4=1, dummy_5=1, af_buliz=1, af_cry_2=1, af_cry_3=1, af_babka_2=1, af_babka_3=1, af_babka_4=1, af_dik_2=1, af_dik_3=1, af_dik_4=1, af_spirit_2=1, af_spirit_3=1, af_spirit_4=1, af_armor_2=1, af_armor_3=1, af_armor_4=1, af_pudd_2=1, af_pudd_3=1, af_pudd_4=1, af_kol_2=1, af_kol_3=1, af_kol_4=1}},
 
--  red_forest={2,4,{balb_1=3, balb_2=6, balb_3=5, gravi_1=4, gravi_2=3, gravi_3=3, mincer_1=4, mincer_2=4, mincer_3=5, electra_1=5, electra_2=4, electra_3=3, zharka_1=5, zharka_2=5, zharka_3=3, buzz_1=3, buzz_2=5, voron_1=1, rusty_1=4, rusty_2=4, af_buliz=1, af_cry_2=1, af_cry_3=1, af_babka_2=1, af_babka_3=1, af_babka_4=1, af_dik_2=1, af_dik_3=1, af_dik_4=1, af_spirit_2=1, af_spirit_3=1, af_spirit_4=1, af_armor_2=1, af_armor_3=1, af_armor_4=1, af_pudd_2=1, af_pudd_3=1, af_pudd_4=1, af_kol_2=1, af_kol_3=1, af_kol_4=1}},
 
--  lost_village={1,2,{balb_1=4, balb_2=7, balb_3=5, gravi_1=4, gravi_2=3, gravi_3=3, mincer_1=5, mincer_2=7, mincer_3=5, electra_1=5, electra_2=4, electra_3=2, zharka_1=4, zharka_2=4, zharka_3=4, buzz_1=4, buzz_2=4, dummy_1=5, af_buliz=1, af_cry_2=1, af_cry_3=1, af_babka_2=1, af_babka_3=1, af_babka_4=1, af_dik_2=1, af_dik_3=1, af_dik_4=1, af_spirit_2=1, af_spirit_3=1, af_spirit_4=1, af_armor_2=1, af_armor_3=1, af_armor_4=1, af_pudd_2=1, af_pudd_3=1, af_pudd_4=1, af_kol_2=1, af_kol_3=1, af_kol_4=1}},
 
--  generators={2,4,{balb_1=1, balb_2=3, balb_3=2, gravi_1=2, gravi_2=2, gravi_3=2, mincer_1=4, mincer_2=4, mincer_3=3, electra_1=3, electra_2=3, electra_3=2, zharka_1=5, zharka_2=4, zharka_3=4, buzz_1=5, buzz_2=4, buzz_3=3, rusty_2=6, dummy_1=4, dummy_2=4, dummy_3=1, dummy_4=1, dummy_5=1, af_buliz=1, af_cry_2=1, af_cry_3=2, af_babka_2=1, af_babka_3=1, af_babka_4=2, af_dik_2=1, af_dik_3=1, af_dik_4=1, af_spirit_2=1, af_spirit_3=1, af_spirit_4=2, af_armor_2=1, af_armor_3=1, af_armor_4=2, af_pudd_2=1, af_pudd_3=1, af_pudd_4=2, af_kol_2=1, af_kol_3=1, af_kol_4=2}},
 
--  atp_for_test22={2,4,{balb_1=2, balb_2=3, balb_3=2, gravi_1=6, gravi_2=4, gravi_3=3, mincer_1=4, mincer_2=4, mincer_3=1, electra_1=5, electra_2=5, electra_3=2, zharka_1=4, zharka_2=4, zharka_3=1, buzz_1=5, buzz_2=4, buzz_3=4, rusty_1=5, rusty_2=4,dummy_1=5, dummy_2=1, dummy_3=1, dummy_4=1, voron_1=1, acumm=3, af_buliz=1, af_cry_1=1, af_cry_2=0.5, af_babka_1=1, af_babka_2=1, af_babka_3=0.5, af_dik_1=0.5, af_dik_2=0.5, af_spirit_1=1, af_spirit_2=1, af_spirit_3=0.5, af_armor_1=1, af_armor_2=1, af_armor_3=0.5, af_pudd_1=1, af_pudd_2=1, af_pudd_3=0.5, af_kol_1=1, af_kol_2=1, af_kol_3=0.5}},
 
--  dead_city={2,4,{balb_1=4, balb_2=3, balb_3=3, gravi_1=4, gravi_2=3, gravi_3=3, mincer_1=4, mincer_2=4, mincer_3=3, electra_1=3, electra_2=3, electra_3=3, zharka_1=4, zharka_2=4, zharka_3=3, buzz_1=4, buzz_2=4, buzz_3=3, rusty_1=4, rusty_2=4, rusty_3=3, dummy_1=1, dummy_2=2, dummy_3=1, dummy_4=1, dummy_5=1, af_buliz=1, af_cry_2=1, af_cry_3=1, af_babka_2=1, af_babka_3=1, af_babka_4=1, af_dik_2=1, af_dik_3=1, af_dik_4=1, af_spirit_2=1, af_spirit_3=1, af_spirit_4=1, af_armor_2=1, af_armor_3=1, af_armor_4=1, af_pudd_2=1, af_pudd_3=1, af_pudd_4=1, af_kol_2=1, af_kol_3=1, af_kol_4=1}},
 
--  zaton={4,6,{balb_1=2, balb_2=3, balb_3=3, gravi_1=3, gravi_2=3, gravi_3=3, mincer_1=3, mincer_2=3, mincer_3=3, electra_1=5, electra_2=4, electra_3=3, zharka_1=5, zharka_2=4, zharka_3=3, buzz_1=7, buzz_2=4, buzz_3=3, rusty_1=5, rusty_2=4, rusty_3=3, dummy_1=1, dummy_2=1, dummy_3=1, dummy_4=1, voron_1=1, acumm=2, af_buliz=1, af_cry_2=1, af_cry_3=0.5, af_babka_2=1, af_babka_3=1, af_babka_4=0.5, af_dik_1=1, af_dik_2=0.5, af_dik_3=0.5, af_spirit_2=1, af_spirit_3=1, af_spirit_4=0.5, af_armor_2=1, af_armor_3=1, af_armor_4=0.5, af_pudd_2=1, af_pudd_3=1, af_pudd_4=0.5, af_kol_2=1, af_kol_3=1, af_kol_4=0.5}},
 
--  jupiter={4,6,{balb_1=2, balb_2=3, balb_3=3, gravi_1=4, gravi_2=4, gravi_3=3, mincer_1=4, mincer_2=4, mincer_3=3, electra_1=5, electra_2=4, electra_3=3, zharka_1=5, zharka_2=4, zharka_3=3, buzz_1=5, buzz_2=4, buzz_3=3, rusty_1=5, rusty_2=4, rusty_3=3, dummy_1=1, dummy_2=1, dummy_3=1, dummy_4=1, voron_1=1, af_buliz=1, af_cry_2=1, af_cry_3=0.5, af_babka_2=1, af_babka_3=1, af_babka_4=0.5, af_dik_1=1, af_dik_2=0.5, af_dik_3=0.5, af_spirit_2=1, af_spirit_3=1, af_spirit_4=0.5, af_armor_2=1, af_armor_3=1, af_armor_4=0.5, af_pudd_2=1, af_pudd_3=1, af_pudd_4=0.5, af_kol_2=1, af_kol_3=1, af_kol_4=0.5}},
 
--  pripyat={2,4,{balb_1=2, balb_2=3, balb_3=3, gravi_1=4, gravi_2=4, gravi_3=3, mincer_1=4, mincer_2=4, mincer_3=3, electra_1=5, electra_2=4, electra_3=3, zharka_1=5, zharka_2=4, zharka_3=3, buzz_1=5, buzz_2=4, buzz_3=3, rusty_1=5, rusty_2=4, rusty_3=3, dummy_1=1, dummy_2=1, dummy_3=1, dummy_4=1, voron_1=1, af_buliz=1, af_cry_2=1, af_cry_3=0.5, af_babka_2=1, af_babka_3=1, af_babka_4=0.5, af_dik_1=1, af_dik_2=0.5, af_dik_3=0.5, af_spirit_2=1, af_spirit_3=1, af_spirit_4=0.5, af_armor_2=1, af_armor_3=1, af_armor_4=0.5, af_pudd_2=1, af_pudd_3=1, af_pudd_4=0.5, af_kol_2=1, af_kol_3=1, af_kol_4=0.5}}
}
 
 
--[[-------------------------- variable and table ---------------------end--]]
--[[-------------------------- function for spawn --------------------------]]
 
 
function init()
  local blow  = amk.load_variable( "blowout", 0 )
  local lname = level.name()
  if not level_vertexes[ lname ] then return end
  if not level_anoms[ lname ] then return end
  local anoms_sect = "amk_anoms." .. lname
  if system_ini():section_exist( anoms_sect ) then
    local result, id, value = nil, nil, nil 
    for a = 0, system_ini():line_count( anoms_sect ) - 1 do
      result, id, value = system_ini():r_line( anoms_sect, a, "", "" )
      if id and amk.trim( id ) ~= "" and amk.trim( id ) then
        local s = amk.str_explode( ",", id, true )
        if s[ 1 ] == nil or s[ 2 ] == nil or s[ 3 ] == nil or s[ 4 ] == nil then 
          abort( "amk_anoms:init() - error while parsing safe zones for " .. lname .. " at section's line #" .. ( a + 1 ) )
        end 
        table.insert(
          anti_spawn_zones,
          {
            vector():set(
              tonumber( s[ 1 ] ),
              tonumber( s[ 2 ] ),
              tonumber( s[ 3 ] )
            ),
            tonumber( s[ 4 ] )
          }
        )
      end
    end
  end
  if blow > 0 and blow < 4 then return end
  pre_blow_off()
  generate_anoms()
end
 
 
function after_blow_on()
  local lname = level.name()
  if not level_vertexes[ lname ] then return end
  if not level_anoms[ lname ] then return end
  generate_anoms()
  move_mgr.invalidate_pp_accessibility()
end
 
 
--[=[
function pre_blow_off()
-- уточнить нужна ли проверка на существование гейм вертекса по гейм вертексу объекта, который уже заспавнен и готовится к удалению
local sim=alife()
local ggraph=game_graph()
        for i=0,65534 do
local sobj=sim:object(i)
                if sobj then
if is_anomaly(sobj:clsid()) and ggraph:valid_vertex_id(sobj.m_game_vertex_id) then
local map=sim:level_name(ggraph:vertex(sobj.m_game_vertex_id):level_id())
                                if not check_exclusion(sobj,map) then
                                local status=get_anomaly_status(sobj)
if status=="" or status=="on" then set_anomaly_status(sobj,"del") alife():release(sobj,true) end
end end end end end
--]=]
 
 
function pre_blow_off()
  for i = 0, 65534 do
    local sobj = alife():object(i)
    if sobj then
      if is_anomaly( sobj:clsid() ) then
        local map = alife():level_name(
          game_graph():vertex( sobj.m_game_vertex_id ):level_id()
        )
        if not check_exclusion( sobj, map ) then
          local status = get_anomaly_status( sobj )
          if status == "" or status == "on" then
            set_anomaly_status( sobj, "del" )
            alife():release( sobj, true )
          end
        end
      end
    end
  end
end
 
 
function cleanup_arts()
  local known_arts  = {}
  local known_sects = {}
  for lname, alist in pairs( level_arts ) do
    if not known_arts[ lname ] then
      known_arts[ lname ] = {}
    end
    for k, v in pairs( alist[ 3 ] ) do
      local sect = arts_sections[ k ]
      if sect then
        known_arts[ lname ][ sect ] = true
        known_sects[ sect ] = true
      end
    end
  end
  for i = 0, 65534 do
    local sobj = alife():object( i )
    if sobj and sobj.parent_id == 65535 then
      local sect = sobj:section_name()
      if known_sects[ sect ] then
        local gvid  = sobj.m_game_vertex_id
        local lname = alife():level_name(
          game_graph():vertex( gvid ):level_id()
        )
        if known_arts[ lname ] and known_arts[ lname ][ sect ] then
          alife():release( sobj, true )
        end
      end
    end
  end
  for k, v in pairs( amk_offline_alife.off_npcs ) do
    v.artefacts = {}
  end
end
 
 
function generate_anoms()
  local lname = level.name()
  local v     = level_anoms[ lname ]
  if v then
    local cnt = 0
    local mxx = math_random( v[ 1 ], v[ 2 ] ) * anoms_difficulty_koef[ level.get_game_difficulty() ]
    while cnt < mxx do
      if generate_anomaly() then cnt = cnt + 1 end
    end
  end
end
 
 
function generate_arts()
  local lname = level.name()
  if not level_vertexes[ lname ] then return end
  local v = level_arts[ lname ]
  if v then
    local cnt, mxx = 0, math_random( v[ 1 ], v[ 2 ] )
    while cnt < mxx do
      if generate_art( lname ) then cnt = cnt + 1 end
    end
 end
-- переделано на поршни - при выбросе снимаем все поршни, при спавне
-- артов на локе выдаем - это больше не нужно
  --generate_test(lname)
end
 
 
function generate_anomaly()
  local lname = level.name()
  local gvn, gvx, lvx = game_vertexes[ lname ][ 1 ], game_vertexes[ lname ][ 2 ], level_vertexes[ lname ]
  local new_lv = math_random( 1, lvx )
  local actor_pos = db.actor:position()
  local pos = level.vertex_position( new_lv )
  if actor_pos:distance_to( pos ) < 5 then return false end
  if not check_coordinates( pos ) then return false end
  local new_gv = 0
  local min_dist = 100000
  for a = gvn, gvx do
    g1 = game_graph():vertex( a ):game_point()
    if g1:distance_to( pos ) < min_dist then
      min_dist = g1:distance_to( pos )
      new_gv = a
    end
  end
  if game_graph():valid_vertex_id( new_gv ) then
    return spawn_rand_anom( pos, new_gv, new_lv )
  end
end
 
 
function generate_art( lname, section, pre_check_coords_func )
  local gvn, gvx, lvx = game_vertexes[ lname ][ 1 ], game_vertexes[ lname ][ 2 ], level_vertexes[ lname ]
  local new_lv = math_random( 1, lvx )
  local pos = level.vertex_position( new_lv )
  if not check_coordinates_arts( pos, lname ) then return false end
  if pre_check_coords_func then
    if not pre_check_coords_func( pos ) then return false end
  end
  local new_gv = 0
  local min_dist = 100000
  for a = gvn, gvx, 1 do
    g1 = game_graph():vertex( a ):game_point()
    if g1:distance_to( pos ) < min_dist then
      min_dist = g1:distance_to( pos )
      new_gv = a
    end
  end
  if game_graph():valid_vertex_id( new_gv ) then
    if section then
        return spawn_art( section, pos, gv, lv )
    else
      return spawn_rand_arts( pos, new_gv, new_lv, lname )
    end
  end
end
 
 
-- переспавн провалившегося под текстуры артефакта на текущем уровне,
-- на входе оффлайновый провалившийся арт
function respawn_falling_art(art)
  local section = art:section_name()
  alife():release(art)
 
  local lname = level.name()
  local gvn,gvx,lvx,new_lv,pos
 
  repeat
    gvn,gvx,lvx = game_vertexes[lname][1], game_vertexes[lname][2], level_vertexes[lname]
    new_lv=math_random(1,lvx)
    pos = level.vertex_position(new_lv)
  until check_coordinates_arts(pos,lname)
 
  local new_gv = 0
  local min_dist = 100000
  for a = gvn, gvx, 1 do
    g1 = game_graph():vertex(a):game_point()
    if g1:distance_to(pos)<min_dist then
      min_dist = g1:distance_to(pos)
      new_gv = a
    end
  end
 
  if game_graph():valid_vertex_id(new_gv) then
    return spawn_art(section,pos,new_gv,new_lv)
  end
end
 
 
--[=[ переделано на поршни - при выбросе снимаем все поршни, при спавне
--артов на локе выдаем - это больше не нужно
function generate_test(lname)
 local gvn,gvx,lvx = game_vertexes[lname][1], game_vertexes[lname][2], level_vertexes[lname]
local new_lv=math_random(1,lvx)
 local pos = level.vertex_position(new_lv)
if not check_coordinates_arts(pos,lname) then return false end
 local new_gv = 0
 local min_dist = 100000
 for a = gvn, gvx, 1 do
        g1 = game_graph():vertex(a):game_point()
        if g1:distance_to(pos)<min_dist then
        min_dist = g1:distance_to(pos)
        new_gv = a
end end
if game_graph():valid_vertex_id(new_gv) then return spawn_test(pos,new_gv,new_lv,lname) end
 end
--]=]
 
 
function spawn_rand_anom(pos,gv,lv)
  local lname=level.name()
  local shapes,shape1={},{}
  local section
  section = "zone_ice"
  local rnd=math_random()*100
  if 5>rnd then
    shape1={shtype=0,radius=4,center={0,0,0}}
  else
    local rnd_max = 0
    for k,v in pairs(level_anoms[lname][4]) do
      rnd_max = rnd_max + v
    end
    rnd=math_random(1,rnd_max)
    for k,v in pairs(level_anoms[lname][4]) do
      if rnd<=v then section=anoms_sections[k] break end
      rnd=rnd-v
    end
    local anom_prefix="amk_zone_"
    local suffix_num=math_random(1,3)
    local suffix=anom_suffix(suffix_num)
    shape1=section[2]
    section=anom_prefix..section[1]..suffix
  end
  shapes[1]={}
  shapes[1].shtype=shape1.shtype
  if shape1.shtype == 0 then
    shapes[1].radius = shape1.radius
    shapes[1].center = vector():set(shape1.center[1],shape1.center[2],shape1.center[3])
  else
    shapes[1].v1 = vector():set(shape1.v1[1],shape1.v1[2],shape1.v1[3])
    shapes[1].v2 = vector():set(shape1.v2[1],shape1.v2[2],shape1.v2[3])
    shapes[1].v3 = vector():set(shape1.v3[1],shape1.v3[2],shape1.v3[3])
    shapes[1].offset = vector():set(shape1.offset[1],shape1.offset[2],shape1.offset[3])
  end
  local status="on"
  return spawn_anomaly(section,pos,gv,lv,shapes,status)
end
 
 
function spawn_rand_arts(pos,gv,lv,lname)
  local rnd_max=0
  for k,v in pairs(level_arts[lname][3]) do
    rnd_max=rnd_max+v*10
  end
  local rnd=0
  rnd=math_random(1,rnd_max)
  for k,v in pairs(level_arts[lname][3]) do
    if rnd<=v*10 then section=arts_sections[k] break end
    rnd=rnd-v*10
  end
  return spawn_art(section,pos,gv,lv)
end
 
 
function spawn_anomaly(section,pos,gv,lv,shape,status)
  local sobj
  sobj=amk.spawn_item(section,pos,gv,lv)
  if sobj then
    local tbl = amk.get_anomaly_data(sobj)
    tbl.shapes=shape
    tbl.custom=modify_anomaly_custom_data(tbl.custom,status)
    amk.set_anomaly_data(tbl, sobj)
  end
  return sobj
end
 
 
function spawn_art(section,pos,gv,lv)
  local sobj
  sobj=amk.spawn_item(section,pos,gv,lv)
  if sobj then return sobj end
end
 
 
--[=[
--переделано на поршни - при выбросе снимаем все поршни, при
--спавне артов на локе выдаем - это больше не нужно
function spawn_test(pos,gv,lv,lname)
local section="testsak_"..lname
return amk.spawn_item(section,pos,gv,lv)
end
--]=]
 
 
-- аномалии, которые не исчезнут при НИ, да и вообще
function check_exclusion( obj, map )
  local obj_name = obj:name()
  if
    string_find( obj_name, "amk_" )     or
    string_find( obj_name, "zone_ice" ) or
    string_find( obj_name, "caps_" )
  then
    return false
  end
  if not level_vertexes[ map ] then return true end
  if not level_anoms[ map ] then return true end
  return
       string_find( obj_name, "zone_tuman" )                                            -- Острова туман 
    or string_find( obj_name, "zone_fly_island" )                                       -- Острова парение
    or string_find( obj_name, "_snp" )                                                          -- Снайпер
    or string_find( obj_name, "anim_ph_" )                                                      -- Аномальные объекты
    or string_find( obj_name, "propeller" )                                             -- Пропеллер
    or string_find( obj_name, "sky_anomaly" )                                           -- Sky_Anomaly
    or string_find( obj_name, "esc_zone_witches" )                                      -- перемещающаяся электра (Кордон)
    or string_find( obj_name, "pri_zone_witches" )                                      -- электра на колесе обозрения (ЦП)
    or string_find( obj_name, "zone_topolinypuh" )                                      -- пух (Радар)
    or string_find( obj_name, "red_zone_acidic" )                                       -- холодцы в шахте (Красный Лес)
    or string_find( obj_name, "podval_tornado_strong" )                 -- торнадо в подвале (Лиманск)
    or string_find( obj_name, "dcity_fontan_fountain_average" ) -- фонтан в фонтане (МГ)
    or string_find( obj_name, "rostok_zone_witches" )                           -- электры везде (Росток)
    or string_find( obj_name, "rostok_zone_zharka_static" )             -- жарки в тоннеле (Росток)
    or string_find( obj_name, "tutorial" )                                                      -- эпичная смерть псевдоплоти (Кордон)
    or (
      string_find( obj_name, "_mincer" ) and map ~= "l11_pripyat"
    ) -- почему именно там?
end
 
 
function anom_suffix(suffix_num)
  local suffix=""
  if suffix_num==1 then suffix="_weak"
  elseif suffix_num==2 then suffix="_average"
  else suffix="_strong"
  end
  return suffix
end
 
 
function check_coordinates(pos)
  local lname=level.name()
  local hides=amk_hideouts.hide[lname]
  local tmp
  if hides then
    for i,o in ipairs(hides) do
      if o.zone then
        for j,v in ipairs(o.zone) do
          if v.p3 then
            tmp=amk.check_npc_in_box(pos,vector():set(unpack(v.p1)),vector():set(unpack(v.p2)),vector():set(unpack(v.p3)))
          else
            tmp=amk.check_npc_in_box(pos,vector():set(unpack(v.p1)),vector():set(unpack(v.p2)))
          end
          if tmp==true then return false end
  end end end end
  for k,v in pairs(anti_spawn_zones) do
    if pos:distance_to(v[1])<=v[2] then return false end
  end
  return true
end
 
 
function check_coordinates_arts(pos,lname)
  for k,v in pairs(anti_spawn_zones) do
    if pos:distance_to(v[1])<=v[2] then return false end
  end
  local hides=amk_hideouts.hide[lname]
  local tmp
  if hides then
    for i,o in ipairs(hides) do
      if o.zone then
        for j,v in ipairs(o.zone) do
          if v.p3 then
            tmp=amk.check_npc_in_box(pos,vector():set(unpack(v.p1)),vector():set(unpack(v.p2)),vector():set(unpack(v.p3)))
          else
            tmp=amk.check_npc_in_box(pos,vector():set(unpack(v.p1)),vector():set(unpack(v.p2)))
          end
          if tmp==true then return false end 
  end end end end
  return true
end
 
 
function get_anomaly_status(sobj)
  local tbl = amk.get_anomaly_data(sobj)
  local cd=tbl.custom
  cd=amk.parse_custom_data(cd)
  if not cd.dyn_anom then return "" end
  if not cd.dyn_anom.status then return "" end
  return cd.dyn_anom.status
end
 
 
function is_anomaly(class_id)
  return (class_id and anoms_classes[class_id]==true)
end
 
 
function modify_anomaly_custom_data(cd,status)
  cd=amk.parse_custom_data(cd)
  if not cd then cd={} end
  if not cd.dyn_anom then cd.dyn_anom={} end 
  cd.dyn_anom.status=status
  return amk.gen_custom_data(cd)
end
 
 
function set_anomaly_status( sobj, status )
  if sobj then
    local anom_id = sobj.id
    if status == "del" then
    end
    local tbl = amk.get_anomaly_data( sobj )
    tbl.custom = modify_anomaly_custom_data( tbl.custom, status )
    amk.set_anomaly_data( tbl, sobj )
    set_online_anomaly_status( anom_id, status )
  end
end
 
 
function set_online_anomaly_status( obj_id, status )
  local obj=level.object_by_id( obj_id )
  if obj then
    if status == "off" or status=="del" then
      obj:disable_anomaly()
      amk_anoms.remove_anomaly( obj_id )
      amk_anoms.restrictor_deleted( obj_id, obj:name() )
    else
      obj:enable_anomaly()
      local sobj = alife():object( obj_id )
      amk_anoms.add_anomaly( obj_id, sobj.position, sobj.radius, sobj )
    end
  end
end
 
 
--[[-------------------------- function for spawn ---------------------end--]]
--[[-------------------------- npc and anom_binder -------------------------]]
local anoms_for_npc={}
local npcs_for_anom={}
local actual_anoms_for_npc={}
local npc_restrictors_need_update={}
 
 
function init_if_needed( nid )
  if not anoms_for_npc[ nid ] then anoms_for_npc[ nid ] = {} end
  if not actual_anoms_for_npc[ nid ] then
    actual_anoms_for_npc[ nid ] = {}
  end
  return anoms_for_npc[ nid ], actual_anoms_for_npc[ nid ]
end
 
 
function add_restriction( npc, id, name )
  local nid = npc:id()
  if name == nil then
    name = ( level.object_by_id( id ) and level.object_by_id( id ):name() )
  end
  if not name then
    get_console():execute("load ~~~ add_restriction(): Warning! Nonexistent restrictor id "..id)
    return
  end
  init_if_needed( nid )
  if anoms_for_npc[ nid ][ id ] then
  else
    anoms_for_npc[ nid ][ id ] = name
    npc_restrictors_need_update[ nid ]=true
  end
end
 
 
function remove_restriction(npc,id,name,immed)
  local nid=npc:id()
  if name==nil then
    name=(level.object_by_id(id) and level.object_by_id(id):name())
  end
  if not name then
    abort("remove_restriction(): Nonexistent restrictor id "..id)
    return
  end
  init_if_needed(nid)
  if immed then
    if actual_anoms_for_npc[nid][id] then
      npc:remove_restrictions("",name) actual_anoms_for_npc[nid][id]=nil npcs_for_anom[id][nid]=nil
    end
    if anoms_for_npc[nid][id] then
      anoms_for_npc[nid][id]=nil
    end
  else
    if anoms_for_npc[nid][id] then
      anoms_for_npc[nid][id]=nil npc_restrictors_need_update[nid]=true
    end
  end
end
 
 
function restrictor_deleted(id,name)
  for nid,anoms in pairs(anoms_for_npc) do
    if anoms[id] then
      anoms[id]=nil npc_restrictors_need_update[nid]=true
    end
  end
end
 
 
function clear_to_release(id)
  local cnt
  if npcs_for_anom[id] then
    for nid in pairs(npcs_for_anom[id]) do
      cnt=cnt+1
    end
    return cnt==0
  else
    return true
  end
end
 
 
function have_pending_sync( npc )
  local nid = npc:id()
  return npc_restrictors_need_update[ nid ] == true
end
 
 
local max_dynamic_restrictors_count=40
 
function syncronize( npc )
  local nid = npc:id()
  local cnt = 0
  local anoms, actual = init_if_needed( nid )
  local disttbl = {}
  for id in pairs( anoms ) do cnt = cnt + 1 end
  if cnt > max_dynamic_restrictors_count then
    local disttbl = {}
    for id in pairs( anoms ) do
      local dist = 0
      local sobj = alife():object( id )
      if sobj then
        dist = npc:position():distance_to_sqr( sobj.position )
      else
        dist = 1000000
      end
      table.insert( disttbl, { id = id,dist = dist } )
    end
    table.sort( disttbl, function ( a, b ) return a.dist > b.dist end )
    for i = 1, cnt - max_dynamic_restrictors_count do
      anoms[ disttbl[ i ].id ] = nil
    end
  end
  local add, rem = "", ""
  local first = true
  for id, name in pairs( actual ) do
    if not anoms[ id ] then
      if first then
        first = false
        rem = name
      else
        rem = name .. "," .. rem
      end
      if npcs_for_anom[ id ] then npcs_for_anom[ id ][ nid ] = nil end
      actual[ id ] = nil
    end
  end
  first = true
  for id, name in pairs( anoms ) do
    if not actual[ id ] then
      if first then
        first = false
        add = name
      else
        add = name .. "," .. add
      end
      if not npcs_for_anom[ id ] then npcs_for_anom[ id ] = {} end
      npcs_for_anom[ id ][ nid ] = true
      actual[ id ] = name
    end
  end
  npc:remove_restrictions( "", rem )
  npc:add_restrictions( "",add )
  npc_restrictors_need_update[ nid ] = false
end
 
 
function unreg_in_anom_manager(npc)
  local nid=npc:id()
  local anoms=anoms_for_npc[nid]
  if anoms then
    for aid in pairs(anoms) do
      if npcs_for_anom[aid] then
        npcs_for_anom[aid][nid]=nil
      end
    end
    anoms_for_npc[nid]=nil
  end
end
 
 
function bind(obj)
  obj:bind_object(anom_binder(obj))
end
 
 
class "anom_binder" ( object_binder )
 
function anom_binder:__init(obj)
  super(obj)
end
 
 
function anom_binder:net_spawn(sobj)
  if not object_binder.net_spawn( self,sobj ) then
    return false
  end
  local status=get_anomaly_status(sobj)
  if status=="del" or status=="off" then
    if status=="del" then
    end
    self.object:disable_anomaly()
  else
    amk_anoms.add_anomaly(sobj.id,sobj.position,sobj.radius, sobj)
  end
  return true
end
 
 
function anom_binder:net_destroy()
  amk_anoms.remove_anomaly(self.object:id())
  object_binder.net_destroy(self)
end
 
 
anom_list={}
 
function get_radius_for_section(section)
  return getIniValueFloat(section,"effective_radius",2,nil)
end
 
function add_anomaly( id, pos, radius, sobj )
  if not anom_list then anom_list = {} end
  local lname = alife():level_name(
    game_graph():vertex(sobj.m_game_vertex_id):level_id()
  )
  anom_list[ id ] = {
    pos      = pos,
    clsid    = sobj:clsid(),
    radius   = radius or 0.0,
    section  = sobj:section_name(),
    location = lname
  }
end
 
 
function remove_anomaly(id)
  if anom_list then anom_list[id]=nil end
end
 
 
function get_nearest_anomaly(npc)
  return get_nearest_anomaly_for_pos(npc:position())
end
 
 
function get_nearest_anomaly_for_pos(posn)
  local anomid,pos,radius,dist
  local mindist=10000000
  for id,o in pairs(anom_list) do
    dist=posn:distance_to(o.pos)-o.radius
    if dist<mindist then
      mindist=dist
      anomid=id
      pos=o.pos
      radius=o.radius
    end
  end
  return anomid,pos,radius,mindist
end
 
 
function get_anomaly_list(npc,radius)
  return get_anomaly_list_for_pos(npc:position(),radius)
end
 
 
function get_anomaly_list_for_pos(posn,radius)
  local ret={}
  if anom_list then
    for id,o in pairs(anom_list) do
      local obj=level.object_by_id(id)
      if obj then
        local dist=posn:distance_to(o.pos)-o.radius
        if dist<radius then
          table.insert(ret,{id=id,name=obj:name(),pos=o.pos,radius=o.radius})
        end
      end
    end
  end
  return ret
end
 

 

 

остаются лишь скриптовые и те, которые прописаны в all.spawn

  • Спасибо 1
  • Полезно 1
Ссылка на комментарий

Вопрос от Firewind

Всем привет. У меня после выброса перестали появляться артефакты, а они для варки просто необходимы. Кто то знает как решить эту проблему?

Ответ:

@Firewind, а почему ты так решил?
Могут не спавниться из-за неотключенных инфопоршней testsak_имя_локации. Тогда надо их задисаблить.

Изменено пользователем shahvkit
Обьединение и удаление

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

Недавно прочитал сообщение @dsh про респавнеры. И решил тоже там поковыряться.
Проверил таблицы и вот итог:

remove from respawn [val_dog_respawn_1] object: vodka13152


remove from respawn [val_dog_respawn_1] object: ammo_7.92x33_fmj52522
remove from respawn [val_dog_respawn_1] object: bandage48157
remove from respawn [val_dog_respawn_1] object: grenade_rgd529281
remove from respawn [val_dog_respawn_1] object: ammo_7.62x54_7h15210
remove from respawn [val_dog_respawn_1] object: mutant_psevdogigant_hand51956
remove from respawn [val_dog_respawn_1] object: mutant_psevdogigant_hand51961
remove from respawn [bar_stalker_respawn_2] object: wpn_abakan10864
remove from respawn [bar_stalker_respawn_2] object: bandage10910
remove from respawn [bar_stalker_respawn_2] object: wpn_mossberg59030799
remove from respawn [bar_stalker_respawn_2] object: ammo_12x70_buck30782
remove from respawn [respawn29244] object: ammo_kumul_8235107
remove from respawn [esc2_village_stalker_respawn] object: ammo_kumul_8220253
remove from respawn [esc2_village_stalker_respawn] object: wpn_mossberg59030749
remove from respawn [agr2_boars_respawn] object: mutant_spleen_rat49408
remove from respawn [agr2_boars_respawn] object: mutant_psevdodog_tail32018
remove from respawn [upiter_kogots_respawn] object: ammo_7.62x39_ap46605
remove from respawn [mil_pseudodog_respawn_1] object: bar_to_military
remove from respawn [mil_pseudodog_respawn_1] object: af_buliz28768
remove from respawn [respawn29240] object: mutant_psevdogigant_hand48915
remove from respawn [respawn29216] object: grenade_flash33079


Даже переход попал в список. Обалдеть, что же там творится под конец игры...

 

Пусть будет. Чтобы знали, что проблема есть.
Есть так же более чем одно решение. См. в теме.

 

Кроме того, требуется аналогичная правка не только по респавнерам, но и по смартам. По этой же причине в теме рекомендовано отключение amk_offline_alife - ВСЕ это - вплоть до замены формирования единых таблиц через se_stalker/se_monster/se_item и т.д. dc.

Изменено пользователем Eugen81

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

Вопрос от Марсель:

Доброе время суток. До последнего не решался, но сил нету . зашел так далеко.что или или... Как отключить телепорты Волозара в Варлаабе? откатываться не буду.

Ответ:

@Марсель

Так и напиши - volazar_del_tel.del_nano_tel_war(story_id)

 
Хоть через bind_stalker.script , хоть через ui_main_menu.script , это уж как удобнее и как умеешь.
Делается аналогично выдаче инфопоршня.
 
Телепорты в Варлабе удалятся без следа.
Изменено пользователем shahvkit
Обьединение и удаление
  • Нравится 1
  • Полезно 2

Обидеть Меченого может каждый, не каждый может убежать...

Ссылка на комментарий

Вопрос от Firewind:

Всем привет. Подскажите кто знает в каких файлах находится порог слышимости приёмников на открытых пространствах, например возле Прапора, и где регулируется сама громкость в них когда приближаешься или удаляешься от них? Уже точно не помню, но вроде бы в ТЧ не было этих приёмников на локах, поэтому решил задать этот вопрос здесь.

Ответ:

gamedata\sounds\taler - Кулинар, Воронин, Жила и т.д., там написано в названиях.

gamedata\sounds\characters_voice\scenario\prapor - это у прапора.

Громкость и дальность слышимости регулируется в тегах звуковых файлов программой SAVandT (по моему есть на сайте), ну или в SDK.

Изменено пользователем shahvkit
Обьединение и удаление
  • Спасибо 1
Ссылка на комментарий

Здравствуйте, подскажите по этому вылету:

 

FATAL ERROR

[error]Expression : fatal error

[error]Function : CScriptEngine::lua_error

[error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp

[error]Line : 73

[error]Description :

[error]Arguments : LUA error: c:\obedinennyj pak 2\gamedata\scripts\hotkeys.script:211: attempt to index upvalue 'carbody_addons' (a nil value)

 

Проблема в сборке правок от Каравана http://www.amk-team.ru/forum/topic/12835-op-2-neofitcialnaia-tema/?p=959209. Евген.

 

Понял, благодарю)

 

Почему- то не могу изменить свой пост... 

Этой "ошибки" не будет, если в той же сборке в bind_stalker.script:

function actor_binder:net_spawn(data)
hotkeys.init() -- УДАЛИТЬ ЭТУ СТРОЧКУ! Не место ей здесь!
...
...
function actor_binder:update(delta)
...
eugen.update(delta)
hotkeys.update() -- убрать дубликат! - вызов есть в amk.oau_watchdog=181

 

Изменено пользователем Eugen81
Ссылка на комментарий

А Петрович мне не верит про метки. 8(

Изменено пользователем Dennis_Chikin
Ссылка на комментарий
Гость
Эта тема закрыта для публикации сообщений.
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...