Artikel

Spielerdaten speichern: Identität, Fortschritt und Konsistenz

Spielerdaten brauchen eindeutige Zuständigkeiten und nachvollziehbare Übergänge. Der Artikel entwickelt für Lufox ein Datenmodell aus Identität, Sitzungen und Fortschritt und erklärt, wie Versionen, konkurrierende Änderungen und Wiederherstellung gemeinsam geprüft werden können.

BlackZackBlackZack

1551 Wörter · 8 Min. Lesezeit

  • lufox
  • minecraft
  • datenhaltung
  • spielerfortschritt
Spielerdaten speichern: Identität, Fortschritt und Konsistenz

Schematisches Blockmodell als Entwurfsbeispiel; kein Screenshot der Lufox-Spielwelt.

Ein gespeicherter Spielername scheint zunächst eine einfache Information zu sein. Später soll dieselbe Person auch nach einer Umbenennung gefunden werden, zwischen Servern wechseln und ihren Fortschritt behalten. Dazu kommen vorübergehende Zustände wie ein geöffnetes Menü oder eine laufende Abgabe. Werden all diese Informationen unterschiedslos in einem großen Datensatz gesammelt, wird schnell unklar, welche Änderung wann verbindlich ist. Gute Datenhaltung beginnt deshalb mit einer fachlichen Ordnung.

Lufox besitzt im Quelltext ein eigenes Spielerverzeichnis sowie getrennte Speicherbereiche für Inventare, Quests und Konten. Das Verzeichnis aktualisiert beim Besuch unter anderem den sichtbaren Namen und den zuletzt bekannten Server. Diese Beobachtung zeigt eine konkrete Trennung von Identität und Darstellung. Sie liefert jedoch keinen vollständigen Nachweis über aktuelle Betriebsdaten. Für die Planung werden daher die vorhandenen Zugriffe untersucht und durch klar beschriebene Erwartungen an Konsistenz ergänzt.

Identität als stabile Beziehung behandeln

Ein sichtbarer Name dient der Suche und Ansprache. Er sollte nicht allein darüber entscheiden, welchem Konto Fortschritt gehört. Eine technische Spielerkennung verbindet die Daten auch dann, wenn sich der Name ändert. Das eigene Verzeichnis kann den aktuellen Namen und weitere benötigte Suchinformationen dazu führen. Die Zuordnung bleibt dabei eine bewusste Aufgabe des Anmeldewegs.

Im inspizierten SpielerLager werden Datensätze anhand der Spielerkennung angelegt beziehungsweise aktualisiert. Namen werden bei weiteren Besuchen erneuert. Für einen Test wird daher ein Konto mit geänderter Darstellung betrachtet: Der bisherige Fortschritt soll erhalten bleiben, während die Suche den aktuellen Namen verwendet. Gleichzeitig muss ein anderes Konto mit ähnlichem Namen getrennt bleiben. Beide Fälle prüfen unterschiedliche Aspekte derselben Zuordnung.

Historische Namen können für bestimmte Klärungen hilfreich sein, sind aber nicht automatisch unbegrenzt erforderlich. Das Projekt sollte festlegen, welche Informationen tatsächlich benötigt werden. Eine Datensammlung wächst sonst leicht über ihren ursprünglichen Zweck hinaus. Für gewöhnliche Bedienung genügt oft der aktuelle Name mit einer stabilen internen Kennung. Zusätzliche Historie erhält einen konkreten Anlass und einen begrenzten Zugriff.

Dauerhafte und vorübergehende Zustände trennen

Ein abgeschlossener Auftrag soll nach einem Neustart erhalten bleiben. Die Position eines geöffneten Menüfensters muss dagegen möglicherweise nicht dauerhaft gespeichert werden. Eine laufende Zahlung liegt dazwischen: Ihre Anzeige ist vorübergehend, ihre fachliche Wirkung darf aber nicht verloren gehen. Diese Unterschiede bestimmen, welche Daten gespeichert werden und wann ein sinnvoller Abschluss vorliegt.

Eine einfache Einteilung unterscheidet Stammdaten, Fortschritt und Sitzung. Stammdaten beschreiben die bekannte Identität. Fortschritt enthält Ergebnisse von Spielhandlungen. Sitzungsdaten beschreiben die aktuelle Verbindung und kurzlebige Arbeitszustände. Die Einteilung ist kein starres Datenbankschema, sondern eine Hilfe bei Zuständigkeiten. Sie verhindert, dass eine alte Sitzung versehentlich dauerhaften Fortschritt als ihren privaten Arbeitsspeicher behandelt.

Für jede Information wird außerdem die maßgebliche Quelle benannt. Ein Menü kann einen zwischengespeicherten Kontostand zeigen, aber die Buchungslogik entscheidet über eine Ausgabe. Eine Website kann Fortschritt darstellen, ohne selbst beliebige Änderungen vorzunehmen. Diese Unterschiede sollten in den Schnittstellen sichtbar sein. Eine bequem lesbare Kopie ist nicht automatisch ein zulässiger Ort für verbindliche Änderungen.

Zusammengehörige Änderungen gemeinsam betrachten

Ein Questabschluss kann Fortschritt, Belohnung und eine neue Freischaltung betreffen. Werden diese Teile unabhängig gespeichert, können Unterbrechungen widersprüchliche Kombinationen erzeugen. Deshalb wird zunächst beschrieben, welche fachliche Einheit entstehen soll. Anschließend wird geprüft, welche Teile innerhalb derselben Transaktion liegen können und welche eine gesonderte Fortsetzung benötigen.

Die MySQL-Dokumentation beschreibt den verbindlichen Abschluss und die Rücknahme von Transaktionen. Diese Mechanismen gelten für die daran beteiligten Datenbankänderungen. Ein Gegenstand im laufenden Minecraft-Inventar ist dadurch nicht automatisch Teil derselben atomaren Änderung. Diese Grenze muss im Entwurf ausdrücklich bleiben. MySQL: COMMIT und ROLLBACK

Ein möglicher Ansatz führt eine ausstehende Ausgabe als dauerhaften Zustand. Der Auftrag ist fachlich abgeschlossen, die Ware kann später abgeholt werden. Das ist nicht immer die bequemste Oberfläche, kann aber Unterbrechungen nachvollziehbar machen. Wichtig ist, dass der offene Zustand nicht mit einem fehlgeschlagenen Auftrag verwechselt wird. Die Person hat ihren Fortschritt bereits erreicht und braucht nur einen verlässlichen nächsten Schritt.

Ein Beispiel mit zwei Sitzungen prüfen

Angenommen wird ein schneller Wechsel zwischen zwei Spielbereichen. Die alte Sitzung besitzt noch einen Inventarstand, während die neue bereits einen aktuelleren Zustand lädt. Wenn die alte Sitzung später ungeprüft speichert, könnte sie den neuen Stand überschreiben. Dieses Problem lässt sich nicht durch eine gute Spielerkennung allein lösen. Es betrifft die zeitliche Berechtigung zum Schreiben.

Der Entwurf verwendet daher eine Sitzungskennung und eine fortlaufende Fassung des Zustands. Eine Änderung wird nur angenommen, wenn sie zur aktuellen Schreibberechtigung passt. Eine veraltete Sitzung erhält ein definiertes Ergebnis und darf nicht einfach den gesamten Datensatz ersetzen. Das konkrete Verfahren kann anders umgesetzt werden; entscheidend ist die fachliche Regel, dass ein älterer Stand keine jüngere bestätigte Änderung verdrängt.

Ein schematisches Beispiel verdeutlicht die Prüfung. Es ist keine Behauptung über das aktuelle Lufox-Schema.

UPDATE spielstand
SET inhalt = ?, fassung = fassung + 1
WHERE spieler = ? AND fassung = ?;

Die Zahl geänderter Zeilen gehört zum Ergebnis. Wurde keine Zeile geändert, darf die Anwendung nicht so tun, als sei der Stand gespeichert. Sie muss den Konflikt einordnen. Einfach denselben alten Inhalt mit einer frisch gelesenen Fassung erneut zu schreiben, würde die Schutzidee umgehen. Die fachliche Änderung muss gegebenenfalls auf den aktuellen Zustand neu angewendet werden.

Datenzugriffe auf klare Operationen begrenzen

Ein Speicherzugang bietet besser fachliche Operationen als beliebige Änderungen einzelner Felder. „Fortschrittsbeitrag verbuchen“ kann Kennung, Grenze und Abschluss gemeinsam prüfen. „Setze Zähler auf diese Zahl“ überträgt dagegen viel Verantwortung an jeden Aufrufer. Je mehr Oberflächen denselben Zustand verändern, desto wichtiger wird eine gemeinsame Regel.

Vorbereitete Anweisungen trennen Werte von der Abfragestruktur. Der Lufox-Spielerspeicher verwendet sie für Suche und Aktualisierung. Paper erläutert diesen Umgang ebenfalls in seiner Datenbankdokumentation. Für das Projekt ist zusätzlich wichtig, Ergebnisse wie „nicht gefunden“, „nicht erreichbar“ und „mehrdeutig“ nicht unbemerkt zusammenzufassen. Eine leere Suche ist etwas anderes als eine fehlgeschlagene Verbindung. Paper: Using databases

Die Oberfläche kann diese Unterschiede verständlich übersetzen. Ein unbekannter Spielername führt zu einer Korrekturmöglichkeit. Eine nicht erreichbare Speicherung führt zu einer späteren Wiederholung oder einer gesperrten Änderung. Wenn beide Fälle als leeres Konto erscheinen, könnten unbeabsichtigt neue Daten erzeugt werden. Gute Fehlertrennung schützt deshalb sowohl die Bedienung als auch die Konsistenz.

Zwischenspeicher mit einer Gültigkeitsregel versehen

Ein Cache kann häufige Lesezugriffe verringern. Er braucht jedoch eine Erklärung, wann sein Inhalt noch verwendet werden darf. Bei einer unveränderlichen Beschreibung ist das einfach. Bei Guthaben oder Freischaltungen kann ein anderer Bereich inzwischen Änderungen vorgenommen haben. Eine feste kurze Lebensdauer ist eine Möglichkeit, aber nicht für jeden Vorgang ausreichend.

Für eine verbindliche Kaufentscheidung wird deshalb der maßgebliche Zustand geprüft, selbst wenn das Menü zuvor einen Cachewert zeigte. Nach einer bestätigten Änderung wird die Anzeige gezielt aktualisiert. Diese Kombination erlaubt eine schnelle Oberfläche, ohne die Freigabe allein auf möglicherweise alte Daten zu stützen. Die Architektur trennt damit die Anforderungen an angenehme Darstellung und verbindliche Entscheidung.

Ein Test verändert den Zustand über einen zweiten Einstieg, während die erste Ansicht offen bleibt. Anschließend wird dort eine Aktion ausgelöst. Erwartet wird eine korrekte erneute Prüfung, nicht blindes Vertrauen in den alten Bildschirm. Dieser Versuch ist besonders aussagekräftig für Projekte, die Spiel, Website und mehrere Server mit denselben Daten verbinden.

Datenformate mit einer Entwicklungsgeschichte versehen

Spielerdaten verändern sich mit neuen Funktionen. Ein früher einfacher Queststatus kann später mehrere Teilziele benötigen. Die neue Software muss wissen, wie ältere Datensätze zu verstehen sind. Deshalb erhalten dauerhafte Formate eine nachvollziehbare Fassung oder eine dokumentierte Migration. Eine Änderung am Programm allein macht vorhandene Daten nicht automatisch passend.

Eine Migration wird zunächst an einer Kopie repräsentativer Daten getestet. Dazu gehören ein frisches Konto, ein teilweise fortgeschrittenes Konto und ein Zustand mit bereits abgeschlossenen Aufgaben. Der Test prüft nicht nur, ob alle Zeilen verarbeitet wurden, sondern ob die fachliche Bedeutung erhalten bleibt. Ein neuer Standardwert kann technisch gültig und spielerisch trotzdem falsch sein.

Auch der Rückweg wird betrachtet. Wenn die neue Fassung Daten schreibt, die eine ältere Software nicht versteht, ist ein bloßer Programmtausch keine sichere Rücknahme. Dann braucht es einen passenden gesicherten Stand oder ein ausdrücklich geprüftes Rückverfahren. Diese Entscheidung wird vor der Freigabe getroffen, damit sie im Störungsfall nicht improvisiert werden muss.

Gegenstandsgebundene Daten bewusst einsetzen

Manche Informationen gehören direkt zu einem Spielobjekt, etwa eine eigene Kennung oder ein Typmerkmal. Paper stellt dafür den Persistent Data Container mit namensgebundenen Schlüsseln bereit. Solche Daten können ein Objekt im Spiel eindeutig beschreiben. Sie ersetzen jedoch nicht automatisch einen zentralen Besitz- oder Buchungsnachweis, wenn mehrere Systeme denselben Vorgang koordinieren. Paper: Persistent data container

Für einen besonderen Gegenstand wird deshalb entschieden, welche Bedeutung seine mitgeführten Daten besitzen. Ein Typmerkmal kann der Darstellung dienen. Eine einmalige Einlösekennung benötigt möglicherweise zusätzlich einen dauerhaften Nachweis über ihre Verwendung. Wer nur den sichtbaren Namen prüft, verwechselt Darstellung und Identität. Wer ausschließlich eine Kennung mitführt, muss dennoch deren Lebenszyklus und Kopierverhalten verstehen.

Der Test betrachtet Herstellung, Weitergabe, Lagerung und erneutes Laden. Bleibt das Merkmal erhalten, und wird es an allen vorgesehenen Stellen gleich interpretiert? Danach folgt ein Gegenstand mit ähnlichem Namen, aber ohne gültige Kennung. Er darf nicht dieselbe besondere Wirkung erhalten. Diese Prüfung verbindet technische Speicherung mit der tatsächlichen Bedeutung des Objekts.

Konsistenz durch kleine überprüfbare Szenarien belegen

Ein Datenmodell wird verständlicher, wenn es mit wenigen vollständigen Geschichten geprüft wird. Eine Person benennt sich um und behält Fortschritt. Eine Verbindung bricht während einer Belohnung ab. Zwei Einstiege versuchen dieselbe einmalige Änderung. Eine ältere Sitzung antwortet nach einer neuen. Jeder Fall besitzt einen vorab beschriebenen erwarteten Endzustand.

Nach dem Test werden Daten erneut geladen, statt nur den vorhandenen Arbeitsspeicher zu betrachten. Ein Neustart kann zeigen, ob der scheinbare Erfolg tatsächlich dauerhaft war. Zusätzlich wird eine Sicherungskopie wiederhergestellt und derselbe kleine Satz von Zuständen kontrolliert. So verbinden sich Datenmodell, laufender Betrieb und Wiederherstellbarkeit zu einer gemeinsamen Prüfung.

Lufox profitiert von Datenhaltung, wenn Identität, Fortschritt und Sitzung ihre jeweiligen Rollen behalten. Eindeutige Operationen und nachvollziehbare Fassungen machen Änderungen erklärbar. Die wichtigste Eigenschaft ist nicht die Zahl gespeicherter Felder, sondern ein konsistentes Ergebnis nach gewöhnlichen Handlungen und Unterbrechungen. Spieler sollen ihren Fortschritt wiederfinden, während das Team erkennen kann, warum genau dieser Zustand verbindlich ist.

Quellen