Zum Hauptinhalt springen

CannonRTP (WorldCannon)

CannonRTP ist ein Multi-Kanonen-Zufallsteleportations-Plugin für Minecraft-Server. Das Projekt heißt intern WorldCannon, aber das Plugin registriert sich in Bukkit als CannonRTP und das ist der Name, den Spieler und Admins sehen.

Wichtige Namensdetails:

  • Plugin-Name: CannonRTP
  • Hauptbefehl: /cannonrtp
  • Aliase: /crtp, /wc
  • Berechtigungen: cannonrtp.admin, cannonrtp.use
  • Konfigurationsordner: plugins/CannonRTP/

Was es macht

CannonRTP ist ein Multi-Kanonen-Zufallslandesystem statt eines einzelnen festen Launchers. Jede konfigurierte Kanone kann an einer oder mehreren Stellen in der Welt platziert werden, und jede Platzierung überwacht Spieler, die in ihren Auslöseradius treten.

Jede Kanone kann:

  • mehrfach über /wc create und /wc place platziert werden -- eine einzige Kanonenkonfiguration steuert jede Platzierung
  • Spieler erkennen, die einen kanonenspezifischen Auslöseradius betreten (Standard 1,75 Blöcke)
  • eine Warteschlange sicherer Landeorte in einer konfigurierten Zielwelt vorladen und pflegen (welteübergreifendes Targeting wird unterstützt)
  • unsicheres Gelände, blockierte Räume, geschütztes Land und Orte außerhalb der Weltgrenze ablehnen
  • optional eine zusätzliche kanonenspezifische Berechtigung erfordern
  • Spieler durch eine fünfphasige cinematische Sequenz starten
  • ein FreeMinecraftModels 3D-animiertes Kanonenmodell anzeigen (pro Kanone customModel oder über eine globale Prioritätsliste); fällt auf farbwechselnde Orbitpartikel zurück, wenn FMM nicht installiert ist
  • ein schwebendes, billboardiertes Statuslabel über der Kanone anzeigen (Bereit / Auflädt / Pflegt / Erschöpft / Deaktiviert / Ungültig)

Startablauf

Die Startsequenz wird von einer fünfphasigen Zustandsmaschine gesteuert (SEARCHING -> FIRING -> TELEPORTING -> DROPPING -> LANDING). Wenn ein Spieler den Auslöseradius einer berechtigten Kanone betritt:

  1. CannonRTP prüft cannonrtp.use.
  2. Es prüft die optionale requiredPermission der Kanone.
  3. Es verifiziert, dass die Kanone aktiviert ist, eine gültige Konfiguration hat und mindestens einen vorgeladenen Landeort in der Warteschlange hat.
  4. Es entnimmt einen vorgeladenen sicheren Landeort aus der Warteschlange dieser Kanone.
  5. Es feuert CannonRTPLaunchEvent (abbrechbar). Wenn ein Listener es abbricht, wird das Ziel an die Warteschlange zurückgegeben und die Kanone nimmt den normalen Betrieb wieder auf.
  6. Suchphase (Standard 42 Ticks, konfigurierbar über launchWarmupTicks): Der Spieler erhält Levitation, die Kanone spielt ihre fire-Animation ab, falls ein benutzerdefiniertes Modell aktiv ist, und zufällige Koordinatenvorschauen flackern durch Titel/Untertitel. Solange ein Modell aktiv ist, erhält der Spieler außerdem Unsichtbarkeit, damit die Animation klar zu sehen ist.
  7. Feuerphase (Standard 45 Ticks über verticalBoostTicks): Levitation/Unsichtbarkeit werden entfernt, der Abschuss-Sound wird abgespielt, ein Flammen-+Rauch-+Explosionsausbruch erscheint, und verticalBoostVelocity wird bei jedem Tick angewendet. Die echten Zielkoordinaten werden offenbart.
  8. Teleportphase (einzelner Tick): Der Spieler wird 50 Blöcke über das Ziel teleportiert (begrenzt auf die maximale Welthöhe) und Langsamer Fall wird angewendet.
  9. Fallphase: Der Spieler treibt mit einer Rauchspur (LARGE_SMOKE + CAMPFIRE_SIGNAL_SMOKE) nach unten.
  10. Landephase: Langsamer Fall wird vorzeitig entfernt, sobald der Spieler den Boden berührt (oder die maximale Falldauer abläuft), und ein Aufschlagsausbruch wird abgespielt (Wolken-Schockwelle, Flammenring, Staubübergang). CannonRTPLandingEvent wird gefeuert.

Landesicherheitsregeln

Bevor ein Ort in die Vorladewarteschlange aufgenommen wird, prüft der aktuelle Code in dieser Reihenfolge:

  • die Zielwelt ist geladen
  • das Suchzentrum ist gültig
  • der Kandidat liegt innerhalb der Weltgrenze
  • der Kandidaten-Chunk ist geladen (bei Bedarf geladen, ohne zu generieren)
  • ein höchster nicht-leerer Block existiert in der Kandidatenspalte
  • die Fuß- und Kopfbereiche über diesem Block sind passierbar
  • der Oberflächenblock ist fest und nicht-flüssig
  • der Oberflächenblock ist nicht in der konfigurierten Liste unsicherer Bodenmaterialien
  • die Fuß- und Kopfblöcke sind nicht in der konfigurierten Liste unsicherer Körpermaterialien
  • alle aktivierten Schutz-Plugin-Integrationen erlauben den Ort
  • kein CannonRTPLocationValidationEvent-Listener verwirft den Kandidaten

Suchversuche sind global auf einen pro Tick (20/Sek.) ratenbeschränkt und werden über Round-Robin fair auf alle aktiven Kanonen verteilt. Jede Kanone hat ihren eigenen Timeout-Zähler (searchTimeoutAttempts, Standard 100).

Kanonenzustände

Jede Kanone hat einen internen Zustand, der über /wc status oder /wc list sichtbar ist:

AnzeigeInterner ZustandBedeutung
Disabled--Die Kanone ist in ihrer Konfiguration explizit deaktiviert
ChargingSEARCHING (Warteschlange leer)Lädt noch ihren ersten Stapel sicherer Orte vor
MaintainingSEARCHING (Warteschlange nicht leer)Hat einige Orte, füllt aber noch verbrauchte Plätze auf
ReadyREADYHat genügend vorgeladene Orte (>= chargedLocationsPerCannon), um Spieler zu starten
ExhaustedEXHAUSTEDHat searchTimeoutAttempts aufgebraucht, ohne die Reserve zu füllen
InvalidINVALID_CONFIGURATIONKonfigurationsfehler (z. B. Zielwelt ist nicht geladen)

Eine Kanone startet Spieler, sobald sie mindestens ein Ziel in der Warteschlange hat. Der Schwellenwert chargedLocationsPerCannon betrifft nur das visuelle READY-Label.

Laufzeitanforderungen

  • Minecraft-API: 1.21.4 (getestet bis 1.21.11)
  • Java: 21
  • Empfohlene Serversoftware: Paper oder ein aktueller kompatibler Fork
  • MagmaCore: 2.1.0 oder neuer (gemeinsam genutzte Bibliothek)
  • Optionale Abhängigkeit: FreeMinecraftModels (für 3D-animierte Kanonenmodelle)

Robustheit

CannonRTP hält seine Visuals und Warteschlangen über Welt- und Chunk-Lebenszyklusereignisse hinweg konsistent:

  • wenn der Chunk einer Kanone entladen wird, werden ihr Label und Modell entfernt; sie tauchen beim erneuten Laden des Chunks wieder auf
  • wenn die Welt einer Kanone entladen wird, wird die Kanone ausgesetzt; sie erwacht wieder, wenn die Welt erneut geladen wird
  • wenn FreeMinecraftModels mitten in einer Sitzung aktiviert oder deaktiviert wird, wird der Modell-Cache invalidiert und die Visuals werden im nächsten Tick aktualisiert

Hier starten