Een metin2 level reward systeem is een kleine maar bindende mechaniek die de speler automatisch een beloning geeft telkens als hij een level stijgt. Door nieuwkomers op de eerste levels potions en yang te geven, en op hogere levels waardevollere items, versterkt het het gevoel van vooruitgang. Het mooiste: je hoeft hiervoor de serverbron (source) niet te compileren. Je kunt alles met de quest scripttaal van Metin2 doen, door één enkel .quest-bestand te schrijven. In dit artikel bouwen we die quest vanaf nul met echte, werkende code.
De logica: het levelup-event opvangen
De quest-engine van Metin2 is event-gebaseerd. Het event dat we nodig hebben is when levelup: het wordt geactiveerd op het moment dat een speler een level wint. Daarin lezen we het huidige level met pc.get_level() en beslissen we welke beloning we geven. Het enige aandachtspunt is dezelfde beloning niet twee keer geven; daarvoor slaan we de voortgang op in een quest flag.
pc.get_level()— geeft het huidige level van de speler terug.pc.give_item2(vnum, count)— voegt een item toe aan de inventaris.pc.change_gold(bedrag)— wijzigt de yang (goud) van de speler.pc.setqf("naam", waarde)/pc.getqf("naam")— schrijft/leest een blijvende vlag die bij deze quest hoort.
Een eerste werkend skelet
De onderstaande quest beloont de speler één keer wanneer hij level 10 bereikt en geeft dezelfde prijs nooit opnieuw. Sla het bestand op als level_reward.quest in de map share/locale/.../quest en voeg het toe aan de questlijst.
quest level_reward begin
state start begin
when levelup begin
local level = pc.get_level()
-- level 10 beloning, slechts één keer
if level == 10 and pc.getqf("lv10") == 0 then
pc.give_item2(27003, 5) -- Healing Potion, voorbeeld-vnum
pc.change_gold(50000)
pc.setqf("lv10", 1)
syschat("Gefeliciteerd! Je hebt de level 10-beloning ontvangen.")
end
end
end
end
De 27003 hier is slechts een voorbeeld-vnum; controleer de echte waarde in je eigen item_proto-tabel, want itemnummers verschillen per server.
Meerdere levels beheren met één tabel
Voor elk level een apart if-blok schrijven wordt snel rommelig. Houd de beloningen in plaats daarvan in een (Lua-)tabel en gebruik het level als sleutel. Een nieuwe beloning toevoegen is dan één regel.
quest level_reward begin
state start begin
when levelup begin
local level = pc.get_level()
-- level = { item_vnum, aantal, yang }
local rewards = {
[10] = { 27003, 5, 50000 },
[20] = { 27005, 5, 100000 },
[30] = { 50300, 1, 200000 },
[40] = { 50300, 2, 400000 },
}
local r = rewards[level]
if r and pc.getqf("lv" .. level) == 0 then
pc.give_item2(r[1], r[2])
pc.change_gold(r[3])
pc.setqf("lv" .. level, 1)
syschat(string.format("Beloning voor level %d aan je inventaris toegevoegd!", level))
end
end
end
end
De tabelaanpak heeft twee voordelen: je beheert de beloningslijst vanaf één plek, en omdat pc.getqf("lv" .. level) elk level zijn eigen vlag geeft, is er geen risico op dubbel uitkeren. Tegen een volle inventaris kun je een controle met pc.count_item(vnum) toevoegen of de beloning naar de mailbox sturen.
Itemverlies voorkomen bij een volle inventaris
Een aanroep van give_item2 laat het item stil vallen of verliest het als er geen plek is in de inventaris. Op lage levels is dat klein, maar bij waardevolle beloningen frustreert het spelers. Een eenvoudige bescherming is controleren of er vrije ruimte is en de speler waarschuwen als die er niet is.
local function safe_give(vnum, count)
if pc.get_empty_inventory_count() < 1 then
syschat("Je inventaris is vol! Maak ruimte vrij en probeer opnieuw.")
return false
end
pc.give_item2(vnum, count)
return true
end
In robuustere oplossingen stuur je de beloning rechtstreeks naar de mailbox van de speler, zodat ze niet verloren gaat, zelfs als de speler offline is of zijn inventaris vol is. Dit is de voorkeursmethode voor blijvende event-beloningssystemen.
Testen en herladen
Nadat je de quest hebt opgeslagen, moet je hem compileren en in het spel toepassen. In de meeste serverbuilds draai je een make- of een script-gebaseerde qc (quest compiler)-stap om de quests opnieuw te bouwen, en herstart je daarna de game-core of herlaad je de quests. Geef om te testen een personage via een commando levels en controleer of het event afgaat, de vlaggen correct worden geschreven en de beloning aankomt.
- Probeer met een nieuw personage zodat de vlaggen schoon zijn.
- Bevestig dat hetzelfde level opnieuw bereiken (bijvoorbeeld na een reset) de beloning niet opnieuw uitkeert.
- Observeer het gedrag van de beloning wanneer de inventaris vol is.
Veelgestelde vragen
Gaat het levelup-event bij elk level af?
Ja, het when levelup-blok draait telkens als de speler een level wint. Voor spelers die meerdere levels tegelijk springen, gaat het apart af voor elke winst, en daarom is de tabelgebaseerde controle veilig.
Waar vind ik de item-vnums?
Je kunt ze opzoeken in de item_proto-tabel van de server of in het bestand item_names.txt. Omdat vnums per server kunnen verschillen, gebruik de voorbeeldnummers uit dit artikel niet rechtstreeks — controleer ze tegen je eigen database.
Is de beloning per post sturen beter?
Voor waardevolle of event-beloningen, ja. Post zorgt dat de beloning niet verloren gaat, zelfs als de inventaris vol is of de speler offline; voor eenvoudige potion/goud-beloningen volstaat het ze direct in de inventaris te geven.
Wil je een op maat gemaakt beloning- of event-systeem voor je server? Heb je hulp nodig bij Metin2 quest- en systeemontwikkeling, neem dan contact met me op — laten we samen mechanieken bouwen die je spelers in het spel houden.