Патрули NPC и боссов
EliteMobs позволяет настроенным NPC и пользовательским боссам идти по созданным автором маршрутам с помощью встроенной навигации Minecraft. Эта же система предоставляет Lua-методы walk_to, hold и teleport.
Быстрое создание маршрута
- Создайте или разместите нужного NPC либо пользовательского босса.
- Посмотрите прямо на него с расстояния не более 12 блоков и выполните
/em patrol edit. - Встаньте в каждой точке назначения и выполните
/em patrol add. Узел0— настроенная точка появления. /em patrol mode LOOPсоединяет последний узел с первым, а/em patrol mode REVERSEзаставляет актёра пройти список в обратном направлении.- Выполните
/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.enabled | true / false | true, если есть узлы | Включает маршрут. |
patrol.mode | LOOP / REVERSE | LOOP | LOOP соединяет последний узел с узлом 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 означает ожидание загруженной области, где обрабатываются сущности.