Last_Dawn 86 Опубликовано 17 Октября 2025 Говорим с любым NPC, убираем метки отрядов на карте. Возможно будут подводные камни при traveller-телепортации, но я пока не тестил, лень. Сами разберёте. Код этот тестил конечно, лол. Скрытый текст Убираем метки. Спс DeepSeek. Файл sim_squad_scripted.script function sim_squad_scripted:refresh() -- Убрать метку лидера отряда self:hide() --if(self:commander_id()==nil) then --self:hide() --return --end --self:show() end В sim_squad_scripted:hide закомментировать -- Убрать метку лидера отряда --if self.show_disabled then --self:hide() --return --end -- Убрать метку лидера отряда --if self.current_spot_id ~= self:commander_id() then --self:hide() --self.current_spot_id = self:commander_id() --self:show() --return --end С меткой всё, теперь у лидера будет точка. Теперь в xr_meet.script Ищем по is_squad_commander Пример: def.use = "{=is_wounded} false, {!is_squad_commander} false, {=actor_enemy} false, Стираем {!is_squad_commander} false, Остаётся "{=is_wounded} false, {=actor_enemy} false, И так далее, стираете там где вам нужно все преконды is_squad_commander. В gulag_general.script тоже самое, ищем по is_squad_commander, стираем. Чтобы NPC адекватно реагировали на диалог и не сбегали, идём в xr_patrol.script После функции PatrolManager:update Ставим новую: -- Кто-то в отряде говорит с игроком function PatrolManager:is_anyone_in_meet() for id, data in pairs(self.npc_list) do local npc = data.soldier if npc and npc:alive() then local in_meet = xr_meet.is_meet(npc) local is_talking = npc:is_talking() if in_meet or is_talking then return true end end end return false end В функции action_commander:execute сразу под строкой (можно и не под строкой, а под названием сразу) action_base.execute(self) Добавляем: if patrols[self.st.patrol_key]:is_anyone_in_meet() then state_mgr.set_state(self.object, "guard") return end В функции action_patrol:execute Сразу под строкой action_base.execute (self) Добавляем: if patrols[self.st.patrol_key]:is_anyone_in_meet() then state_mgr.set_state(self.object, "guard") return end Идём в xr_reach_task.script Всё тоже самое, после PatrolManager:update добавляем: function PatrolManager:is_anyone_in_meet() for id, data in pairs(self.npc_list) do local npc = level.object_by_id(data.soldier) if npc and npc:alive() then local in_meet = xr_meet.is_meet(npc) local is_talking = npc:is_talking() if in_meet or is_talking then return true end end end return false end Сразу под function action_reach_task_location:commander_execute() Добавляем: if patrols[self.target_id.."_to_"..self.squad_id]:is_anyone_in_meet() then self.object:set_movement_type(move.stand) return end Сразу под: function action_reach_task_location:soldier_execute() Добавляем: if patrols[self.target_id.."_to_"..self.squad_id]:is_anyone_in_meet() then self.object:set_movement_type(move.stand) return end Поделиться этим сообщением Ссылка на сообщение
Last_Dawn 86 Опубликовано 9 Декабря 2025 (изменено) Нормальный уборщик трупов (никаких отдельных клинеров), навайбкожено Gemini. Проверялось на IX-Ray, теоретически пойдёт под любой сталкер ЗП (дефолтные параметры, значения, вызовы использовались). Почему теоретически? Дефолтный движок может быть более восприимчив к некоторым ошибкам, если они есть. Судя по тестам проблем никаких нет, проверялось всё, вылетов не было за несколько прохождений. Скрытый текст Метод on_item_take Пишем в нём -- Убираем выброшенный предмет из менеджера если снова подобрали release_body_manager.get_release_body_manager():remove_from_table(obj_id) Метод on_item_drop -- Передаем выброшенный предмет в менеджер очистки release_body_manager.get_release_body_manager():add_player_drop(obj) Метод update release_body_manager.get_release_body_manager():update() Что может и что делает? Удаляет спустя время трупы NPC и NPC-мутантов, оружие NPC-людей (кроме уникального story_id, нетипичное name), предметы выброшенные актором (кроме уникальных со story_id), уникальные трупы со story_id. Скрытый текст - IDLE_AFTER_DEATH: По дефолту действует таймер в 300000 (5 минут реала?) - MAX_CAPACITY: Лимит объектов 20+1 (можно уменьшить, удаляет всё что свыше этого числа) - MIN_DIST_TO_RELEASE_SQR: Минимальная дистанция до удаления 2500 (в квадратах, по итогу 50 игровых метров), сначала удаляет самое дальнее от актора. - UNLOCK_DIST_SQR: Минимальная дистанция, на которую надо подойти чтобы занести npc со story_id в таблицу на удаление 9 (в квадрате, по итогу 3 метра) - WEAPON_SCAN_INTERVAL можно не трогать. Как часто сканирует локацию на предмет бесхозного оружия, поскольку вызов мы прописали в update таймер нужен, чтобы сильно не грузить игру. Присутствует проверка по имени, так что он не удалит пушки, лежащие на уровне. Таймер обнуляется после сейвлоада, чтобы не было такого "я сохранился возле горы лута пушек и трупов, а после перезагрузки ничего нет". Принудительная форсированная очистка предмета если актор не находится на уровне, на котором находится предмет (он должен быть именно на другом уровне, так что во время перезагрузки того же уровня ничего не удаляет, всё ок). ВСЕ те же правила что выше действуют и на оружие, и на предметы актора. Что такое вообще эти 3 метра для уникальных трупов NPC со story_id? Ну короче лежит у вас например труп Тремора или Глухаря и он никогда не удалится. Игрок приблизился к нему на расстояние в 3 метра, теперь для него начинают действовать те же правила что и на любой труп (без story_id) и он удалится спустя время и расстояние. Трупы с уникальными предметами из keep_items по прежнему лежат вечно, пока не вынем предмет. Что такое предметы актора? Всё что он выкинул из инвентаря через коллбэк on_item_drop заносится в таблицу на удаление под общие правила. Если предмет подобран снова через on_item_take, он соответственно удаляется (чтобы не было такого, что я выложил батон колбасы, подобрал, а он просто исчез из инвентаря). https://disk.yandex.ru/d/VdfSNyJvFviROg Не забудьте прописать у себя трупам story_id. В дефолтном ЗП это например мёртвые военные у вертолёта Скат в железном лесу и военный Шлячин, подорвавшийся на минном поле (может ещё есть, не помню), иначе они удалятся раньше, чем вы до них дойдёте по сюжету (роли они в принципе не играют, но всё же). Изменено 9 Декабря 2025 пользователем Last_Dawn 1 Поделиться этим сообщением Ссылка на сообщение