Этот мод для тех, кто хочет, чтобы их колонисты вели себя профессионально, обращаясь с взрывчатыми веществами. Избежание дружественного огня - ключевая особенность.
Улучшенное обращение с гранатами v1.1.3
Если вы столкнетесь с какими-либо ошибками - сообщите мне. Я постараюсь исправить их как можно скорее.
Демонстрация
Никогда не атаковать врагов, если возможен дружественный огонь


Автоматическая атака неоглушенных механоидов


Персонажи более осторожны со взрывчаткой поблизости


Частичная поддержка минометов

Полный список возможностей
- Персонажи будут избегать запуска взрывчатого вещества, если в радиусе взрыва + радиусе промаха находится хотя бы 1 союзник, включая дружественные фракции/караваны.
- Персонажи будут запускать зажигательные снаряды, такие как молотовые коктейли, если общая термозащита союзника >90% или воспламеняемость менее 10% (броня импидов, броня феникса).
- Персонажи будут запускать токсичные снаряды, если союзники в зоне поражения имеют достаточную защиту, например, противогазы.
Токсич рейдеры запускают токсичные снаряды в любом случае. - Персонажи избегают перемещения по зоне, куда вот-вот ударит взрывное устройство или где оно уже находится. Работает только для дружественных фракций. Минометы поддерживаются
- Если персонаж вынужден запустить взрывное устройство (обходит проверки дружественного огня), то любой союзник, оказавшийся в зоне взрыва, сбежит из нее. Минометы поддерживаются
- Персонажи, equipped с ЭМП, не будут атаковать уже оглушенных ЭМП механоидов - устраняет глупое поведение, когда они атакуют одного и того же механоида снова и снова. Также они автоматически атакуют врагов в поясах-щитах - возможности, которой явно не хватает ванильной игре.
- Персонажи пытаются наносить как можно больше урона взрывными устройствами, выбирая гораздо более плотные группы врагов через систему оценки целей в игре. Увеличивает DPS.
- Вы можете настроить некоторые части мода по своему вкусу. Поддерживаемые языки: английский и русский.
- Все вышеперечисленное также применяется к вражеским рейдерам. Теперь они будут больше ценить свои жизни и не будут стрелять ракетами в вас, если это involves любой дружественный огонь.
Исходный код/версия без Steam

Пожертвования
Я принимаю пожертвования на
boosty.to/royalspudi/donate
Технический брифинг
Этот мод был особенно сложным для оптимизации. Поскольку нужно проверять персонажей в определенном радиусе - у вас всегда есть +1 цикл для обработки. Достижение приемлемой производительности составляло примерно ~80% от общего усилия. Этот мод, вероятно, добавит 0.1-0.2 мс накладных расходов, которые масштабируются линейно в зависимости от того, сколько гранатометчиков и целей у вас на карте. Но это почти не имеет значения, мы возвращаем к жизни целую категорию оружия после того, как разработчики ее бросили. И вне любого боя это едва заметно в профайлере.
Как это работает:
Во-первых, мы сначала проверяем союзников, когда персонаж вступает в бой (призван или что-то еще). Но не всегда.
Затем мы проверяем союзников каждый раз, когда любая Thing в игре меняет свое положение (патч метода Thing.Position set). Он построен на 2 предположениях:
1) Изначально мы предполагаем, что перемещенная вещь - это союзник, которого мы не хотим попадать. Это дешевая проверка O(1) - просто сравниваем расстояние от цели до союзника. Добавляем цель, в которую мы целимся, в черный список, если условия выполнены.
2) После этого мы предполагаем, что перемещенная вещь может быть врагом, который движется к нашему союзнику. В этот раз это O(n), так как нам нужно искать любого возможного союзника в радиусе взрыва вокруг нашей цели. Добавляем цель в черный список, если найден хотя бы 1 союзник.
Я пытался быть кратким, но под капотом есть много других деталей.
Также есть система предсказания траектории, над которой я работал, но вскоре отказался от нее. Проверьте ее на github, если когда-нибудь захотите ее закончить.