Eine Metin2 Database-Seite verwandelt die Item- und Monsterdaten des Spiels in ein Web-Wiki, das Besucher durchsuchen und filtern können. Spieler können Fragen wie „Wo dropt dieses Item?", „Welches Level hat dieser Mob?" oder „Welche Boni gibt dieses Kostüm?" beantworten, ohne sich einzuloggen. In dieser Anleitung gehe ich Schritt für Schritt durch, wie du item_proto- und mob_proto-Daten nimmst, in eine saubere Web-Datenbank importierst und daraus eine schnelle, durchsuchbare Database-Seite baust.
Die Datenquellen verstehen: die Proto-Dateien
In Metin2 ist jedes Item und Monster, das das Spiel kennt, in zwei Hauptstrukturen definiert: item_proto und mob_proto. Auf den meisten Servern existieren diese sowohl als binäre item_proto/mob_proto-Dateien als auch als Klartextquellen:
item_proto/item_names.txt— dievnumjedes Items, sein Typ (Waffe, Rüstung, Kostüm, Trank…), Untertyp, die Feldervalue0–5, Boni (Applies), Preis und Namen.mob_proto/mob_names.txt— dievnumjedes Monsters, sein Level, sein Rang (pawn/boss/king…), HP-/Angriffswerte, Erfahrung und Namen.item_names.txtundmob_names.txt— die Zuordnung vnum → lokalisierter Name. Für ein mehrsprachiges Wiki sind diese Dateien entscheidend.
Der sauberste Weg für eine Website ist, diese Daten in eine separate Wiki-Datenbank zu importieren, ohne die aktiven player-Tabellen zu berühren. So kannst du jedes gewünschte Schema bauen, ohne den Spielserver jemals zu laden.
Die Daten in eine Web-Datenbank importieren
Viele Server halten Proto-Daten auch in MySQL vor (zum Beispiel eine player.item_proto-Tabelle). Hast du nur Klartextdateien, ist der gesündeste Ansatz ein kleines Import-Skript, das sie einmal parst und in deine eigenen Wiki-Tabellen schreibt. Beginnen wir mit einem einfachen Schema:
CREATE TABLE wiki_items (
vnum INT UNSIGNED PRIMARY KEY,
name VARCHAR(64) NOT NULL,
type VARCHAR(32) NOT NULL,
subtype VARCHAR(32) NULL,
level SMALLINT UNSIGNED DEFAULT 0,
price INT UNSIGNED DEFAULT 0,
KEY idx_name (name),
KEY idx_type (type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE wiki_mobs (
vnum INT UNSIGNED PRIMARY KEY,
name VARCHAR(64) NOT NULL,
level SMALLINT UNSIGNED DEFAULT 0,
rank VARCHAR(16) NULL,
exp INT UNSIGNED DEFAULT 0,
KEY idx_name (name),
KEY idx_level (level)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Bonusfelder (Apply-Typen und Werte) in einer separaten Tabelle wiki_item_attrs als über vnum verknüpfte Zeilen zu speichern, ermöglicht spätere Suchen wie „alle Items mit Angriffskraft +X".
Das tab-getrennte Proto parsen
Dateien wie item_names.txt bestehen meist aus tab-getrennten Spalten mit einer Kopfzeile. Ein sicherer Import in PHP sieht so aus:
<?php
$fh = fopen('item_names.txt', 'r');
fgets($fh); // Kopfzeile überspringen
$stmt = $pdo->prepare(
"INSERT INTO wiki_items (vnum, name, type)
VALUES (:vnum, :name, :type)
ON DUPLICATE KEY UPDATE name = VALUES(name)"
);
while (($line = fgets($fh)) !== false) {
$cols = explode("\t", trim($line));
if (count($cols) < 2) continue;
$stmt->execute([
':vnum' => (int) $cols[0],
':name' => $cols[1],
':type' => 'unknown',
]);
}
fclose($fh);
Typ- und Bonusinformationen kannst du aus item_proto lesen und dieselbe Zeile aktualisieren. Mit ON DUPLICATE KEY UPDATE kannst du den Import nach einem Spiel-Update erneut ausführen, um die Daten zu aktualisieren, ohne sie jedes Mal zu löschen.
Die Such- und Filter-API
Das Herz einer Metin2 Database-Seite ist die Suche. Bauen wir einen Endpunkt, der passende Items und Mobs zurückgibt, wenn der Nutzer einen Teil eines Namens eintippt. Binde Nutzereingaben niemals direkt in die Abfrage ein; binde sie als Parameter mit einem Prepared Statement:
<?php
$q = trim($_GET['q'] ?? '');
$type = $_GET['type'] ?? null;
$sql = "SELECT vnum, name, type, level FROM wiki_items WHERE name LIKE :q";
$params = [':q' => '%' . $q . '%'];
if ($type) {
$sql .= " AND type = :type";
$params[':type'] = $type;
}
$sql .= " ORDER BY level DESC, name ASC LIMIT 50";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($stmt->fetchAll());
Bei sehr großen Item-Mengen kann name LIKE '%...%' langsam werden. Wenn die Seite wächst, erwäge einen MySQL-FULLTEXT-Index oder eine Suchmaschine (wie Meilisearch); aber für ein paar tausend Zeilen reicht ein indiziertes LIKE mehr als aus.
Die Drop-Beziehung aufbauen: „Wo dropt es?"
Die Information, nach der Spieler am meisten suchen, ist, welches Monster ein Item droppt. Drop-Daten liegen auf dem Server in Quellen wie mob_drop_item.txt, common_drop_item.txt und drop_item_group. Importierst du diese Beziehung in eine Tabelle, die die Mob-vnum mit der Item-vnum verknüpft, schaltest du beidseitige Abfragen frei:
CREATE TABLE wiki_drops (
mob_vnum INT UNSIGNED NOT NULL,
item_vnum INT UNSIGNED NOT NULL,
chance DECIMAL(8,4) NULL,
PRIMARY KEY (mob_vnum, item_vnum),
KEY idx_item (item_vnum)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Jetzt kann eine Item-Seite „Monster, die dieses Item droppen" und eine Mob-Seite „die Drop-Tabelle dieses Monsters" mit einem JOIN auflisten. Wenn du die Drop-Chance anzeigst, denke daran, dass das rohe Wahrscheinlichkeitsformat in den Dateien je nach Servertyp variieren kann; bist du dir nicht sicher, präsentiere die Rate nicht als exakt — kennzeichne sie als „ungefähr".
Die Oberfläche: Tooltips und Icons
Egal wie genau die Daten sind, niemand nutzt sie, wenn die Darstellung schlecht ist. Eine gute Item-Seite ahmt den In-Game-Tooltip nach: Name, Typ, Level-Voraussetzung, Bonusliste und Preis. Für Icons kannst du die Item-Icons aus dem Spiel-Client als PNG exportieren und über die vnum zuordnen. Ein paar praktische Tipps:
- Escape jeden String aus der Datenbank mit
htmlspecialchars()vor der Ausgabe — Namen mit Sonderzeichen können XSS verursachen. - Wandle Boni in lesbare Labels um (z. B. Apply-Typ 1 → „Max. LP"). Halte diese Zuordnung in einer kleinen Wörterbuchdatei.
- Packe Tabellen auf Mobilgeräten in einen horizontal scrollbaren Container, um Überlauf zu vermeiden.
Leistung, Caching und SEO
Database-Seiten sind leselastig: Die Daten ändern sich selten, werden aber viel gelesen. Diese Struktur eignet sich ideal für Caching. Jede Item- und Mob-Seite sollte eine permanente URL haben (z. B. /item/27003) und du solltest Ergebnisse für ein paar Minuten cachen. Für SEO erhöht es die Sichtbarkeit bei „Metin2 [Itemname]"-Suchen, jeder Seite einen beschreibenden <title>, eine Meta-Beschreibung und idealerweise JSON-LD-Daten zu geben. Eine sitemap.xml mit allen Item- und Mob-URLs zu erzeugen, beschleunigt zudem das Erscheinen in den Suchergebnissen.
Häufige Fragen
Beeinträchtigt die Wiki-Seite den Spielserver?
Nicht, wenn sie richtig eingerichtet ist. Importierst du die Proto-Daten in eine separate Wiki-Datenbank und lässt die Seite nur aus diesen Tabellen lesen, berührst du die aktive Spiel-Datenbank nie.
Ich habe keine Klartext-Proto-Dateien, nur binär. Was tun?
Die meisten Server halten auch eine item_proto/mob_proto-Tabelle in MySQL vor, aus der du lesen kannst. Andernfalls brauchst du Community-Tools (Proto-Unpacker), die die Proto-Dateien in eine Textversion umwandeln.
Die Namen erscheinen mit kaputten Zeichen, warum?
Meist ist es eine Zeichensatz-Inkongruenz. Erstelle die Tabellen mit utf8mb4, konvertiere die echte Kodierung der Datei (viele Protos nutzen eine Latin-/Windows-Kodierung) beim Import nach UTF-8 und füge der Seite <meta charset="utf-8"> hinzu.
Möchtest du eine professionelle Database/Wiki-Seite für deinen Server? Ich kann deine Proto-Daten sicher importieren und ein schnelles, durchsuchbares, mehrsprachiges Wiki bauen. Um dein Projekt zu besprechen, nimm Kontakt mit mir auf.