Population Controller
Population Controller — модуль VarryalMythicAdditions для управляемого естественного спавна Mythic-животных. Он заменяет MythicMobs RandomSpawn только для тех видов, которые описаны в populations.yml.
Модуль поставляется выключенным:
Что контроллер делает
Контроллер решает только вопросы спавна и учёта популяции:
- группирует игроков в spawn clusters;
- выбирает профиль спавна по
chanceиweight; - генерирует candidate-точку вокруг кластера этих игроков;
- проверяет local/world quota;
- прогоняет Mythic
conditions; - спавнит моба из MythicMobs;
- помечает leader и summon-children (если необходимо) как
WILD; - ведёт индекс загруженных WILD-мобов по UUID.
MythicMobs всё ещё владеет самими мобами: типами, статами, скиллами, дропами и логикой summon (опять же, если summon необходим).
Runtime-состояния
| State | Значение |
|---|---|
DISABLED |
Модуль выключен в конфиге или остановлен. |
STARTING |
Идёт запуск/перезагрузка. |
RUNNING |
Профили загружены, pulse task работает. |
PAUSED_MYTHIC |
MythicMobs API/билд не прошёл проверку или Mythic reload временно остановил модуль. |
PAUSED_DB |
Зарезервировано под domestic slice. Сейчас не используется как рабочий режим wild-spawn части. |
Команды
Permission:
status показывает состояние модуля, build/version MythicMobs, число включённых/отключённых профилей и текущий счётчик загруженных WILD-мобов.
reload перезагружает config.yml и populations.yml.
config.yml
Главный блок:
population-controller:
enabled: false
pulse-ticks: 20
player-cluster-distance: 32
spawn-radius: 64
spawn-radius-min: 24
spawn-radius-y: 20
default-local-radius: 64
max-work-micros-per-tick: 1000
max-attempts-per-tick: 16
max-generation-attempts: 10
spawn-backoff-ticks: 200
max-wild-position-checks-per-pulse: 100
max-loaded-wild-total: 1000
max-loaded-domestic-total: 5000
domestic-recheck-ticks: 100
max-domestic-checks-per-tick: 50
Самые важные параметры:
| Параметр | Что менять |
|---|---|
pulse-ticks |
Частота основного тика контроллера. 20 = примерно раз в секунду. |
player-cluster-distance |
Дистанция, на которой игроки считаются одной группой. |
spawn-radius, spawn-radius-min, spawn-radius-y |
Кольцо и вертикальный диапазон поиска точки вокруг группы игроков. |
max-work-micros-per-tick |
CPU-бюджет на один pulse. Защита от тяжёлых спавн-проверок. |
max-attempts-per-tick |
Лимит candidate-попыток за pulse. |
max-generation-attempts |
Сколько неудачных candidate-попыток копить до backoff. |
spawn-backoff-ticks |
Кулдаун для плохой связки cluster+profile, чтобы она не душила очередь. |
max-loaded-wild-total |
Глобальный safety cap загруженных WILD-мобов. |
DB-настройки в конфиге нужны для будущей domestic registry части. Wild-spawn часть работает без БД.
populations.yml
Каждый профиль описывает один управляемый natural spawn.
Пример:
profiles:
WILD_SHEEP:
world: varryal_new_map
quota-group: SHEEP
leader: VarryalSheepHerdLeader
members:
- VarryalSheep
batch-max: 3
chance: 0.01
weight: 1.0
position-type: LAND
local-quota: 12
world-quota: 200
conditions: []
Поля:
| Поле | Назначение |
|---|---|
world |
Мир, где работает профиль. |
quota-group |
Видовая корзина для local/world quota. ВНИМАНИЕ! Один Mythic type не должен быть в двух группах. |
leader |
MythicMob, которого спавнит контроллер. |
members |
Follower-типы, которые leader summon'ит и которые надо пометить как WILD. |
batch-max |
Максимальный размер стада: leader + followers. Используется для quota reservation. |
chance |
Шанс рассмотрения профиля на pulse. Диапазон: 0.0..1.0. |
weight |
Вес выбора среди профилей, прошедших chance-roll. |
position-type |
Сейчас реализован только LAND. |
local-quota |
Лимит WILD-мобов этой quota-group рядом с candidate-точкой. |
world-quota |
Лимит WILD-мобов этой quota-group во всём мире. |
local-radius |
Необязательный радиус работы local-quota. Если отсутствует, берётся default-local-radius. |
conditions |
Mythic conditions, переносимые из RandomSpawn Conditions:. |
Как проходит один pulse
- Обновляется часть позиций уже отслеживаемых WILD-мобов.
- Если достигнут
max-loaded-wild-total, новый спавн не выполняется. - Онлайн-игроки группируются в clusters.
- Для каждой группы (cluster) фильтруются профили по миру, backoff и world quota.
- Профили проходят chance-roll; один профиль выбирается по weight.
- Candidate-точки генерируются вокруг случайного игрока из cluster.
- Проверяются chunk loaded, distance min,
position-type, local/world quota и Mythic conditions. - При успехе спавнится leader, а herd listener помечает leader и immediate summon-children как
WILD.
Контроллер не генерирует чанки: если candidate попадает в незагруженный chunk, попытка просто считается неудачной.