Résolu AS3 ByteArray, WorldGraph, à l'aide

Inscrit
5 Juin 2018
Messages
9
Reactions
0
#1
Salut,

Pour un petit projet personnel, j'ai besoin de récupérer le fonctionnement du WorldPathFinder de D2.

Le WorldPathFinder se base sur les données d'un fichier binaire (worldgraph.bin disponible dans les fichiers du jeu) afin de récupérer les nœuds et transitions.

Et c'est bien sur la lecture de ce fichier que je bloque, et notamment sur la classe Worldgraph qui s'en occupe (com.ankamagames.dofus.modules.utils.pathfinding.world) :

1618575323065.png

En paramètre de cette fonction, il y a un objet de ByteArray bien récupéré du fichier Worldgraph.bin :

1618575394677.png
1618575920668.png

Ok, jusque là ça va. Il suffit juste de lire ce fichier binaire, en faire un tableau de bytes et de le parcourir comme le constructeur Worldgraph le fait.

Un exemple des premiers 50 bytes du tableau récupérés de ce fichier (en C# avec readAllBytes("worldgraph.bin")) :

0 0 119 20 65 1 217 184 0 0 0 0 0 0 0 1 65 1 217 176 0 0 0 0 0 0 0 1 0 0 0 1 2 1 255 255 255 255 0 0 0 0 65 1 217 176 0 0 0 0 0 0 2 29 191 240 0 0 0 0 0 0 65 3 64 32 0 0 0 0 0 0 0 1 65 3 48 32 0 0 0 0 0 0 0 1 0 0 0 1 0 1 255 255 255 255 0 0 0 0 65 3 48 32 0 0 0 0 0 0 1 93 191 240 0 0 0 0 0 0 65 137 211 138 56 0 0 0 0 0 0 1 65 137 211 122 56

Si on regarde le code AS3 du Worldgraph, la tout première interaction avec le tableau de bytes est un readInt() dans la variable edgeCount. Donc d'après la doc AS3 sur les readInt() de ByteArray, il lit un int32 (à partir de la position 0, comme aucune lecture ne s'est passé avant), donc dans mon cas :

0 0 119 20 = 343343104. (edgeCount)
BitConverter.ToInt32(array, 0) en C#

Ensuite, je décale de 4 sur le tableau et je lis en double, sur 8 bytes cette fois :
65 1 217 184 0 0 0 0 = 1,53221089504935E-314
BitConverter.ToDouble(array, 3) en C#

Ce readDouble est passé en paramètre de la fonction addVertex, addVertex qui prends comme premier paramètre :

1618595059749.png 1618595033690.png

Une mapId.

Une map qui porte comme ID : 1,53221089504935E-314 ?
Qu'ai-je raté dans la compréhension du code AS3 ?

Je vous remercie d'avance !
Wukzu
 
Dernière édition:

Noitpexen

Contributeur
Inscrit
7 Aout 2017
Messages
10
Reactions
8
#2
Je crois c'est plutot un Int32, une map peut pas avoir une virgule
 
Inscrit
5 Juin 2018
Messages
9
Reactions
0
#3
La map n'existe pas non plus, ni en int32, ni int64.
j'obtiens respectivement -1193737919 et 3101229377 :(
 

Noitpexen

Contributeur
Inscrit
7 Aout 2017
Messages
10
Reactions
8
#4
A tu essayé de créer un petit projet AS3 pour test et voir ce que ça donne?
 
Inscrit
5 Juin 2018
Messages
9
Reactions
0
#5
Non, je pense que je vais faire ça !
Mais dans l'ensemble c'est correct le raisonnement pour extraire les données du worldgraph.bin ?
 
Dernière édition:
Inscrit
5 Juin 2018
Messages
9
Reactions
0
#6
J'ai résolu mon problème (merci le discord !)
C'était tout simplement qu'il fallait lire les bytes en Big Eudian, c'est le little eudian de base en C#.
 
Haut Bas