SQL 6xx Phasemask en SmartAI
#1
[Image: Phasemask_01.jpg]


Les Phasemask , a ne pas confondre avec les Phases (ACTION_SET_INGAME_PHASE_MASK), sont aux AI ce que sont les Phases pour un joueur ou un mobs .

Suivant un événement les phases servent a projeter le joueur dans un espace alternatif et superposé des mobs et gobs différents pour une mème coordonnée.

Les Phasemask sont un peux similaires mais dans le domaine des AI , c'est a dire qu'un mob par défaut exécute sont code SmartAI en Phasemask  0 , il peut etre intéressant pour un événement particulier de lui faire exécuter une autre AI défini ici en Phasemask  1 ou Phasemask   2.

Quelques situations d'exemples :
  • Vous pouvez script un mob avec plusieurs spécialités , par exemple a l'agro un mage ce comportera aléatoirement comme utilisant les sorts de feu ou les sorts de givre
  • Une quete vous demandera d'interagir avec un pnj qui pourrait répondre favorablement ou défavorablement a votre demande
Pour cet exemple je vais me baser sur la quete Rendez-vous utile ! , celle ci nous demande de remuer des travailleurs paresseux afin qu'ils se remettent au travail , ceux ci réagiront de 2 façons : ou ils acceptent et vous crédite la quete ou ils refusent et vous agressent .

Pour ce mob nous aurons donc 3 états différents : 1 par defaut et 2 en rapport avec la quete et s'activeront aléatoirement après un gossip menu
  • Phasemask 0 : l'etat normal qui servira a gérer le mob normalement c'est a dire sans avoir pris la quete
Ligne 10 : compétence de combat par défaut
Ligne 40 : apres le gossip retire l'aura qui le maintenait allongé
Ligne 50 : apres le gossip bascule le mob aléatoirement en Phasemask   1 ou Phasemask   2

apres ce moment la le mob n’exécutera plus le smartAI Phasemask  0 mais uniquement le Phasemask   1 ou 2
  • Phasemask  1 : Le mob accepte paisiblement votre ordre
Ligne  100 : votre donne le credit de la quete
Ligne  105 : ferme la fenetre du gossip menu
Ligne  110 : fait un commentaire comme quoi il ce remet au travail
Ligne  115 : avance rapidement pour simuler son retour a son poste de travail
Ligne  120 : despawn
  • Phasemask  2 : Le mob prend très mal votre demande
Ligne  150 : change la faction du mob pour le rendre agressif
Ligne  152 154 155 : ces lignes changent la faction de 3 mobs(id) différents dans un rayon de 20m , sinon sa serait trop facile :p
Ligne  160 : un petit message pour vous indiquer qu'il va vous faire regretter votre demande
Ligne  165 : sa compétence de combat en Phasemask  2

Ensuite il faut penser a la re initialisation pour divers cas : Vous vous êtes éloigné et le mob quite le combat , vous êtes mort , ... elle sera detecté par un EVENT_RESET
Ligne  170 : remet la faction d'origine au mob
Ligne  175 : repasse le mob en Phasemask 0

Vous remarquerez que les lignes 170 et 175 sont en Phasemask  2 puisque en effet cette initialisation ne peux ce produire qu’après la fin de la initialisation 2

Ligne 180 : remet l'aura allongé au mob lorsqu'il a rejoind sa position d'origine . Elle s’exécute en Phasemask  0 puisque elle vient après l'action de la ligne 175


Citation :Le code pour le pnj parésseu :

-- Travailleur paresseux SAI

SET @ENTRY := 47292;
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,4,0,100,1,0,0,0,0,11,14890,0,0,0,0,0,2,0,0,0,0,0,0,0,"Coup désarçonnant"),
(@ENTRY,0,40,0,62,0,100,0,12238,0,0,0,28,32951,0,0,0,0,0,1,0,0,0,0,0,0,0,"Rendez-vous utile ! 27969 : retire aura"),
(@ENTRY,0,50,0,62,0,100,0,12238,0,0,0,37,1,2,0,0,0,0,1,0,0,0,0,0,0,0,"Rendez-vous utile ! 27969 : RND phase"),
(@ENTRY,0,100,105,1,1,100,1,0,0,3000,3000,33,47127,0,0,0,0,0,7,0,0,0,0,0,0,0," - phase 1 : Rendez-vous utile ! 27969 : credit"),
(@ENTRY,0,105,110,61,1,100,0,12238,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0," - phase 1 : Rendez-vous utile ! 27969 : fermer gossip"),
(@ENTRY,0,110,115,61,1,100,1,12238,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0," - phase 1 : Rendez-vous utile ! 27969 : blabla"),
(@ENTRY,0,115,120,61,1,100,0,12238,0,0,0,46,15,0,0,0,0,0,1,0,0,0,0,0,0,0," - phase 1 : Rendez-vous utile ! 27969 : avance"),
(@ENTRY,0,120,0,61,1,100,0,12238,0,0,0,41,2000,0,0,0,0,0,1,0,0,0,0,0,0,0," - phase 1 : Rendez-vous utile ! 27969 : despawn"),
(@ENTRY,0,150,0,60,2,100,1,0,0,3000,3000,2,1924,0,0,0,0,0,1,0,0,0,0,0,0,0,"phase 2 : Rendez-vous utile ! 27969 : faction 1924"),
(@ENTRY,0,152,0,60,2,100,1,0,0,3000,3000,2,1924,0,0,0,0,0,9,47690,0,20,0,0,0,0,"phase 2 : Rendez-vous utile ! 27969 : faction 1924 pour pnj 47690"),
(@ENTRY,0,154,0,60,2,100,1,0,0,3000,3000,2,1924,0,0,0,0,0,9,47291,0,20,0,0,0,0,"phase 2 : Rendez-vous utile ! 27969 : faction 1924 pour pnj 47291"),
(@ENTRY,0,155,0,60,2,100,1,0,0,3000,3000,2,1924,0,0,0,0,0,9,47974,0,20,0,0,0,0,"phase 2 : Rendez-vous utile ! 27969 : faction 1924 pour pnj 47974"),
(@ENTRY,0,160,0,60,2,100,1,0,0,3000,3000,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"phase 2 : Rendez-vous utile ! 27969 : blabla"),
(@ENTRY,0,165,0,0,2,100,0,0,0,2500,2500,11,14890,0,0,0,0,0,2,0,0,0,0,0,0,0,"phase 2 : Coup désarçonnant"),
(@ENTRY,0,170,0,25,2,100,0,0,0,0,0,2,190,0,0,0,0,0,1,0,0,0,0,0,0,0," - phase 2 : reset faction"),
(@ENTRY,0,175,0,25,2,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"reset phase mask 0"),
(@ENTRY,0,180,0,21,0,100,0,12238,0,0,0,75,32951,0,0,0,0,0,1,0,0,0,0,0,0,0,"Rendez-vous utile ! 27969 : reset aura");

En vert : on active aléatoirement la Phasemask 1 ou 2 . Autre Action possible : ACTION_SET_EVENT_PHASE , ACTION_INC_EVENT_PHASE
En bleu défini le/les Phasemask pour cette ligne en ouvrant la fenetre en rouge

[Image: Phasemask_02.jpg]
Répondre


Atteindre :


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