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). Когда игрок входит в радиус срабатывания подходящей пушки:
- CannonRTP проверяет
cannonrtp.use. - Проверяет необязательное
requiredPermissionпушки. - Удостоверяется, что пушка включена, имеет корректную конфигурацию и хотя бы одну предзагруженную точку приземления в очереди.
- Потребляет одну предзагруженную безопасную точку приземления из очереди этой пушки.
- Вызывает
CannonRTPLaunchEvent(отменяемое). Если слушатель отменяет событие, точка возвращается в очередь, и пушка продолжает обычную работу. - Фаза поиска (Searching) (по умолчанию 42 тика, настраивается через
launchWarmupTicks): игрок получает эффект Левитации, пушка проигрывает свою анимациюfire, если активна пользовательская модель, а в title/subtitle мелькают случайные превью координат. Пока модель активна, игрок также получает эффект Невидимости, чтобы анимация читалась чётко. - Фаза выстрела (Firing) (по умолчанию 45 тиков через
verticalBoostTicks): Левитация и Невидимость снимаются, проигрывается звук взлёта, появляется вспышка пламени, дыма и взрыва, а каждый тик применяетсяverticalBoostVelocity. Раскрываются настоящие координаты пункта назначения. - Фаза телепортации (Teleporting) (один тик): игрок телепортируется на 50 блоков выше точки назначения (с ограничением по максимальной высоте мира), и применяется эффект Замедленного падения.
- Фаза падения (Dropping): игрок плавно снижается с дымовым шлейфом (
LARGE_SMOKE+CAMPFIRE_SIGNAL_SMOKE). - Фаза приземления (Landing): Замедленное падение снимается заранее, когда игрок касается земли (или истекает максимальная длительность падения), и проигрывается эффект удара (взрыв облака, кольцо пламени, переход с пылью). Вызывается
CannonRTPLandingEvent.
Правила безопасности приземления
Прежде чем точка попадёт в очередь предзагрузки, текущий код проверяет по порядку:
- целевой мир загружен
- центр поиска корректен
- точка-кандидат находится внутри границ мира
- чанк-кандидат загружен (загружается по запросу без генерации)
- в этой колонке существует самый высокий неживоздушный блок
- пространство для ног и головы над этим блоком проходимо
- поверхностный блок твёрдый и не жидкий
- поверхностный блок отсутствует в настроенном списке небезопасных материалов поверхности
- блоки на уровне ног и головы отсутствуют в настроенном списке небезопасных материалов тела
- все включённые интеграции с плагинами защиты разрешают эту точку
- ни один слушатель
CannonRTPLocationValidationEventне отклонил кандидата
Попытки поиска глобально ограничены одной в тик (20 в секунду) и справедливо делятся между всеми активными пушками по принципу round-robin. У каждой пушки свой собственный счётчик таймаута (searchTimeoutAttempts, по умолчанию 100, минимум 10).
Состояния пушки
У каждой пушки есть внутреннее состояние, видимое через /wc status или /wc list:
| Отображение | Внутреннее состояние | Значение |
|---|---|---|
| Disabled | — | Пушка явно отключена в своей конфигурации |
| Charging | SEARCHING (очередь пуста) | Всё ещё предзагружает первую партию безопасных точек |
| Maintaining | SEARCHING (очередь не пуста) | Имеет какие-то точки, но всё ещё пополняет израсходованные слоты |
| Ready | READY | Имеет достаточно предзагруженных точек (>= chargedLocationsPerCannon) для запуска игроков |
| Exhausted | EXHAUSTED | Израсходовала searchTimeoutAttempts без заполнения резерва |
| Invalid | INVALID_CONFIGURATION | Ошибка конфигурации (например, целевой мир не загружен) |
Пушка будет запускать игроков, как только в её очереди появится хотя бы одна точка назначения. Порог chargedLocationsPerCannon влияет только на визуальную метку READY.
Требования к среде выполнения
- API Minecraft:
1.21.4(протестировано до1.21.11) - Java:
21 - Рекомендуемое серверное ПО: Paper или совместимый актуальный форк
- MagmaCore:
2.2.0или новее (общая библиотека, встроена в плагин) - Опциональная зависимость: FreeMinecraftModels (для 3D-анимированных моделей пушки)
Устойчивость
CannonRTP сохраняет визуальные эффекты и очереди согласованными при событиях жизненного цикла мира и чанков:
- когда чанк пушки выгружается, её метка и модель удаляются; они возрождаются при перезагрузке чанка
- когда мир пушки выгружается, пушка приостанавливается; она просыпается, если мир загружается снова
- когда FreeMinecraftModels включается или отключается во время сессии, кэш моделей инвалидируется и визуальные эффекты обновляются в следующий тик