Патрули 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 remove удаляет последний узел, /em patrol undo восстанавливает предыдущее изменение, а /em patrol status показывает состояние драйвера редактирования. /em patrol cancel завершает сеанс без сохранения изменений маршрута. Все команды редактирования доступны только игрокам с elitemobs.patrol.admin. Точки должны находиться в исходном мире; редактор отклоняет точки в регионе WorldGuard с elitemob-spawning в состоянии deny.
Новые маршруты используют относительные координаты. При редактировании существующего маршрута редактор сохраняет его настройку patrol.relative и записывает добавленные точки в том же формате. Формат задаётся в YAML-конфигурации.
Если файл NPC или регионального босса содержит несколько spawnLocations, сохранение маршрута для одного актёра создаёт дочерний файл для выбранного места и удаляет это место из исходного файла. Так изменение относится только к этому актёру как для относительных, так и для абсолютных маршрутов. Дочерний файл наследует исходный через extends. Дочерний файл босса также копирует leashRadius, powers и eliteScript исходного файла, которые extends не наследует.
Конфигурация
Узлы патруля — это координаты x,y,z. При relative: true (по умолчанию) они являются смещениями от настроенной точки появления актёра. При relative: false это точные координаты в мире актёра, включая мир его активного инстанса подземелья. Абсолютные узлы не содержат имени мира.
patrol:
enabled: true
relative: 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.relative | true / false | true | При true использует смещения от настроенной точки появления, при false — точные координаты в мире актёра. Действует на все узлы маршрута. |
patrol.mode | LOOP / REVERSE | LOOP | LOOP соединяет последний узел с узлом 0; REVERSE идёт по списку обратно. |
patrol.speed | положительное конечное число | 1.0 | Множитель скорости встроенной навигации. |
patrol.virtualSpeed | положительное конечное число | атрибут скорости × скорость патруля | Блоков за тик по сохранённому рассчитанному пути, пока у постоянного актёра нет загруженного тела. Обычно ключ следует опустить. |
patrol.startNodeWaitSeconds | конечное число, 0 или больше | 0 | Сколько секунд актёр отдыхает у узла 0 каждый раз, когда возвращается туда: один раз за круг в LOOP, один раз за путь туда и обратно в REVERSE. Актёр, появившийся на узле 0, также отдыхает перед первым кругом. Во время отдыха он смотрит в направлении своей точки появления. |
patrol.nodes | не менее двух координат | нет | Упорядоченные цели, интерпретируемые согласно patrol.relative. Поддерживаются строки x,y,z и карты с x, y, z. Координаты должны быть конечными, а соседние узлы — различными. |
Например, этот маршрут проходит через три точные позиции и затем возвращается к первой:
patrol:
enabled: true
relative: false
mode: LOOP
nodes:
- 299,91,215
- 286,91,213
- 279,91,230
Существующие маршруты без patrol.relative по-прежнему используют смещения. Изменение флага меняет интерпретацию всех узлов, но не преобразует сохранённые числа. Меняя формат существующего маршрута, преобразуйте и узлы.
Публичного ограничения длины участка нет. Участок в 1 000 блоков допустим. Старый экспериментальный ключ patrol.maxLegDistance устарел и ни на что не влияет.
При сохранении редактор сохраняет скорость навигации маршрута, явно заданный virtualSpeed и отдых на начальном узле. Если маршрут содержит более двух узлов и последний повторяет первый, этот последний узел автоматически удаляется при чтении.
Паузы NPC рядом с игроками
NPC также поддерживают patrol.pauseNearPlayersRadius (по умолчанию 0, выключено) и patrol.faceNearbyPlayers (по умолчанию false). Положительный конечный радиус приостанавливает патруль рядом с живыми игроками вне режима наблюдателя; параметр поворота заставляет остановившегося NPC смотреть на ближайшего подходящего игрока. Близость проверяется каждые 20 тиков. Некорректный или отрицательный радиус отключает такую паузу.
Эти настройки независимы от диалогов и ручных пауз через Lua. Это параметры NPC, а не дополнительные поля патрулей боссов.
Отдых на начальном узле
С patrol.startNodeWaitSeconds актёр останавливается у узла 0, прежде чем начать следующий круг. Отсчёт отдыха идёт и тогда, когда актёр выгружен. Пауза рядом с игроками или в бою останавливает отсчёт до своего окончания. walk_to, hold, teleport и patrol_resume() сразу завершают отдых. Боевой инструктор Гильдии использует 60-секундный отдых, чтобы игроки могли найти его у его кресла между кругами.
Поиск длинного пути
Длинные участки рассчитываются автоматически. EliteMobs запрашивает у MagmaCore скользящий маршрут по загруженной местности, делит его на короткие цели встроенной навигации и пересчитывает по мере движения актёра.
Доступ к местности и поиск пути разделены:
- Снимки загруженных чанков создаются в серверном потоке через общую систему рабочих нагрузок MagmaCore с бюджетом на тик.
- Ограниченный поиск A* выполняется асинхронно по неизменяемым снимкам.
- Последние короткие участки проверяет и проходит встроенный поиск пути Minecraft.
- Планировщик никогда не загружает чанки принудительно. При нехватке местности он ждёт и повторяет попытку. Постоянный актёр без тела может двигаться только по сохранённому рассчитанному пути и ждёт, когда тот заканчивается. Его тело может вернуться только в область, обрабатывающую сущности.
Так маршрут может пересечь город без сканирования всего города за один тик и без прямого прохода сквозь незагруженные здания. Летающие и водные мобы используют объёмный поиск; наземным нужны опора и свободное пространство, и они избегают обычных опасных блоков.
Поведение актёров
- Патруль NPC автоматически включает ИИ тела и синхронизацию движения модели.
syncMovementпо-прежнему управляет моделями без патруля, но не является вторым переключателем патруля. - Пользовательскому боссу нужны
ai: true, положительная скорость и отсутствие другого транспорта. - Босс приостанавливает патруль в бою и возобновляет после него.
- Неинстансированные NPC и постоянные неинстансированные боссы сохраняют безопасное положение на маршруте в
patrol-state.ymlпри выгрузке чанков и перезагрузке. Сохранённое положение сбрасывается, если изменились узлы маршрута или флагrelative, и актёр начинает заново с узла0. - Актёр материализуется только там, где обрабатываются сущности. Без тела его сохранённое положение ещё может продвигаться по ранее рассчитанному пути, но новый путь через неизвестную местность не ищется.
- Пассажир не может владеть патрулём; настройте маршрут для его транспорта.
Управление из Lua
Эти методы доступны в context.npc и context.boss; операции патруля требуют настроенного контроллера. Координаты в Lua всегда являются смещениями от настроенной точки появления актёра, независимо от patrol.relative, а каждый метод сообщает, принят ли запрос. walk_to, hold и teleport также требуют живого тела. Принятие запроса ходьбы не доказывает прибытие: бой, пауза рядом с игроками, отключённый ИИ или ошибка пути могут прервать движение.
| Метод | Поведение |
|---|---|
patrol_pause() | Останавливает маршрут, не удаляя конфигурацию. |
patrol_resume() | Отменяет ожидание или временное движение и возобновляет патруль. |
walk_to(x, y, z) | Идёт к смещению, затем возобновляет патруль. |
hold(x, y, z) | Идёт к смещению и остаётся там до вызова patrol_resume(). |
teleport(x, y, z) | Телепортирует живое тело к смещению в том же мире, если там обрабатываются сущности и Bukkit принимает телепортацию. Не отменяет существующую паузу скрипта или временную цель; для возврата к маршруту используйте patrol_resume(). |
return {
api_version = 1,
on_npc_interact = function(context)
context.npc:walk_to(40, 0, -12)
end
}
walk_to использует тот же решатель длинных маршрутов; вручную разбивать путь на промежуточные точки не нужно.
Диагностика
Вне сеанса редактирования посмотрите на актёра и выполните /em patrol status. Вывод содержит состояние, текущий и целевой узлы, прогресс, логическое положение, виртуальную скорость, наличие тела и причину ожидания. start_node_wait обозначает отдых на начальном узле. terrain_unavailable означает, что для движения без тела больше нет рассчитанного пути; загруженный актёр, ожидающий планирования, может показывать yielded. Логическое положение отражает продвижение по маршруту и может отличаться от безопасной сохранённой позиции для восстановления тела.
При обычной ошибке пути контроллер патруля повторяет попытку один раз, затем переходит к следующему узлу. Неудачная временная ходьба или движение с последующим удержанием тоже получает одну повторную попытку; это не доказывает достижение цели. Проверьте местность и встроенную навигацию, если актёр пропускает точку или остаётся неподвижным.