C# Je ne recoi pas le 153 (CharacterSelectedSuccessMessage)

Inscrit
10 Février 2020
Messages
19
Reactions
1
#1
Bonjour,
J'ai absolument besoin de récupérer les données contenu dans ce message mais pour je ne sais quelle raison je ne le recoi pas.

Logs:
C#:
6:55:01 : LOCAL - Id: 4 Length: 276
6:55:01 : LOCAL - Id: 5607 Length: 23
6:55:02 : LOCAL - Id: 40 Length: 1
6:55:03 : GAME - Id: 1 Length: 8
6:55:03 : LOCAL - Id: 110 Length: 38
6:55:03 : GAME - Id: 8903 Length: 7
6:55:03 : GAME - Id: 3734 Length: 35
6:55:03 : GAME - Id: 7703 Length: 28
6:55:03 : GAME - Id: 3143 Length: 200
6:55:05 : LOCAL - Id: 6372 Length: 258
6:55:05 : GAME - Id: 6769 Length: 21
6:55:05 : GAME - Id: 6649 Length: 38
6:55:06 : GAME - Id: 6100 Length: 4
6:55:06 : GAME - Id: 6100 Length: 4
[B]6:55:11 : LOCAL - Id: 152 Length: 6
6:55:11 : GAME - Id: 6100 Length: 4
6:55:11 : GAME - Id: 6860 Length: 7
6:55:11 : GAME - Id: 6087 Length: 6[/B]
6:55:12 : GAME - Id: 883 Length: 91
6:55:12 : GAME - Id: 4002 Length: 164
6:55:12 : GAME - Id: 6820 Length: 2
6:55:12 : GAME - Id: 5674 Length: 2
6:55:13 : LOCAL - Id: 5607 Length: 71
6:55:13 : GAME - Id: 200 Length: 1
Classe pour décoder les packets:
C#:
 public class Packet
    {
        public bool IsValid
        {
            get
            {
                return Header.HasValue && Length.HasValue &&
                       Length == Data.Length;
            }
        }
        public int? MessageId
        {
            get
            {
                if (!Header.HasValue)
                    return null;
                return Header >> 2;
            }
        }
        public string Name
        {
            get
            {
                if (!MessageId.HasValue)
                    return null;
                return PacketNames.GetClasseName((int)MessageId);
            }
        }

        public ushort? Header { get; set; }
        public uint Count { get; set; }

        public int? Length { get; set; }
        public byte[] Data
        {
            get { return m_data; }
            private set { m_data = value; }
        }

        private byte[] m_data;
        public bool Parse(BigEndianReader reader, bool isClient)
        {
            if (IsValid)
                return true;

            if (reader.BytesAvailable >= 2 && !Header.HasValue)
            {
                Header = reader.ReadUShort();
            }

            if (isClient)
                Count = reader.ReadUInt();

            var dataLengthBytesCount = Header & 0x3;

            if (reader.BytesAvailable >= dataLengthBytesCount)
            {
                if (dataLengthBytesCount < 0 || dataLengthBytesCount > 3)
                    throw new ArgumentOutOfRangeException(nameof(dataLengthBytesCount));

                Length = 0;
                for (var i = dataLengthBytesCount - 1; i >= 0; i--)
                    Length |= reader.ReadByte() << (i * 8);
            }

            if (Length <= 0) return false;

            if (Data == null && Length >= 0)
            {
                if (Length == 0)
                    Data = new byte[0];

                if (reader.BytesAvailable >= Length)
                {
                    Data = reader.ReadBytes(Length.Value);
                }
                else if (Length > reader.BytesAvailable)
                    Data = reader.ReadBytes((int)reader.BytesAvailable);
            }

            // Message divisé !

            if (Data != null && Length != 0 && Data.Length < Length)
            {

                var bytesToRead = 0;

                if (Data.Length + reader.BytesAvailable < Length)
                    bytesToRead = (int)reader.BytesAvailable;

                else if (Data.Length + reader.BytesAvailable >= Length)
                    bytesToRead = (int)Length - Data.Length;

                if (bytesToRead != 0)
                {
                    var oldLength = Data.Length;
                    Array.Resize(ref m_data, (Data.Length + bytesToRead));
                    Array.Copy(reader.ReadBytes(bytesToRead), 0, Data, oldLength, bytesToRead);
                }
            }

            return IsValid;
        }
    }
Peut être que la méthode que j'utilise pour analyser les packets n'est plus à jour ?
Si quelqu'un à une idée là dessus. Merci !
 

BlueDream

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

Il te manque un ReadInt pour l'instanceId si je ne me trompe pas.
 
Inscrit
10 Février 2020
Messages
19
Reactions
1
#3
Salut BlueDream,
L'instance ID est gérer par le code suivant
C#:
  if (isClient)
                Count = reader.ReadUInt();
Ce que j'arrive pas à gérer c'est les messages séparés... :(
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
C'est ton traitement de paquet je pense qui est incomplet, ce qui se passe avant l'appel de ta fonction parse.
Tu peux nous partager le code stp
 
Inscrit
10 Février 2020
Messages
19
Reactions
1
#5
Ah bon tu crois ?
Bien sur voilà le code que j'utilise pour chaque client :
Par exemple avec le Game Server:

C#:
   Debug debug = new Debug();
            BigEndianReader reader = new BigEndianReader(data);
            while (debug.Build(reader, false))
            {
                Logger.Write("Id: " + debug.MessageId, true);
                Logger.Write("Length: " + debug.Length, true);
                Logger.Write("Data Length: " + debug.Data.Length, true);

            }
 
Dernière édition:
Haut Bas