VB/VB.Net [ENFIN Résolu][Erreur]Packet 226

A

Anonymous

Invité
#1
Bonjour à tous !

Voici que j'arrive au Packet 226 (MapComplementaryInformationsDataMessage), et que je bug que sur un point !
Je sais d'où vient l'erreur mais impossible de la corriger !
Je me clarifie :

Code:
'Personnages sur la map
        Dim _loc4 As Short = DR.ReadUnsignedShort
        For i As Integer = 1 To _loc4
            Dim _loc16 As Short = DR.ReadShort
            Dim _loc17 As GameRolePlayActorInformations = ProtocolTypeManager.GetInstance(_loc16)
            _loc17.Deserialize(DR)
        Next
Le premier _loc16 est 36, ensuite il devient 10 ou autres.

Je pense qu'il y a un problème de Deserialization au niveau du premier

Code:
Dim _loc17 As GameRolePlayActorInformations = ProtocolTypeManager.GetInstance(_loc16)
GameRolePlayActorInformations
Code:
Public Class GameRolePlayActorInformations
    Inherits GameContextActorInformations

    Public Overloads Sub Deserialize(ByVal DR As DofusReader)
        MyBase.Deserialize(DR)
    End Sub

End Class

GameContextActorInformations
Code:
Public Class GameContextActorInformations

    Public ContextualID As Integer = 0
    Public Look As EntityLook = Nothing
    Public Disposition As EntityDispositionInformations = Nothing

    Public Sub Deserialize(ByVal DR As DofusReader)
        ContextualID = DR.ReadInt
        Look = New EntityLook
        Look.Deserialize(DR)
        Dim _loc2 As Short = DR.ReadShort
        Disposition = ProtocolTypeManager.GetInstance(_loc2)
        Disposition.Deserialize(DR)
    End Sub

End Class

EntityLook
Code:
Public Class EntityLook

    Public BonesID As Short = 0
    Public Skins As New List(Of Short)
    Public IndexedColors As New List(Of Integer)
    Public Scales As New List(Of Short)
    Public SubEntities As New List(Of SubEntity)

    Public Sub Deserialize(ByVal DR As DofusReader)
        BonesID = DR.ReadShort

        Dim _loc2 As Short = DR.ReadUnsignedShort
        For i As Integer = 1 To _loc2
            Dim _loc10 As Short = DR.ReadShort
            Skins.Add(_loc10)
        Next

        Dim _loc4 As Short = DR.ReadUnsignedShort
        For i As Integer = 1 To _loc4
            Dim _loc11 As Integer = DR.ReadInt
            IndexedColors.Add(_loc11)
        Next

        Dim _loc6 As Short = DR.ReadUnsignedShort
        For i As Integer = 1 To _loc6
            Dim _loc12 As Integer = DR.ReadShort
            Scales.Add(_loc12)
        Next

        Dim _loc8 As Short = DR.ReadUnsignedShort
        For i As Integer = 1 To _loc8
            Dim _loc13 As New SubEntity
            _loc13.Deserialize(DR)
            SubEntities.Add(_loc13)
        Next
    End Sub

End Class
 
Inscrit
29 Septembre 2011
Messages
392
Reactions
0
#2
Re: [Erreur]Packet 226

il doit avoir un décalage avant j'ai eux le même problème j'ai du tous refaire
 
A

Anonymous

Invité
#3
Re: [Erreur]Packet 226

Ah :/

J'ai tester avec des ReadShort au lieu de ReadUnsignedShort et cela ne change rien.
Si vraiment je trouve pas je devrai tout refaire :o
 
A

Anonymous

Invité
#4
Re: [Erreur]Packet 226

Oui c'est une erreur dans la lecture du flux. Moi même j'en ai rencontré pas mal quand j'était dessus.

Alors, il faut que tu mettes un point d’arrêt au premier tour de la boucle (protocol = 36) et tu débug pas à pas.
Pour chaque packet que tu rencontre durant ce pas à pas, tu doit vérifier qu'il n'y ai pas de discordance avec les sources comme un ReadInt à la place d'un ReadInt16, un readshort à la place d'un readbyte, ...

Bonne chance
 
A

Anonymous

Invité
#5
Re: [Erreur]Packet 226

J'ai déjà fait sa mais je vais faire ça en plus détaillé ;)
Je n'avais pas penser au point d'arrêt.

Edit
: J'ai fais du pas à pas et tout colle. Quel est le problème ?
 
A

Anonymous

Invité
#6
Re: [Erreur]Packet 226

Tu n'as pas de problèmes au niveau des classes herité ? (Override, Overload, Mybase, ...)
 
A

Anonymous

Invité
#7
Re: [Erreur]Packet 226

Ah je n'ai pas regarder ça.
Je dis ce qu'il en est ;)

Edit : Aucun soucis sur ça :/
J'ai revérifié la lecture, et j'ai aucun problème. Mais j'aimerais vérifier avec PacketReader mais je ne trouve pas le header du packet sur WPE Pro.
 
Inscrit
29 Septembre 2011
Messages
392
Reactions
0
#8
Re: [Erreur]Packet 226

Moi j'ai tous recommencer et maintenant sa fonctionne ;)
 
A

Anonymous

Invité
#9
Re: [Erreur]Packet 226

Je pourrais avoir les classes de ton code ?
 
Inscrit
29 Septembre 2011
Messages
392
Reactions
0
#10
Re: [Erreur]Packet 226

euh beaucoup mieux tu refait toi même sinon c'est du copier/coller
 
A

Anonymous

Invité
#11
Re: [Erreur]Packet 226

Mwi, mais je voudrais comprendre mon erreur.
 
A

Anonymous

Invité
#12
Re: [Erreur]Packet 226

Vite comme ça je dirais que tu as un problème avec ton ProtocolTypeManager. As-tu bien toutes les classes qui inhéritent GameRolePlayActorInformations? (GameRolePlayCharacterInformations, GameRolePlayGroupMonsterInformation, etc.)
 
A

Anonymous

Invité
#13
Re: [Erreur]Packet 226

Vite comme ça je dirais que tu as un problème avec ton ProtocolTypeManager. As-tu bien toutes les classes qui inhéritent GameRolePlayActorInformations? (GameRolePlayCharacterInformations, GameRolePlayGroupMonsterInformation, etc.)
Cela paraissait être une bonne piste. Effectivement, il m'en manquait pas mal. (pour ne pas dire tous)
Je les ai tous compléter, et cela ne fonctionne toujours pas.
Premier MsgID : "36" deuxième : "10" (actuellement).

Edit :
Impossible d'effectuer un cast d'un objet de type '------.Version' en type '------.GameRolePlayActorInformations'.
Erreur venant du Protocol car il reçoit 11.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#14
Re: [Erreur]Packet 226

alors l'erreur vien d'avant le ProtocolTypeManager.GetInstance(Data.ReadUnSignedshort) car y'a pas de protocole 11 dans le 226 ce qui veut dire que tu te retrouves avec un decalage avant d'entrer dans protocoletypemanager , pour les maisons (donc juste avant) c'est bon le ProtocolTypeManager.GetInstance(Data.ReadUnSignedshort) (enfin biensur si y'a des maisons sur la carte) ?
 
A

Anonymous

Invité
#15
Re: [Erreur]Packet 226

Code:
'Maisons sur la map
        Dim _loc1 As UInteger = 0
        Dim _loc2 As Short = DR.ReadUnsignedShort
        While _loc1 < _loc2
            Dim _loc14 As Short = DR.ReadUnsignedShort
            Dim _loc15 As HouseInformations = ProtocolTypeManager.GetInstance(_loc14)
            _loc15.Deserialize(DR)
            Houses.Add(_loc15)
            _loc1 += 1
        End While

        'Personnages sur la map
        Dim _loc3 As UInteger = 0
        Dim _loc4 As Short = DR.ReadUnsignedShort
        While _loc3 < _loc4
            Dim _loc16 As Short = DR.ReadUnsignedShort
            Dim _loc17 As GameRolePlayActorInformations = ProtocolTypeManager.GetInstance(_loc16)
            _loc17.Deserialize(DR)
            Actors.Add(_loc17)
            _loc3 += 1
        End While

Voici, comme tu auras deviné, les deux boucles "principales" de la classe "MapComplementaryInformationsDataMessage".
Voici aussi le "HouseInformations" :

Code:
Public Class HouseInformations

    Public IsOnSale As Boolean = False
    Public IsSaleLocked As Boolean = False
    Public HouseID As Integer = 0
    Public OwnerName As String = ""
    Public ModelID As Short = 0
    Public DoorsOnMap As New List(Of Integer)

    Public Sub Deserialize(ByVal DR As DofusReader)
        Dim _loc2 As Byte = DR.ReadByte
        IsOnSale = BooleanByteWrapper.getFlag(_loc2, 0)
        IsSaleLocked = BooleanByteWrapper.getFlag(_loc2, 1)
        HouseID = DR.ReadInt
        Dim _loc3 As Short = DR.ReadUnsignedShort
        For i As Integer = 1 To _loc3
            Dim _loc5 As Integer = DR.ReadInt
            DoorsOnMap.Add(_loc5)
        Next
        OwnerName = DR.ReadUTF
        ModelID = DR.ReadShort
    End Sub

End Class

Où est le problème ?
Je ne vois rien qui ne va pas.

Edit : Pour moi, le problème ne vient pas du traitement des maisons sur la map. (mon personnage de test est à la sortie de la banque d'Astrub) Pour moi il y a une erreur au niveau du premier traitement du personnage sur la map. Qu'en pensez vous ?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#16
Re: [Erreur]Packet 226

il te donne le bon nombre de maison sur la map ?
puis le bon nombre de persos sur la map (heu sur cette maps pas facile a savoir) ?
 
A

Anonymous

Invité
#17
Re: [Erreur]Packet 226

J'ai le bon nombre de maisons.
Je vérifie le nombre de persos sur une autre map.

Edit : Au dernier étage de la taverne d'Astrub, il n'y a que moi. Valeur de

- nbHouses : 0
- nbActors : 0 ???!!! 1

Je n'ai rien dit, planté dans les variables.

Donc à partir de > 1 personnages, ça bug. Hrm.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#18
Re: [Erreur]Packet 226

donc tu as raison c'est un decalage dans une des classes "actors"
 
A

Anonymous

Invité
#19
Re: [Erreur]Packet 226

C'est vraiment difficile à dire comme ça, le principe est de déboguer pas à pas en regardant à partir de quelle packet les variables devienne corrompue.

Une fois que tu l'as trouvé, il te suffit de bien (même très bien) vérifier si ça correspond aux sources.


Bon courage
 
A

Anonymous

Invité
#20
Re: [Erreur]Packet 226

C'est vraiment difficile à dire comme ça, le principe est de déboguer pas à pas en regardant à partir de quelle packet les variables devienne corrompue.

Une fois que tu l'as trouvé, il te suffit de bien (même très bien) vérifier si ça correspond aux sources.


Bon courage
Ce que tu m'as déjà dit et ce que j'ai déjà fait ;)

Je vous montre les classes concernés :

GameRolePlayActorInformations
Code:
Public Class GameRolePlayActorInformations
    Inherits GameContextActorInformations

    Public Overloads Sub Deserialize(ByVal DR As DofusReader)
        MyBase.Deserialize(DR)
    End Sub

End Class

GameContextActorInformations
Code:
Public Class GameContextActorInformations

    Public Look As EntityLook = Nothing
    Public Disposition As EntityDispositionInformations = Nothing

    Public Sub Deserialize(ByVal DR As DofusReader)
        ContextualID = DR.ReadInt
        Look = New EntityLook
        Look.Deserialize(DR)
        Dim _loc2 As Short = DR.ReadUnsignedShort
        Disposition = ProtocolTypeManager.GetInstance(_loc2)
        Disposition.Deserialize(DR)
    End Sub

End Class

EntityLook
Code:
Public Class EntityLook

    Public BonesID As Short = 0
    Public Skins As New List(Of Short)
    Public IndexedColors As New List(Of Integer)
    Public Scales As New List(Of Short)
    Public SubEntities As New List(Of SubEntity)

    Public Sub Deserialize(ByVal DR As DofusReader)
        BonesID = DR.ReadShort

        Dim _loc1 As Int16 = 0
        Dim _loc2 As Short = DR.ReadUnsignedShort
        While _loc1 < _loc2
            Dim _loc10 As Short = DR.ReadShort
            Skins.Add(_loc10)
            _loc1 += 1
        End While

        Dim _loc3 As Int16 = 0
        Dim _loc4 As Short = DR.ReadUnsignedShort
        While _loc3 < _loc4
            Dim _loc11 As Integer = DR.ReadInt
            IndexedColors.Add(_loc11)
            _loc3 += 1
        End While

        Dim _loc5 As Int16 = 0
        Dim _loc6 As Short = DR.ReadUnsignedShort
        While _loc5 < _loc6
            Dim _loc12 As Short = DR.ReadShort
            Scales.Add(_loc12)
            _loc5 += 1
        End While

        Dim _loc7 As Int16 = 0
        Dim _loc8 As Short = DR.ReadUnsignedShort
        While _loc7 < _loc8
            Dim _loc13 As New SubEntity
            _loc13.Deserialize(DR)
            SubEntities.Add(_loc13)
            _loc7 += 1
        End While
    End Sub

End Class

EntityDispositionInformations
Code:
Public Class EntityDispositionInformations

    Public Direction As Byte = 0

    Public Sub Deserialize(ByVal DR As DofusReader)
        CellID = DR.ReadShort
        Direction = DR.ReadByte
        If ContextualID = ID Then MainForm.ToolStripStatusLabel8.Text = "CellID : " & CellID
    End Sub

End Class

Edit : Je pense que cela vient du "EntityDispositionInformations" car il détecte bien le MsgID pour le EntityDispo, mais après rien ne va plus. Sois il me manque quelque chose, sois le deserialize est mauvais.
 
Haut Bas