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

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 используется запасная анимация орбитальных частиц с меняющимся цветом
  • показывать билбордовую плавающую табличку статуса над пушкой (Готова / Заряжается / Поддерживает / Истощена / Отключена / Недопустима)

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

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

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

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

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

  • целевой мир загружен
  • центр поиска корректен
  • точка-кандидат находится внутри границ мира
  • чанк-кандидат загружен (загружается по запросу без генерации)
  • в этой колонке существует самый высокий неживоздушный блок
  • пространство для ног и головы над этим блоком проходимо
  • поверхностный блок твёрдый и не жидкий
  • поверхностный блок отсутствует в настроенном списке небезопасных материалов поверхности
  • блоки на уровне ног и головы отсутствуют в настроенном списке небезопасных материалов тела
  • все включённые интеграции с плагинами защиты разрешают эту точку
  • ни один слушатель CannonRTPLocationValidationEvent не отклонил кандидата

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

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

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

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

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

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

  • API Minecraft: 1.21.4 (протестировано до 1.21.11)
  • Java: 21
  • Рекомендуемое серверное ПО: Paper или совместимый актуальный форк
  • MagmaCore: 2.2.0 или новее (общая библиотека, встроена в плагин)
  • Опциональная зависимость: FreeMinecraftModels (для 3D-анимированных моделей пушки)

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

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

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

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