2.0 Bot Chasses au Trésor et maps bloquantes

Inscrit
6 Mai 2020
Messages
10
Reactions
1
#1
Bonjour à tous !

Je suis relativement nouveau sur Cadernis et je suis encore un très grand novice dans l'art du boting. J'ai sillonné les forums depuis 2 mois afin d'apprendre à créer un bot capable de faire des chasses au trésor, et j'ai finalement réussi à créer un bot fonctionnel sous Python. Ce bot me permet de réaliser des chasses complètes, sauf les combats que je fais manuellement pour l'instant.

Mon bot se base sur le sniffer labot (merci à lui) qui me permet, en recevant les messages d'information de Map et de Hunt, de gérer les positions des indices suivants grâce à l'API de Dofus-Map, et j'utilise pyautogui afin de simuler des clics pour les changements de map et les validation d'indices.


Je me heurte actuellement à un soucis à propos des changements de maps. En effet, certaines maps sont divisées en deux parties, soit par une rivière, soit par des dénivelés, etc, une image vaut mieux que milles mots : map_screen.png

Sur cette map, mon personnage est en bas à droite, mais imaginons que le bot clique sur le milieu de l'écran pour descendre, ainsi le curseur est positionné à gauche, et le changement de map ne se fait pas.

J'aimerais avoir vos avis et vos idées sur comment je pourrais résoudre ce problème, c'est à dire savoir où doit cliquer mon bot afin qu'il puisse change de map sans soucis.

J'ai remarqué que lorsque l'on change de map, le message ChangeMapMessage (id 221) envoyé par mon client au serveur contient un paramètre "autopilot" qui est à False par défaut, et mis à True si le changement de map est causé par une dragodinde autopilotée (j'en possède une). Ainsi, une dragodinde ne sera jamais bloquée par une map de ce type.

J'ai pensé à ajouter au cas par cas, pour les maps qui posent problème, une fonction qui fait changer de map grâce à la dragodinde autopilotée, ou alors faire cliquer le bot aux différents endroits possibles afin d'être sûr que d'une manière ou d'une autre, il puisse change de map, mais je trouve que ces deux façons de faire sont très rustiques et malpropres.

De plus, je me doute qu'il serait possible via MIMT de simuler un message du client pour changer de map en mettant manuellement le paramètre autopilot à True, mais comme je suis novice dans l'utilisation de bots et que je ne connais pas très bien les risques liés à l'utilisation de MIMT, j'ai un peu peur d'utiliser cette technologie.

Avez vous des suggestions ? Serait-il possible par exemple de trouver l'identifiant des cases permettant de changer de map suivant celle où se trouve mon personnage ?

Si mon message n'est pas clair ou manque d'informations, n'hésitez pas à me poser des questions !

Merci d'avance à ceux qui me liront !
 
Inscrit
3 Mai 2020
Messages
40
Reactions
14
#2
Je commence tout juste à regarder le pathfinding dans mon propre bot. Mais je dirai que tu as besoin de connaître ta mapId, ton cellId et tu devra te servir des fichiers d2p pour savoir où cliquer sur la map pour pas être bloqué.

Je laisse d'autres membres confirmer ou non ce que je viens de te dire
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#3
Tu dois construire un WorldPathfinding si tu souhaites ajouter la chasse au trésor car il arrive que ton bot doit contourner des obstacles etc etc. Bonne chance

(Commence par lire les fichiers d2p qui contiennent les informations de chaque map Dofus.)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
Sachant que les maps ids sont faussés lorsque tu changes d'area pour éviter justement les WorldPathfinder.
 
Inscrit
6 Mai 2020
Messages
10
Reactions
1
#5
Je commence tout juste à regarder le pathfinding dans mon propre bot. Mais je dirai que tu as besoin de connaître ta mapId, ton cellId et tu devra te servir des fichiers d2p pour savoir où cliquer sur la map pour pas être bloqué.

Je laisse d'autres membres confirmer ou non ce que je viens de te dire
D'accord, alors en effet le mapId et le cellId je les ai facilement actuellement, ce qui va être compliqué c'est de connaître les cases sur lesquelles cliquer grâce aux fichiers d2p ?

Tu dois construire un WorldPathfinding si tu souhaites ajouter la chasse au trésor car il arrive que ton bot doit contourner des obstacles etc etc. Bonne chance

(Commence par lire les fichiers d2p qui contiennent les informations de chaque map Dofus.)
Oui en effet, j'ai déjà eu ce problème mais ça a du m'arriver 2 ou 3 fois sur 1000 chasses, donc je ferrai du WorldPathfinding pour peaufiner à la fin ^^

Sachant que les maps ids sont faussés lorsque tu changes d'area pour éviter justement les WorldPathfinder.
C'est à dire ? Parce que j'ai récupéré un dictionnaire je ne sais plus où dans lequel est stocké les coordonnées x et y de chaque mapId et ça fonctionne sans soucis !
 
Dernière édition:

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#6
Ah bah top, oui tu as ouvert le .ele ?
Je ne sais pas ou sont stoqués les coords / x / y,
sachant que ta plusieurs niveau pour les mêmes coordonnées.
 
Inscrit
6 Mai 2020
Messages
10
Reactions
1
#7
Ah bah top, oui tu as ouvert le .ele ?
Je ne sais pas ou sont stoqués les coords / x / y,
sachant que ta plusieurs niveau pour les mêmes coordonnées.
Non, pas du tout, j'ai trouvé ce dictionnaire sur internet, je ne sais plus qui l'a posté, je vais essayer de retrouver où je l'ai eu, mais il regroupe les informations de chaque map, avec son subAreaId, son mapId, ses coordonnées, etc etc, et donc j'en ai extrait les données qui m'intéressaient.
Et les niveaux sont gérés par le fait que le mapId est différent je pense (par exemple, une map dans la jungle obscure ou la map à la même pos mais dans le village de la canopée auront un mapId différents, mais dans le dictionnaire dont je dispose, les coordonnées sont les mêmes).
Ce fichier doit être trouvable dans les sources mais je vous avoue que j'ai pas trop regardé les sources encore, ça reste un peu obscure pour moi !

Edit : Voici le .json en question : https://github.com/CarlCochet/DofusFight/blob/master/data/MapPositions.json
Merci donc à CarlCochet !
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#8
Ya les D2o avec MapCoordinates,
Mais l'idée c'est dêtre cappable de savoir si une map est atteignable à l'avance, si tu as la mauvaise mapId ca foire tout pour les mapData.
À tester.
 
Inscrit
2 Juin 2020
Messages
57
Reactions
32
#9
Dans le code source c'est la classe com.ank,,,games.dof,,.modules.utils.pathfinding.world.WorldPathFinder qui s'occupe de l'autopilotage et qui semble gérer ces cas là (d'après ce que j'ai vu en essayant dans le labyrinthe).
 
Inscrit
6 Mai 2020
Messages
10
Reactions
1
#10
Dans le code source c'est la classe com.ank,,,games.dof,,.modules.utils.pathfinding.world.WorldPathFinder qui s'occupe de l'autopilotage et qui semble gérer ces cas là (d'après ce que j'ai vu en essayant dans le labyrinthe).
Merci, je suis en train de regarder cette classe mais j'avoue que j'ai un petit peu de mal à remonter le code. Tu penses que je peux trouver comment Dofus gère les changements de Maps en trouvant une cellule qui convient sur cette class ?
 
Inscrit
2 Juin 2020
Messages
57
Reactions
32
#11
Mon message est à prendre au conditionnel, je n'ai pas eu l'occasion d'essayer pour vérifier mais j'ai lu le code et je crois comprendre le fonctionnement.

Les étapes :

1) Le jeu va calculer le pathfinding en fonction de donnée déjà existante, sous forme de class Transition, les Transition sont contenus dans les Edge (voir l'initialisation de la class WorldGraph). Le pathfinding va s'intéresser à l’existence des Transition pour définir un parcours (= un dictionnaire d'id de map).

2) Une fois le parcours obtenu, le jeu va s'intéresser au contenu de la carte pour "cliquer"/se déplacer au bon endroit (comme un pixel bot). Pour en savoir plus, tu peux regarder : getClosestTransitionCellId de MountAutoTripManager.

----------

Pour l'étape 1 :

Quand on regarde la fonction Astar.compute, les fonctions de collision utilisées (= c'est-à-dire savoir si le déplacement est possible) sont :
JavaScript:
  if(hasValidTransition(edge))
  {
    if(hasValidDestinationSubarea(edge))
    {
Par leur nom, je suppose que c'est hasValidTransition qui nous intéresse.

J'ai regardé le reste du code, il ne calcule pas à chaque fois les changements de map en regardant chaque cellule, c'est sauvegardé dans un fichier. Il charge des données à partir de <entry key="data.pathFinding">[config.content.path]maps/worldgraph.bin</entry>, et ils obtiennent une série d'élément : Vertex/Transition/Edge. En regardant la class Transition :

JavaScript:
public function Transition(type:int, direction:int, skillId:int, criterion:String, transitionMapId:Number, cell:int, id:uint)
{
   super();
   this._type = type; // La classe [I]TransitionTypeEnum [/I]t'indique les types disponibles : SCROLL, SCROLL_ACTION, MAP_EVENT, MAP_ACTION, MAP_OBSTACLE, INTERACTIVE, NPC_ACTION, UNSPECIFIED.
   this._direction = direction;
   this._skillId = skillId;
   this._criterion = criterion;
   this._transitionMapId = transitionMapId;
   this._cell = cell; // si -1 c'est toute la bordure qui sera utilisable
   this._id = id;
}
// qu'on peur lire ainsi :
public function toString() : String
{
   return "Transition{_type=" + String(this._type) + ",_direction=" + String(this._direction) + ",_skillId=" + String(this._skillId) + ",_criterion=" + String(this._criterion) + ",_transitionMapId=" + String(this._transitionMapId) + ",_cell=" + String(this._cell) + ",_id=" + String(this._id) + "}";
}
L'existence de l'élément Transition indique que tu vas pouvoir transiter/aller d'une carte à une autre, à condition que criterion soit respecté.

Voila j'espère que je t'ai aidé. :)
 
Inscrit
26 Janvier 2016
Messages
99
Reactions
34
#12
Limite j'ai envie de pouce rouge tellement tu mâches le travail !!
Merci à toi , pour lui du coup :')
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#14
C'est de l'ironie :p
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#15
Wesh claudine, comme l'impression que tu n'es pas si nouveau ahhah
 
Inscrit
2 Juin 2020
Messages
57
Reactions
32
#16
Wesh claudine, comme l'impression que tu n'es pas si nouveau ahhah
Je ne veux pas casser tes fantasmes mais je ne suis que moi, j'ai découvert le forum la semaine dernière d'après mon historique le 29 mai, après une recherche "dofus wireshark", j'ai trouvé le site en 2ème résultat google. J'ai eu quelques soucis à trouver un pseudo valide, et j'ai voulu contacter un admin/modo face à ce problème, sans résultat, au final j'ai attendu quelques jours avant de me réinscrire.
 
Inscrit
2 Juin 2020
Messages
57
Reactions
32
#18
Vous êtes bizarre ou vous poussez le troll très loin.

EDIT : Après, pour une première inscription je n'aurais peut-être pas dû prendre le premier pseudo que j'ai trouvé sur le forum dofus, j'estime donc avoir une part de tord dans cette affaire. Mais je ne vais pas utiliser mes pseudos habituels sachant que je contribue beaucoup à des projets Open-Source, et que faire un sniffer contraire au CGU serait très mal vu dans le milieu/communauté.
 
Dernière édition:

Arth

Contributeur
Inscrit
28 Aout 2016
Messages
80
Reactions
3
#19
J'ai envie de dire peu importe que la personne soit nouvelle ou non. Juste profitez des réponses construites, pertinentes et cordiales. C'est pas utile de se prendre la tête avec ça, au pire on retourne dans une spirale infernal et au mieux vous faites sentir mal une nouvelle personne dans la communauté.

Bref, désolé c'est hors sujet avec le topic.
 
Dernière édition:
Inscrit
6 Mai 2020
Messages
10
Reactions
1
#20
Mon message est à prendre au conditionnel, je n'ai pas eu l'occasion d'essayer pour vérifier mais j'ai lu le code et je crois comprendre le fonctionnement.

Les étapes :

1) Le jeu va calculer le pathfinding en fonction de donnée déjà existante, sous forme de class Transition, les Transition sont contenus dans les Edge (voir l'initialisation de la class WorldGraph). Le pathfinding va s'intéresser à l’existence des Transition pour définir un parcours (= un dictionnaire d'id de map).

2) Une fois le parcours obtenu, le jeu va s'intéresser au contenu de la carte pour "cliquer"/se déplacer au bon endroit (comme un pixel bot). Pour en savoir plus, tu peux regarder : getClosestTransitionCellId de MountAutoTripManager.

----------

Pour l'étape 1 :

Quand on regarde la fonction Astar.compute, les fonctions de collision utilisées (= c'est-à-dire savoir si le déplacement est possible) sont :
JavaScript:
  if(hasValidTransition(edge))
  {
    if(hasValidDestinationSubarea(edge))
    {
Par leur nom, je suppose que c'est hasValidTransition qui nous intéresse.

J'ai regardé le reste du code, il ne calcule pas à chaque fois les changements de map en regardant chaque cellule, c'est sauvegardé dans un fichier. Il charge des données à partir de <entry key="data.pathFinding">[config.content.path]maps/worldgraph.bin</entry>, et ils obtiennent une série d'élément : Vertex/Transition/Edge. En regardant la class Transition :

JavaScript:
public function Transition(type:int, direction:int, skillId:int, criterion:String, transitionMapId:Number, cell:int, id:uint)
{
   super();
   this._type = type; // La classe [I]TransitionTypeEnum [/I]t'indique les types disponibles : SCROLL, SCROLL_ACTION, MAP_EVENT, MAP_ACTION, MAP_OBSTACLE, INTERACTIVE, NPC_ACTION, UNSPECIFIED.
   this._direction = direction;
   this._skillId = skillId;
   this._criterion = criterion;
   this._transitionMapId = transitionMapId;
   this._cell = cell; // si -1 c'est toute la bordure qui sera utilisable
   this._id = id;
}
// qu'on peur lire ainsi :
public function toString() : String
{
   return "Transition{_type=" + String(this._type) + ",_direction=" + String(this._direction) + ",_skillId=" + String(this._skillId) + ",_criterion=" + String(this._criterion) + ",_transitionMapId=" + String(this._transitionMapId) + ",_cell=" + String(this._cell) + ",_id=" + String(this._id) + "}";
}
L'existence de l'élément Transition indique que tu vas pouvoir transiter/aller d'une carte à une autre, à condition que criterion soit respecté.

Voila j'espère que je t'ai aidé. :)
Wow, c'est ce que j'appelle du travail mâché, en effet ! Merci beaucoup pour tes efforts de recherche et ton partage ! Je vais m'y intéresser plus en détail quand j'aurais un moment, merci encore ! :)

Et merci à tous les autres aussi, en effet je ne pensais pas qu'une petit newbie sans présentation aurait autant d'aide ! :D
 
Haut Bas