Inventar-Sync, Item-Tracking & Sperren

Drei aufeinander aufbauende Module:

ModulInhaltbraucht
inventory-syncInventare 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-trackingUnsichtbare Item-IDs, lückenlose Historie, Kisten-Register, Bestand, Statistik, Zuordnung, /deleteiteminventory-sync
locksItem- und Kisten-Sperren, Auto-Sperren nach Mengenitem-tracking
Hinweis

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 survival oder economy (siehe Module & Presets).
  • inventory-sync zusätzlich auf dem Proxy einschalten: /invsee lä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-sync der config.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
OptionStandardBedeutung
modeseparateseparate: 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 gamemodeWas 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

BefehlRechtModulBeschreibung
/invsee <Spieler>eternal.base.invseeinventory-syncEine 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.viewinventory-syncGespeicherter Stand eines bestimmten Scopes; bearbeitbar mit eternal.base.invsee oder eternal.sync.edit, sonst nur lesen
Linksklick im Lese-GUIeternal.sync.historyitem-trackingHistorie des Items im Chat
Rechtsklick im Lese-GUIeternal.sync.lock.itemlocksItem sperren/entsperren
/trackitem [history|<id>] (/itemtrack, /itemhistory)eternal.sync.historyitem-trackingID des Items in der Hand (Klick kopiert) und wem es vorher gehörte; history = volle Historie, <id> = per ID
/trackchest (/chesttrack, /trackcontainer)eternal.sync.historyitem-trackingAngeschaute Kiste/Rahmen/Block: Kisten-ID, Besitzer, alle Nutzer
/deleteitem [Grund] (/delitem)eternal.sync.delete.itemitem-trackingOhne Grund: Vernichten-GUI. Mit Grund: Item in der Hand sofort vernichten
/itemlock <lock|unlock|info> [Grund]eternal.sync.lock.itemlocksItem in der Hand sperren
/chestlock <hard|soft|off|info> [Grund] (/containerlock)eternal.sync.lock.containerlocksAngeschauten Container sperren
/expandedinv [Spieler] (/ei)eternal.expandedinv.useinventory-syncZwischenlager ö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.

RechtErlaubt trotz SchutzStandard
eternal.inspect.container.viewKisten, Fässer, Shulker, Öfen, Trichter … öffnenStaff
eternal.inspect.container.takeaus so geöffneten Kisten nehmen (ohne: Klick, Shift-Klick, Hotbar-Tausch, Doppelklick werden geblockt)Admin
eternal.inspect.container.putin so geöffnete Kisten legen (ohne: auch Ziehen und Shift-Klick aus dem eigenen Inventar geblockt)Admin
eternal.inspect.doorTüren, Falltüren, ZauntoreStaff
eternal.inspect.switchHebel, KnöpfeAdmin
eternal.inspect.usesonstige 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.

Warnung

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: /expandedinv bzw. /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

AufrufRechtStandard-Stufe
/ei – eigenes Lagereternal.expandedinv.useAlle
/ei <Spieler> – Spieler online auf diesem Servereternal.expandedinv.othersTeam
/ei <Spieler> – offline oder auf einem anderen Serverzusätzlich eternal.expandedinv.others.offlineTeam
Aus einem fremden Lager entnehmeneternal.expandedinv.others.takeAdmin

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

ArtWirkung
Item-SperreItem lässt sich nicht bewegen, droppen, platzieren oder verbrauchen – im Inventar wie in der Kiste. Hopper ziehen es nicht.
Kiste HARDKiste lässt sich nicht öffnen, abbauen oder sprengen; Hopper rein/raus blockiert.
Kiste SOFTKiste öffnet sich, aber nichts kann entnommen werden. Hineinlegen bleibt erlaubt, Abbauen ist blockiert.
Rahmen / platzierter Blockeine 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

SeiteRechtInhalt
Spieler → Inventar anseheneternal.web.inventory.viewInventar pro Scope im Spiel-Layout (Rüstung, 3×9, Hotbar, Enderkiste, Effekte, Level/Leben/Hunger); Klick auf ein Item → Historie und Sperre
↳ Karte Zwischenlagereternal.web.inventory.viewAlle Stapel im Zwischenlager mit Sperr-Status; Klick → Historie
↳ Items entfernen / „Zu mir“eternal.web.inventory.editOnline sofort, offline beim nächsten Join
Item-Tracking → Statistiketernal.web.trackingWovon es am meisten gibt, wer am meisten hat, Neues und Handel in 24 h, Auto-Sperren
Item-Tracking → Itemseternal.web.inventory.viewSuche nach ID, Material, Name, Besitzer, Server, Ort (Kiste/Spieler/Boden), nur gesperrte; volle Historie
Item-Tracking → Kisteneternal.web.inventory.viewFilter (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-Sperreneternal.web.inventory.viewAlle Sperren, neue Sperre per Koordinaten
Item-Tracking → Spielereternal.web.trackingAlles, was einem Spieler gehört (Inventare + Kisten)
Item-Tracking → Auto-Sperreneternal.web.thresholds.manageRegeln anlegen/ändern
Sperren setzen/aufhebeneternal.web.locks.manageButtons auf den Seiten oben
Button Teleport an Kisteneternal.web.tracking.teleportOnline: du wirst ingame hingebracht. Offline: /tppos x y z welt in die Zwischenablage
Item-Tracking → Zurücksetzeneternal.web.adminTracking-Daten netzwerkweit löschen (wählbar: Items & Verlauf, Bestände, Sperren, Auto-Sperr-Regeln); Bestätigung durch Eintippen von „ZURÜCKSETZEN“
Warnung

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

RechtStandard-StufeZweck
eternal.base.invseeTeam/invsee live und bearbeitbar
eternal.sync.viewTeam/invsee <Spieler> <Scope>
eternal.sync.editAdminGespeicherte Inventare bearbeiten
eternal.sync.bypassAdminRang-Schutz für Inventare und Historie umgehen
eternal.sync.historyTeam/trackitem, /trackchest, Kisten-ID im Kistentitel
eternal.sync.lock.itemAdmin/itemlock
eternal.sync.lock.containerAdmin/chestlock
eternal.sync.lock.bypassAdminSperren ignorieren
eternal.sync.delete.itemAdmin/deleteitem
eternal.sync.delete.item.takeAdminAus dem Vernichten-GUI zurücknehmen
eternal.expandedinv.useAlleEigenes Zwischenlager und die Einstellung „Zwischenlager“
eternal.expandedinv.othersTeam/ei <Spieler> auf diesem Server
eternal.expandedinv.others.offlineTeam/ei <Spieler> offline / auf anderen Servern
eternal.expandedinv.others.takeAdminAus 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

  • /invsee findet Offline-Spieler nicht: inventory-sync fehlt auf dem Proxy.
  • Inventar „springt zurück“ bei global: Der alte Server speichert zu langsam – join-load-timeout-ms erhöhen, Datenbank-Latenz prüfen.
  • Riesige Tabellen durch Farmen: Massenware in stack-log-materials, log-stack-hopper-moves: false lassen, ggf. container-exclude-types: [HOPPER].
  • Item-Icons fehlen im Dashboard: Die Icons kommen von assets.mcasset.cloud. In eternal-web/src/app/core/api.config.ts lässt sich textureUrl auf 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.