Aller au contenu principal

CannonRTP (WorldCannon)

CannonRTP est un plugin de téléportation aléatoire multi-canons pour les serveurs Minecraft. « WorldCannon » est un ancien nom / nom de section du wiki ; le plugin s'enregistre sous le nom CannonRTP dans Bukkit, est distribué sous le nom CannonRTP.jar, et c'est ce nom que les joueurs et les administrateurs voient.

Détails de nommage importants :

  • Nom du plugin : CannonRTP
  • Commande racine : /cannonrtp
  • Alias : /crtp, /wc
  • Permissions : cannonrtp.admin, cannonrtp.use
  • Dossier de configuration : plugins/CannonRTP/

Ce qu'il fait

CannonRTP est un système d'atterrissage aléatoire multi-canons plutôt qu'un unique lanceur fixe. Chaque canon configuré peut être placé à un ou plusieurs emplacements dans le monde, et chaque placement surveille les joueurs entrant dans son rayon de déclenchement.

Chaque canon peut :

  • être placé plusieurs fois via /wc create et /wc place -- une seule configuration de canon pilote tous les placements
  • surveiller les joueurs entrant dans un rayon de déclenchement propre au canon (1,75 bloc par défaut)
  • précharger et maintenir une file d'emplacements d'atterrissage sûrs dans un monde cible configuré (le ciblage inter-mondes est pris en charge)
  • rejeter le terrain dangereux, les espaces obstrués, les terrains protégés et les emplacements hors des limites du monde
  • exiger optionnellement une permission supplémentaire propre au canon
  • propulser les joueurs à travers une séquence cinématique en cinq phases
  • afficher un canon 3D animé via FreeMinecraftModels (customModel propre au canon ou via une liste de priorité globale) ; à défaut, des particules orbitales aux couleurs changeantes sont utilisées si FMM n'est pas installé
  • afficher une étiquette de statut flottante en panneau d'affichage au-dessus du canon (Ready / Charging / Maintaining / Exhausted / Disabled / Invalid)

Déroulement du lancement

La séquence de lancement est pilotée par une machine à états en cinq phases (SEARCHING -> FIRING -> TELEPORTING -> DROPPING -> LANDING). Lorsqu'un joueur entre dans le rayon de déclenchement d'un canon éligible :

  1. CannonRTP vérifie cannonrtp.use.
  2. Il vérifie le requiredPermission optionnel du canon.
  3. Il vérifie que le canon est activé, possède une configuration valide et a au moins un emplacement d'atterrissage préchargé dans la file.
  4. Il consomme un emplacement d'atterrissage sûr préchargé dans la file de ce canon.
  5. Il déclenche l'événement CannonRTPLaunchEvent (annulable). Si un listener l'annule, la destination est remise dans la file et le canon reprend son comportement normal.
  6. Phase Searching (42 ticks par défaut, configurable via launchWarmupTicks) : le joueur reçoit Lévitation, le canon joue son animation fire si un modèle personnalisé est actif, et des aperçus de coordonnées aléatoires défilent dans le titre/sous-titre. Tant qu'un modèle est actif, le joueur reçoit également Invisibilité pour que l'animation soit lisible.
  7. Phase Firing (45 ticks par défaut via verticalBoostTicks) : Lévitation/Invisibilité sont retirées, le son de décollage est joué, une explosion de flammes+fumée+explosion apparaît, et verticalBoostVelocity est appliqué à chaque tick. Les véritables coordonnées de destination sont révélées.
  8. Phase Teleporting (un seul tick) : le joueur est téléporté 50 blocs au-dessus de la destination (limité à la hauteur maximale du monde) et Chute Lente est appliquée.
  9. Phase Dropping : le joueur descend doucement avec une traînée de fumée (LARGE_SMOKE + CAMPFIRE_SIGNAL_SMOKE).
  10. Phase Landing : Chute Lente est retirée plus tôt lorsque le joueur touche le sol (ou que la durée maximale de chute expire) et une explosion d'impact se déclenche (onde de choc nuageuse, anneau de flammes, transition de poussière). CannonRTPLandingEvent est déclenché.

Règles de sécurité d'atterrissage

Avant qu'un emplacement ne soit accepté dans la file de préchargement, le code actuel vérifie, dans l'ordre :

  • que le monde cible est chargé
  • que le centre de recherche est valide
  • que le candidat est dans les limites du monde
  • que le chunk candidat est chargé (chargé à la demande sans génération)
  • qu'un bloc non-air le plus haut existe dans la colonne candidate
  • que les espaces des pieds et de la tête au-dessus de ce bloc sont franchissables
  • que le bloc de surface est solide et non liquide
  • que le bloc de surface n'est pas dans la liste de matériaux de sol dangereux configurée
  • que les blocs des pieds et de la tête ne sont pas dans la liste de matériaux corporels dangereux configurée
  • que toutes les intégrations de plugins de protection activées autorisent l'emplacement
  • qu'aucun listener CannonRTPLocationValidationEvent ne rejette le candidat

Les tentatives de recherche sont limitées globalement à une par tick (20/s), réparties équitablement entre tous les canons actifs selon un tourniquet. Chaque canon a son propre compteur de timeout (searchTimeoutAttempts, 100 par défaut, minimum 10).

États du canon

Chaque canon possède un état interne visible via /wc status ou /wc list :

AffichageÉtat interneSignification
Disabled--Le canon est explicitement désactivé dans sa configuration
ChargingSEARCHING (file vide)Toujours en cours de préchargement de son premier lot d'emplacements sûrs
MaintainingSEARCHING (file non vide)Possède des emplacements mais comble encore les places consommées
ReadyREADYPossède suffisamment d'emplacements préchargés (>= chargedLocationsPerCannon) pour lancer les joueurs
ExhaustedEXHAUSTEDA épuisé searchTimeoutAttempts sans remplir la réserve
InvalidINVALID_CONFIGURATIONErreur de configuration (par ex. le monde cible n'est pas chargé)

Un canon lancera les joueurs dès qu'il aura au moins une destination en file. Le seuil chargedLocationsPerCannon n'affecte que l'étiquette visuelle READY.

Exigences d'exécution

  • API Minecraft : 1.21.4 (testé jusqu'à 1.21.11)
  • Java : 21
  • Logiciel serveur recommandé : Paper ou un fork compatible actuel
  • MagmaCore : 2.2.0 ou plus récent (bibliothèque partagée, incluse dans le plugin)
  • Dépendance optionnelle : FreeMinecraftModels (pour les modèles 3D animés du canon)

Résilience

CannonRTP maintient ses visuels et ses files cohérents à travers les événements du cycle de vie des mondes et des chunks :

  • lorsque le chunk d'un canon se décharge, son étiquette et son modèle sont supprimés ; ils réapparaissent au rechargement du chunk
  • lorsque le monde d'un canon se décharge, le canon est suspendu ; il se réveille si le monde est rechargé
  • lorsque FreeMinecraftModels est activé ou désactivé en cours de session, le cache de modèles est invalidé et les visuels sont rafraîchis au tick suivant

Pour commencer