• Tutoriel
  • Comprendre le protocole de Dofus

Okok ont attend sa avec impatience merci Bouh

6 ans plus tard

On comprend mieux comment il a fait stump bouh2, un génie ce type^^

@BlueDream faudrait quand même mettre des règles pour éviter les ups de 6 ans…

On a pas énormément d'activité, on va éviter d'être trop exigeant, pour les messages inutiles, je suis d'accord.

navré, je n'avais pas fait attention à la date :-/

2 mois plus tard

Bonjour, désolé de remonter le sujet, mais je commence a m'intéresser au protocole de D2 et j'ai deux trois petites questions.

je ne vais pas poser la question des 78 a la suite, j'ai compris que c'est une erreur de frappe.

Donc si je comprend bien, le packet est construit morceaux par morceaux, dans cette exemple Bonjour puis 123 ?

Petite question aussi, le Bonjour est en majuscule dans le code d'exemple non ?

donc si je comprend bien le truc, si je le fais en java, j'ai ceci:

String str = "Bonjour";
int n = 123;
ByteBuffer buffer = ByteBuffer.allocate(Integer.SIZE + str.length() + Integer.SIZE); // allocation (Taille de l'integer pour la taille de la chaine + taille chaine + taille integer pour 123)
buffer.order(ByteOrder.BIG_ENDIANT);
buffer.putInt(str.length()); // donc 0007
buffer.put(str.getBytes());
buffer.putInt(n);
System.out.println(Arrays.toString(byteBuffer.array()));

    7 jours plus tard

    Manghao

    Bonjour, désolé de remonter le sujet, mais je commence a m'intéresser au protocole de D2 et j'ai deux trois petites questions.

    je ne vais pas poser la question des 78 a la suite, j'ai compris que c'est une erreur de frappe.

    Donc si je comprend bien, le packet est construit morceaux par morceaux, dans cette exemple Bonjour puis 123 ?

    Petite question aussi, le Bonjour est en majuscule dans le code d'exemple non ?

    donc si je comprend bien le truc, si je le fais en java, j'ai ceci:

    String str = "Bonjour";
    int n = 123;
    ByteBuffer buffer = ByteBuffer.allocate(Integer.SIZE + str.length() + Integer.SIZE); // allocation (Taille de l'integer pour la taille de la chaine + taille chaine + taille integer pour 123)
    buffer.order(ByteOrder.BIG_ENDIANT);
    buffer.putInt(str.length()); // donc 0007
    buffer.put(str.getBytes());
    buffer.putInt(n);
    System.out.println(Arrays.toString(byteBuffer.array()));
    

    Tu pourras trouver une explication plus condenser par BlueDream et moi : https://github.com/OpenDofus/wiki/blob/master/pages/Protocole-reseau.md

    Apres si c'est le header que tu veux inscrire c'est pas ça. ^^

    Short pour l'id + byte pour le type de la taille + la taille du message + les infos du packet.

    Si tu veux envoyer bonjour dans HeloConnectMessage tu dois faire : (short)(3 << 2 | 1) -> datas.Lenght -> datas

    3 mois plus tard

    Bonjour à tous.

    Tout d'abord merci Bouh2 pour cet excellent tutoriel ! Je pense que même plusieurs années après il est encore d'actualité (je me trompe?).

    J'ai une petite question quant Bouh2 dis :

    Attaquons maintenant la structure concrète d'un paquet dofus 2.0 :

    [HEADER:[HI-HEADER:2 bytes (PacketId 6 bits + LengthType 2 bits)][LENGTH:LengthType (1/2/3) bytes]][MESSAGE:LENGTH bytes]

    C'est-à-dire que l'id est en vérité encodée sur 8+6 bits (1 octet + 3 quarts) et le type de taille sur 2 bits (il peut donc contenir le nombre 0, 1, 2 ou 3)

    Cela permet sans doute de raccourcir un peu la taille du header.

    Si j'ai bien compris nous avons donc 14 bits disponible pour encoder l'id du packet et 2 bits pour encoder la taille ?

    Ce qui signifierait si j'ai bien compris PacketId aurait donc comme taille 6/7/8/9/10/11/12 bits ?

    Ah oui et pour finir ( si je suis HS ne me répondait pas à cette question ce n'est pas grave ^^)

    À quoi servent ces types de fichier : d2o/d2i & d2p ?

    En tout cas merci beaucoup pour vos tutoriels géniaux !

    Cela m'apparaissait comme du charabia il y a quelques années maintenant que j'ai étudié l'informatique et que j'ai obtenue mon petit diplôme (BAC +2 mais ce n'est que le début :p). Je me sens prêt à plonger dans ce monde difficile, mais au combien merveilleux qu'est le développement de BOT :p

    10 jours plus tard

    d2o = fichier générale du jeu, ils te donnent quelques infos non cruciale qui sont directement implanter dans le client, tu n'auras pas l'appareanceId des objets ou tu n'auras pas les stats exact des monstres.

    d2i = les dictionnaire du jeu, dans le jeu chaque text a un Id en integer ou en string pour l'UI, tu trouveras tout les textes du jeu dans ces fichiers. (1 fichier par langue fr - en - de -jp - ...)

    d2p = les fichiers qui contiennent les maps et les images du jeu. Tu y trouveras les icônes des items ou les tiles qui permettent de constituer les maps, mais tu a aussi les fichier map.d2p qui eux contiennent les informations relative a la map, le background, les cellules (toute les infos genre le tile de la cellule, si on peux marcher dessus, etc ...).

    En faite le Header du packet seras différent selon la taille des datas envoyer dans le packet. Pour écrire ton packet voici comment ça ce passe pour un packet qui fait moins de 255 bits : Short (2 octet) + Byte + Tes datas

      Désolé, une erreur est survenue lors de l'affichage du contenu. Si vous êtes un utilisateur, veuillez réessayer plus tard. Si vous êtes un administrateur, consultez les fichiers journaux de votre forum pour obtenir plus d'informations.
        10 mois plus tard

        bonjour je veux savoir si ces protocoles restes valables

        ?

          6 mois plus tard

          Yop j'ai du mal à comprendre le cas où lenBytes est 3. Il y a vraiment des messages qui font >60k octets ? J'ai un cas où mes 5 premiers octets sont [04 FF] [CC 00 05]. Je ne comprends pas ; cette taille est bien trop grande.

          Quand lenBytes est 0, on fait quoi ? Il n'y a que le header, donc 2 bytes ? Ou il faut quand même compter quelque-chose en plus ?

          Il n'y a pas l'id de l'expéditeur dans le message de mesage privé?

          Un message peut être envoyé sur plusieurs paquets.

            BlueDream

            Un message peut être envoyé sur plusieurs paquets.

            Oui mais même, >60k c'est énorme quand même. J'ai du mal à imaginer des cas où on dépasse cette taille ...

            @Kyu quand je dis "message" c'est juste un paquet dans ce cas là.