Bonsoir / Bonjour à tous, je suis un développeur non professionnel, et je m'arrache les cheveux depuis plusieurs jours sur la lecture des paquets de Dofus 2,
Je m'explique, j'ai lu à peu près 4 fois tout les tutoriels sur le sujet que ce Forum propose, même s'il date un peu j'imagine que la structure des paquets n'a pas changé drastiquement depuis mais bon.
Bref, je suis les tutos, mais malheureusement, là ou je devrais récuperer l'id du paquet par exemple je récupère toujours exactement la même chose (Soit -2911 ou 1388)
Peu importe l'action que je fais en jeu (Je précise que je sniffe simplement les paquets provenant du port "5555" ou dont le port de destination est "5555")
Voilà le code exact que j'ai
J'explique :
- Je récupère un packet
- Je le "cast" en packet TCP
- Je vérifie le SourcePort et le DestinationPort du paquet
- Je mets les bytes du paquet dans un MemoryStream pour me permettre de les "traduire" (packetDatas est un byte[] qui contient tcp.Bytes (Ou les bytes du paquet))
- Je "traduis" le packet en Int16 (2 bytes)
- Je cast mon packet ID en Short en décallant le bit de 2
- Je cast le lenType
Donc..
Après ça, je ne comprends pas pourquoi ça ne fonctionne pas, alors je vais bidouiller les sources du jeu à la recherche de plus amples ressources pour me défaire de ce problème..
Et je regarde le Packet "HelloGameMessage" (com.ankamagames.dofus.network.messages.approach) car je le trouve assez simple, donc c'est lui que j'ai décidé d'étudier.
Je vois dedans qu'il y'a une fonction Pack qui ne renvoie rien (Je ne fais pas d'AS3 mais j'arrive quand même à comprendre les grandes lignes)
Je vois que cette fonction Pack prends en paramètre une "variable" ? nommée "Output" qui est de type ICustomDataOutput (Si je ne dis pas de bétise, c'est une interface de ce que j'ai cru comprendre)
Puis dans le corps de la fonction :
- Création d'un byteArray (Tableau de byte) vide nommé "data"
- Un appel à la fonction "serialize" qui ne renvoie rien, dont les corps semble être vide mais qui prends un ICustomDataOutput en paramètre, l'appel ce fait comme ceci : this.serialize(new CustomDataWrapper(data));
Alors je regarde cette fameuse classe, le constructeur super(); vers nulle part (J'avoue que je comprends pas, puis-ce que les seuls choses qu'il implement sont des interface qui ne contiennent pas de constructeur (ICustomDataInput, ICustomDataOutput)) Bref.
- Et un appel à writePacket(output, this.getMessageId(), data) //getMessageId() renvoi protocolId (5556); donc l'ID du packet
J'en deduis donc que ça va me servir, je passe quelques minutes à analyser la classe, et je finis par comprendre le pourquoi du comment je code ces lignes dans mon "bot", malheureusement, je n'arrive pas à comprendre pourquoi je ne récupère pas l'ID du paquet mais soit -2911 ou 1388, aucune idée
Voilà pourquoi je poste, si quelqu'un à une idée pour m'aider un peu je vous remercie, bonne soirée à tous
Je m'explique, j'ai lu à peu près 4 fois tout les tutoriels sur le sujet que ce Forum propose, même s'il date un peu j'imagine que la structure des paquets n'a pas changé drastiquement depuis mais bon.
Bref, je suis les tutos, mais malheureusement, là ou je devrais récuperer l'id du paquet par exemple je récupère toujours exactement la même chose (Soit -2911 ou 1388)
Peu importe l'action que je fais en jeu (Je précise que je sniffe simplement les paquets provenant du port "5555" ou dont le port de destination est "5555")
Voilà le code exact que j'ai
J'explique :
- Je récupère un packet
- Je le "cast" en packet TCP
- Je vérifie le SourcePort et le DestinationPort du paquet
- Je mets les bytes du paquet dans un MemoryStream pour me permettre de les "traduire" (packetDatas est un byte[] qui contient tcp.Bytes (Ou les bytes du paquet))
- Je "traduis" le packet en Int16 (2 bytes)
- Je cast mon packet ID en Short en décallant le bit de 2
- Je cast le lenType
Donc..
Après ça, je ne comprends pas pourquoi ça ne fonctionne pas, alors je vais bidouiller les sources du jeu à la recherche de plus amples ressources pour me défaire de ce problème..
Et je regarde le Packet "HelloGameMessage" (com.ankamagames.dofus.network.messages.approach) car je le trouve assez simple, donc c'est lui que j'ai décidé d'étudier.
Je vois dedans qu'il y'a une fonction Pack qui ne renvoie rien (Je ne fais pas d'AS3 mais j'arrive quand même à comprendre les grandes lignes)
Je vois que cette fonction Pack prends en paramètre une "variable" ? nommée "Output" qui est de type ICustomDataOutput (Si je ne dis pas de bétise, c'est une interface de ce que j'ai cru comprendre)
Puis dans le corps de la fonction :
- Création d'un byteArray (Tableau de byte) vide nommé "data"
- Un appel à la fonction "serialize" qui ne renvoie rien, dont les corps semble être vide mais qui prends un ICustomDataOutput en paramètre, l'appel ce fait comme ceci : this.serialize(new CustomDataWrapper(data));
Alors je regarde cette fameuse classe, le constructeur super(); vers nulle part (J'avoue que je comprends pas, puis-ce que les seuls choses qu'il implement sont des interface qui ne contiennent pas de constructeur (ICustomDataInput, ICustomDataOutput)) Bref.
- Et un appel à writePacket(output, this.getMessageId(), data) //getMessageId() renvoi protocolId (5556); donc l'ID du packet
J'en deduis donc que ça va me servir, je passe quelques minutes à analyser la classe, et je finis par comprendre le pourquoi du comment je code ces lignes dans mon "bot", malheureusement, je n'arrive pas à comprendre pourquoi je ne récupère pas l'ID du paquet mais soit -2911 ou 1388, aucune idée
Voilà pourquoi je poste, si quelqu'un à une idée pour m'aider un peu je vous remercie, bonne soirée à tous