Ein metin2 level reward System ist eine kleine, aber bindende Mechanik, die dem Spieler bei jedem Stufenaufstieg automatisch eine Belohnung gibt. Indem es Neulingen auf den ersten Stufen Tränke und Yang gibt und auf höheren Stufen wertvollere Items, stärkt es das Gefühl des Fortschritts. Das Beste daran: Du musst dafür die Serverquelle (Source) nicht kompilieren. Du erledigst alles mit der Quest-Skriptsprache von Metin2, indem du eine einzige .quest-Datei schreibst. In diesem Artikel bauen wir diese Quest von Grund auf mit echtem, funktionierendem Code.
Die Logik: das levelup-Event abfangen
Die Quest-Engine von Metin2 ist eventbasiert. Das Event, das wir brauchen, ist when levelup: Es wird in dem Moment ausgelöst, in dem ein Spieler eine Stufe aufsteigt. Darin lesen wir die aktuelle Stufe mit pc.get_level() und entscheiden, welche Belohnung gewährt wird. Das Einzige, worauf man achten muss, ist, dieselbe Belohnung nicht zweimal zu geben; dafür speichern wir den Fortschritt in einem Quest-Flag.
pc.get_level()— gibt die aktuelle Stufe des Spielers zurück.pc.give_item2(vnum, count)— fügt dem Inventar ein Item hinzu.pc.change_gold(Betrag)— ändert das Yang (Gold) des Spielers.pc.setqf("name", wert)/pc.getqf("name")— schreibt/liest ein dauerhaftes Flag, das zu dieser Quest gehört.
Ein erstes funktionierendes Grundgerüst
Die folgende Quest belohnt den Spieler einmal, wenn er Stufe 10 erreicht, und vergibt denselben Preis nie erneut. Speichere die Datei als level_reward.quest im Ordner share/locale/.../quest und füge sie der Questliste hinzu.
quest level_reward begin
state start begin
when levelup begin
local level = pc.get_level()
-- Belohnung für Stufe 10, nur einmal
if level == 10 and pc.getqf("lv10") == 0 then
pc.give_item2(27003, 5) -- Heiltrank, Beispiel-vnum
pc.change_gold(50000)
pc.setqf("lv10", 1)
syschat("Glückwunsch! Du hast die Belohnung für Stufe 10 erhalten.")
end
end
end
end
Die 27003 hier ist nur eine Beispiel-vnum; prüfe den echten Wert in deiner eigenen item_proto-Tabelle, denn Item-Nummern unterscheiden sich von Server zu Server.
Mehrere Stufen mit einer einzigen Tabelle verwalten
Für jede Stufe einen eigenen if-Block zu schreiben, wird schnell unübersichtlich. Halte die Belohnungen stattdessen in einer (Lua-)Tabelle und verwende die Stufe als Schlüssel. Eine neue Belohnung hinzuzufügen ist dann nur eine Zeile.
quest level_reward begin
state start begin
when levelup begin
local level = pc.get_level()
-- Stufe = { item_vnum, Anzahl, Yang }
local rewards = {
[10] = { 27003, 5, 50000 },
[20] = { 27005, 5, 100000 },
[30] = { 50300, 1, 200000 },
[40] = { 50300, 2, 400000 },
}
local r = rewards[level]
if r and pc.getqf("lv" .. level) == 0 then
pc.give_item2(r[1], r[2])
pc.change_gold(r[3])
pc.setqf("lv" .. level, 1)
syschat(string.format("Belohnung für Stufe %d deinem Inventar hinzugefügt!", level))
end
end
end
end
Der Tabellenansatz hat zwei Vorteile: Du verwaltest die Belohnungsliste von einem Ort aus, und da pc.getqf("lv" .. level) jeder Stufe ihr eigenes Flag gibt, besteht kein Risiko einer doppelten Vergabe. Gegen ein volles Inventar kannst du eine Prüfung mit pc.count_item(vnum) hinzufügen oder die Belohnung an das Postfach umleiten.
Itemverlust bei vollem Inventar verhindern
Ein Aufruf von give_item2 lässt das Item stillschweigend fallen oder verliert es, wenn im Inventar kein Platz ist. Auf niedrigen Stufen ist das gering, aber bei wertvollen Belohnungen frustriert es die Spieler. Ein einfacher Schutz besteht darin, auf freien Platz zu prüfen und den Spieler zu warnen, wenn keiner vorhanden ist.
local function safe_give(vnum, count)
if pc.get_empty_inventory_count() < 1 then
syschat("Dein Inventar ist voll! Schaffe Platz und versuche es erneut.")
return false
end
pc.give_item2(vnum, count)
return true
end
In robusteren Lösungen schickst du die Belohnung direkt an das Postfach des Spielers, sodass sie nicht verloren geht, selbst wenn der Spieler offline oder sein Inventar voll ist. Das ist die bevorzugte Methode für dauerhafte Event-Belohnungssysteme.
Testen und neu laden
Nachdem du die Quest gespeichert hast, musst du sie kompilieren und im Spiel anwenden. In den meisten Server-Builds führst du einen make- oder einen skriptbasierten qc (Quest-Compiler)-Schritt aus, um die Quests neu zu bauen, und startest dann den Game-Core neu oder lädst die Quests neu. Gib zum Testen einem Charakter per Befehl Stufen und prüfe, ob das Event auslöst, die Flags korrekt geschrieben werden und die Belohnung ankommt.
- Probiere es mit einem neuen Charakter, damit die Flags sauber sind.
- Bestätige, dass das erneute Erreichen derselben Stufe (zum Beispiel nach einem Reset) die Belohnung nicht erneut vergibt.
- Beobachte das Verhalten der Belohnung, wenn das Inventar voll ist.
Häufige Fragen
Löst das levelup-Event bei jeder Stufe aus?
Ja, der when levelup-Block läuft jedes Mal, wenn der Spieler eine Stufe gewinnt. Bei Spielern, die mehrere Stufen auf einmal springen, löst es für jeden Gewinn separat aus, weshalb die tabellenbasierte Prüfung sicher ist.
Wo finde ich die Item-vnums?
Du kannst sie in der item_proto-Tabelle des Servers oder in der Datei item_names.txt nachschlagen. Da vnums auf jedem Server unterschiedlich sein können, verwende die Beispielnummern aus diesem Artikel nicht direkt — prüfe sie anhand deiner eigenen Datenbank.
Ist es besser, die Belohnung per Post zu senden?
Bei wertvollen oder Event-Belohnungen ja. Die Post stellt sicher, dass die Belohnung nicht verloren geht, selbst wenn das Inventar voll oder der Spieler offline ist; bei einfachen Trank-/Gold-Belohnungen reicht es, sie direkt ins Inventar zu geben.
Möchtest du ein maßgeschneidertes Belohnungs- oder Event-System für deinen Server? Wenn du Hilfe bei der Metin2 Quest- und Systementwicklung brauchst, nimm Kontakt mit mir auf — lass uns gemeinsam Mechaniken bauen, die deine Spieler im Spiel halten.