[Résolu] Lire les fichiers de maps (d2p reader)

A

Anonymous

Invité
#1
Bonjour,

Maintenant que mon MITM gère la connexion de plusieurs comptes sans bug, je vais pouvoir m'attaquer au bot proprement dit.
Cependant, il me manque un outil de taille : un lecteur de fichiers d2p ou "D2p Reader". Sans ça, le déplacement va être assez... difficile.

Celui de Maxilia (-mapmanager.343/][Dll] Map manager) ne fonctionne pas (ou plus du moins, je me rappelle que je l'avais déjà utilisé) donc je vais essayer de coder mon propre D2p Reader, que je partagerai bien entendu sur le forum un fois terminé.

J'ai trouvé le fichier Map.as (dans com.ankmagames.atouin.data.map) qui montre comment lire une map. Pas de problème à ce niveau là donc.
Cependant, on n'a pas des fichiers de maps "individuels" mais des fichiers .d2p contenant plein de maps... Comment obtenir chaque map ? On sait qu'une map doit commencer par 1 byte qui vaut 77 mais à part ça...

Dans son BiM, bouh2 tente de décompresser le fichier (à l'aide d'une librairie nommée "ZLibNet" apparemment) s'il ne commence pas par 1 byte qui vaut 77.
J'ai donc essayé de décompresser un fichier d2p au hasard (maps0.d2p en l’occurrence) en utilisant la même librairie. Cependant, j'obtiens l'exception : inflating: unknown compression method.


Les fichiers d2p ont-ils changés depuis ? Ou alors je m'y prends mal ?

Merci.
 
Inscrit
18 Avril 2013
Messages
4
Reactions
0
#3
Re: Lire les fichiers de maps (d2p reader)

Il me semble avoir vu un bout de code qui fait ça dans BiM. Tu devrais regarder de ce côté.
 
A

Anonymous

Invité
#4
Re: Lire les fichiers de maps (d2p reader)

ToOnS a dit:
En effet, c'est la bonne solution ! Il fonctionne.

En fait je l'avais déjà vu mais il contenait des erreurs (appel d'un constructeur qui n'existe pas entre autres). Du coup je l'avais laissé tombé au profit du MapManager posté par Maxilia mais celui-ci foirait au runtime.

Je suis en train de "remanier" le code posté par The Falcon : bien que le MapManager fonctionne (après l'avoir corrigé) le code n'est pas très clair et contient des erreurs (l'histoire du constructeur cité plus haut par exemple). Je pense aussi ajouter un espèce de "ProgressHandler" pour les opérations longues (parsage de toutes les maps par exemple).
N'empêche que c'est quand même de l'excellent travail, donc bravo et merci aux auteurs de ce MapManager !

Merci à ToOns également pour me l'avoir fait remarquer :p !


Quand j'aurai terminé je posterai le code dans la partie C# du forum.

PS : par simple curiosité (et aussi pour comprendre un peu mieux d'où sort le code), savez-vous quel(s) fichier(s) *.as faut-il examiner pour avoir tout le "protocole" de lecture des maps ?
 
Inscrit
29 Septembre 2011
Messages
393
Reactions
3
#5
Re: Lire les fichiers de maps (d2p reader)

Salut, déjà *.as d'ou commence la lecture et la suivant : "com.ankamagames.atouin.data.map.Map.as", si je retrouve mon code en c++ je te le met sur Github.
 
A

Anonymous

Invité
#6
Re: Lire les fichiers de maps (d2p reader)

Voilà !

J'ai finis de remanier le code !

Liste non-exhaustive des changements :
  • Remplacement du reader de base (Reader.cs) par celui de bouh2 (BigEndianReader.cs)
  • Suppression de la méthode ConvertMapReaderToMap(MapInformation.Map maps) dans MapManager.cs (inutile)
  • Correction de la plupart des classes d'éléments du jeu (Map, CellData, Layer, etc.) : ajout de plein de variables/propriétés manquantes (les infos étaient lues mais pas sauvegardées dans des variables)
  • Renommage de la quasi-totalité des noms de méthodes/variables/propriétés afin de respecter les conventions de nommage et de leur donner un nom cohérent
  • Suppression de la méthode InitializePosition(uint id) (inutile) à la place j'ai mis le code dans InitializeMap(byte[] encryptionKey) :
    Code:
    _relativeId = _reader.ReadUInt();
    _position = new WorldPoint(_relativeId);
    Simplification énorme de la préparation de la clé de déchiffrage. Énormément de code pour... rien. Peut-être que c'était comme ça dans le client Dofus mais j'ai remplacé ~ 40 lignes par... 1 ligne.
    • Suppression de la méthode InitializeBuffer(string string_1)
    • Suppression de la méthode ReturnEncode(string Strings, bool arg2 = false)
    • Suppression de la méthode ReturnString(byte[] arg1, bool arg2 = false)
    • On passe de :
      Code:
      this.InitializeMap(this.InitializeBuffer(Convert.ToString(this.ReturnEncode("649ae451ca33ec53bbcbcc33becf15f4", false))));
      à :
      Code:
      _encryptionKey = Encoding.UTF8.GetBytes(DefaultEncryptionKeyString);
      InitializeMap(_encryptionKey);

Voilà pour les modifications principales.
Je n'ai pas ajouté de "ProgressHandler" comme je l'avais prévu (C.F. mon message ci-dessus), la flemme. Vous pourrez le faire si vous voulez j'ai mis en pièce jointe les sources modifiées.

J'ai bien sûr testé à la fin (et régulièrement au cours des changements je vous rassure) et ça fonctionne impec' !


Je vous mets en pièce jointe une archive contenant :
  • Le projet DLL avec les sources modifiées
  • La DLL compilée (version 2.0 du Framework)
Mot de passe de l'archive : cadernis.fr
Et encore une fois all credits au(x) codeur(s) de la DLL.

J'espère que ça vous sera utile :p ! Si vous avez des remarques/questions n'hésitez pas.


PS : je n'ai pas pu poster dans la partie C# car je ne suis pas rédacteur, si quelqu'un veut le faire à ma place ;) .
 

Geraff

Administrateur
Membre du personnel
Inscrit
13 Mars 2008
Messages
564
Reactions
0
#7
Fais une demande de rédacteur flemmard ^^.

Bienvenu au nouveau rédacteur.
 
A

Anonymous

Invité
#8
Geraff a dit:
Fait une demande de rédacteur flemmard ^^.

Bienvenu au nouveau rédacteur.
Ahah merci :p .
En fait je ne voulais pas faire de demander car je ne voyais pas bien ce que je pouvais apporter à part ça... Ça t'aurais demander du temps pour la lire, etc. Enfin bref j'ai réfléchi (trop ?) vite et je me suis dis que ça ne valait pas le coup.

Mais maintenant que j'y suis j'ai des idées en fait... alors merci et à bientôt dans la partie C++ du forum :) !
 
Haut Bas