SQL Déplacement de PNJ avec les Waitpoints
#1
[Image: WP.jpg]
Déplacement de PNJ avec les Waitpoints


Il peut être agréable pour rendre je jeu moins statique et un peut plus vivant de faire déplacer des PNJ suivant un certain parcours , ceux qui ont essayé le repack comprennent ce que je veux dire puisque les capitales en sont peuplées . On ce sent moins seul du coup en local .
Cool

Pour déplacer des PNJ en utilisant les waitpoint il y a en fait 2 méthodes pour 2 utilisations différentes .
Chose importante aussi , le concept ne fonctionnent pas de la mème façon que sous Mangos . Sous Mangos l'on sélectionnais le PNJ et on créais son parcours , cela ce faisait très facilement mais du coup s'il y avait beaucoup de PNJ , sa pouvait être fastidieux . Sous Trinity la vision du concept est différente , l'on crée un parcours et ensuite on lui affecte X PNJ .
Il est a noter aussi une commande bien pratique : .wp show on/off après avoir sélectionné un PNJ permet de voir les points de passages et suivant la version de Trinity de les déplacer .


1ere méthode : la table waypoint_data

Elle est destiné aux PNJ qui ce déplaceront automatiquement au spawn en suivant un chemin défini .
Les avantages sont que la table est compatible avec la commande WP qui permet de créer le chemin directement dans le jeu , a chaque point de passage il sera possible de leur faire jouer une emote ou faire une pause.
L’inconvénient c'est que ces entrées ne pourront être directement utilisable par SmartAI.

2eme méthode : la table waypoints
Elle est destiné elle aux PNJ qui ce déplaceront a la demande en suivant un chemin défini .
L'avantage de cette méthode c'est son utilisation par SmartAI . Grâce a SmartAI il sera possible de lui programmer une IA puisque celui ci comprend aussi des commandes permettant de savoir ci le PNJ a atteint un certain point , faire une pause dans une condition défini (par exemple un combat) , une fois terminé sont parcours il est possible de despawn le PNJ au bout de x secondes , etc .
L' inconvénients principal c'est que créant le chemin avec la commande WP les données sont enregistrées dans la table waypoint_data et non waypoint qui est la table utilisé par SmartAI . il faudra donc extraire ces données de waypoint_data , les convertir pour waypoint et les re importer dans cette dernière table . Je vous rassure rien de compliqué .

Créer un chemin dans le jeu pour la table waypoint_data ou waypoints :
- En 1er choisir une ID pour identifier ce chemin en s'assurant que cette ID n'est pas utilisé par waypoint_data mais aussi waypoint dans le cas ou vous voudriez utiliser SmartAI ( puisque ces données initialement enregistrées dans la 1ere table seront transférées dans la seconde ) .
Généralement l'on prend l'id du PNJ x 10 , perso c'est plutôt 10 M+Id du PNJ mais rien n'est obligatoire . Faite attention cependant a la table waypoints qui a une id limite max inférieure a la table waypoint_data

- en 2eme je vais déplacer mon perso et a chaque commande .WP ADD l'id_choisis créer un point de passage .


A ce niveau la vous avez donc votre chemin enregistré dans la table waypoint_data , pour la suite il ne vous reste qu'a choisir la 1ere ou la 2eme méthode .



1ere méthode avec la table waypoint_data en détail

Afin d'affecter ce parcours a un PNJ il faut  :
- Si vous voulez passer par l'interface du jeu (apres avoir crée un chemin avec .WP ADD l'id_choisis):
  • Taper en premier la commande .wp reload idchoisis123 afin de recharger ce parcours en mémoire .
  •   Sélectionner un PNJ et taper la commande .wp load idchoisis123 , vous verrez alors le PNJ ce déplacer , l'affectation est sauvegardé dans la DB.
- Si vous désirez passer par la DB :
  • Éditer la table créature_addon et entrer idchoisis123 dans la case path_id . (et non creature_template_addon sinon vous affecterez tous les pnj de meme id).
Citation :INSERT INTO `creature_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES

(43341, idchoisis123, 0, 0, 1, 0, '');
A noter (qui n'a rien a voir avec le déplacement):
  • la case mount qui permet de d'avoir son PNJ sur une monture si l'on renseigne avec un DisplayId
  • emote qui permet par exemple qu'un bucheron ne soit pas statique devant un arbre mais le frappe de sa hache .
  • auras qui permet de coller un spell a ce PNJ comme une forme d'ombre , un effet entouré de flamme , une invisibilité etc . vous pouvez en affecter plusieurs a condition de les séparer d'un espace .
Pour régler certaines actions aux passages sur les " point de passage " il vous faudra éditer dans la DB dans la table waypoint_data .

Citation :INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
(idchoisi123, 5, 6743.03, -7551.57, 126.327, 0, 1200000, 0, 0, 100, 0);
  • id correspond au idchoisis123 
  • point correspond au n° de point de passage , ils doivent ce suivre sans trou entre 2 . A ce sujet il est bon afin d’éviter certains problèmes de réorganiser cette table quand on a tout fini avec la commande sql ALTER TABLE `waypoint_data` ORDER BY `id`,`point`; afin justement de ne pas avoir de " faux " trou entre 2;
  • delay exprimé en milli seconde permet de faire une pause sur ce point
  • move_type mis a 1 permet de courir a partir de ce point de passage , 0 de marcher


2eme méthode (SmartAI) : la table waypoint en détail

Dans un premier temps puisque le chemin a été crée dans la table waypoint_data par la commande .wp add idchoisis123 , il faudra la convertir .
Citation :La table waypoint_data :
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
(idchoisis123, 5, 6743.03, -7551.57, 126.327, 0, 1200000, 0, 0, 100, 0);
---> vers
Citation :La table waypoints :
INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
(idchoisis123, 1, -10616.7, -1150.73, 28.0361, 'Gavin Gnarltree');

Il suffit de récupérer le début de la commande par copier/coller INSERT INTO et ensuite de remplacer les données en rouges .
Faites aussi attention a la correspondance/existance dans les 2 tables de idchoisis123 et de la limitation de la table waypoint qui n'accepte pas un chiffre aussi grand que waypoint_data .



Et pour finir , le petit script SmartAi : (ici il est assez simple , c'est juste pour illuster le tuto)
Sur ce screen il est assez simple , si vous rendez une quête au PNJ (event) alors il commencera a suivre le chemin waytpoints   idchoisis123 (action) en courant (Walk/run) et ne répétera pas son parcours quand il l'aura fini (Repeat) .
L'on ne vois pas sur ce screen pour cause de fenetre trop petite : (Reactsate) pour qu'il soit passif,défensif ou agressif ni (Despawn time) pour le despawn X milli seconde après avoir fini son parcours .

La seconde ligne Id=11 quand a elle permet au PNJ de pauser son parcours en cas d'agro sur lui mème ou le joueur qui le suivrait par exemple .

[Image: wp5.jpg]
Répondre
#2
Merci pour le tuto stitchounet ^^ je vais m'amuser !!
Répondre
#3
Mais de rien Alwyn . Jolie ton avatar  Big Grin
Répondre
#4
Merci pour l'avatar  Tongue !!! non mais dit donc  Sick

J'aurais une question monsieur Smart_AI est-il possible de faire un groupe de pnj avec un Leader (OUI) mais qu'il stop à certain endroit 5 / 10 secondes pour /say genre un guide touristique qui fait une petite visite guidé :p ?!

Merci  Arrow
Répondre
#5
Sa dépend de ce que tu veux leur faire faire , les groupes avec un leadeur sa existe deja comme les gardes qui patrouillent a cheval vers le conté de l'or , perso je ne les ai jamais utilisé . Si tu veux scripter ton leader c'est possible en smartai tu lui crées son waitpoint et ensuite tu peux tester s'il a atteint un point de passage avec EVENT_WAYPOINT_REACHED (40) ou tu lui fais faire une pause avec ACTION_WP_PAUSE(54).

Sa c'est si tu veux juste agir sur le leadeur et les autres qui le suive et donc pause quand il pause . si tu veux les faire interagir entre eux sa va etre plus compliqué .

- dabord il te faudra passer par un SCRIPT_TYPE_TIMED_ACTIONLIST plutot que par un SCRIPT_TYPE_CREATURE , meme si tu le lances du leadeur , par exemple s'il suivent le leadeur comme des mouton mais certains parlent ou tienne une conversation . SCRIPT_TYPE_CREATURE n'agit principalement que sur le lanceur mais bug pour commander ces cibles .

- ensuite il y a le probleme des follow , en general quand ils sont interrompu par un mouvement programmé ils ne repartent pas automatiquement , sauf si tu les force par exemple par ACTION_FOLLOW (29) au leadeur . Par exemple du veux qu un des touristes aille voir un truc pendant que les autres pause .

ensuite plus tu va faire interagir de pnj et plus sa sa compliquer grave .

Edit : j'ai pas compris l'histoire de l'avatar , depuis la maj sa semble buguer , perso je n'arrive plus a le changer.
Répondre
#6
Oki je te remercie je vais essayer cela Smile

ps : l'avatar c'est parce-que tu m'avais mis un mec édentée ^^
Répondre


Atteindre :


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