Inventar-Sync, Item-Tracking & Sperren
Drei aufeinander aufbauende Module:
| Modul | Inhalt | braucht |
|---|---|---|
inventory-sync | Inventare aller Spieler in der Datenbank; /invsee für Online-, Offline- und Spieler auf anderen Servern; optional ein gemeinsames Inventar für mehrere Server; Zwischenlager für volle Inventare | – |
item-tracking | Unsichtbare Item-IDs, lückenlose Historie, Kisten-Register, Bestand, Statistik, Zuordnung, /deleteitem | inventory-sync |
locks | Item- und Kisten-Sperren, Auto-Sperren nach Mengen | item-tracking |
Lizenz: inventory-sync, item-tracking und locks brauchen eine EternalSystem-Lizenz. Kostenlos in der Base sind standardmäßig core, punishments, reports und lobby; welche Module frei sind, kann sich ändern – gesperrte Module zeigt das Dashboard ausgegraut.
Einschalten
- Module auf jedem Spielserver einschalten, z. B. per Preset
survivalodereconomy(siehe Module & Presets). inventory-synczusätzlich auf dem Proxy einschalten:/invseeläuft dort, löst Offline-Ziele und Spieler auf anderen Servern auf und öffnet das GUI auf dem Server des Betrachters.- Alle Server und die REST-API brauchen dieselbe MySQL-Datenbank.
- Alles steht im Abschnitt
inventory-syncderconfig.yml(gleiche Datei auf Spigot und Proxy).
Inventar-Sync
inventory-sync:
enabled: true
mode: separate # separate = jeder Server eigenes Inventar, global = eines fürs ganze Netz
groups: {} # nur bei separate: Server mit gemeinsamem Inventar
# survival: [survival-1, survival-2]
parts:
inventory: true
armor: true
offhand: true
enderchest: true
experience: true
health: true
hunger: true
effects: true
gamemode: false
autosave-seconds: 60 # Snapshot-Takt für Online-Spieler; Quit speichert immer sofort
join-load-timeout-ms: 3000 # so lange wartet der neue Server auf den Quit-Save des alten
| Option | Standard | Bedeutung |
|---|---|---|
mode | separate | separate: jeder Server speichert sein eigenes Inventar (nur zum Ansehen). global: ein Inventar fürs ganze Netz, wird beim Join geladen und beim Quit/Serverwechsel gespeichert. |
groups | {} | Im separate-Modus: Server einer Gruppe teilen sich ein Inventar. |
parts.* | alles außer gamemode | Was gespeichert und (bei global/Gruppen) übernommen wird. |
Scope heißt der Schlüssel eines gespeicherten Inventars: der Servername (separate), der Gruppenname oder global. Dashboard und /invsee <Spieler> <Scope> zeigen alle Scopes, die ein Spieler je hatte.
Serverwechsel bei global/Gruppen: Der alte Server schreibt beim Quit den Snapshot und gibt die Sync-Sitzung frei. Der neue Server friert den Spieler so lange ein (kein Inventar-Zugriff, kein Aufheben), lädt dann und wendet den Stand an. Nach einem Absturz gibt jeder Server beim Start seine hängenden Sitzungen frei.
Ingame-Befehle
| Befehl | Recht | Modul | Beschreibung |
|---|---|---|---|
/invsee <Spieler> | eternal.base.invsee | inventory-sync | Eine Ansicht für alle Fälle (Inventar, Hotbar, Rüstung, Zweithand, Enderkisten-Button), immer bearbeitbar. Ziel auf demselben Server: live in beide Richtungen. Ziel auf anderem Server: du wirst dorthin verbunden. Ziel offline: gespeicherter Stand, Änderungen werden beim nächsten Join angewendet |
/invsee <Spieler> <Scope> | eternal.sync.view | inventory-sync | Gespeicherter Stand eines bestimmten Scopes; bearbeitbar mit eternal.base.invsee oder eternal.sync.edit, sonst nur lesen |
| Linksklick im Lese-GUI | eternal.sync.history | item-tracking | Historie des Items im Chat |
| Rechtsklick im Lese-GUI | eternal.sync.lock.item | locks | Item sperren/entsperren |
/trackitem [history|<id>] (/itemtrack, /itemhistory) | eternal.sync.history | item-tracking | ID des Items in der Hand (Klick kopiert) und wem es vorher gehörte; history = volle Historie, <id> = per ID |
/trackchest (/chesttrack, /trackcontainer) | eternal.sync.history | item-tracking | Angeschaute Kiste/Rahmen/Block: Kisten-ID, Besitzer, alle Nutzer |
/deleteitem [Grund] (/delitem) | eternal.sync.delete.item | item-tracking | Ohne Grund: Vernichten-GUI. Mit Grund: Item in der Hand sofort vernichten |
/itemlock <lock|unlock|info> [Grund] | eternal.sync.lock.item | locks | Item in der Hand sperren |
/chestlock <hard|soft|off|info> [Grund] (/containerlock) | eternal.sync.lock.container | locks | Angeschauten Container sperren |
/expandedinv [Spieler] (/ei) | eternal.expandedinv.use | inventory-sync | Zwischenlager öffnen, nur entnehmen (siehe Zwischenlager) |
Schutz-Bypass für Mods (Modul inventory-sync, kein Befehl): Mods interagieren ganz normal. Verbietet etwas einen Rechtsklick – eine Kisten-Sperre, PlotSquared, WorldGuard, GriefPrevention –, hebt Eternal das Verbot nur für die Kategorien auf, für die der Spieler ein Recht hat. Vanilla macht dann den Rest (Tür geht auf, Kiste öffnet sich live mit Animation). Was der Mod sowieso darf, bleibt unverändert.
| Recht | Erlaubt trotz Schutz | Standard |
|---|---|---|
eternal.inspect.container.view | Kisten, Fässer, Shulker, Öfen, Trichter … öffnen | Staff |
eternal.inspect.container.take | aus so geöffneten Kisten nehmen (ohne: Klick, Shift-Klick, Hotbar-Tausch, Doppelklick werden geblockt) | Admin |
eternal.inspect.container.put | in so geöffnete Kisten legen (ohne: auch Ziehen und Shift-Klick aus dem eigenen Inventar geblockt) | Admin |
eternal.inspect.door | Türen, Falltüren, Zauntore | Staff |
eternal.inspect.switch | Hebel, Knöpfe | Admin |
eternal.inspect.use | sonstige benutzbare Blöcke (Amboss, Bett, Notenblock, Lesepult …) | Admin |
eternal.inspect.* vergibt alles. Ein gesperrtes Drachenei wird nie freigegeben (ein Klick würde es teleportieren). Fällt ein gesperrter Block mit Schwerkraft (Drachenei, Amboss, Sand …), weil die Stütze fehlt, fällt er ganz normal – die Sperre wandert mit an die Landestelle. Würde er dabei zu einem Item zerbrechen (Fackel-Trick), springt er an seinen Platz zurück.
Wird ein Offline-Inventar bearbeitet, hält das GUI eine Sperre. Joint der Spieler, schließt es sich; der Spieler bekommt eine Info über die Änderung. Kann die Sperre nicht genommen werden (Spieler ist online, jemand anderes bearbeitet), bleibt das GUI schreibgeschützt.
Rang-Schutz
Wie bei Strafen braucht der Betrachter eine höhere Stufe als das Ziel (Stufe = Maximum aus eternal.tier.N und Rang-Priorität). Das gilt ingame und im Dashboard, für Inventare und Item-Historien (dort zählt der aktuelle Besitzer). eternal.sync.bypass oder eternal.bypass heben den Schutz auf.
Ohne Rang-Prioritäten und ohne eternal.tier.* haben alle Stufe 0 – dann sieht niemand fremde Inventare. Das Team braucht dann eternal.sync.bypass.
Zwischenlager
Das Zwischenlager (Teil von inventory-sync) fängt auf, was bei vollem Inventar nicht mehr hineinpasst. Jeder Spieler schaltet es selbst ein: /settings → Zwischenlager (expandedinv.collect, Standard aus; der Eintrag erscheint mit eternal.expandedinv.use, siehe Spieler-Einstellungen).
- Einsammeln: Ist es an und das Inventar voll, landen Items, über die du läufst, im Zwischenlager. Auch Auto-Aufsammeln-Drops, die nicht mehr ins Inventar passen, kommen dorthin.
- Netzwerkweit: Das Lager liegt in der Datenbank und ist auf allen Servern dasselbe – höchstens 270 Stapel (6 Seiten à 45).
- Nur entnehmen:
/expandedinvbzw./eiöffnet es. Ein Klick legt den Stapel ins Inventar, wenn er komplett hineinpasst. Hineinlegen geht nie. - Lager voll: Der Spieler bekommt eine Meldung, die Items bleiben am Boden liegen.
- Regeln gelten weiter: Jedes Einsammeln löst das normale Aufhebe-Ereignis aus – Item-Sperren, Lobby-Schutz, der Perk
no_pickup(siehe Perks) und das Item-Tracking greifen wie beim normalen Aufheben. - Dupe-sicher über Server hinweg: Änderungen laufen mit optimistischer Versionierung; gibt es zwischen zwei Servern einen Konflikt, wird die Änderung erneut versucht.
Fremde Zwischenlager
| Aufruf | Recht | Standard-Stufe |
|---|---|---|
/ei – eigenes Lager | eternal.expandedinv.use | Alle |
/ei <Spieler> – Spieler online auf diesem Server | eternal.expandedinv.others | Team |
/ei <Spieler> – offline oder auf einem anderen Server | zusätzlich eternal.expandedinv.others.offline | Team |
| Aus einem fremden Lager entnehmen | eternal.expandedinv.others.take | Admin |
Jede Entnahme aus einem fremden Lager wird in der Konsole geloggt. Es gilt derselbe Rang-Schutz wie bei /invsee; eternal.sync.bypass hebt ihn auf.
Im Dashboard zeigt die Inventar-Seite eines Spielers eine Karte Zwischenlager mit allen Stapeln und ihrem Sperr-Status; ein Klick auf ein Item öffnet seine Historie (Recht eternal.web.inventory.view, API GET /players/{name}/expanded-inv).
Item-Tracking
Jedes Item bekommt eine unsichtbare ID (eternal_item_id im PersistentDataContainer; auf 1.8–1.13 in einer versteckten Lore-Zeile, siehe Versionen). Geloggt wird, wer es wann hatte, in welcher Kiste es liegt (mit Koordinaten und wer es hineingelegt hat) und Serverwechsel.
inventory-sync:
item-tracking:
enabled: true
stack-mode: id # id = jeder Stapel hat eine Stack-ID, log = nur Verlauf pro Material
stack-log-materials: [] # immer im log-Modus, z. B. [COBBLESTONE, DIRT, NETHERRACK]
log-stack-hopper-moves: false # Hopper-Merges von Stack-ID-Items loggen (viele Zeilen)
container-flush-ticks: 10 # Live-Kisteninhalt alle X Ticks schreiben, 0 = nur beim Schließen
container-exclude-types: [] # z. B. [HOPPER] bei riesigen Farmen
tracked-blocks: [SPAWNER, DRAGON_EGG, BEACON, ...] # behalten beim Platzieren ihre ID
track-frames: true # Items in Rahmen loggen
log-hopper-moves: true
scan-interval-seconds: 3 # Scan nach neuen Items ohne Ereignis (/give, andere Plugins)
lock-refresh-seconds: 5 # Sperren aus der DB nachladen
Stack-IDs: Ein geteilter Stapel behält die ID nur auf dem größeren Teil, der andere bekommt sofort eine neue (Ereignis SPLIT, im Kreativmodus CLONED). Kommen Items zusammen (Klick, Shift-Klick, Doppelklick, Aufheben, Hopper, Ofen, Crafting), übernehmen sie die ID des Ziel-Stapels (MERGE); geht ein ganzer Stapel in einem anderen auf, wird seine ID geschlossen (STACKED).
Ereignisse (Auswahl): REGISTER, PICKUP, DROP, DEATH_DROP, DESPAWN, CONTAINER_PUT/CONTAINER_TAKE, HOPPER_MOVE, CONTAINER_BROKEN, SERVER_SWITCH, LOCK/UNLOCK, MERGE, SPLIT, STACKED, DESTROYED (mit Ursache: Lava, Feuer, Explosion, Kaktus, Void, Blitz, Haltbarkeit, verbraucht), DELETED (Vernichtet durch das Team), FRAME_PUT/FRAME_TAKE, PLACED/BROKEN, TRADE (siehe Party, Freunde & Clans).
Kisten-Register: Jede Kiste, jeder Rahmen und jeder platzierte Spezialblock bekommt eine Kisten-ID (#12). Inhalte werden live mitgeschrieben – Spieler-Klicks, Hopper, Werfer, Öfen, Braustände, Platzieren, Abbauen, Explosionen – und alle container-flush-ticks in einer Transaktion gespeichert. Nicht erfasst werden Inventare von Entities (Lore mit Kiste, Esel, Lama).
Bekannte Lücken: Ergebnisse aus Steinsäge, Amboss, Schleifstein, Webstuhl und Villager-Handel landen als eigener Stapel und übernehmen die ID erst beim nächsten Scan.
Vernichten (/deleteitem)
/deleteitem öffnet ein GUI: Items hineinlegen, schließen, dann fragt der Chat 10 Sekunden lang nach dem Grund (keine Antwort = ohne Grund). Jeder Stapel wird als DELETED mit Spieler, Zeit und Grund geloggt; ungetrackte Items bekommen vorher eine ID. Herausnehmen geht nur mit eternal.sync.delete.item.take – ohne dieses Recht ist Hineinlegen endgültig.
Sperren
| Art | Wirkung |
|---|---|
| Item-Sperre | Item lässt sich nicht bewegen, droppen, platzieren oder verbrauchen – im Inventar wie in der Kiste. Hopper ziehen es nicht. |
Kiste HARD | Kiste lässt sich nicht öffnen, abbauen oder sprengen; Hopper rein/raus blockiert. |
Kiste SOFT | Kiste öffnet sich, aber nichts kann entnommen werden. Hineinlegen bleibt erlaubt, Abbauen ist blockiert. |
| Rahmen / platzierter Block | eine Sperre; Abbau, Explosion, Kolben (und beim Drachenei der Teleport) sind blockiert. |
Doppelkisten: Eine Sperre auf einer Hälfte schützt beide. Abgetrennte Teile eines gesperrten Stapels erben die Sperre. eternal.sync.lock.bypass ignoriert alle Sperren. Sperren aus dem Dashboard oder von anderen Servern greifen nach spätestens lock-refresh-seconds.
Auto-Sperren (Dashboard, Recht eternal.web.thresholds.manage): Regeln „ab Menge X sperren“ pro Stapel, Kiste, Inventar oder Spieler, für ein Material oder *, optional nur für einen Spieler, bei Kisten optional die Kiste selbst (Soft). Die API prüft alle 15 s. Besitzer mit eternal.sync.lock.bypass werden übersprungen.
Dashboard
| Seite | Recht | Inhalt |
|---|---|---|
| Spieler → Inventar ansehen | eternal.web.inventory.view | Inventar pro Scope im Spiel-Layout (Rüstung, 3×9, Hotbar, Enderkiste, Effekte, Level/Leben/Hunger); Klick auf ein Item → Historie und Sperre |
| ↳ Karte Zwischenlager | eternal.web.inventory.view | Alle Stapel im Zwischenlager mit Sperr-Status; Klick → Historie |
| ↳ Items entfernen / „Zu mir“ | eternal.web.inventory.edit | Online sofort, offline beim nächsten Join |
| Item-Tracking → Statistik | eternal.web.tracking | Wovon es am meisten gibt, wer am meisten hat, Neues und Handel in 24 h, Auto-Sperren |
| Item-Tracking → Items | eternal.web.inventory.view | Suche nach ID, Material, Name, Besitzer, Server, Ort (Kiste/Spieler/Boden), nur gesperrte; volle Historie |
| Item-Tracking → Kisten | eternal.web.inventory.view | Filter (enthält Item, Server, mit Inhalt, gesperrt, abgebaut; Alle/Kisten/Platziert), Detail mit Inhalt, getrackten Items, Verlauf; „Live“-Aktualisierung alle 3 s |
| Item-Tracking → Kisten-Sperren | eternal.web.inventory.view | Alle Sperren, neue Sperre per Koordinaten |
| Item-Tracking → Spieler | eternal.web.tracking | Alles, was einem Spieler gehört (Inventare + Kisten) |
| Item-Tracking → Auto-Sperren | eternal.web.thresholds.manage | Regeln anlegen/ändern |
| Sperren setzen/aufheben | eternal.web.locks.manage | Buttons auf den Seiten oben |
| Button Teleport an Kisten | eternal.web.tracking.teleport | Online: du wirst ingame hingebracht. Offline: /tppos x y z welt in die Zwischenablage |
| Item-Tracking → Zurücksetzen | eternal.web.admin | Tracking-Daten netzwerkweit löschen (wählbar: Items & Verlauf, Bestände, Sperren, Auto-Sperr-Regeln); Bestätigung durch Eintippen von „ZURÜCKSETZEN“ |
Zurücksetzen ist endgültig – vorher ein Backup ziehen (Cloud › Backups oder mysqldump). Die Server leeren danach innerhalb weniger Sekunden ihre Zwischenspeicher und erfassen alles neu, was Spieler gerade tragen. Items behalten ihre ID-Markierung und erscheinen beim nächsten Kontakt wieder im Register. Direkt in der Datenbank zu löschen ist nicht nötig (und lässt die Caches der Server veraltet).
Jedes Item mit ID hat einen Besitzer (der letzte Spieler, der es in der Hand hatte). Liegt es in einer geteilten Kiste, bleibt es ihm zugeordnet.
Rechte
| Recht | Standard-Stufe | Zweck |
|---|---|---|
eternal.base.invsee | Team | /invsee live und bearbeitbar |
eternal.sync.view | Team | /invsee <Spieler> <Scope> |
eternal.sync.edit | Admin | Gespeicherte Inventare bearbeiten |
eternal.sync.bypass | Admin | Rang-Schutz für Inventare und Historie umgehen |
eternal.sync.history | Team | /trackitem, /trackchest, Kisten-ID im Kistentitel |
eternal.sync.lock.item | Admin | /itemlock |
eternal.sync.lock.container | Admin | /chestlock |
eternal.sync.lock.bypass | Admin | Sperren ignorieren |
eternal.sync.delete.item | Admin | /deleteitem |
eternal.sync.delete.item.take | Admin | Aus dem Vernichten-GUI zurücknehmen |
eternal.expandedinv.use | Alle | Eigenes Zwischenlager und die Einstellung „Zwischenlager“ |
eternal.expandedinv.others | Team | /ei <Spieler> auf diesem Server |
eternal.expandedinv.others.offline | Team | /ei <Spieler> offline / auf anderen Servern |
eternal.expandedinv.others.take | Admin | Aus fremden Zwischenlagern entnehmen (geloggt) |
Ingame gelten zusätzlich die plugin.yml-Standards (z. B. eternal.sync.delete.item: op), solange Eternal Perms nichts festlegt. Siehe Rechte-Referenz.
Typische Stolperfallen
/invseefindet Offline-Spieler nicht:inventory-syncfehlt auf dem Proxy.- Inventar „springt zurück“ bei
global: Der alte Server speichert zu langsam –join-load-timeout-mserhöhen, Datenbank-Latenz prüfen. - Riesige Tabellen durch Farmen: Massenware in
stack-log-materials,log-stack-hopper-moves: falselassen, ggf.container-exclude-types: [HOPPER]. - Item-Icons fehlen im Dashboard: Die Icons kommen von
assets.mcasset.cloud. Ineternal-web/src/app/core/api.config.tslässt sichtextureUrlauf einen eigenen Host umstellen oder leeren (dann nur Material-Text). - Bearbeitete Offline-Inventare kommen nicht an: Der Spieler muss auf einem Server des passenden Scopes joinen.