VB/VB.Net Problème avec paquet 226

Inscrit
14 Mars 2015
Messages
68
Reactions
0
#1
Bonjour,

j'ai une erreur lorsque la Deserialize de la paquet 226.
Erreur : The given key was not present in the dictionary.
paquet 226
Code:
Namespace Dofus.Network.Messages.Game.Context.Roleplay
    Public Class MapComplementaryInformationsDataMessage
        Inherits NetworkMessage

        Public Overrides Property ProtocolID As UInteger = 226

        Private m_subAreaId As UShort
        Public Overridable Property SubAreaId() As UShort
            Get
                Return m_subAreaId
            End Get
            Set(ByVal value As UShort)
                m_subAreaId = value
            End Set
        End Property
        Private m_mapId As Integer
        Public Overridable Property MapId() As Integer
            Get
                Return m_mapId
            End Get
            Set(ByVal value As Integer)
                m_mapId = value
            End Set
        End Property
        Private m_houses As List(Of HouseInformations)
        Public Overridable Property Houses() As List(Of HouseInformations)
            Get
                Return m_houses
            End Get
            Set(ByVal value As List(Of HouseInformations))
                m_houses = value
            End Set
        End Property
        Private m_actors As List(Of GameRolePlayActorInformations)
        Public Overridable Property Actors() As List(Of GameRolePlayActorInformations)
            Get
                Return m_actors
            End Get
            Set(ByVal value As List(Of GameRolePlayActorInformations))
                m_actors = value
            End Set
        End Property
        Private m_interactiveElements As List(Of InteractiveElement)
        Public Overridable Property InteractiveElements() As List(Of InteractiveElement)
            Get
                Return m_interactiveElements
            End Get
            Set(ByVal value As List(Of InteractiveElement))
                m_interactiveElements = value
            End Set
        End Property
        Private m_statedElements As List(Of StatedElement)
        Public Overridable Property StatedElements() As List(Of StatedElement)
            Get
                Return m_statedElements
            End Get
            Set(ByVal value As List(Of StatedElement))
                m_statedElements = value
            End Set
        End Property
        Private m_obstacles As List(Of MapObstacle)
        Public Overridable Property Obstacles() As List(Of MapObstacle)
            Get
                Return m_obstacles
            End Get
            Set(ByVal value As List(Of MapObstacle))
                m_obstacles = value
            End Set
        End Property
        Private m_fights As List(Of FightCommonInformations)
        Public Overridable Property Fights() As List(Of FightCommonInformations)
            Get
                Return m_fights
            End Get
            Set(ByVal value As List(Of FightCommonInformations))
                m_fights = value
            End Set
        End Property
        Public Sub Initiate(ByVal subAreaId As UShort, ByVal mapId As Integer, ByVal houses As List(Of HouseInformations), ByVal actors As List(Of GameRolePlayActorInformations), ByVal interactiveElements As List(Of InteractiveElement), ByVal statedElements As List(Of StatedElement), _
         ByVal obstacles As List(Of MapObstacle), ByVal fights As List(Of FightCommonInformations))
            m_subAreaId = subAreaId
            m_mapId = mapId
            m_houses = houses
            m_actors = actors
            m_interactiveElements = interactiveElements
            m_statedElements = statedElements
            m_obstacles = obstacles
            m_fights = fights
        End Sub
        Public Overrides Sub Serialize(ByVal writer As DofusMessage)
            writer.WriteVarShort(m_subAreaId)
            writer.WriteInt(m_mapId)
            writer.WriteShort((CType((m_houses.Count), Short)))
            Dim housesIndex As Integer
            housesIndex = 0
            While (housesIndex < m_houses.Count)
                Dim objectToSend As HouseInformations = m_houses(housesIndex)
                writer.WriteUShort((CType((objectToSend.ProtocolId), UShort)))
                objectToSend.Serialize(writer)
                housesIndex = (housesIndex + 1)
            End While
            writer.WriteShort((CType((m_actors.Count), Short)))
            Dim actorsIndex As Integer
            actorsIndex = 0
            While (actorsIndex < m_actors.Count)
                Dim objectToSend As GameRolePlayActorInformations = m_actors(actorsIndex)
                writer.WriteUShort((CType((objectToSend.ProtocolId), UShort)))
                objectToSend.Serialize(writer)
                actorsIndex = (actorsIndex + 1)
            End While
            writer.WriteShort((CType((m_interactiveElements.Count), Short)))
            Dim interactiveElementsIndex As Integer
            interactiveElementsIndex = 0
            While (interactiveElementsIndex < m_interactiveElements.Count)
                Dim objectToSend As InteractiveElement = m_interactiveElements(interactiveElementsIndex)
                writer.WriteUShort((CType((objectToSend.ProtocolId), UShort)))
                objectToSend.Serialize(writer)
                interactiveElementsIndex = (interactiveElementsIndex + 1)
            End While
            writer.WriteShort((CType((m_statedElements.Count), Short)))
            Dim statedElementsIndex As Integer
            statedElementsIndex = 0
            While (statedElementsIndex < m_statedElements.Count)
                Dim objectToSend As StatedElement = m_statedElements(statedElementsIndex)
                objectToSend.Serialize(writer)
                statedElementsIndex = (statedElementsIndex + 1)
            End While
            writer.WriteShort((CType((m_obstacles.Count), Short)))
            Dim obstaclesIndex As Integer
            obstaclesIndex = 0
            While (obstaclesIndex < m_obstacles.Count)
                Dim objectToSend As MapObstacle = m_obstacles(obstaclesIndex)
                objectToSend.Serialize(writer)
                obstaclesIndex = (obstaclesIndex + 1)
            End While
            writer.WriteShort((CType((m_fights.Count), Short)))
            Dim fightsIndex As Integer
            fightsIndex = 0
            While (fightsIndex < m_fights.Count)
                Dim objectToSend As FightCommonInformations = m_fights(fightsIndex)
                objectToSend.Serialize(writer)
                fightsIndex = (fightsIndex + 1)
            End While
        End Sub
        Public Overrides Sub Deserialize(ByVal reader As DofusReader)
            m_subAreaId = reader.ReadVarUhShort()
            m_mapId = reader.ReadInt()
            Dim housesCount As Integer = reader.ReadUShort()
            Dim housesIndex As Integer
            m_houses = New System.Collections.Generic.List(Of HouseInformations)()
            housesIndex = 0
            While (housesIndex < housesCount)
                Dim objectToAdd As HouseInformations = ProtocolTypeManager.GetInstance(reader.ReadUShort)
                objectToAdd.Deserialize(reader)
                m_houses.Add(objectToAdd)
                housesIndex = (housesIndex + 1)
            End While
            Dim actorsCount As Integer = reader.ReadUShort()
            Dim actorsIndex As Integer
            m_actors = New System.Collections.Generic.List(Of GameRolePlayActorInformations)()
            actorsIndex = 0
            While (actorsIndex < actorsCount)
                Dim objectToAdd As GameRolePlayActorInformations = ProtocolTypeManager.GetInstance(reader.ReadUShort)
                objectToAdd.Deserialize(reader)
                m_actors.Add(objectToAdd)
                actorsIndex = (actorsIndex + 1)
            End While
            Dim interactiveElementsCount As Integer = reader.ReadUShort()
            Dim interactiveElementsIndex As Integer
            m_interactiveElements = New System.Collections.Generic.List(Of InteractiveElement)()
            interactiveElementsIndex = 0
            While (interactiveElementsIndex < interactiveElementsCount)
                Dim objectToAdd As InteractiveElement = ProtocolTypeManager.GetInstance(reader.ReadUShort)
                objectToAdd.Deserialize(reader)
                m_interactiveElements.Add(objectToAdd)
                interactiveElementsIndex = (interactiveElementsIndex + 1)
            End While
            Dim statedElementsCount As Integer = reader.ReadUShort()
            Dim statedElementsIndex As Integer
            m_statedElements = New System.Collections.Generic.List(Of StatedElement)()
            statedElementsIndex = 0
            While (statedElementsIndex < statedElementsCount)
                Dim objectToAdd As New StatedElement()
                objectToAdd.Deserialize(reader)
                m_statedElements.Add(objectToAdd)
                statedElementsIndex = (statedElementsIndex + 1)
            End While
            Dim obstaclesCount As Integer = reader.ReadUShort()
            Dim obstaclesIndex As Integer
            m_obstacles = New System.Collections.Generic.List(Of MapObstacle)()
            obstaclesIndex = 0
            While (obstaclesIndex < obstaclesCount)
                Dim objectToAdd As New MapObstacle()
                objectToAdd.Deserialize(reader)
                m_obstacles.Add(objectToAdd)
                obstaclesIndex = (obstaclesIndex + 1)
            End While
            Dim fightsCount As Integer = reader.ReadUShort()
            Dim fightsIndex As Integer
            m_fights = New System.Collections.Generic.List(Of FightCommonInformations)()
            fightsIndex = 0
            While (fightsIndex < fightsCount)
                Dim objectToAdd As New FightCommonInformations()
                objectToAdd.Deserialize(reader)
                m_fights.Add(objectToAdd)
                fightsIndex = (fightsIndex + 1)
            End While
        End Sub
    End Class
End Namespace
 
Dernière édition par un modérateur:
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#2
Il me semble que dans le 226 il fasse appel à la classe protocoltypemanager qui instancie la classe en fonction du protocolid de celle-ci, soit tu as oublié d'ajouter cette classe dans ton protocoltypemanager soit tu traduis mal le 226 qui te donne une clef improbable.
 
Inscrit
14 Mars 2015
Messages
68
Reactions
0
#3
je fait la mise a jour de Rebirth1 et j'ai bloqué dans cette paquet,
dans la boucle while la première tentative marche bien , mais la deuxième je reçois cette erreur :


 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#4
Tu vois c'est bien ce que je te dis, il y a un protocoltypemanager met le à jour. Où bien tu n'as mis aucuns paquets à jour. Tu trouveras assez rapidement avec ce que je t'ai dit, normalement.
 
Inscrit
14 Mars 2015
Messages
68
Reactions
0
#5
Dans rebrith protocoltypemanager prend un paramètre (ID) readushort , l'erreur c'est que ID=0
 
Inscrit
31 Mars 2012
Messages
102
Reactions
0
#6
Tu dois avoir un décalage dans la lecture de ton 226 ou un problème de reader
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#7
Oui, il envoie une clef mauvais du au faite que tu traduis mal ton packet. Si je me souviens bien Rebirth à une certaine manière de les traduire par rapport à l'AS3 ex :

JavaScript:
public function deserializeAs_MapComplementaryInformationsDataMessage(param1:ICustomDataInput) : void
      {
         var _loc14_:uint = 0;
         var _loc15_:HouseInformations = null;
         var _loc16_:uint = 0;
         var _loc17_:GameRolePlayActorInformations = null;
         var _loc18_:uint = 0;
         var _loc19_:InteractiveElement = null;
         var _loc20_:StatedElement = null;
         var _loc21_:MapObstacle = null;
         var _loc22_:FightCommonInformations = null;
         this.subAreaId = param1.readVarUhShort();
         if(this.subAreaId < 0)
         {
            throw new Error("Forbidden value (" + this.subAreaId + ") on element of MapComplementaryInformationsDataMessage.subAreaId.");
         }
         this.mapId = param1.readInt();
         if(this.mapId < 0)
         {
            throw new Error("Forbidden value (" + this.mapId + ") on element of MapComplementaryInformationsDataMessage.mapId.");
         }
         var _loc2_:uint = param1.readUnsignedShort();
         var _loc3_:uint = 0;
         while(_loc3_ < _loc2_)
         {
            _loc14_ = param1.readUnsignedShort();
            _loc15_ = ProtocolTypeManager.getInstance(HouseInformations,_loc14_);
            _loc15_.deserialize(param1);
            this.houses.push(_loc15_);
            _loc3_++;
         }
         var _loc4_:uint = param1.readUnsignedShort();
         var _loc5_:uint = 0;
         while(_loc5_ < _loc4_)
         {
            _loc16_ = param1.readUnsignedShort();
            _loc17_ = ProtocolTypeManager.getInstance(GameRolePlayActorInformations,_loc16_);
            _loc17_.deserialize(param1);
            this.actors.push(_loc17_);
            _loc5_++;
         }
         var _loc6_:uint = param1.readUnsignedShort();
         var _loc7_:uint = 0;
         while(_loc7_ < _loc6_)
         {
            _loc18_ = param1.readUnsignedShort();
            _loc19_ = ProtocolTypeManager.getInstance(InteractiveElement,_loc18_);
            _loc19_.deserialize(param1);
            this.interactiveElements.push(_loc19_);
            _loc7_++;
         }
         var _loc8_:uint = param1.readUnsignedShort();
         var _loc9_:uint = 0;
         while(_loc9_ < _loc8_)
         {
            _loc20_ = new StatedElement();
            _loc20_.deserialize(param1);
            this.statedElements.push(_loc20_);
            _loc9_++;
         }
         var _loc10_:uint = param1.readUnsignedShort();
         var _loc11_:uint = 0;
         while(_loc11_ < _loc10_)
         {
            _loc21_ = new MapObstacle();
            _loc21_.deserialize(param1);
            this.obstacles.push(_loc21_);
            _loc11_++;
         }
         var _loc12_:uint = param1.readUnsignedShort();
         var _loc13_:uint = 0;
         while(_loc13_ < _loc12_)
         {
            _loc22_ = new FightCommonInformations();
            _loc22_.deserialize(param1);
            this.fights.push(_loc22_);
            _loc13_++;
         }
      }
   }
Observe bien le loc 15 même si la classe de Rebirth n'est pas à jour, le principe est le même
Code vb.net Source rebirth :

JavaScript:
Public Overrides Sub Deserialize(ByVal Reader As DofusReader)
            Dim _loc_14 = Nothing
            Dim _loc_15 = Nothing
            Dim _loc_16 = Nothing
            Dim _loc_17 = Nothing
            Dim _loc_18 = Nothing
            Dim _loc_19 = Nothing
            Dim _loc_20 = Nothing
            Dim _loc_21 = Nothing
            Dim _loc_22 = Nothing
            Me._SubAreaId = Reader.ReadInt16
            Me._MapId = Reader.ReadInt32
            Dim _loc_2 = Reader.ReadUInt16
            Dim _loc_3 = Nothing
            For _loc_3 = 0 To _loc_2 - 1
                _loc_14 = Reader.ReadUInt16
                _loc_15 = ProtocolTypeManager.GetInstance(_loc_14)
                _loc_15.Deserialize(Reader)
                Me._Houses.Add(_loc_15)
            Next
            Dim _loc_4 = Reader.ReadUInt16
            Dim _loc_5 = Nothing
            For _loc_5 = 0 To _loc_4 - 1
                _loc_16 = Reader.ReadUInt16
                _loc_17 = ProtocolTypeManager.GetInstance(_loc_16)
                _loc_17.Deserialize(Reader)
                Me._Actors.Add(_loc_17)
            Next
            Dim _loc_6 = Reader.ReadUInt16
            Dim _loc_7 = Nothing
            For _loc_7 = 0 To _loc_6 - 1
                _loc_18 = Reader.ReadUInt16
                _loc_19 = ProtocolTypeManager.GetInstance(_loc_18)
                _loc_19.Deserialize(Reader)
                Me._InteractiveElements.Add(_loc_19)
            Next
            Dim _loc_8 = Reader.ReadUInt16
            Dim _loc_9 = Nothing
            For _loc_9 = 0 To _loc_8 - 1
                _loc_20 = New StatedElement()
                _loc_20.Deserialize(Reader)
                Me._StatedElements.Add(_loc_20)
            Next
            Dim _loc_10 = Reader.ReadUInt16
            Dim _loc_11 = Nothing
            For _loc_11 = 0 To _loc_10 - 1
                _loc_21 = New MapObstacle()
                _loc_21.Deserialize(Reader)
                Me._Obstacles.Add(_loc_21)
            Next
            Dim _loc_12 = Reader.ReadUInt16
            Dim _loc_13 = Nothing
            For _loc_13 = 0 To _loc_12 - 1
                _loc_22 = New FightCommonInformations()
                _loc_22.Deserialize(Reader)
                Me._Fights.Add(_loc_22)
            Next
        End Sub
Je te conseil de regarder de ce coté. Si tu as tout traduis comme il faut.​
Dim _loc_15 = Nothing
var _loc15_:HouseInformations = null;


J'espere avoir pu t'aider ;)
 
Inscrit
14 Mars 2015
Messages
68
Reactions
0
#8
Tu dois avoir un décalage dans la lecture de ton 226 ou un problème de reader
Comment je peut fait le décalage .

@Brizze : Merci pour la réponse , lorsque j'ai fait un debug pas à pas je trouve la place de l'erreur
dans la paquet " GameContextActorInformations " 150
Code:
Imports RebirthAPI.Dofus.Network.Types.Game.Look
Imports RebirthAPI.Game.Entity
Imports RebirthAPI.Network

Namespace Dofus.Network.Types.Game.Context
    Public Class GameContextActorInformations
    Inherits NetworkType
    Implements IEntity


        Public Overrides Property ProtocolID As UInteger = 150
        Private _ContextualId As Long = 0
        Private _Look As EntityLook = New EntityLook
        Private _Disposition As EntityDispositionInformations = New EntityDispositionInformations

        Public Property [ContextualId] As Long Implements IEntity.ContextualId
            Get
                Return Me._ContextualId
            End Get
            Set(ByVal value As Long)
                Me._ContextualId = value
            End Set
        End Property
        Public Property [Look] As EntityLook
            Get
                Return Me._Look
            End Get
            Set(value As EntityLook)
                Me._Look = value
            End Set
        End Property
        Public Property [Disposition] As EntityDispositionInformations
            Get
                Return Me._Disposition
            End Get
            Set(value As EntityDispositionInformations)
                Me._Disposition = value
            End Set
        End Property
        Public Property CellId As Integer Implements IEntity.CellId
            Get
                Return Me.Disposition.CellId
            End Get
            Set(ByVal value As Integer)
                Me.Disposition.CellId = value
            End Set
        End Property

        Public Overrides Sub Serialize(ByVal Writer As DofusMessage)
            Writer.WriteDouble(Me._ContextualId)
            Me._Look.Serialize(Writer)
            Writer.WriteShort(Me._Disposition.ProtocolID)
            Me._Disposition.Serialize(Writer)
        End Sub

        Public Overrides Sub Deserialize(ByVal Reader As DofusReader)
            Me._ContextualId = Reader.ReadDouble
            Me._Look = New EntityLook()
            Me._Look.Deserialize(Reader)
            Dim _loc_2 As UInteger = Reader.ReadUShort
            Me._Disposition = ProtocolTypeManager.GetInstance(_loc_2)
            Me._Disposition.Deserialize(Reader)
        End Sub
    End Class
End Namespace
et la variable _loc_2 =0 , lors de débogage j'ai changer la valeur de loc2 à 60 "EntityDispositionInformations" il Deserialize bien cellId et la direction , après il passe à paquet 154 "GameRolePlayNamedActorInformations"


je pense qu'il faut retraduit les paquet o_O
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#9
Evidemment qu'il faut les retraduire ^^
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#10
Et éventuellement améliorer ton ProtocolTypeManager car si je ne me trompe pas, c'est un simple select case.
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#11
C'est pas bon un select case ?
J'instancie la classe qui correspond à la clef donné.
(J'utilise ce principe là dans mon bot, j'ai pas eu de problèmes particuliés)
 
Inscrit
31 Mars 2012
Messages
102
Reactions
0
#12
Bha en sois, c'est pas mauvais, c'es juste pas du tout optimisé ^^'
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#13
Le problème est que le contenu du select case peut changer durant certaines mise à jour et c'est assez long à adapter à la main sachant que la classe fera plusieurs centaines de lignes.

Mieux vaut opter pour un système du type reflection qui te redirigera dynamiquement la classe voulu.
Jette un coup d'oeil du côté de BiM ou RaidBot.
 
Inscrit
14 Mars 2015
Messages
68
Reactions
0
#14
@BlueDream le probléme ce ne pas de ProtocolTypeManager mais Id =0 ,

@Nicogo optimisé ??
 
Dernière édition par un modérateur:

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#15
Si l'id vaut 0 c'est qu'il y a un décalage et ce n'est pas impossible que cela passe par le ProtocolTypeManager.
Tu regardes les choses de trop près, c'est pas parceque le reader lit cette valeur ici que le problème vient de cette fonction.
 
Dernière édition:
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#16
Regarde aussi tes IO mais ce que veut dire Alexandre c'est que ce n'est pas parce-que là tu as une erreur que l'erreur vient de là
Exemple ton Protocoltypemanager te donne 6 au lieux de donner 10 , tu n'auras pas d'erreur il continuera à lire jusqu’à ce que le décalage soit flagrant.

Bonne chance ;)
 
Haut Bas