C'est de l'ironie :P
Bot Chasses au Trésor et maps bloquantes
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.
On sait tous qui tu es "l'ami" :)
- Modifié
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é.
- Modifié
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.
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 :
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
, et ils obtiennent une série d'élément : Vertex/Transition/Edge. En regardant la class Transition :<entry key="data.pathFinding">[config.content.path]maps/worldgraph.bin</entry>
public function Transition(type:int, direction:int, skillId:int, criterion:String, transitionMapId:Number, cell:int, id:uint) { super(); this._type = type; // La classe TransitionTypeEnum 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
Ya pas de newbie, certains sont nouveaux sur le forum mais déjà très expérimentés dans le domaine.
- Modifié
Bonsoir à tous,
Je souhaite vous remercier tous encore une fois pour votre aide !
J'ai réussi en récupérant les .d2p des maps à extraire les .json et ainsi implémenter un algorithme A* (je ne sais pas si c'est le plus conseillé, mais peu importe pour le moment) qui me permet de trouver le chemin jusqu'à une cellule cible, ou à défaut, une cellule qui me permet d'effectuer le changement de map voulu (grâce à son paramètre ChangeMapData).
Le seul problème auquel je me heurte encore est qu'il faut que je connaisse le CellID de mon personnage afin de savoir d'où il part. J'ai remarqué que dans le MapComplementaryInformationDataMessage, chaque entité est caractérisée notamment par le CellID de la cellule où elle se trouve. Cependant, sauf erreur de ma part, la seule façon de savoir de quelle entité il s'agit est par son nom, or j'aimerais ne pas coder en dur le nom de mon personnage dans mon programme.
Sauriez-vous si je peux savoir d'une autre façon si une entité est la mienne, ou alors si le CellId de mon personnage est contenu dans un autre message (j'ai regardé et je n'ai pas l'impression que ce soit le cas), ou encore si je peux récupérer le pseudo de mon personnage à n'importe quel moment (le bot n'est pas forcément déjà lancé au démarrage de mon jeu) ?
Merci encore pour ceux qui prennent le temps de me lire, et je vous souhaite une bonne soirée ! :)
Salut !
Dans le
IdentificationSuccessMessage
tu peux récupérer ton accountId
qui te permettra de retrouver ton perso dans le tableaux d'actors
du message MapComplementaryInformationsDataMessage
.
Salut !
Dans le
tu peux récupérer tonIdentificationSuccessMessage
qui te permettra de retrouver ton perso dans le tableaux d'accountId
du messageactors
.MapComplementaryInformationsDataMessage
Bonjour, merci pour ta réponse.
Si j'en crois le nom du message
IdentificationSuccessMessage
, il est envoyé à la connexion du compte ?Comme je l'ai dit, le programme n'est pas forcément déjà lancé quand je me connecte, il arrive que je lance le bot après la connexion du personnage pour une quelconque raison. N'y a-t-il pas d'autre façon d'obtenir mon
acoountId
?
Bonjour, merci pour ta réponse.
Si j'en crois le nom du message
, il est envoyé à la connexion du compte ?IdentificationSuccessMessage
Comme je l'ai dit, le programme n'est pas forcément déjà lancé quand je me connecte, il arrive que je lance le bot après la connexion du personnage pour une quelconque raison. N'y a-t-il pas d'autre façon d'obtenir mon
?acoountId
Je crois que c est la seule façon "Propre" d'associer un actorId à un compte.
Sinon au moment ou tu lances ton bot , il bouge 2 fois de map et si tu matches 2 fois le même actor id tu peux associer ce compte à un actorId ...
C est pas full propre + si quelqu'un fait le même mouvement au même moment c est pas ouf , mais c est une idée à toi de choisir ta méthode.
Je crois que c est la seule façon "Propre" d'associer un actorId à un compte.
Sinon au moment ou tu lances ton bot , il bouge 2 fois de map et si tu matches 2 fois le même actor id tu peux associer ce compte à un actorId ...
C est pas full propre + si quelqu'un fait le même mouvement au même moment c est pas ouf , mais c est une idée à toi de choisir ta méthode.
D'accord, merci, je vais y réfléchir alors ! Pourquoi pas ouvrir mon Have-sac du coup, je serai seul dedans :)
D'accord, merci, je vais y réfléchir alors ! Pourquoi pas ouvrir mon Have-sac du coup, je serai seul dedans :)
ah ouai ptet mieux xd
J'ais réalisé un bot similaire a part la partie des donnees dans laquel j'utilise une librairy de reconnaissance de text pour detecter la pos actuelle et la prochaine indice.
Pour le trajet, y'as une idee que j'ai implementer, c'est d'avoir une dd autopilité et utiliser la commande /travel x,y
Ceci facilitra la tache
J'ais réalisé un bot similaire a part la partie des donnees dans laquel j'utilise une librairy de reconnaissance de text pour detecter la pos actuelle et la prochaine indice.
Pour le trajet, y'as une idee que j'ai implementer, c'est d'avoir une dd autopilité et utiliser la commande /travel x,y
Ceci facilitra la tache
Oui j'y ai pensé, mais le soucis c'est que si tu fais ça pour chaque map, j'ai peur qu'à force de spammer la commande, je finisse par me faire cramer ^^'
Du coup je l'utilise seulement du Zaap jusqu'à la pos de départ de la chasse, et pour le reste, le programme simule des clics sur les différentes maps.
Le /travel n'est pas géré par le client ?
Je rebondis par rapport au World Path Finder, j'ai passé pas mal de temps à en construire un (commencé avant que les DD autopilotées arrivent) et je suis arrivé à quelque chose de respectable bien que le périmètre du truc ait ses limites.
C'est pas mal galère d'en avoir un qui prend en compte tous les détails du jeu et qui reste performant.
Il sait :
- Calculer un chemin pertinent entre deux maps, avec en option les cellules de départ et d'arrivée
- Gérer les maps séparées en plusieurs parties qui ne communiquent pas (en gros le problème principal de l'OP)
- Gérer certains changements de maps particuliers, du style cliquer sur un activable pour changer de map, ou les cases qui te TP direct
- Utiliser les Zaaps pour se rapprocher puis finir à pied
- Faire ça de manière à peu près performante (~1 seconde dans le pire des cas où il faut calculer un chemin de Brak à Bonta sans zaaps)
Il sait pas :
- Gérer tous les changements de worldmap, surtout les sous-terrains.
- Il y a des coords un peu galères où il y a plusieurs maps sur le même worldmap, et j'ai pas de solution implémentée pour le moment.
Je me disais que peut-être il y aurait un intérêt pour le forum que je package ça dans une API et que je la mette à dispo.
Hésitez pas à faire signe si ça vous intéresse, je pourrais me chauffer et le publier rapidement (en fonction de mes dispos) si il y a de la demande.