aslain.dev
0%
← Tüm makaleler

Het Metin2-questsysteem: quests schrijven in Lua vanaf nul

Wat een Metin2-server levend houdt, zijn niet de maps maar de quests. Metin2-quests maken leren betekent het hart leren kennen van het systeem dat spelers vertelt wat ze moeten doen, ze beloont en het verhaal voortstuwt. Het goede nieuws: het questsysteem van Metin2 is een op Lua gebaseerde minitaal die verrassend makkelijk te leren is. In deze gids schrijf ik een quest vanaf nul met dezelfde structuur die ik op mijn server Runa2 gebruik.

Hoe werkt een questbestand?

Elke quest bestaat uit drie kernblokken, en elke begin moet een end hebben:

  • quest — de quest zelf (een unieke naam).
  • state — de fase van de quest. start is altijd de beginfase; met set_state() ga je naar andere.
  • when — een gebeurtenis-trigger zoals login, levelup, kill, of een NPC .click / .chat.

De nestvolgorde is altijd quest → state → when.

Je eerste quest: met een NPC praten en een beloning krijgen

Het voorbeeld hieronder is een volledige quest, gegeven bij het klikken op een NPC, die de speler om bevestiging vraagt en bij voltooiing een item, ervaring en goud geeft:

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

Enkele details: de tekst tussen aanhalingstekens "Start the quest" is de menuoptie die de speler ziet — schrijf die in je eigen taal. select() geeft de index van de gekozen optie terug (1, 2…). pc.give_item2(vnum, aantal) geeft een item; 27003 is slechts een voorbeeld-vnum.

Quest-flags: voortgang opslaan

Je slaat op in welke fase een quest zit met quest-flags. pc.setqf("naam", waarde) schrijft een flag en pc.getqf("naam") leest hem. Deze flags zijn per speler en blijvend. Bijvoorbeeld een "dood 10 wolven"-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 is 101 de vnum van de wolf. Elke kill verhoogt de teller; bij 10 wordt de beloning gegeven en gaat de quest naar de fase done.

Veelgebruikte triggers

  • when login begin — wanneer de speler inlogt.
  • when levelup begin — bij level-up (lees het level met pc.get_level()).
  • when <vnum>.kill begin — wanneer een specifiek monster wordt gedood.
  • when <vnum>.click / .chat."Tekst" — bij klikken op een NPC of openen van een menu.

De quest compileren en uitrollen

Je .quest-bestand draait niet rechtstreeks; het moet eerst worden gecompileerd met de qc-compiler. De typische flow: zet het bestand in de quest-map van de server, voeg het toe aan de questlijst en compileer (meestal roept make qc aan). Herlaad daarna in-game met /reload q of herstart de core. Bij een syntaxisfout geeft qc het regelnummer — compileren na elke kleine wijziging is dus een goede gewoonte.

Debugtips

  • Plaats tijdelijke say("hier gekomen")-regels om de flow te volgen.
  • Ontbreekt er een end, dan waarschuwt qc bij het compileren; lijn geneste blokken in om overzicht te houden.
  • Houd flagnamen uniek; dezelfde naam hergebruiken tussen quests breekt de voortgang.

Veelgestelde vragen

Moet ik Lua kennen om quests te schrijven?

Je hoeft geen Lua-expert te zijn. De basis — if, variabelen en functieaanroepen — gecombineerd met de ingebouwde functies (say, select, pc.give_item2…) is ruim voldoende.

Moet ik de server uitzetten om een quest te wijzigen?

Nee. Meestal compileer je met qc en ververs je direct met het in-game commando /reload q.

Hoeveel states kan een quest hebben?

Er is geen praktische limiet. Eenvoudige quests zijn klaar in 2–3 states; voor lange questketens voeg je zoveel fases toe als nodig.

Wil je een quest-systeem op maat voor je server? Van battle pass tot dagelijkse quests, ik bouw Lua-questsystemen — neem contact op.

Devamı için