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

Metin2 Quest-functies: de meest gebruikte

Metin2 quest-functies zijn de kerngereedschappen waarmee alles in het op Lua gebaseerde, server-side questsysteem draait. Van praten met een NPC en items uitdelen tot het uitlezen van het level van een speler of hem naar een andere kaart teleporteren: bijna elke actie die je schrijft is een combinatie van deze functies. In dit artikel bespreek ik de commando's die je het vaakst tegenkomt, gegroepeerd per pc-, npc-, game- en item-namespace, met werkende voorbeelden.

Het skelet van een quest

Voor we naar de functies gaan, is het handig om de algemene vorm van een quest te herhalen. Elke quest bevat een state, en elke state haakt in op triggergebeurtenissen (when). De meest voorkomende trigger is het openen van een gesprek met een NPC.

quest begroeting begin
    state start begin
        when 9003.chat."Hallo vriend" begin
            say_title("Dorpeling")
            say("Welkom, reiziger!")
            say("")
            say("Ik heb een taak voor je.")
        end
    end
end

Hier is 9003 de vnum van de NPC, say_title stelt de titel van het dialoogvenster in, en say drukt een tekstregel af. Een lege say("") wordt gebruikt om een witregel tussen alinea's te laten.

De pc-namespace: de speler lezen en wijzigen

Alles wat met de speler te maken heeft, loopt via de pc-namespace. De meestgebruikte Metin2 quest-functies staan precies hier. Een paar voorbeelden:

  • pc.get_level() — geeft het level van de speler terug.
  • pc.get_name() — geeft de naam van het personage.
  • pc.get_money() en pc.change_money(bedrag) — yang uitlezen en toevoegen/aftrekken.
  • pc.give_item2(vnum, aantal) — voegt een item toe aan de inventaris.
  • pc.count_item(vnum) / pc.remove_item(vnum, aantal) — items tellen en verwijderen.
  • pc.give_exp2(bedrag) — kent ervaringspunten toe.
  • pc.warp(x, y) — teleporteert de speler naar een coördinaat.

Een typische beloningsflow ziet er zo uit:

when 9003.chat."Ik heb de taak voltooid" 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("Bedankt! Neem je beloning.")
    else
        say("Je hebt er nog geen 5 gebracht.")
    end
end

De voorwaarde wordt gecontroleerd met pc.count_item, daarna verbruikt pc.remove_item de materialen en worden het item, de ervaring en de yang als beloning gegeven.

Quest-flags: pc.setqf en pc.getqf

Om questvoortgang permanent op te slaan gebruik je een quest-flag. pc.setqf("sleutel", waarde) bewaart een waarde en pc.getqf("sleutel") leest hem, zodat je onthoudt in welke fase van de quest de speler zit.

when 9003.chat."Start de quest" begin
    if pc.getqf("fase") == 0 then
        pc.setqf("fase", 1)
        say("Quest gestart. Jaag op 10 wolven.")
    elseif pc.getqf("fase") == 1 then
        say("Je jaagt nog steeds op wolven.")
    end
end

Flags zijn per speler en worden opgeslagen in de database, dus waarden overleven uitloggen en inloggen. In complexe questketens dienen ze ook als tellers (bijvoorbeeld bij elke kill: pc.setqf("teller", pc.getqf("teller") + 1)).

De npc-namespace: info over de NPC met wie je praat

Binnen een chat-blok verwijst de npc-namespace naar de NPC waarmee je op dat moment interactie hebt. Veelgebruikte:

  • npc.get_race() — geeft de vnum/race-nummer van de NPC terug, ideaal om meerdere NPC's binnen één quest te onderscheiden.
  • npc.getqf / npc.setqf — NPC-specifieke flags (voor instance-gebonden toestanden).
  • npc.purge() — verwijdert de NPC uit de scène, meestal voor tijdelijk gespawnde NPC's.
when 20354.kill begin
    if npc.get_race() == 20354 then
        pc.give_exp2(10000)
        say("Je hebt de Metin-steen vernietigd!")
    end
end

Hier vuurt de kill-trigger af wanneer een monster sterft, en npc.get_race() bevestigt welk wezen is gedood.

De game-namespace: interactie met de wereld

De game-namespace omvat algemene bewerkingen op de spelwereld: meldingen tonen, event flags lezen en de speler teleporteren.

  • game.get_event_flag("naam") — leest een server-brede event flag (bijvoorbeeld of een evenement actief is).
  • game.set_event_flag("naam", waarde) — stelt de globale flags in die meestal via GM-commando's worden beheerd.
  • game.warp(x, y) en game.warp(x, y, kaart) — teleporteren.
  • game.drop_item(vnum, aantal) — laat een item op de grond vallen.
when 9003.chat."Is er een evenement?" begin
    if game.get_event_flag("jubilee") == 1 then
        say("Ja, het evenement is actief!")
    else
        say("Op dit moment geen evenement.")
    end
end

De item-namespace: werken aan het geselecteerde item

Wanneer op een item wordt geklikt, of het met item.select(vid) wordt geselecteerd, bindt de item-namespace zich aan dat item. Het is de basis van de upgrade-, socket- en attribuutsystemen.

  • item.get_vnum() en item.get_count() — de vnum en het aantal van het item.
  • item.get_name() — de naam van het item.
  • item.remove() — verwijdert het geselecteerde item.
  • item.get_socket(index) / item.set_socket(index, waarde) — sockets lezen/schrijven.
  • item.get_value(index) — leest de waardevelden van het item.
when 11209.use begin
    item.set_socket(0, 1)
    say("Item succesvol geactiveerd.")
end

Hier vuurt de use-trigger af wanneer het item wordt gebruikt, en item.set_socket werkt de eerste socket bij. Onthoud bij het werken met sockets dat de indexen bij 0 beginnen.

Hulpfuncties: say, select, wait

De helpers die de dialoogflow aansturen worden net zo vaak gebruikt als de namespaces. select("Optie 1", "Optie 2") toont de speler een menu en geeft het nummer van de gekozen optie terug. wait() pauzeert de dialoog en toont een "Volgende"-knop.

when 9003.chat."Maak een keuze" begin
    say("Welke beloning wil je?")
    local keuze = select("Zwaard", "Harnas", "Annuleren")
    if keuze == 1 then
        pc.give_item2(11209, 1)
    elseif keuze == 2 then
        pc.give_item2(11949, 1)
    end
end

Veelgestelde vragen

Wat is het verschil tussen pc.give_item en pc.give_item2?

pc.give_item2(vnum, aantal) is de standaardversie die vandaag wordt gebruikt en neemt een aantal-parameter. De oudere pc.give_item-signaturen kunnen een andere parameterindeling hebben; voor consistentie geven nieuwe quests de voorkeur aan pc.give_item2.

Waar worden quest-flags opgeslagen?

Speler-specifieke flags (pc.setqf) worden in de database bewaard samen met de spelstatus van het personage, zodat waarden zelfs na uit- en inloggen behouden blijven. Event flags daarentegen zijn server-breed en worden meestal door een GM beheerd.

Moet ik herstarten na het bewerken van een questbestand?

Meestal compileer je de quests (met de questcompiler) en herlaad je ze om de wijzigingen toe te passen. Veel servers hebben hiervoor een apart reload-mechanisme; anders moet de game core de quests opnieuw inlezen.

Vastgelopen op het questsysteem? Als je maatwerk-questketens, eventsystemen of debughulp nodig hebt voor je Metin2-server, neem contact op en we lossen het samen op.

Bu kategorideki tüm yazılar →

Devamı için