C# [C#] [d2p] Lecture des Maps

A

Anonymous

Invité
#1
Salut, j'ai repris la lecture des map de Euubot mais des que j'essaye de parser une map, ça ne marche pas ! :/

Ca bloque ici :

Code:
                    byte[] encryptedData = _reader.ReadBytes(dataLen);

                    for (int i = 0; i < dataLen; i++)
                    {
                            encryptedData[i] = (byte)(encryptedData[i] ^ _encryptionKey[i % _encryptionKey.Length]);
                    }
Je me retrouve avec dataLen qui est toujours supérieure a encryptedData ce qui lève une exception : IndexOutOfRangeException :/ Pourtant le code m'a l'air bon et le reader aussi...

Merci d'avance
 
A

Anonymous

Invité
#2
Toujours en attente d'une idée...
 

bouh2

Membre Actif
Inscrit
12 Septembre 2008
Messages
184
Reactions
21
#3
Ne te base pas sur dataLen,
Code:
         byte[] encryptedData = _reader.ReadBytes(dataLen);

                    for (int i = 0; i < encryptedData.Length ; i++)
                    {
                            encryptedData[i] = (byte)(encryptedData[i] ^ _encryptionKey[i % _encryptionKey.Length]);
                    }
 
A

Anonymous

Invité
#4
Okay merci, je vais essayer sa :)
 
A

Anonymous

Invité
#5
Je pense que le reader a un problème ><

Ce code :
Code:
            int groundCRC = _reader.Readint();
            byte layerscount = _reader.ReadByte();
            for (int i = 0; i < layerscount; i++) //layerscount = 115
            {
                new Layer(_reader, mapversion);
            }
Renvoie a sa :

Code:
        public Layer(Reader _reader, byte mapversion)
        {
            int layerid = _reader.Readint();
            short cellcount = _reader.ReadShort();

            for (int i = 0; i < cellcount; i++)
            {
                new Cell(_reader, mapversion);
            }

        }
Où cellcount = 12463 ><, ce qui lève l’exception : Impossible de lire au-delà de la fin du flux.
 

bouh2

Membre Actif
Inscrit
12 Septembre 2008
Messages
184
Reactions
21
#6
Revoit tout ton reader avec la classe Map, puis débug pas à pas voir jusqu'où les valeurs sont cohérentes.
 
A

Anonymous

Invité
#7
Je viens de regarder les source de Dofus et ce sont pas des ReadShort mais des ReadByte ><

Edit : Ah non j'ai rien dit, c'est bizarre ! :o
 
A

Anonymous

Invité
#8
Sa me parait pas très cohérent tous sa :
_topMapid = -1426127403
_bottomMapid = -1407139318
_leftMapid = -125357916
_rightMapid = 1356818388


Code:
        private void InitializeMap()
        {
            byte header = _reader.ReadByte(); // header = 77 (Cohérent)
            if (header != 77) { new ArgumentException("Unknow file format"); }
            byte mapversion = _reader.ReadByte(); // = 7 (Cohérent)
            _mapid = _reader.ReadUint(); // Bon numéro de MapId (Cohérent)

            if (mapversion >= 7)
            {
                bool encrypted = _reader.ReadBoolean(); //True (Cohérent)
                byte encryptionVersion = _reader.ReadByte(); // = 1 Cohérent je pense
                int dataLen = _reader.Readint(); //= ~ 30 000  Jpense c'est bon
                if (encrypted)
                {
                    if (_encryptionKey.Length == 0)
                        throw new InvalidOperationException("Attempt to decrypt a map with no encryption key");

                    byte[] encryptedData = _reader.ReadBytes(dataLen); // encryptedData = {byte[9087]}

                    for (int i = 0; i < encryptedData.Length; i++)
                    {
                        encryptedData[i] = (byte)(encryptedData[i] ^ _encryptionKey[i % _encryptionKey.Length]);
                    }

                    _reader.Close();            
                    _reader = new Reader(new System.IO.MemoryStream(encryptedData));
                }
            }

// A PARTIR D'ICI JE PENSE QUE SA BUG
            uint relativeid = _reader.ReadUint();



            InitializePosition(relativeid); // Sa bug aussi avant sa, il me donne pour position : 61, - 108 alors que je suis en 2, -13
            byte maptype = _reader.ReadByte();
            _subAreaId = _reader.Readint();
            _topMapid = _reader.Readint();
            _bottomMapid = _reader.Readint();
            _leftMapid = _reader.Readint();
            _rightMapid = _reader.Readint();
            int shadowBonusOnEntities = _reader.Readint();
            if (mapversion >= 3)
            {
                byte backgroundred = _reader.ReadByte();
                byte backgroundgreen = _reader.ReadByte();
                byte backgroundblue = _reader.ReadByte();
            }
            if (mapversion >= 4)
            {
                ushort zoomscale = (ushort)(_reader.ReadUshort() / 100);
                short zoomoffsetx = _reader.ReadShort();
                short zoomoffsety = _reader.ReadShort();

            }
            bool uselowpassfilter = _reader.ReadByte() == 1; // _reader.ReadByte() retourne 217 donc a cette endroit la c'est sure que c'est incohérent :/ le problème vient d'avant
            bool usereverb = _reader.ReadByte() == 1;
            if (usereverb)
            { int pressetid = _reader.Readint(); }
            byte backgroundcount = _reader.ReadByte();

            for (int i = 0; i < backgroundcount; i++)
            {
                new Fixture(_reader);
            }

            byte foregroundcount = _reader.ReadByte();

            for (int i = 0; i < foregroundcount; i++)
            {
                new Fixture(_reader);
            }

            _reader.Readint();
            int groundCRC = _reader.Readint();
            byte layerscount = _reader.ReadByte();
            for (int i = 0; i < layerscount; i++)
            {
                new Layer(_reader, mapversion);
            }

            for (int i = 0; i < 560; i++)
            {
                _cellData.Add(new CellData(_reader));
            }
        }
 

bouh2

Membre Actif
Inscrit
12 Septembre 2008
Messages
184
Reactions
21
#9
Essaye avec une autre map, de toute évidence ce n'est pas la bonne clé.
 
A

Anonymous

Invité
#10
Resolu ! :) jm'occupe du pathfinding maintenant :D
 
Inscrit
7 Avril 2010
Messages
151
Reactions
2
#11
Tu devrais donner ta solution car sa pourrais en aider plus d'un
 
A

Anonymous

Invité
#12
Pourrais-tu me faire parvenir ta solution svp?

Merci.

Et pour le pathfinding, il y a déjà un module intégrer dans EuuBot.
 
A

Anonymous

Invité
#13
Bon comme The Falcon ne semble pas intéresser à partager son fixe pour le bug de EuuBot, je vais ré ouvrir ce post. Alors si quelqu'un est intéresser à m'aider à trouver le problème, n'hésitez pas.

C'est quand même dommage de fournir du code et quand quelqu'un trouve une solution (après avoir demandé de l'aide), il la garde pour lui. Mais bon.. ça doit pas être si difficile à trouver mais je manque un peu de temps comme toujours.

Alors premièrement, Bouh2 a trouvé un problème (ne pas utiliser dataLen, voir plus haut). Par contre, il semble que ce ne soit pas le seul pb. Je suspecte un bug dans le reader..
 
Inscrit
29 Septembre 2011
Messages
393
Reactions
3
#14
Se que Mike dit il n'a pas tord vue qu'il partage des grosses choses du style source de Euubot et vous trouver un bug et arrivé a le résoudre vous ne partager c'est quand même méchant mais bon.
 
A

Anonymous

Invité
#15
tifoux a dit:
Se que Mike dit il n'a pas tord vue qu'il partage des grosses choses du style source de Euubot et vous trouver un bug et arrivé a le résoudre vous ne partager c'est quand même méchant mais bon.
Pas méchant mais égoïste mais bon c'es une chose qu'on ne peut reprocher à la espèce humaine.
(Petite modification pour faire plaisir :D )
 

FastFrench

Membre Actif
Inscrit
19 Octobre 2010
Messages
214
Reactions
0
#16
diable-man a dit:
Pas méchant mais égoïste mais bon c'es une chose qu'on ne peut reprocher à la race humaine.
J'aimerais mieux "Espèce" humaine, si tu veux bien.
 

Lakh92

Membre Actif
Inscrit
24 Decembre 2009
Messages
118
Reactions
0
#17
FastFrench a dit:
diable-man a dit:
Pas méchant mais égoïste mais bon c'es une chose qu'on ne peut reprocher à la race humaine.
J'aimerais mieux "Espèce" humaine, si tu veux bien.
FastFrench 1 - 0 diable-man
^^

---

Ceci dit, il semble évident que le souci ne peut pas être trouvé avec le peu d'informations/code que l'on a ici. :x
La meilleure chose à faire c'est d'attendre que The-Falcon donne sa solution lorsqu'il verra tout ça.
 
Haut Bas