Tuto 335 Création wow métier sur la récolte
#1
Bonjour à tous, aujourd'hui on va voir comment créer un métier de récolte type minage ou herboristerie, ça va être long et tendu mais la gloire et le prestige sont au bout du chemin ! 

Sommaire
  • Outils requis
  • Édit core (C++)
  • Édit DBC
  • Un peu de SQL

Outil requis

- My DbcEditor ET Spell Editor (pourquoi les deux ? Vous verrez)

- De quoi éditer les sources du core (Visual, Notepad++...) => Nécessite un core compilable et non un REPACK !!!

MPQ Editor

- Beaucoup, beaucoup de patience.

Allez on est partis !



Chirurgie corifique

Sans doute la partie la plus CHIANTE du tuto car nécessite une volée de modifications.

Tout d'abord on commence avec ScriptedGossip.h

Il faut trouver la ligne


Code :
TRADESKILL_INSCRIPTION = 15,


supprimer la virgule en fin de ligne, passer à la ligne suivante puis ajouter :


Code :
TRADESKILL_BUCHERON = 16,


Dans mon cas c'est un métier de bûcheron, si vous voulez mettre autre chose vous êtes libres de faire ce que vous voulez !

On enregistre et on ferme, on a terminé avec ce .h.

Passons ensuite à ItemPrototype.h

On cherche la ligne


Code :
ITEM_SUBCLASS_JEWELCRAFTING_RECIPE          = 10,


et on ajoute ensuite

Code :
ITEM_SUBCLASS_BUCHERON_RECIPE = 11

On pense aussi à faire un +1 sur la ligne suivante 


Code :
#define MAX_ITEM_SUBCLASS_RECIPE


En gros si c'est à 10 on met 11 etc...

Terminé pour ItemPrototype, on attaque le final boss des .h j'ai nommé SharedDefine.h

C'est le pire des fichiers, celui qui m'a demandé le plus de modifications avec mon équipe, et à chaque modif qu'on faisait on pouvait être sûrs d'en oublier une ensuite alors soyez vraiment attentifs, plus que jamais.

On commence par trouver ça :


Code :
QUEST_SORT_LOVE_IS_IN_THE_AIR = 376,


s'il n'y a pas de virgule en fin de ligne on l'ajoute puis on saute une ligne pour ajouter :


Code :
QUEST_SORT_BUCHERON = 377,

Ensuite on cherche


Code :
SKILL_PET_EXOTIC_SPIRIT_BEAST = 788,



et on ajoute à la suite


Code :
SKILL_BUCHERON = 800,

ET SURTOUT ! SURTOUT ! On est pas con comme moi qui a perdu deux jours avec ça, on édite bien :


Code :
#define MAX_SKILL_TYPE 789


en

Code :
#define MAX_SKILL_TYPE 801


Ensuite (après c'est fini) on cherche


Code :
LOCKTYPE_OPEN_FROM_VEHICLE = 21,

puis on ajoute à la suite


Code :
LOCKTYPE_BUCHERON = 30



Pourquoi un locktype ? Parce qu'en fait le minérai/arbre/autre dépend d'un locktype basé sur votre skill. En gros le skill est une clé et votre item à récolter un coffre, seulement si vous n'avez pas bien paramétré ça, ça ne marchera jamais pour récolter... (quand je vous dis que j'y ai passé un temps fou sur ce métier).

Pour fini on cherche


Code :
case LOCKTYPE_INSCRIPTION: return SKILL_INSCRIPTION;


et on ajoute en dessous :


Code :
case LOCKTYPE_BUCHERON: return SKILL_BUCHERON;



Presque terminé ! J'avais dit que SharedDefine.h est le dernier fichier à éditer mais c'est faux, tout n'est que mensonge, allez hop, on ouvre Player.cpp
On cherche :


Code :
{
       case SKILL_HERBALISM:
       case SKILL_LOCKPICKING:
       case SKILL_JEWELCRAFTING:
       case SKILL_INSCRIPTION:
           return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel+100, RedLevel+50, RedLevel+25)*Multiplicator, gathering_skill_gain);
       case SKILL_SKINNING:
           if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS) == 0)
               return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel+100, RedLevel+50, RedLevel+25)*Multiplicator, gathering_skill_gain);
           else
               return UpdateSkillPro(SkillId, (SkillGainChance(SkillValue, RedLevel+100, RedLevel+50, RedLevel+25)*Multiplicator) >> (SkillValue/sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS)), gathering_skill_gain);
       case SKILL_MINING:
           if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS) == 0)
               return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel+100, RedLevel+50, RedLevel+25)*Multiplicator, gathering_skill_gain);
           else
               return UpdateSkillPro(SkillId, (SkillGainChance(SkillValue, RedLevel+100, RedLevel+50, RedLevel+25)*Multiplicator) >> (SkillValue/sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS)), gathering_skill_gain);
}



(ouais c'est gros je sais) qu'on remplace TOTALEMENT par :


Code :
{
case SKILL_HERBALISM:
case SKILL_LOCKPICKING:
case SKILL_JEWELCRAFTING:
case SKILL_INSCRIPTION:
return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25)*Multiplicator, gathering_skill_gain);
case SKILL_SKINNING:
if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS) == 0)
return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25)*Multiplicator, gathering_skill_gain);
else
return UpdateSkillPro(SkillId, (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25)*Multiplicator) >> (SkillValue / sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS)), gathering_skill_gain);
case SKILL_MINING:
if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS) == 0)
return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25)*Multiplicator, gathering_skill_gain);
else
return UpdateSkillPro(SkillId, (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25)*Multiplicator) >> (SkillValue / sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS)), gathering_skill_gain);
case SKILL_BUCHERON:
return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25)*Multiplicator, gathering_skill_gain);
}

Et là, on a terminé avec le C++, sisi pour de vrai. 


Chirurgie DBCifique

Une autre partie peu amusante seulement j'ai proposé d'utiliser Spell Editor pour des raisons évidentes de FAINÉANTISE.

Cependant, on va utiliser MyDBCEDitor pour les premières DBCs basiques, en gros on aura besoin de Spell Editor que pour... Bah pour Spell.dbc en fait, dingue non ?

On commence facilement avec SkillLine.dbc

Moi je suis un faignant naturel, pour évoluer dans mon habitat je prends une ligne et je la duplique pour modifier le duplicata.

[Image: giphy.gif]


On enregistre et on ferme puis on passe à SkillRaceClassInfo.dbc qui n'est pas plus compliquée que le reste mais je vais prendre le temps de vous détailler un peu les différentes colonnes qui vont nous intéresser cette fois.
  • 1 - ID, unique.
  • 2 - ID de la compétence (ici 800)
  • 3 - Bitmask des races autorisées. 2047 pour toutes.
  • 4 - Bitmask des classes autorisées. 1535 pour toutes.
  • 5 - Flags
  • 6 - Niveau minimum pour cette compétence.


Ensuite d'autres petites DBC trop choupi pour avoir un métier PAR-FAIT.

Lock.dbc

Ici c'est con, on ajoute une ligne et on écrit ça :

Terminé. On peut passer à LockType.dbc

On prends une ligne et on en change un peu le contenu, c'est vraiment de la touchette à ce moment du tutorial, vous pouvez limite mettre vos enfants, petits frères/soeurs sur le travail en allant déguster une merveilleuse Sangria sous ce beau soleil d'été.


Ce qu'il fait avec ces DBCs est incroyable, les moddeurs le détestent, suivez en 10 étapes comment faire maigrir votre Ogre... Pardon. On attaque TotemCategory.dbc. En gros cette DBC nous permet de donner un nom à l'outil qu'on va utiliser pour récolter (pioche, pelle, godet, moissonneuse batteuse...)

On copie, on duplique, on colle, je devrais en faire une chanson...


En gros quand vous allez miner ça vous dira "requiert Hache de bûcheron" vous voyez le délire ? Par contre chaque item que vous voudrez utiliser pour récolter devra hériter de cet ID de totem (c'est du SQL j'vous montre plus tard)

On va passer à Spell.dbc. Cependant, je ne fournirai pas de tuto sur la création d'une recette pour le métier ici parce que je suis trop méchant. J'ai posté un tutorial sur comment créer une recette avec world Editor, si cela ne vous suffit pas il suffit de faire comme on fait d'habitude, on prend une ligne, on duplique, on édite. C'est chouette non ? Cependant, en bonus je vous donnerai une explication de la DBC à retoucher pour que vos recettes fonctionnent, j'suis qu'une moitié de méchant du coup.

Et cette fois, on sort le Spell Editor, la grosse Bertha comme on dit dans l'métier. L'intérêt de ce soft c'est qu'il va nous afficher tout le contenu dans des cases claires, ça veut dire qu'on aura pas de temps à perdre sur les 100000000000 colonnes de Spell.dbc, on édite le strict minimum et let's go McFly, to the future !

Mais si on fait pas de recette, à quoi va servir Spell.DBC ? C'est une bonne question Raymond, et bien simplement à créer les grades du métier

Sont y pas beaux ? La question c'est pourquoi on a deux fois chaque spell, exemple, pourquoi on a le 80009 et le 80010 avec la même icone ? (oui ça a son importance dans mon classement) => en fait c'est simple, l'un des spells est celui qui vous permet de couper l'arbre (le 80009) et l'autre est celui qui sera affiché dans la fenêtre du maitre de profession (80010), c'est aussi celui-ci qui servira en condition "requiert machin pour apprendre truc"

En gros chez nous ça donne => minage/apprenti mineur. Donc on va aller prendre les deux spells et modifier EXACTEMENT chaque zone rouge que je vous montrerai dans les screens qui vont suivre. N'oubliez pas de bien paramétrer Spell Editor si ce n'est pas déjà fait, ça mange pas de pain.

Le fait de créer un nouveau spell va vous demander si vous souhaitez copier les données d'un autre vers une nouvelle ligne, bonjour le gain de temps !
On prends donc le premier spell apprenti mineur (2581) qui comme vous le verrez nous enseigne le spell 2575 (minage (apprenti)), pour chaque grade vous devrez refaire le même process d'utiliser deux spells à chaque fois, voici les modifications à apporter d'abord sur le 2581 puis sur le 2575.

D'abord on crée un nouveau spell en cliquant sur New Spell dans la barre bleue en haut à droite.

Le nouveau spell est crée c'est parti.

Le seul truc à déplorer c'est que Spell Editor ait quelques difficultés à lire certaines DBCs FR c'est pour cela que je vous invite à ne pas toucher aux DBCs présentes dans le dossier du soft sauf Spell.dbc si vous avez déjà des spells custom et que vous voulez pas vous prendre la tête [Image: smile.png]

Pour le reste, je pense notamment à TotemCategory.dbc veillez à ajouter sur la DBC du soft la même ligne que celle de votre DBC FR et ça passera crème.


Et l’icône si vous voulez la changer le menu semble être assez évident hein ?

Attardons nous d'abord un peu sur tout cela.



Terminé pour ce spell si vous ne touchez pas à l’icône. On clique sur save spell change en haut à droite et on refait un nouveau spell basé cette fois sur le 2575. Je vous repasse la création de spell vous avez compris comment elle marche.



A refaire pour tout les grades du métier, apprenti, compagnon, expert, artisan, maitre, grand maitre...

Histoire de vous aider un je vous liste les IDs utiles :

- Apprenti : 2581/2575
- Compagnon : 2582/2576
- Expert : 3568/3564
- Artisan : 10249/10248
- Maître : 29355/39354
- Grand Maître :  50309/50310

Les modifications seront toujours les mêmes donc vous voila tranquilles ! Dernière DBC à toucher ! ENFIN  ! SkillLineAbility.dbc

En gros c'est la DBC qui gère les chaines de spell et les recettes. Une chaine de spell c'est quand plusieurs spells se suivent dans une ligne, par exemple compagnon suit apprenti etc et c'est aussi cette DBC qui définit quand une recette passe de vert à gris et seulement ces deux là !
  • 1 - ID, unique.
  • 2 - Correspond à la compétence (SkillLine.dbc)
  • 3 - Correspond au sort concerné (Spell.dbc).
  • 4 & 5 - Toujours 0.
  • 6 & 7 - Vide.
  • 8 - Toujours 1.
  • 9 - Sort parent du sort en colonne 2.
  • 10 - 0x0 en général. 0x1 pour apprendre la recette en même temps que la compétence.
  • 11 - Niveau quand la recette devient grise.
  • 12 - niveau quand la recette devient verte.
  • 13 & 14 - Vide.

Dans l'exemple des métiers ça va nous donner :

Code :
25000,800,80000,0,0,,,1,80002,0x0,0,0,,,
25001,800,80002,0,0,,,1,80004,0x0,0,0,,,
25002,800,80004,0,0,,,1,80006,0x0,0,0,,,


Code :
Honteusement copié d'un autre tutoriel, l'essentiel c'est que vous compreniez où je veux en venir. A refaire pour chaque grade de profession.


Dans le cas d'une recette, on le fait à l'ancienne, on copie une ligne et on l'édite.
Et c'est terminé avec les DBCs !

Le SQL, le meilleur pour la fin.


En fait en SQL on a presque rien à faire. Sisi j'vous jure. Les restrictions pour apprendre tel ou tel spell, par exemple on peut dire qu'il faut que le spell 80000 soit requis pour apprendre le 80001 et bien on peut, il suffit (avec TrinityCore) d'ouvrir la table dans World required_spell et on ajoute ce qu'il faut dans les deux colonnes, à faire pour chaque grade, bien entendu.
Mais le maitre alors ? Voici un template complet pour votre maitre.


Code :
SET @ENTRY := VOTRE_ID;
SET @APPRENTI := SPELL_APPRENTI;
SET @COMPAGNON := SPELL_COMPAGNON;
SET @EXPERT := SPELL_EXPERT;
SET @ARTISAN := SPELL_ARTISAN;
SET @MAITRE := SPELL_MAITRE;
SET @GRAND_MAITRE := SPELL_GRAND_MAITRE;

INSERT INTO `npc_trainer` (entry, spell, spellcost, reqskill, reqskillvalue, reqlevel) VALUES

(@ENTRY, @APPRENTI, 100, 0, 0, 5),
(@ENTRY, @COMPAGNON, 475, 800, 50, 10),
(@ENTRY, @EXPERT, 4750, 800, 125, 10),
(@ENTRY, @ARTISAN, 47500, 800, 200, 25),
(@ENTRY, @MAITRE, 100000, 800, 275, 0),
(@ENTRY, @GRAND_MAITRE, 350000, 800, 350, 0);
SET @ENTRY := VOTRE_ID;
SET @APPRENTI := SPELL_APPRENTI;
SET @COMPAGNON := SPELL_COMPAGNON;
SET @EXPERT := SPELL_EXPERT;
SET @ARTISAN := SPELL_ARTISAN;
SET @MAITRE := SPELL_MAITRE;
SET @GRAND_MAITRE := SPELL_GRAND_MAITRE;

INSERT INTO `npc_trainer` (entry, spell, spellcost, reqskill, reqskillvalue, reqlevel) VALUES

(@ENTRY, @APPRENTI, 100, 0, 0, 5),
(@ENTRY, @COMPAGNON, 475, 800, 50, 10),
(@ENTRY, @EXPERT, 4750, 800, 125, 10),
(@ENTRY, @ARTISAN, 47500, 800, 200, 25),
(@ENTRY, @MAITRE, 100000, 800, 275, 0),
(@ENTRY, @GRAND_MAITRE, 350000, 800, 350, 0);

Tout est écrit, les prix, les niveaux requis, le niveau de compétence dans tel ou tel skill, tout est prêt, vous n'avez que les SET à éditer.

Pour ce qui est des GobJects je ne ferais pas d'annexe sur ce tuto ici étant donné que tout le monde ne va pas faire le même métier et qu'ajouter en plus une gestion de GameObjectDisplayInfo.dbc ferait de ce tuto quelque chose d'encore plus long. Pareil, pour créer un arbre ou autre, n'hésitez pas à reprendre le script SQL d'un filon et de l'éditer comme il faut.

Tutoriel terminé, ayez du fun et n'hésitez pas à demander si vous êtes perdus !
[Image: react_like.png]
Répondre
#2
Ho purée tu attaques fort toi ^^
Je sent que tu va faires des heureux , merci dokuro
Répondre
#3
Avec ma vitesse de connexion, je vais en avoir pour une semaine pour le telecharger et le lire. rha lala
Bon en attendant qu'il arrive, merci pour ce tutoriel bien complet, humour, technique et resultat profitable pour tous ... que du bonheur
Si tu avances, tu meurs ... si tu recules, tu meurs ... alors dis moi ... pourquoi tu recules?
(Proverbe mongol)
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)