CannonRTP (WorldCannon)
O CannonRTP é um plugin de teletransporte aleatório com múltiplos canhões para servidores de Minecraft. "WorldCannon" é um nome mais antigo / da seção da wiki; o plugin é registrado como CannonRTP no Bukkit, é distribuído como CannonRTP.jar, e é esse o nome que jogadores e administradores veem.
Detalhes importantes de nomenclatura:
- Nome do plugin:
CannonRTP - Comando raiz:
/cannonrtp - Aliases:
/crtp,/wc - Permissões:
cannonrtp.admin,cannonrtp.use - Pasta de configuração:
plugins/CannonRTP/
O Que Ele Faz
O CannonRTP é um sistema de pouso aleatório com múltiplos canhões, e não apenas um único lançador fixo. Cada canhão configurado pode ser posicionado em um ou vários locais do mundo, e cada posicionamento monitora os jogadores que entram no seu raio de ativação.
Cada canhão pode:
- ser posicionado várias vezes via
/wc createe/wc place-- uma única configuração de canhão controla todas as instâncias - monitorar a entrada de jogadores em um raio de ativação por canhão (padrão de 1.75 blocos)
- pré-carregar e manter uma fila de locais de pouso seguros em um mundo de destino configurado (mira entre mundos é suportada)
- rejeitar terrenos inseguros, espaços bloqueados, áreas protegidas e locais fora do limite do mundo
- exigir opcionalmente uma permissão adicional por canhão
- lançar jogadores através de uma sequência cinemática de cinco fases
- exibir um canhão 3D animado do FreeMinecraftModels (
customModelpor canhão ou via lista de prioridade global); recorre a partículas em órbita com mudança de cor quando o FMM não está instalado - mostrar uma etiqueta flutuante de status (Ready / Charging / Maintaining / Exhausted / Disabled / Invalid) sempre virada para o jogador, acima do canhão
Fluxo de Lançamento
A sequência de lançamento é controlada por uma máquina de estados de cinco fases (SEARCHING -> FIRING -> TELEPORTING -> DROPPING -> LANDING). Quando um jogador entra no raio de ativação de um canhão elegível:
- O CannonRTP verifica
cannonrtp.use. - Ele verifica o
requiredPermissionopcional do canhão. - Ele confirma que o canhão está ativado, possui configuração válida e tem pelo menos um local de pouso pré-carregado na fila.
- Ele consome um local de pouso seguro pré-carregado da fila desse canhão.
- Ele dispara
CannonRTPLaunchEvent(cancelável). Se um listener cancelar o evento, o destino retorna para a fila e o canhão volta ao comportamento normal. - Fase Searching (padrão de 42 ticks, configurável via
launchWarmupTicks): o jogador recebe Levitação, o canhão executa sua animaçãofirecaso um modelo customizado esteja ativo, e prévias de coordenadas aleatórias piscam no título/subtítulo. Enquanto um modelo está ativo, o jogador também recebe Invisibilidade para que a animação fique nítida. - Fase Firing (padrão de 45 ticks via
verticalBoostTicks): Levitação/Invisibilidade são removidas, o som de decolagem toca, uma rajada de fogo+fumaça+explosão é gerada, everticalBoostVelocityé aplicada a cada tick. As coordenadas reais do destino são reveladas. - Fase Teleporting (um único tick): o jogador é teleportado 50 blocos acima do destino (limitado à altura máxima do mundo) e Slow Falling é aplicado.
- Fase Dropping: o jogador desce lentamente com um rastro de fumaça (
LARGE_SMOKE+CAMPFIRE_SIGNAL_SMOKE). - Fase Landing: o Slow Falling é removido antes do tempo quando o jogador toca o chão (ou quando a duração máxima da queda expira) e uma rajada de impacto é exibida (onda de choque de nuvem, anel de chamas, transição de poeira).
CannonRTPLandingEventé disparado.
Regras de Segurança do Pouso
Antes de uma localização ser aceita na fila de pré-carregamento, o código atual verifica, nesta ordem:
- o mundo de destino está carregado
- o centro de busca é válido
- o candidato está dentro do limite do mundo
- o chunk do candidato está carregado (carregado sob demanda, sem gerar terreno)
- existe um bloco mais alto que não é ar na coluna do candidato
- os espaços dos pés e da cabeça acima desse bloco são atravessáveis
- o bloco da superfície é sólido e não é líquido
- o bloco da superfície não está na lista configurada de materiais de solo inseguros
- os blocos dos pés e da cabeça não estão na lista configurada de materiais corporais inseguros
- todas as integrações ativas com plugins de proteção permitem o local
- nenhum listener de
CannonRTPLocationValidationEventveta o candidato
As tentativas de busca são globalmente limitadas a uma por tick (20/segundo), distribuídas de forma justa entre todos os canhões ativos via round-robin. Cada canhão tem seu próprio contador de timeout (searchTimeoutAttempts, padrão 100, mínimo 10).
Estados do Canhão
Cada canhão tem um estado interno visível via /wc status ou /wc list:
| Exibição | Estado Interno | Significado |
|---|---|---|
| Disabled | -- | O canhão está explicitamente desativado em sua configuração |
| Charging | SEARCHING (fila vazia) | Ainda pré-carregando seu primeiro lote de locais seguros |
| Maintaining | SEARCHING (fila não vazia) | Possui alguns locais, mas ainda está reabastecendo as vagas consumidas |
| Ready | READY | Possui locais pré-carregados suficientes (>= chargedLocationsPerCannon) para lançar jogadores |
| Exhausted | EXHAUSTED | Esgotou searchTimeoutAttempts sem completar a reserva |
| Invalid | INVALID_CONFIGURATION | Erro de configuração (ex.: mundo de destino não carregado) |
Um canhão lançará jogadores assim que tiver pelo menos um destino na fila. O limite chargedLocationsPerCannon afeta apenas a etiqueta visual READY.
Expectativas de Runtime
- API do Minecraft:
1.21.4(testado até1.21.11) - Java:
21 - Software de servidor recomendado: Paper ou um fork compatível atual
- MagmaCore:
2.2.0ou mais recente (biblioteca compartilhada, embutida no plugin via shade) - Dependência opcional: FreeMinecraftModels (para modelos 3D animados de canhão)
Resiliência
O CannonRTP mantém seus visuais e filas consistentes entre eventos de ciclo de vida de mundos e chunks:
- quando o chunk de um canhão é descarregado, sua etiqueta e modelo são removidos; eles reaparecem quando o chunk é recarregado
- quando o mundo de um canhão é descarregado, o canhão é suspenso; ele volta a operar se o mundo for carregado novamente
- quando o FreeMinecraftModels é ativado ou desativado durante a sessão, o cache de modelos é invalidado e os visuais são atualizados no próximo tick