Jump to content
×
×
  • Create New...

[PNJ] Monter ses compétences (~PA)


Craven
 Share

Recommended Posts

Centre de Téléchargement

Hidden Content

    Give reaction to this post to see the hidden content.
( Interne )

Bonjour à toutes et à tous !

 

une quête similaire aux pierres d'âme, sauf que ce qu'il veut, c'est passer les skill M1 en G1 directement via un PNJ en ayant un item définie dans son inventaire, je vous partage donc la quête en question en vous expliquant quelques trucs au cas où vous voudrez l'adapter pour par exemple, passer un skill qui a 1 point en G1, ou n'importe quoi d'autre !

 

Bref, pour commencer il faut ajouter une fonction à votre questlib.lua:

function BuildSkillMasterList(job, group)
   local skill_vnum_list = {}
   local skill_name_list = {}

   if pc.get_skill_group() != 0 then
       local skill_list = special.active_skill_list[job+1][group]
               
       table.foreachi( skill_list,
           function(i, t)
               local lev = pc.get_skill_level(t)

               if lev == 20 then
                   local name = locale.GM_SKILL_NAME_DICT[t]

                   if name != nil then
                       table.insert(skill_vnum_list, t)
                       table.insert(skill_name_list, name)
                   end
               end
           end
       )
   end

   table.insert(skill_vnum_list, 0)
   table.insert(skill_name_list, locale.cancel)

   return { skill_vnum_list, skill_name_list }
end
 

On déclare maintenant cette fonctionne dans "quest_functions" en y ajoutant ceci:

BuildSkillMasterList
 

Cette fonction est utilisée pour faire la liste des skills, vous choisissez vous-même via cette fonction la valeur que dois avoir les skills pour figurer dans la liste. Pour ce faire, ça se passe avec ça:

if lev == 20 then
Avec ce if, les skills de la personne ayant un UP égal à 20 (donc qui s'affiche en M1 en jeu) seront alors affichés dans la liste des skills, les autres skills seront ignorés. Si vous voulez adapter la quête pour par exemple, que ça affiche les skills en M5, écrivez:
if lev == 25 then
 

Les skills en M5 seront maintenant affichés !

Passons à la quête:

quest pnj_training_grandmaster_skill begin
   state start begin
   when 20086.chat."Skill M1" with pc.count_item(30062) == 1 and pc.get_level() > 21 begin ---Modifie toutes ces données.
       say_title("Soulstone")

       if pc.get_skill_group() == 0 then
       say("Vous n'avez aucun pouvoir. "..pc.get_skill_group())
       return
       end

       if get_time() < pc.getqf("next_time") then -- and not is_test_server() then
       if pc.is_skill_book_no_delay() then
           say("Vous pouvez mettre vos skill en G1.")
           say("")
           wait()
           say_title("Soulstone")
       else
           say("Vous devez attendre.")
           return
       end
       end

       local result = BuildSkillMasterList(pc.get_job(), pc.get_skill_group())

       local vnum_list = result[1]
       local name_list = result[2]

       if table.getn(vnum_list) == 1 then
       say("Vous n'avez aucun pouvoir en M1")
       say("pouvant être upgrade en G1.")
       return
       end

       say("Choisissez votre pouvoir.")
       say("")

       local menu_list = {}
       table.foreach(name_list, function(i, name) table.insert(menu_list, name) end)
       table.insert(menu_list, "Quitter") 

       local s=select_table(menu_list)
       if table.getn(menu_list) == s then
       return
       end

       local skill_name=name_list[s]
       local skill_vnum=vnum_list[s]
       local skill_level = pc.get_skill_level(skill_vnum)
       local cur_alignment = pc.get_real_alignment()
       local need_alignment = 5+5*(skill_level-20) ---Points de grade nécessaires

       test_chat("Vos points de grade:"..cur_alignment)
       test_chat("Points de grade nécessaires:"..need_alignment)

       local title=string.format("%s maitre", skill_name, skill_level-20+1)

       say_title(title)
       say("Quand vous passez vos pouvoirs en G, ")
       say("vous perdez des points de grade !")
       say("")

       if cur_alignment<-19000+need_alignment then ---points de grade minimum pour pouvoir upgrade
       say_reward("Pas assez de points de grade.")
       return
       end

       if cur_alignment<0 then
       say_reward(string.format("Points de grade nécessaires: %d", need_alignment, need_alignment*2))
       need_alignment=need_alignment*2
       elseif cur_alignment        say_reward(string.format("Points de grade nécessaires:: %d", need_alignment))
       say_reward("Pas assez de points de grade.")
       else
       say_reward(string.format("Points de grade nécessaires: %d", need_alignment))
       end
       say("")

       local s=select("OK", "Quitter")    
       if s==2 then
       return
       end


       if cur_alignment>=0 and cur_alignment        say_title(string.format("%s ½T©w", title))
       say("Vous pouvez passer vos pouvoirs en P !")
       say("Réecrivez cette phrase pour pouvoir")
       say("passer vos pouvoirs en P: ")
       say_reward("PouvoirsP")
       say("")
       say("")
       local s=input()
       if s!="PouvoirP" then
           return
       end
       end

       if get_time() < pc.getqf("next_time") then -- and not is_test_server() then
       if pc.is_skill_book_no_delay() then
           pc.remove_skill_book_no_delay()
       else
           say("Blah Blah Blah")
           return
       end
       end

       pc.setqf("next_time", get_time()+time_hour_to_sec(number(0, 0))) ----Temps d'attente avant la prochaine utilisation

if need_alignment>0 and pc.countitem(30062) > 0 then ----Modifie l'ID de l'item


       if pc.set_skill_level(skill_vnum,30) then
           pc.change_alignment(5) ---Au cas où l'upgrade rate, rajouter 5 points de grade à une personne


           say_title(string.format("%s ", title))
           if 30 == pc.get_skill_level(skill_vnum) then
           say(string.format("%s est déjà parfait", skill_name))
           else
           say(string.format("%s grown successfully", skill_name, skill_level-20+1+1))
           end
           say("")
           say_reward("successfully!")
           say_reward(string.format("Spent Host Killer Points: %d ", need_alignment))
           say("")
       else
           say_title(string.format("%s ", title))
           say("Votre pouvoir est maintenant en G !")
           say("")
           say("")
           pc.removeitem("30062", 1) ----Modifie l'ID de l'item supprimé
           pc.change_alignment(-number(need_alignment/1, need_alignment/1)) ----par défaut 3 et 2
       end
       end

       item.remove()
   end
   function BuildGrandMasterSkillList(job, group)
       GRAND_MASTER_SKILL_LEVEL = 20
       PERFECT_MASTER_SKILL_LEVEL = 30

       local skill_list = special.active_skill_list[job+1][group]
       local ret_vnum_list = {}
       local ret_name_list = {}

       -- test_chat(string.format("job=%d, group=%d", job, group))

       table.foreach(skill_list, 
       function(i, skill_vnum) 
       local skill_level = pc.get_skill_level(skill_vnum)

       -- test_chat(string.format("[%d]=%d", skill_vnum, skill_level))
       if skill_level >= GRAND_MASTER_SKILL_LEVEL and skill_level < PERFECT_MASTER_SKILL_LEVEL then

           table.insert(ret_vnum_list, skill_vnum)
           local name=locale.GM_SKILL_NAME_DICT[skill_vnum]
           if name == nil then name=skill_vnum end
           table.insert(ret_name_list, name)
       end
       end)
       return {ret_vnum_list, ret_name_list}


       --return {ret_vnum_list, ret_name_list}

   end
   end
end
Cette quête est celle des pierres d'âme en anglais et avec 100% de réussite, je n'ai donc traduis que ce qui nous était utile. J'ai adapté cette quête pour qu'elle up les skills de M1 à G1. Pour modifier ceci, vous devez  adapter tout ça en changeant les valeurs (à savoir 20 pour M1) par la valeur que vous avez écrit plus haut dans le if lev ==, c'est donc la valeur du skill que vous voulez upgrade. Editez donc ceci:
local need_alignment = 5+5*(skill_level-20)

 

local title=string.format("%s maitre", skill_name, skill_level-20+1)
say(string.format("%s grown successfully", skill_name, skill_level-20+1+1))
GRAND_MASTER_SKILL_LEVEL = 20

Tous ces "20" vous devez donc les éditer par la valeur du skill que vous voulez upgrade, si on reprend l'exemple du début, "20" deviendra "25".

Vous devez maintenant éditer la valeur du skill en quoi il va upgrade, dans notre quête c'est la valeur "30" pour G1.

 

Editez ceci:

if pc.set_skill_level(skill_vnum,30) then
if 30 == pc.get_skill_level(skill_vnum) then
PERFECT_MASTER_SKILL_LEVEL = 30

Remplacez ces "30" par la valeur du skill en quoi vous voulez qu'il soit upgrade. Par exemple, si vous voulez que votre skill devienne G5, la valeur doit devenir "35".

 

Maintenant si vous avez toutes ces modifications dans les exemples, en allant voir le PNJ il y aura d'affiché les skill en M5 (valeur "25" de la fonction dans le questlib), si vous validez le changement, votre skill sera upgrade en G5 (valeur "35"). Voilà pour l'upgrade des skills !

 

J'ai donné des info dans la quête en fin de lignes. Vous pouvez modifier le temps entre chaque possibilité d'utiliser le PNJ:

pc.setqf("next_time", get_time()+time_hour_to_sec(number(0, 0)))

Par défaut, à la place des "0" il y a "8" et "12", ce qui fait qu'une personne ayant upgrade un skill ne pourra plus en upgrade entre 8 et 12H.

Les pierres d'âme utilisent des points de grade à chaque utilisation, dans cette quête j'ai limité les points utilisés à "5", je ne préfère par mettre à 0 car j'ai eu un problème durant mes tests m'ayant mis 20 000 points de grade, je vous conseil de laisser comme dans la quête. Pour plus d'explications, lisez les indications dans la quête.

 

Je vais maintenant donner un exemple. On va dire qu'une personne ayant ses skills en M4 peut passer ses skill directement en P via un PNJ ayant comme ID "20086", en ayant l'item "30062" dans son inventaire et en étant lvl 21 ou +, voilà donc à quoi ça va ressemble:

 

Fonction du queslib:

function BuildSkillMasterList(job, group)
   local skill_vnum_list = {}
   local skill_name_list = {}

   if pc.get_skill_group() != 0 then
       local skill_list = special.active_skill_list[job+1][group]
               
       table.foreachi( skill_list,
           function(i, t)
               local lev = pc.get_skill_level(t)

               if lev == 24 then ---affiche les skills en M4
                   local name = locale.GM_SKILL_NAME_DICT[t]

                   if name != nil then
                       table.insert(skill_vnum_list, t)
                       table.insert(skill_name_list, name)
                   end
               end
           end
       )
   end

   table.insert(skill_vnum_list, 0)
   table.insert(skill_name_list, locale.cancel)

   return { skill_vnum_list, skill_name_list }
end

 

Quête:

quest pnj_training_grandmaster_skill begin
   state start begin
   when 20086.chat."Skill M1" with pc.count_item(30062) == 1 and pc.get_level() > 21 begin ---Modifie toutes ces données.
       say_title("Soulstone")

       if pc.get_skill_group() == 0 then
       say("Vous n'avez aucun pouvoir. "..pc.get_skill_group())
       return
       end

       if get_time() < pc.getqf("next_time") then -- and not is_test_server() then
       if pc.is_skill_book_no_delay() then
           say("Vous pouvez mettre vos skill en P.")
           say("")
           wait()
           say_title("Soulstone")
       else
           say("Vous devez attendre.") ---s'affiche si vous décidez de mettre un temps d'attente plus bas dans la quête
           return
       end
       end

       local result = BuildSkillMasterList(pc.get_job(), pc.get_skill_group())

       local vnum_list = result[1]
       local name_list = result[2]

       if table.getn(vnum_list) == 1 then
       say("Vous n'avez aucun pouvoir en M4") ---Utilise la fonction du questlib pour savoir si vous avez bien des skills ayant la valeur définie
       say("pouvant être upgrade en P.")
       return
       end

       say("Choisissez votre pouvoir.")
       say("")

       local menu_list = {}
       table.foreach(name_list, function(i, name) table.insert(menu_list, name) end)
       table.insert(menu_list, "Quitter") 

       local s=select_table(menu_list)
       if table.getn(menu_list) == s then
       return
       end

       local skill_name=name_list[s]
       local skill_vnum=vnum_list[s]
       local skill_level = pc.get_skill_level(skill_vnum)
       local cur_alignment = pc.get_real_alignment()
       local need_alignment = 5+5*(skill_level-24) ---Points de grade nécessaires

       test_chat("Vos points de grade:"..cur_alignment)
       test_chat("Points de grade nécessaires:"..need_alignment)

       local title=string.format("%s maitre", skill_name, skill_level-24+1)

       say_title(title)
       say("Quand vous passez vos pouvoirs en P, ")
       say("vous perdez des points de grade !")
       say("")

       if cur_alignment<-19000+need_alignment then ---points de grade minimum pour pouvoir upgrade
       say_reward("Pas assez de points de grade.")
       return
       end

       if cur_alignment<0 then
       say_reward(string.format("Points de grade nécessaires: %d", need_alignment, need_alignment*2))
       need_alignment=need_alignment*2
       elseif cur_alignment        say_reward(string.format("Points de grade nécessaires:: %d", need_alignment))
       say_reward("Pas assez de points de grade.")
       else
       say_reward(string.format("Points de grade nécessaires: %d", need_alignment))
       end
       say("")

       local s=select("OK", "Quitter")    
       if s==2 then
       return
       end


       if cur_alignment>=0 and cur_alignment        say_title(string.format("%s ½T©w", title))
       say("Vous pouvez passer vos pouvoirs en P !")
       say("Réecrivez cette phrase pour pouvoir")
       say("passer vos pouvoirs en P: ")
       say_reward("PouvoirsP")
       say("")
       say("")
       local s=input()
       if s!="PouvoirP" then
           return
       end
       end

       if get_time() < pc.getqf("next_time") then -- and not is_test_server() then
       if pc.is_skill_book_no_delay() then
           pc.remove_skill_book_no_delay()
       else
           say("Blah Blah Blah")
           return
       end
       end

       pc.setqf("next_time", get_time()+time_hour_to_sec(number(0, 0))) ----Temps d'attente avant la prochaine utilisation

if need_alignment>0 and pc.countitem(30062) > 0 then ----Modifie l'ID de l'item


       if pc.set_skill_level(skill_vnum,40) then
           pc.change_alignment(5) ---Au cas où l'upgrade rate, rajouter 5 points de grade à une personne


           say_title(string.format("%s ", title))
           if 30 == pc.get_skill_level(skill_vnum) then
           say(string.format("%s est déjà parfait", skill_name))
           else
           say(string.format("%s grown successfully", skill_name, skill_level-24+1+1))
           end
           say("")
           say_reward("successfully!")
           say_reward(string.format("Spent Host Killer Points: %d ", need_alignment))
           say("")
       else
           say_title(string.format("%s ", title))
           say("Votre pouvoir est maintenant en P !")
           say("")
           say("")
           pc.removeitem("30062", 1) ----Modifie l'ID de l'item supprimé
           pc.change_alignment(-number(need_alignment/1, need_alignment/1)) ----par défaut 3 et 2
       end
       end

       item.remove()
   end
   function BuildGrandMasterSkillList(job, group)
       GRAND_MASTER_SKILL_LEVEL = 24
       PERFECT_MASTER_SKILL_LEVEL = 40

       local skill_list = special.active_skill_list[job+1][group]
       local ret_vnum_list = {}
       local ret_name_list = {}

       -- test_chat(string.format("job=%d, group=%d", job, group))

       table.foreach(skill_list, 
       function(i, skill_vnum) 
       local skill_level = pc.get_skill_level(skill_vnum)

       -- test_chat(string.format("[%d]=%d", skill_vnum, skill_level))
       if skill_level >= GRAND_MASTER_SKILL_LEVEL and skill_level < PERFECT_MASTER_SKILL_LEVEL then

           table.insert(ret_vnum_list, skill_vnum)
           local name=locale.GM_SKILL_NAME_DICT[skill_vnum]
           if name == nil then name=skill_vnum end
           table.insert(ret_name_list, name)
       end
       end)
       return {ret_vnum_list, ret_name_list}


       --return {ret_vnum_list, ret_name_list}

   end
   end
end

(J'espère n'avoir fait aucune faute, j'ai fait les modifications directement via le forum, donc pas facile !)

 

Vous pouvez également faire ça sous forme de pallier ! Par exemple, une fois vos skills M1, vous allez voir le PNJ qui vous UP les skills en G1. Une fois un certain lvl atteint, vous pouvez passer vos skills G1 en P via un second PNJ. Pour ça il faut implanter 2 fois la quête et 2 fois la fonction. C'est très simple ! vous reprenez ce que j'ai écris au dessus pour l'upgrade des skills (en modifiant la quête) ainsi que l'affichage des skills dans la liste (via la fonction dans le questlib) sauf que vous devez ajouter cette même fonction plus haut en changeant le nom. Faites un copier/coller de la fonction au début du topic puis changez:

 

function BuildSkillMasterList(job, group)

en:

function BuildSkillGrandMasterList(job, group)

Puis vous modifiez if lev == 20 then en if lev == 30 then

Dans le cas où vous voudriez que ce soit les skills G1 qui soient affichés.

 

Déclarez cette fonction dans votre quest_functions:

BuildSkillGrandMasterList

Maintenant allez dans la quête puis cherchez "BuildSkillMasterList". C'est donc la première fonction qui sert à afficher les skill M1 (si on suit toujours notre exemple) puis dans la seconde quête modifiant la en:

BuildSkillGrandMasterList

 

Modifiez l'ID du PNJ etc, maintenant vous pouvez upgrade vos skill de M1 à G1 via un PNJ puis de G1 à P via un second PNJ.

A vous de laisser votre imagination trouver des choses intéressantes à faire avec ça !

 

Ce topic est assez long, j'ai donc mis des spoiler. D'un côté si quelqu'un voit tout écrit sans que ce soit trié, ça va le décourager et vite partir d'ici !

 

Enfin bref, j'espère que ce topic vous servira, bonne chance à vous avec cette quête qui m'aura mis aux environs de 3H pour bien la comprendre 

  • J'adore 1
Link to comment
Share on other sites

  • Replies 2
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Totalement inutile pour moi dommage, tutoriel expliqué énormément bien, tu vas sûrement faire des heureux, j'ose pas imaginer le temps passer dessus ^^ En tout cas un point de réputation pour un tutoriel si bien expliqué bravo.

 

(Je crois que tout le monde à déjà la function à vérifier.)

Link to comment
Share on other sites

 Share



  • Flux d'Activité

    1. 0

      Projet Genesis

    2. 4

      Shiva.international serveur privé metin2 Oldschool Start 16.09.2022

    3. 0

      Metin2 Champions - Accès anticipé

    4. 0

      Barbok

    5. 4

      Shiva.international serveur privé metin2 Oldschool Start 16.09.2022

    6. 2

      Partage Émulateur 2.63

    7. 2

      Partage Émulateur 2.63

  • Recently Browsing

    • No registered users viewing this page.

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.