Un système metin2 level reward est une mécanique simple mais fidélisante qui remet automatiquement une récompense au joueur à chaque montée de niveau. En offrant aux débutants des potions et du yang aux premiers niveaux, puis des objets plus précieux aux niveaux élevés, il renforce le sentiment de progression. Le meilleur ? Pas besoin de compiler le code source du serveur. Tout se fait avec le langage de script quest de Metin2, en écrivant un seul fichier .quest. Dans cet article, nous construisons ce quest de zéro avec du code réel et fonctionnel.
La logique : capter l'événement levelup
Le moteur de quests de Metin2 est basé sur les événements. Celui dont nous avons besoin est when levelup : il se déclenche à l'instant où le joueur gagne un niveau. À l'intérieur, on lit le niveau actuel avec pc.get_level() et on décide quelle récompense accorder. Le seul point de vigilance est de ne pas donner deux fois la même récompense ; pour cela, on stocke la progression dans un quest flag.
pc.get_level()— renvoie le niveau actuel du joueur.pc.give_item2(vnum, count)— ajoute un objet à l'inventaire.pc.change_gold(montant)— modifie le yang (or) du joueur.pc.setqf("nom", valeur)/pc.getqf("nom")— écrit/lit un drapeau persistant propre à ce quest.
Un premier squelette fonctionnel
Le quest ci-dessous récompense le joueur une fois lorsqu'il atteint le niveau 10 et ne redonne jamais le même lot. Enregistre le fichier sous level_reward.quest dans le dossier share/locale/.../quest et ajoute-le à la liste des quests.
quest level_reward begin
state start begin
when levelup begin
local level = pc.get_level()
-- récompense niveau 10, une seule fois
if level == 10 and pc.getqf("lv10") == 0 then
pc.give_item2(27003, 5) -- Potion de soin, vnum d'exemple
pc.change_gold(50000)
pc.setqf("lv10", 1)
syschat("Félicitations ! Vous avez reçu la récompense du niveau 10.")
end
end
end
end
Le 27003 ici n'est qu'un vnum d'exemple ; vérifie la vraie valeur dans ta propre table item_proto, car les numéros d'objets varient d'un serveur à l'autre.
Gérer plusieurs niveaux avec une seule table
Écrire un bloc if distinct pour chaque niveau devient vite confus. Stocke plutôt les récompenses dans une table (Lua) et utilise le niveau comme clé. Ajouter une nouvelle récompense ne tient alors qu'en une ligne.
quest level_reward begin
state start begin
when levelup begin
local level = pc.get_level()
-- niveau = { item_vnum, quantité, 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("Récompense du niveau %d ajoutée à votre inventaire !", level))
end
end
end
end
L'approche par table a deux avantages : tu gères la liste des récompenses depuis un seul endroit, et comme pc.getqf("lv" .. level) donne à chaque niveau son propre drapeau, aucun risque de double attribution. Pour parer à un inventaire plein, tu peux ajouter une vérification avec pc.count_item(vnum) ou rediriger la récompense vers la boîte aux lettres.
Éviter la perte d'objet quand l'inventaire est plein
Un appel à give_item2 laisse tomber ou perd l'objet en silence s'il n'y a pas de place dans l'inventaire. Aux premiers niveaux c'est mineur, mais sur des récompenses précieuses cela frustre les joueurs. Une protection simple consiste à vérifier l'espace libre et à prévenir le joueur s'il n'y en a pas.
local function safe_give(vnum, count)
if pc.get_empty_inventory_count() < 1 then
syschat("Votre inventaire est plein ! Faites de la place et réessayez.")
return false
end
pc.give_item2(vnum, count)
return true
end
Dans des solutions plus robustes, tu envoies la récompense directement dans la boîte aux lettres du joueur, ainsi elle n'est pas perdue même si le joueur est hors ligne ou son inventaire plein. C'est la méthode privilégiée pour les systèmes de récompenses d'événements persistants.
Tester et recharger
Après avoir enregistré le quest, il faut le compiler et l'appliquer en jeu. Dans la plupart des builds de serveur, on exécute une étape make ou un qc (compilateur de quests) basé sur script pour reconstruire les quests, puis on redémarre le cœur du jeu ou on recharge les quests. Pour tester, donne des niveaux à un personnage par commande et vérifie que l'événement se déclenche, que les drapeaux s'écrivent correctement et que la récompense arrive.
- Essaie avec un personnage neuf pour que les drapeaux soient propres.
- Confirme qu'atteindre à nouveau le même niveau (par exemple après un reset) ne redonne pas la récompense.
- Observe le comportement de la récompense quand l'inventaire est plein.
Questions fréquentes
L'événement levelup se déclenche-t-il à chaque niveau ?
Oui, le bloc when levelup s'exécute chaque fois que le joueur gagne un niveau. Pour les joueurs qui sautent plusieurs niveaux d'un coup, il se déclenche séparément pour chaque gain, c'est pourquoi le contrôle par table est sûr.
Où trouver les vnum des objets ?
Tu peux les consulter dans la table item_proto du serveur ou dans le fichier item_names.txt. Comme les vnum peuvent différer sur chaque serveur, n'utilise pas directement les numéros d'exemple de cet article — vérifie-les dans ta propre base de données.
Vaut-il mieux envoyer la récompense par courrier ?
Pour les récompenses précieuses ou d'événement, oui. Le courrier garantit que la récompense n'est pas perdue même si l'inventaire est plein ou le joueur hors ligne ; pour de simples potions/or, la remettre directement dans l'inventaire suffit.
Tu veux un système de récompenses ou d'événement sur mesure pour ton serveur ? Si tu as besoin d'aide pour le développement de quests et de systèmes Metin2, contacte-moi — construisons ensemble des mécaniques qui gardent tes joueurs en jeu.