aslain.dev
0%
← Tüm makaleler

Le système de quêtes Metin2 : écrire des quêtes en Lua de zéro

Ce qui maintient un serveur Metin2 en vie, ce ne sont pas ses cartes, ce sont les quêtes. Apprendre la création de quêtes Metin2, c'est apprendre le cœur du système qui dit aux joueurs quoi faire, les récompense et fait avancer l'histoire. Bonne nouvelle : le système de quêtes de Metin2 est un mini-langage basé sur Lua, étonnamment facile à apprendre. Dans ce guide, j'écris une quête de zéro avec la structure que j'utilise sur mon serveur, Runa2.

Comment fonctionne un fichier de quête ?

Chaque quête repose sur trois blocs principaux, et chaque begin doit avoir un end :

  • quest — la quête elle-même (un nom unique).
  • state — l'étape de la quête. start est toujours l'étape de départ ; on passe aux autres avec set_state().
  • when — un déclencheur d'événement comme login, levelup, kill, ou un PNJ .click / .chat.

L'ordre d'imbrication est toujours quest → state → when.

Votre première quête : parler à un PNJ et obtenir une récompense

L'exemple ci-dessous est une quête complète, donnée en cliquant sur un PNJ, qui demande confirmation au joueur et accorde un objet, de l'expérience et de l'or une fois terminée :

quest welcome begin
    state start begin
        when 20095.chat."Start the quest" begin
            say_title("Villager:")
            say("Welcome, adventurer!")
            say("Will you help me?")
            local answer = select("Sure", "Not now")
            if answer == 2 then
                return
            end
            pc.setqf("welcome_step", 1)
            set_state(active)
        end
    end

    state active begin
        when 20095.chat."Finish the quest" begin
            if pc.getqf("welcome_step") == 1 then
                say("Thank you! Here is your reward.")
                pc.give_item2(27003, 5)   -- example item vnum
                pc.give_exp2(10000)
                pc.change_gold(50000)
                set_state(done)
            end
        end
    end

    state done begin
        when 20095.chat."Finish the quest" begin
            say("You have already finished this quest.")
        end
    end
end

Quelques détails : le texte entre guillemets "Start the quest" est l'option de menu affichée au joueur — écrivez-le dans votre langue. select() renvoie l'indice de l'option choisie (1, 2…). pc.give_item2(vnum, quantité) donne un objet ; 27003 n'est qu'un vnum d'exemple.

Les flags de quête : enregistrer la progression

On enregistre l'étape d'une quête avec des flags de quête. pc.setqf("nom", valeur) écrit un flag et pc.getqf("nom") le lit. Ces flags sont propres à chaque joueur et persistants. Par exemple, une quête « tuer 10 loups » :

when 101.kill begin
    local count = pc.getqf("wolf_count") + 1
    pc.setqf("wolf_count", count)
    if count >= 10 then
        say("You killed 10 wolves!")
        pc.give_exp2(50000)
        set_state(done)
    end
end

Ici, 101 est le vnum du loup. Chaque mise à mort incrémente le compteur ; à 10, la récompense est donnée et la quête passe à l'étape done.

Déclencheurs courants

  • when login begin — à la connexion du joueur.
  • when levelup begin — à la montée de niveau (lisez le niveau avec pc.get_level()).
  • when <vnum>.kill begin — quand un monstre précis est tué.
  • when <vnum>.click / .chat."Texte" — au clic sur un PNJ ou à l'ouverture d'un menu.

Compiler et déployer la quête

Votre fichier .quest ne s'exécute pas directement ; il doit d'abord être compilé avec le compilateur qc. Le flux typique : placez le fichier dans le dossier quest du serveur, ajoutez-le à la liste des quêtes et compilez (généralement make appelle qc). Puis rechargez en jeu avec /reload q ou redémarrez le cœur. En cas d'erreur de syntaxe, qc indique le numéro de ligne — compiler après chaque petite modification est donc une bonne habitude.

Conseils de débogage

  • Ajoutez des lignes temporaires say("arrivé ici") pour suivre le flux.
  • S'il manque un end, qc vous avertit à la compilation ; indentez vos blocs imbriqués pour vous y retrouver.
  • Gardez des noms de flags uniques ; réutiliser le même nom entre quêtes casse la progression.

Questions fréquentes

Faut-il connaître Lua pour écrire des quêtes ?

Pas besoin d'être un expert Lua. Connaître les bases — if, variables et appels de fonction — combiné aux fonctions intégrées du système (say, select, pc.give_item2…) suffit largement.

Dois-je arrêter le serveur pour modifier une quête ?

Non. Le plus souvent, vous compilez avec qc et rechargez instantanément avec la commande en jeu /reload q.

Combien d'états une quête peut-elle avoir ?

Pas de limite pratique. Les quêtes simples se terminent en 2–3 états ; pour de longues chaînes, ajoutez autant d'étapes que nécessaire.

Vous voulez un système de quêtes sur mesure ? Du battle pass aux quêtes journalières, je peux créer des systèmes de quêtes en Lua — contactez-moi.

Devamı için