[Présentation] Nolly, de mon aventure à travers les 7 mers de code

Inscrit
6 Decembre 2020
Messages
31
Reactions
6
#1
Il y a maintenant 2 ans, j'avais fait un premier bout de code en Python pour m'amuser à apprendre les bases de la programmation d'un bot chasse au trésor un peu "stupide": beaucoup d'utilisation d'images, et de clics à droite et à gauche. Finalement, valchimiiste, que je salue (je ne t'ai pas oublié) avait présenté un projet qui ressemblait beaucoup à ce que j'avais fait et... même en mieux. Quoiqu'il en soit, ça avait été une belle claque dans la gueule quand je m'étais rendu compte que mon petit joujou que j'avais mis pas mal de temps à réaliser, n'était pas si bon que ça.
Devant les très nombreux problèmes:
  • Le bot qui se perd sur la carte
  • Le bot qui n'est pas capable de se battre (valchimiiste avait réussi lui :'()
  • Le bot qui ne trouve pas les phorreurs
  • Le bot qui se bloque comme une m**de contre un mur
  • Le bot qui va se suicider contre des monstres au lieu de changer de map correctement
  • Et plein d'autres...
... j'avais décidé (d'un commun accord avec moi-même) de me lancer dans le déchiffrage des paquets car "ça doit pas être si difficile" (et malgré tous les gens qui me diront que c'est super "EZ", et bah... personnellement, je trouve pas ça évident) et "ça sera forcément beaucoup mieux" (ça je veux bien le croire).

Donc à l'époque (encore 2 ans en arrière, je le rappelle), je m'étais dit: "Bon Nolly! Tu portes tes co**lles et tu te lances dedans".
J'ai donc suivi les tutoriels de Labo (mon maître, que je salue également s'il est encore là), et il faut dire qu'il a fait un beau boulot. J'ai réussi à sniffer mes premiers paquets (on parle pas du truc d'avant, mais bien de paquets qui transitent). Et puis... j'ai abandonné... J'avais d'autres trucs à faire, et ça avançait pas assez... J'avais l'impression de me perdre dans un néant de code et de bytes et d'hexa et d'autres créatures sombres provenant du néant.

Tout ça pour en venir au fait!

Je me relance dans l'aventure des paquets (ceux qui transitent). Je me suis déjà bien cogné la tête, mais elle reste sur mes épaules, alors ça va.
Je risque de poser des questions. Probablement des questions déjà posées (mais je promets de regarder de mon mieux). Probablement que des gens vont m'insulter (s'il vous plaît, ne le faites pas).

Pour expliquer où j'en suis, j'ai honteusement pompé du code sur github (dont une partie au moins provient du code LaBot de Labo) pour pouvoir sniffer mes paquets. Je sais comment fonctionne la théorie, mais un code qui est déjà fait, ça se refuse pas, si? Bref, ça fonctionne... Honnêtement, je ne sais pas comment tout fonctionne (parce qu'il y a quand même beaucoup de code), mais j'ai compris l'essentiel une grande partie. Je vois le flot d'ID qui avance et certains m'interpellent (par exemple 'MapComplementaryInformationsDataMessage') et je souhaite me lancer à bras le corps dans la compréhension de ce qu'on peut faire avec ça. Peut-on naviguer grâce à ce genre de Messages uniquement? Ai-je besoin d'autres fichiers? Toute une histoire... Mais je pense être capable de prendre ma revanche contre les créatures du néant.

Voilà. C'était une présentation.

Nolly
 
Dernière édition:
Inscrit
23 Avril 2021
Messages
7
Reactions
4
#2
Bon courage ! Si tu as besoin d'aide pour la lecture de paquets et l'utilisation de LaBot n'hésite pas à venir en MP
 
Inscrit
6 Decembre 2020
Messages
31
Reactions
6
#3
Par rapport à la demande d'aide en général, j'imagine qu'il vaut mieux la demander dans la partie Développement > Questions / Réponses, plutôt que dans la partie Général, non? (ça me paraît logique, mais je préfère vérifier: j'aime les choses bien organisées).

Merci ybrik, pour le soutient.
Aussi, je me suis inscrit sur le Discord, mais je ne sais pas si les choses se feront vraiment là-bas. Il vaut mieux? (Je préfère ici, personnellement).

J'aimerais écrire sur ma manière de faire mes recherches, mes avancement, et ma compréhension du code. Le but: montrer qu'on est capable de commencer à partir de peu de choses (forum, et quelques bouts de code), de se dém*rder et d'arriver à un résultat sympa. Donc j'espère avoir la foi d'écrire mon avancée petit à petit.

Pour mon avancée, comme je disais avant, je me suis lancé sur la partie 'MapComplementaryInformationsDataMessage'. Et j'ai l'impression d'avoir tout plein d'informations très intéressantes (lorsque je sniff). Aussi, en farfouillant le forum, j'ai trouvé :
Le premier lien aide déjà beaucoup. Apparemment, on peu avoir recours à PyDofus de balciseri. Le but, si j'ai bien compris, étant de modifier les fichiers d2p pour pouvoir extraire les informations dont on a besoin.
  • Convertir les .d2p en .dlm
  • Convertir les .dlm en .json
J'ai donc utilisé PyDofus: la première conversion a fonctionné pour tous les fichiers .d2p (j'ai un peu modifié le code pour que ce soit mieux organisé, car de ce que j'ai compris, ce sont différentes personnes qui ont travaillé dessus, et le code n'était pas harmonieux (la sauvegarde n'était pas au bon endroit)).
Pour la deuxième conversion, je reprend Pydofus et cette fois, je veux transformer les .dlm en .json et... patatra:
Je lance le code en mode "bourrin" pour tous mes .dlm et... certains fonctionnent:
.\input\maps1_9.d2p\9\206832129.dlm
D'autres non:
Problème avec le fichier .\input\maps1_9.d2p\9\206832129.dlm
.\input\maps1_9.d2p\9\207094279.dlm

Plus précisément (je vous met ça là, on sait jamais si quelqu'un l'a déjà vu):
Traceback (most recent call last):
File "dlm_unpack.py", line 13, in <module>
data = dlm.read()
File "C:\Users\Nolly\Programmation\Projets_Python_Sniffer_MITM\Second_Projet\truc\PyDofus\pydofus\dlm.py", line 31, in read
map.read()
File "C:\Users\Nolly\Programmation\Projets_Python_Sniffer_MITM\Second_Projet\truc\PyDofus\pydofus\dlm.py", line 154, in read
la.read()
File "C:\Users\Nolly\Programmation\Projets_Python_Sniffer_MITM\Second_Projet\trucr\PyDofus\pydofus\dlm.py", line 326, in read
ce.read()
File "C:\Users\Nolly\Programmation\Projets_Python_Sniffer_MITM\Second_Projet\truc\PyDofus\pydofus\dlm.py", line 368, in read
el = BasicElement().GetElementFromType(self, self.raw().read_char(), self.mapVersion)
File "C:\Users\Nolly\Programmation\Projets_Python_Sniffer_MITM\Second_Projet\truc\PyDofus\pydofus\dlm.py", line 556, in GetElementFromType
raise InvalidDLMFile("Invalid element type.")
pydofus.dlm.InvalidDLMFile: Invalid element type.
Je me dis alors deux choses:
  • soit "T'es un blaireau Nolly, t'as dû mal comprendre, ça pouvait pas être aussi simple."
  • soit "Merde, PyDofus a été mis à jour il y a au moins deux ans, ça vient peut-être de là."
Comme je pense pas être un animal de sous-classe Théria (cf. Wikipedia), je me suis mis à essayer de comprendre les fichiers de PyDofus. De ce que j'ai compris, il y a bien eu une mise à jour il y a deux ans, donc ça a très bien pu ré-arriver entre temps. Petites questions en passant: Est-ce que quelqu'un en sait plus là-dessus? Et aussi: doit-on mettre à jour les fichiers .d2p à chaque nouvelle maj du jeu (j'imagine que ce n'est le cas que si des maps on été modifiées/ajoutées/enlevées)?
Bref, j'ai fait ce qui me semblait "intelligent" (entre guillemet car "Qu'est-ce que l'intelligence?") et j'ai comparé les fichiers de dofus : \com\ankamagames\atouin\data\map avec le code de PyDofus. "Et là, c'est le drame..." : j'ai trouvé des différences! Exemple (parmi tant d'autres):
A la ligne ~125 du fichier dlm.py, l'attribut "useLowPassFilter" ne semble pas exister dans Map.as :
self._obj["useLowPassFilter"] = self.raw().read_bool() # de dlm.py
Est-ce que je travaille dans le bon sens? Est-ce que quelqu'un avait remarqué ça? Je pense que si j'ai raison et que je modifie correctement ce fichier, je peut demander de le pull pour que les prochaines personnes n'aient pas à se farcir tout ça.
J'espère alors que quand j'aurais tous les fichiers au format .json, je pourrais à nouveau progresser sur la suite.

Voilà mon avancement. Je sais, j'écris beaucoup. Mais c'est le but. J'espère que vous ne serez pas découragés par mes pavés. Pour les fatigués des yeux, je suis désolé. Encore une fois, c'est pour moi, mais c'est aussi pour que les potentiels nouveaux voient comment ça progresse.

D'ailleurs, je disais que j'aime bien l'organisation. Mais là... Ne devrais-je pas en parler autre part qu'ici? (genre dans les Questions/Réponses) *-*
 
Inscrit
6 Decembre 2020
Messages
31
Reactions
6
#4
Nouvel avancement:

J'ai bel et bien modifié les fichiers de PyDofus pour convertir les fameux .dlm en .json sans erreur (du moins, je ne le remarque pas).
Je me retrouve dans le même cas que Nyaperture dans sa discussion: ici.
C'est à dire que j'ai bien ma carte, mais je me pose des questions sur les attributs donnés à chaque cellule.
Pour chaque map (dlm), j'ai cru comprendre que:
  • les id des maps adjacentes sont écrites (c'est plutôt simple à comprendre)
  • si une carte n'a pas de map adjacente, un numéro d'id est néanmoins écrit, mais il ne correspond à aucun fichier .dlm
Déjà, pour chaque map, je me pose les questions:
  • Comment retrouver la pos (coordonnées X et Y en jeu) à partir des données de la map?
  • Quel fichier .AS3 s'occupe du changement de map?
Pour chaque cell d'une map, j'ai cru comprendre que:
  • l'attribut mov indique si la cellule est "marchable" (si on peut marcher dessus)
Mais je me pose encore une fois la même question que Nyaperture, à savoir:
  • Comment se fait-il que des cell sur les mêmes bords d'une map n'aient pas les mêmes valeurs de l'attribut mapChangeData (ma faute? ai-je mal convertit le fichier .dlm de la map?)
  • En fait, qu'est-ce que l'attribut mapChangeData exactement?
  • Même question avec les attributs move_zone et _linked_zone?
J'ai aussi une autre question: Comment sont organisés les cartes au format dlm? Elles sont stockées dans des dossiers estampillés mapsi_j dans lesquels il y a 10 dossiers allant de 0 à 9... Qu'est ce que c'est que ce bazar? Y a-t-il une manière de s'y retrouver?

Toutes ces questions, je me les pose, bien évidemment. Si quelqu'un a la réponse, n'hésitez pas. Vous pouvez même m'indiquer les fichiers (ça peut m'aider à mieux comprendre).
Bonne journée.

(je pense que je devrais bouger la plupart de mes messages sur la partie Questions/Réponses :'()
 
Haut Bas