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

CannonRTP (WorldCannon)

CannonRTP — это плагин случайной телепортации с несколькими пушками для серверов Minecraft. «WorldCannon» — это более старое название раздела в вики; в Bukkit плагин регистрируется как CannonRTP, поставляется как CannonRTP.jar, и именно это имя видят игроки и администраторы.

Ключевые детали именования:

  • Название плагина: CannonRTP
  • Корневая команда: /cannonrtp
  • Алиасы: /crtp, /wc
  • Права: cannonrtp.admin, cannonrtp.use
  • Папка конфигурации: plugins/CannonRTP/

Что он делает

CannonRTP — это система случайных приземлений с поддержкой нескольких пушек, а не один фиксированный пусковой механизм. Каждая настроенная пушка может быть размещена в одном или нескольких местах мира, и каждое размещение отслеживает игроков, входящих в её радиус срабатывания.

Каждая пушка может:

  • быть размещена несколько раз с помощью /wc create и /wc place — одна конфигурация пушки управляет всеми её размещениями
  • отслеживать игроков, входящих в индивидуальный радиус срабатывания (по умолчанию 1,75 блока)
  • предварительно загружать и поддерживать очередь безопасных точек приземления в настроенном целевом мире (поддерживается межмировое нацеливание)
  • отвергать опасный рельеф, заблокированные пространства, защищённые территории и места за пределами границы мира
  • по желанию требовать дополнительное право на конкретную пушку
  • запускать игроков через пятифазную кинематографическую последовательность
  • отображать 3D-анимированную модель пушки FreeMinecraftModels (через customModel пушки или глобальный список приоритетов); при отсутствии FMM используется запасная анимация орбитальных частиц с меняющимся цветом
  • показывать билбордовую плавающую табличку статуса над пушкой (Готова / Заряжается / Поддерживает / Истощена / Отключена)

Процесс запуска

Перед использованием сгенерируйте или исследуйте настроенную область поиска в целевом мире. CannonRTP загружает существующие чанки без генерации местности; неисследованный радиус может не дать ни одной точки назначения.

Последовательность запуска управляется пятифазной машиной состояний (SEARCHING -> FIRING -> TELEPORTING -> DROPPING -> LANDING). Когда игрок входит в радиус срабатывания подходящей пушки:

  1. CannonRTP проверяет cannonrtp.use.
  2. Проверяет необязательное requiredPermission пушки.
  3. Проверяет персональную задержку запуска (runtime.launchCooldownSeconds, по умолчанию 30 секунд). Ограничение действует для всех пушек сразу и не расходует точку назначения из очереди.
  4. Убеждается, что у пушки в очереди есть хотя бы одна предзагруженная точка приземления. (Отключённые пушки, пушки в выгруженном мире и пушки в выгруженном чанке никогда не доходят до этого места — они полностью исключены из цикла тиков, поэтому сработать вообще не могут.)
  5. Потребляет одну предзагруженную безопасную точку приземления из очереди этой пушки.
  6. Вызывает CannonRTPLaunchEvent (отменяемое). Если слушатель отменяет событие, точка возвращается в очередь и задержка не начинается.
  7. Фаза поиска (Searching) (по умолчанию 42 тика, настраивается через launchWarmupTicks): игрок получает эффект Левитации, пушка проигрывает свою анимацию fire, если активна пользовательская модель, а в title/subtitle мелькают случайные превью координат. Пока модель активна, игрок также получает эффект Невидимости, чтобы анимация читалась чётко.
  8. Фаза выстрела (Firing) (по умолчанию 45 тиков через verticalBoostTicks): Левитация и Невидимость снимаются, проигрывается звук взлёта, появляется вспышка пламени, дыма и взрыва, а каждый тик применяется verticalBoostVelocity. Раскрываются настоящие координаты пункта назначения.
  9. Фаза телепортации (Teleporting) (один тик): точка из очереди проверяется заново (колонка рельефа, интеграции с защитой, слушатели API). Если она по-прежнему проходит проверку, игрок телепортируется ровно на 50 блоков выше неё и получает эффект Замедленного падения. Высота высадки никогда не ограничивается — валидатор приземления уже гарантирует, что блок прибытия находится ниже максимальной высоты мира, а точка, переставшая проходить проверку, отменяет запуск и вместо этого возвращает игрока в безопасное место.
  10. Фаза падения (Dropping): игрок плавно снижается с дымовым шлейфом (LARGE_SMOKE + CAMPFIRE_SIGNAL_SMOKE).
  11. Фаза приземления (Landing): начинается, как только игрок касается земли. Замедленное падение снимается, проигрывается эффект удара (взрыв облака, кольцо пламени, переход с пылью), и вызывается CannonRTPLandingEvent. Если же падение превышает свою максимальную длительность (slowFallingSeconds x 20 тиков), CannonRTP возвращает игрока в безопасное место, и событие приземления не отправляется.

Правила безопасности приземления

Прежде чем точка попадёт в очередь предзагрузки, текущий код проверяет по порядку:

  • целевой мир загружен (пока это не так, пушка прекращает предзагрузку и сообщает Target world <name> is not loaded.)
  • центр поиска определён — настроенный searchCenter, иначе собственное расположение пушки, если она находится в целевом мире, иначе точка возрождения целевого мира
  • точка-кандидат находится внутри границ мира
  • чанк-кандидат загружен (загружается по запросу без генерации)
  • в этой колонке существует самый высокий невоздушный блок
  • поверхностный блок непосредственно под точкой приземления твёрдый и не жидкий
  • этот поверхностный блок отсутствует в настроенном списке небезопасных материалов поверхности и не является бедроковой крышей Незера
  • точка приземления находится на минимальной высоте мира или выше, а блок прибытия на 51 блок выше неё остаётся ниже максимальной высоты мира
  • каждый блок 52-блочной колонки высадки (от точки приземления до блока на уровне головы при прибытии) — воздух или проходим
  • ни один блок в этой колонке не входит в настроенный список небезопасных материалов тела
  • все включённые интеграции с плагинами защиты разрешают эту точку
  • ни один слушатель CannonRTPLocationValidationEvent не отклонил кандидата

В Незере CannonRTP отвергает бедроковую крышу и сканирует вниз в поисках открытого дна пещеры, у которого вся колонка высадки безопасна. Это позволяет использовать цели в Незере, не сбрасывая игрока над потолком или сквозь твёрдый рельеф.

Попытки поиска глобально ограничены одной в тик (20 в секунду) и справедливо делятся между всеми активными пушками по принципу round-robin. У каждой пушки свой собственный счётчик таймаута (searchTimeoutAttempts, по умолчанию 100, минимум 10).

Состояния пушки

У каждой пушки есть внутреннее состояние, видимое через /wc status или /wc list:

ОтображениеВнутреннее состояниеЗначение
DisabledПушка явно отключена в своей конфигурации
ChargingSEARCHING (очередь пуста)Всё ещё предзагружает первую партию безопасных точек
MaintainingSEARCHING (очередь не пуста)Имеет какие-то точки, но всё ещё пополняет израсходованные слоты
ReadyREADYИмеет достаточно предзагруженных точек (>= chargedLocationsPerCannon) для запуска игроков
ExhaustedEXHAUSTEDИзрасходовала searchTimeoutAttempts без заполнения резерва

Внутреннее состояние поиска — это ровно одно из трёх значений (READY, SEARCHING, EXHAUSTED); Disabled определяется до обращения к нему, а Charging и Maintaining — это два варианта отображения SEARCHING. Ready имеет приоритет над Exhausted: пушка, всё ещё удерживающая заряженный резерв, отображается как Ready, даже если её последнее окно поиска завершилось по таймауту.

Отдельного состояния «некорректная конфигурация» не существует. Когда targetWorld пушки не удаётся определить, пушка сохраняет свою текущую метку состояния поиска, а в столбце $reason команды /wc status появляется Target world <name> is not loaded. (Ключ сообщения statusLabels.invalid присутствует в messages.yml, но в текущей сборке его ничто не отображает.)

Пушка будет запускать игроков, как только в её очереди появится хотя бы одна точка назначения. Порог chargedLocationsPerCannon влияет только на визуальную метку READY.

Требования к среде выполнения

  • Minecraft: в plugin.yml объявлено api-version: 1.21.4; текущее дерево исходников собирается против API Spigot 26.2-R0.1-SNAPSHOT
  • Java: 21
  • Рекомендуемое серверное ПО: Paper или совместимый актуальный форк
  • MagmaCore: 2.2.0 или новее (общая библиотека, встроена в плагин)
  • Опциональная зависимость: FreeMinecraftModels (для 3D-анимированных моделей пушки)

Устойчивость

CannonRTP сохраняет визуальные эффекты и очереди согласованными при событиях жизненного цикла мира и чанков:

  • когда чанк пушки выгружается, её метка и модель удаляются; они возрождаются при перезагрузке чанка
  • когда мир пушки выгружается, пушка приостанавливается; она просыпается, если мир загружается снова
  • когда FreeMinecraftModels включается или отключается во время сессии, кэш моделей инвалидируется и визуальные эффекты обновляются в следующий тик
  • перед телепортацией высадки точка из очереди повторно проверяется по рельефу, интеграциям с защитой и слушателям API; если она стала небезопасной, запуск возвращает игрока в безопасное место, а не отправляет его по устаревшим координатам
  • очистка после запуска снимает только те эффекты Левитации, Невидимости и Замедленного падения, которыми всё ещё владеет CannonRTP, и восстанавливает любой более ранний эффект, который был временно заменён, вместо удаления более нового состояния, установленного другим плагином
  • если запуск не может быть продолжен из-за выгрузки мира назначения, CannonRTP возвращает игрока к пушке или к точке возрождения другого загруженного мира и сохраняет Замедленное падение, когда безопасного мира для возврата нет

Начните здесь