C/C++ [Resolu] [C++] Help D20

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#1
Salut a tous,

Ca commence a faire un sacré moment que je bloque sur ces ****** de D2O, je commence sérieusement à
fissurer.
Si quelqu'un pourrait me donner des pistes ou des étapes a suivre afin de venir a bout de ces D2O ca serait super cool.

Merci d'avance. :evil:
 
A

Anonymous

Invité
#2
Re: [C++] Help D20

Tiens moi aussi je cherche des infos sur ça parce que j'ai pas trouvé où ça se trouve dans les sources de Dofus...
 
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#3
Re: [C++] Help D20

Dans les sources, il y a un fichiers D2oFileAccessor ou quelque chose du genre (de mémoire).
La lecture se trouve dans ce fichier principalement.
Le reste des fichiers aux alentours permettent de traiter les résultats.
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#4
Re: [C++] Help D20

Le truc c'est )que ce fichier dont tu parles (l18nFleAcessor.as3) utilise des dictionnaires
et tout le bordel et je sais pas trop comment les traduire en C++

Merci de votre aide
 

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#5
Re: [C++] Help D20

en gros tu fait un nouveau stream du fichier voulu (servers.d2o par example) tu lit 3 bytes que tu converti en string c'est le header, ensuite tu te deplace dans ton stream vers la position donner par un readInt puis tu lit un autre int c'est le nombre d'index tu fait une boucle pour chaque index dans cette boucle tu lit un premier int, c'est l'id de l'index puis un deuxéme int c'est la position dans le fichier tu ajoute ca dans un dictionary puis , ensuite tu lis un int c'est le nombres de class contenu dans le fichier la tu fait une boucle et pour chaque class tu lit un utf c'est le nom de la class un autre utf c'est le namspace de la class ,tu lit un int c'est le nombre de field de cette class une boucle pour chaque field tu fait un readutf c'est le nom du field tu lit un int c'est le l'id de la read method du field (si c'est un radInt ,readUtf ,readByte ext) pour savoire a quoi corespon ton id tu look dans les source de d2 ensuite c'est simple, tu prent un index tu va sur sa position puis tu lis les field avec la readMethod obtenu si ta un peut du mal avec les sources de dofus tu look dans euubot tu comprendra mieux
 
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#6
Re: [C++] Help D20

gohu a dit:
Le truc c'est )que ce fichier dont tu parles (l18nFleAcessor.as3) utilise des dictionnaires
et tout le bordel et je sais pas trop comment les traduire en C++

Merci de votre aide
Je ne parlais pas d'I18nFileAccessor (qui sert a lire les fichiers d2i) mais de D2oFileAccessor (pour lire les fichiers d2o).
Ensuite pour les dictionnaires, en C j'aurais fait une liste chaînée, mais je pense qu'en C++ il y a des classes deja faites pour les dictionnaires. J'en suis meme certain. Sinon si tu utilises Qt tu peux utiliser les listes du framework.
A toi de chercher un peu du cote des listes/dictionnaires en C++, y'a rien de compliqué.
 
Inscrit
23 Novembre 2013
Messages
26
Reactions
0
#7
Re: [C++] Help D20

Désolé, je suis celui qui s'occupe des parties complexes dans le projet de Gohu, et je suis calé en Qt t'inquietes ;)

Mais, je fais le i18n, sauf que la fonction init() traduite plante, car je lis le premier int, qui me dis de sauter a une position dans le fichier, mais apartir de la ca part en couilles. Utilisant Qt pour faire, l'unité de "saut" doit etre differente que celle de Qt, donc de byte ?
 
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#8
Re: [C++] Help D20

Normalement "sauter" a la meme signification quel que soit le langage quand il s'agit de fichier. Seek.
 
Inscrit
23 Novembre 2013
Messages
26
Reactions
0
#9
Re: [C++] Help D20

Bon, j'ai eu un petit probleme, avec le type object (ayant l'abilite de devenir n'importe quoi)qui n'existe pas en C++, que je simule en convertissant des byteArray, mais maintenant je trouve le type IDataCenter, qui semble etre une classe par defaut du language, mais je ne trouve nulle part d'infos sur elle...
 

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#10
Re: [C++] Help D20

IDataCenter ca vient pas du langage ^^' enfait comme tu la compris pour chaque fichier d2o tu doit faire une class qui est capable de lire le fichier cette interface sert simplement a definir que Server est une class de données , en c# c'est surtout utile pour la reflection
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#11
Re: [C++] Help D20

Moonlight-Angel a dit:
Dans les sources, il y a un fichiers D2oFileAccessor ou quelque chose du genre (de mémoire).
La lecture se trouve dans ce fichier principalement.
Le reste des fichiers aux alentours permettent de traiter les résultats.
Tu le trouves où ce fichier ? J'ai fait une recherche dans les sources et dans le dossier du jeu, rien trouvé à part la liste des fichiers d2o, pas de trace de lecteur...
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#14
Re: [C++] Help D20

Bon a a vachement avancé avec anonymHax, le truc c'est que notre fonction inite du I18nFileAccessor
déconne complètement pour une raison assez inconnue: la valeur de la pos que on lit est complètement
louphoque (parfois meme négative ou inexistante dans la mémoire)

voici notre fonction,
Merci d'avance pour votre aide

Code:
void I18nFileAccessor::Initiate()
{
    uint pos = _reader->readInt();
    _reader->setPosition(pos);

    uint indexesCount = _reader->readInt();
    for (int i = 0; i < indexesCount; i += 9)
    {
        uint index = _reader->readInt(); // index(i) ???
        _reader->readBool();
        uint offset = _reader->readInt();
        _indexes[index] = offset;
    }

    int i = _reader->readInt();
    while(i > 0)
    {
        uint oldPos = _reader->getPosition();
        QString index = _reader->readUTF();
        uint offset = _reader->readInt();
        _textIndexes[index] = offset;
        i -= _reader->getPosition() - oldPos;
    }
    _self = true;
}
 
Inscrit
23 Novembre 2013
Messages
26
Reactions
0
#15
Re: [C++] Help D20

Tout en sachant que c'est uniquement le tableau _indexes (QMap<int, int>) qui ne marche pas, le reste semble etre bon car les noms sont corrects dans _textIndexes, et je lis pile la bonne quantité de données. Donc je dois faire la premiere partie avec la boucle readInt/Bool/Int dans le mauvais odre surement ?
 
Inscrit
23 Novembre 2013
Messages
26
Reactions
0
#16
Re: [C++] Help D20

Probleme resolu, notre decompilateur ne marche pas bien.
 
Inscrit
19 Mai 2013
Messages
68
Reactions
0
#17
Je me demandais juste un truc. C'est du BigEndian comme les paquets ou du LittleEndian ?
 
Inscrit
19 Mai 2013
Messages
68
Reactions
0
#20
Re: [C++] Help D20

gohu a dit:
Bon a a vachement avancé avec anonymHax, le truc c'est que notre fonction inite du I18nFileAccessor
déconne complètement pour une raison assez inconnue: la valeur de la pos que on lit est complètement
louphoque (parfois meme négative ou inexistante dans la mémoire)

voici notre fonction,
Merci d'avance pour votre aide

Code:
void I18nFileAccessor::Initiate()
{
    uint pos = _reader->readInt();
    _reader->setPosition(pos);

    uint indexesCount = _reader->readInt();
    for (int i = 0; i < indexesCount; i += 9)
    {
        uint index = _reader->readInt(); // index(i) ???
        _reader->readBool();
        uint offset = _reader->readInt();
        _indexes[index] = offset;
    }

    int i = _reader->readInt();
    while(i > 0)
    {
        uint oldPos = _reader->getPosition();
        QString index = _reader->readUTF();
        uint offset = _reader->readInt();
        _textIndexes[index] = offset;
        i -= _reader->getPosition() - oldPos;
    }
    _self = true;
}
Pas saisi un truc. Vous le sortez d'où votre readBool en plein milieu ?
La fonction Init ressemble à ça en AS chez moi :

Code:
      public function init(param1:Uri) : void {
         var _loc5_:* = 0;
         var _loc6_:* = 0;
         var _loc8_:String = null;
         var _loc2_:File = param1.toFile();
         if(!_loc2_ || !_loc2_.exists)
         {
            throw new Error("I18n file not readable.");
         }
         else
         {
            this._stream = new FileStream();
            this._stream.endian = Endian.BIG_ENDIAN;
            this._stream.open(_loc2_,FileMode.READ);
            this._indexes = new Dictionary();
            this._textIndexes = new Dictionary();
            _loc3_ = this._stream.readInt();
            this._stream.position = _loc3_;
            _loc4_ = this._stream.readInt();
            _loc7_ = 0;
            while(_loc7_ < _loc4_)
            {
               _loc5_ = this._stream.readInt();
               _loc6_ = this._stream.readInt();
               this._indexes[_loc5_] = _loc6_;
               _loc7_ = _loc7_ + 8;
            }
            while(this._stream.bytesAvailable > 0)
            {
               _loc8_ = this._stream.readUTF();
               _loc6_ = this._stream.readInt();
               this._textIndexes[_loc8_] = _loc6_;
            }
            _log.debug("Initialized !");
            return;
         }
      }
Et aucune trace de readBool.

Et capté le += 9 aussi. Chez moi c'est += 8.

PS : Effectivement, si je passe l'épisode des index, avec le ReadBool et le += 8, je lis des textes tout à fait correct. Seul PB, au bout d'un moment ça plante parce que la clé à déjà été ajoutée.
 
Haut Bas