01/10/2016, 08:25
Réparer des quetes avec Keira2 & SAI-Editor
( Premier survol d'un sujet complexe et varié)
Les outils nécessaires :
- Keira2
- SAI-Editor
- Le site http://fr.wowhead.com
- PHPMyAdmin ou équivalent
Intro
Faire un tuto pour réparer des quêtes c'est un peut comme vouloir aller ramasser des salades sur la lune en vélo ... c'est impossible ... parce qu'il y a énormément de types de bugs différents et pour chacun plusieurs façon de faire . Je vais donc effleurer le sujet sans trop rentrer dans les détails mais au final vous aurez cerné Keira2 et le concept pour réparer les quêtes . Sachez qu'il existe quand même un solution miracle qui s'adapte pratiquement a tout les cas , c'est le killcrédit 6d.Les bugs sur ces quêtes peuvent êtres en gros de 2 types différents : il manque une des donnée , elle est erroné ou bien toute la quête ou une de ces branches n'existe pas .
Pour réparer ces quêtes en général nous utiliserons Keira2 pour tout ce qui est définitions de la quête et SAI-Editor pour remplir ces conditions . Je vous inviterais avant de poursuivre a lire le tuto sur SAI-Editor , de l’expérimenter un peut bref de commencer a le comprendre .
Keira2 n'est pas un programme a proprement parler comme l’était Truice sous 335 mais un site qui peut être local ou en ligne . Il n’exécute pas non plus de sql crée par nos modifs directement dans la DB mais génère juste les lignes sql a copier/coller dans son PHPMyAdmin . Pour ne pas trop m’étendre et vous perdre , je ne parlerais ici principalement que de la partie quête de Keira2 .
Sachez toute fois qu'une fois ces lignes sql copier/coller dans votre PhpmyAdmin vous pourrez pour la plupart d’entre elles (mais pas toutes) les recharger dans le jeu sans avoir a relancer votre serveur par la commande .reload all .
Bon vous êtes prés ? on commence ?
J'en vois déjà un la bas au fond qui transpire ... mais non reviens tu verras ... c'est facile
J'en vois déjà un la bas au fond qui transpire ... mais non reviens tu verras ... c'est facile
Partie A - Mise en bouche : Présentation des différentes parties de Keira2 :
En cernant les diverses parties de Keira2 vous comprendrez par logique comment réparer les quêtes . Je reviendrais sur leur utilisations un peut plus bas par quelques type de quêtes .0) Lancement de Keira2 :
Vous trouverez dans la partie haute les boutons vers les divers sujets traités par Keira2 : Quetes , Mob, etc et dans la partie basse la partie concernant ce sujet qui s'adaptera a ce choix , par défaut il ce positionne sur la recherche mais chaque sujet a ces sous branches propres .
La partie quête de Keira2 est composé des branches Quest Part1 , Quest Part2 , Quest Part3 , etc
1) La branche Quest Part1 :
- 1 PrevQuestID & RewardNextQuest qui définissent dans une suite la quête précédente et suivante sont parfois un cas de bug parce que non renseignées . ExclusiveGroup sert a séparer cette suite lorsque l'on a le choix entre plusieurs quêtes mais que l'on ne pourra en faire qu'une . La valeur doit être la même pour toutes ces quêtes c'est a dire l'id d'une de ces quêtes .
- 2 Défini des conditions requises pour faire cette quete , level , zone temps limite , etc . Flag gère ci elle est répétable rendu automatiquement sans PNJ , etc
- 3 UN peut comme 2
- 4 Startitem désigne un item donné et nécessaire pour faire cette quête , ProvidedItemCount le nombre et SourceSpellID un spell lancé sur vous quand on accepte cette quête comme une aura pour phaser ou voir certains PNJ
- 5 Le blabla a proprement dit , celui qui s'affiche dans la fenêtre de jeu
2) La branche Quest Part2 :
- 6 Les emotes joués par le PNJ en prenant ou rendant la quête Point of interet
- 7 Lorsqu'une quêtes vous demandes de lui ramener des items mais l'on utilisera plutôt une autre possibilité dans Quest Part3
- 8 Les récompenses : items , réputation , titre , etc . RewardDisplaySpell & RewardSpell pour retiré une aura donné quand on a pris la quete (en 4) ou vous en mettre une autre en récompense .
3) La branche Quest Part3 : on passera vite sur cette partie , Je ni ai perso jamais touché .
- Défini les portraits qui s'affichent dans certaines quêtes ou l'audio qui sont joué . Je n'ai jamais touché a cette partie la.
4) La branche Quest Objectives : C'est assurément la partie la plus importantes dans le debug d'une quête , celle ou vous interviendrez le plus souvent . A ne pas négliger . Elle conditionne ce qui vous est demandé : tuer x mob , ramener x item , etc .
A coté de la colonne ID vous avez un icon qui permet de sélectionner la ligne et de la faire remonter dans l’éditeur au dessus . Après édition il faudra valider un des boutons Edit,Delete ou Add new. Chaque ligne correspond a une chose demandé pour finir la quête .
- ID (qui n'a rien a voir avec l'id de la quete) désigne en quelque sorte le "GUID" pour les objectifs , il peut être quelconque mais unique a toutes les quêtes .
- Type désigne le type d'objectif : je n'ai pas testé toutes celles listées ci dessous , j’utilise principalement 0 , 1 ou 2
Citation :Type = 0 : KILL pnj
Type = 1 : ITEM
Type = 2 : action sur un object ou condition type kill
Type = 3 : interaction avec un pnj exemple gossip hello
Type = 4 : Collecter Marque
Type = 5 : apprendre une competence ou atteindre un niveau (3?!)
Type = 6 : réputation amicale ou plus - hai -42000 Hostile -6000 , Inamical - 3000 , Neutre 0 , Amical 3000 , Honoré 9000 , Révéré 21000 ,Exalté 43000
Type = 7 : réputation inamicale ou -
Type = 8 : Pièce de cuivre
Type = 9 : Joueur tué
Type = 10 : exploration ObjectID -1 autres param a zero
Type = 11 : vaincre mascotte
Type = 12 : vaincre mascotte de combat
Type = 13 : Vaincre joueur en utilisant la fonction Trouver un combat avec une équipe de mascottes
Type = 14 : StorageIndex 0 = vaincre boss - StorageIndex = 1 &2 mission field ?!
Type = 15 : explorer / attaquer ?!
- StorageIndex c'est un numéro d'ordre qui doit être unique
- ObjectID désignera suivant le Type (0 a 15) l'ID du mob a tuer ou de l'item a ramener
- Amount désigne combien il faut tuer de mob ou ramener d'item , 0 validera automatiquement la condition , pratique pour auto compléter la quete sans perdre ces info
- Flags & UnkFloat ... j'en ai aucune idée
- Description désigne le texte qui sera affiché sur votre écran dans le suivi de quête et qui vous détaille les objectifs de la quête en dessous de son nom , par exemple "explorer stitchland" ou "10 bandit koala neutralisés"
5) Les branches Creature Starters , Creature Enders , Gameobject Starters , Gameobject Enders désignent les ID des PNJ ou gameobject qui donnent ou terminent la quête .
Partie B - exemples de bug de quetes et comment y remedier
6) types de Quelques types de quetes : je ne détaillerais pas tout les Types listé en 4 parce que j'en utilise encore que très peut , je ne les connais donc pas très bien . sa viendra au fil du débug de la DB .
- Tuer x mob
- Ramener x items
- Aller parler a / gossip_hello
- killcredit : Effectuer une action qui ne demande ni de mob , ni item , ni action sur un gameobject bref sa peut être n’importe quoi comme une escorte , utiliser un véhicule
- Faire une action sur un gameobject
- explorer un lieu
- Spell
6a) Tuer x mob : Elle peut paraitre simple celle la ... et pourtant il y a un petit piege
- Dans la majorité des cas , c'est a dire quand il ni a qu'une sorte de MOB a tuer il faudra renseigner la ligne comme montré sur le screen 4 avec Type = 0
- Dans le cas ou il y aurais plusieurs sortes de MOB a tuer vous avec 2 choix possibles :
- Vous répétez autant de fois que nécessaire ces lignes avec le ID de la 1ere colonne différente a chaque fois . C'est adapté aux quêtes qui demandent au max 3 ou 4 sortes de mobs .
- mais certaines quêtes vous demanderont plus , par exemple x mobs de la région ou de tel clan ... cela peut représenter beaucoup de monde . Dans ce cas la on n'en renseignera qu'un seul dans keira2 et pour les suivant on renseignera pour chaque sorte de mobs la case KillCredit1 ou KillCredit2 de la table creature_template de ces mobs . En gros ci la quête me demande de tuer des mobs ayant l'ID 111 , je renseigne la case KillCredit1 d'un mob 222 avec cette valeur 111 et celui ci comptera ci je le tue comme un mob 111 et 222 . Rien de plus simple que de faire un UPDATE `creature_template` SET `KillCredit1` = 111 WHERE entry = 222;
- comme montré sur le screen 4 mais avec Type = 1
- La quête vous demande d'aller parler a un PNJ et c'est tout , ce PNJ terme la quête . C'est souvent dans ce cas lorsque a la fin d'une région l'on veut vous guider vers la suivante .Dans ce cas vous laissez Quest Objectives totalement vide . Comme il ni a pas de condition la quete sera auto-complete d'office . Il suffit ensuite de définir le mob a qui l'on doit parler comme celui a qui l'on rend la quête .
- La quête vous demande d'aller parler a un PNJ mais il n'est qu'une étape et ne termine pas la quête . Dans ce cas vous avez 2 solutions : utiliser Type = 3 ou utiliser ce que l'on appelle un killcredit . Personnellement je préfère utiliser un killcredit parce qu'ainsi quand je liste Quest Objectives dans Keyra2 j'ai tout ce qui est demandé sur le même masque . Je détaille ce killcredit juste au dessous en 6d .Dans le même cas de figure il y a aussi le cas ou une quête vous demande comme au départ des worgen de sauver des PNJ qui ce noient ou de retrouver des enfants disparu , c'est le même cas de figure mais présenté un peut différemment . Il ni a pas forcement de texte , l'on utilisera donc le killcredit avec un simple gossip_hello (un click sur le PNJ) : EVENT_GOSSIP_HELLO (64) , ne pas oublier le flag gossip dans creature_template .
Le killcrédit c'est quoi ? ... je vous remercie de m'avoir posé la question , sa me fait un bon enchainement
En fait la réponse est dans son nom killcrédit : crédit quand on tue un MOB ... " Bravo Stitch 3600 lignes pour en arriver la ... Bravo , + REP "
Bon sérieusement c'est exactement comme pour 6a , l'on fait comme si l'on nous demandait de tuer un mob même si ce qui est demandé n'est que d'ouvrir une porte . La seule différence c'est qu'en 6a il suffisait de tuer le dit MOB pour être crédité , la ce n'est pas le cas .
Le crédit sera tout simplement donné grâce SmartAI et son action ACTION_CALL_KILLEDMONSTER (33) a la place d'un mob . Les seules conditions sont que l'id de ce " MOB " doit exister dans la DB et bien sur ne pas être spawn quelque part , il ne servira qu'a sa . Vous comprenez maintenant pourquoi vous croisez des mobs sur wowhead avec la mention " L'emplacement de ce PNJ est inconnu " ... sa peut aussi indiquer un pet mais bon .
Citation :Le script correspondant a ce screen :
SET @ENTRY := 11000560;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(@ENTRY,0,10,0,64,0,100,0,0,0,0,0,33,111,0,0,0,0,0,7,0,0,0,0,0,0,0,"Exemple de Killcredit");
Le crédit de quête étant donné par SmartAI il peut être de n'importe qu'elle nature , il suffit de définir un Event dans SmartAi adapté . Le script peut aussi bien être celui d'un MOB (AIName`="SmartAI") que celui d'un gameobject (AIName`="SmartGameObjectAI") . Exemple :
- Dans le screen au dessus c'est un simple bouton droit sur le mob 11000560 , cela peut suivant le contexte donnée par la quête un simple " aller parler a " ou un " sauver les PNJ qui ce noient comme au départ des worgens " . Il est conseillé dans ce cas de définir le flag de ce SmartAI sur " non répétable " pour éviter les triches et aussi de programmer un despawn du dit MOB .
- Dans le cas d'une escorte de PNJ (qui peut vous suivre comme un pet ou suivre un waitpoint) peut vous donner ce crédit s'il détecte être arrivé a un point donnée en définissant la cible du crédit dans le " Target " de SmartAI . Pour ce point je vous déconseille d'utiliser un autre MOB parce que s'il a été tué ... le mieux c'est d'utiliser un trigger . Un trigger c'est simplement un MOB passif et invisible . Il ne fait absolument rien , juste indiquer qu'il est la a SmartAI . Il sert juste de marqueur . Pour cela créez un MOB neutre avec unit_flags Pacified (131072) et flags_extra (trigger = 128 = invisible) .
- le killcrédit peut aussi servir a donner le crédit d'un kill lorsque l'on est sur une monture non invoqué comme les chars du joug qui par défaut n'en donne pas a celui qui le monte . Pour cela sur cette monture définissez Event_kill (5) pour event et TARGET_OWNER_OR_SUMMONER (23) pour le joueur qui la monte .
Des types de gameobject il y en a une tartine et donc autant de source a problème et solution , pour les curieux vous trouverez une liste avec leurs détails Trinity ICI . La plupart du temps l'on aura affaire a un changement d’état comme ouvrir une cage pour libérer un prisonnier ou appuyer sur un bouton . Ici l'on pourra aussi utiliser le killcrédit mais avec en event de notre SmartAI un test sur ce changement d’état.
Plutôt qu’écrire un roman , je vais prendre exemple sur la quête Les prisonniers de guerre au Carmine , celle ci nous demande de libérer des prisonniers enfermés dans l' enclos rochenoire qui est fermé a clef .
Ce gameobject est un fait un simple bouton (BUTTON = 1) . Je vais détecter que le joueur ouvre l'enclos par un changement de son état grâce a EVENT_GO_STATE_CHANGED (70) qui sera égal a 2 : go_state_activated .
Le verrouillage est fait par le gameobject lui même . Si l'on examine ce gameobject (l'enclo ID 204441) l'on remarquera dans la case OPEN une valeur open=1930, s'il n'avait pas été verrouillé il y aurait eu 0 .
Ce 1930 correspond a une entrée 1930 dans Lock.dbc ou l'on y trouvera une valeur 59261 ... 59261 qui est en fait l'id de l'item de déverrouillage clef (item 59261) .
Vous remarquerez la principale difficulté de SmartAI qui est de relier event a cible , ici avec TARGET_PLAYER_RANGE (17) ce n'est pas très optimal puisqu'un autre joueur ayant lui aussi la quête et étant a porté aurait le crédit sans activer l'enclos , j'aurais pu utiliser TARGET_CLOSEST_PLAYER (21) mais j'ai remarqué que celui ci marchait quand il voulait .
6f) explorer un lieu : ObjectID étant a 99% avec la valeur -1 , j'avoue que je n'ai pas trouvé de corrélation dans la DB entre la zone et la quête , peut etre les dbc ou un spell (spell_area) mais la aussi je n'ai rien trouvé . Donc je ne me casse plus la tete , je passe par un trigger . Un trigger est un mob passif et invisible qui ne fait rien si ce n'est dans ce cas donner un killcrédit a un joueur détecté rans un certain rayon .
Bon voila pour ce premier survol des résolutions de bugs de quêtes ce termine . Bien entendu il n'est pas parfait parce que c'est un milieu très complexe et varié et que ces débugs sont surtout basé sur le killcrédit plutot que sur une méthode plus propre . Au début j'étais plutôt partie sur un tuto sur Keyra2 mais au final celui ci est assez facile a cerner la seule partie qui justifiait d’être développé était celui des quêtes ...
Je mettrais a jour au fil du temps lorsque les idées ou connaissances me permettrons de l’étoffer .
6g) Probleme de spell : Certaines quêtes nous demanderont d'utiliser un item fourni pour une utilisation spéciale mais voila ... cet item lance un sort qui ne marche pas et donc la quête ne peut être remplie .
Pour illustrer cet exemple la quête Un désherbant radical , elle nous fournie l'item Massacr'herbes qui lance justement un spell qui ne marche pas , source du bug .
Pour remédier a cela je vais utiliser la table spell_linked_spell , celle ci permet de lier un sort a un autre . Lorsque je lance le 1er sa lancera automatiquement le second . Il est possible de lier plusieurs sorts au premier pour arriver a ces fin . Il faut savoir que souvent les sorts existent en plusieurs exemplaires , parfois avec une limitation ou condition et parfois justement sans .
Assez souvent l'on trouvera l’équivalent ou plusieurs qui une fois associés produiront l'effet désiré . Il vous faudra rechercher par nom sur wowhead et expérimenter ( avec .learn 123) . Si un sort testé ne marche pas je vous conseille de le désapprendre (.unlearn 123) afin que dans votre prochain essaie celui ci n’interfère pas . Il ce peut aussi que le sort testé ai un verrou comme un besoin de mana et ne marche pas sur le joueur mais marche sur le mob qui a moins de verrou .
Citation :REPLACE INTO `world`.`spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES ('68211', '68212', '0', 'Massacr''herbes : quete 14236');
Chose intéressante aussi cette technique peut permettre de déboguer une classe , du moins provisoirement le temps de trouver un pro du C++
Ne vous faites quand mème pas trop d'illusion pour les sorts de classes , les équivalent sont beaucoup plus difficiles a trouver sans effet secondaire , surtout pour les talents .
A noter dans la DB la table item_template_548 qui comme son nom l'indique provient de MOP , je l'ai rajouté puisque les items n'apparaissent plus dans la DB 6x et sont géré par les DBC . Elle ne sert a rien d'autre que de trouver le spell lancé par l'item dans la case spellid_1 .
7) Divers : Petits trucs bizarres que j'ai pu constater et astuces diverses
- Autant que possible éviter d'utiliser sur smartAI l'event Update , en effet dans certaines circonstance celui ci fait l'impasse sur le temp programmé et l’interprète par un 0 ou une valeur farfelu du genre temps x10 . Lui préférer par exemple EVENT_UPDATE_OOC , EVENT_OOC_LOS etc .
- Au sujet de l'id dans Quest Objectives sur Keyra2 . Il m'est arrivé 2 ou 3 fois ou une quête ne semblait pas accepter ces conditions . J'ai résolu ce problème en changeant cette id ( je rappelle que l'on peut la comparer au GUID des creatures ) . il semblerait que ces Quest Objectives puissent être verrouillé par une autre table .
- Si une quête semble bien programmé mais qu'elle ne veut toujours pas fonctionner correctement : vérifiez qu'elle ne soit pas désactivé dans la table Disable . Il m'est arrivé de croiser des quêtes Disabled qui étaient quand même proposé au joueur mais dont les conditions n’étaient pas validé dans le jeu pour cette raison .
- Lorsque vous utilisez des EVENT_LINK (61) ou non , faite attention que les link to & link from soient valident . sa peut crash le serveur au démarrage .