2.0 Compréhension des maps (DLM)

Inscrit
14 Avril 2020
Messages
2
Reactions
0
#1
Bonjour à tous,

Cela fait quelques jours que je parcours Cadernis en long, en large et en travers pour m'aider à comprendre comment fonctionne Dofus - Merci à tous pour ces ressources, ça m'aurait pris des mois sans :)

Je rencontre un problème de compréhension des fichiers DLM, correspondant aux différentes maps : J'essaie de déterminer, sur une map, quelles sont les cellules "walkable", quelles sont les cellules au contraire bloquées, et quelles cellules permettent de changer de map.

J'utilise pour cela PyDofus (peut-être codé par quelqu'un d'ici d'ailleurs ?) pour :
  • Convertir les .d2p en .dlm
  • Convertir les .dlm en .json
Cependant, lorsque je regarde un de ces fichiers JSON, le résultat me paraît incohérent.

Prenons l'exemple de la map en -8;-25 dans le Massif de Cania (mapId = 165154826, mapVersion = 11)



Ici il est possible d'aller en haut, en bas, à droite, mais pas à gauche. D'ailleurs, la moitié gauche de la map est inaccessible.
Je m'attends à retrouver ces informations dans le fichier JSON de la map, mais pas du tout.
Le Pastebin contenant le JSON est disponible ici.

  • Le JSON comprend une valeur pour la clé "leftNeighbourId" alors qu'il est impossible d'aller à gauche
  • La clé "cells" est bien un tableau de 560 entrées, qui devraient donc correspondre aux 560 cellules de la carte.
De ma compréhension, pour chaque "cell", la propriété "mov" indique si le personnage peut marcher sur la case et la propriété "mapChangeData" indique s'il est possible de changer de map.

Cependant les résultats que j'obtiens en analysant la valeur de toutes les "cells" est incohérent.

Par exemple ci-dessous la liste des cells, pour lesquelles j'ai mis un X quand "mov" est true, et un point quand "mov" est false :
X X X . . X X X . X X X X .
. X X X . X X . X . X X X X
. X X X X . . X X X . X X X
X . X X X X . X X . X . X X
X X . X X X X . X X X X . X
X X X . X X X X . X X . X .
X X X X . X X X X . . X X X
. X X . X . X X X X . X X X
X . X X X X . X X . X . . X
X X . X X . X . X X X X . X
X . X . . X X . . X X X X .
X X X . X X X . X X X . X X
X X X X X . . X X . . X . .
. X X X X X X X X X X X X .
. X . . X X X . X X . . . X
X . . X X X X X X X X X X X
X . X X X X X X X . X . X X
X X X X X X X X X X X X X X
X . X X X . X X X . X X X X
X X X . X X X . . X X X X X
X X X X X X X X X X X X X X
X X X X X X X X X X X X X X
X X X . . X X X X X X . X .
. X X X X X X . X . X X X .
X X X X X X X . X X . . . X
X . . X X X X X X X X X X X
X X X X X X X X X X X X X .
X X . . . X X . . X . . X X
X . X X X X X X X X X X X X
X . X X X X X X X . X . . X
X X X X X . X . X X X . . X
. . . X X . X X . . X X X .
X X . . X X X . . X . . X X
X . . X X X X X X X X X X X
X X X X X X X X X X X X X X
X X X . X X X X X X X X X .
. X X X X X X . X . X X X .
. X . . . X X . . X . . X X
X . X X . . . X X . . X . .
. X X X X X X X X X X X X X

Et ci-dessous la liste des "mapChangeData" :

0 -1 0 0 2 0 -21 5 0 0 0 -1 0 0
2 0 -75 5 0 0 14 -1 0 -4 3 0 -21 7
0 0 14 -1 0 0 4 0 -31 7 0 0 0 -1
0 0 5 0 -31 8 0 0 0 -1 0 -4 5 0
-31 8 0 0 14 -1 0 0 0 0 -31 -2 0 0
0 -1 0 0 1 0 -19 0 0 0 0 -1 0 0
1 0 -31 4 0 0 0 -1 0 0 2 0 -21 6
0 0 14 -1 0 -4 3 0 -21 7 0 0 0 -1
0 0 4 0 -31 8 0 0 0 -1 0 0 5 0
-21 8 0 0 0 -1 0 0 5 0 -31 8 0 0
14 -1 0 -4 6 0 -31 7 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 2 0
0 0 -31 5 0 8 -21 5 0 0 0 0 0 0
0 0 1 -4 0 0 1 -4 0 0 1 -4 0 0
2 -4 0 0 -31 7 0 13 -31 7 0 0 0 0
0 0 0 0 -31 8 0 0 0 0 0 -4 1 0
-21 7 0 14 -31 -1 0 15 -31 -1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 2 0 0 0 -31 5 0 21
-31 6 0 22 -21 7 0 23 -21 7 0 24 -21 7
0 25 -21 8 0 26 -31 8 0 27 -31 8 0 0
0 0 0 0 0 0 -21 7 0 0 0 0 0 0
1 0 -21 7 0 0 7 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0
2 0 0 0 -31 1 0 33 -31 3 0 34 -31 5
0 35 -31 5 0 36 -21 6 0 0 0 0 0 0
0 0 1 -4 0 0 1 -4 0 0 1 -4 0 0
2 -4 0 0 -31 8 0 41 -31 7 0 0 0 0
0 0 0 0 -31 8 0 0 14 0 0 0 1 0
-31 7 0 0 14 0 0 -4 1 0 1 0 0 0
1 0 0 0 1 0 0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0 0 0 1 0 0 0
2 -4 0 0 -31 7 0 51 -21 7 0 52 -21 7
0 53 -21 8 0 54 -21 8 0 0 0 0 0 0
0 0 0 0 0 0 -31 8 0 0 0 0 0 -4
1 0 -31 7 0 0 10 0 0 -4 1 0 1 0
0 0 1 0 0 0 1 0 0 0 1 0 0 0
1 0 0 0 1 0 0 0 1 0 0 0 2 0
0 0 -31 5 0 64 -31 6 0 65 -21 7 0 0

Rien ne reflète ici que la map de gauche est inaccessible, ni que la partie gauche de la map n'est pas accessible non plus.

J'ai plusieurs hypothèses :
  • Le parsing du fichier DLM est incorrect : ça m'étonne, car j'ai comparé avec le parsing fait dans le "Raidbot" (trouvé sur ce forum aussi), et il m'a l'air similaire
  • Les "cells" ne sont pas triées correctement (ce qui voudrait dire que la première cellule de ce tableau n'est pas la cellId = 1, en haut à gauche)
  • Le parser ne fonctionne pas avec des map dont la mapVersion est égal à 11
  • Je me trompe complètement sur l'interprétation des DLM, ou bien l'info que je cherche n'est pas à cet endroit, et dans ce cas-là je suis perdu :'(
Désolé pour le pavé, j'espère que quelqu'un aura une idée !
 
Inscrit
16 Mars 2014
Messages
214
Reactions
30
#2
ça fais un moment j'ai pas regarder mais au vue de tes valeurs du moins pour les cellules, je pense que ton code pour de lire les données n'est pas/plus bon regarde dans ton invoker com\ankamagames\atouin\data\map\CellData.as
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#3
Oulala, je connais bien ces maps du Massif de Cania,

Il y a certaines maps que l'on ne trouve pas avec la MapId, à l'époque j'avais fait un système qui retrouve le DLM via les coordonnées.
Et il y a parfois, une partie des cellules marchables qui sont bonnes, puis tout d'un coup, sur une partie de la map, plus aucune.

Nottament, une map avoisinant celle que tu as partagé, qui permet de redescendre vers Amakna, passage obligé,
Je sais que dans les DLM ils indiquent des obstacles, pour changer de map vers le bas, cependant,
Si tu t'arrètes un peu avant, et que tu send le ChangeMapMessage, l'animation du personnage va continuer jusqu'en bas de l'écran,
Comme si les obstacles n'existaient pas, et le changement de map se faire quelques secondes après. Vicieu :')

Ensuite pour le code de RaidBot, les DLM n'ont pas beaucoup changé,
Alors de mémoire, tu as juste à update le fichier Map, ils ont rajouté un ReadInt pour la mapVersion > 10.
Ainsi que le fichier AnimFunData qui contient de nouvelles variables.

Au plaisir^^
PS: Tu as essayé de voir la miniMap dans les rapports d'erreur F11? C'est comme ça que tu sauras si il y a entourloupe.
 
Dernière édition:
Inscrit
14 Avril 2020
Messages
2
Reactions
0
#4
ça fais un moment j'ai pas regarder mais au vue de tes valeurs du moins pour les cellules, je pense que ton code pour de lire les données n'est pas/plus bon regarde dans ton invoker com\ankamagames\atouin\data\map\CellData.as
Je pensais pouvoir m'en sortir sans décompiler le client, mais visiblement c'est impossible.
Merci, j'ai en effet trouvé que la parseur de DLM de PyDofus n'était plus à jour, il y a eu une mise à jour du client (et donc un décalage d'octets).

Si quelqu'un d'autre tombe sur ce poste et ne sait pas comment décompiler le client :
  • Installer jpex-decompiler (https://github.com/jindrapetrik/jpexs-decompiler
  • J'ai dû désactiver la parallélisation dans les options, car sinon l'extraction ne fonctionne pas
  • Décompiler tout ce qu'il y a dans le dossier "scripts > com > ankamagames > atouin", et regarder le code dans les classes CellData / Cell / Map
Oulala, je connais bien ces maps du Massif de Cania,

Il y a certaines maps que l'on ne trouve pas avec la MapId, à l'époque j'avais fait un système qui retrouve le DLM via les coordonnées.
Et il y a parfois, une partie des cellules marchables qui sont bonnes, puis tout d'un coup, sur une partie de la map, plus aucune.

Nottament, une map avoisinant celle que tu as partagé, qui permet de redescendre vers Amakna, passage obligé,
Je sais que dans les DLM ils indiquent des obstacles, pour changer de map vers le bas, cependant,
Si tu t'arrètes un peu avant, et que tu send le ChangeMapMessage, l'animation du personnage va continuer jusqu'en bas de l'écran,
Comme si les obstacles n'existaient pas, et le changement de map se faire quelques secondes après. Vicieu :')
Hello :)

Alors j'ai réussi à avoir un résultat à peu près correct en modifiant le parseur de DLM, ce qui a corrigé la plupart de mes soucis.
Mais mon pathfinding d'une map à l'autre est encore simple, je ne prends pas en compte les zones (ce qui fait que le pathfinding ne fonctionne pas / mal sur des maps où il y a deux zones qui ne se rejoignent pas, comme à Bonta, mais c'est marginal). Je n'ai pas encore expérimenté le problème que tu décris du Massif de Cania vers Amakna, mais je ferai attention, merci :)

Alors de mémoire, tu as juste à update le fichier Map, ils ont rajouté un ReadInt pour la mapVersion > 10.
Yes c'était ça, et aussi un unsigned char pour chaque cellule si mapVersion > 10.

Ainsi que le fichier AnimFunData qui contient de nouvelles variables.
Je ne connais pas encore ce fichier, je vais regarder ce qu'il contient.

PS: Tu as essayé de voir la miniMap dans les rapports d'erreur F11? C'est comme ça que tu sauras si il y a entourloupe.
Là tu me parles chinois :) Je ne sais pas où sont les rapports d'erreur, et le raccourci F11 ne semble rien faire sur mon client (Mac).

Bonne fin de journée !
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#5
Dans tes paramètres, le dernier menu, Activer la génération de rapport. Puis sur mac c'est F10 il me semble.
 
Inscrit
8 Aout 2020
Messages
4
Reactions
2
#7
Sorry for the delay.. commit merged
 
Haut Bas