C# Client ne répondant pas lors de la connexion

Inscrit
3 Mars 2017
Messages
13
Reactions
0
#1
Bonjour, j'essaye de reconvertir l'émulateur Past de Skeezr en 2.40.
Je précise que j'utilise le client officiel avec le DofusInvoker patché de Nightwolf93.

Jusqu'à maintenant, j'ai pas eu trop de soucis : La base étant déjà faite, j'ai eu à faire quelque modifications par-ci par là.
Le problème que j'ai actuellement, c'est que le client ne répond partiellement pas aux messages envoyés par le serveur.

Je précise partiellement car ProtocolRequiredMessage et HelloConnectMessage sont bien envoyés et reçus par le client toutefois, imaginons que la version du client n'est pas bonne, le serveur envoie IdentificationFailedForBadVersionMessage. Le client ne répond pas à ce message, il reste figé sur la connexion avec une popup comme quoi le serveur met trop de temps à répondre. Pareil si les logs sont incorrects, si l'utilisateur est banni ou tout autre packet. Je précise également que les id des packets sont à jour.


Je constate des lignes dans les logs tels que :

« [MessageReceiver] Unknown packet received (ID 0, length 0) »
« [MessageReceiver] Unknown packet received (ID 6467, length 0) »

Je pense qu'il y a un problème à ce niveau là.

Code:
using Past.Protocol.IO;

namespace Past.Protocol
{
    public abstract class NetworkMessage
    {
        readonly byte BIT_RIGHT_SHIFT_LEN_PACKET_ID = 2;

        public abstract uint Id { get; }
        public abstract void Serialize(IDataWriter writer);
        public abstract void Deserialize(IDataReader reader);

        public void Pack(BigEndianWriter writer)
        {
            Serialize(writer);
            WritePacket(writer);
        }

        public void Unpack(BigEndianReader reader)
        {
            Deserialize(reader);
        }

        public void WritePacket(IDataWriter output)
        {

            byte[] data = output.Data;
            output.Clear();

            uint typeLen = ComputeTypeLen((uint)data.Length);
            output.WriteShort((short)SubComputeStaticHeader(Id, typeLen));
            switch (typeLen)
            {
                case 0:
                    return;
                case 1:
                    output.WriteByte((byte)data.Length);
                    break;
                case 2:
                    output.WriteShort((short)data.Length);
                    break;
                case 3:
                    output.WriteByte((byte)(data.Length >> 16 & 255));
                    output.WriteShort((short)(data.Length & 65535));
                    break;
            }
            output.WriteBytes(data);
        }

        public uint ComputeTypeLen(uint len)
        {
            if (len > 65535)
            {
                return 3;
            }
            if (len > 255)
            {
                return 2;
            }
            if (len > 0)
            {
                return 1;
            }
            return 0;
        }

        public uint SubComputeStaticHeader(uint msgId, uint typeLen)
        {
            return msgId << BIT_RIGHT_SHIFT_LEN_PACKET_ID | typeLen;
        }

        public override string ToString()
        {
            return base.GetType().Name;
        }
    }
}
Merci pour votre aide
 
Dernière édition:
Inscrit
27 Mai 2016
Messages
14
Reactions
0
#2
Je précise également que les id des packets sont à jour
Yop, il suffit pas de mettre à jour les id des paquets pour que cela fonctionne. Tu pars d'un émulateur pour dofus 2.0 pour faire tourner le client 2.40 ^^
Premièrement il te faut mettre tous les paquets à jour (récupérer du client et les traduire en c# dans ton cas)

Enfin, je pense pas que ce soit une bonne idée de partir de la version de PAST pour faire un émulateur 2.40 ^^
 
Inscrit
3 Mars 2017
Messages
13
Reactions
0
#3
Yop, il suffit pas de mettre à jour les id des paquets pour que cela fonctionne. Tu pars d'un émulateur pour dofus 2.0 pour faire tourner le client 2.40 ^^
Premièrement il te faut mettre tous les paquets à jour (récupérer du client et les traduire en c# dans ton cas)

Enfin, je pense pas que ce soit une bonne idée de partir de la version de PAST pour faire un émulateur 2.40 ^^
D'accord, je pense m'orienter vers l'émulateur DarkSoul dans ce cas, tu penses que le problème vient des packets non à jour du coup ? ça me semble en ordre pourtant, pour les packets lors de la connexion du moins
 
Inscrit
27 Mai 2016
Messages
14
Reactions
0
#4
Ah bha oui ^^ ils ont bien changé depuis la 2.0
 
Inscrit
3 Mars 2017
Messages
13
Reactions
0
#5
Ah bha oui ^^ ils ont bien changé depuis la 2.0
Je viens d'essayer avec DarkSoul, même problème, les packets de connexions me semblent corrects, le client ne réagit pas.
Même chose dans les logs surtout, avec les packets inconnus envoyés (ID 0 ou 6467: Length 0)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#6
Tout a été dit, partir d'un ému 2.0.0 c'est pas top.
Déjà la première chose c'est remettre les IO / Paquets à jour.
 
Inscrit
27 Mai 2016
Messages
14
Reactions
0
#7
Personnellement, je viens de créer vite fais un projet et j'ai pas de soucis pour arriver jusqu'au choix du serveur avec la 2.40 et le dofusinvoker de Nightwolf93. Le client me répond bien
Je ne suis pas allez plus loin c'était juste pour tester.
Essaye de voir avec tes IO comme BlueDream l'a dit et regarde si les paquets utilisés pour la connexion sont bien traduits.
 
Inscrit
3 Mars 2017
Messages
13
Reactions
0
#8
Personnellement, je viens de créer vite fais un projet et j'ai pas de soucis pour arriver jusqu'au choix du serveur avec la 2.40 et le dofusinvoker de Nightwolf93. Le client me répond bien
Je ne suis pas allez plus loin c'était juste pour tester.
Essaye de voir avec tes IO comme BlueDream l'a dit et regarde si les paquets utilisés pour la connexion sont bien traduits.
Je crois que c'est à cause de mon IdentificationMessage qui semblerait pas bon.
Après l'avoir corrigé, je suis confronté à ce problème:



A la ligne 96

Code:
 sessionOptionalSalt = reader.ReadVarLong();
Voici l'IdentificationMessage

Code:
// Generated on 02/23/2017 16:53:16
using System;
using System.Collections.Generic;
using System.Linq;
using DarkSoul.Network.Protocol.Types;
using DarkSoul.Network.Protocol.Message;
using DarkSoul.Core.Interfaces;
using DarkSoul.Core.IO;

namespace DarkSoul.Network.Protocol.Messages
{
    public class IdentificationMessage : NetworkMessage
    {
        public override ushort Id => 4;

        public bool autoconnect;
        public bool useCertificate;
        public bool useLoginToken;
        public VersionExtended version;
        public string lang;
        public IEnumerable<sbyte> credentials;
        public short serverId;
        public double sessionOptionalSalt;
        public IEnumerable<ushort> failedAttempts;

        public IdentificationMessage()
        {
        }

        public IdentificationMessage(bool autoconnect, bool useCertificate, bool useLoginToken, VersionExtended version, string lang, IEnumerable<sbyte> credentials, short serverId, double sessionOptionalSalt, IEnumerable<ushort> failedAttempts)
        {
            this.autoconnect = autoconnect;
            this.useCertificate = useCertificate;
            this.useLoginToken = useLoginToken;
            this.version = version;
            this.lang = lang;
            this.credentials = credentials;
            this.serverId = serverId;
            this.sessionOptionalSalt = sessionOptionalSalt;
            this.failedAttempts = failedAttempts;
        }

        public IdentificationMessage(bool autoconnect, bool useCertificate, bool useLoginToken, VersionExtended version, string lang, short serverId, double sessionOptionalSalt, IEnumerable<ushort> failedAttempts)
        {
            this.autoconnect = autoconnect;
            this.useCertificate = useCertificate;
            this.useLoginToken = useLoginToken;
            this.version = version;
            this.lang = lang;
            this.serverId = serverId;
            this.sessionOptionalSalt = sessionOptionalSalt;
            this.failedAttempts = failedAttempts;
        }

        public override void Serialize(IWriter writer)
        {
            byte flag1 = 0;
            flag1 = BooleanByteWrapper.SetFlag(flag1, 0, autoconnect);
            flag1 = BooleanByteWrapper.SetFlag(flag1, 1, useCertificate);
            flag1 = BooleanByteWrapper.SetFlag(flag1, 2, useLoginToken);
            writer.WriteByte(flag1);
            version.Serialize(writer);
            writer.WriteUTF(lang);
            writer.WriteVarInt((int)credentials.Count());
            foreach (var entry in credentials)
            {
                writer.WriteSByte(entry);
            }
            writer.WriteShort(serverId);
            writer.WriteVarLong(sessionOptionalSalt);
            writer.WriteShort((short)failedAttempts.Count());
            foreach (var entry in failedAttempts)
            {
                writer.WriteVarShort((int)entry);
            }
        }

        public override void Deserialize(IReader reader)
        {
            byte flag1 = reader.ReadByte();
            autoconnect = BooleanByteWrapper.GetFlag(flag1, 0);
            useCertificate = BooleanByteWrapper.GetFlag(flag1, 1);
            useLoginToken = BooleanByteWrapper.GetFlag(flag1, 2);
            version = new VersionExtended();
            version.Deserialize(reader);
            lang = reader.ReadUTF();
            var limit = reader.ReadVarInt();
            credentials = new sbyte[limit];
            for (int i = 0; i < limit; i++)
            {
                (credentials as sbyte[])[i] = reader.ReadSByte();
            }
            serverId = reader.ReadShort();
            sessionOptionalSalt = reader.ReadVarLong();
            limit = reader.ReadUShort();
            failedAttempts = new ushort[limit];
            for (int i = 0; i < limit; i++)
            {
                (failedAttempts as ushort[])[i] = reader.ReadVarUhShort();
            }
        }

    }

}
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#9
Code:
public function readVarLong() : Number
      {
         return this.readInt64(this._data).toNumber();
      }
ReadVarLong() ce n'est pas du ReadLong() mais du ReadInt64().

Code:
private function readInt64(param1:IDataInput) : Int64
      {
         var _loc3_:uint = 0;
         var _loc2_:Int64 = new Int64();
         var _loc4_:uint = 0;
         while(true)
         {
            _loc3_ = param1.readUnsignedByte();
            if(_loc4_ == 28)
            {
               break;
            }
            if(_loc3_ >= 128)
            {
               _loc2_.low = _loc2_.low | (_loc3_ & 127) << _loc4_;
               _loc4_ = _loc4_ + 7;
               continue;
            }
            _loc2_.low = _loc2_.low | _loc3_ << _loc4_;
            return _loc2_;
         }
         if(_loc3_ >= 128)
         {
            _loc3_ = _loc3_ & 127;
            _loc2_.low = _loc2_.low | _loc3_ << _loc4_;
            _loc2_.high = _loc3_ >>> 4;
            _loc4_ = 3;
            while(true)
            {
               _loc3_ = param1.readUnsignedByte();
               if(_loc4_ < 32)
               {
                  if(_loc3_ >= 128)
                  {
                     _loc2_.high = _loc2_.high | (_loc3_ & 127) << _loc4_;
                  }
                  else
                  {
                     break;
                  }
               }
               _loc4_ = _loc4_ + 7;
            }
            _loc2_.high = _loc2_.high | _loc3_ << _loc4_;
            return _loc2_;
         }
         _loc2_.low = _loc2_.low | _loc3_ << _loc4_;
         _loc2_.high = _loc3_ >>> 4;
         return _loc2_;
      }
CustomDataWrapper.as
http://pastebin.com/NU8BkJ52

Int64.as
http://pastebin.com/Tp5fxVkN
 
Inscrit
27 Mai 2016
Messages
14
Reactions
0
#10
Dans la 2.40 l'identification message a été modifié. Le deserialize est maintenant comme ça
Code:
public function deserializeAs_IdentificationMessage(param1:ICustomDataInput) : void
      {
         var _loc6_:int = 0;
         var _loc7_:uint = 0;
         this.deserializeByteBoxes(param1);
         this.version = new VersionExtended();
         this.version.deserialize(param1);
         this._langFunc(param1);
         var _loc2_:uint = param1.readVarInt();
         var _loc3_:uint = 0;
         while(_loc3_ < _loc2_)
         {
            _loc6_ = param1.readByte();
            this.credentials.push(_loc6_);
            _loc3_++;
         }
         this._serverIdFunc(param1);
         this._sessionOptionalSaltFunc(param1);
         var _loc4_:uint = param1.readUnsignedShort();
         var _loc5_:uint = 0;
         while(_loc5_ < _loc4_)
         {
            _loc7_ = param1.readVarUhShort();
            if(_loc7_ < 0)
            {
               throw new Error("Forbidden value (" + _loc7_ + ") on elements of failedAttempts.");
            }
            this.failedAttempts.push(_loc7_);
            _loc5_++;
         }
      }

Traduit vite fait ça donne (avec les fonctions utilisées comme this.deserializeByteBoxes(param1); ) ça donne :
C#:
public void Deserialize(IDataReader reader){
 
    var loc6 = 0;
    var loc7 = 0;
    this.deserializeByteBoxes(reader);
    this.version = new VersionExtended();
    this.version.Deserialize(reader);
    this._langFunc(param1);
 
    var loc2 = reader.ReadVarInt();
    for(var loc3 = 0; loc3 < loc2; loc3++){
        loc6 = reader.ReadByte();
        this.credentials[loc3] = loc6; 
    }
 
    this._serverIdFunc(reader);
    this._sessionOptionalSaltFunc(param1);
 
    var loc4 = reader.ReadUShort(); 
    for(var loc5 = 0; loc5 < loc4; loc5++){
        loc7 = reader.ReadVarUhShort();
        if(loc7 < 0){
            throw new Exception("Forbidden value (" + loc7 + ") on elements of failedAttempts.");
        }
        this.failedAttempts[loc5] = loc7;
    }
}

private void DeserializeByteBoxes(IDataReader reader){
    var loc2 = reader.ReadByte();
    this.autoconnect = BooleanByteWrapper.GetFlag(loc2, 0);
    this.useCertificate = BooleanByteWrapper.GetFlag(loc2, 1);
    this.useLoginToken = BooleanByteWrapper.GetFlag(loc2, 2);
}

private void _langFunc(IDataReader reader) => this.lang = reader.ReadUTF();

private void _serverIdFunc(IDataReader reader) => this.serverId = reader.ReadShort();

private void _sessionOptionalSaltFunc(IDataReader reader){
    this.sessionOptionnalSalt = reader.ReadVarLong();
    if(this.sessionOptionalSalt < -9007199254740990 || this.sessionOptionalSalt > 9007199254740990)
         {
            throw new Exception("Forbidden value (" + this.sessionOptionalSalt + ") on element of IdentificationMessage.sessionOptionalSalt.");
         }
}

La traduction devrait être bonne (peut-être une faute de frappe qui traîne :p). Ensuite fais le changement comme BlueDream l'a dit et ça devrait fonctionner ;)
 
Inscrit
3 Mars 2017
Messages
13
Reactions
0
#11
Merci vous deux, plus aucune erreur maintenant à ce niveau ! Ceci dit, le client refuse toujours de montrer quelconque signe de vie lors de l'envoi d'un packet après que celui-ci ai envoyé IdentificationMessage

Les packets concernés sont :

>> ProtocolRequired: Le client reçoit
>> HelloConnectMessage: Le client reçoit
<< IdentificationMessage: Le serveur reçoit
On envoie direct Failed, juste pour des tests:
>> IdentificationFailedMessage: Le client ne reçoit pas

Ces packets sont à jour, d'après les sources
 
Inscrit
27 Mai 2016
Messages
14
Reactions
0
#12
et quand tu génères un log de dofus il y a des erreurs ?
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#14
Ouai, tu dois actualiser tous tes paquets et je te déconseille de le faire manuellement. :D
Tu dois aussi mettre à jour toutes tes fonctions d'écriture et de lecture.
 
Inscrit
27 Mai 2016
Messages
14
Reactions
0
#15
Je pense que le problème vient bien du Identification Message. Essaye en mettant un breakpoint quand tu déserialize l'identification message pour voir si tous se passe bien.
Après si il n'y a pas d'erreur je vois pas d'ou ça peut venir, mis a par les paquets.
 
Inscrit
3 Mars 2017
Messages
13
Reactions
0
#16
Je pense que le problème vient bien du Identification Message. Essaye en mettant un breakpoint quand tu déserialize l'identification message pour voir si tous se passe bien.
Après si il n'y a pas d'erreur je vois pas d'ou ça peut venir, mis a par les paquets.
Absolument aucune erreur

 
Dernière édition:
Inscrit
27 Mai 2016
Messages
14
Reactions
0
#17
Essaye d'envoyer un IdentificationSuccessMessage suivi d'un ServerListMessage pour voir si tu arrives à aller à la sélection du serveur.

EDIT: Quand tu envois ton IdentificationFailedMessage, est ce que tu mets une reason ?

Si tu ne mets rien, il ne se passera rien sur le client ^^
 
Dernière édition:
Inscrit
3 Mars 2017
Messages
13
Reactions
0
#18
Essaye d'envoyer un IdentificationSuccessMessage suivi d'un ServerListMessage pour voir si tu arrives à aller à la sélection du serveur.

EDIT: Quand tu envois ton IdentificationFailedMessage, est ce que tu mets une reason ?

Si tu ne mets rien, il ne se passera rien sur le client ^^
Oui oui, je spécifies bien la raison, mais c'est pareil pour n'importe quel packet, après IdentificationMessage de la part du client, le client ne réagit plus à rien.
J'ai essayé deux solutions :

• Mettre en commentaire le bout de code que tu avait mis avant l'edit, même problème.
• IdentificationSuccessMessage puis ServersListMessage: même problème.

:(
 
Inscrit
27 Mai 2016
Messages
14
Reactions
0
#19
Le bout de code que j'avais mis c'était juste une erreur de ma part quand je l'ai fait x) je m'en suis rendu compte après :p
Sinon je vois pas pourquoi ça marche pas :/
Il te reste plus qu'à faire ce que bluedream a dit, retraduire tous les paquets :/
 
Inscrit
3 Mars 2017
Messages
13
Reactions
0
#20
Le bout de code que j'avais mis c'était juste une erreur de ma part quand je l'ai fait x) je m'en suis rendu compte après :p
Sinon je vois pas pourquoi ça marche pas :/
Il te reste plus qu'à faire ce que bluedream a dit, retraduire tous les paquets :/
Je pense plus que ça vient des fonctions d'écriture/lecture, comme l'a dit bluedream
Mais comment puis-je les mettre à jour ?
 
Dernière édition:
Haut Bas