Перейти к содержанию

Population Controller

Population Controller — модуль VarryalMythicAdditions для управляемого естественного спавна Mythic-животных. Он заменяет MythicMobs RandomSpawn только для тех видов, которые описаны в populations.yml.

Модуль поставляется выключенным:

population-controller:
  enabled: false

Что контроллер делает

Контроллер решает только вопросы спавна и учёта популяции:

  • группирует игроков в 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 части.

Команды

/vma population status
/vma population reload

Permission:

varryal.mythicadditions.population

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

  1. Обновляется часть позиций уже отслеживаемых WILD-мобов.
  2. Если достигнут max-loaded-wild-total, новый спавн не выполняется.
  3. Онлайн-игроки группируются в clusters.
  4. Для каждой группы (cluster) фильтруются профили по миру, backoff и world quota.
  5. Профили проходят chance-roll; один профиль выбирается по weight.
  6. Candidate-точки генерируются вокруг случайного игрока из cluster.
  7. Проверяются chunk loaded, distance min, position-type, local/world quota и Mythic conditions.
  8. При успехе спавнится leader, а herd listener помечает leader и immediate summon-children как WILD.

Контроллер не генерирует чанки: если candidate попадает в незагруженный chunk, попытка просто считается неудачной.