aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Metin2

Metin2 MySQL-Tabellen: Aufbau von player und account

Wenn du einen Metin2-Server startest, liegt alles — von Kämpfen über Gilden, von Inventaren bis zu Gildenkriegen — eigentlich in MySQL. Die Metin2 MySQL-Tabellen sind das dauerhafte Gedächtnis der Spiellogik: der Kern (die db- und game-Prozesse) liest, schreibt und cacht diese Tabellen. Die Standard-Metin2-Serverquelle teilt die Daten in zwei getrennte Datenbanken auf: account, die die Authentifizierung enthält, und player, die alles im Spiel enthält. In diesem Artikel erkläre ich die Haupttabellen beider Schemata klar und wofür jede einzelne da ist.

Zwei Datenbanken: account und player

Die Daten in zwei logische Bereiche aufzuteilen ist in Metin2 eine bewusste Entscheidung. Konto-/Login-Informationen (Login, Passwort, Bann-Status, E-Mail) liegen in der account-Datenbank, während Charaktere, Items, Gilden und Quests in der player-Datenbank liegen. Diese Trennung erleichtert es, später mehrere Spielwelten (Kanäle) an dasselbe Kontosystem anzubinden und die Berechtigungsgrenzen getrennt zu halten.

  • account — Authentifizierung, Zahlung/Cash, Banns und Sicherheitscodes.
  • player — Spielzustand: Charaktere, Items, Gilden, Lager, Quests, Freundesliste.

Die account-Datenbank

Die wichtigste Tabelle ist die account-Tabelle. Jede Zeile steht für ein Spielerkonto. Typische Spalten sind:

  • id — der eindeutige Primärschlüssel des Kontos; account_id in der player-Tabelle verweist darauf.
  • login — der Benutzername (zum Einloggen).
  • password — das Passwort, gehasht mit der PASSWORD()-Funktion von MySQL.
  • social_id — ein zweites Sicherheitspasswort (für Lager/PIN).
  • email — die E-Mail-Adresse des Kontos.
  • status — Kontostatus (etwa OK oder BLOCK).
  • securitycode, availDt — Sicherheitscode und das Gültigkeits-/Premium-Ablaufdatum des Kontos.

Eine einfache Abfrage, um zu sehen, wie das Passwort gespeichert wird:

SELECT id, login, status FROM account.account WHERE login = 'spieler1';

Beim Anlegen eines neuen Kontos wird das Passwort als Hash geschrieben, nicht im Klartext:

INSERT INTO account.account (login, password, social_id, email)
VALUES ('spieler1', PASSWORD('geheimesPW'), '7777', 'mail@beispiel.com');

Das Herz der player-Datenbank: die player-Tabelle

Die player-Tabelle hält jeden Charakter als eine Zeile. Vom Level des Spielers bis zu seiner Position, von den Stats bis zum Gold — alles ist hier. Häufig genutzte Spalten:

  • id — der Primärschlüssel des Charakters (meist als pid bezeichnet).
  • account_id — zu welchem Konto er gehört (account.account.id).
  • name — Charaktername (auf dem Server eindeutig).
  • job — Klasse (0 Krieger, 1 Ninja, 2 Sura, 3 Schamane).
  • level, exp, level_step — Level und Erfahrung.
  • st, ht, dx, iq — Stärke, Vitalität, Geschicklichkeit und Intelligenz.
  • gold — die Yang-Menge des Charakters.
  • hp, mp, stat_point, skill_point — Leben/Mana und nicht verteilte Punkte.
  • map_index, x, y — die Karte, auf der der Charakter ist, und die Koordinaten.
  • part_main, part_hair — die ausgerüstete Waffe/Rüstung und das Haar-Aussehen.
  • skill_group, playtime — der Skillbaum und die gesamte Spielzeit.

Um Level und Gold eines Charakters auszulesen:

SELECT name, level, gold, map_index
FROM player.player
WHERE name = 'Held';

Charakter-Slots: player_index

Ein Konto kann mehrere Charaktere tragen. Die player_index-Tabelle hält fest, welches Konto welche Charakter-IDs besitzt. Üblicherweise gibt es eine id (account_id) zusammen mit den Spalten pid0, pid1, pid2, pid3, von denen jede auf einen Charakter-Slot verweist. Der Charakterauswahl-Bildschirm liest diese Tabelle.

Items: die item-Tabelle

Die item-Tabelle hält alle physischen Items im Spiel (Inventar, Ausrüstung, Lager) in einer einzigen Tabelle. Wichtige Spalten:

  • id — die eindeutige ID des Items.
  • owner_id — die pid des Charakters, dem das Item gehört.
  • window — wo sich das Item befindet (INVENTORY, EQUIPMENT, SAFEBOX, MALL).
  • pos — die Slot-Position innerhalb dieses Fensters.
  • vnum — die Proto-Nummer des Items (welches Item es ist; sie verweist auf item_proto).
  • count — die Menge (bei stapelbaren Items).
  • socket0socket2 — eingesetzte Steine oder Sonderwerte.
  • attrtype0attrtype6 und attrvalue0attrvalue6 — die Bonustypen und -werte des Items.

item_proto und mob_proto sind die „Vorlagen"-Tabellen: Sie definieren die Grundeigenschaften jedes Items/Monsters (Name, Typ, Preis, Angriff). Die vnum in der item-Tabelle entspricht einer Zeile in item_proto.

Gilden, Lager und andere Tabellen

Soziale Systeme und Fortschrittssysteme leben in eigenen Tabellen:

  • guild — Gildenname, Anführer, Level und Erfahrung.
  • guild_member — welcher Charakter in welcher Gilde und in welchem Rang ist.
  • safebox — Lager-Passwort und Lager-Gold; die Items selbst liegen weiterhin in der item-Tabelle mit window=SAFEBOX.
  • quest — die Quest-Flags jedes Charakters (Quest-Fortschritt als Schlüssel/Wert).
  • affect — Buff-/Effektzustände, die bestehen bleiben, wenn ein Charakter sich ausloggt.
  • messenger_list — Beziehungen der Freundesliste.

Diese Tabellen sind über die pid (Charakter-ID) miteinander verbunden; zum Beispiel holst du alle Items eines Charakters über die Beziehung item.owner_id = player.id. Sobald du das Schema mit dieser Logik liest, wird das scheinbare Durcheinander zu einer sauberen relationalen Struktur.

Worauf bei der Arbeit mit den Tabellen zu achten ist

Ein wichtiger Punkt: Der db-Prozess cacht Charakter- und Item-Daten im Speicher. Wenn du ein UPDATE direkt ausführst, während der Spieler online ist, können die Daten, die der Kern beim Ausloggen schreibt, deine überschreiben. Nimm Datenänderungen daher vor, während der Spieler offline ist, mache immer zuerst ein Backup (mysqldump) und teste in einer Staging-Umgebung.

Häufige Fragen

Warum sind die account- und player-Datenbanken getrennt?

Die Authentifizierung von den Spieldaten zu trennen bringt Sicherheit und Flexibilität. Mehrere Spielwelten können sich an dasselbe Kontosystem anbinden, Berechtigungen bleiben getrennt und die Login-Tabelle wird von der Spiellast nicht beeinträchtigt.

Wo sind alle Items eines Charakters?

In der item-Tabelle der player-Datenbank. Die Spalte owner_id entspricht der id (pid) des Charakters; die Spalte window sagt dir, ob das Item im Inventar oder im Lager ist.

Ist es sicher, Gold hinzuzufügen, während der Spieler online ist?

Meist nicht. Der Kern hält die Daten im Cache und überschreibt die Tabelle beim Ausloggen. Der sichere Weg ist, einen In-Game-Befehl zu nutzen oder zu aktualisieren, während der Spieler offline ist.

Brauchst du Hilfe beim Bearbeiten deiner Metin2-Datenbank oder beim Aufsetzen eines sauberen Schemas? Für Unterstützung bei MySQL-Schema, Performance und Server-Einrichtung nimm Kontakt mit mir auf.

Bu kategorideki tüm yazılar →

Devamı için