Bonsoir,
Je m'excuse d'avance pour le dérangement, mais je m'arrache les cheveux sur la désérialisation du packet InventoryContentMessage :(
Voici mon code pas propre du tout, mais que j'ai du simplifier au maximum pour essayer de trouver où pouvait se passer le problème :
Cliquez pour révéler
Cliquez pour masquer
using Elypse.UI;
using Elypse.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Elypse.Protocol.Server.Game.Inventory.Items
{
public class InventoryContentMessage
{
private tabBot _Program;
public const int _ProtocolID = 3016;
private DataReader reader;
public InventoryContentMessage(tabBot parent, byte[] data)
{
this._Program = parent;
this.reader = new DataReader(data);
deserialize();
}
private void deserialize_ObjectItem()
{
byte position = reader.ReadByte();
MessageBox.Show("position = " + position);
if (position < 0 || position > 255)
{
this._Program.Log("Erreur dans la position : " + position);
return;
}
short objectGID = reader.ReadShort();
MessageBox.Show("objectGID = " + objectGID);
if (objectGID < 0)
{
this._Program.Log("Erreur dans objectGID : " + objectGID);
return;
}
short powerRate = reader.ReadShort();
bool overMax = reader.ReadBool();
ushort limit = reader.ReadUnsignedShort();
MessageBox.Show("LIMIT = " + limit);
for (int j = 0; j < limit; j++)
{
short id = reader.ReadShort();
short actionID = reader.ReadShort();
MessageBox.Show("ID = " + id + " ; actionID = " + actionID);
}
int objectUID = reader.ReadInt();
MessageBox.Show("objectUID = " + objectUID);
if (objectUID < 0)
{
this._Program.Log("Erreur dans objectUID : " + objectUID);
return;
}
int quantity = reader.ReadInt();
MessageBox.Show("quantity = " + quantity);
if (quantity < 0)
{
this._Program.Log("Erreur dans quantity : " + quantity);
return;
}
}
private void deserialize()
{
int nbrObjets = reader.ReadUnsignedShort();
this._Program.Log("Il y a " + nbrObjets + " objets sur le personnage.");
for (int i = 0; i < nbrObjets; i++)
{
deserialize_ObjectItem();
}
int kamas = reader.ReadInt();
this._Program.Log("Il y a " + kamas + " kamas sur le personnage.");
//deserialize_ObjectItemTEST();
}
private void deserialize_ObjectItemTEST()
{
byte[] dataToTest = { 0x0C, 0x05, 0x39, 0x00, 0x2A, 0x00, 0x00, 0x01, 0x00, 0x4C, 0x00, 0x7B, 0x07, 0x5B, 0xCD, 0x15, 0x00, 0x00, 0x00, 0x0C };
DataReader reader2 = new DataReader(dataToTest);
byte position = reader2.ReadByte();
MessageBox.Show("position = " + position);
if (position < 0 || position > 255)
{
this._Program.Log("Erreur dans la position : " + position);
return;
}
short objectGID = reader2.ReadShort();
MessageBox.Show("objectGID = " + objectGID);
if (objectGID < 0)
{
this._Program.Log("Erreur dans objectGID : " + objectGID);
return;
}
short powerRate = reader2.ReadShort();
bool overMax = reader2.ReadBool();
MessageBox.Show("powerRate = " + powerRate + " ; overMax = " + overMax);
ushort limit = reader2.ReadUnsignedShort();
MessageBox.Show("LIMIT = " + limit);
for (int j = 0; j < limit; j++)
{
short id = reader2.ReadShort();
short actionID = reader2.ReadShort();
MessageBox.Show("ID = " + id + " ; actionID = " + actionID);
}
int objectUID = reader2.ReadInt();
MessageBox.Show("objectUID = " + objectUID);
if (objectUID < 0)
{
this._Program.Log("Erreur dans objectUID : " + objectUID);
return;
}
int quantity = reader2.ReadInt();
MessageBox.Show("quantity = " + quantity);
if (quantity < 0)
{
this._Program.Log("Erreur dans quantity : " + quantity);
return;
}
}
}
}
Pourtant, quand je me connecte avec un personnage équipé d'une simple panoplie du débutant, j'obtiens :
Cliquez pour révéler
Cliquez pour masquer
Il y a 13 objets sur le personnage.
position = 5
objectGID = 10794
LIMIT = 3
ID = 70 ; actionID = 125
ID = 1 ; actionID = 70
ID = 174 ; actionID = 1
objectUID = 4981717
quantity = 99102742
position = 0
objectGID = 0
LIMIT = 8448
...
Or, il y a bien 13 objets sur le personnage, je reçois position = 5, c'est à dire les bottes, 10794 correspond bien à l'ID des bottes, mais je n'ai aucun moyen de vérifier les effets.
De plus, l'objectUID me semble suspect, et la quantité est fausse...
J'ai testé (avec Moonlight-Angel, merci ! :P ) mon DataReader, et il est correct, donc ça ne vient pas de là.
J'ai l'impression que j'oublie de lire une information, ce qui fait que la suite se retrouve faussée...
Quelqu'un aurait une petite idée ? :?
Merci beaucoup !