Ghost
Überblick
In einem Netzwerk aus mehreren Backend-Servern können sich zwei Spieler, die in derselben Karte auf verschiedenen Servern stehen, nicht sehen. Ghost behebt das optisch: Jeder Server veröffentlicht Position, Rotation und Skin seiner Spieler über Redis, und die anderen Server zeichnen sie per Paket als spielerförmige Geister. Der Welt wird nichts hinzugefügt, und ein Geist hat keine serverseitige Entity, sodass er nicht geschlagen, geschoben oder anvisiert werden kann.
Jeder Spieler entscheidet selbst, ob er Geister sieht. Die Wahl wird in einem TypeWriter-Fact gespeichert, übersteht also Neustarts und folgt dem Spieler von Server zu Server. Geister erscheinen nur zwischen Servern, die dieselbe redis.group-id in der MySQL-Konfiguration teilen, und ein Server zeichnet seine eigenen Spieler nie als Geister.
Funktionen
- Serverübergreifende Geister — Spieler anderer Backend-Server erscheinen mit ihrem Skin, ihrer Position und ihrer Rotation.
- Reines Paket-Rendering — auf PacketEvents aufgebaut, es werden keine serverseitigen Entities erzeugt.
- Folia-sicher — jede Erfassung und jedes Rendern läuft im Scheduler des betroffenen Spielers.
- Sichtbarkeitsschalter —
/ghost toggle, eine TypeWriter-Aktion oder ein Menü-Button schaltet Geister pro Spieler ein und aus. - Dauerhafte Wahl — die Einstellung ist ein persistierbarer Fact, der über Server hinweg geteilt wird.
- Server-Tag — ein konfigurierbares Suffix wie
[survival-2]zeigt, woher ein Geist stammt. - Limits — Sichtweite, maximale Geister pro Betrachter, Aktualisierungsrate und Weltfilterung halten die Kosten begrenzt.
- Nameplates — ist UiCore installiert, erhalten Geister ein Nameplate über dem Kopf.
- Platzhalter — Sichtbarkeit und Geisteranzahl für MiniMessage-Text.
Installation
- Installiere PacketEvents auf jedem Server.
- Installiere die Erweiterung MySQL und aktiviere Redis (oder Valkey) auf jedem Server. Gib jedem Server einen eindeutigen
redis.server-nameund dieselberedis.group-id. Ghost hat keine eigenen Redis-Einstellungen. - Lege die Ghost-JAR in
plugins/Typewriter/extensions/ab und starte neu. Die Dateiplugins/Typewriter/ghost_player/config.ymlwird beim ersten Start erstellt. - Vergib die Berechtigung
typewriter.ghost.usean die Spieler, die/ghostverwenden dürfen. Ohne Berechtigungs-Plugin können es nur Operatoren. - Optional: Installiere UiCore, um Nameplates über Geistern zu zeichnen.
Erste Schritte
Lass Spieler Geister über ein Menü oder einen Quest-NPC umschalten:
- Öffne im TypeWriter-Web-Panel eine Page und füge einen Ghost Visibility Fact-Fact-Entry hinzu. Behalte seine Standard-
id,ghost_visibility_fact, bei: Die Erweiterung liest und schreibt den Fact unter dieser ID. - Füge eine Ghost Toggle Visibility-Aktion in einer Sequence oder an einem Menü-Item hinzu. Fülle
showMessageundhideMessagemit MiniMessage-Text oder lass sie für die Standardnachrichten leer. - Füge optional ein Criteria für den Ghost-Visibility-Fact hinzu (Wert
1bedeutet sichtbar,0verborgen), um in einem Menü ein anderes Icon anzuzeigen. - Veröffentliche und tritt zwei Servern derselben Gruppe bei. Jeder Spieler sieht den anderen als Geist mit dem Server-Suffix.
Ein Server ignoriert seine eigenen Broadcasts. Starte zum Testen zwei Server mit derselben redis.group-id und unterschiedlichen redis.server-name und stelle dich in Welten, die zusammenpassen dürfen (siehe unten).
Funktionsweise
Jeder Server veröffentlicht in der konfigurierten Rate einen Snapshot jedes lokalen Spielers sowie einen Heartbeat, damit untätige Spieler am Leben bleiben. Ein Geist verschwindet, wenn sein Besitzer den Server verlässt oder wenn innerhalb von timeout-millis kein Update eintrifft. Jede Nachricht enthält eine Sitzungs-ID und eine Sequenznummer, sodass verspätete oder doppelte Nachrichten ignoriert werden.
Ein Geist wird für einen Betrachter gezeichnet, wenn der Betrachter Geister aktiviert hat, die Welten kompatibel sind, der Geist innerhalb von view-distance liegt und der Betrachter weniger als max-ghosts-per-viewer Geister hat, wobei die nächsten zuerst kommen.
Konfiguration
Die Datei ist plugins/Typewriter/ghost_player/config.yml. Ihre schema-version muss 1 oder 2 sein.
schema-version: 2
settings:
update-rate: 4
server-suffix: " <gray>[%server%]</gray>"
team-prefix: "Ghosts"
view-distance: 64.0
max-ghosts-per-viewer: 128
timeout-millis: 10000
allowed-worlds:
- "world"
- "dungeon_"
- "hub"
messages:
no-permission: "<red>You do not have permission to use ghost visibility."
players-only: "<red>This command can only be used by a player."
enabled: "<green>Ghost visibility enabled."
disabled: "<yellow>Ghost visibility disabled."
usage: "<gray>Usage: <white>/ghost toggle"
command:
permission: "typewriter.ghost.use"
| Schlüssel | Bedeutung |
|---|---|
settings.update-rate | Ticks zwischen Positionserfassungen. Auf 1 bis 20 begrenzt. |
settings.server-suffix | MiniMessage-Text, der nach dem Namen des Geistes angefügt wird. %server% wird zum Namen des Herkunftsservers. |
settings.team-prefix | Präfix des Scoreboard-Teams, das für jeden Herkunftsserver angezeigt wird. |
settings.view-distance | Maximale Entfernung in Blöcken, von 0 bis 256. 0 deaktiviert die Entfernungsbegrenzung. |
settings.max-ghosts-per-viewer | Pro Betrachter gezeichnete Geister, von 0 bis 2000. 0 zeigt keine. |
settings.timeout-millis | Verzögerung ohne Update, bevor ein Geist entfernt wird, von 2000 bis 120000. |
settings.allowed-worlds | Weltnamen-Muster, die serverübergreifend als dieselbe Karte gelten. Bis zu 64 Einträge. |
messages.* | MiniMessage-Texte, die von /ghost verwendet werden. |
command.permission | Von /ghost benötigte Berechtigung. |
Welten. Ein Geist ist sichtbar, wenn sich Betrachter und Geist in Welten mit demselben Namen befinden oder wenn beide Weltnamen dasselbe Muster aus allowed-worlds enthalten (zum Beispiel passt dungeon_ auf dungeon_1 und dungeon_2). Die Entfernung lässt sich nur innerhalb einer Welt messen, sodass bei einer view-distance über 0 Geister aus einer anders benannten Welt verborgen werden. Setze view-distance auf 0, wenn du dich auf Mustervergleich verlässt.
Redis-Verbindung, Servername und Gruppen-ID werden aus der MySQL-Konfiguration gelesen. Die Datei wird einmal beim Start gelesen: Starte den Server nach dem Bearbeiten neu.
Befehle
| Befehl | Beschreibung |
|---|---|
/ghost toggle | Schaltet die Geistersichtbarkeit für dich ein oder aus. |
Aliase: /ghosts, /ghostplayer. Nur für Spieler. Die Berechtigung ist command.permission, standardmäßig typewriter.ghost.use.
Berechtigungen
| Berechtigung | Gewährt |
|---|---|
typewriter.ghost.use | /ghost toggle. Der Name kann mit command.permission geändert werden. Die Berechtigung wird ohne Standardwert registriert und muss daher vergeben werden. |
Die Aktion Ghost Toggle Visibility prüft diese Berechtigung nicht.
Platzhalter
MiniPlaceholders-Tags für MiniMessage-Text. PlaceholderAPI wird nicht unterstützt.
| Platzhalter | Gibt zurück |
|---|---|
<ghost_visibility> | true, wenn der Spieler Geister sieht, sonst false. |
<ghost_visible> | 1, wenn der Spieler Geister sieht, sonst 0. |
<ghost_count> | Anzahl der entfernten Geister, die diesem Server derzeit bekannt sind. |
Entries
2 Einträge, aus dem Quellcode der Erweiterung generiert.
Aktionen1
- Ghost Toggle VisibilityToggle Ghost Visibility
Fakten1
- Ghost Visibility FactGhost Visibility
Fehlerbehebung
Es erscheint kein Geist. Prüfe in dieser Reihenfolge: Beide Server verwenden dieselbe nicht leere redis.group-id und unterschiedliche redis.server-name-Werte, Redis ist verbunden (andernfalls steht im Log „BTC RedisService is not connected; Ghost updates will remain inactive“), der Betrachter hat Geister aktiviert, und die beiden Spieler befinden sich in kompatiblen Welten (gleicher Weltname oder ein gemeinsames allowed-worlds-Muster mit view-distance: 0).
Spieler desselben Servers erscheinen nie als Geister. Das ist erwartet: Ein Server ignoriert Nachrichten, die er selbst veröffentlicht hat.
Die Erweiterung startet nicht und meldet „Unsupported Ghost custom config schema“. schema-version in ghost_player/config.yml liegt außerhalb von 1..2. Setze sie auf 2.
Die Erweiterung startet wegen eines Servernamen-Fehlers nicht. redis.server-name in der MySQL-Konfiguration darf nur Buchstaben, Ziffern, ., _ oder - enthalten, bis zu 64 Zeichen.
/ghost meldet, dir fehle die Berechtigung. Die Berechtigung hat keinen Standardwert. Vergib typewriter.ghost.use (oder die in command.permission gesetzte Berechtigung) mit deinem Berechtigungs-Plugin.
Geister verschwinden nach einigen Sekunden. Innerhalb von timeout-millis ist kein Update eingetroffen. Prüfe die Redis-Latenz und dass der Herkunftsserver Ghost mit derselben redis.group-id ausführt.
Geister haben kein Nameplate. Nameplates kommen von UiCore. Installiere es auf dem Server des Betrachters. Ohne es wird nur das Server-Suffix im Namen angezeigt.