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

Fonctions de quête Metin2 : les plus utilisées

Les fonctions de quête Metin2 sont les outils fondamentaux qui font tourner tout le système de quêtes, écrit en Lua côté serveur. Parler à un PNJ, distribuer des objets, lire le niveau d'un joueur ou le téléporter d'une carte à l'autre : presque chaque action que tu écris est une combinaison de ces fonctions. Dans cet article, je détaille les commandes que tu rencontreras le plus souvent, regroupées par namespace pc, npc, game et item, avec des exemples qui fonctionnent.

Le squelette d'une quête

Avant les fonctions, il est utile de rappeler la forme générale d'une quête. Chaque quête contient un state, et chaque state se branche sur des événements déclencheurs (when). Le déclencheur le plus courant est l'ouverture d'un dialogue avec un PNJ.

quest salutation begin
    state start begin
        when 9003.chat."Bonjour l'ami" begin
            say_title("Villageois")
            say("Bienvenue, voyageur !")
            say("")
            say("J'ai une tâche pour toi.")
        end
    end
end

Ici 9003 est le vnum du PNJ, say_title définit le titre de la fenêtre de dialogue, et say affiche une ligne de texte. Un say("") vide sert à laisser une ligne blanche entre les paragraphes.

Le namespace pc : lire et modifier le joueur

Tout ce qui concerne le joueur passe par le namespace pc. Les fonctions de quête Metin2 les plus utilisées se trouvent justement ici. Quelques exemples :

  • pc.get_level() — renvoie le niveau du joueur.
  • pc.get_name() — donne le nom du personnage.
  • pc.get_money() et pc.change_money(montant) — lire les yangs et en ajouter/retirer.
  • pc.give_item2(vnum, quantité) — ajoute un objet à l'inventaire.
  • pc.count_item(vnum) / pc.remove_item(vnum, quantité) — compter et supprimer des objets.
  • pc.give_exp2(montant) — accorde des points d'expérience.
  • pc.warp(x, y) — téléporte le joueur vers une coordonnée.

Un flux de récompense typique ressemble à ceci :

when 9003.chat."J'ai terminé la tâche" 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("Merci ! Prends ta récompense.")
    else
        say("Tu n'en as pas encore apporté 5.")
    end
end

La condition est vérifiée avec pc.count_item, puis pc.remove_item consomme les matériaux et l'objet, l'expérience et les yangs sont attribués.

Les flags de quête : pc.setqf et pc.getqf

Pour enregistrer durablement la progression d'une quête, on utilise un flag de quête. pc.setqf("clé", valeur) sauvegarde une valeur et pc.getqf("clé") la lit, ce qui permet de retenir à quelle étape de la quête se trouve le joueur.

when 9003.chat."Commencer la quête" begin
    if pc.getqf("etape") == 0 then
        pc.setqf("etape", 1)
        say("Quête commencée. Chasse 10 loups.")
    elseif pc.getqf("etape") == 1 then
        say("Tu chasses encore les loups.")
    end
end

Les flags sont propres à chaque joueur et stockés en base de données : les valeurs survivent donc à une déconnexion puis reconnexion. Dans les chaînes de quêtes complexes, ils servent aussi de compteurs (par exemple à chaque kill : pc.setqf("compteur", pc.getqf("compteur") + 1)).

Le namespace npc : infos sur le PNJ avec qui tu parles

À l'intérieur d'un bloc chat, le namespace npc pointe vers le PNJ avec lequel tu interagis. Les plus courants :

  • npc.get_race() — renvoie le vnum/numéro de race du PNJ, idéal pour distinguer plusieurs PNJ dans une même quête.
  • npc.getqf / npc.setqf — flags propres au PNJ (pour des états par instance).
  • npc.purge() — retire le PNJ de la scène, généralement pour des PNJ temporaires apparus dynamiquement.
when 20354.kill begin
    if npc.get_race() == 20354 then
        pc.give_exp2(10000)
        say("Tu as détruit la pierre Metin !")
    end
end

Ici le déclencheur kill se lance à la mort d'un monstre, et npc.get_race() confirme quelle créature a été tuée.

Le namespace game : interagir avec le monde

Le namespace game couvre les opérations générales sur le monde du jeu : afficher des annonces, lire des event flags et téléporter le joueur.

  • game.get_event_flag("nom") — lit un event flag défini à l'échelle du serveur (par exemple si un événement est actif).
  • game.set_event_flag("nom", valeur) — définit les flags globaux gérés en général via les commandes GM.
  • game.warp(x, y) et game.warp(x, y, carte) — téléportation.
  • game.drop_item(vnum, quantité) — fait tomber un objet au sol.
when 9003.chat."Y a-t-il un événement ?" begin
    if game.get_event_flag("jubilee") == 1 then
        say("Oui, l'événement est actif !")
    else
        say("Aucun événement pour le moment.")
    end
end

Le namespace item : travailler sur l'objet sélectionné

Quand un objet est cliqué, ou sélectionné avec item.select(vid), le namespace item se lie à cet objet. C'est la base des systèmes d'amélioration, de sockets et d'attributs.

  • item.get_vnum() et item.get_count() — le vnum et la quantité de l'objet.
  • item.get_name() — le nom de l'objet.
  • item.remove() — supprime l'objet sélectionné.
  • item.get_socket(index) / item.set_socket(index, valeur) — lire/écrire les sockets.
  • item.get_value(index) — lit les champs de valeur de l'objet.
when 11209.use begin
    item.set_socket(0, 1)
    say("Objet activé avec succès.")
end

Ici le déclencheur use se lance quand l'objet est utilisé, et item.set_socket met à jour le premier socket. Avec les sockets, souviens-toi que les index commencent à 0.

Fonctions utilitaires : say, select, wait

Les utilitaires qui pilotent le flux de dialogue sont employés aussi souvent que les namespaces. select("Option 1", "Option 2") affiche un menu au joueur et renvoie le numéro de l'option choisie. wait() met le dialogue en pause et affiche un bouton « Suivant ».

when 9003.chat."Fais un choix" begin
    say("Quelle récompense veux-tu ?")
    local choix = select("Épée", "Armure", "Annuler")
    if choix == 1 then
        pc.give_item2(11209, 1)
    elseif choix == 2 then
        pc.give_item2(11949, 1)
    end
end

Questions fréquentes

Quelle est la différence entre pc.give_item et pc.give_item2 ?

pc.give_item2(vnum, quantité) est la version standard utilisée aujourd'hui et prend un paramètre de quantité. Les anciennes signatures pc.give_item peuvent avoir une disposition de paramètres différente ; pour la cohérence, les nouvelles quêtes préfèrent pc.give_item2.

Où sont stockés les flags de quête ?

Les flags propres au joueur (pc.setqf) sont conservés en base de données avec l'état de jeu du personnage : les valeurs persistent même après déconnexion et reconnexion. Les event flags, en revanche, sont globaux au serveur et généralement gérés par un GM.

Faut-il redémarrer après avoir modifié un fichier de quête ?

En général, tu compiles les quêtes (avec le compilateur de quêtes) et tu les recharges pour appliquer les changements. Beaucoup de serveurs disposent d'un mécanisme de reload dédié ; sinon, le game core doit relire les quêtes.

Bloqué sur le système de quêtes ? Si tu as besoin de chaînes de quêtes sur mesure, de systèmes d'événements ou d'aide au débogage pour ton serveur Metin2, contacte-moi et nous le résoudrons ensemble.

Bu kategorideki tüm yazılar →

Devamı için