IdentificationMessage Dofus v2.11

A

Anonymous

Invité
#1
Bonjour,

Je commence un petit bot socket pour Dofus 2 (actuellement en v2.11). J'en suis à l'envoi du IdentificationMessage. Je vous rappelle sa tête :
Code:
package com.ankamagames.dofus.network.messages.connection
{
   import com.ankamagames.jerakine.network.NetworkMessage;
   import com.ankamagames.jerakine.network.INetworkMessage;
   import com.ankamagames.dofus.network.types.version.VersionExtended;
   import __AS3__.vec.Vector;
   import flash.utils.IDataOutput;
   import flash.utils.ByteArray;
   import flash.utils.IDataInput;
   import com.ankamagames.jerakine.network.utils.BooleanByteWrapper;


   public class IdentificationMessage extends NetworkMessage implements INetworkMessage
   {
         

      public function IdentificationMessage() {
         this.version=new VersionExtended();
         this.credentials=new Vector.<int>();
         super();
      }

      public static const protocolId:uint = 4;

      private var _isInitialized:Boolean = false;

      override public function get isInitialized() : Boolean {
         return this._isInitialized;
      }

      public var version:VersionExtended;

      public var lang:String = "";

      public var credentials:Vector.<int>;

      public var serverId:int = 0;

      public var autoconnect:Boolean = false;

      public var useCertificate:Boolean = false;

      public var useLoginToken:Boolean = false;

      override public function getMessageId() : uint {
         return 4;
      }

      public function initIdentificationMessage(param1:VersionExtended=null, param2:String="", param3:Vector.<int>=null, param4:int=0, param5:Boolean=false, param6:Boolean=false, param7:Boolean=false) : IdentificationMessage {
         this.version=param1;
         this.lang=param2;
         this.credentials=param3;
         this.serverId=param4;
         this.autoconnect=param5;
         this.useCertificate=param6;
         this.useLoginToken=param7;
         this._isInitialized=true;
         return this;
      }

      override public function reset() : void {
         this.version=new VersionExtended();
         this.credentials=new Vector.<int>();
         this.serverId=0;
         this.autoconnect=false;
         this.useCertificate=false;
         this.useLoginToken=false;
         this._isInitialized=false;
      }

      override public function pack(param1:IDataOutput) : void {
         var _loc2_:ByteArray = new ByteArray();
         this.serialize(_loc2_);
         writePacket(param1,this.getMessageId(),_loc2_);
      }

      override public function unpack(param1:IDataInput, param2:uint) : void {
         this.deserialize(param1);
      }

      public function serialize(param1:IDataOutput) : void {
         this.serializeAs_IdentificationMessage(param1);
      }

      public function serializeAs_IdentificationMessage(param1:IDataOutput) : void {
         var _loc2_:uint = 0;
         _loc2_=BooleanByteWrapper.setFlag(_loc2_,0,this.autoconnect);
         _loc2_=BooleanByteWrapper.setFlag(_loc2_,1,this.useCertificate);
         _loc2_=BooleanByteWrapper.setFlag(_loc2_,2,this.useLoginToken);
         param1.writeByte(_loc2_);
         this.version.serializeAs_VersionExtended(param1);
         param1.writeUTF(this.lang);
         param1.writeShort(this.credentials.length);
         var _loc3_:uint = 0;
         while(_loc3_<this.credentials.length)
         {
            param1.writeByte(this.credentials[_loc3_]);
            _loc3_++;
         }
         param1.writeShort(this.serverId);
      }

      public function deserialize(param1:IDataInput) : void {
         this.deserializeAs_IdentificationMessage(param1);
      }

      public function deserializeAs_IdentificationMessage(param1:IDataInput) : void {
         var _loc5_:* = 0;
         var _loc2_:uint = param1.readByte();
         this.autoconnect=BooleanByteWrapper.getFlag(_loc2_,0);
         this.useCertificate=BooleanByteWrapper.getFlag(_loc2_,1);
         this.useLoginToken=BooleanByteWrapper.getFlag(_loc2_,2);
         this.version=new VersionExtended();
         this.version.deserialize(param1);
         this.lang=param1.readUTF();
         var _loc3_:uint = param1.readUnsignedShort();
         var _loc4_:uint = 0;
         while(_loc4_<_loc3_)
         {
            _loc5_=param1.readByte();
            this.credentials.push(_loc5_);
            _loc4_++;
         }
         this.serverId=param1.readShort();
      }
   }

}
Je coince sur plusieurs points.


Tout d'abord, la VersionExtended : comment l'obtenir ? Voici le "prototype" de son constructeur :
Code:
public VersionExtended(sbyte major, sbyte minor, sbyte release, int revision, sbyte patch, sbyte buildType, sbyte install, sbyte technology)
La classe VersionExtended est en fait la même classe que Version à l'exception qu'il y a install et technology en plus pour VersionExtended. Voici le constructeur de Version :
Code:
public Version(sbyte major, sbyte minor, sbyte release, int revision, sbyte patch, sbyte buildType)
Je pense avoir réussi à obtenir les infos pour la Version. En effet, le fichier BuildInfos dans com.ankamagames.dofus contient apparemment toutes les informations nécessaires. Le voici :
Code:
package com.ankamagames.dofus
{
   import com.ankamagames.jerakine.types.Version;
   import com.ankamagames.dofus.network.enums.BuildTypeEnum;


   public final class BuildInfos extends Object
   {
         

      public function BuildInfos() {
         super();
      }

      public static var BUILD_VERSION:Version = new Version(2,11,1);

      public static var BUILD_TYPE:uint = BuildTypeEnum.RELEASE;

      public static var BUILD_REVISION:int = 35100;

      public static var BUILD_PATCH:int = 0;

      public static const BUILD_DATE:String = "Apr 18, 2013 - 11:33:54 CEST";


   }

}

Ainsi, pour la classe Version, on aurait :
Code:
Version version = new Version(2, 11, 1, 35100, 0, 0);
(BuildTypeEnum.RELEASE vaut 0)

Cependant, il me manque toujours install et technology pour la VersionExtended que requiert IdentificationMessage. Où puis-je trouver ces informations ?


Ensuite, IdentificationMessage requiert un array de bytes (signed bytes en fait) nommé "credentials". Qu'est-ce que c'est ?

Pour faire simple : est-il possible de voir le code "principal", une espèce de fonction main, celle qui appelle toutes les classes, qui se charge de la connexion, du jeu, bref du jeu quoi. De cette manière on pourrait tout voir : comment est créée VersionExtended par exemple. D'où le client sort le sbyte[] credentials ?


Merci.
 
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#2
Re: IdentificationMessage D. v2.11

De tête, le fichier principal pour la connexion est AuthentificationFrame.
Il contient, comme dans la plupart des bots socket, un switch qui fait différentes actions en fonction des packets reçus.
Mais tu passeras le plus clair de ton temps dans AuthentificationManager qui contient vraiment le code à proprement parler.
Tu y trouveras, entre autres, où son trouvées les valeurs de VersionExtended et surtout ce qu'est ce "credentials".
Tu vas goûter aux joies du RSA. Trois jours que je suis dessus. Bonne chance ! :)
 
A

Anonymous

Invité
#3
Re: IdentificationMessage D. v2.11

En effet, AuthentificationFrame et AuthentificationManager ont l'air très intéressants :D !

Pour la version :
Code:
_loc1_.version.initVersionExtended(BuildInfos.BUILD_VERSION.major,
									BuildInfos.BUILD_VERSION.minor,
									BuildInfos.BUILD_VERSION.release,
									AirScanner.isStreamingVersion() ? true : BuildInfos.BUILD_REVISION,
									BuildInfos.BUILD_PATCH,
									BuildInfos.BUILD_VERSION.buildType,
									AirScanner.isStreamingVersion() ? true : ClientInstallTypeEnum.CLIENT_BUNDLE,
									AirScanner.hasAir() ? true : ClientTechnologyEnum.CLIENT_FLASH);
Pour ce qui du credentials, je regarderai plus tard. Je vous tiendrai informés dans ce sujet. Pour l'instant je vais regarder la saison 4 de Lost :p !


Merci à toi Moonlight-Angel.
 
Haut Bas