Правки для ОП-2.2
TestTest
Questions
Небольшие правки в виде инструкций
---===---
Правленый движок в ОП-2.2, для игры с правками не нужен. Редактировать fsgame.ltx на чтение из каталога игры, папки gamedata, тоже не нужно, т.к. это уже прописано в оригинальном файле:
$game_data$ = true| true| $fs_root$| gamedata\
Все остальное - суеверия))
$app_data_root$ = true| true| $fs_root$| userdata\
$game_data$ = true| true| $fs_root$| gamedata\
$game_ai$ = true| true| $game_data$| ai\
$game_spawn$ = true| true| $game_data$| spawns\
$game_anims$ = true| true| $game_data$| anims\
$game_levels$ = true| true| $game_data$| levels\
$game_meshes$ = true| true| $game_data$| meshes\
$game_dm$ = true| true| $game_data$| meshes\
$game_shaders$ = true| true| $game_data$| shaders\
$game_sounds$ = true| true| $game_data$| sounds\
$game_textures$ = true| true| $game_data$| textures\
$game_scripts$ = true| true| $game_data$| scripts\
$game_config$ = true| true| $game_data$| config\
$game_huds$ = true| true| $game_data$| skins_ui\huds\
$game_ui_inventory$ = true| true| $game_data$| skins_ui\inventory
$level$ = true| true| $game_levels$
$game_saves$ = true| true| $app_data_root$| savedgames\
$logs$ = true| true| $app_data_root$| logs\
$crash$ = true| true| $app_data_root$| crashes\
$screenshots$ = true| true| $app_data_root$| screenshots\
$game_settings$ = true| true| $app_data_root$| settings\
$mod_dir$ = true| true| $fs_root$| mods\
Если вы решили играть с правками, в первую очередь нужно поставить "Античит". Взять его можно в базе правок. Так же желательно поставить "Отключение счетчиков облегченного прохождения" и смело ими пользоваться - тут вам, без дополнительных правок, и метки на тайники Коллекционера и документы Воронина, и бессмертие - для трудных моментов игры.
Прежде чем ставить правки на ослабление не убиваемых НПС и жутких монстров, а так же при тотальной нехватке всего и вся, возможно стоит попробовать снизить сложность)). Если есть вариант правки с отрубанием какой-то из спорных идей-реализаций, авторов ОП-2.2 и правка с "гуманизацией" этих "фишек" - лучше выбрать 2-й вариант. В остальном - ставьте только то, что вам нужно. Не пытайтесь "накатить" все и сразу. Вы или по неопытности сломаете игру или сделаете ее для себя не интересной.
В gamedata\scripts\ui\ui_load_dialog.script закомментировать двумя тире, эту строчку:
--db.dev_mode=sg:dev_mode()
Правка только скрывает красную надпись! Скрыть факт вмешательства в файлы мода, таким образом не удастся. У каждого сохранения в логе все равно будет приписка: "save created on DEVELOPER mode!". На офф-сайте с таким логом в сохранениях, делать нечего)).
Находим счетчики в скриптах: gamedata\scripts\
В каждом файле по одному, кроме 4-го, в valerich_treasures.script - там их 2.
ui\ui_mm_opt_creator.script - db.god.c[1] = db.god.c[1]+1 --"Бессмертие на некоторое время"
ui\ui_mm_opt_add.script - db.god.c[2] = db.god.c[2]+1 --"Покупка квестового предмета за 200000"
callbacks\key_handlers.script - db.god.c[3] = db.god.c[3]+1 --"Суперпрыжок"
valerich_treasures.script - db.god.c[4] = db.god.c[4]+1 --"Метка на тайник Коллекционера"
kostya_dialog.script - db.god.c[5] = db.god.c[5]+1 --"Метки на документы Воронина"
spawn_level_changer.script - db.god.c[6] = db.god.c[6]+1 --"Телепортация с неограниченным весом"
И приводим их к вот такому виду:
db.god.c[1] = 0
db.god.c[2] = 0
db.god.c[3] = 0
db.god.c[4] = 0 --(2 раза)
db.god.c[5] = 0
db.god.c[6] = 0
При установке правки "Античит" счетчики отрубаются в правке и можно с этим не заморачиваться.
gamedata\config\misc\safe_stealmanager_config.ltx
в самом начале файла:
[StealManager]
enable= true ;ставим false и ничего не платим
protectionCostFirstPay=10000 ;первый взнос в рублях
protectionCostDayPay=5000 ;ежедневный взнос в рублях
bethDistance= 60 ;расстояние для "умного" обкрадывания
traderDistance=6 ;расстояние до торговца с платным хранилищем глобальное
=============
Эта правка не отключит все воровство! Об этом в следующем спойлере.
В script\nsafe\safe_stealmanager.script
найти два места
self.enable=true
self.enable=reader:readBool(self.classname,"enable",true)
и заменить их на
self.enable=false
self.enable=false
Кто-то по уму сделал скрипт, так что если enable=false, то обработка воровства не вызывается.
-----------------
от @voluntas88
============
upd: эта правка "конфликтует" с платными нычками, т.к. полностью отрубает воровство из новых рюкзаков, а с ним, и возможность оплаты нычек у торговцев - не воруют же. Пользуйтесь чем то одним.
gamedata\config\alife.ltx
time_factor = 5
Меняем на сколько нужно; единица вроде будет 1:1 как в реале, 50 - минуты будут меняться на глазах. Для применения эффекта, необходимо поспать.
==========
п.с. следует помнить, что на время завязаны погодные циклы и выброс. Лишний раз "баловаться" изменением этого параметра, не стоит.
gamedata\config\weapons
Добавляем нолик или два, перед единицей для интересующего вас ствола.
fire_dispersion_condition_factor = 5.0 ;1.5 ;увеличение дисперсии в процентах при максимальном износе
misfire_probability = 0.001 ;0.0004 ;вероятность осечки при максимальном износе -меняем тут.
misfire_condition_k = 0.05
condition_shot_dec = 0.00005 ;увеличение износа при каждом выстреле -тут правим износ, так же.
Если такого параметра в конфигах ствола нет, значит он наследуется от базового, для этого типа оружия. Что прописывается в классах. Пример:
[wpn_kriss_m1]:wpn_kriss_super_v - наследует параметры от wpn_kriss_super_v
Дописываем этот misfire_probability и(или) этот, condition_shot_dec параметры ему в конфиг, или меняем у базового, если первое вызывает затруднения.
gamedata\config\creatures\actor.ltx
тщем:
max_item_mass = 80 ;ставь хоть тонну
max_walk_weight = 90 ;столько же как в max_item_mass + 10-50 кг.
gamedata\config\system.ltx
ищем;
max_weight = 80 ; ставим как в max_item_mass
gamedata\scripts\arhara_dialog.script
Добавляем что нужно. Тут пример добавления простого штык-ножа, мед-аптечки, мухомора, пива, консервы и немного)) денег
--' получим аптечку и пм от Звездочёта
function noz_dat()
got("wpn_pm")
got("wpn_6x4_knife")
got("medkit")
got("medkit_scientic",2)
got("mushroom")
got("beer_a")
got("conserva")
got_money(3000)
end
--======================================--
Что-бы выдавал несколько предметов, пишем так:
got("medkit_scientic",3)
будет 3 мед. аптечки
--======================================--
Если хочется все "сделать красиво", правим еще и диалог, в: config\text\dialogs_arhara.xml
Ищем в нем текст: "Ты вот что... Держи аптечку и пистолет. Патронов нет, извини." - и меняем на что угодно, насколько фантазии хватит
gamedata\scripts\treasure.script
Находим этот код:
--' Юзание инициатора (возможность выдать тайник)
function CTreasure:use(npc)
local se_npc = server_object(npc:id())
if se_npc and se_npc.treasure_processed then return end
se_npc.treasure_processed = true
lootmoney.lootmoney(npc)
local rarets=992
-- если выбран редкий тип тайников, то снизим вероятность его выпадения
if math.random(1000) < rarets then
--log("return from use")
return
end
===========================
992 - это процентное соотношение к 1000, т.е. вероятность выпадения тайника: 0,8%. Больше 3% - 970, ставить не стоит. Да и то, только в начале игры, а как прибарахлились, лучше эту правку убрать.
gamedata\config\creatures\actor.ltx
Сделай как тут и будет тебе щастя:
; Физические размеры героя. Позволяет залезать в тесные пространства, например, в трубы.
ph_box0_center = 0.0, 0.9, 0.0
ph_box0_size = 0.35, 0.9, 0.35
ph_box1_center = 0.0, 0.65, 0.0 ; 2-е значение - высота ГГ в присяде
ph_box1_size = 0.3, 0.65, 0.3 ; 2-е значение - высота ГГ в присяде
ph_box2_center = 0.0, 0.4, 0.0 ; 2-е значение - высота ГГ в полном присяде
ph_box2_size = 0.25, 0.4, 0.25 ; 2-е значение - высота ГГ в полном присяде
stalker_restrictor_radius = .05;0.55;0.75;0.9 ; ограничение расстояния между сталкерами. Низкое значение полезно, когда кто-то загородил дорогу в тесных помещениях.
stalker_small_restrictor_radius = .05;
medium_monster_restrictor_radius = 0.1
===========================
Решение в сети гуляет очень давно)))
===========================
По "длинным рукам":
В system.ltx есть параметр take_dist = 2 ;ставь хоть 50 - это и есть расстояние в метрах. Но это может сломать игру. Т.к. тайники, особенно сюжетные, которые трудно взять, завязаны на рестрикторы и нужно именно подходить. Некоторые и не появятся, пока не наступишь на рестриктор, так что особого смысла в увеличении take_dist - нет. Если приперло, видишь но не можешь "дотянуться", поставить только на время проблемы и потом вернуть обратно. На постоянное использование, больше 2.8, лучше не ставить!
--Быстрое лечение, по квесту Доктора + на достижения.(стоит вылечить шесть NPC) --Путь: gamedata\scripts\kostya_dialog.script --Привести функцию к такому виду: function doktor_lekar1_have() if not has_info("doktor_lekar1_start") or has_info("acv_lekar2") then return end local cnt = get_value("lekar",0) cnt = cnt+1 if cnt == 1 then sms("%c[sender]"..translate("name_doktor")..":\\n%c[sms_red]"..translate("sms_doctor_doktor_lekar1_have_1_0"), nil, "doctor", 30000, nil, [[sms\doctor\doktor_lekar1_have_1]]) elseif cnt == 2 then sms("%c[sender]"..translate("name_doktor")..":\\n%c[sms_red]"..translate("sms_doctor_doktor_lekar1_have_2_0"), nil, "doctor", 30000, nil, [[sms\doctor\doktor_lekar1_have_2]]) elseif cnt == 3 then sms("%c[sender]"..translate("name_doktor")..":\\n%c[sms_red]"..translate("sms_doctor_doktor_lekar1_have_3_0"), nil, "doctor", 30000, nil, [[sms\doctor\doktor_lekar1_have_3]]) elseif cnt == 4 then sms("%c[sender]"..translate("name_doktor")..":\\n%c[sms_red]"..translate("sms_doctor_doktor_lekar1_have_4_0"), nil, "doctor", 30000, nil, [[sms\doctor\doktor_lekar1_have_4]]) give_info("doktor_lekar1_have") elseif cnt == 5 then give_info("acv_lekar") elseif cnt == 6 then give_info("acv_lekar2") del_value("lekar") return end set_value("lekar",cnt) end --------------- от @AMK-forum
-- Путь: gamedata\scripts\flamethrower.script -- Найти и сделать как ниже. function mbald_removed_have() local value = get_value("mbald_removed", 0) return value >= 1 ----- БЫЛО 3---------------- ЭКСПЕРИМЕНТЫ ВАСИЛЬЕВА--------------------------------------- end function galant_removed_have() local value = get_value("galant_removed", 0) return value >= 1 ----- БЫЛО 3---------------- ЭКСПЕРИМЕНТЫ ВАСИЛЬЕВА--------------------------------------- end function mincer_removed_have() local value = get_value("mincer_removed", 0) return value >= 1 ----- БЫЛО 3---------------- ЭКСПЕРИМЕНТЫ ВАСИЛЬЕВА--------------------------------------- end --Проверяй. Должно быть достаточно по одной аннигиляции. ----------------- от @lexa.3012
Для тех кого не устраивает фото со спутника могу предложить другой вариант:
В gamedata\scripts\binders смотрим файл bind_fot.script
В строке 468 if iAmMonster[clsid] and obj:alive() убираем and obj:alive()
Это позволит фотографировать убитых зверюшек.
в строках 474, 480, 485 смотрим self:obj_in_shot(obj:center()
Меняем первые две цифры на 0 и 30. Это позволит фотографировать от нуля до 30 метров.
Было:
self:obj_in_shot(obj:center(), 1, 3, 3.0, false, nil, nil, nil, nil, true)
Стало:
self:obj_in_shot(obj:center(), 0, 30, 3.0, false, nil, nil, nil, nil, true)
Для аномалий тоже самое.
Строка 504 if string.find(anom.name, anom_sect) and self:obj_in_shot(anom.pos, 5, 10, 3.5, false, nil, nil, nil, nil, false) then
меняем на if string.find(anom.name, anom_sect) and self:obj_in_shot(anom.pos, 0, 30, 3.5, false, nil, nil, nil, nil, false) then
Всё.
Делать снимки становится гораздо удобнее, и эта правка не вызовет проблем при сдаче задания.
-----------------
Рекомендуемая правка для фотографирования!
от @shahvkit
В xr_kamp.script сделать так:
-- играть на гармошке
local f = false -- item_state_relation["play_harmonica"].allowing(npc,self)
npc_states["play_harmonica"] = f
npc_states["wait_harmonica"] = f
self.kamp_states["pre_harmonica"] = f
self.kamp_states["harmonica"] = f
self.kamp_states["post_harmonica"] = f
-- играть на гитаре
f = false -- item_state_relation["play_guitar"].allowing(npc,self)
npc_states["play_guitar"] = f
npc_states["wait_guitar"] = f
self.kamp_states["pre_guitar"] = f
self.kamp_states["guitar"] = f
self.kamp_states["post_guitar"] = f
-- играть на балалайке
f = false -- item_state_relation["play_balalaika"].allowing(npc,self)
npc_states["play_balalaika"] = f
npc_states["wait_balalaika"] = f
self.kamp_states["pre_balalaika"] = f
self.kamp_states["balalaika"] = f
self.kamp_states["post_balalaika"] = f
-- анекдоты
f = item_state_relation["joke"].allowing(npc,self)
self.kamp_states["pre_joke"] = f
self.kamp_states["joke"] = f
self.kamp_states["post_joke"] = f
-- Если непись знает истории, надо добавить их к лагерю
f = (f and db.story_by_id[npc:id()] ~= nil)
self.kamp_states["story"] = f
self.kamp_states["post_story"] = f
end
end
По аналогии можно анекдоты и истории отключить, но так совсем не весело будет
-----------------
от @tihik
scripts\binders\bind_actor
--loc_radiation.update()
-----------------
от @AMK-forum
scripts\biodetector.script
if item and bioradars[item:section()] and not bind_actor.scopeUsed then
меняем на:
if item and bioradars[item:section()] --and not bind_actor.scopeUsed
then
-----------------
от @shram_437
["x16_physic_object_0004"]=true,
["x16_physic_object_0010"]=true
Меняем на:
["x16_physic_object_0004"]=false,
["x16_physic_object_0010"]=false
Далее, находясь в x16, заходим в настройки/игра, прописываем x16_physic_object_0004 и x16_physic_object_0010 в панель удаления проблемных объектов и удаляем.
scripts\binders\bind_stalker.script
--sak.zombie_checkup()
-----------------
от @AMK-forum
============
Если стоит эта правка, то нельзя получить ачивку Друг зомби.
Убери, правку: В bind_stalker.script, расскомментируй --sak.zombie_checkup(). В \config\text\archievements.xml. найди "Друг зомби" = "acv_fzom". По "acv_fzom", поиском по содержимому, в ТС, найди нужную функцию, в данном случае в sak.script и делай с ней все что угодно(ослабьте эффекты и спокойно играйте!):
function zombie_checkup()
if db.actor ~= nil then
if math_random() > 0.7 and not _G.Inventory:on_belt("af_serpantin") then
local a=math_random()
local h = hit()
h.draftsman = db.actor
h.direction = vector():set(0,0,0)
h:bone("bip01_spine") -- чтобv учитvвалась броня
h.type = hit.telepatic
h.power = 0.3+a/2
h.impulse = 1.0
db.actor:hit(h)
h.type = hit.strike
db.actor:hit(h)
h.type = hit.radiation
db.actor:hit(h)
level.add_pp_effector("alcohol.ppe", 100, false)
local rnd=math_random(1,6)
local snd_obj=voice(hit_sound[rnd])
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
archievements.acv_count_event("acv_fzom", 100, "acv_fzom") -- 1 ставь, бери ачивку и верни --sak.zombie_checkup()
end
==============
Или так, советы от пользователей: Удали правку, заспавни Серпантин и шмонай зомби. Рано или поздно выпадет; Так же, Экза ЧД, Стальной крыс, Нанокостюм Волозара, Дон Кихот - все это защищает от удара при шмоне зомби.
Можно сделать относительно честную правку, раз ачивка "Друг зомби". Вставить проверку поршня в функции
function zombie_checkup()
if db.actor ~= nil then
if math_random() > 0.7 and not _G.Inventory:on_belt("af_serpantin") and not has_info("acv_fzom") then...
и тогда, после обыска с уроном более 100 зомбированных, больше урона по ГГ не будет.
п.с. Если вас парят ачивки, не ставьте правки, отрубающие какие-бы то ни было хиты и прочие условности. Лучше тогда ослабить хиты, до приемлемых и(или) подредактировать условия получения ачивок, а потом, если раздражает, уже можно и отключить. Описание всех ачивок находится в \config\text\archievements.xml - и дальше там не сложно.
scripts\ui\ui_hud_mask.script
Закомментировать(--) строчки:
--level.add_pp_effector ("alcohol.ppe", 2013, true)
--level.remove_pp_effector (2013)
-----------------
от @AMK-forum
scripts\ai\rx_gl.script
stor.can_fire = true ;false
stor.can_fire = true ;false
gamedata\scripts\zvuki.script
Закомментировать как тут показано, эти строки:
if difficulty > 0 then -- hide_wpn.on_info("rm_mp_start") -- local delay_time=db.eat_snd:length()/1000 -- if delay_time<difficulty*3 then -- delay_time=difficulty*3 -- end -- timer("zvuki", delay_time, "zvuki.restore_weapon()") end --if has_info("ui_inventory") then -- level.start_stop_menu(level.main_input_receiver(), true) --end
-- треть¤ рука, пр¤тание оружи¤ при съедании. на новичке не убираетс¤, далее по нарастающей local difficulty = level.get_game_difficulty() if difficulty > 0 then hide_wpn.on_info("rm_mp_start") local delay_time=db.eat_snd:length()/5000 if delay_time<difficulty*0 then delay_time=difficulty*0 end timer("zvuki", delay_time, "zvuki.restore_weapon()") end --[[if has_info("ui_inventory") then level.start_stop_menu(level.main_input_receiver(), true) end]] end end
-----------------
Дополнение: отключение раздражающих звуков приема пищи и др. подобных звуков в этом же файле:
строки 35-74 содержат информацию о звуках. Для "проблемных" звуков удали/закомментируй целую строку, например:
bread = {"zwuk\\inv_sandwich","zwuk\\inv_kolbasa"},
-----------------
от @voluntas88
scripts\monnoroch_options.script
blood_enable = 0 -- эффект ранения (1 - вкл , 0 - выкл)
scripts\ui\ui_hud_mask.script
local blood_enable = 0 -- эффект ранения
scripts\amk\amk.script
-- Эффекты при падении здоровья
if db.actor:alive() then
if prev_health > db.actor.health+0.2 then
level.add_pp_effector("amk_shoot.ppe", 2011, false)
level.set_pp_effector_factor(2011, (prev_health-db.actor.health)*100)
if prev_health > db.actor.health+0.9999 then
local cameffs, sounds
if prev_health > db.actor.health+0.9999 then
-----------------
от @tihik
gamedata\scripts\binders\bind_monster.script
-- Выбивание из рук оружия
local ac_slots={
[inventory_slots.NO_ACT_SLOT]=false,
[inventory_slots.KNIFE]=false,
[inventory_slots.PISTOL]=false,
[inventory_slots.RIFLE]=false,
[inventory_slots.SHOTGUN]=false
}
-----------------
от @AMK-forum
Чтобы убрать этот поносный цвет в Саркофаге. С фонариком невозможно, а без фонарика не видно.
gamedata\config\scripts\sar
Файл - sar_monolith_noise
Сделать так:
active = nil
[sr_psy_antenna]
eff_intensity = 0
hit_intensity = 0
play_visual = false
;mute_sound_threshold = 1
-----------------
от @karavan150
В скрипте bind_actor.script
Найти эту строчку:
any_bot_dis_change=any_bot_dis_change or (is_actor_enemy or is_actor_danger or any_enemy_see_actor)
И заменить на это:
any_bot_dis_change=false
-----------------
от @bastor
Вырезаем алкоголизм ГГ
gamedata\scripts\amk\amk_alcohol.script
-- Алкоголь ГГ. Не более 5 бутылок в сутки.
local alc_cont=keyvals("amk_data"):get("alc_count", {})
function drink_vodka(obj)
table.insert(alc_cont, game.minutes())
local limit = iif(has_info("acv_alk"),6,5)
local sz=table.size(alc_cont)
-- тут вырезаем кусок кода (у кого подсмотрел, не помню)) --
archievements.acv_count_event("acv_alk", 70, "acv_alk")
end
function update()
local gm = game.minutes()
for i=table.size(alc_cont),1,-1 do
if gm > alc_cont+60*24 then
table.remove(alc_cont, i)
end
end
end
-----------------
от @AMK-forum
gamedata\config\weapons\ammo.ltx
у нужных патронов включаем параметр:
tracer = on ; вместо off
Цвет трассера задается этим параметром:
tracer_color_ID = 0
А tracer_color_ID(ID - цвета от 0-4) это цвет трассера.
color_0 ;yellow
color_1 ;white
color_2 ;red
color_3 ;green
color_4 ;blue
Что бы включить трассеры у Винтореза, нужно в файле:
gamedata\config\weapons\w_vintorez.ltx
Их включить:
tracers = on ; вместо off
У именного Винтореза включены по умолчанию.
-----------------
от @RaFaJIb
============
Что-бы работало на статике, нужно выключить сглаживание.
============
Можно разнообразить и немного подкрасить цвета трассеров. Для этого в:
gamedata\config\weapons\weapons.ltx
находим таблицу цветов:
[tracers_color_table] ;color_table
и приводим ее вот к такому виду:
color_1 = 1, 0.5, 0; orange
color_2 = 1, 0, 0; red
color_3 = 0.2, 0, 0; dark red
color_4 = 1, 1, 0; yellow
color_5 = 0.5, 0.1, 1 ; purple
color_6 = 0, 1, 0 ;green
color_7 = 1, 0, 1; magenta
color_8 = 0, 1, 1; cian
color_9 = 0, 0, 0.5; dark blue
color_10 = 0.2, 0.4, 1;blue
color_11 = 0, 0.2, 0 ;dark green
color_12 = 0.5, 0.5, 1; electra
color_13 = 1, 1, 1; white
color_0 = 0.2, 0.2, 0.2; grey
color_14 = 1, 0.5, 0.8 ;pink
В ammo.ltx задаем нужным патронам любой из этих цветов.
-----------------
по наработкам для ОП-2.1 от @Mezocop
Для гравикостюма комментируем строки в gamedata\scripts\hide_wpn.script
Тут: func=function() --запрет на использование слотов вообще --db.actor:hide_weapon() --set_value("hide_wpn_global",true) set_value("gravisak_on",true) end }, ["gravisak_off"]={ func=function() --db.actor:restore_weapon() --set_value("hide_wpn_global",false) del_value("gravisak_on") end И тут: func=function() --if has_value("gravisak_on") then --return --end set_value("hide_wpn_global",false) db.actor:clear_blocked_slots() --после множественных hide_weapon сфорсим очистку m_blockCounter local stored_slot=keyvals():get("active_weapon_slot",inventory_slots.NO_ACT_SLOT) --ключ в контейнере по умолчанию if stored_slot~=inventory_slots.NO_ACT_SLOT then db.actor:activate_slot(stored_slot,true) end end } }
Для маскировочной экзы в режиме невидимости комментируем 2 строки в gamedata\scripts\binders\binder_mon.script
function binder_meceniy_outfit_new:invisibility_on() -- hide_wpn.on_info("gravisak_on") function binder_meceniy_outfit_new:invisibility_off() -- hide_wpn.on_info("gravisak_off")
Подсказал @Купер
По идее должно быть здесь:
binder_mon.script. Просто откомментировать соответствующий обработчик
function binder_meceniy_outfit_new:invisibility_on() --* включили невидимость ... hide_wpn.on_info("gravisak_on") --* выдали поршень для убирания оружия ... end function binder_meceniy_outfit_new:invisibility_off() --* выключили невидимость ... hide_wpn.on_info("gravisak_off") --* выдали поршень для доставания оружия ... end
обработчик вызывается в биндере автора bind_actor.script на инфоколлбэке на инфоколлбэке
function actor_binder:info_callback(npc, info_id) .... hide_wpn.on_info(info_id)
сам обработчик для данного случая hide_wpn.script:
["gravisak_on"]={ func=function() --запрет на использование слотов вообще db.actor:hide_weapon() --* спрятали оружие set_value("hide_wpn_global",true) --* установили триггер set_value("gravisak_on",true) --* и значение переменной end }, ["gravisak_off"]={ func=function() db.actor:restore_weapon() --* достали оружие set_value("hide_wpn_global",false) --* установили триггер del_value("gravisak_on") --* и значение переменной end },
gamedata\scripts\inventory.script
-- Проверка на иммунитеты и удаление с пояса лишних артов
self.imm_limits = {100, 86, 73, 60}
Меняем на
self.imm_limits = {999999, 999999, 999999, 999999}
===
от @Prophet13
gamedata\scripts\amk\amk_alcohol.script
-- Алкоголь ГГ. Не более 5 бутылок в сутки.
local alc_cont=keyvals("amk_data"):get("alc_count", {})
function drink_vodka(obj)
table.insert(alc_cont, game.minutes())
local limit = iif(has_info("acv_alk"),6,5)
local sz=table.size(alc_cont)
-- тут вырезаем кусок кода (у кого подсмотрел, не помню)) --
archievements.acv_count_event("acv_alk", 70, "acv_alk")
end
function update()
local gm = game.minutes()
for i=table.size(alc_cont),1,-1 do
if gm > alc_cont[i]+60*24 then
table.remove(alc_cont, i)
end
end
end
===================================
upd: теперь запасаемся аптечками, хавчиком и получаем "Алкаша" - "acv_alk" - за одну пьянку)))
А что-бы не утомиться 70 пузырей хлебать, убираем лишний нолик)) Ведь настоящим тёртым Сталкерам, алкоголизм и прочие житейские невзгоды - не помеха!
В archievements.script отрубаем(true), если еще это не сделали, на выбор, наличие "негативных" достижений для получения ачивки "Сталкер".
function acv_stalker()
["acv_has_cheated"]=true,
["acv_halavshic"]=true,
["acv_bridge"]=true,
["acv_docs_fail"]=true,
["acv_money3"]=true,
["acv_alk"]=true,
["acv_xam"]=true,
["acv_task_fail"]=true,
["acv_treplo"]=true
Или наоборот - добавляем нолики и бухаем до талого)))
--Путь:gamedata\scripts\binders\bind_monster.script -- Атака собаки function monster_binder:dog_attack() --self:effector(1800, 15, function() --level.add_pp_effector("radiation.ppe", 2012, false) --self:hit(hit.telepatic, 0.05, 0) --self:drop(0.05) --end,"dog_attack") end -- Атака пси-пса из билда 1935 function monster_binder:psy_dog_attack() --self:effector(4000, 20, function() --level.add_cam_effector("build_1935_pseudodog_effect_1.anm", 9901, false, "") --level.add_cam_effector("build_1935_pseudodog_effect_2.anm", 9902, false, "") --level.add_pp_effector("psy_antenna.ppe", 9903, false) --say("monsters\\pseudodog\\psy_affect_0") --self:hit(hit.telepatic, 0.05, 0) --self:drop(0.5) --end,"psy_dog_attack") end
от lexa.3012@
scripts\binders\bind_restrictor.script
function restrictor_binder:net_spawn(data)
...
в самом конце перед return true вставить эту строку:
self.particle = amk_particle.amk_particle({["particle"] = "anomaly2\\gravity_damage_02_smoke", [ "pos" ] = self.object:position()})
return true
end
Делалось для ОП-2, но работает и для других модов. Автор @Eugen81
от @igor.doc
В scripts\binders\bind_actor.script находим секции броников, одев которые, мы не закашливаемся - и вставляем свою броню
-- секции броников, одев которые, мы не закашливаемся при приближении к гниющему трупу local no_cough= { ["merc_scientific_outfit"]=true, -- Научный костюм наёмников ["scientific_outfit"]=true, -- Научный костюм сталкера "Сева" ["dolg_scientific_outfit"]=true, -- Научный костюм Долга ["freedom_scientific_outfit"]=true, -- Научный костюм Свободы ["monolit_scientific_outfit"]=true, -- Научный костюм Монолита ["scientist_suit_white"]=true, -- Белый Научный костюм Монолита ["nebo_scientific_outfit"]=true, -- Научный костюм Чистого Неба ["scientific_lastday_outfit"]=true, -- Научный костюм Последнего Дня ["protection_outfit"]=true, -- Комбинезон ССП-99М "Вега" ["ecolog_outfit"]=true, -- Костюм "Эколог" ["nano_outfit"]=true, -- Стальной Крыс ["nano_suit"]=true, -- Костюм Волазара ["seva_scient_outfit"]=true, -- Модернизированная "Сева" ["exo_scientist_outfit"]=true -- Научный экзоскелет }
от @igor.doc
Экзоскелеты выпадают только после прохождения лаборатории Х-16, как сделать так, что бы экзоскелеты выпадали до прохождения Х-16?
В gamedata\scripts\death_manager.script ищем 441 и 442 строчки, в 442 строчке меняем значение create_allowed=false на true
if config:r_string(sect, "class")=="EQU_EXO" and not has_info("yan_kill_brain_done") then create_allowed=true
Теперь экзоскелеты будут выпадать с начала игры.
от @Daredevil
Загляни в meceniy_in_hell.script там комментарии на русском, должно быть понятно.
от @igor.doc
Кому мешают засветы от изоморфов, нужно в \config\weapons\ammo.ltx
в секциях изоморфных патронов(их там 4 варианта) выставить:
explosive = off ;on
Добавить строчку в секции гравика \config\misc\outfit.ltx
; ГРАВИКОСТЮМ /в Новой редакции/
[soldier_outfit]:outfit
class = EQU_EXO
visual = dynamics\outfit\gravik_suit ;soldier_suit
actor_visual = actors\hero\stalker_gravik_new.ogf
npc_visual = actors\hero\stalker_gravik_new.ogf
inv_name = outfit_gravisak_name
description = outfit_gravisak_description
inv_weight = 13
inv_grid_width = 2
inv_grid_height = 3
inv_grid_x = 38
inv_grid_y = 26
cost = 150000
cheat_item = true
full_icon_name = npc_icon_soldier_outfit
batteries = acumm, akkumulytor
discharge_moving = 0.000001
discharge_sprint = 0.00000115
discharge_jump = 0.00035
snd_cant_sprint = zwuk\ekza_out
snd_cant_jump = zwuk\ekza_out
additional_inventory_weight = 220
additional_inventory_weight2 = 220
sprint_allowed = true
======
Так же и любому, в котором не бегается.
Подскажите где подправить цену перехода из Бара в Ц.П. и на Кордон и обратно?
Комментируем экшены отъёма денег в config\gameplay\dialogs_buusty.xml
<!-- Диалог с БД по поводу доступа к бонусному переходу Ц.Припять-Бар --> ... <text>doktor_perehod_dostup_4</text> <!-- <action>wawka_dialog.give_money_5000</action> --> <next>5</next> <!-- Диалог с Барменом по поводу доступа в его кладовку и подсобку --> ... <phrase id="5"> <text>barmen_podsobka_dostup_5</text> <!-- <action>sak_dialog.give_9000_money</action> --> <next>7</next> </phrase> <phrase id="55"> <precondition>sak_dialog.actor_9000_have</precondition> <text>barmen_podsobka_dostup_5</text> <!-- <action>sak_dialog.give_9000_money</action> --> <next>8</next> <!-- Диалог с Сидором по поводу доступа в его каморку --> ... <phrase id="4"> <precondition>sak_dialog.actor_9000_have</precondition> <text>sidor_podsobka_dostup_4</text> <!-- <action>sak_dialog.give_9000_money</action> --> <next>6</next>
Проверять деньги будут, забирать нет.
от @igor.doc
Небольшой спавнер-помощник в одном файле ui_main_menu.script . Работает из главного меню
Выходим в главное меню и жмем нужные клавиши от 1 до 9
1 - гранаты вог
2- патроны к абакану
3- 5.56
4- граната вороненок
5- туррель стрелка
6- резервная кнопка. тут прописываю что то по необходимости
7-8-9 рем наборы - оружие, броня, хол оружие
N - сделать NPC другом
G - сделать группировку друзьями
F4 - бессмертие
F5 - Смертие(убирает бессмертие)
В принципе Вы можете вставить свои переменные на кнопки
сразу после function main_menu:OnKeyboard(dik, keyboard_action) --virtual function CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) -- local bind = dik_to_bind(dik) if keyboard_action == ui_events.WINDOW_KEY_PRESSED then if dik == DIK_keys.DIK_ESCAPE then if game_is_running() then ui_mm_opt_add.check_options() console:execute("main_menu off") archievements.mm_opt() end --====================мои кнопки --ammo_vog-25p_ammo_5.45x39_ap_ammo_5.56x45_ap elseif db.actor~=nil and dik==DIK_keys.DIK_1 then alife():create("ammo_vog-25p",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) elseif db.actor~=nil and dik==DIK_keys.DIK_2 then alife():create("ammo_5.45x39_ap",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) elseif db.actor~=nil and dik==DIK_keys.DIK_3 then alife():create("ammo_5.56x45_ap",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) elseif db.actor~=nil and dik==DIK_keys.DIK_4 then alife():create("grenade_sg",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) elseif db.actor~=nil and dik==DIK_keys.DIK_5 then alife():create("strelok_turret",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) elseif db.actor~=nil and dik==DIK_keys.DIK_6 then alife():create("detonator",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) --alife():create("wpn_glock21",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) --alife():create("wpn_glock22",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) --alife():create("wpn_glock23",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) --alife():create("wpn_glock25",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) --alife():create("wpn_glock31",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) --alife():create("wpn_glock40",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) --alife():create("wpn_glock35",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) --alife():create("wpn_glock41",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) elseif db.actor~=nil and dik==DIK_keys.DIK_7 then alife():create("repair_item_weapon",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) elseif db.actor~=nil and dik==DIK_keys.DIK_8 then alife():create("repair_item_outfit",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) elseif db.actor~=nil and dik==DIK_keys.DIK_9 then alife():create("repair_item_xo",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) elseif dik == DIK_keys.DIK_N then npc_drug(506) -- story_id НПС из файла config/game_story_ids.ltx 506 - это Петренко --npc_drug(507) --npc_drug(519) --npc_drug(30135) --npc_drug(30136) --npc_drug(30134) --npc_drug(9501) elseif dik == DIK_keys.DIK_G then relations("dolg") --группировка --relations("freedom") --relations("stalker") --relations("green") --elseif dik == DIK_keys.DIK_O then --akill.souls_house_have() --shv() elseif dik == DIK_keys.DIK_F4 then snp.invul_on() elseif dik == DIK_keys.DIK_F5 then snp.invul_off() --==============конец мои кнопки далее кусок официального ui_main_menu else key_handlers.handler_press(dik,dik_to_bind(dik)) end end if keyboard_action == ui_events.WINDOW_KEY_RELEASED then key_handlers.handler_release(dik,dik_to_bind(dik)) end return true end if ui_mm_opt_creator.get_bool_user_param("pause_on_load") then autopause.main() end --в конец файла добавляем описание функций --=====================================мои функции --506 petrenko --507 voronin --519 barin --9501 сяк --9608 = "bar_rostok_james" function npc_drug(ob) -- Делаем непися другом local npc = level_object_by_sid(ob) --( ... ) сюда писать story_id НПС из файла config/game_story_ids.ltx if npc and npc:alive() then npc:set_relation(game_object.friend, db.actor) end end function level_object_by_sid( sid ) local sim = alife() if sim then local se_obj = sim:story_object( sid ) if se_obj then return level.object_by_id( se_obj.id ) end end return nil end function relations(alians) relation_registry.set_community_goodwill (alians, "actor", 3000) end --============================конец мои функции
от @Blum
\scripts\archievements.script
--Приводим функцию function all_ecologs_alive() --к вот такому виду: function all_ecologs_alive() local ecologs = { "bar_ecolog_professor", }
=======
С первой попытки, не извращаясь с переигрываниями и методами прохождения, ГГ вывел 4-х - и этого более чем достаточно, для морального удовлетворения и для игровой "реалистичности".
---===---
Разное из того, что не понятно куда пристроить
21.04.2022 в 18:17, vader_33 сказал:@Tabigon если просто эффект убрать - в файле config\misc\cycle_task.ltx в строчках "condlist =" везде, где есть "-acv_treplo", убираете этот инфопоршень из скобок. Например, было: condlist = {+esc_fanat_spawn -acv_treplo} - оставляете так: condlist = {+esc_fanat_spawn}. Если нужно достижение сталкера - в файле archievements.script в табличке "infos" убираете ["acv_treplo"]=false. Или если знаете как выполнять код через скрипты - просто удалите этот инфопоршень db.actor:disable_info_portion("acv_treplo")
Например, при достижении лимита выдавать какой-нибудь инфопоршень и запускать таймер на его удаление и с обнулением счетчика. В диалоге проверять наличие этого инфопоршня
от @vader_33
Цвет прицела должен меняться только у некоторых из них. В меню игры наведи на описание прицелов при их выборе и почитай.
Что касается непосредственно точки, то если она реализована на базовых линиях - штрихах, то её цвет меняется в system.ltx Если же это отдельная текстура, то надо просто найти её и откорректировать.
Например:
В gamedata\config файл hud_crosshairs.ltx строка 71 - texture=cursors\c_cursor13.dds
То есть в папке \textures\cursors находится файл текстуры c_cursor13.dds где и нарисована белая точка. Достаточно найти файл и перекрасить текстуру.
от @shahvkit
Добрый день, в котике есть функция на кнопку "А" , показ аномалий на миникарте. Есть возможность перенести всё это на большую карту? Делаю квест "Очищение", осталось 5шт, забодался искать уже.
прымерно так:
function show_anomalies()
local anomaly_classes = {
[clsid.zone_acid_fog] = true,
[clsid.zone_electra_s] = true,
[clsid.zone_bfuzz] = true,
[clsid.zone_bfuzz_s] = true,
[clsid.zone_dead] = true,
[clsid.zone_galant_s] = true,
[clsid.zone_galantine] = true,
[clsid.zone_mbald_s] = true,
[clsid.zone_mincer] = true,
[clsid.zone_mincer_s] = true,
[clsid.zone_mosquito_bald] = true,
[clsid.ameba_zone] = true,
[clsid.zone_rusty_hair] = true,
[clsid.torrid_zone] = true,
[clsid.zone_ice_s] = true,
[clsid.zone_zharka_s] = true,
[clsid.zone_radioactive] = true,
[clsid.zone] = true,
[clsid.zone_buzz_s] = true,
[clsid.zone_ice] = true
}
if anoms==nil then
anoms = {}
for i= 1, 65534 do
local obj = level.object_by_id(i)
if obj ~= nil and anomaly_classes[obj:clsid()] then
level.map_add_object_spot(obj:id(), 'red_location', obj:name())
table.insert(anoms, obj:id())
end
end
amk.send_tip("Метки на аномалии установлены.", nil, nil, 5)
end
end
от @nasar75
Вот так пропиши НПС логику по пути: config\scripts\НПС.ltx
[logic]
active = remark1
danger = danger_ignore
[danger_ignore]
ignore_distance = 0 --Или нужную тебе
[remark1]
no_move = true
Будет стоять как вкопанный:))) Дальше думаю и сам знаешь что делать... С all.spawn действительно проблема с запаковкой... Ты в гости-то заходи, а то совсем пропал куда-то...
от @SLAVN
---===---
Мануалы
Что-бы по 25 раз не лазить в файл: \config\misc\cycle_task.ltx, для редактирования хомяков. Все подзадания, для "cube_chip", имеют у себя в условии "+sidor_chip". Соответственно, что-бы отредактировать значения необходимого барахла, ищем по "+sidor_chip". И выставляем необходимое значение по количеству в "target_count = 3", если нужно больше 1-го предмета. Для одного предмета - удаляем эту строчку. В исключениях из этого правила, 4 квестодателя, по ним смотреть и править, где нужно, в заданиях:
Винзор: [025007] - [025017]
Василий: [027000] - [027030]
Загорский: [032000] - [032031]
Халява: [061000] - [061033]
=======
Тут же, во всех заданиях(не только в хомяках), можно редактировать награду. Если что упустил, пишите, дополню. Финальный, 20-й чип у Драгунова за Артефакты, которые завязаны на квесты - спавнить их или редактировать условия получения, не рекомендуется..
=======
По "материалам" спора @achavanin и @igor.doc
Если не примиряет всю группировку, значит функция примирения уже настроила очки до конца(сколько там у тебя в ui_main_menu.script стоит 3000 или 5000 а может и 50000)
Тогда остается мириться с каждым НПС отдельно . В ui_main_menu
elseif dik == DIK_keys.DIK_N then
npc_drug(506) --сюда писать story_id НПС из файла config/game_story_ids.ltx
И в самом низу 2 функции
--506 petrenko
--507 voronin
--519 barin
--9501 сяк
--9608 = "bar_rostok_james"
function npc_drug(ob) -- Делаем непися другом
local npc = level_object_by_sid(ob) --( ... )
if npc and npc:alive() then
npc:set_relation(game_object.friend, db.actor)
end
end
function level_object_by_sid( sid )
local sim = alife() if sim then
local se_obj = sim:story_object( sid )
if se_obj then
return level.object_by_id( se_obj.id )
end
end return nil
end
В \scripts\ui\ui_main_menu.script добавляем внизу файла:
function main_menu:OnButton_load_clicked()
local load_dlg = ui_load_dialog.load_dialog()
load_dlg.owner = self
self:GetHolder():start_stop_menu(load_dlg, true)
self:GetHolder():start_stop_menu(self, true) --new
self:Show(false)
end
--===мирилка с группировкой, функция===--
function relations(alians)
relation_registry.set_community_goodwill (alians, "actor", 3000)
end
--===вместо 3000 ставим сколько надо===--
--===*******************************===--
function main_menu:OnKeyboard(dik, keyboard_action) --virtual function
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
-- local bind = dik_to_bind(dik)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
if game_is_running() then
ui_mm_opt_add.check_options()
console:execute("main_menu off")
archievements.mm_opt()
end
--===мирилка с группировкой, вызов из меню на "G"===--
elseif dik == DIK_keys.DIK_G then
relations("military")
relations("bandit")
--===можно по одной, можно со всеми сразу замириться))===--
--===все группы в \config\creatures\game_relations.ltx===--
--===********************************************===--
else
key_handlers.handler_press(dik,dik_to_bind(dik))
end
end
if keyboard_action == ui_events.WINDOW_KEY_RELEASED then
key_handlers.handler_release(dik,dik_to_bind(dik))
end
return true
end
if ui_mm_opt_creator.get_bool_user_param("pause_on_load") then
autopause.main()
end
--===Комментарии копировать не нужно)))===--
по наводке от @Blum
Всем привет. имел неосторожность через спавнер от Котовода помирить ГГ с военными, теперь они друзья до гроба даже если их мочишь пачками. Как откатить назад?
gamedata /scripts/ui/ui_main_menu
после
function main_menu:OnKeyboard(dik, keyboard_action) --virtual function
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
-- local bind = dik_to_bind(dik)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
if game_is_running() then
ui_mm_opt_add.check_options()
console:execute("main_menu off")
archievements.mm_opt()
end
прописывем
elseif dik == DIK_keys.DIK_N then relations()
после
return true
end
прописывем
function relations(community1, community2)
relation_registry.set_community_goodwill ("military", "actor", -10000)
end
Запуск игры, выход в меню, нажимаем N и военные враги.
от @Kashafoch
Пример на жетоне монолитовца. В gamedata\config\misc\quest_items.ltx находим по army_counter
[army_counter]:II_DOC
visual = dynamics\equipments\geton.ogf
description = army_counter
inv_name = army_counter_name
quest_item = false ;вместо true ставим false
inv_weight = 0.01
inv_grid_width = 2
inv_grid_height = 1
inv_grid_x = 69
inv_grid_y = 16
cost = 100
То же самое можно проделать с любым предметом, даже если этой строчки в его конфиге нет. В таком случае ее нужно добавить. Некоторые предметы могут быть не в quest_items.ltx а в item.ltx
-----------------
от @tihik
Как это реализовано:
В биндер монстров на коллбэк обыска (использования) добавлен обработчик события:
gamedata\scripts\binders\bind_monster.script:
function monster_binder:use_callback(obj, who) ... else ... --* вот это оно и есть: обыскиваем мутанта - запускаем, что будем делать. monster_parts.on_monster_use(obj, who) -- обыск трупа end end
А в самом обработчике события уже всё остальное:
gamedatа\monster_parts.script:
--* список доступного оружия, которое может использоваться для срезания "запчастей" (из оружейных конфигов - по секции предмета). local knives = { ["wpn_oc4"]=true,--* <-- ага, наш ножичек :). gamedata\config\weapons\knife.ltx -> [wpn_oc4]:knife ... ["wpn_hand_axe"]=true }
Далее проверяется его наличие у ГГ:
function actor_has_knife() --* У ГГ в "ножевом слоте" что-то есть? local item_in_slot=db.actor:item_in_slot(inventory_slots.KNIFE) --* Что-то есть и его состояние соответствует нужному для использования if item_in_slot and item_in_slot:condition()>0.1 then --* и оно из нужного нам списка (табл. knives для возможного использования при срезании) return knives[item_in_slot:section()] or false end return false end
А при наступлении события (т.е., когда из биндера монстрюков вызываем обработчик), всё и делаем:
function on_part_take(obj) --* проверяем, что у ГГ именно то оружие, которое должно быть, и запускаем половецкие пляски :) if actor_has_knife() then --* закрываем инвентарь level.start_stop_menu(level.main_input_receiver(), true) --* отыгрываем звуковое сопровождение события if snd and snd:playing() then snd:stop() end snd = voice("zwuk\\inv_mutant_loot_"..math.random(1,16)) snd:play_at_pos(db.actor, vector(), 0, sound_object.s2d) --* в случае, если надо - даём достижение archievements.acv_count_event("acv_gvdr", 500, "acv_gvdr") --* получаем оружие в ножевом слоте local knife=db.actor:item_in_slot(inventory_slots.KNIFE) --* вычитываем из его конфигов коэфф-т повреждения local cond_dec=ini_reader.iniReader():readString(knife:section(),"condition_shot_dec",0) if cond_dec~=0 then --* и "ломаем" до нужного knife:set_condition(knife:condition()-cond_dec) end return end --* тут дальше смк-ки, трансфер в ГГ и т.д. sms("on_part_take_0", nil, "nano", 5000) db.actor:transfer_item(obj, monster) end
от @Купер
Для поиска нужно полностью распаковать все файлы мода или игры в отдельную папку включая все патчи и фиксы.
Поиск будет производиться с помощью программы Total Commander.
Разбираться и знать эту программу совсем не обязательно. Достаточно запомнить расположение всего одной кнопки.
Примеры:
1. Поиск конкретного оружия по его описанию:
Допустим вы прочитали вот такое описание нужного вам ствола
"FN SCAR-Н - боевая штурмовая винтовка калибра 7,62 НАТО, разработанная американским подразделением бельгийской компании FN Herstal в 2004 году. SCAR-H Mk.17 Mod.0 штатно комплектуется съёмными открытыми прицельными приспособлениями, состоящими из складного регулируемого по дальности диоптрического целика и складной же мушки. Кроме того, на винтовку могут устанавливаться любые дневные или ночные прицелы с соответствующими кронштейнами. Приклад у всех вариантов винтовки FN SCAR складной вбок. Ресурс ствола винтовки составляет 16 000 выстрелов и более."
и хотите найти его параметры и прочее.
Для этого открываете Total Commander, а в нём папку с распакованными файлами игры или мода.
Так как параметры предметов находятся в подпапке config, то для ускорения поиска вам нужно открыть уже эту папку config.
Далее нажимаете на иконку с рисунком бинокля в шапке программы, ставите галочку в квадратике "С текстом", и пишите справа от галочки нужный для поиска текст.
В нашем случае мы возьмём вот этот кусочек - подразделением бельгийской компании FN Herstal
ВНИМАНИЕ !!! Текст должен быть абсолютно точным включая пробелы и знаки препинания.
Далее нажимаете кнопку "Начать поиск" и ждёте его окончания.
В результате поиска был найден один файл. Это arsenal_mod.xml
Кликаете 2 раза левой кнопкой мышки на строке с найденным файлом в окне "Результаты поиска", и программа автоматически найдёт вам этот файл.
Далее открываете этот найденный файл в текстовом редакторе (хоть в блокноте) и ищете заданное вами словосочетание - подразделением бельгийской компании FN Herstal
Нужный вам текст идёт под заголовком - <string id="enc_arsenal_scar_cry">
Возвращаетесь в подпапку config, и снова запускаете поиск уже по словосочетанию - enc_arsenal_scar_cry
В результате поиска было найдено два файла, но нам нужен только один расположенный в подпапке config\weapons\arsenal_mod\ar
Это файл w_scar_cry.ltx.
Всё... Мы нашли нужный нам ствол.
Поиск предмета по его названию осуществляется точно также.
2. Поиск неизвестного предмета по фразам в диалогах:
Допустим в разговоре с Кузькиной матерью вы прочитали вот такой диалог
" У меня на Большой Земле племянница сильно заболела. Сестра моя очень упрямая и консервативная в этом вопросе, не признает никакие современные лекарства, и лечит дочку только травами. Я и в Зону-то подалась только из-за этого лекарства. Всё, что нужно, заготовила и спрятала в двух разных местах."
Берём кусочек диалога - У меня на Большой Земле племянница сильно заболела
и ищем по этим словам в папке config.
Находим в config\text\rus файл stable_dialogs_buusty.xml
Открываем его в текстовом редакторе и ищем эту фразу.
Эта фраза идёт под заголовком - <string id="kuzmat_dialog1_5">
Обращаем внимание на характерное слово - kuzmat
Опять запускаем поиск в папке config уже по этому слову.
В результате будет найдено очень много файлов, но нас интересует предмет, а конфиги предметов обычно прописаны в подпапке config\misc
В этой подпапке найдено два файла.
Просматриваем оба на наличие слова kuzmat, и в файле arhara_items.ltx находим нужный предмет.
Это lekarstvo_kuzmat.
Также как и в примере с оружием можно найти тоже самое по названию предмета.
Например вы случайно продали одну банку настойки "Цитомегалия" для Кузькиной матери, и хотите её заспавнить, прописать в продажу и так далее...
Ищем по точному названию предмета. Это слово - Цитомегалия
Поиск вывел название файла содержащего это слово - string_table_enc_equipment.xml
Открываем этот файл, ищем нужное слово и смотрим как оно прописано в файлах игры
<string id="lekarstvo_kuzmat">
<text>Настойка "Цитомегалия"</text>
</string>
<string id="enc_equipment_lekarstvo_kuzmat">
<text>Лекарственный сбор "Цитомегалия". Способствует подавлению вирусной и бактериальной инфекции. Предупреждает и тормозит воспалительные процессы в организме. Повышает иммунитет, оказывает общеукрепляющее, защитное действие. Настоен на чистом спирту. Не употреблять в чистом виде и без особых рекомендаций врача!</text>
</string>
Далее:
Берём например enc_equipment_lekarstvo_kuzmat и снова запускаем поиск уже по этому новому слову.
Получаем наводку на другой файл содержащий конфиги предметов - arhara_items.ltx
Открываем этот новый файл и ищем enc_equipment_lekarstvo_kuzmat
Получаем название предмета:
[lekarstvo_kuzmat]:lekarstvo
description = enc_equipment_lekarstvo_kuzmat
inv_name = lekarstvo_kuzmat
inv_name_short = lekarstvo_kuzmat
Всё...
3. Замена награды в квестах:
Допустим вы хотите заменить автомат выдаваемый Волком на что то другое.
Сохраняемся перед сдачей квеста, сдаём его и смотрим какой автомат получили.
Находим (как описано выше) точное название этого автомата.
Пусть это будет wpn_ak74u.
В папке scripts запускаем поиск по wpn_ak74u
Будет найдено очень много файлов которые придётся просмотреть на предмет нахождения wpn_ak74u.
Ищем наиболее подходящее по смыслу.
Находим требуемое в файле sak_dialog.script.
Это
function take_sescape_lager_volk_ak(first_speaker, second_speaker)
dialogs.relocate_item_section(first_speaker, "wpn_ak74u", "in")
end
Заменяем название оружия в скобочках на нужное.
function take_sescape_lager_volk_ak(first_speaker, second_speaker)
dialogs.relocate_item_section(first_speaker, "wpn_vintorez", "in")
end
Снова загружаем сделанное ранее сохранение, и получаем у Волка Винторез.
Если нужно много предметов, то просто дублируем строку и вставляем нужное.
function take_sescape_lager_volk_ak(first_speaker, second_speaker)
dialogs.relocate_item_section(first_speaker, "wpn_vintorez", "in")
dialogs.relocate_item_section(first_speaker, "wpn_spas12", "in")
end
Если нужны деньги, то добавляем следующее:
dialogs.relocate_money(second_speaker, 10000, "in")
где 10000 - это сумма.
Если нужно много патронов, то добавляем следующее:
sak.create_items_actor("ammo_12x70_kart",9)
где 9 - это количество пачек
Аптечки, гранаты и прочее добавляются точно также.
ИТОГО:
Такими способами можно найти что угодно и где угодно, вплоть до поршней и что вам еще взбредет в голову.
p.s.
В Total Commander есть ещё одна полезная функция - это сравнение файлов по содержимому.
Открываем в левой и правой половинах программы файлы которые вы хотите сравнить. Они должны иметь одинаковое название.
Выделяете нужный вам файл. и в шапке программы под заголовком "файлы" нажимаете на - Сравнить по содержимому...
Изменения в файлах будут выделены другим цветом.
С помощью этого сравнения можно корректировать что угодно. Например подогнать скрипты под новый патч.
p.p.s.
Надеюсь после описанного выше в темах по моду будет поменьше одинаковых и просто осточертевших просьб типа - как называется и где находится...
Ссылка на оригинал инструкции от @shahvkit
Поскольку все давно написано, копипастить не вижу смысла. Но сразу предупреждаю; оно вам не надо. Но если все же возьметесь и осилите - то вы готовый модер)). В теме ковыряния, с такими вопросами, делать нечего. Это скорее в разработку. Но там вас с вероятностью в 99.9%, пошлют. В общем, вот, для желающих самостоятельно разобраться, собранный в один пост мануал от комрада @shahvkit: ссылка
Дабы не спрашивали в дальнейшем, по распаковке архивов игры, все очень просто. Нужен Total Commander и плагины:
wcx_stalker_db_003_x32_x64 - архиваторный плагин. Работает именно с архивами, по одному. Можно ассоциировать каждый тип .db с плагином, и тогда все .db будут открываться по ЛКМ, но проще работать через ctrl+Page Down (выделяя нужный архив и нажимая эти кнопки).
wfx_stalker_db_004_x32_x64 - плагин файловой системы. Позволяет просмотреть сталкерские архивы в виде виртуального каталога с сохранением структуры папок. По идее, гораздо удобнее, но не всегда нужно смотреть и распаковывать все.
Устанавливаются оба плагина, двойным кликом ЛКМ в ТС.
wcx_stalker_db_003_x32_x64 - по ctrl+Page Down работает сразу, но можно заморочиться и прописать ассоциации, для каждого архива ОП-2.2
wfx_stalker_db_004_x32_x64 - по идее тоже должен работать сразу "из коробки". Но если вдруг что-то пошло не так, или у вас ОП-2.2 установлен "в ручную" без записи в реестре, нужно настроить в папке плагина, по TotalCMD\Plugins\wfx\stalker\stalker.ini
Пример настройки stalker.ini для нескольких версий ОП-2.2:
[main] use_registry = 1 [installations] SHOC1 = 3312ru|D:\Games\OP2.2p2origin\ SHOC2 = 3312ru|D:\Games\OP2.2p2mod\ SHOC3 = 3312ru|D:\Games\OP2.2p1orig\
[main]
use_registry = 1
[installations]
SHOC1 = 3312ru|D:\Games\OP2.2p2origin\
SHOC2 = 3312ru|D:\Games\OP2.2p2mod\
SHOC3 = 3312ru|D:\Games\OP2.2p1orig\
Не пытайтесь с помощью этих плагинов изменить или перепаковать игровые архивы! Плагинами можно только просматривать и извлекать файлы игры. Для упаковки можно использовать Конвертер от Bardaka.
---------------
Ссылка - на плагины, инструкцию в .docx, наглядные скрины и рабочий конвертер для упаковки правок для ОП-2.2.
Total Commander - найти в сети актуальную версию, не сложно.
Спрашивали тут про правку на слоты артефактов в инвентаре. По сути ничего не изменилось, как и прежде, если не стоит задачи сделать глобально, под все разрешения и варианты инвентаря, нужно править файл своего разрешения. Только теперь, вариантов инвентаря стало намного больше и лежат они не в config\ui\, а в skins_ui\inventory\ - тут нужно выбрать свой вариант и разрешение инвентаря, в моем случае получается 16х9: gamedata\skins_ui\inventory\default\config\ui\inventory_new_16.xml. Может так же быть и inventory_new.xml и inventory_new_21.xml. Если не планируете менять инвентарь во время игры, то и заморачиваться с вариантами, не нужно. Сам инвентарь нужно выбрать свой, у вас может быть любой из этих:
Дальше все стандартно, нужны вот эти две строки в inventory_new_16.xml:
<!-- *************** Инвентарь ячейки артов ***************** --> <dragdrop_belt x="697" y="285" width="306" height="100" cell_width = "21" cell_height="26" rows_num="3" cols_num="10"> <!-- ******************************************************** -->
В первой строчке, позиция сетки по Х-Y. Их можно немного подкорректировать, но только после выбора и подгонки размера ячеек, обычно на пару пикселей достаточно, что-бы выровнять относительно текстуры.
Вторая строка. Первые 2 цифры "cell_width" - ширина и "cell_height" высота, для других инвентарей и разрешений цифры будут другие и их придется настраивать самому, меняя и загружаясь в игру(из слотов на это время все лучше убрать, хотя это же не ружжо, вылета не будет), что-бы квадратики более-менее ровные получились.
"rows_num" - строки таблицы артефактов, cols_num - столбцы. У меня оптимально, не сдвигая сетку вверх, на описание брони и не опуская вниз, получилось 3х10=30 ячеек. На других разрешениях возможно лучше будет смотреться 2х10 или 3х8, к примеру, или 5х15))), в общем, сколько хотите - столько и пихайте. Но 30 - уже слишком много. Только из эстетических соображений так сделал - смотрится и вписывается, как там и было:
Пока подогнал, раз 10 перезагружался в игру. На этом с сеткой закончили.
Теперь дополнительные ячейки нужно "активировать". Что-бы все 30 ячеек работали, их количество надо прописать в gamedata\config\system.ltx
Строка:
max_belt = 14
вместо 14 ставим свое количество ячеек:
max_belt = 30
На этом настройка панели артефактов завершена.
На худе их отображение лучше отключить - будут "уезжать" с худа. Хотя и это можно настроить, но я всегда панель артефактов и все лишнее с худа убираю и отключение панели считаю оптимальным решением.
Для полного щастя осталось снять ограничения в scripts\inventory.script
Что-бы не мелочиться, делаем так:
self.imm_limits = {100, 86, 73, 60}
меняем на:
self.imm_limits = {999999, 999999, 999999, 999999}
И обвешавшись гирляндой из артефактов, можно смело топать на ЧАЭС-2 кошмарить Когтя смерти и прочих неубивашек
Все волшебство тут, погляди для саморазвития, показометр синий(только кнопки надо свои назначать) спавнер - зеленый.
==============================================
function main_menu:StartGame()
ui_mm_opt_add.check_options()
if (alife() ~= nil) then
console:execute ("disconnect")
end
console:execute("start server(all/single/alife/new) client(localhost)")
console:execute("main_menu off")
archievements.on_new_game()
end
--===спавнер===--
function main_menu:OnButton_load_spawn()
if self.spawn_dlg == nil then
self.spawn_dlg = ui_cheat_naxac.cheat_menu()
self.spawn_dlg.owner = self
end
self:GetHolder():start_stop_menu(self.spawn_dlg, true)
self:GetHolder():start_stop_menu(self, true) --new
self:Show(false)
end
--===спавнер===--
function main_menu:OnButton_save_clicked()
local save_dlg = ui_save_dialog.save_dialog()
save_dlg.owner = self
self:GetHolder():start_stop_menu(save_dlg, true)
self:GetHolder():start_stop_menu(self, true) --new
self:Show(false)
end
function main_menu:OnButton_options_clicked()
local opt_dlg = ui_mm_opt_main.options_dialog()
opt_dlg.owner = self
opt_dlg:UpdateControls()
self:GetHolder():start_stop_menu(opt_dlg, true)
self:GetHolder():start_stop_menu(self, true) --new
self:Show(false)
amk_mod.hud_update = true
end
function main_menu:OnButton_load_clicked()
local load_dlg = ui_load_dialog.load_dialog()
load_dlg.owner = self
self:GetHolder():start_stop_menu(load_dlg, true)
self:GetHolder():start_stop_menu(self, true) --new
self:Show(false)
end
---Показометр адпатация PLK ---
function main_menu:OnKeyboard(dik, keyboard_action) --virtual function
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
-- local bind = dik_to_bind(dik)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
if game_is_running() then
ui_mm_opt_add.check_options()
console:execute("main_menu off")
archievements.mm_opt()
end
elseif
key_handlers.handler_press(dik,dik_to_bind(dik)) then
elseif dik == DIK_keys.DIK_L then
self:OnButton_last_save()
-- лютый котик, ебашит все в онлайне --
elseif dik == DIK_keys.DIK_P then
pokazometr.show_actor_position()
-- показывает барбитуру и коды от дверей --
elseif dik == DIK_keys.DIK_O then
pokazometr.obkolishi_i_barbiturshiki()
-- котик выкашивающих все в радиусе 70м--
elseif dik == DIK_keys.DIK_V then
pokazometr.final_victory()
--- чистильщик трупов, выкашивание трулей, давление жабы, тушение аномалий партиклями --
elseif dik == DIK_keys.DIK_H then
pokazometr.cleaner()
--- лечение, вывод радиации, показ координтатов --
elseif dik == DIK_keys.DIK_NUMPAD4 then
pokazometr.zdoroviy()
--- выдача 100к ---
elseif dik == DIK_keys.DIK_K then
pokazometr.bablo()
--- показ меток на херобору --
elseif dik == DIK_keys.DIK_NUMPAD1 then
pokazometr.set_spots()
--- удаление меток вручную ---
elseif dik == DIK_keys.DIK_NUMPAD2 then
pokazometr.del_spots()
-- показ аномалий на мини-карте --
elseif dik == DIK_keys.DIK_NUMPAD3 then
pokazometr.show_anomalies()
-- набор багфиксов, необходимы тесты --
elseif dik == DIK_keys.DIK_U then
pokazometr.armistice()
-- показ рестрикторов --
elseif dik == DIK_keys.DIK_NUMPAD5 then
pokazometr.show_restrictors()
-- Полёт на болте --
elseif dik == DIK_keys.DIK_NUMPAD6 then
pokazometr.pokaz_stalkerov()
-- показ мобов и сталкеров --
elseif dik == DIK_keys.DIK_M then
pokazometr.show_mobs()
--- нюх на все, отлов обьектов в радиусе 5м с записью лога---
elseif dik == DIK_keys.DIK_NUMPAD8 then
pokazometr.nuh_na_vse()
elseif dik == DIK_keys.DIK_Q then
self:OnMessageQuitWin()
--===спавнер===--
elseif dik == DIK_keys.DIK_S then
self:OnButton_load_spawn()
--===спавнер===--
end
end
if keyboard_action == ui_events.WINDOW_KEY_RELEASED then
key_handlers.handler_release(dik,dik_to_bind(dik))
end
return true
end
if ui_mm_opt_creator.get_bool_user_param("pause_on_load") then
autopause.main()
end
==============================================
==============================================
==============================================
Если хочется несколько спавнеров, делаем так:
--===спавнеры===--
function main_menu:OnButton_load_spawnnaxac()
if self.spawnnaxac_dlg == nil then
self.spawnnaxac_dlg = ui_cheat_naxac.cheat_menu()
self.spawnnaxac_dlg.owner = self
end
self:GetHolder():start_stop_menu(self.spawnnaxac_dlg, true)
self:GetHolder():start_stop_menu(self, true) --new
self:Show(false)
end
-----------------
function main_menu:OnButton_load_spawnkot()
if self.spawnkot_dlg == nil then
self.spawnkot_dlg = spawner.spawn_items_dialog()
self.spawnkot_dlg.owner = self
end
self:GetHolder():start_stop_menu(self.spawnkot_dlg, true)
self:GetHolder():start_stop_menu(self, true)
self:Show(false)
end
--=============--
--******************************--
--===спавнеры===--
elseif dik == DIK_keys.DIK_S then
self:OnButton_load_spawnnaxac()
--==============--
elseif dik == DIK_keys.DIK_D then
self:OnButton_load_spawnkot()
--===спавнеры===--
( Батник для запуска игры на двух и более ядрах, используется встроенный виндовый affinity.exe ):
Если включен SMT (AMD) или Hyper-Threading (Intel) то ключи запуска подбираются исходя из:
CPU0 - первое ядро
CPU1 - это "поток" SMT или Hyper-Threading (Intel) - первого ядра
CPU2 - второе ядро
СPU3 - это "поток" SMT или Hyper-Threading (Intel) второго ядра
и т.д. - т.ё. нечетные это будут виртуальные ядра гипертрейдинга.
У себя использую ключ 0с
Пример - C:\Windows\System32\cmd.exe /C start /affinity 0c XR_3DA.exe -nointro
Чтобы убрать вырвиглазный значек запуска ярлыка батника меняем его на значек ОП2.2.iso из папки /bin
Будет оптимальным так же перенести выполнение процесса видеодрайвера тоже на другое ядро, т.к. винда очень любит вешать всё подряд на CPU0(1).
Как это сделать и не только показано здесь - ссылка на видео по игровой оптимизации 10-ки: youtube (см. внимательно, старые скрипты прошу не юзать, использовать только то что вам нужно)
OS - Windows Server 2022 Standard, HD-pack 2.2, микрофризов не вижу, R5 3600X, 2070s, 2K разрешение, качество максимальное, игра ест больше 6Gb оперативы, проблем нет.
а есть правка на принудительное включение переходов?
--Любой переход можно заспавнить через ui_main_menu.script. Вот как выглядит функция спавна перехода ЗЛ-ТД:
function td_from_puzir_spawn() --в релизе его можно было просохатить.
А вот что нужно вписать в ui_main_menu:
elseif dik == DIK_keys.DIK_F11 then
buusty_dialog.td_from_puzir_spawn()
Т.е. имя скрипта и функции, через точку. Ищи по содержимому, по подобию. А вообще, с такими траблами, как и советуют, лучше переиграть.
--===--
Сделал таблицу с ЦЗ. Она более полная и точная, чем существующая. Добавил для задания типа "Уничтожить лагерь" кого и сколько нужно уничтожить. Пометил одноразовые задания, приоритеты и тд.
Циклические задания и цепочки онлайн-таблица от@warlordnazar
В данной таблице находится информация обо всех циклических заданиях(ЦЗ) в игре.
Список циклических заданий в онлайн таблице, с возможностью комментирования
Переспавн убитых квестовиков
Этот раздел можно пропустить, т.к. для переспавна не важно состояние НПС, жив, мертв или сгинул-потерялся - по spawn_id переспавнится в точку входа в игру.
Привет всем, перед тем, как сделать переспавн квестовиков, нужно убедится, действительно ли пропал нпс. Для этого ставьте ему маячок и посмотрите, где он. Для этого:
gamedata /scripts/ui/ui_main_menu
-----после ---------
function main_menu:OnKeyboard(dik, keyboard_action) --virtual function
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
-- local bind = dik_to_bind(dik)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
if game_is_running() then
ui_mm_opt_add.check_options()
console:execute("main_menu off")
archievements.mm_opt()
end
------прописывем---------
elseif dik == DIK_keys.DIK_1 then --1 условное число, можете любую свободную букву прописать.
add_spot()
---------затем, после ------------
return true
end
------прописывем -------
function add_spot()
local sid = 6
local obj = alife():story_object(19004) --в кавычках пишем story_id с конфигов--game_story_ids--
if obj then
level.map_add_object_spot_ser(obj.id, "blue_location", obj:name())
else
get_console():execute("load ~~~ object with story_id "..tostring(sid).."not found")
end
end
Запуск игры, выход в меню и нажимаем 1, метка установится к нпс. В данном случае Архаре.
gamedata /scripts/ui/ui_main_menu
после
function main_menu:OnKeyboard(dik, keyboard_action) --virtual function
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
-- local bind = dik_to_bind(dik)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
if game_is_running() then
ui_mm_opt_add.check_options()
console:execute("main_menu off")
archievements.mm_opt()
end
прописывем
elseif dik == DIK_keys.DIK_N then
perespawn()
после
return true
end
прописывем
function perespawn()
local obj
for i=1,65534 do
obj = alife():object(i)
if obj and obj:name() == "mil_stalker0012" then
alife():release(obj)
break
end
end
alife():create(7098)
end
Запуск игры, выход в меню и нажимаем N Псих будет на месте. Это на последний патч от 15.03.2023.
от @Kashafoch
Архара №1 patch 15.03.2023(это видимо "первый" Архара на Агропроме, Якута смотрим в конце списка):
if obj and obj:name() == "yakut_agro" then
alife():create(4262)
Архара №2 patch 15.03.2023(это Архара на Затоне):
if obj and obj:name() == "arhara_zaton" then
alife():create(24565)
Архара №3 patch 15.03.2023(есть еще какой-то третий Архара, видимо со сходки авторитетов):
if obj and obj:name() == "arh2_dell2_restrictor" then
alife():create(4206)
Боров patch 15.03.2023:
if obj and obj:name() == "val_lager_bandits_borov" then
alife():create(5188)
Кузнецов patch 15.03.2023:
if obj and obj:name() == "esc_bridge_soldier5" then
alife():create(3005)
Петруха patch 15.03.2023:
if obj and obj:name() == "esc_novice_attacker1" then
alife():create(2965)
Псих patch 15.03.2023:
if obj and obj:name() == "mil_stalker0012" then
alife():create(7098)
Сепатор patch 15.03.2023:
if obj and obj:name() == "esc_hunter_zaschita_2" then
alife():create(3678)
Шерстюк patch 15.03.2023:
if obj and obj:name() == "sak_military_stalker" then
alife():create(4651)
Якут patch 15.03.2023:
if obj and obj:name() == "yakut_agro2" then
alife():create(7017)
p.s. дальше добавляем только name и ID - функция везде одна и та же..
---===---