SQL 6xx Dialogues & choix multiples sur un PNJ par Gossip_menu & SmartAI
#1
Tongue 
[Image: gossip%20menu.jpg]
 
Gossip_menu: dialogue & choix multiples sur un PNJ



Un gossip_menu c'est tout simplement comme montré sur le screen une fenêtre qui s'ouvre et nous propose plusieurs choix . Il peut etre crée sur un PNJ ou un gameobject , pour illustrer ce tuto je prendrais l'exemple d'un PNJ téléporteur que j'ai crée pour Azshara   .

Pour créer un gossip_menu nous aurons besoin de définir 3 choses :


1) Le npcflag dans créature_template (n’existe pas sur un gameobject et n'est donc pas nécessaire) ainsi que gossip_menu_id (11705 dans l'exemple ci dessous).



2)  créer les entrées gossip_menu dans la table gossip_menu_option comme ci dessous :
Citation :REPLACE INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES
(11705, 0, 0, 'Station du terminus Sud', 0, 1, 1, 0, 0, 0, 0, '', 0),
(11705, 1, 0, 'Station d''orgrimmar', 0, 1, 1, 0, 0, 0, 0, '', 0),
(11705, 2, 0, 'Station Palais de Gallywix', 0, 1, 1, 0, 0, 0, 0, '', 0), 
(11705, 3, 0, 'Station Nord (Camp de base Darnassien)', 0, 1, 1, 0, 0, 0, 0, '', 0),
(11705, 4, 0, 'Station des confins Amers', 0, 1, 1, 0, 0, 0, 0, '', 0);  

Explications :
menu_id : c'est le gossip_menu_id renseigné dans créature_template ,
id : servira sur SAI-editor a savoir quel choix a fait le joueur
option_icon : un petit icone optionnel affiché avant le texte pour le choix proposé . Il peut être au choix :
Citation :GOSSIP_ICON_CHAT 0
GOSSIP_ICON_VENDOR 1
GOSSIP_ICON_TAXI 2
GOSSIP_ICON_TRAINER 3
GOSSIP_ICON_INTERACT_1 4
GOSSIP_ICON_INTERACT_2 5
GOSSIP_ICON_MONEY_BAG 6
GOSSIP_ICON_TALK 7
GOSSIP_ICON_TABARD 8
GOSSIP_ICON_BATTLE 9
GOSSIP_ICON_DOT10
option_text : le texte pour le choix proposé
option_id : pour un type de pnj comme un vendeur ou un taxi , personnellement j'utilise toujours zero pour none .
npc_option_npcflag : le pnj a un flag gossip_menu , laissez a 1
action_menu_id : une id pour un sub-menu , perso je n'ai jamais eu besoin d'aller jusque la
action_poi_id : point of interest affiché sur la minimap
box_money : ce que le joueur doit payer ( en piece de cuivre )



3) Créer le smartai qui va gérer tout sa comme sur le screen qui suit :
[Image: gossip%20menu2.jpg]
PS : On ne le vois pas sur ce screen mais les id (0 a 4) défini dans la table gossip_menu_option apparaitront dans EVENT_GOSSIP_SELECT -> gossip_menu_item .
Citation :Le script smartai en question :

-- Bilgewater Rocket-jockey SAI
SET @ENTRY := 43217;
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,62,0,100,0,11705,0,0,0,62,1,0,0,0,0,0,7,0,0,0,2659.220459,-6163.652832,138.307510,0,"PNJ TP : Azshara fusorail - Station du terminus Sud"),
(@ENTRY,0,11,0,62,0,100,0,11705,2,0,0,62,1,0,0,0,0,0,7,0,0,0,3554.774902,-4793.672852,160.704224,0,"PNJ TP : Azshara fusorail - Station Palais de Gallywix"),
(@ENTRY,0,12,0,62,0,100,0,11705,3,0,0,62,1,0,0,0,0,0,7,0,0,0,4470.460449,-5715.648926,145.509689,0,"PNJ TP : Azshara fusorail - Station Nord (Camp de base Darnassien)"),
(@ENTRY,0,13,0,62,0,100,0,11705,4,0,0,62,1,0,0,0,0,0,7,0,0,0,4617.309082,-7033.515137,153.722672,0,"PNJ TP : Azshara fusorail - Station des confins Amers"),
(@ENTRY,0,14,0,62,0,100,0,11705,1,0,0,62,1,0,0,0,0,0,7,0,0,0,2954.566895,-4996.734375,165.674088,0,"PNJ TP : Azshara fusorail - Station d''orgrimmar");

Derniers point , les gossip ne ce ferment généralement pas . Il faut pour chaque choix créer une autre entrée ACTION_CLOSE_GOSSIP pour le fermer . Dans mon script ce n’était pas nécessaire puisque la téléportation du joueur ferme automatiquement la fenêtre .


4) Ajouter une option générique au gossip_menu_option :


Il peut être intéressant de rajouter a notre PNJ une option de vendeur , de maître des ventes , banquier ou autre . 
Pour cela il faudra éditer le `option_id` et le `npc_option_npcflag`du notre gossip_menu_option et le core gérera automatiquement cette option en ouvrant la fenêtre générique en rapport , il ni aura rien d'autre a rajouter . Bien entendu le flag du PNJ doit etre activé .

Exemple de l’édition du gossip_menu_option du PNJ Fiona afin de lui rajouter une option de vendeur . 
Citation :REPLACE INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES

(12022, 0, 1, 'Montrez moi ce que vous avez a vendre Fiona.', 0, 3, 128, 0, 0, 0, 0, '', 0);

L'option_id 3 désigne le type d'option comme vendeur ou maître de profession etc .
Le npc_option_npcflag 128 désigne tout simplement le flag ou groupe de flag compatible a cette option comme vendeur ou vendeur+réparateur du pnj .
Une ligne gossip_menu_option pour une option .

Ci dessous la liste des option générique et des flags correspondant :
Citation :option_id   &   npc_option_npcflag

0  Rien
1-1 Menu gossip
2-2 Donneur de quetes
5-16 Entraineur
16-16 Effacer TALENTS
16-17 Effacer PET TALENTS
18-16 Entraineur Double spécialité
3-128 Vendeur
15-4096 Réparateur
4-8192 Trajets Aériens
6-16384 Gardien des âmes
7-32768 Guide spirituel
8-65536 Nouveau Foyer
9-131072 Banque
10-262144 Création de Guilde
#
11-524288 Création de Tabard
12-1048576 Champ de bataille
13-2097152 Hotel des ventes
14-4194304 Ecurie
?6-67108864 Boite aux Lettres
?-268435456 Transmogrifier
?-536870912 Chambre du vide
?-1073741824 Battle Pet ?!
?-2147483648 Marcher noir
?-4294967296 ITEM_UPGRADE_MASTER
?-8589934592 Architecte du fief
?-17179869184 - CHIPMENT_CRAFTER
?-34359738368 - GARRISON_MISSION_NPC
?-68719476736 - TRADESKILL_NPC
?-137438953472 BLACK_MARKET_VIEW
?-549755813888 Marcher noir




 
Je terminerais ce tuto par un petit coup de gueule contre certains choix fait par trinity comme l'illustre l'exemple ci dessous :

Sachez que si vous désirez afficher un message avant le choix du menu comme le 'Vers ou désirez vous aller l''ami ?' sur le screen ... sous 6x c'est devenu n'importe quoi , un vrais parcours du combattant et donc je ne l'utilise jamais  . Voila pourquoi :

- En premier récupérez le contenu de gossip_menu_id dans creature_template , celui ci vous indiquera l'entrée de la table gossip_menu (et non gossip_menu_option ) a regarder .

- la table gossip_menu vous indiquera dans text_id l'entrée de la Table: npc_text a regarder .

- l'entrée de  npc_text enfin vous indiquera par son entrée BroadcastTextID0 la table broadcast_text a éditer contenant le message

... table broadcast_text qui ce trouve sur ... la DB hotfixes ...

 
BRAVO Trinity vous avez fait un superbe boulot , gros GG
Répondre
#2
Petit complément rajouté au tuto : 4) Ajouter une option générique au gossip_menu_option
Répondre
#3
Mise a jour des npc_option_npcflag
Répondre
#4
Merci beaucoup
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)