Metin2 Quest-Funktionen sind die grundlegenden Werkzeuge, mit denen alles im Lua-basierten, serverseitigen Questsystem läuft. Vom Gespräch mit einem NPC über das Austeilen von Items bis zum Auslesen des Spielerlevels oder dem Teleportieren über Karten hinweg: Fast jede Aktion, die du schreibst, ist eine Kombination dieser Funktionen. In diesem Artikel gehe ich die Befehle durch, die dir am häufigsten begegnen, gruppiert nach den Namespaces pc, npc, game und item, mit funktionierenden Beispielen.
Das Grundgerüst einer Quest
Bevor es zu den Funktionen geht, lohnt es sich, die allgemeine Form einer Quest in Erinnerung zu rufen. Jede Quest enthält einen state, und jeder State hängt sich an Auslöser-Ereignisse (when). Der häufigste Auslöser ist das Öffnen eines Gesprächs mit einem NPC.
quest begruessung begin
state start begin
when 9003.chat."Hallo Freund" begin
say_title("Dorfbewohner")
say("Willkommen, Reisender!")
say("")
say("Ich habe eine Aufgabe für dich.")
end
end
end
Hier ist 9003 der vnum des NPCs, say_title setzt den Titel des Dialogfensters, und say gibt eine Textzeile aus. Ein leeres say("") wird verwendet, um eine Leerzeile zwischen Absätzen zu lassen.
Der pc-Namespace: den Spieler lesen und verändern
Alles rund um den Spieler läuft über den pc-Namespace. Die meistgenutzten Metin2 Quest-Funktionen finden sich genau hier. Ein paar Beispiele:
pc.get_level()— gibt das Level des Spielers zurück.pc.get_name()— liefert den Namen des Charakters.pc.get_money()undpc.change_money(betrag)— Yang auslesen und hinzufügen/abziehen.pc.give_item2(vnum, anzahl)— fügt ein Item dem Inventar hinzu.pc.count_item(vnum)/pc.remove_item(vnum, anzahl)— Items zählen und löschen.pc.give_exp2(betrag)— vergibt Erfahrungspunkte.pc.warp(x, y)— teleportiert den Spieler zu einer Koordinate.
Ein typischer Belohnungsablauf sieht so aus:
when 9003.chat."Ich habe die Aufgabe erledigt" begin
if pc.count_item(27001) >= 5 then
pc.remove_item(27001, 5)
pc.give_item2(11209, 1)
pc.give_exp2(50000)
pc.change_money(100000)
say("Danke! Nimm deine Belohnung.")
else
say("Du hast noch keine 5 gebracht.")
end
end
Die Bedingung wird mit pc.count_item geprüft, dann verbraucht pc.remove_item die Materialien, und Item, Erfahrung und Yang werden als Belohnung vergeben.
Quest-Flags: pc.setqf und pc.getqf
Um den Questfortschritt dauerhaft zu speichern, verwendest du ein Quest-Flag. pc.setqf("schluessel", wert) speichert einen Wert und pc.getqf("schluessel") liest ihn, sodass du dir merkst, in welcher Phase der Quest der Spieler steckt.
when 9003.chat."Quest starten" begin
if pc.getqf("phase") == 0 then
pc.setqf("phase", 1)
say("Quest gestartet. Jage 10 Wölfe.")
elseif pc.getqf("phase") == 1 then
say("Du jagst noch immer Wölfe.")
end
end
Flags sind spielerspezifisch und werden in der Datenbank gespeichert, sodass Werte das Aus- und Einloggen überdauern. In komplexen Questketten dienen sie auch als Zähler (zum Beispiel bei jedem Kill: pc.setqf("zaehler", pc.getqf("zaehler") + 1)).
Der npc-Namespace: Infos über den NPC, mit dem du sprichst
Innerhalb eines chat-Blocks zeigt der npc-Namespace auf den NPC, mit dem du gerade interagierst. Häufige:
npc.get_race()— gibt vnum/Rassennummer des NPCs zurück, ideal, um mehrere NPCs innerhalb einer Quest zu unterscheiden.npc.getqf/npc.setqf— NPC-spezifische Flags (für instanzbasierte Zustände).npc.purge()— entfernt den NPC aus der Szene, meist bei temporär gespawnten NPCs.
when 20354.kill begin
if npc.get_race() == 20354 then
pc.give_exp2(10000)
say("Du hast den Metin-Stein zerstört!")
end
end
Hier feuert der kill-Auslöser, wenn ein Monster stirbt, und npc.get_race() bestätigt, welche Kreatur getötet wurde.
Der game-Namespace: mit der Welt interagieren
Der game-Namespace deckt allgemeine Operationen auf der Spielwelt ab: Hinweise anzeigen, Event-Flags lesen und den Spieler teleportieren.
game.get_event_flag("name")— liest ein serverweites Event-Flag (zum Beispiel, ob ein Event aktiv ist).game.set_event_flag("name", wert)— setzt die globalen Flags, die meist über GM-Befehle verwaltet werden.game.warp(x, y)undgame.warp(x, y, karte)— Teleport.game.drop_item(vnum, anzahl)— lässt ein Item auf den Boden fallen.
when 9003.chat."Gibt es ein Event?" begin
if game.get_event_flag("jubilee") == 1 then
say("Ja, das Event ist aktiv!")
else
say("Im Moment kein Event.")
end
end
Der item-Namespace: am ausgewählten Item arbeiten
Wenn auf ein Item geklickt oder es mit item.select(vid) ausgewählt wird, bindet sich der item-Namespace an dieses Item. Es ist die Basis der Aufwertungs-, Sockel- und Attributsysteme.
item.get_vnum()unditem.get_count()— vnum und Anzahl des Items.item.get_name()— der Name des Items.item.remove()— löscht das ausgewählte Item.item.get_socket(index)/item.set_socket(index, wert)— Sockel lesen/schreiben.item.get_value(index)— liest die Wertfelder des Items.
when 11209.use begin
item.set_socket(0, 1)
say("Item erfolgreich aktiviert.")
end
Hier feuert der use-Auslöser, wenn das Item benutzt wird, und item.set_socket aktualisiert den ersten Sockel. Beim Arbeiten mit Sockeln gilt: Die Indizes beginnen bei 0.
Hilfsfunktionen: say, select, wait
Die Helfer, die den Dialogfluss steuern, werden genauso häufig genutzt wie die Namespaces. select("Option 1", "Option 2") zeigt dem Spieler ein Menü und gibt die Nummer der gewählten Option zurück. wait() pausiert den Dialog und zeigt eine „Weiter"-Schaltfläche.
when 9003.chat."Triff eine Wahl" begin
say("Welche Belohnung möchtest du?")
local wahl = select("Schwert", "Rüstung", "Abbrechen")
if wahl == 1 then
pc.give_item2(11209, 1)
elseif wahl == 2 then
pc.give_item2(11949, 1)
end
end
Häufige Fragen
Was ist der Unterschied zwischen pc.give_item und pc.give_item2?
pc.give_item2(vnum, anzahl) ist die heute gebräuchliche Standardversion und nimmt einen Anzahl-Parameter. Die älteren pc.give_item-Signaturen können eine andere Parameterreihenfolge haben; aus Konsistenzgründen bevorzugen neue Quests pc.give_item2.
Wo werden Quest-Flags gespeichert?
Spielerspezifische Flags (pc.setqf) werden zusammen mit dem Spielzustand des Charakters in der Datenbank gehalten, sodass Werte selbst nach Aus- und Einloggen erhalten bleiben. Event-Flags hingegen sind serverweit und werden meist von einem GM verwaltet.
Muss ich nach dem Bearbeiten einer Questdatei neu starten?
Üblicherweise kompilierst du die Quests (mit dem Quest-Compiler) und lädst sie neu, um die Änderungen anzuwenden. Viele Server haben dafür einen eigenen Reload-Mechanismus; andernfalls muss der Game-Core die Quests erneut einlesen.
Beim Questsystem festgefahren? Wenn du maßgeschneiderte Questketten, Eventsysteme oder Debugging-Hilfe für deinen Metin2-Server brauchst, melde dich und wir lösen es gemeinsam.