C# [3016] InventoryContentMessage

Inscrit
19 Mai 2013
Messages
68
Reactions
0
#1
Bonjour à tous !

Je rencontre un problème sur le paquet 3016, reçu à la connexion pour donner le contenu de l'inventaire. Mais ce problème est très particulier !

En effet, l'inventaire contient 300 objets, et au 29eme, il rencontre un problème. Il s'avère que les 28 objets précédents sont lus sans aucuns soucis et sont d'ailleurs identiques au 29eme (familiers avec mêmes caractéristiques et mêmes horaires de dernier repas). Il se trouve qu'au passage du 4eme effet de l'objet, lors de la lecture de l'instance de l'effet, il trouve 0, chose assez étrange... Je remarque d'autant plus, que l'effet précédent, un ObjetEffectDate, a l'année, le mois, le jour et l'heure qui sont corrects. Par ailleurs, la minute est lue égale à 0 (ce qui n'est pas normal non plus...).

Est-ce un hasard que ces 4 bytes (2 ushorts) qui se suivent soient égaux à 0 ? Comment expliquer cette erreur de lecture alors que les objets précédents sont correctement lus ?

Ca m'embête fortement étant donné que l'instance égale à 0 crée une Exception dans ProtocolTypeManager étant donné qu'aucun type égal à 0 n'existe...

Veriditas :)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#2
Bonjour,

les objets sont envoyés dans un ordre aléatoire. Le problème vient surement d'un précédent objet qui a dérivé sur une autre classe ayant une erreur dans le deserialize ? Tu as pensé a checker vraiment tout les autres objets ?
Sinon, il y a forcement un décalage quelque part.

Envoi nous toutes tes classes, le problème sera surement rapidement détectable.
D'ou vien ton Reader ? Si on pouvais de même le voir.
 
Inscrit
19 Mai 2013
Messages
68
Reactions
0
#3
lolodu93 a dit:
Bonjour,

les objets sont envoyés dans un ordre aléatoire. Le problème vient surement d'un précédent objet qui a dérivé sur une autre classe ayant une erreur dans le deserialize ? Tu as pensé a checker vraiment tout les autres objets ?
Sinon, il y a forcement un décalage quelque part.

Envoi nous toutes tes classes, le problème sera surement rapidement détectable.
D'ou vien ton Reader ? Si on pouvais de même le voir.
Le reader vient de BiM.

Ce qui est bizarre c'est que c'est toujours au même endroit que ça bloque.

Et voici les classes :

InventoryContentMessage

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FeedThem.Sources_Feed_Them.IO;
using FeedThem.Sources_Protocol.Network.Types.Game.Data.Items;
using FeedThem.Sources_Feed_Them.Types;

namespace FeedThem.Sources_Protocol.Network.Messages.Game.Inventory.Items
{
    class InventoryContentMessage : Message
    {
        #region Attributs
        public const uint ID = 3016;
        private ObjectItem[] _objects;
        private int _kamas;
        #endregion

        #region Propriétés
        public override uint protocol_ID
        {
            get { return ID; }
        }
        public ObjectItem[] objects
        {
            get { return _objects; }
            set { _objects = value; }
        }
        public int kamas
        {
            get { return _kamas; }
            set { _kamas = value; }
        }
        #endregion

        #region Constructeurs
        public InventoryContentMessage()
        {
        }
        #endregion

        #region Méthodes publiques
        public override void Serialize(BigEndianWriter big_Endian_Writer)
        {
        }

        public override void Deserialize(BigEndianReader big_Endian_Reader)
        {
            ObjectItem local_Object = null;
            ushort limite = big_Endian_Reader.ReadUShort();
            _objects = new ObjectItem[limite];

            for (ushort index = 0; index < limite; index++ )
            {
                local_Object = new ObjectItem();
                local_Object.Deserialize(big_Endian_Reader);

                _objects[index] = local_Object;
            }

            this._kamas = big_Endian_Reader.ReadInt();

            if (this._kamas < 0)
            {
                throw new Exception("Forbidden value (" + this._kamas + ") on element of InventoryContentMessage.kamas.");
            }
        }
        #endregion
    }
}

ObjectItem

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FeedThem.Sources_Feed_Them.IO;
using FeedThem.Sources_Protocol.Network.Types.Game.Data.Items.Effects;

namespace FeedThem.Sources_Protocol.Network.Types.Game.Data.Items
{
    class ObjectItem
    {
        #region Attributs
        public const uint ID = 37;
        private uint _position;
        private short _object_GID;
        private ObjectEffect[] _effects;
        private int _object_UID;
        private int _quantity;
        #endregion

        #region Propriétés
        public uint position
        {
            get { return _position; }
            set { _position = value; }
        }
        public short object_GID
        {
            get { return _object_GID; }
            set { _object_GID = value; }
        }
        public ObjectEffect[] effects
        {
            get { return _effects; }
            set { _effects = value; }
        }
        public int object_UID
        {
            get { return _object_UID; }
            set { _object_UID = value; }
        }
        public int quantity
        {
            get { return _quantity; }
            set { _quantity = value; }
        }
        #endregion

        #region Constructeurs
        public ObjectItem()
        {
        }
        #endregion

        #region Méthodes publiques
        public void Deserialize(BigEndianReader big_Endian_Reader)
        {
            ushort instance_ID = 0;
            ObjectEffect local_Object_Effect = null;

            this._position = (uint)big_Endian_Reader.ReadByte();

            if (this._position < 0 || this._position > 255)
            {
                throw new Exception("Forbidden value (" + this._position + ") on element of ObjectItem.position.");
            }

            this._object_GID = big_Endian_Reader.ReadShort();

            if (this._object_GID < 0)
            {
                throw new Exception("Forbidden value (" + this._object_GID + ") on element of ObjectItem.objectGID.");
            }

            ushort limite = big_Endian_Reader.ReadUShort();
            _effects = new ObjectEffect[limite];

            for (ushort index = 0; index < limite; index++)
            {
                instance_ID = big_Endian_Reader.ReadUShort();

                local_Object_Effect = ProtocolTypeManager.GetInstance<ObjectEffect>((short)instance_ID);
                local_Object_Effect.Deserialize(big_Endian_Reader);

                _effects[index] = local_Object_Effect;
            }

            this._object_UID = big_Endian_Reader.ReadInt();

            if (this._object_UID < 0)
            {
                throw new Exception("Forbidden value (" + this._object_UID + ") on element of ObjectItem.objectUID.");
            }

            this._quantity = big_Endian_Reader.ReadInt();

            if (this._quantity < 0)
            {
                throw new Exception("Forbidden value (" + this._quantity + ") on element of ObjectItem.quantity.");
            }
        }
        #endregion
    }
}

ObjectEffect

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FeedThem.Sources_Feed_Them.IO;

namespace FeedThem.Sources_Protocol.Network.Types.Game.Data.Items.Effects
{
    class ObjectEffect
    {
        #region Attributs
        public const uint ID = 76;
        private short _action_ID;
        #endregion

        #region Propriétés
        public short action_ID
        {
            get { return _action_ID; }
            set { _action_ID = value; }
        }
        #endregion

        #region Constructeurs
        public ObjectEffect()
        {
        }
        #endregion

        #region Méthodes publiques
        public virtual void Deserialize(BigEndianReader big_Endian_Reader)
        {
            this._action_ID = big_Endian_Reader.ReadShort();

            if (this._action_ID < 0)
            {
                throw new Exception("Forbidden value (" + this._action_ID + ") on element of ObjectEffect.actionId.");
            }
        }
        #endregion
    }
}

ObjectEffectCreature

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FeedThem.Sources_Feed_Them.IO;

namespace FeedThem.Sources_Protocol.Network.Types.Game.Data.Items.Effects
{
    class ObjectEffectCreature : ObjectEffect
    {
        #region Attributs
        public const uint ID = 71;
        private short _monster_Family_ID;
        #endregion

        #region Propriétés
        public short monster_Family_ID
        {
            get { return _monster_Family_ID; }
            set { _monster_Family_ID = value; }
        }
        #endregion

        #region Constructeurs
        public ObjectEffectCreature()
        {
        }
        #endregion

        #region Méthodes publiques
        public override void Deserialize(BigEndianReader big_Endian_Reader)
        {
            base.Deserialize(big_Endian_Reader);

            this._monster_Family_ID = big_Endian_Reader.ReadShort();

            if (this._monster_Family_ID < 0)
            {
                throw new Exception("Forbidden value (" + this._monster_Family_ID + ") on element of ObjectEffectCreature.monsterFamilyId.");
            }
        }
        #endregion
    }
}

ObjectEffectDate

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FeedThem.Sources_Feed_Them.IO;

namespace FeedThem.Sources_Protocol.Network.Types.Game.Data.Items.Effects
{
    class ObjectEffectDate : ObjectEffect
    {
        #region Attributs
        public const uint ID = 72;
        private short _year;
        private short _month;
        private short _day;
        private short _hour;
        private short _minute;
        #endregion

        #region Propriétés
        public short year
        {
            get { return _year; }
            set { _year = value; }
        }
        public short month
        {
            get { return _month; }
            set { _month = value; }
        }
        public short day
        {
            get { return _day; }
            set { _day = value; }
        }
        public short hour
        {
            get { return _hour; }
            set { _hour = value; }
        }
        public short minute
        {
            get { return _minute; }
            set { _minute = value; }
        }
        #endregion

        #region Constructeurs
        public ObjectEffectDate()
        {
        }
        #endregion

        #region Méthodes publiques
        public override void Deserialize(BigEndianReader big_Endian_Reader)
        {
            base.Deserialize(big_Endian_Reader);

            this._year = big_Endian_Reader.ReadShort();

            if (this._year < 0)
            {
                throw new Exception("Forbidden value (" + this._year + ") on element of ObjectEffectInteger.value.");
            }

            this._month = big_Endian_Reader.ReadShort();

            if (this._month < 0)
            {
                throw new Exception("Forbidden value (" + this._month + ") on element of ObjectEffectDate.month.");
            }

            this._day = big_Endian_Reader.ReadShort();

            if (this._day < 0)
            {
                throw new Exception("Forbidden value (" + this._day + ") on element of ObjectEffectDate.day.");
            }

            this._hour = big_Endian_Reader.ReadShort();

            if (this._hour < 0)
            {
                throw new Exception("Forbidden value (" + this._hour + ") on element of ObjectEffectDate.hour.");
            }

            this._minute = big_Endian_Reader.ReadShort();

            if (this._minute < 0)
            {
                throw new Exception("Forbidden value (" + this._minute + ") on element of ObjectEffectDate.minute.");
            }
        }
        #endregion
    }
}

ObjectEffectDice

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FeedThem.Sources_Feed_Them.IO;

namespace FeedThem.Sources_Protocol.Network.Types.Game.Data.Items.Effects
{
    class ObjectEffectDice : ObjectEffect
    {
        #region Attributs
        public const uint ID = 73;
        private short _dice_Num;
        private short _dice_Side;
        private short _dice_Const;
        #endregion

        #region Propriétés
        public short dice_Num
        {
            get { return _dice_Num; }
            set { _dice_Num = value; }
        }
        public short dice_Side
        {
            get { return _dice_Side; }
            set { _dice_Side = value; }
        }
        public short dice_Const
        {
            get { return _dice_Const; }
            set { _dice_Const = value; }
        }
        #endregion

        #region Constructeurs
        public ObjectEffectDice()
        {
        }
        #endregion

        #region Méthodes publiques
        public override void Deserialize(BigEndianReader big_Endian_Reader)
        {
            base.Deserialize(big_Endian_Reader);

            this._dice_Num = big_Endian_Reader.ReadShort();

            if (this._dice_Num < 0)
            {
                throw new Exception("Forbidden value (" + this._dice_Num + ") on element of ObjectEffectDice.diceNum.");
            }

            this._dice_Side = big_Endian_Reader.ReadShort();

            if (this._dice_Side < 0)
            {
                throw new Exception("Forbidden value (" + this._dice_Side + ") on element of ObjectEffectDice.diceSide.");
            }

            this._dice_Const = big_Endian_Reader.ReadShort();

            if (this._dice_Const < 0)
            {
                throw new Exception("Forbidden value (" + this._dice_Const + ") on element of ObjectEffectDice.diceConst.");
            }
        }
        #endregion
    }
}

ObjectEffectDuration

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FeedThem.Sources_Feed_Them.IO;

namespace FeedThem.Sources_Protocol.Network.Types.Game.Data.Items.Effects
{
    class ObjectEffectDuration : ObjectEffect
    {
        #region Attributs
        public const uint ID = 75;
        private short _days;
        private short _hours;
        private short _minutes;
        #endregion

        #region Propriétés
        public short days
        {
            get { return _days; }
            set { _days = value; }
        }
        public short hours
        {
            get { return _hours; }
            set { _hours = value; }
        }
        public short minutes
        {
            get { return _minutes; }
            set { _minutes = value; }
        }
        #endregion

        #region Constructeurs
        public ObjectEffectDuration()
        {
        }
        #endregion

        #region Méthodes publiques
        public override void Deserialize(BigEndianReader big_Endian_Reader)
        {
            base.Deserialize(big_Endian_Reader);

            this._days = big_Endian_Reader.ReadShort();

            if (this._days < 0)
            {
                throw new Exception("Forbidden value (" + this._days + ") on element of ObjectEffectDuration.days.");
            }

            this._hours = big_Endian_Reader.ReadShort();

            if (this._hours < 0)
            {
                throw new Exception("Forbidden value (" + this._hours + ") on element of ObjectEffectDuration.hours.");
            }

            this._minutes = big_Endian_Reader.ReadShort();

            if (this._minutes < 0)
            {
                throw new Exception("Forbidden value (" + this._minutes + ") on element of ObjectEffectDuration.minutes.");
            }
        }
        #endregion
    }
}

ObjectEffectInteger

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FeedThem.Sources_Feed_Them.IO;

namespace FeedThem.Sources_Protocol.Network.Types.Game.Data.Items.Effects
{
    class ObjectEffectInteger : ObjectEffect
    {
        #region Attributs
        public const uint ID = 70;
        private short _value;
        #endregion

        #region Propriétés
        public short value
        {
            get { return _value; }
            set { _value = value; }
        }
        #endregion

        #region Constructeurs
        public ObjectEffectInteger()
        {
        }
        #endregion

        #region Méthodes publiques
        public override void Deserialize(BigEndianReader big_Endian_Reader)
        {
            base.Deserialize(big_Endian_Reader);

            this._value = big_Endian_Reader.ReadShort();

            if (this._value < 0)
            {
                throw new Exception("Forbidden value (" + this._value + ") on element of ObjectEffectInteger.value.");
            }
        }
        #endregion
    }
}

ObjectEffectLadder

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FeedThem.Sources_Feed_Them.IO;

namespace FeedThem.Sources_Protocol.Network.Types.Game.Data.Items.Effects
{
    class ObjectEffectLadder : ObjectEffectCreature
    {
        #region Attributs
        public const uint ID = 81;
        private int _monster_Count;
        #endregion

        #region Propriétés
        public int monster_Count
        {
            get { return _monster_Count; }
            set { _monster_Count = value; }
        }
        #endregion

        #region Constructeurs
        public ObjectEffectLadder()
        {
        }
        #endregion

        #region Méthodes publiques
        public override void Deserialize(BigEndianReader big_Endian_Reader)
        {
            base.Deserialize(big_Endian_Reader);

            this._monster_Count = big_Endian_Reader.ReadInt();

            if (this._monster_Count < 0)
            {
                throw new Exception("Forbidden value (" + this._monster_Count + ") on element of ObjectEffectLadder.monsterCount.");
            }
        }
        #endregion
    }
}

ObjectEffectMinMax

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FeedThem.Sources_Feed_Them.IO;

namespace FeedThem.Sources_Protocol.Network.Types.Game.Data.Items.Effects
{
    class ObjectEffectMinMax : ObjectEffect
    {
        #region Attributs
        public const uint ID = 82;
        private short _min;
        private short _max;
        #endregion

        #region Propriétés
        public short min
        {
            get { return _min; }
            set { _min = value; }
        }
        public short max
        {
            get { return _max; }
            set { _max = value; }
        }
        #endregion

        #region Constructeurs
        public ObjectEffectMinMax()
        {
        }
        #endregion

        #region Méthodes publiques
        public override void Deserialize(BigEndianReader big_Endian_Reader)
        {
            base.Deserialize(big_Endian_Reader);

            this._min = big_Endian_Reader.ReadShort();

            if (this._min < 0)
            {
                throw new Exception("Forbidden value (" + this._min + ") on element of ObjectEffectMinMax.min.");
            }

            this._max = big_Endian_Reader.ReadShort();

            if (this._max < 0)
            {
                throw new Exception("Forbidden value (" + this._max + ") on element of ObjectEffectMinMax.max.");
            }
        }
        #endregion
    }
}

ObjectEffectMount

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FeedThem.Sources_Feed_Them.IO;

namespace FeedThem.Sources_Protocol.Network.Types.Game.Data.Items.Effects
{
    class ObjectEffectMount : ObjectEffect
    {
        #region Attributs
        public const uint ID = 179;
        private int _mount_ID;
        private double _date;
        private short _model_ID;
        #endregion

        #region Propriétés
        public int mount_ID
        {
            get { return _mount_ID; }
            set { _mount_ID = value; }
        }
        public double date
        {
            get { return _date; }
            set { _date = value; }
        }
        public short model_ID
        {
            get { return _model_ID; }
            set { _model_ID = value; }
        }
        #endregion

        #region Constructeurs
        public ObjectEffectMount()
        {
        }
        #endregion

        #region Méthodes publiques
        public override void Deserialize(BigEndianReader big_Endian_Reader)
        {
            base.Deserialize(big_Endian_Reader);

            this._mount_ID = big_Endian_Reader.ReadInt();

            if (this._mount_ID < 0)
            {
                throw new Exception("Forbidden value (" + this._mount_ID + ") on element of ObjectEffectMount.mountId.");
            }

            this._date = big_Endian_Reader.ReadDouble();
            this._model_ID = big_Endian_Reader.ReadShort();

            if (this._model_ID < 0)
            {
                throw new Exception("Forbidden value (" + this._model_ID + ") on element of ObjectEffectMount.modelId.");
            }
        }
        #endregion
    }
}

ObjectEffectString

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FeedThem.Sources_Feed_Them.IO;

namespace FeedThem.Sources_Protocol.Network.Types.Game.Data.Items.Effects
{
    class ObjectEffectString : ObjectEffect
    {
        #region Attributs
        public const uint ID = 74;
        private string _value_;
        #endregion

        #region Propriétés
        public string value_
        {
            get { return _value_; }
            set { _value_ = value; }
        }
        #endregion

        #region Constructeurs
        public ObjectEffectString()
        {
        }
        #endregion

        #region Méthodes publiques
        public override void Deserialize(BigEndianReader big_Endian_Reader)
        {
            base.Deserialize(big_Endian_Reader);

            this._value_ = big_Endian_Reader.ReadStringUTF8();
        }
        #endregion
    }
}

Si vous voulez d'autres classes, dites le moi, sachant que j'ai pas trop Internet vu que je suis à la montagne (j'arrive à chopper un SFR WiFi Public quand il fait pas trop mauvais !)

Merci d'avance ! :)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
Je regarde sa soit ce soir soit demain. La je suis en déplacement, je pourrais tout checker un peu plus tard.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#6
Je suis rentré hier, j'installe dofus.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#8
Bonne année a toi et à tout cadernis.

Petit souvenir de l'ancien header de cadernis :)

 
Inscrit
19 Mai 2013
Messages
68
Reactions
0
#9
Bon, j'ai passé 2h avec TeamViewer avec ToOnS pour essayer de trouver une solution. On simulait des connexions à partir d'un sniff de connexion échouée, et impossible de trouver... Je suis désespéré là ! J'ai check toute ma traduction des classes impliquées dans la lecture de InventoryContentMessage sur le bot d'un ami, toutes sont correctes, mon reader est celui de BiM donc correct, le paquet est correct après le passage au parser... Je vois pas où on pourrait chercher d'autre...
 

FastFrench

Membre Actif
Inscrit
19 Octobre 2010
Messages
214
Reactions
0
#10
Bonjour, voici quelques pistes :
- le protocole de BiM est-il bien à jour ? Il est possible que les messages de D@fus aient évolué, auquel cas il faut penser à reconstruire le protocole (avec les outils fournis).
- essaie de voir si le problème intervient au Nième objet (avec un autre perso ayant au moins autant d'objets dans l'inventaire) ou sur un objet en particulier (en gardant la 1ère moitié des objets par exemple, puis la seconde). Essaie de voir si il n'y a pas un truc particulier sur la dinde fautive (genre un accent dans son nom...).
- ce message est l'un des plus long. Il arrive parfois sur plusieurs paquets. Ce qui peut être la source du problème (normalement c'est correctement géré par BiM, mais bon...).
- essaie aussi de déséquiper tous les objets du perso (en te connectant sans BiM). Quand j'avais des problèmes de connection intempestifs, ça corrigeait parfois le problème.

Good luck !
 
Inscrit
19 Mai 2013
Messages
68
Reactions
0
#11
FastFrench a dit:
Bonjour, voici quelques pistes :
- le protocole de BiM est-il bien à jour ? Il est possible que les messages de D@fus aient évolué, auquel cas il faut penser à reconstruire le protocole (avec les outils fournis).
- essaie de voir si le problème intervient au Nième objet (avec un autre perso ayant au moins autant d'objets dans l'inventaire) ou sur un objet en particulier (en gardant la 1ère moitié des objets par exemple, puis la seconde). Essaie de voir si il n'y a pas un truc particulier sur la dinde fautive (genre un accent dans son nom...).
- ce message est l'un des plus long. Il arrive parfois sur plusieurs paquets. Ce qui peut être la source du problème (normalement c'est correctement géré par BiM, mais bon...).
- essaie aussi de déséquiper tous les objets du perso (en te connectant sans BiM). Quand j'avais des problèmes de connection intempestifs, ça corrigeait parfois le problème.

Good luck !
Juste pour te préciser que je n'utilise pas BiM. J'utilise juste son reader/writer. Le reste est codé par moi (j'ai dit pas avoir inventé hein, mais c'est pas un copié collé tout concomme j'ai pu faire pour le reader/writer de BiM).

Tout, d'abord, je tiens à faire une précision. J'ai remarqué que c'est le premier message que je traite qui ne tient pas sur un seul buffer (oui, c'est plutôt un gros inventaire). ToOnS a cherché un long moment et a peut-être trouvé une piste. En effet, il a remarqué qu'à la sortie du parser, tous les bouts du messages sont reconstitués correctement. Mais une fois passé dans le BinaryReader, le BaseStream ne contient qu'une partie du paquet. En effet, il semblerait qu'il contienne uniquement le premier bout, le reste correspond uniquement à des bytes valant 0.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#13
Hello, ajoute moi sur skype, j'aimerais voir sa.

BlueDream
 
Dernière édition:
Inscrit
19 Mai 2013
Messages
68
Reactions
0
#14
BlueDream a dit:
Hello, ajoute moi sur skype, j'aimerais voir sa.

BlueDream
Ajoute moi, il y a 2 BlueDream (bob-malbert).

Juste une précision, j'ai check, et il s'avère que tous les bytes sont bels et biens dans le BaseStream. Par contre, je remarque que dès la première variable de InventoryContentMessage lue, il y a une erreur (il lit une longueur d'inventaire de 91 objet au lieu de 190). Je rappelle que mon BigEndianReader est celui de bouh², donc l'erreur ne vient sûrement pas de là. Là, je me penche sur le parser, ça vient peut-être du moment où il recolle les morceaux du packet.

EDIT :

En fait j'ai dit n'importe quoi dans ce qui est en italique ! J'oubliais que le nombre donné était le nombre d'items différents. J'ai en effet bel et bien 91 items différents. Je continue à chercher !

EDIT 2 :

[22:33:28] Veriditas: En fait, dans le parser :

Array.Copy(packet_In, packet_Start, _packet_Out, 0, packet_In.Length - packet_Start); // Copie le début du message dans un buffer

(C'est quand le buffer reçu ne contient pas tout le message)

Au lieu de ça, j'avais mis :

Array.Copy(packet_In, packet_Start, _packet_Out, 0, packet_In.Length - index); // Copie le début du message dans un buffer

(Et l'index ignore l'ID et la longueur du paquet soit ici 4 bytes).

Comme Array.Copy est comme ça :

public static void Copy(
Array sourceArray,
int sourceIndex,
Array destinationArray,
int destinationIndex,
int length
)

sourceArray
Type : System.Array
Array qui contient les données à copier.
sourceIndex
Type : System.Int32
Entier 32 bits qui représente l'index de sourceArray à partir duquel la copie commence.
destinationArray
Type : System.Array
Array qui reçoit les données.
destinationIndex
Type : System.Int32
Entier 32 bits qui représente l'index de destinationArray à partir duquel le stockage commence.
length
Type : System.Int32
Entier 32 bits qui représente le nombre d'éléments à copier.

Ce qui faisait un décallage de 4 bytes, donc un vide de 4 bytes au milieu du paquet !
 
Dernière édition par un modérateur:
Haut Bas