20 KiB
Smart spawn controller
Мод меняет ванильный алгоритм спавна ботов. Позволяет повысить производительность игры без нудной настройки волн ботов.
Проверн на версиях EFT 0.12.10.12192, 0.12.11.1.13487, 0.12.11.2.13615, 0.12.11.13725 / AKI 1.4.0 - 2.0.0-A8 BLEEDINGEDGE
Возможности
- Ограничение количества живых ботов на карте
- Спавн новых ботов в определенном радиусе от игрока
- Деспавн ботов при слишком большом расстоянии от игрока
- Настройка вероятности спавна в доступных зонах и ограничение количества ботов в зоне
- Настройка зон доступных для боссов
- Настройка максимального количества живых ботов в зоне (не относится к боссам и их свите)
- Настройка ролей ботов которые подвергаются изменениям (по умолчанию поведение спавна ботов-снайперов/marksman не затрагивается модом)
- Настройка параметров отдельно для каждой карты
- На текущий момент мод использует настройки волн из конфига карт, так что нужно досточное их количество если будет использоваться деспавн (есть решение для быстрого создания большого количества волн)
Идея
Ванильный алгоритм спавна работает по заранее заданному конфигу волн и спавнит ботов по времени, добавляя немного рандома в количество ботов и спавн-зону у боссов (на сколько я понял из кода выбор случайной спавн зоны из нескольких заданных доступен только боссам). Плюсом мы имеем жестко заданную верхнюю границу в 40 живых ботов и неоптимизированный код самих ботов. Что приводит либо к пустым картам, либо к тормозам.
У меня давно витала мысль сделать так чтобы менеджер ботов учитывал положение игрока на карте и выключал ботов которые находятся далеко от игрока. К сожалению реализация показала что это не помогает и боты либо не выключаются, либо не включаются )), а производительность остается такой же как и раньше. Но случайно обнаруженный алгоритм деспавна диких при спавне в зоне культистов навел ну другую идею. Так появился менеджер спавна и деспавна, который учитывает расстояние до игрока.
Пара минусов которые пока (а может быть и вообще никогда) не исправлены: боты спавнятся долго. Точного времени не замерял, но от момента когда игра выполняет метод спавна и до появления бота на карте проходит около 30 секунд, иногда больше, еще есть загрузка ресурсов из-за которой начальные волны становятся в очередь. Второй минус - боты которые были деспавнены не добавляются обратно в очередь на спавн. Мне кажется что если возвращать их обратно (при спавне учитывается только роль/сложность, состояние здоровья и снаряжение будет новое), то можно чуть лучше контроллировать количество волн. Телепорт бота в другую зону скорее всего не сработает т.к. бот достаточно жестко завязан на зону спавна, но я не пробовал. Телепорт решил бы и проблему долгого ожидания спавна.
В целом алгоритм спавна в радиусе идеально подходит для вытянутых карт как таможня, неплохо работает на карте берег. На этих картах можно добиться хорошего гейм-плея без поиска ботов по локации. Боты будут практически везде и распределены согласно конфигурации. Думаю сюда можно добавить и лес, если его настроить.
Резерв достаточно компактная карта и так как проходит достаточно много времени между моментом как волна начала спавниться и появлением ботов на карте, сложно настроить радиусы спавна/деспавна. Но можно огранить количество ботов в зонах (например, подземные уровни).
Развязка так же сложна для спавна/деспавна т.к. сам ТЦ находится на большом удалении от краев карты где может быть спавн игрока. Это приводит к тому что либо боты будут появляться в зоне с совместным выходом, либо в случайных зонах по всей карте т.к. алгоритм просто не сможет найти ближайшей зоны.
Лаборатория и оба завода по умолчанию не используют спавн/деспавн. На них работает ограничение количества живых ботов. На заводе мой алгоритм вообще бесполезен т.к. там одна зона и маленькая карта. Лаба не тестировалась, не моя карта, но она тоже не большая и многоуровневая - не думаю что алгоритм будет работать хорошо, разве что использовать его для распределения по зонам.
Для отладки можно использовать мой монитор ботов, который показывает расстояние до каждого бота и зону в которой он заспавнился.
Установка
Скопировать папку astealz-SmartSpawnController в папку user/mods
Конфигурация
Все настройки содержатся в файле config.json
Секция "game"
- DEBUG - вывод отладочных сообщений в лог SmartSpawnController.txt и консоль в игре. Использовать при проблемах с работой.
- VERBOSE - вывод подробных сообщений в лог SmartSpawnController.txt и консоль в игре. Использовать для настройки.
- ScavWaveRetryInterval (секунд) - в случае если игра не может заспавнить волну ботов (не загружены ресурсы, превышен лимит живых ботов, зона занята культистами, не доступных точек спавна), то все или часть ботов этой волны будут поставлены в очередь. Данный параметр изменяет время через которое игра повторит попытку спавна этой волны ботов. По умолчанию 3 секунды.
- Maps - настройка для каждой карты, в качестве ключей используется _Id карты
- MaxBotsAliveOnMap - ограничение количества живых ботов на карте. По умолчанию в игре захардкожено значение 40, значение из globals.json игнорируется.
- EnableSpawnControl - включает управление спавном
- MaxDistanceToSpawn (метры) - максимальная дистанция от игрока до цента масс зоны (средняя точка среди всех спавн-точек зоны). Выбор точки спавна остается за игрой, поэтому боты могут спавниться как ближе, так и дальше этого значения.
- ForceChooseNewZone - включение принудительного изменения зоны спавна. Рекомендуется включать для равномерного спавна. При выключенном параметре сначала анализируется дистанция до зоны спавна, если расстояние меньше чем MaxDistanceToSpawn - изменения зоны не будет.
- BotsPerZoneBase - базовое значение количества ботов в зоне, используется для расчета "веса" зоны
- ScavRoles и BossRoles - роли диких и боссов у которых будет изменяться зона спавна. Снайперы (marksman) не поддерживаются модом, стандартные боссы и их фолловеры по умолчанию не изменяются (они поддерживаются, но не тестировались).
- EnableUnspawn - включение механизма деспавна при удалении от игрока. Расчет идет отдельно для каждого бота и в отличие от средней точки в менеджере спавна, здесь используется действительное расстояние до бота.
- MaxDistanceToUnspawn (метры) - максимальное расстояние после превышения которого будет деспавн бота
- RolesToUnspawn - только эти роли будут анализироваться и деспавниться
- Zones - настройка зон карты
- CanSpawnBoss - флаг возможности спавна босса (не очень понятно как работает, но игра фильтрует доступные зоны для боссов по этому флагу, можно менять)
- SnipeZone - флаг снайперской зоны. Представлен для информации, изменение не повлияет на игру. Все снайперские зоны исключаются из зон которые доступных для обычных диких и боссов
- MaxPersonsOnPatrol - максимальное количество живых ботов в зоне, не влияет на спавн босса и свиты. Можно менять (нужно тестировать)
- MultiplicativeCoef (float) - мультипликативный коэффициент зоны (см. алгоритм выбора зоны)
- AdditiveCoef (int, может быть отрицательным) - аддитивный коэффициент зоны (см. алгоритм выбора зоны)
Секция "server"
Параметры JS-модуля:
- Add_IgnoreMaxBots_ToBossWaves - Добавляет параметр IgnoreMaxBots для всех боссов на всех локациях. Данный параметр позволяет обойти ограничение MaxBotsAliveOnMap при спавне босса, т.е. при лимите 12 после спавна босса будет 12 + босс + свита. Для ванильных боссов он не особо нужен т.к. время их спавна '-1' т.е. в самом начале рейда. Очень полезен для рейдеров и ЧВК-боссов.
- ChangeWaveCoefs - позволяет изменить коэффициенты количества ботов в волне. Рекомендуется установить WAVE_COEF_MID в 1. Объяснение будет ниже.
- ReplaceLocationsWaves - позволяет заменить стандартные/модифицированные волны диких на простые, но в большем количестве. Основная идея - сделать много волн состоящих из 1 бота. Т.к. максимальное количество ботов ограниченно, новые будут становиться в очередь и ждать свободного места. Это так же позволяет более равномерно наполнять зоны: если использовать зоны со случайным количеством ботов от 1 до 4, то возможна ситуация когда в зоне маленьким весом и лимитом в 2 бота появятся 4 за раз, а в зоне с большим весом будет 4 волны по 1 боту. Данное правило на относится к боссам.
- ScavWaveCount - количество волн диких
- ScavInstaWaveCount - количество волн диких на старте локации (к сожалению игра не хочет спавнить их ДО захода на локацию, поэтому они появляются где-то в райноне минуты)
- ScavDifficultyWeight - настройка сложности волн диких. Упрощенный вариант вероятности на основе веса. Чем больше значение, тем вероятнее что будет выбрана данная сложность. Ноль - выключает данную сложность из выбора.
Алгоритм выбора зоны
- Среди доступных зон (для диких - все зоны кроме снайперских, для боссов - все зоны диких с флагом CanSpawnBoss) выбираются те, у которых расстояние до средней точки попадает в радиус MaxDistanceToSpawn
- Рассчитывается вес каждой зоны:
Формула: Round((Base - Min(Base, BotCount)) * M + A), где
Round - округление до целого,
Base - BotsPerZoneBase,
BotCount - количество ботов в зоне включая убитых, но не включая ботов из новой волны,
M - MultiplicativeCoef,
A - AdditiveCoef.
Если вес <= 0, то зона исключается - Если по какой-либо причине не список зон оказывается пустой, то будет выбрана случайная зона из всех доступных и добавлена в список
- Рассчитывается суммарный вес всех зон
- В диапазоне [1..Суммарный_вес] выбирается случайное число
- Выбирается зона в диапазон которой попадает случайное число
Мультипликативный коэффициент позволяет увеличить вес (вероятность) спавна ботов в данной зоне. Аддитивный коэффициент регулирует максимальное количество ботов в зоне.
Примеры:
- Base=4, M=1, A=1 => Вес пустой зоны = 5, вес зоны с 4 и более ботами = 1
- Base=4, M=1, A=0 => Вес пустой зоны = 4, вес зоны с 4 ботами 0 (ограничение на 4 ботов)
- Base=4, M=2, A=1 => Вес пустой зоны = 9, вес зоны с 4 и более ботами = 1 (зона более вероятна для спавна)
- Base=4, M=1, A=-1 => Вес пустой зоны = 3, вес зоны с 3 и более ботами = 0 (ограничение на 3 бота)
- Base=4, M=0.5, A=0 => Вес пустой зоны = 2, вес зоны с 4 более ботами = 0 (зона менее вероятна для спавна)
Примеры из логов:
Для 5ой волны:
[5][Zones] ZoneRailStrorage [1], ZonePTOR1 [6], ZonePTOR2 [11], ZoneBarrack [16], ZoneBunkerStorage [18], ZoneSubStorage [22], ZoneSubCommand [26] [5][Selected] 5 @ ZonePTOR1
[5] - номер волны (внутренний общий счетчик для диких, боссов и свиты) [Zones] - доступные зоны для данной волны и из вес [Selected] - выбранное случайное число в диапазоне [1..26] и зона в диапазон которой попадает это число
Для 67 волны:
[67][Zones] ZoneRailStrorage [1], ZonePTOR1 [2], ZonePTOR2 [3], ZoneBarrack [4], ZoneSubCommand [5] [67][Selected] 1 @ ZoneRailStrorage
т.к. во всех зонах уже превышен лимит ботов на зону остались только зоны где возможен "вечный" спавн.
Отладочные сообщения
Включение вывода отладочных сообщений возможно как в конфиге, так и через консоль (команда spawner-debug).
При загрузке карты мод показывает зашитые в игру зоны и их параметры, а так же измененные зоны из конфигурации мода. Новые зоны добавить нельзя. Можно использовать для конфигурации, вывод сделан в json.
На каждую волну ботов выводятся сообщения о номере волны, исходной зоне, её изменении, признак того что волна поставленна в очередь ожидания, либо возможные ошибки.
Version history
- 1.0.0 - Первый релиз
- 1.0.1 - Исправлен баг при попытке спавна босса с несуществующей в игре зоной, исправления серверой части
- 1.0.2 - Исправлен баг со сломанными ботами