Waskalien
Salut, merci pour ta réponse. J'ai commencé à sniffer le paquet MapComplementaryInformationsDataMessage, j'ai en effet remarqué qu'il y a beaucoup d'informations. Je n'ai pas encore été confronté à la réception de 2 paquets pour le même message, mais je bloque pour l'instant à partir de la réception des VarShort, je ne connaissais pas ces types de variables et de ce que j'ai compris c'est des variables à taille variable avec pour chaque bit un bit de poids fort qui définit s'il y a un prochain octet pour cette variable. Je n'arrive pas encore à lire parfaitement ce type de variables, ce qui me donne des données erronées à partir de "Scales len". Je n'ai pas beaucoup de temps pour l'instant mais pour avancer j'aurai besoin de comprendre si par exemple une VarShort sur 3 bytes contenant 1001 1100 1010 1011 0100 0000 vaut en décimal 464320, c'est à dire qu'on enlève les bits de poids fort et on prend la suite 0011100 0101011 1000000.
Je me trompe ? Si c'est bien ça ce n'est plus qu'une histoire de code et j'arriverais à me débloquer là dessus.
J'ai un deuxième problème de compréhension pour avancer. Dans le code de EntityLook il y a dans la boucle des "subentities" un nouvel appel à EntityLook. Je me dis tout simplement que pour chaque sous-entités (familiers, dragodindes...) on chope ses informations et que ça ne devrait pas poser de problème puisqu'à l'appel sur la sous-entité subentitiesLen sera à 0. Je crois avoir saisit mais j'aimerai juste être sûr que c'est la bonne voie.
J'ai failli oublier : 3ème petit problème de compréhension qui ne devrait pas me gêner mais je suis curieux, pour la lecture de la mapid, j'ai étonnamment découvert qu'il faut effectuer une conversion de binaire à double, ce qui m'est totalement étranger. Quand je met mon binaire dans un convertisseur binaire -> double (comme par exemple celui-ci), j'obtiens le bon mapid, mais pour convertir le binaire en double dans mon code, c'est pas gagné, je n'y comprend rien malgré la schématisation qu'il y a sur le site. Si quelqu'un a une piste je suis preneur.
Pour ton souci de message en 2 paquets, je dirais qu'il faut regarder si le message est tronqué. C'est possible de le voir dans le header du paquet puisque le module que j'utilise en nodejs me dit si oui ou non il l'est. Ensuite, si tu détectes que le message est tronqué, tu lis le prochain paquet du même protocole comme la suite du premier paquet.
Je te donnerais des news à ce sujet quand je m'y pencherais.
Bon courage !
Ok, je regarderais du côté du header de mon paquet,
Alors pour ton premier problème j'avoue que je ne peux pas trop t'éclairer ^^ J'ai juste choppé un Reader donc j'me contente de copier bêtement les paquets avec les types de mon Reader correspondant.
Ensuite pour le subEntities, si tu développes le message exactement comme dans les sources en gros pour te résumer ça donne ça :
- Un entity look est trouvé, on le deserialize
- Si il y'a un SubEntityLook on le créer, puis on le deserialize
- Le SubEntityLook utilise l'EntityLook pour se deserializer
Donc en gros faut le voir réelement comme ça (Avec des mots simples, même si c'est pas les termes exactes mais admettons) :
- EntityLook crane :
- SubEntityLook oeil :
- Oeil.Deserialize();
- EntityLook d'oeil : Pupille
- Etc etc
En gros il interreun SubEntityLook qui peut lui même contenir un SubEntityLook qui peut lui même contenir un SubEntityLook
Donc si tu codes bien ton Message tu devrais pas avoir à te faire de bille, c'est assez simple, c'est au final comme une liste de liste quoi ^^
Et pour le troisième problème, j'ai pas bien compris ce que tu demandais ^^'
Si tu n'arrives pas à comprendre comment convertir les Datas brutes de ton Message j'peux aider
En gros ton Reader si tu cherches à lire un double (8 bytes) il va falloir lui faire récuperer les 8 prochains bytes par rapport à sa position actuel dans le Stream des datas du paquet)
Par exemple :
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000100
est égale à un double dont la valeur est 4
(Tu peux voir qu'un double est codé sur 8 bytes)
Et donc pour Dofus (En big endian) :
00100000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
ça donne ça
Tout ce que tu dois retenir c'est que si tu veux lire un double, tu dois récuperer les 8 prochains bytes dans ton flux de donnée (Toujours à partir de la position de ton "curseur" dans le stream)