Tuto SAI-Editor : initiation
#1
[Image: SAI.jpg]


Faire un tuto sur SAI-Editor ou SmartAI serait un peut présomptueux au vue de ces nombreuses possibilités . Je vais donc par ce tuto essayer de vous faire passer la première impression de complexité qu'il donne par une découverte de l'interface et de ces grandes lignes  , voir quelques exemples/astuces simples pour l'illustrer.
Perso j'affectionne beaucoup SmartAI car a la différence du C++ il a le gros avantage de traverser les versions de wow et il est aussi beaucoup plus accessible que l'apprentissage d'un langage de programmation .

Alors , laissez tomber l'impression kikou " c'est pour les débutants moi je code en C++ parce que je suis un pro "   Wink

Mais avant de commencer il serait bien de le récupérer ... et autant que possible déjà compilé : c'est ICI

Ensuite dans le menu settings choisissez l'extension de jeu , l'auto connexion et ce que vous voudrez .

---


Si vous n'avez jamais vue le SQL d'un patch ou d'une update , sa ressemble a ceci :
Citation :
SET @ENTRY := 1100000;
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,0,0,73,0,100,0,0,0,2000,2000,62,0,0,0,0,0,0,7,0,0,0,-14286.2,556.544,8.68897,4.36638,"Téléportation a Baie du Butin");


Ce n'est pas très pratique a éditer ou a comprendre , surtout si le script est assez long . SAI-Editor par une interface graphique vous permettra de générer ces lignes afin de les copier/coller dans un fichier sql (texte) ou de les exécuter directement dans la DB .

Dans ce dernier cas afin qu'il soit pris en compte sans avoir a relancer le serveur il vous faudra :
- Que le PNJ ai déja son AIName défini en "SmartAI" ou pour le gameobject en "SmartGameObjectAI"
- taper la commande .reload smart_scripts
- Sous 6x un petit bug fait que les PNJ/GOB déja spawn ne seront pas rafraichi , il vous faudra donc le respawn (.npc add 1100000 ou .gob add 1100123)


[Image: tuto-smartai.jpg]


Par simplicité je désignerais par MOB la créature qui a ce script et CIBLE un mob (lui ou autre) , un joueur , une coordonnée , etc sur laquelle on va agir . Je ne citerais aussi que quelques actions en exemples parce qu'il y a trop de combinaisons possibles .

L'interface d’édition comprend principalement 4 zones :
Chaque ligne en D désigne une exécution (un test/action/cible) : s'il ce passe sa (4) alors tu fait sa (5) sur la cible (6) , en gros :
- " He le mob " si tu détectes un mob hostile a moins de 50m envois lui une patate
- OU sur ce screen : si l'on fait un clic droit sur le PNJ (spellclick) (4) alors téléporte sur la map 0 (5) celui qui a fait cette action (6) , (6) comprendra aussi les coordonnées X Y Z O du lieu de téléportation comme c'est le cas la plupart du temps lorsque l'on désigne une coordonnée , parce que c'est sur la cible que l'on agit et non le mob .

Zone A :
1) Entry or guid : Une valeur positive designe l'ID , une valeur négative un GUID
2) Source type : Définit quel type d'élément va être scripté : SCRIPT_TYPE_CREATURE pour les mobs et SCRIPT_TYPE_GAMEOBJECT pour les gameobjet .
Il y a d'autre choix mais j'avoue ne jamais les avoir utilisés ni être sur qu'ils soient fonctionnel .


Zone B :
4) Event : Désigne ce qui va declencher/lancer cette ligne du script , par exemple :
- EVENT_UPDATE_IC (0) : si le mob est en combat
- EVENT_SPELLHIT (8) : si le mob est sous l'effet d'un spell
- EVENT_ACCEPTED_QUEST (19) & EVENT_REWARD_QUEST (20) : ci je joueur prend ou rend une quete au mob
- EVENT_JUST_SUMMONED (54) : dans le cas ou le mob est un pet , s'il vient d'etre invoqué

- EVENT_LINK (61) : alors c'est event est un peut particulier , il n'effectue pas un test comme les autres mais permet d'enchainer des event/action en D , parce que ces lignes ne font qu'une seule chose normalement : 1 test+1 action+1 cible .
Dans le cas ou vous désirez plusieurs résultats simultanés pour une même condition d'evenement de depart , c'est le choix a faire , le gros avantage c'est que si l'action précédente ne c'est pas exécuté alors elle ne sera pas exécuté , ni les suivante .
Un exemple tiré par les cheveux pour illustrer : si votre but est de faire descendre un joueur de sa monture (dismount) puis de le transformer en cochon , il ne pourra être transformé en cochon puisque l'on ne peut le faire descendre de monture car le joueur est a pied

- EVENT_GOSSIP_HELLO (64) & EVENT_GOSSIP_SELECT (62) : dans le 1er cas un clic sur le mob et dans le second un choix gossip_menu comme par exemple pour un aubergiste cliquer sur " Faites de cette auberge votre foyer " , dans ce cas il faudra définir son flag gossip et son gossip_menu_id dans creature_template puis la table gossip_menu_option .Exemple de gossip_menu_option :
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
(ID défini dansgossip_menu_id de créature_template , Nunero du choix 0 1 2 3 ... 99  du gossip, 0, "Faites de cette auberge votre foyer", 0, 1, 1, 0, 0, 0, 0, '', 0);


5) Désigne l'action en elle meme , dans 99% des cas ce que va faire le mob mais pas que , il y a quelques exceptions particulières .
- ACTION_ADD_QUEST (7) : ajoute une quete a la cible (6)
- ACTION_WP_START (53) : la cible (6) commence a suivre un chemin enregistré dans la table waypoint. Attention pour créer ce chemin l'on utilisera la commande .wp add ID mais celle ci enregistre ces données dans la table waypoint_data , il faudra l'adapter et l'importer dan la table waypoint.

-
ACTION_CROSS_CAST (86) : c'est justement le cas particulier , le 1% manquant  . Le script va en fait pour cette ligne , faire comme s'il ce n’était pas executé sur le mob ... ni la cible ... mais un autre défini dans action (7) . A quoi sa sert ? et bien certaines aura ou sort n'agissent que sur le lanceur et personne d'autre . Ci vous voulez l'appliquer a la cible (6) c'est impossible parce que verrouillé dans les dbc .
Citation :Donc avec ACTION_CROSS_CAST (86) le script dit a trinity " bon c'est moi qui l’exécute mais fait comme ci c’était le petit gnome qui me cliquette la " .
Donc pour que le mob applique cette aura vérouillé au joueur il faudra remplir Target (6) sur TARGET_SELF (1) et action (7) sur Target type caster =7
Target : TARGET_SELF (1)

- ACTION_CALL_KILLEDMONSTER (33) : Une des actions les plus importantes puisqu'elle donne un crédit, elle permet de valider une condition de quete . Ce qu'il faut savoir c'est que beaucoup de quêtes ont comme condition ce type de crédit même si ce qui est demandé n'est pas de tuer une créature . C'est pour cela que vous pourrez croiser sur wowhead des PNJ avec la mention " L'emplacement de ce PNJ est inconnu.  " , cette mention peut aussi indiquer un pet . Il est a noter que cette entrée doit exister comme comme PNJ dans la table creature_template , meme ci je le rappelle ce n'est pas un pnj a proprement dit et utilisé uniquement que dans ce cas de figure . Je reviendrais sur la question dans un tuto pour réparer des quetes grace a keira2 + SAI-Editor .

6) Désigne sur qui ou sur quoi l'on va agir .
- TARGET_SELF (1) : le MOB lui meme
- TARGET_ACTION_INVOKER (7) : par exemple le joueur qui a cliqué sur le mob , celui qui a lancé l'event (4) .
- TARGET_POSITION (8) : une coordonnée qui peut etre ou doit ce déplacer le MOB , je rappelle que pour toutes coordonnées ne désignant pas le MOB il faut renseigner celle dans TARGET_ACTION_INVOKER pour le joueur par exemple et non par TARGET_POSITION .
- TARGET_VICTIM : la cible sur laquelle le MOB frappe : créature ou joueur
- TARGET_CREATURE_DISTANCE (11) : une créature ce trouvant entre lui et une distance max

3) Ici quelques réglages pour chaque ligne du script
- ID doit être unique , évitez quand mème l'ID 0 puisque le 0 est utilisez dans dans d'autres cases pour indiquer un numero de ligne en "none" , sa prête a confusion.
- Link to & Link from servent a lié les lignes de script lorsque EVENT_LINK (61) en (4) est utilisé , attention ci vous changez l'ID ces ligne ne sont pas mis a jour .


Zone C : Ici l'on définira les paramètres pour les commandes 4 5 6 de la zone B . Important : ne jamais laisser de compteurs de temps (exprimé en mili seconde) a zero dans event C , lorsque vous définissez un temps de despawn renseignez toujours un temps minimum même ci celui ci doit être instantané (100ms par exemple), j'ai déjà eu des bugs pour cette raison . Le plus important ... si vous changez B effacez alors les données ce trouvant dans C qui ne lui servent plus . J'ai eu aussi parfois des bugs pour cette raison ... C'est con de chercher des heures pourquoi un script ne marche pas contre toute logique a cause de sa Tongue


Zone D : Ici apparaissent les différentes lignes du script crée dans A B C .


Voila c'est fini ... ouf ... c'est toujours plus difficile d'expliquer ou de comprendre par écrit plutôt que par l’expérience donc ci cela vous parait compliqué c'est un peut normal , ne jetez pas l’éponge mais entrez plutôt des valeurs dans SAI-editor et expérimentez ... vous verrez comme c'est plus clair et facile .


par exemple vous pouvez commencer en modifiant , expérimentant le petit script ci dessous :
Citation :-- Gazelle SAI
SET @ENTRY := 4166;
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,2000,0,10,0,100,0,1,15,2000,2000,11,68326,0,0,0,0,0,1,0,0,0,0,0,0,0,"Si detecte mouvement hors combat : auto peur 8225");

Explication :
Si ce cerf détecte un mouvement entre lui et 15m et qu'il est hors combat , alors il lance un sort de peur sur lui mème et fuit donc celui qui l'approche .
Pour info j'ai utilisé ce script dans le repack sur les bestioles et certaines créatures comme les Daim, Cerf, Ecureuil, Biches, Lapin, Rat, mouflette, Giraphe, Troteur, Zhevra, Goeland, mouette et meme les civils .

Vous avez maintenant le droit d'aller boire une bière et par la mème m'en ramener une , bon jeu a vous Idea




Répondre
#2
Commandes connus pour leurs bugs :
  • ACTION_SET_RANGED_MOVEMENT : crash serveur
  • UPDATE : ne fais pas crash mais a des tempo pas vraiment juste parfois
Répondre


Atteindre :


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