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) sempre virada para o jogador, acima do canhão
Fluxo de Lançamento
Gere ou explore a área de pesquisa configurada no mundo de destino antes de usar o canhão. CannonRTP carrega chunks existentes sem gerar terreno; um raio por explorar pode ficar sem destinos.
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 verifica o cooldown de lançamento por jogador (
runtime.launchCooldownSeconds, padrão de 30 segundos). O bloqueio vale para todos os canhões e não consome um destino da fila. - Ele confirma que o canhão tem pelo menos um local de pouso pré-carregado na fila. (Canhões desativados, canhões em um mundo descarregado e canhões em um chunk descarregado nunca chegam a este ponto -- eles são totalmente excluídos do laço de tick, então não podem ser acionados de forma alguma.)
- 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 nenhum cooldown é iniciado. - 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 destino da fila é revalidado (coluna de terreno, integrações de proteção, listeners da API). Se ele continuar válido, o jogador é teleportado exatamente 50 blocos acima dele e Slow Falling é aplicado. A altura do airdrop nunca é limitada -- o validador de pouso já garante que o bloco de chegada fique abaixo da altura máxima do mundo, e um destino que deixa de ser válido cancela o lançamento e recupera o jogador.
- Fase Dropping: o jogador desce lentamente com um rastro de fumaça (
LARGE_SMOKE+CAMPFIRE_SIGNAL_SMOKE). - Fase Landing: iniciada assim que o jogador toca o chão. O Slow Falling é removido, uma rajada de impacto é exibida (onda de choque de nuvem, anel de chamas, transição de poeira) e
CannonRTPLandingEventé disparado. Se a queda ultrapassar sua duração máxima (slowFallingSecondsx 20 ticks), o CannonRTP recupera o jogador e nenhum evento de pouso é emitido.
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 (enquanto não estiver, o canhão para de pré-carregar e reporta
Target world <name> is not loaded.) - o centro de busca é resolvido -- o
searchCenterconfigurado, ou então a própria localização do canhão quando ele está no mundo de destino, ou então o spawn do mundo de destino - 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
- o bloco de superfície logo abaixo do ponto de pouso é sólido e não é líquido
- esse bloco de superfície não está na lista configurada de materiais de solo inseguros, e não é o teto de bedrock do Nether
- o ponto de pouso está na altura mínima do mundo ou acima dela, e o bloco de chegada 51 blocos acima dele permanece abaixo da altura máxima do mundo
- todos os blocos da coluna de airdrop de 52 blocos (do ponto de pouso até o bloco da cabeça na chegada) são ar ou atravessáveis
- nenhum bloco dessa coluna está 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
No Nether, o CannonRTP rejeita o teto de bedrock e busca para baixo um chão de caverna exposto cuja coluna de airdrop completa seja segura. Isso permite destinos no Nether sem soltar o jogador acima do teto ou dentro de terreno sólido.
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 |
O estado interno de busca é um de exatamente três valores (READY, SEARCHING, EXHAUSTED); Disabled é decidido antes de ele ser consultado, e Charging / Maintaining são as duas representações de SEARCHING. Ready prevalece sobre Exhausted -- um canhão que ainda mantém sua reserva carregada aparece como Ready mesmo que sua última janela de busca tenha expirado.
Não existe um estado separado de "configuração inválida". Quando o targetWorld de um canhão não pode ser resolvido, o canhão mantém a etiqueta do seu estado de busca atual e a coluna $reason de /wc status passa a ser Target world <name> is not loaded. (A chave de mensagem statusLabels.invalid existe em messages.yml, mas nada a renderiza na build atual.)
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
- Minecraft: o
plugin.ymldeclaraapi-version: 1.21.4; a árvore de código atual é compilada contra a API do Spigot26.2-R0.1-SNAPSHOT - 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
- antes do teletransporte do airdrop, o destino da fila é reverificado contra terreno, integrações de proteção e listeners da API; se ele se tornou inseguro, o lançamento recupera o jogador em vez de usar coordenadas desatualizadas
- a limpeza do lançamento remove apenas os efeitos de Levitação, Invisibilidade e Slow Falling que ainda pertencem ao CannonRTP, e restaura qualquer efeito anterior que ele tenha substituído temporariamente, em vez de apagar o estado mais recente de outro plugin
- se um lançamento não puder continuar porque o mundo de destino foi descarregado, o CannonRTP recupera o jogador para o assento do canhão ou para o spawn de outro mundo carregado, e mantém o Slow Falling quando não há mundo seguro de recuperação disponível