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()enpc.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)engame.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()enitem.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.