Java Compréhension des packets [Dofus 2]

Inscrit
19 Mars 2017
Messages
10
Reactions
0
#1
Bonsoir à tous,

Je suis nouveau dans la création de bot, et pour le moment je me concentre sur les choses les plus basiques.
Cependant mon plus gros problème reste la compréhension des packets et comment les analyser avec le code dé-compiler de dofus.
Je ne sais pas si c'est clair donc je vais donner un exemple :

J'ai réussi donc à réceptionner les packets de dofus en Java et à determiner son ID et la taille du message.
Cependant à partir d'ici je bloque, je ne vois pas comment attribuer les valeurs au code dé-compiler. J'ai lu les tutos de @Labo et @bouh2 mais je n'arrive toujours pas à comprendre.

En exemple je reçois ce packet là :
65 01 0b 91 36 b4 1b 00 00 03 e3 05 00 00 02 c0

J'ai donc l'ID : 6464 et la taille : 11 octets.
Maintenant je prends la fonction "deserialize" qui correspond : (Si j'ai bien compris)

public function deserializeAs_ExchangeBidPriceForSellerMessage(param1:ICustomDataInput) : void
{
var _loc4_:Number = NaN;
super.deserialize(param1);
this._allIdenticalFunc(param1);
var _loc2_:uint = param1.readUnsignedShort();
var _loc3_:uint = 0;
while(_loc3_ < _loc2_)
{
_loc4_ = param1.readVarUhLong();
if(_loc4_ < 0 || _loc4_ > 9007199254740990)
{
throw new Error("Forbidden value (" + _loc4_ + ") on elements of minimalPrices.");
}
this.minimalPrices.push(_loc4_);
_loc3_++;
}
}

Et c'est à ce moment là que je ne vois pas comment faire, ça me parait un peu clair sur les tutos de @Labo, mais là je ne vois pas.
Donc je me demandais si quelqu'un pouvait m'expliquer, avec un exemple pourquoi pas, comment faire le lien entre la fonction et le packet.

Merci beaucoup,
Bonne soirée !
 
Inscrit
18 Février 2015
Messages
228
Reactions
7
#2
Pour trouver ton packet tu peux jouer avec la reflection et mettre un id à tout tes packets tu les ajoute alors dans un Array et quand un packet t'arrive tu regarde si tu le trouve dans ton tableau

Je viens de commenter le code que tu as posté pour que tu t'y retrouve mieux.

Java:
public function deserializeAs_ExchangeBidPriceForSellerMessage(param1:ICustomDataInput) : void
      {
         var _loc4_:Number = NaN;
         super.deserialize(param1); //retourne vers la fonction deserialize se trouvant dans la classe mère en passant comme paramètre ton reader

         this._allIdenticalFunc(param1);// Ici j'ai juste une lecture d'un boolean mais il passe par une fonction pour faire cette lecture

         var _loc2_:uint = param1.readUnsignedShort();// Lecture d'un unsigned short (comme tu le code en java garde en short et met une condition dessus pour éviter d'être en dessous de 0) en gros c'est la taille d'un tableau voilà pourquoi elle doit être unsigned.

         var _loc3_:uint = 0;// initialisation de ta variable pour ta boucle

         while(_loc3_ < _loc2_) // ici tu va lire tant que ta variable loc3 ne soit pas plus grande que la taille de ton tableau
         {
            _loc4_ = param1.readVarUhLong();// Lecture d'un unsigned long pour tes prix /!\ Ici toute les fonctions contenant un Var en début de leur nom est une fonction créer par Ankama /!\

            if(_loc4_ < 0 || _loc4_ > 9007199254740990) //vérification qu'elle se trouve bien dans cette tranche sinon ça retourne une erreur.
            {
               throw new Error("Forbidden value (" + _loc4_ + ") on elements of minimalPrices."); // le throw te permet d'arrêter une fonction et de retourner une erreur qui s'affichera dans ton try catch
            }
            this.minimalPrices.push(_loc4_); // là c'est un ajout dans une  ? liste / Array ?

            _loc3_++;// ici on avance pour éviter de faire une boucle infinie
         }
      }

Sinon pour avoir les fonctions de lecture et d'écriture tu as un fichier CustomDataWrapper qui regroupe toute les reader et writer dont tu as besoin ;)
 
Inscrit
19 Mars 2017
Messages
10
Reactions
0
#3
Merci de ta réponse.
J'ai plutôt bien compris les fonctions présente dans le code, je connais un peu le langage et la programmation.
Mais c'est plutôt le lien avec le packet que j'ai reçu que je n'arrive pas à faire, je veux dire par ici que à part l'ID et la taille je ne vois pas comment me servir du reste des donnés. :D
J'ai utilisé le sniffer de @BlueDream et normalement je devrais pouvoir récupérer le prix de vente de l'item, ainsi que d'autres informations, mais je reste bloqué. Pourtant je comprends bien le code que j'ai cité au dessus (encore mieux avec tes explications).

Bonne journée. :)
 
Inscrit
18 Février 2015
Messages
228
Reactions
7
#4
Merci de ta réponse.
J'ai plutôt bien compris les fonctions présente dans le code, je connais un peu le langage et la programmation.
Mais c'est plutôt le lien avec le packet que j'ai reçu que je n'arrive pas à faire, je veux dire par ici que à part l'ID et la taille je ne vois pas comment me servir du reste des donnés. :D
J'ai utilisé le sniffer de @BlueDream et normalement je devrais pouvoir récupérer le prix de vente de l'item, ainsi que d'autres informations, mais je reste bloqué. Pourtant je comprends bien le code que j'ai cité au dessus (encore mieux avec tes explications).

Bonne journée. :)
moi je te conseille de faire une class = un packet et de lui attribuer son id et grâce à la reflection tu mappe tes packets que tu va regrouper dans un tableau ^^
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#5
Ca fait plaisir de voir que mon tuto est lu !
Je valide tout ce que @Fallen a dit (mais je crois que le code est de l'AS3, pas du Java).

Il y a eu quelques évolutions sur les méthodes appelées (du genre _allIdenticalFunc que je me souviens pas avoir lu quelque part), mais globalement le schéma est le même.
Essaye de comprendre le paquet "à la main" en lisant toi-même les données. Pour les types de base, tu peux utiliser un code comme les fonctions read d'ici : https://github.com/louisabraham/LaBot-Tools/blob/master/core/data/binrw.py
Ca ne devrait pas être difficile de traduire ça en Java.
Si tu ne connais pas une fonction, essaye de chercher sa définition dans le code, et si elle n'y est pas, tape son nom sur internet, c'est sûrement un builtin.
 
Inscrit
18 Février 2015
Messages
228
Reactions
7
#6
Ca fait plaisir de voir que mon tuto est lu !
Je valide tout ce que @Fallen a dit (mais je crois que le code est de l'AS3, pas du Java).

Il y a eu quelques évolutions sur les méthodes appelées (du genre _allIdenticalFunc que je me souviens pas avoir lu quelque part), mais globalement le schéma est le même.
Essaye de comprendre le paquet "à la main" en lisant toi-même les données. Pour les types de base, tu peux utiliser un code comme les fonctions read d'ici : https://github.com/louisabraham/LaBot-Tools/blob/master/core/data/binrw.py
Ca ne devrait pas être difficile de traduire ça en Java.
Si tu ne connais pas une fonction, essaye de chercher sa définition dans le code, et si elle n'y est pas, tape son nom sur internet, c'est sûrement un builtin.
Oui j'ai mis la coloration synthaxique Java car je trouvais pas celle pour l'Action script x)
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#7
@BlueDream il y a deux fois JS dans les langages aussi, mais que fait la police ?
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#8
Oulala je m'en vais fixer ça immédiatement.

Edit: C'est fait ! Le temps que le cache se mette à jour :p

Langage ActionScript ajouté et un Javascript en trop de retiré.
 
Haut Bas