aslain.dev
0%
← Tüm makaleler

Das Metin2-Questsystem: Quests in Lua von Grund auf schreiben

Was einen Metin2-Server am Leben hält, sind nicht seine Karten, sondern die Quests. Metin2-Quests zu erstellen heißt, das Herz des Systems zu lernen, das Spielern sagt, was zu tun ist, sie belohnt und die Geschichte vorantreibt. Die gute Nachricht: Das Questsystem von Metin2 ist eine Lua-basierte Mini-Sprache, die erstaunlich leicht zu lernen ist. In diesem Leitfaden schreibe ich eine Quest von Grund auf – mit derselben Struktur, die ich auf meinem Server Runa2 verwende.

Wie eine Quest-Datei funktioniert

Jede Quest besteht aus drei Kernblöcken, und jedes begin braucht ein end:

  • quest — die Quest selbst (ein eindeutiger Name).
  • state — die Phase der Quest. start ist immer die Einstiegsphase; mit set_state() wechselst du zu anderen.
  • when — ein Ereignis-Auslöser wie login, levelup, kill oder ein NPC .click / .chat.

Die Verschachtelung ist immer quest → state → when.

Deine erste Quest: mit einem NPC sprechen und eine Belohnung erhalten

Das folgende Beispiel ist eine vollständige Quest, die per NPC-Klick vergeben wird, den Spieler um Bestätigung bittet und nach Abschluss ein Item, Erfahrung und Gold gewährt:

quest welcome begin
    state start begin
        when 20095.chat."Start the quest" begin
            say_title("Villager:")
            say("Welcome, adventurer!")
            say("Will you help me?")
            local answer = select("Sure", "Not now")
            if answer == 2 then
                return
            end
            pc.setqf("welcome_step", 1)
            set_state(active)
        end
    end

    state active begin
        when 20095.chat."Finish the quest" begin
            if pc.getqf("welcome_step") == 1 then
                say("Thank you! Here is your reward.")
                pc.give_item2(27003, 5)   -- example item vnum
                pc.give_exp2(10000)
                pc.change_gold(50000)
                set_state(done)
            end
        end
    end

    state done begin
        when 20095.chat."Finish the quest" begin
            say("You have already finished this quest.")
        end
    end
end

Ein paar Details: Der Text in Anführungszeichen "Start the quest" ist die dem Spieler angezeigte Menüoption — schreibe sie in deiner Sprache. select() gibt den Index der gewählten Option zurück (1, 2…). pc.give_item2(vnum, Anzahl) gibt ein Item; 27003 ist nur ein Beispiel-vnum.

Quest-Flags: Fortschritt speichern

In welcher Phase eine Quest ist, speicherst du mit Quest-Flags. pc.setqf("name", wert) schreibt ein Flag und pc.getqf("name") liest es. Diese Flags sind spielerbezogen und dauerhaft. Zum Beispiel eine „Töte 10 Wölfe"-Quest:

when 101.kill begin
    local count = pc.getqf("wolf_count") + 1
    pc.setqf("wolf_count", count)
    if count >= 10 then
        say("You killed 10 wolves!")
        pc.give_exp2(50000)
        set_state(done)
    end
end

Hier ist 101 der vnum des Wolfs. Jeder Kill erhöht den Zähler; bei 10 wird die Belohnung vergeben und die Quest wechselt in die Phase done.

Häufige Auslöser

  • when login begin — wenn der Spieler sich einloggt.
  • when levelup begin — beim Levelaufstieg (lies das Level mit pc.get_level()).
  • when <vnum>.kill begin — wenn ein bestimmtes Monster getötet wird.
  • when <vnum>.click / .chat."Text" — beim Klick auf einen NPC oder Öffnen eines Menüs.

Die Quest kompilieren und ausrollen

Deine .quest-Datei läuft nicht direkt; sie muss zuerst mit dem qc-Compiler kompiliert werden. Der typische Ablauf: Lege die Datei in den quest-Ordner des Servers, füge sie der Questliste hinzu und kompiliere (meist ruft make qc auf). Lade danach im Spiel mit /reload q neu oder starte den Kern neu. Bei einem Syntaxfehler nennt dir qc die Zeilennummer — nach jeder kleinen Änderung zu kompilieren ist daher eine gute Gewohnheit.

Debugging-Tipps

  • Setze temporäre say("hier angekommen")-Zeilen ein, um den Ablauf zu verfolgen.
  • Fehlt ein end, warnt dich qc beim Kompilieren; rücke verschachtelte Blöcke ein, um den Überblick zu behalten.
  • Halte Flag-Namen eindeutig; denselben Namen über Quests hinweg wiederzuverwenden zerstört den Fortschritt.

Häufige Fragen

Muss ich Lua können, um Quests zu schreiben?

Du musst kein Lua-Experte sein. Die Grundlagen — if, Variablen und Funktionsaufrufe — kombiniert mit den eingebauten Funktionen (say, select, pc.give_item2…) reichen völlig aus.

Muss ich den Server herunterfahren, um eine Quest zu ändern?

Nein. Meist kompilierst du mit qc und aktualisierst sofort mit dem Ingame-Befehl /reload q.

Wie viele States kann eine Quest haben?

Es gibt keine praktische Grenze. Einfache Quests sind in 2–3 States fertig; für lange Questketten fügst du beliebig viele Phasen hinzu.

Willst du ein maßgeschneidertes Questsystem für deinen Server? Vom Battle Pass bis zu täglichen Quests baue ich Lua-Questsysteme — kontaktiere mich.

Devamı için