Aller au contenu principal

CannonRTP (WorldCannon)

CannonRTP est un plugin de téléportation aléatoire à plusieurs canons pour les serveurs Minecraft. « WorldCannon » est son ancien nom, conservé pour la section du wiki. Le plugin s'enregistre dans Bukkit sous le nom CannonRTP, est distribué sous le nom CannonRTP.jar et apparaît ainsi aux joueurs comme aux administrateurs.

Noms à retenir :

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

Fonctionnement​

CannonRTP propose plusieurs canons à destination aléatoire, plutôt qu'un lanceur unique à destination fixe. Chaque canon configuré peut être placé à un ou plusieurs endroits du monde. Chaque placement surveille l'entrée des joueurs dans son rayon de déclenchement.

Chaque canon peut :

  • être placé plusieurs fois avec /wc create et /wc place, une même configuration contrôlant tous ses placements
  • détecter les joueurs entrant dans son rayon de déclenchement propre, fixé par défaut à 1,75 bloc
  • précharger et maintenir une file d'emplacements d'atterrissage sûrs dans un monde cible configuré, y compris dans un autre monde
  • rejeter les terrains dangereux, les espaces obstrués, les terrains protégés et les emplacements hors de la bordure du monde
  • exiger, si nécessaire, une permission supplémentaire propre au canon
  • lancer les joueurs dans une séquence cinématique en cinq phases
  • afficher un canon 3D animé avec FreeMinecraftModels, grâce au customModel du canon ou à une liste de priorité globale ; si FMM n'est pas installé, des particules en orbite aux couleurs changeantes le remplacent
  • afficher au-dessus du canon une étiquette flottante orientée vers le joueur, indiquant son état : Ready, Charging, Maintaining ou Exhausted ; un canon désactivé ne fait apparaître ni étiquette ni modèle et n'apparaît comme Disabled que dans /wc list et /wc status

Déroulement d'un lancement​

Avant d'utiliser un canon, générez ou explorez la zone de recherche configurée dans le monde cible. CannonRTP charge les chunks existants sans générer de terrain ; une zone inexplorée peut donc ne fournir aucune destination.

La séquence de lancement suit cinq phases : SEARCHING -> FIRING -> TELEPORTING -> DROPPING -> LANDING. Lorsqu'un joueur entre dans le rayon de déclenchement d'un canon admissible :

  1. CannonRTP vérifie cannonrtp.use.
  2. Il vérifie l'éventuelle requiredPermission du canon.
  3. Il vérifie le délai de récupération du joueur, runtime.launchCooldownSeconds, fixé par défaut à 30 secondes. Cette restriction s'applique à tous les canons et ne consomme aucune destination de la file.
  4. Il vérifie que le canon possède au moins une destination d'atterrissage préchargée. Les canons désactivés, situés dans un monde non chargé ou dans un chunk non chargé n'atteignent jamais cette étape : ils sont entièrement exclus de la boucle de tick et ne peuvent donc pas être déclenchés.
  5. Il consomme une destination sûre préchargée dans la file de ce canon.
  6. Il déclenche CannonRTPLaunchEvent, qui est annulable. Si un écouteur l'annule, la destination retourne dans la file et aucun délai de récupération ne démarre.
  7. Phase de recherche : 42 ticks par défaut, configurables avec launchWarmupTicks. Le joueur reçoit Lévitation, le canon joue l'animation fire si un modèle personnalisé est actif, et des aperçus de coordonnées aléatoires défilent dans le titre et le sous-titre. Lorsqu'un modèle est actif, le joueur reçoit aussi Invisibilité pour ne pas gêner l'animation.
  8. Phase de tir : 45 ticks par défaut, via verticalBoostTicks. Lévitation et Invisibilité sont retirées, le son de décollage est joué, une gerbe de flammes, de fumée et d'explosion apparaît, et verticalBoostVelocity est appliqué à chaque tick. Les véritables coordonnées de destination sont révélées.
  9. Phase de téléportation : un seul tick. La destination en file est vérifiée de nouveau auprès de la colonne de terrain, des intégrations de protection et des écouteurs de l'API. Si elle reste valide, le joueur est téléporté exactement 50 blocs au-dessus et reçoit Chute lente. La hauteur de largage n'est jamais réduite pour respecter un plafond : le validateur garantit déjà que le bloc d'arrivée se trouve sous la hauteur maximale du monde. Si la destination n'est plus valide, le lancement est annulé et le joueur est récupéré.
  10. Phase de descente : le joueur descend lentement avec une traînée de fumée, LARGE_SMOKE et CAMPFIRE_SIGNAL_SMOKE.
  11. Phase d'atterrissage : elle commence lorsque le joueur est au sol et que sa vitesse verticale est inférieure à 0,08 bloc par tick. CannonRTP retire son propre effet Chute lente, joue un effet d'impact — onde de choc de nuages, anneau de flammes et transition de poussière — puis déclenche CannonRTPLandingEvent. Si la descente dépasse sa durée maximale, slowFallingSeconds × 20 ticks, CannonRTP récupère le joueur sans émettre d'événement d'atterrissage.

Règles de sécurité des atterrissages​

Avant d'accepter un emplacement dans la file de préchargement, le code actuel vérifie dans l'ordre :

  • que le monde cible est chargé ; sinon, le canon suspend le préchargement et signale Target world <name> is not loaded.
  • que le centre de recherche peut être déterminé : searchCenter s'il est configuré, sinon la position du canon s'il se trouve dans le monde cible, sinon le point d'apparition de ce monde
  • que le candidat se trouve à l'intérieur de la bordure du monde
  • que son chunk est chargé, à la demande et sans génération
  • qu'il existe un bloc non vide le plus haut dans la colonne candidate
  • que le bloc de surface directement sous l'atterrissage est solide et non liquide
  • que ce bloc ne figure pas dans la liste configurée des matériaux de sol dangereux et ne correspond pas au plafond de bedrock du Nether
  • que l'atterrissage est au moins à la hauteur minimale du monde et que le bloc d'arrivée situé 51 blocs au-dessus reste sous sa hauteur maximale
  • que chacun des 52 blocs de la colonne de largage, depuis l'atterrissage jusqu'à l'espace de la tête à l'arrivée, est de l'air ou peut être traversé
  • qu'aucun bloc de cette colonne ne figure dans la liste configurée des matériaux dangereux pour le corps
  • que toutes les intégrations de protection activées autorisent l'emplacement
  • qu'aucun écouteur de CannonRTPLocationValidationEvent ne rejette le candidat

Dans le Nether, CannonRTP rejette le plafond de bedrock et recherche vers le bas un sol de caverne dégagé dont toute la colonne de largage est sûre. Il peut ainsi cibler le Nether sans déposer le joueur au-dessus du plafond ni le faire traverser du terrain solide.

Les recherches sont limitées globalement à une tentative par tick, soit 20 par seconde, réparties équitablement entre les canons actifs par alternance. Chaque canon possède son propre compteur de tentatives, searchTimeoutAttempts, fixé par défaut à 100 et au minimum à 10.

États des canons​

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

AffichageÉtat interneSignification
Disabled--Le canon est explicitement désactivé dans sa configuration
ChargingSEARCHING, file videLe préchargement du premier lot de destinations sûres est en cours
MaintainingSEARCHING, file non videCertaines destinations sont disponibles, mais la file se remplit encore pour remplacer celles consommées
ReadyREADYLe nombre de destinations préchargées est suffisant, soit >= chargedLocationsPerCannon, pour lancer les joueurs
ExhaustedEXHAUSTEDsearchTimeoutAttempts a été épuisé sans remplir la réserve

L'état interne de recherche prend exactement l'une des trois valeurs READY, SEARCHING ou EXHAUSTED. Disabled est déterminé avant de le consulter, et Charging et Maintaining sont les deux affichages de SEARCHING. Ready est prioritaire sur Exhausted : un canon qui possède encore toute sa réserve apparaît comme Ready même si sa dernière période de recherche s'est achevée sans succès.

Un canon affiche aussi Exhausted sans examiner aucun terrain lorsque l'intégration d'un plugin de protection activé n'a pas pu se charger et que failOpenOnProtectionErrors vaut false. Voir Intégrations de protection.

Il n'existe pas d'état distinct « configuration invalide ». Lorsque le monde cible devient indisponible, ses destinations sont supprimées de la file et la recherche revient à SEARCHING. Une file vide affiche Charging, et la colonne $reason de /wc status indique Target world <name> is not loaded.. La recherche reprend lorsque le monde cible est chargé. La clé statusLabels.invalid existe dans messages.yml, mais n'est pas affichée.

Un canon peut lancer des joueurs dès qu'il possède une seule destination dans sa file. Le seuil chargedLocationsPerCannon ne concerne que l'étiquette visuelle READY.

Environnement d'exécution​

  • Minecraft : plugin.yml déclare api-version: 1.21.4 ; les sources actuelles sont compilées contre l'API Spigot 26.3-R0.1-SNAPSHOT
  • Java : 21
  • Logiciel serveur recommandé : Paper ou un fork actuel compatible
  • MagmaCore : 2.2.0 ou version ultérieure, bibliothèque partagée intégrée au plugin par shading
  • Dépendance facultative : FreeMinecraftModels pour les canons 3D animés
  • Statistiques : CannonRTP transmet des statistiques d'utilisation anonymes à bStats (identifiant du plugin : 34460). Pour les désactiver, définissez enabled: false dans plugins/bStats/config.yml, ce qui s'applique à tous les plugins du serveur utilisant bStats.

Résilience​

CannonRTP maintient la cohérence de ses visuels et de ses files lors des changements de cycle de vie des mondes et des chunks :

  • lorsque le chunk d'un canon est déchargé, son étiquette et son modèle sont supprimés ; ils réapparaissent au rechargement du chunk
  • lorsque le monde d'un canon est déchargé, le canon est suspendu et reprend son activité si le monde est chargé de nouveau
  • lorsque FreeMinecraftModels est activé, désactivé ou termine un rechargement de contenu sur une version qui fournit l'événement de fin de rechargement, les anciens modèles de canons sont supprimés et recréés à partir du registre de modèles actuel ; les instances supprimées sont aussi détectées directement sur les anciennes versions de FMM dépourvues de cet événement
  • avant la téléportation de largage, la destination en file est vérifiée de nouveau auprès du terrain, des protections et des écouteurs de l'API ; si elle est devenue dangereuse, le lancement récupère le joueur au lieu d'utiliser des coordonnées périmées
  • le nettoyage du lancement retire uniquement les effets Lévitation, Invisibilité et Chute lente dont CannonRTP est encore responsable ; il restaure les effets antérieurs temporairement remplacés, sans supprimer un état plus récent établi par un autre plugin
  • si un lancement ne peut pas continuer parce que son monde de destination est déchargé, CannonRTP récupère le joueur au siège du canon ou au point d'apparition d'un autre monde chargé ; il conserve Chute lente si aucun monde de récupération sûr n'est disponible
  • /wc reload, une mise à jour du plugin sans redémarrage et chaque commande de modification de canon (create, place, remove, delete, target, center) reconstruisent tous les canons : les lancements en cours sont annulés et les joueurs ramenés au siège du canon, les destinations en file sont abandonnées puis recherchées de nouveau, et les délais de récupération entre lancements sont réinitialisés
  • si un joueur se déconnecte en plein lancement, celui-ci prend fin et CannonRTP retire les effets qu'il a appliqués ; le joueur n'est pas téléporté

Pour commencer​