CannonRTP (WorldCannon)
CannonRTP es un plugin de teletransporte aleatorio multi-cañón para servidores de Minecraft. "WorldCannon" es un nombre antiguo / de sección de la wiki; el plugin se registra como CannonRTP en Bukkit, se distribuye como CannonRTP.jar, y ese es el nombre que ven los jugadores y administradores.
Detalles importantes de nomenclatura:
- Nombre del plugin:
CannonRTP - Comando raíz:
/cannonrtp - Alias:
/crtp,/wc - Permisos:
cannonrtp.admin,cannonrtp.use - Carpeta de configuración:
plugins/CannonRTP/
Qué Hace
CannonRTP es un sistema de aterrizaje aleatorio multi-cañón en lugar de un único lanzador fijo. Cada cañón configurado puede colocarse en una o varias ubicaciones del mundo, y cada colocación vigila si los jugadores entran en su radio de activación.
Cada cañón puede:
- colocarse varias veces mediante
/wc createy/wc place-- una sola configuración de cañón controla todas sus colocaciones - detectar jugadores que entran en un radio de activación específico del cañón (por defecto 1.75 bloques)
- precargar y mantener una cola de ubicaciones de aterrizaje seguras en un mundo objetivo configurado (se admite el objetivo en otro mundo)
- rechazar terreno inseguro, espacios bloqueados, tierra protegida y ubicaciones fuera del borde del mundo
- opcionalmente requerir un permiso adicional por cañón
- lanzar jugadores a través de una secuencia cinemática de cinco fases
- mostrar un cañón 3D animado de FreeMinecraftModels (
customModelpor cañón o mediante una lista global de prioridad); recurre a partículas en órbita con cambio de color cuando FMM no está instalado - mostrar una etiqueta flotante de estado tipo billboard sobre el cañón (Ready / Charging / Maintaining / Exhausted / Disabled)
Flujo de Lanzamiento
Genera o explora el área de búsqueda configurada del mundo de destino antes de usar el cañón. CannonRTP carga chunks existentes sin generar terreno; un radio sin explorar puede quedarse sin destinos.
La secuencia de lanzamiento se rige por una máquina de estados de cinco fases (SEARCHING -> FIRING -> TELEPORTING -> DROPPING -> LANDING). Cuando un jugador camina hacia el radio de activación de un cañón elegible:
- CannonRTP verifica
cannonrtp.use. - Verifica el
requiredPermissionopcional del cañón. - Verifica el cooldown de lanzamiento por jugador (
runtime.launchCooldownSeconds, por defecto 30 segundos). Este control se aplica a todos los cañones y no consume un destino en cola. - Comprueba que el cañón tenga al menos una ubicación de aterrizaje precargada en la cola. (Los cañones desactivados, los que están en un mundo descargado y los que están en un chunk descargado nunca llegan a este punto: quedan excluidos por completo del bucle de tick, así que no pueden activarse en absoluto.)
- Consume una ubicación de aterrizaje segura precargada de la cola de ese cañón.
- Dispara
CannonRTPLaunchEvent(cancelable). Si un listener lo cancela, el destino se devuelve a la cola y no se inicia ningún cooldown. - Fase de búsqueda (por defecto 42 ticks, configurable mediante
launchWarmupTicks): el jugador recibe Levitación, el cañón reproduce su animaciónfiresi hay un modelo personalizado activo y aparecen vistas previas de coordenadas aleatorias parpadeando en el título/subtítulo. Mientras un modelo está activo, el jugador también recibe Invisibilidad para que la animación se vea limpia. - Fase de disparo (por defecto 45 ticks mediante
verticalBoostTicks): se eliminan Levitación/Invisibilidad, se reproduce el sonido de despegue, aparece una ráfaga de llamas+humo+explosión y se aplicaverticalBoostVelocityen cada tick. Se revelan las verdaderas coordenadas del destino. - Fase de teletransporte (un solo tick): el destino en cola se vuelve a validar (columna de terreno, integraciones de protección, listeners de la API). Si sigue siendo válido, el jugador es teletransportado exactamente 50 bloques por encima de él y se aplica Caída Lenta. La altura del airdrop nunca se limita: el validador de aterrizaje ya garantiza que el bloque de llegada queda por debajo de la altura máxima del mundo, y un destino que deja de validarse cancela el lanzamiento y recupera al jugador en su lugar.
- Fase de caída: el jugador desciende dejando un rastro de humo (
LARGE_SMOKE+CAMPFIRE_SIGNAL_SMOKE). - Fase de aterrizaje: se entra en ella en cuanto el jugador toca el suelo. Se elimina la Caída Lenta, se reproduce una ráfaga de impacto (onda de choque de nube, anillo de llamas, transición de polvo) y se dispara
CannonRTPLandingEvent. Si en cambio la caída supera su duración máxima (slowFallingSecondsx 20 ticks), CannonRTP recupera al jugador y no se emite ningún evento de aterrizaje.
Reglas de Seguridad de Aterrizaje
Antes de que una ubicación sea aceptada en la cola de precarga, el código actual verifica, en orden:
- el mundo objetivo está cargado (mientras no lo esté, el cañón deja de precargar e informa
Target world <name> is not loaded.) - el centro de búsqueda se resuelve -- el
searchCenterconfigurado, si no la ubicación del propio cañón cuando está en el mundo objetivo, y si no el spawn del mundo objetivo - el candidato está dentro del borde del mundo
- el chunk del candidato está cargado (se carga bajo demanda sin generar)
- existe un bloque más alto no-aire en la columna candidata
- el bloque de superficie justo debajo del punto de aterrizaje es sólido y no líquido
- ese bloque de superficie no está en la lista configurada de materiales de suelo inseguros, y no es el techo de bedrock del Nether
- el punto de aterrizaje está a la altura mínima del mundo o por encima, y el bloque de llegada 51 bloques más arriba se mantiene por debajo de la altura máxima del mundo
- todos los bloques de la columna de airdrop de 52 bloques (desde el punto de aterrizaje hasta el bloque de la cabeza en la llegada) son aire o transitables
- ningún bloque de esa columna está en la lista configurada de materiales de cuerpo inseguros
- todas las integraciones de plugins de protección habilitadas permiten la ubicación
- ningún listener de
CannonRTPLocationValidationEventveta al candidato
En el Nether, CannonRTP rechaza el techo de bedrock y escanea hacia abajo buscando un suelo de caverna expuesto cuya columna de airdrop completa sea segura. Esto permite objetivos en el Nether sin soltar al jugador por encima del techo o a través de terreno sólido.
Los intentos de búsqueda están globalmente limitados a uno por tick (20/seg), repartidos equitativamente entre todos los cañones activos mediante round-robin. Cada cañón tiene su propio contador de tiempo agotado (searchTimeoutAttempts, por defecto 100, mínimo 10).
Estados del Cañón
Cada cañón tiene un estado interno visible mediante /wc status o /wc list:
| Visualización | Estado Interno | Significado |
|---|---|---|
| Disabled | -- | El cañón está explícitamente desactivado en su configuración |
| Charging | SEARCHING (cola vacía) | Aún precargando su primer lote de ubicaciones seguras |
| Maintaining | SEARCHING (cola no vacía) | Tiene algunas ubicaciones pero aún está rellenando los espacios consumidos |
| Ready | READY | Tiene suficientes ubicaciones precargadas (>= chargedLocationsPerCannon) para lanzar jugadores |
| Exhausted | EXHAUSTED | Consumió todos los searchTimeoutAttempts sin completar la reserva |
El estado interno de búsqueda es exactamente uno de tres valores (READY, SEARCHING, EXHAUSTED); Disabled se decide antes de consultarlo, y Charging / Maintaining son las dos representaciones de SEARCHING. Ready prevalece sobre Exhausted: un cañón que aún conserva su reserva cargada se muestra como Ready aunque su última ventana de búsqueda haya agotado el tiempo.
No existe un estado separado de "configuración inválida". Cuando el targetWorld de un cañón no puede resolverse, el cañón conserva su etiqueta de estado de búsqueda actual y la columna $reason de /wc status pasa a ser Target world <name> is not loaded. (La clave de mensaje statusLabels.invalid existe en messages.yml, pero nada la renderiza en la compilación actual.)
Un cañón lanzará jugadores en cuanto tenga al menos un destino en cola. El umbral chargedLocationsPerCannon solo afecta la etiqueta visual READY.
Expectativas de Ejecución
- Minecraft:
plugin.ymldeclaraapi-version: 1.21.4; el árbol de código actual se compila contra la API de Spigot26.2-R0.1-SNAPSHOT - Java:
21 - Software de servidor recomendado: Paper o un fork compatible actual
- MagmaCore:
2.2.0o superior (biblioteca compartida, incrustada en el plugin) - Dependencia opcional: FreeMinecraftModels (para modelos 3D animados de cañón)
Resiliencia
CannonRTP mantiene sus visuales y colas consistentes a través de eventos de ciclo de vida de mundos y chunks:
- cuando el chunk de un cañón se descarga, su etiqueta y modelo se despawnean; vuelven a aparecer al recargarse el chunk
- cuando el mundo de un cañón se descarga, el cañón se suspende; se reactiva si el mundo se carga de nuevo
- cuando FreeMinecraftModels se activa o desactiva durante la sesión, la caché de modelos se invalida y los visuales se refrescan en el siguiente tick
- antes del teletransporte del airdrop, el destino en cola se vuelve a comprobar contra el terreno, las integraciones de protección y los listeners de la API; si ha dejado de ser seguro, el lanzamiento recupera al jugador en lugar de comprometerse con coordenadas obsoletas
- la limpieza del lanzamiento elimina únicamente los efectos de Levitación, Invisibilidad y Caída Lenta que CannonRTP todavía posee, y restaura cualquier efecto anterior que hubiera reemplazado temporalmente en vez de borrar el estado más reciente de otro plugin
- si un lanzamiento no puede continuar porque su mundo de destino se descarga, CannonRTP recupera al jugador llevándolo al asiento del cañón o al spawn de otro mundo cargado, y mantiene la Caída Lenta cuando no hay un mundo de recuperación seguro disponible