Перейти к основному содержимому

Патрули NPC и боссов

EliteMobs позволяет настроенным NPC и пользовательским боссам идти по созданным автором маршрутам с помощью встроенной навигации Minecraft. Эта же система предоставляет Lua-методы walk_to, hold и teleport.

Быстрое создание маршрута

  1. Создайте или разместите нужного NPC либо пользовательского босса.
  2. Посмотрите прямо на него с расстояния не более 12 блоков и выполните /em patrol edit.
  3. Встаньте в каждой точке назначения и выполните /em patrol add. Узел 0 — настроенная точка появления.
  4. /em patrol mode LOOP соединяет последний узел с первым, а /em patrol mode REVERSE заставляет актёра пройти список в обратном направлении.
  5. Выполните /em patrol save, чтобы сохранить маршрут и обновить актёра.

Редактор показывает рассчитанный путь, а не простые прямые линии. Также доступны /em patrol undo, /em patrol remove, /em patrol status и /em patrol cancel. Все команды предназначены только для игроков и требуют elitemobs.patrol.admin.

Если файл NPC содержит несколько spawnLocations, при сохранении для выбранного места создаётся отдельный дочерний файл. Поэтому одни относительные смещения не применяются ко всем копиям NPC.

Конфигурация

Узлы — это смещения x,y,z относительно настроенной точки появления, а не абсолютные координаты мира.

patrol:
enabled: true
mode: LOOP
speed: 1.0
virtualSpeed: 0.2
nodes:
- 0,0,0
- 1000,0,0
- 1000,0,250
КлючЗначенияПо умолчаниюОписание
patrol.enabledtrue / falsetrue, если есть узлыВключает маршрут.
patrol.modeLOOP / REVERSELOOPLOOP соединяет последний узел с узлом 0; REVERSE идёт по списку обратно.
patrol.speedположительное число1.0Множитель скорости встроенной навигации.
patrol.virtualSpeedположительное числонаблюдаемая скоростьБлоков за тик, когда у постоянного актёра нет загруженного тела. Обычно ключ следует опустить.
patrol.nodesне менее двух смещенийнетУпорядоченные цели. Поддерживаются строки x,y,z и карты с x, y, z.

Публичного ограничения длины участка нет. Участок в 1 000 блоков допустим. Старый экспериментальный ключ patrol.maxLegDistance устарел и ни на что не влияет.

Поиск длинного пути

Длинные участки рассчитываются автоматически. EliteMobs запрашивает у MagmaCore скользящий маршрут по загруженной местности, делит его на короткие цели встроенной навигации и пересчитывает по мере движения актёра.

  • Снимки загруженных чанков создаются в серверном потоке через общую систему рабочих нагрузок MagmaCore с бюджетом на тик.
  • Ограниченный поиск A* выполняется асинхронно по неизменяемым снимкам.
  • Последние короткие участки проверяет и проходит встроенный поиск пути Minecraft.
  • Планировщик никогда не загружает чанки принудительно. Если следующая местность недоступна, актёр ждёт в конце последнего проверенного пути и продолжает, когда область снова начинает обрабатывать сущности.

Так маршрут может пересечь город без сканирования всего города за один тик и без прямого прохода сквозь незагруженные здания. Летающие и водные мобы используют объёмный поиск; наземным нужны опора и свободное пространство, и они избегают обычных опасных блоков.

Поведение актёров

  • Патруль NPC автоматически включает ИИ тела и синхронизацию движения модели. syncMovement по-прежнему управляет моделями без патруля, но не является вторым переключателем патруля.
  • Пользовательскому боссу нужны ai: true, положительная скорость и отсутствие другого транспорта.
  • Босс приостанавливает патруль в бою и возобновляет после него.
  • Постоянные NPC и постоянные неинстансированные боссы сохраняют безопасное положение в patrol-state.yml при выгрузке чанков и перезагрузке.
  • Актёр материализуется только там, где обрабатываются сущности. Неизвестная местность замораживает время маршрута.
  • Пассажир не может владеть патрулём; настройте маршрут для его транспорта.

Управление из Lua

Эти методы доступны в context.npc и context.boss, когда у актёра настроен патруль. Координаты являются смещениями от точки появления, а каждый метод сообщает, принят ли запрос.

МетодПоведение
patrol_pause()Останавливает маршрут, не удаляя конфигурацию.
patrol_resume()Отменяет ожидание или временное движение и возобновляет патруль.
walk_to(x, y, z)Идёт к смещению, затем возобновляет патруль.
hold(x, y, z)Идёт к смещению и остаётся там.
teleport(x, y, z)Телепортируется, если в цели обрабатываются сущности, затем продолжает маршрут.
return {
api_version = 1,
on_npc_interact = function(context)
context.npc:walk_to(40, 0, -12)
end
}

walk_to использует тот же решатель длинных маршрутов; вручную разбивать путь на промежуточные точки не нужно.

Диагностика

Посмотрите на актёра и выполните /em patrol status. Вывод содержит состояние, текущий и целевой узлы, прогресс, логическое положение, виртуальную скорость, наличие тела и причину ожидания. terrain_unavailable означает ожидание загруженной области, где обрабатываются сущности.