Selon moi quand vous essayez de traduire un packet Dofus 2, il faut pas essayer de mettre du sens au nom des méthodes mais plutôt faire une traduction de l'AS3 vers votre langage.
Pour commencer, pour identifier un packet selon son identifiant, rendez-vous dans script.com.ankamagames.jerakine.network.ServerConnection :
protected function lowReceive(src:IDataInput) : INetworkMessage
{
var msg:INetworkMessage = null;
var staticHeader:uint = 0;
var messageId:uint = 0;
var messageLength:uint = 0;
if(!this._splittedPacket)
{
if(src.bytesAvailable < 2)
{
if(DEBUG_LOW_LEVEL_VERBOSE)
{
_log.info("[" + this._id + "] Not enough data to read the header, byte available : " + src.bytesAvailable + " (needed : 2)");
}
return null;
}
staticHeader = src.readUnsignedShort();
messageId = this.getMessageId(staticHeader);
if(src.bytesAvailable >= (staticHeader & NetworkMessage.BIT_MASK))
{
messageLength = this.readMessageLength(staticHeader,src);
if(src.bytesAvailable >= messageLength)
{
this.updateLatency();
if(this.getUnpackMode(messageId,messageLength) == UnpackMode.ASYNC)
{
src.readBytes(this._input,this._input.length,messageLength);
msg = this._rawParser.parseAsync(new CustomDataWrapper(this._input),messageId,messageLength,this.computeMessage);
if(DEBUG_LOW_LEVEL_VERBOSE && msg != null)
{
_log.info("[" + this._id + "] Async " + this.getType(msg) + " parsing, message length : " + messageLength + ")");
}
}
else
{
msg = this._rawParser.parse(new CustomDataWrapper(src),messageId,messageLength);
if(DEBUG_LOW_LEVEL_VERBOSE)
{
_log.info("[" + this._id + "] Full parsing done");
}
}
return msg;
}
if(DEBUG_LOW_LEVEL_VERBOSE)
{
_log.info("[" + this._id + "] Not enough data to read msg content, byte available : " + src.bytesAvailable + " (needed : " + messageLength + ")");
}
this._staticHeader = -1;
this._splittedPacketLength = messageLength;
this._splittedPacketId = messageId;
this._splittedPacket = true;
src.readBytes(this._inputBuffer,0,src.bytesAvailable);
return null;
}
if(DEBUG_LOW_LEVEL_VERBOSE)
{
_log.info("[" + this._id + "] Not enough data to read message ID, byte available : " + src.bytesAvailable + " (needed : " + (staticHeader & NetworkMessage.BIT_MASK) + ")");
}
this._staticHeader = staticHeader;
this._splittedPacketLength = messageLength;
this._splittedPacketId = messageId;
this._splittedPacket = true;
return null;
}
if(this._staticHeader != -1)
{
this._splittedPacketLength = this.readMessageLength(this._staticHeader,src);
this._staticHeader = -1;
}
if(src.bytesAvailable + this._inputBuffer.length >= this._splittedPacketLength)
{
src.readBytes(this._inputBuffer,this._inputBuffer.length,this._splittedPacketLength - this._inputBuffer.length);
this._inputBuffer.position = 0;
this.updateLatency();
if(this.getUnpackMode(this._splittedPacketId,this._splittedPacketLength) == UnpackMode.ASYNC)
{
msg = this._rawParser.parseAsync(new CustomDataWrapper(this._inputBuffer),this._splittedPacketId,this._splittedPacketLength,this.computeMessage);
if(DEBUG_LOW_LEVEL_VERBOSE && msg != null)
{
_log.info("[" + this._id + "] Async splitted " + this.getType(msg) + " parsing, message length : " + this._splittedPacketLength + ")");
}
}
else
{
msg = this._rawParser.parse(new CustomDataWrapper(this._inputBuffer),this._splittedPacketId,this._splittedPacketLength);
if(DEBUG_LOW_LEVEL_VERBOSE)
{
_log.info("[" + this._id + "] Full parsing done");
}
}
this._splittedPacket = false;
this._inputBuffer = new ByteArray();
return msg;
}
src.readBytes(this._inputBuffer,this._inputBuffer.length,src.bytesAvailable);
return null;
}
Ensuite pour lire le contenu du packet. vous devrez traduire la méthode unpack qui n'est rien d'autre qu'un deserialize du packet en question. Ici rien de compliqué mais attention a bien traduire la classe script.com.ankamagames.jerakine.network.CustomDataWrapper
Celle-ci répertorie toutes les méthodes pour lire le contenu de votre packet. (ainsi que toutes les méthodes pour l'écrire).
Quelques petits conseils sur mes erreurs passées (en .NET framework)
public function readByte() : int
{
return this._data.readByte();
}
public function readUnsignedByte() : uint
{
return this._data.readUnsignedByte();
}
L'équivalent de la méthode readByte() en AS3 est enfaite un readSbyte() en c# [-128;127]
L'équivalent de la méthode readUnsignedByte() en AS3 est enfaite un readByte() en c# [0;255]
Pour traduire l'équivalent du <<< en AS3, Je procède de cette manière en c# : j’effectue l'opération << le tout d'un cast en Uint
Voila, je pense un peu avoir fait le tour, c'est vraiment important de bien savoir traduire du code AS3 vers ton language de programmation ainsi que d'avoir une idée globale de l'architecture du jeu.