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 createund/wc placeplatziert 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
customModeloder ü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:
- CannonRTP prüft
cannonrtp.use. - Es prüft die optionale
requiredPermissionder Kanone. - Es verifiziert, dass die Kanone aktiviert ist, eine gültige Konfiguration hat und mindestens einen vorgeladenen Landeort in der Warteschlange hat.
- Es entnimmt einen vorgeladenen sicheren Landeort aus der Warteschlange dieser Kanone.
- 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. - Suchphase (Standard 42 Ticks, konfigurierbar über
launchWarmupTicks): Der Spieler erhält Levitation, die Kanone spielt ihrefire-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. - Feuerphase (Standard 45 Ticks über
verticalBoostTicks): Levitation/Unsichtbarkeit werden entfernt, der Abschuss-Sound wird abgespielt, ein Flammen-+Rauch-+Explosionsausbruch erscheint, undverticalBoostVelocitywird bei jedem Tick angewendet. Die echten Zielkoordinaten werden offenbart. - Teleportphase (einzelner Tick): Der Spieler wird 50 Blöcke über das Ziel teleportiert (begrenzt auf die maximale Welthöhe) und Langsamer Fall wird angewendet.
- Fallphase: Der Spieler treibt mit einer Rauchspur (
LARGE_SMOKE+CAMPFIRE_SIGNAL_SMOKE) nach unten. - 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).
CannonRTPLandingEventwird 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:
| Anzeige | Interner Zustand | Bedeutung |
|---|---|---|
| Disabled | -- | Die Kanone ist in ihrer Konfiguration explizit deaktiviert |
| Charging | SEARCHING (Warteschlange leer) | Lädt noch ihren ersten Stapel sicherer Orte vor |
| Maintaining | SEARCHING (Warteschlange nicht leer) | Hat einige Orte, füllt aber noch verbrauchte Plätze auf |
| Ready | READY | Hat genügend vorgeladene Orte (>= chargedLocationsPerCannon), um Spieler zu starten |
| Exhausted | EXHAUSTED | Hat searchTimeoutAttempts aufgebraucht, ohne die Reserve zu füllen |
| Invalid | INVALID_CONFIGURATION | Konfigurationsfehler (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 bis1.21.11) - Java:
21 - Empfohlene Serversoftware: Paper oder ein aktueller kompatibler Fork
- MagmaCore:
2.1.0oder 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