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

Metin2 Quest-Funktionen: die meistgenutzten

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() und pc.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) und game.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() und item.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.

Bu kategorideki tüm yazılar →

Devamı için