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

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 используется запасная анимация орбитальных частиц с меняющимся цветом
  • показывать билбордовую плавающую табличку статуса над пушкой (Ready / Charging / Maintaining / Exhausted); отключённая пушка не создаёт ни табличку, ни модель и отображается как Disabled только в /wc list и /wc status

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

Перед использованием сгенерируйте или исследуйте настроенную область поиска в целевом мире. 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): начинается, когда игрок находится на земле, а его вертикальная скорость ниже 0,08 блока за тик. CannonRTP снимает собственный эффект замедленного падения, воспроизводит эффект удара (облачная ударная волна, кольцо пламени, переход с пылью) и вызывает 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, даже если её последнее окно поиска завершилось по таймауту.

Пушка также показывает Exhausted, не проверяя рельеф, если интеграция включённого плагина защиты не загрузилась, а failOpenOnProtectionErrors равно false. См. Интеграции с защитой.

Отдельного состояния «некорректная конфигурация» нет. Когда целевой мир становится недоступен, его точки назначения удаляются из очереди, а поиск сбрасывается в SEARCHING. Пустая очередь отображается как Charging, а столбец $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.3-R0.1-SNAPSHOT
  • Java: 21
  • Рекомендуемое серверное ПО: Paper или совместимый актуальный форк
  • MagmaCore: 2.2.0 или новее (общая библиотека, встроена в плагин)
  • Опциональная зависимость: FreeMinecraftModels (для 3D-анимированных моделей пушки)
  • Метрики: CannonRTP отправляет анонимную статистику использования в bStats (id плагина 34460). Чтобы отказаться, задайте enabled: false в plugins/bStats/config.yml; это действует на все плагины сервера, использующие bStats.

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

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

  • когда чанк пушки выгружается, её метка и модель удаляются; они возрождаются при перезагрузке чанка
  • когда мир пушки выгружается, пушка приостанавливается; она просыпается, если мир загружается снова
  • при включении или отключении FreeMinecraftModels, а также по завершении перезагрузки контента в версии с соответствующим событием, устаревшие модели пушек удаляются и создаются заново из текущего реестра моделей; в старых версиях FMM без этого события удалённые экземпляры моделей также обнаруживаются напрямую
  • перед телепортацией высадки точка из очереди повторно проверяется по рельефу, интеграциям с защитой и слушателям API; если она стала небезопасной, запуск возвращает игрока в безопасное место, а не отправляет его по устаревшим координатам
  • очистка после запуска снимает только те эффекты Левитации, Невидимости и Замедленного падения, которыми всё ещё владеет CannonRTP, и восстанавливает любой более ранний эффект, который был временно заменён, вместо удаления более нового состояния, установленного другим плагином
  • если запуск не может быть продолжен из-за выгрузки мира назначения, CannonRTP возвращает игрока к пушке или к точке возрождения другого загруженного мира и сохраняет Замедленное падение, когда безопасного мира для возврата нет
  • /wc reload, обновление плагина без перезапуска и каждая команда редактирования пушек (create, place, remove, delete, target, center) пересобирают все пушки: активные запуски отменяются, а игроки возвращаются на место пушки, точки назначения в очереди сбрасываются и ищутся заново, а задержки запуска обнуляются
  • если игрок отключается во время запуска, запуск завершается, и CannonRTP снимает наложенные им эффекты; игрок не телепортируется

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