Кефир 1 027 Опубликовано 2 августа (изменено) Просим, спрашиваем, модифицируем самостоятельно — всё это здесь и по NLC Improved. ↓↓↓ Тема оригинального мода здесь: https://ap-pro.ru/forums/topic/12275-nlc-improved ↑↑↑ Основа, актуальный патч, некоторые разрешённые дополнения именно там. Все патчи мода (Google Drive) Таблица по планам в реализации: Если вы устанавливаете правки, то лишаетесь технической поддержки на официальном сервере в Discord. Спойлер Спавн-меню/Спавнер (для обновления от 31.08.2025): Спойлер А как установить? Закинуть папку mods в папку с игрой. Проверить работоспособность поможет красная надпись в главном меню. ———————————————— Необходимое окно открывается в главном меню на клавишу S. ———————————————— Источник: https://ap-pro.ru/forums/topic/12275-nlc-improved/?do=findComment&comment=472963 Спасибо пользователю alexey61rostov (https://ap-pro.ru/profile/177355-alexey61rostov) за публикацию! (самый точный источник взятого вы увидите в самом меню, спасибо его авторам!) Из своих изменений: Изменил путь до звука, чтобы при нажатии кнопки спавна была рабочая звуковая индикация произошедшего; Сменил клавишу активации для того, чтобы учесть все виды клавиатур. Сохранения где угодно (для обновления от 31.08.2025): Спойлер Я не знаю насколько это работоспособная штуковина на перспективу дальнейшего прохождения игры, но вот. ¯\_(ツ)_/¯ —————————————————————————————————————————————————————————————————————————— РЕКОМЕНДОВАНО НЕ СОХРАНЯТЬСЯ РЯДОМ С СИДОРОВИЧЕМ! ВЫСОК ШАНС ЕГО ИСЧЕЗНОВЕНИЯ! —————————————————————————————————————————————————————————————————————————— 1. А как установить? Закинуть папку mods в папку с игрой. Проверить работоспособность поможет красная надпись в главном меню. ———————————————— А как сделать самому, если я не хлеб с лицом Сенко-сан? 0) Ссылка на распаковщик: https://github.com/mcmilk/7-Zip-zstd/releases/download/v24.09-v1.5.7-R1/7z24.09-zstd-x64.exe Это другая версия 7-Zip, которая может распаковать игровые архивы в этом моде. ———————————————— 1) gamedata/scripts/binders/bind_monster.script Найдите конец файла и добавьте на пустых строчках: bind_monster.misc = {force_offline = function() end} Это исправит исчезновение Сидоровича при загрузке сохранения, сделанного рядом с ним. Подсказал: ap-pro.ru/profile/2634-av661194 (Напомнил, что подсказывал ещё в 2023, но у автора правок деменция: ap-pro.ru/profile/16073-gomes) ———————————————— 2) gamedata/scripts/ogse/ogse_campfire.script Найдите: function check_near_en_flame() if not (_G.flag_can_save and is_actor_alive()) then return end local kamp = get_nearest_active_campfire(db.actor:position(), 10) local obj = kamp and kamp.object if obj and obj:position():distance_to_sqr(db.actor:position()) < DIST_TO_ACTOR then return true end end и замените весь этот текст на: function check_near_en_flame() return (_G.flag_can_save and is_actor_alive()) end ———————————————— 3) Запакуйте файлы любой удобной версией программы в формат xdb. Например, этой: https://disk.yandex.ru/d/qOTsRufrY8ShJw В архиве инструкция по использованию находится в файле read_soc_mp.txt. Затем переименуйте готовый файл и переместите его в папку mods в папке с игрой (если таковой не имеется, то создайте её вручную). ———————————————— Таким образом активируется возможность сохранения через пронумерованные быстрые сохранения (user_quicksave_*, где * — цифра/число), сохранения через отдельные варианты с указанием дня, времени и локации (День *. **-**. названиелокации, где * — номер дня, **-** — игровое время) и через специальное меню в главном меню при загруженной игре. Быстрое открытие рюкзака (для обновления от 31.08.2025): Спойлер 1. А как установить? Закинуть папку mods в папку с игрой. Проверить работоспособность поможет красная надпись в главном меню. ———————————————— 2. В архиве лежит адаптация и для HD-интерфейса. Как ей воспользоваться? Состав бутерброда должен получиться таким: 1) Основной мод; 2) Адд-он на HD-интерфейс; 3) Данная правка для чистой версии; 4) Адаптация для HD-интерфейса. ——————————————————————————————————————————— А как сделать самому, если я не хлеб с лицом Сенко-сан? 0) Ссылка на распаковщик: https://github.com/mcmilk/7-Zip-zstd/releases/download/v24.09-v1.5.7-R1/7z24.09-zstd-x64.exe Это другая версия 7-Zip, которая может распаковать игровые архивы в этом моде. ———————————————— 1) gamedata/scripts/ui/ui_cheat_inv_buttons.script Найдите: --полное открытие рюкзака (долго ковыряется) level.disable_input() --обездвиживаю ГГ vergas_lib.s_play("rykzack\\rykzack_open_long",1) schedule.add("show_full_rucksack", "inv_buttons_use.open_inventory(4)", 4000) razgruzka.open_inventory() -- подготовить инвентарь с скрытием избыточных предметов и замените строчки vergas_lib.s_play("rykzack\\rykzack_open_long",1) schedule.add("show_full_rucksack", "inv_buttons_use.open_inventory(4)", 4000) на: vergas_lib.s_play("rykzack\\rykzack_open_short",1) schedule.add("show_full_rucksack", "inv_buttons_use.open_inventory(4)", 4) ———————————————— 2) gamedata/sounds/rykzack/rykzack_open_short.ogg Данный файл из архива должен быть по пути выше, иначе при открытии рюкзака будет слышен звук по умолчанию. ———————————————— 3) Запакуйте файлы любой удобной версией программы в формат xdb. Например, этой: https://disk.yandex.ru/d/qOTsRufrY8ShJw В архиве инструкция по использованию находится в файле read_soc_mp.txt. Затем переименуйте готовый файл и переместите его в папку mods в папке с игрой (если таковой не имеется, то создайте её вручную). ———————————————— Таким образом активируется возможность быстрее открыть рюкзак. Увеличенный объём ящика (для обновления от 31.08.2025): Спойлер ПРИ БОЛЬШОМ КОЛИЧЕСТВЕ ПРЕДМЕТОВ В ЯЩИКЕ ИГРА НАЧИНАЕТ СЪЕДАТЬ ОПЕРАТИВНУЮ ПАМЯТЬ! ——————————————————————————————————————————— 1. А как установить? Закинуть папку mods в папку с игрой. Проверить работоспособность поможет красная надпись в главном меню. ———————————————— А как сделать самому, если я не хлеб с лицом Сенко-сан? 0) Ссылка на распаковщик: https://github.com/mcmilk/7-Zip-zstd/releases/download/v24.09-v1.5.7-R1/7z24.09-zstd-x64.exe Это другая версия 7-Zip, которая может распаковать игровые архивы в этом моде. ———————————————— 1) gamedata/scripts/binders/bind_physic_object.script Найдите: function generic_physics_binder:reinit() object_binder.reinit(self) db.storage[self.object:id()] = {} self.st = db.storage[self.object:id()] local sec, name = self.object:section(), self.object:name() if sec_confirm(sec, name) == true then self.object:set_callback(callback.on_inv_box_item_take, self.on_inv_box_item_take_callback, self) self.object:set_callback(callback.on_inv_box_item_drop, self.on_inv_box_item_drop_callback, self) self.pos = self.object:position() self.st["max_weight"] = 50 if is_paid_box(self.object:name()) then local add_weight = 50 * math.floor(db.actor:character_rank() / 300) self.st["max_weight"] = 200 + add_weight end end и замените строчки self.st["max_weight"] = 50 if is_paid_box(self.object:name()) then local add_weight = 50 * math.floor(db.actor:character_rank() / 300) self.st["max_weight"] = 200 + add_weight на: self.st["max_weight"] = 999999 if is_paid_box(self.object:name()) then local add_weight = 999999 self.st["max_weight"] = add_weight ———————————————— 2) gamedata/scripts/binders/bind_physic_object.script Найдите: function set_counter(id, rem) local box = id and client_obj(id) if box and not rem then if is_paid_box(box:name()) then local add_weight = 50 * math.floor(db.actor:character_rank() / 300) db.storage[id]["max_weight"] = 200 + add_weight end end и замените строчки local add_weight = 50 * math.floor(db.actor:character_rank() / 300) db.storage[id]["max_weight"] = 200 + add_weight на: local add_weight = 999999 db.storage[id]["max_weight"] = add_weight ———————————————— 3) Запакуйте файлы любой удобной версией программы в формат xdb. Например, этой: https://disk.yandex.ru/d/qOTsRufrY8ShJw В архиве инструкция по использованию находится в файле read_soc_mp.txt. Затем переименуйте готовый файл и переместите его в папку mods в папке с игрой (если таковой не имеется, то создайте её вручную). ———————————————— Таким образом активируется возможность класть больше предметов что в обычные ящики, что в платные. Увеличенный шанс выпадения частей мутантов (для обновления от 31.08.2025): Спойлер Если что-то не устраивает, то снизу будет, насколько это возможно, всё подробно расписано. ———————————————— Изменения относительно оригинальных файлов: • Кровосос (все вариации): — 0.25 → 0.7; • Кабан (все вариации): — 0.2 → 0.7; • Бюрер (все вариации): — 0.2 → 0.8; • Кот (все вариации): — 0.2 → 0.7; • Химера (все вариации): — 0.2 → 1; • Контролёр (все вариации): — 0.7 → 1; • Слепой пёс (все вариации): — 0.2 → 0.7; • Плоть (все вариации): — 0.2 → 0.8; • Псевдогигант (все вариации, кроме квестовых): — 0.75 → 1; • Полтергейст (все вариации): — 0.2 → 1; • Псевдособака (все вариации): — 0.2 → 0.8; • Псевдособака_френд (?): — 0.2 → 0.8; • Снорк: — 0.2 → 0.8; • Тушкан (все вариации, кроме квестовых): — 0.2 → 0.7; • Зомби (все вариации): — 0.25 → 0.75; ———————————————— 1. А как установить? Закинуть папку mods в папку с игрой. Проверить работоспособность поможет красная надпись в главном меню. ——————————————————————————————————————————— А как сделать самому, если я не хлеб с лицом Сенко-сан? 0) Ссылка на распаковщик: https://github.com/mcmilk/7-Zip-zstd/releases/download/v24.09-v1.5.7-R1/7z24.09-zstd-x64.exe Это другая версия 7-Zip, которая может распаковать игровые архивы в этом моде. ———————————————— Список мутантов: 1) m_bloodsucker.ltx — кровососы; 2) m_boar.ltx — кабаны; 3) m_burer.ltx — бюреры; 3) m_cat.ltx — коты; 4) m_chimera.ltx — химеры; 5) m_controller.ltx — контролёры; 6) m_dog.ltx — слепые псы; 7) m_flesh.ltx — плоти; 8) m_giant.ltx — псевдогиганты; 9) m_poltergeist.ltx — полтергейсты; 10) m_pseudodog.ltx — псевдособаки; 11) m_pseudodogfrend.ltx — какие-то другие псевдособаки (?); 12) m_snork.ltx — снорки; 13) m_tushkano.ltx — тушканы; 14) m_zombie.ltx — зомби; ———————————————— 1) gamedata/config/creatures/m_***.ltx (любой файл из названных в списке выше) Через поиск по файлу найдите параметр: Spawn_Inventory_Item_Probability и замените число после знака «=» на любое от 0 до 1 (после точки рекомендую писать только три числа, т.е. десятые, сотые и тысячные). ———————————————— 2) Уточнения: • Если вы делаете редактуру сами, а не используете готовые файлы, то помните, что в одном файле может быть несколько секций мутантов, и у каждой есть своё значение вышеизложенного параметра, поэтому редактируйте файлы с должным вниманием. • Если вы делаете редактуру сами, а не используете готовые файлы, то помните, что в некоторых файлах присутствуют секции с вышеизложенным параметром где значение равно нулю. Рекомендую оставить их как есть и лишний раз не редактировать. ———————————————— 3) Запакуйте файлы любой удобной версией программы в формат xdb. Например, этой: https://disk.yandex.ru/d/qOTsRufrY8ShJw В архиве инструкция по использованию находится в файле read_soc_mp.txt. Затем переименуйте готовый файл и переместите его в папку mods в папке с игрой (если таковой не имеется, то создайте её вручную). ———————————————— Таким образом активируется увеличенный шанс выпадения частей мутантов. Отключение порчи частей мутантов (для обновления от 31.08.2025): Спойлер 1. А как установить? Закинуть папку mods в папку с игрой. Проверить работоспособность поможет красная надпись в главном меню. ———————————————— А как сделать самому, если я не хлеб с лицом Сенко-сан? 0) Ссылка на распаковщик: https://github.com/mcmilk/7-Zip-zstd/releases/download/v24.09-v1.5.7-R1/7z24.09-zstd-x64.exe Это другая версия 7-Zip, которая может распаковать игровые архивы в этом моде. ———————————————— 1) gamedata/scripts/sak/sak.script Через поиск по файлу найдите: local new_cond=0.10 local iitem = obj:get_inventory_item() local iicond = iitem and iitem.item_condition local cond = iicond or data.condition if strpos(nname,"green_kolbasa") then new_cond=0.02 elseif strpos(nname,"kolbasa") then new_cond=0.08 elseif strpos(nname,"mutant_chimera_kogot") then new_cond=0.01 elseif strpos(nname,"mutant_krovosos_jaw") then new_cond=0.08 elseif strpos(nname,"mutant_poltergeist_glas") then new_cond=0.05 elseif strpos(nname,"mutant_hand_kontroler") then new_cond=0.05 elseif strpos(nname,"mutant_psevdogigant_hand") then new_cond=0.05 elseif strpos(nname,"mutant_e_chimera_kidney") then new_cond=0.035 elseif strpos(nname,"mutant_boar_leg") then new_cond=0.025 elseif strpos(nname,"mutant_zombie_hand") then new_cond=0.07 elseif strpos(nname,"mutant_fracture_spleen") then new_cond=0.45 end и замените весь этот текст на: local new_cond=0.0 local iitem = obj:get_inventory_item() local iicond = iitem and iitem.item_condition local cond = iicond or data.condition if strpos(nname,"green_kolbasa") then new_cond=0.0 elseif strpos(nname,"kolbasa") then new_cond=0.0 elseif strpos(nname,"mutant_chimera_kogot") then new_cond=0.0 elseif strpos(nname,"mutant_krovosos_jaw") then new_cond=0.0 elseif strpos(nname,"mutant_poltergeist_glas") then new_cond=0.0 elseif strpos(nname,"mutant_hand_kontroler") then new_cond=0.0 elseif strpos(nname,"mutant_psevdogigant_hand") then new_cond=0.0 elseif strpos(nname,"mutant_e_chimera_kidney") then new_cond=0.0 elseif strpos(nname,"mutant_boar_leg") then new_cond=0.0 elseif strpos(nname,"mutant_zombie_hand") then new_cond=0.0 elseif strpos(nname,"mutant_fracture_spleen") then new_cond=0.0 end ———————————————— 2) Запакуйте файлы любой удобной версией программы в формат xdb. Например, этой: https://disk.yandex.ru/d/qOTsRufrY8ShJw В архиве инструкция по использованию находится в файле read_soc_mp.txt. Затем переименуйте готовый файл и переместите его в папку mods в папке с игрой (если таковой не имеется, то создайте её вручную). ———————————————— Таким образом отключается порча частей мутантов. Отключение порчи артефактов (для обновления от 31.08.2025): Спойлер 1. А как установить? Закинуть папку mods в папку с игрой. Проверить работоспособность поможет красная надпись в главном меню. ———————————————— А как сделать самому, если я не хлеб с лицом Сенко-сан? 0) Ссылка на распаковщик: https://github.com/mcmilk/7-Zip-zstd/releases/download/v24.09-v1.5.7-R1/7z24.09-zstd-x64.exe Это другая версия 7-Zip, которая может распаковать игровые архивы в этом моде. ———————————————— 1) gamedata/scripts/arts/arc_arts.script Через поиск по файлу найдите: local damage = 0.002 if strposx( section, "_buliz" ) then damage = 0.0025 elseif strposx( section, "dummy_" ) then damage = 0.01 elseif strposx( section, "dyn1", -1 ) then damage = 0.005 elseif strposx( section, "dyn2", -1 ) then damage = 0.0025 elseif strposx( section, "dyn3", -1 ) then damage = 0.001 elseif strposx( section, "dyn4", -1 ) then damage = 0.0005 и замените весь этот текст на: local damage = 0.000 if strposx( section, "_buliz" ) then damage = 0.00 elseif strposx( section, "dummy_" ) then damage = 0.0 elseif strposx( section, "dyn1", -1 ) then damage = 0.00 elseif strposx( section, "dyn2", -1 ) then damage = 0.00 elseif strposx( section, "dyn3", -1 ) then damage = 0.00 elseif strposx( section, "dyn4", -1 ) then damage = 0.000 ———————————————— 2) gamedata/scripts/sak/black_tip.script Через поиск по файлу найдите: if not is_gg_away then -- log2("black_tip.discharge: setting low coef, someone is nearby") coef = tonumber(coef) * 0.3 else -- log2("black_tip.discharge: setting high coef, noone is nearby") end for i, id in ipairs (list) do local cv = params.add_condition(id, -0.004 * tonumber(coef)) -- обработка вредной ЧМ, удаление лишних копий и замените весь этот текст на: if not is_gg_away then -- log2("black_tip.discharge: setting low coef, someone is nearby") coef = tonumber(coef) * 1 else -- log2("black_tip.discharge: setting high coef, noone is nearby") end for i, id in ipairs (list) do local cv = params.add_condition(id, -1.5 * tonumber(coef)) -- обработка вредной ЧМ, удаление лишних копий За правку выражаю свою благодарность пользователю walet (https://ap-pro.ru/profile/45301-walet/)! ———————————————— 3) Запакуйте файлы любой удобной версией программы в формат xdb. Например, этой: https://disk.yandex.ru/d/qOTsRufrY8ShJw В архиве инструкция по использованию находится в файле read_soc_mp.txt. Затем переименуйте готовый файл и переместите его в папку mods в папке с игрой (если таковой не имеется, то создайте её вручную). ———————————————— Таким образом отключается порча артефактов. Спойлер Пока что нечего тестировать... Спойлер ПДА Крота через клавишу в главном меню: Спойлер Файл по ссылке необходимо переместить в папку mods (если таковой нет, то создать её). Зайдите в игру, загрузите нужное сохранение; После загрузки сохранения выйдите в главное меню и нажмите F1; Затем зайдите обратно в игру и проверьте инвентарь — в нём должно появиться два таких ПДА. Один оставьте, другой утилизируйте любым удобным вам способом. Возвращение возможности абузить снотворное перед сном: Спойлер Файл по ссылке необходимо переместить в папку mods (если таковой нет, то создать её). Источник Возвращение возможности использования 2D КПК в Лесной Чаще (для обновления от 14.08.2025): Спойлер Файл по ссылке необходимо переместить в папку mods (если таковой нет, то создать её). Источник Уменьшенное время на реализацию действий у НПС: Спойлер Файл по ссылке необходимо переместить в папку mods (если таковой нет, то создать её). Зарядка ПДА: 5 минут Вскрытие капсул: 15 минут Источник Изменено вчера в 05:17 пользователем Кефир 8 3 2 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Новис 60 Опубликовано Среда в 08:23 Подскажите как убрать загрезнения противогаза и поломку его. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Tyrob 6 291 Опубликовано Среда в 09:08 В 01.09.2025 в 23:07, Кефир сказал: Всё должно работать, кроме частей монстров. Что это значит , кроме частей монстра ? Не будут выпадать . Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Кефир 1 027 Опубликовано Среда в 10:41 1 час назад, Tyrob сказал: Что это значит , кроме частей монстра ? Не будут выпадать . Правка «Увеличенный шанс выпадения частей мутантов» не будет работать для новой версии мода от 31.08.2025. Если всё ещё непонятно, то отпишите. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Tyrob 6 291 Опубликовано Среда в 10:59 15 минут назад, Кефир сказал: Правка «Увеличенный шанс выпадения частей мутантов» не будет работать для новой версии мода от 31.08.2025. Если всё ещё непонятно, то отпишите. Всё понял Спасибо за разъяснения . Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vedinov.2023 0 Опубликовано Четверг в 18:15 Всем привет. Подскажите кто шарит, где можно поправить, чтобы Сидор покупал любой хлам и не только? А то одно покупает а другое нет. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
sexys 163 Опубликовано Четверг в 18:28 vedinov.2023 нигде 1 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
slavomir777 12 Опубликовано Четверг в 20:23 2 часа назад, vedinov.2023 сказал: Всем привет. Подскажите кто шарит, где можно поправить, чтобы Сидор покупал любой хлам и не только? А то одно покупает а другое нет. gamedata\config\misc\shop_sidor 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Кефир 1 027 Опубликовано вчера в 05:19 Правки адаптированы под последнее обновление. К повторному скачиванию и переустановке подлежит: Отключение порчи частей мутантов. 1 1 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
zub2608 5 Опубликовано вчера в 11:09 (изменено) Увеличение количества спичек в коробке. Путь: gamedata\scripts\binders\bind_physic_object, ищем local max_cnt_use = 5 -- кол-во спичек в коробке. Меняем на нужную цифру. Далее путь: gamedata\scripts\ui\ui_inv_descr, ищем total_matches = total_matches + (5 - cnt) в обоих файлах цифры должны совпадать. Дополнено 20 минуты спустя В 03.09.2025 в 10:23, Новис сказал: Подскажите как убрать загрезнения противогаза и поломку его. В файле, vergas_masks.script Дополнено 2 минуты спустя Все аптечки на две порции включая антирад, кошачий глаз и снотворное на 10 порций. Ссылка: https://disk.yandex.ru/d/mWGf0TwF_JPzqw Скачанный файл поместить в папку mods Спойлер Аптечки кошачий глаз и снотворное реализованы через папку, scripts файл, allcore_hide там же пытался реализовать антирад у меня не получилось, пришлось реализовать через, scripts\vergas\vergas_medical_elastic, важно антирад который был до правки в рюкзаке не будет работать на две порции пока не появится новый, остальное у меня подхватилось. Снижен до пяти секунд эффект после применения мед препаратов, в оригинале эффект был привязан на всё время лечения медикаментов, реализовано в файле, vergas_medical_elastic. В папке, config\misc\items снижен вес у всех предметов, если кому это не надо, правьте как вам надо, но что бы порционность работала, в секции [antirad]:identity_immunities должна бы строка, max_uses = 2 а так же для всех аптечек , eat_portions_num = 2 и соответственно для таблеток eat_portions_num = 10 Изменено вчера в 13:30 пользователем zub2608 1 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vedinov.2023 0 Опубликовано вчера в 13:39 2 часа назад, zub2608 сказал: В файле, vergas_masks.script Если не сложно, можно конкретней какие строки. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
zub2608 5 Опубликовано вчера в 13:51 (изменено) 15 минут назад, vedinov.2023 сказал: Если не сложно, можно конкретней какие строки. Скрипт менять надо, у меня есть готовый файл но я его ещё не тестил, ещё костюма нет с маской. Увеличил время до четырёх часов на загрязнение и урон по маске снизил в три раза. Спойлер --[[ ƒинамический худ v 4 Vergas © NLC-6.0 имитаци¤ дыхани¤ и расчет зума © AMK ]]-- function attach(sm) sm:subscribe({signal = "on_update", fun = this.update_zoom}) sm:subscribe({signal = "on_update", fun = this.mask_update}) sm:subscribe({signal = "on_actor_before_hit", fun = this.on_actor_before_hit}) -- sm:subscribe({signal = "on_update", fun = this.add_time_dirt_phase}) end local wnd_mask_osnova = nil local wnd_mask local mask_old = "?" local armor_old = "?" local flag_dirt = false local flag_add_dirt = false local flag_blurs = false local flag_zoom = false local mask_on_off local flag_exet_show local tbl_condition local blurs = nil local blurval = 0 local blurlt = 0 local blurcyctime = 0 local blurlastphase = 0 local sch_panel_1 = 0 local sch_panel_2 = 0 local tip_brth = { ["?"] = "wht", ["hud_gas"] = "gas", ["hud_sci"] = "scn", ["hud_mer"] = "gas", ["hud_exo"] = "mil", ["hud_mil"] = "mil", } tip_breath = "wht" local pre_mask = {} function get_mask_config(sect) if pre_mask[sect] == nil then pre_mask[sect] = vergas_lib.set_pr_from_config_str("list_masks", sect) end return pre_mask[sect] end function no_astma_protection() return not mask_on_off end function set_mask_on_off_flag(param) mask_on_off = param end function mask_update() ogse_signals.get_mgr():reschedule(500) effects_control() local mask local armor flag_add_dirt = false if not db.actor then return end if flag_dirt then return end if wnd_mask_osnova == nil then init_mask() end if db.actor.health <= 0 then if mask_old~= "?" then wnd_mask_osnova:SetWndPos(-2000,-2000) mask_old = "?" flag_blurs = false end return end mask, armor = mask_definition() if mask == "?" and mask_old == "?" then return end if armor == "?" and armor_old == "?" then return end if mask~= "?" and armor == armor_old then if mask_on_off == false and mask_old~= "?" then flag_blurs = false if wnd_mask~= nil then wnd_mask:Show(false) flag_blurs=false -- не знаю пока, но по моему именно из-за отсутстви¤ здесь этого влага == 0 по¤вл¤етс¤ запотевание без маски. end mask_old = "?" tip_breath = tip_brth["?"] return elseif mask_on_off == true then if mask_old == "?" or mask_old~= mask then set_mask(mask) wnd_mask:Show(true) flag_blurs = true tip_breath = tip_brth[string.sub(mask,1,7)] end end end if armor == "?" and armor_old~= "?" then if mask_old~= "?" then wnd_mask:Show(false) mask_on_off = false flag_blurs = false mask_old = "?" end armor_old = "?" return end if armor~= armor_old then if mask_old~= "?" then wnd_mask:Show(false) mask_on_off = false flag_blurs = false mask_old = "?" if mask~= "?" then set_mask(mask) end end armor_old = armor return end if armor == armor_old then flag_add_dirt = true end end local ec_flag = "ec_flag" function effects_control() if ec_flag ~= flag_blurs then local flag = flag_blurs and "on" or "off" cmd("r2_visor_refl_control", flag) cmd("r2_rain_drops_control", flag) ec_flag = flag_blurs -- log2("effects_control: %s", tostring(flag)) end end -- local time_upd_d = 360000 / sys_ini:r_float("alife", "time_factor") function add_time_dirt_phase() -- “аймер срабатывает каждые 30Ц40 секунд timers.start_timer("vergas_m_dirt", 0, 0, lua_random(30, 40), "vergas_masks.add_time_dirt_phase()") if mask_on_off == true and flag_add_dirt == true then local armor_custom = set_get_armor_custom(2) local tbl_custom = vergas_lib.str_explode("|", armor_custom, true) if (type(tonumber(tbl_custom[2])) == "number") and tonumber(tbl_custom[2]) < 6 then local tm_dirt = tonumber(tbl_custom[3]) or 0 -- ƒл¤ всех масок одинаково: ~4 часа до первой стадии local base_dirt = 420 if tm_dirt < base_dirt then tm_dirt = tm_dirt + 1 else tbl_custom[2] = tostring(tonumber(tbl_custom[2]) + 1) mask = string.sub(mask, 1, string.len(mask) - 1) .. tbl_custom[2] set_mask(mask) tm_dirt = 0 end set_get_armor_custom(1, tbl_custom[1].."|"..tbl_custom[2].."|"..tm_dirt) end end end function init_mask() local mask local armor if (not blurs) or get_hud():GetCustomStatic("hud_blur1") == nil then blurs = {} -- wprintf(' initalizing mask blur from:\n~C0A %s ~C07', debug.traceback(2, ' ')) for i = 1,4 do get_hud():AddCustomStatic("hud_blur"..i) blurs= get_hud():GetCustomStatic("hud_blur"..i):wnd() --blurs:SetWidth(0) end set_blurs(false) end get_hud():AddCustomStatic("dynamic_hud",true) wnd_mask_osnova = get_hud():GetCustomStatic("dynamic_hud"):wnd() wnd_mask = CUIStatic() wnd_mask:SetAutoDelete(true) wnd_mask:SetStretchTexture(true) wnd_mask_osnova:AttachChild(wnd_mask) wnd_mask:Init(0,0,1024,768) wnd_mask:SetOriginalRect(0,0,1024,768) -- wnd_mask:InitTexture("hud_logo_0_0") if tbl_condition == nil then tbl_condition = {} local i for i = 1, 5 do table.insert(tbl_condition,vergas_lib.set_pr_from_config("list_parameters","condition_"..tostring(i))) end end mask, armor = mask_definition() if mask ~= "?" then mask_on_off = get_value("var_mask_on_off", false) remove_value("var_mask_on_off") if mask_on_off then tip_breath = tip_brth[string.sub(mask,1,7)] or "wht" -- Manool: нужно сразу определ¤ть тип звука, при загрузке, например set_mask(mask) flag_blurs = true else wnd_mask:Show(false) mask_old = "?" end else mask_old = "?" end armor_old = armor if mask_on_off == nil then mask_on_off = false endend function set_mask(mask) if wnd_mask then wnd_mask:InitTexture("verg\\masks\\"..mask) end -- texman.swap_mask(mask) mask_old = mask -- texman.swap_mask(mask)end function mask_condition() local armor = db.actor:item_in_slot(6) if armor then -- local obj = armor:get_outfit() local cval = armor:condition() -- if obj then -- cval = obj:condition_ex(1) -- only mask/head damage -- end local cd, mask_cond = set_get_armor_custom(2) return mask_cond end return -1end function mask_definition() local mask = "?" local cond local n_phase local combez local armor = db.actor:item_in_slot(6) if armor then combez = armor:section() -- local cval = mask_condition() local armor_custom, cval = set_get_armor_custom(2) cond = set_hud_textur(cval) if armor_custom == "" then local ms = get_mask_config(combez) if ms~= "?" then armor_custom = ms.."|" mask = ms mask = mask..cond if tonumber(string.sub(cond, 2,2)) == 1 then n_phase = 1 armor_custom = armor_custom.."1|"..(lua_random(1,6)) else n_phase = lua_random(1,6) armor_custom = armor_custom..n_phase.."|"..(lua_random(1,6)) end mask = mask.."_"..n_phase else mask = "?" armor_custom = "none|none|none" end set_get_armor_custom(1,armor_custom) else local tbl_custom = vergas_lib.str_explode("|",armor_custom,true) if tbl_custom and tbl_custom[1]~= "none" then mask = tbl_custom[1]..cond.."_"..tbl_custom[2] else mask = "?" end end else mask, combez, tip_breath = "?", "?", tip_brth["?"] end return mask,combezend function allcore_mask_is_on() local mask, armor = mask_definition() if mask_on_off and mask ~= "?" then return true end return falseend -- Manool: переделано на spawn_ini, чтобы удобнее было другие-- данные записывать в костюм-- + состо¤ние маски отдельно в кастомдатеfunction set_get_armor_custom(mode, armor_custom) local armor = db.actor:get_current_outfit() if not armor then return end local sobj = g_sim:object(armor:id()) if mode == 2 then local custom, cond = "", 100 local ini = sobj:spawn_ini() if ini and ini:section_exist("mask") then local st1 = get_string("mask", "t1", nil, ini) local st2 = get_string("mask", "t2", nil, ini) local st3 = get_string("mask", "t3", nil, ini) cond = get_u32("mask", "t4", 100, ini) if st1 and st2 and st3 then custom = st1 .. "|" .. st2 .. "|" .. st3 end end return custom, cond / 100 elseif mode == 1 then local tbl_custom = vergas_lib.str_explode("|", armor_custom, true) local ini = sobj:spawn_ini() ini.readonly = false ini:w_string("mask", "t1", tostring(tbl_custom[1])) ini:w_string("mask", "t2", tostring(tbl_custom[2])) ini:w_string("mask", "t3", tostring(tbl_custom[3])) sobj:save_spawn_ini() endend function is_headshot(bone_id) -- ключицы и выше return (bone_id and bone_id > 10 and bone_id < 18)end local function actor_hit_target(hd) local outfit, who, hit_type, hit_power = db.actor:get_current_outfit(), hd.who_id, hd.hit_type, hd.power -- wprintf("[~T]. #DBG: ~C0F actor_hit_target(%d, %d, %d, %.3f)~C07", outfit and outfit:name() or "nil", who, hit_type, hit_power) local obj = (who > 0) and (who < 65535) and client_obj(who) if obj then local rval = lua_random() * 100 local name = obj:name() local clid = obj:clsid() -- wprintf(" outfit_name =~C0E %s~C07, hit_source =~C0F %s~C07, hit_power =~C0D %.3f~C07 ", outfit and outfit:name() or "nil", name, hit_power) -- Sn: все кости смещены на -1 относительно оригинала -- “ушкан или "buzz" Ч бьЄт по нижней половине тела if (clid == CLID_TUSHKANO or strpos(name, "buzz")) then hd.bone_id = lua_random(0, 8) end -- ровосос Ч чаще по голове if (clid == CLID_BLOODSUCKER) then if rval > 33 then hd.bone_id = lua_random(9, 17) -- голова/туловище else hd.bone_id = 13 -- часто по голове end end -- абан Ч 50% по ногам, 50% по туловищу if (clid == CLID_BOAR) then if rval > 50 then hd.bone_id = lua_random(0, 8) else hd.bone_id = lua_random(9, 11) end end -- Ћайтова¤ реакци¤ на попадание в голову: только звук боли if hd.bone_id > 11 and hd.bone_id < 18 and hd.power >= 0.2 then local snd_obj = xr_sound.get_safe_sound_object([[actor\pain_3]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) end endend function on_actor_before_hit(obj, hd) actor_hit_target(hd) -- Manool: это вызывать ѕ≈–≈ƒ хитом по маске! local ht = hd.hit_type if ht == hit.telepatic or ht == hit.radiation then return end local out = is_headshot(hd.bone_id) and (get_flag_mask() == true) and db.actor:get_current_outfit()if out then -- Коэффициент прочности маски: 0.3 = в 3,3 раза медленнее ломается local mask_damage_scale = 0.3 set_mask_condition(out:id(), -hd.power * mask_damage_scale)endend function set_default_cd(id) local armor = client_obj(id) if armor then local sec = armor:section() local ms = get_mask_config(sec) if ms~= "?" then local sobj = server_obj(armor:id()) if sobj then local ini = sobj:spawn_ini() ini.readonly = false local rnd = lua_random(1,6) ini:w_string("mask", "t1", tostring(ms)) ini:w_string("mask", "t2", tostring(1)) ini:w_string("mask", "t3", tostring(rnd)) sobj:save_spawn_ini() end end endend function set_mask_condition(id, cond, force_mode) if type(id) ~= 'number' then id = tonumber(id) cond = tonumber(cond) if force_mode then force_mode = tonumber(force_mode) end end local sobj = id and server_obj(id) local ini = sobj and sobj:spawn_ini() if not ini then return end local curr = ini:section_exist("mask") and get_u32("mask", "t4", 100, ini) or 100 curr = curr + cond if curr < 0 then curr = 0 end -- normalize if curr > 100 then curr = 100 end ini.readonly = false if force_mode then ini:w_u32("mask", "t4", cond) else ini:w_u32("mask", "t4", curr) end sobj:save_spawn_ini()end function get_mask_condition(id) local sobj = id and server_obj(id) local ini = sobj and sobj:spawn_ini() return ini and ini:section_exist("mask") and get_u32("mask", "t4", 100, ini) or 100end function set_hud_textur(condition) local m_s -- ∆Єстко задаЄм пороги пр¤мо в коде -- «начени¤ в дол¤х (1.0 = 100%) local cond1 = 0.85 -- _1 Ч чиста¤ local cond2 = 0.65 -- _2 Ч лЄгкие царапины local cond3 = 0.45 -- _3 Ч заметные повреждени¤ local cond4 = 0.35 -- _4 Ч сильные царапины/гр¤зь local cond5 = 0.30 -- _5 Ч трещины начинаютс¤ if condition > cond1 then m_s = "_1" elseif condition > cond2 then m_s = "_2" elseif condition > cond3 then m_s = "_3" elseif condition > cond4 then m_s = "_4" elseif condition > cond5 then m_s = "_5" else m_s = "_6" end return m_sendfunction get_flag_mask() return mask_on_offend function on_off_mask() local out = db.actor:get_current_outfit() local ms = out and get_mask_config(out:section()) or "?" if ms == "?" then return end sak.actor_hide_weapon() local timeout = 50 --schedule.add("off_eye", "vergas_masks.on_off_mask_eye()", 1500) if mask_on_off == false then local mask, armor = mask_definition() if mask ~= "?" then tip_breath = tip_brth[string.sub(mask,1,7)] local sound = "device\\masks\\"..tip_breath.."_on" snd_obj = xr_sound.get_safe_sound_object(sound) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 0.5) timeout = 2000 end end schedule.add("off_mask", "vergas_masks.on_off_mask_end()", timeout) flag_blurs = falseendfunction on_off_mask_eye() level.add_pp_effector("black_q.ppe", 1237, false)endfunction on_off_mask_end() local timeout = 50 if mask_on_off then -- выключение маски mask_on_off = false local sound = "device\\masks\\"..tip_breath.."_off" snd_obj = xr_sound.get_safe_sound_object(sound) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1) timeout = 1300 nvd_params.off_pnv() else mask_on_off = true end schedule.add("off_mask_end", "sak.restore_weap()", timeout) flag_blurs = false end function save_mask_on_off() set_value("var_mask_on_off", mask_on_off)end function update_zoom() ogse_signals.get_mgr():reschedule(53) if mask_on_off then local act = get_actor_obj() if act and act:is_zoom_aiming_mode() then if flag_zoom then return else mask_zoom_stretchy(true) end else if flag_zoom then mask_zoom_stretchy(false) else return end end endend --[=[]]local d_fov = 67.49function update_zoom() ogse_signals.get_mgr():reschedule(53) if mask_on_off then local fov_n = device().fov local dlt = d_fov-fov_n if dlt>0.1 then d_fov = fov_n if flag_zoom then return else mask_zoom_stretchy(true) end elseif dlt<-0.1 then d_fov = fov_n if flag_zoom then mask_zoom_stretchy(false) else return end end endend--]=]function mask_zoom_stretchy(param) if param then local wpn = db.actor:active_item() if not wpn then return end if wpn:is_binoculars() then wnd_mask:Init(-512,-384-192,2048,1536+384) elseif wpn:is_weapon_magazined() then wnd_mask:Init(-512,-32,1536,800) end flag_blurs = false flag_zoom = true else wnd_mask:Init(0,0,1024,768) flag_blurs = true flag_zoom = false endend function update_blurs() set_blurs(flag_blurs)end function set_blurs(enabled) local rect = set_zoom_stretchy_rect() if not blurs then return end if not enabled then for i = 1,4 do if blurs then blurs:SetWidth(0) end end return end local power = db.actor.power local period = 1.0+power^2 -- текуща¤ частота дыхани¤ от 30 до 120 циклов в минуту local expirt = 0.3 local breathpower = 3 local delta = (time_global()-blurlt)/1000 local phase = (time_global()-blurcyctime)/1000 blurlt = time_global() if phase>period then phase = phase%period blurcyctime = blurlt-phase*1000 end if blurlastphase>phase then blurlastphase = 0 end local blurdelta = delta*-0.7 if blurlastphase<expirt and phase<expirt then blurdelta = blurdelta+(phase-blurlastphase)*breathpower elseif blurlastphase<expirt then blurdelta = blurdelta+(expirt-blurlastphase)*breathpower end blurlastphase = phase blurval = blurval+blurdelta if blurval>0.999 then blurval = 0.999 elseif blurval<0 then blurval = 0 end local tm = math.floor(blurval*3) local tmn = (tm+1) local v = blurval*3-math.floor(blurval*3) v = 1-v local v1 = 1-v if tm~= 0 then blurs[tm]:SetColor(GetARGB(v*255,255,255,255)) end if tmn~= 0 then blurs[tmn]:SetColor(GetARGB(v1*255,255,255,255)) end for i = 1,4 do if i == tm or i == tmn then blurs:SetWndRect(rect.x,rect.y,rect.w,rect.h) else blurs:SetWndRect(rect.x,rect.y,0,0) end endend local con_fov = get_console():get_float("fov") or 67.5function set_zoom_stretchy_rect() local zoom = con_fov/device().fov zoom = (zoom-1)*1.5+1 if zoom<1.001 then zoom = 1.001 end local stretchy = 0.75/(math.floor(device().aspect_ratio*1000)/1000) if stretchy<1 then stretchy = 1 end local rect = {x = -768*zoom+768,y = (-512*zoom+512)*stretchy-(stretchy-1)*300,w = 1024*zoom,h = 768*zoom*stretchy} return rectend function set_flag_dirt(param) flag_dirt = paramendfunction replace_dirt_phase() local armor = db.actor:item_in_slot(6) if armor then local armor_custom = set_get_armor_custom(2) if armor_custom ~= "none|none|none" then mask_clearing() local t = vergas_lib.str_explode("|",armor_custom,true) local number_dirt_phase = tonumber(t[2]) number_dirt_phase = number_dirt_phase - lua_random(2) if number_dirt_phase < 1 then number_dirt_phase = 1 end armor_custom = t[1].."|"..tostring(number_dirt_phase).."|0" set_get_armor_custom(1,armor_custom) else vergas_lib.s_play("device\\masks\\water_flask",5) end else vergas_lib.s_play("device\\masks\\water_flask",5) endend function mask_clearing() vergas_lib.s_play("device\\masks\\mask_"..lua_random(1,5),1) schedule.add("clean_end", "vergas_masks.mask_clean_end()", 1500) end function mask_clean_end() level.add_pp_effector("black_off_slowly.ppe", 2121, false) schedule.add("cleaned_end", "vergas_masks.mask_cleaned_end()", 4000) schedule.add("flask_end", "sak.restore_weap()", 9000) end function mask_cleaned_end() used_items.set_get_flag_use_gadget(1,true) flag_dirt = false mask_old = "?" end function fill_flask() local i,j,k local flag_fill = false local portions_of_water = vergas_lib.set_pr_from_config("flask_army","portions_of_water") level.disable_input() bind_stalker.hide_weapon() for i,k in pairs(sak_inventory.rucksack) do if i == "flask_army" or i == "flask_army_on_belt" then for j = 1, table.getn(k) do local d_custom = tonumber(vergas_flask.set_get_flask_custom(2,k[j])) --if d_custom ~= portions_of_water then vergas_flask.set_get_flask_custom(1,k[j],tostring(portions_of_water)) vergas_flask.replace_flask_weight(k[j],tostring(portions_of_water)) flag_fill = true --end end end end if flag_fill then vergas_lib.s_play([[ambient\waterflow]],1) timers.start_timer("fill_timer",14,"vergas_masks.end_fill_timer()") --запускаю таймер sak.send_tip(game.translate_string("fill_flask_1"),game.translate_string("fill_flask_2"), 1, 10, "g_g", "sak", "sky_blue") else sak.send_tip(game.translate_string("fill_flask_3"),game.translate_string("fill_flask_4"), 1, 10, "g_g", "sak", "red") vergas_lib.s_play([[device\masks\water_no]],1) bind_stalker.restore_weapon() level.enable_input() endend function end_fill_timer() bind_stalker.restore_weapon() vergas_lib.s_play([[device\masks\water_ok]],1) level.enable_input()end Изменено вчера в 13:57 пользователем zub2608 1 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
zub2608 5 Опубликовано 7 часов назад Кому надо увеличить шанс на разведения костра смотрим файл, gamedata\scripts\binders\bind_physic_object Спойлер local rnd = 40 -- базовый шанс разжечь костёр, if black_tip.have_black_tip() then rnd = 30 если у игрока есть "чёрная метка", шанс снижается до 30%. rnd = rnd - (10 + (level.rain_factor() * 10)) -- если идёт дождь шанс уменьшается на 10% rnd = rnd + 8 -- если игрок находится под землёй, шанс увеличивается. на 8% правим как вам надо, незабываем сказать спасибо мелочь но приятно. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
TimSoier 25 Опубликовано 1 час назад (изменено) 6 часов назад, zub2608 сказал: Кому надо увеличить шанс на разведения костра смотрим файл, gamedata\scripts\binders\bind_physic_object инструкция (Скрыть контент) !!! Спасибо !!! мелочь но приятно.....👌 Изменено 1 час назад пользователем TimSoier 2 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты