VB/VB.Net [Requete] Connaître la Cellid ?

  • Auteur de la discussion Anonymous
  • Date de début

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#21
loc_10 est un short ou un uinteger ? (déclaré en unsigned et lu en signed donc si lu en negatif il entre pas dans la variable -> depassement de capacité)
 
A

Anonymous

Invité
#22
Je créer en UInteger et je lis en ReadUnSignedshort()

Code:
Public Function deserializeAs_EntityLook(ByVal param1 As Dofus.DofusReader)
            Dim _loc_10 As UInteger = 0
            Dim _loc_11 As Integer = 0
            Dim _loc_12 As Integer = 0
            Dim _loc_13 As SubEntity
            Me.bonesId = Param1.readShort()
            If (Me.bonesId < 0) Then

                console.writeline("Forbidden value (" + Me.bonesId + ") on element of EntityLook.bonesId.")
            End If
            Dim _loc_2 As UShort = param1.ReadUnSignedShort()
            Dim _loc_3 As UInteger = 0
            While (_loc_3 < _loc_2)


                _loc_10 = param1.ReadUnSignedshort()
                If (_loc_10 < 0) Then

                    Console.WriteLine("Forbidden value (" + _loc_10 + ") on elements of skins.")
                End If
                Me.Skins.Add(_loc_10)
                _loc_3 = _loc_3 + 1
            End While

Il me semble pourtant que c'est bon non?

Merci
 
A

Anonymous

Invité
#23
Ton erreur ce produit avant cet endroit. Un overflow veut dire que tu as une erreur dans une autre partie de ton code que celle qui génère l'erreur.
 
A

Anonymous

Invité
#24
Ok,

Une autre partie de mon code qui est dans mon EntityLook? Ou avant?
 
A

Anonymous

Invité
#25
Ca c'est toi qui dois le trouver, tu commences par le début du message, fais du pas à pas dans ton code et regarde chaque valeure de chaque variable qui est lue. Quand tu en vois une qui semble erronée alors tu as une bonne piste de départ.
 
A

Anonymous

Invité
#26
Bonsoir,


Vu que mon overflow est celui-ci :


Je doit vérifier tout les ReadByte?


Merci
 
A

Anonymous

Invité
#27
Tout ce qui est lu, pas seulement les readbytes.

Un overflow arrive quand tu ne lis pas quelquechose correctement.

En gros ta lecture devient décaler à un moment donner, c'est pour ca que tu n'a pas asser de bytes pour tout lire dans le message que tu recoit.

Il y a trois causes prédominantes à ce genre de problème:
-Tu saute une variable (alors tout devient décaler après l'endroit ou tu devrait lire la variable)
-Tu ne lis pas la bonne longueur (par exemple tu lis 4 bytes (int) au lieu de 2 (short)), alors après cette variable tout devient décaler.
-Tu ne prends pas en considération le ProtocolTypeManager. Par exemple, une erreur très commune que les gens font quand ils lisent l'inventaire est de tout lire les effets des objets comme un ObjectEffect, mais dépendemment du id tu peux lire ObjectEffectString, ObjectEffectDice, etc. qui sont tous de longueur variables (et différentes de ObjectEffect).
 
A

Anonymous

Invité
#28
-Tu ne prends pas en considération le ProtocolTypeManager. Par exemple, une erreur très commune que les gens font quand ils lisent l'inventaire est de tout lire les effets des objets comme un ObjectEffect, mais dépendemment du id tu peux lire ObjectEffectString, ObjectEffectDice, etc. qui sont tous de longueur variables (et différentes de ObjectEffect).
A ça doit venir de là alors car je "saute" à chaque fois le proto

Exemple:
Code:
_loc_15 = ProtocolTypeManager.getInstance(HouseInformations, _loc_14)
J'ai mis
Code:
_loc_15 = New HouseInformations
Le souci viens bien de là :?:


Merci
 
A

Anonymous

Invité
#29
C'est très probable. Car tu ne demandes pas de code tout fait et que tu cherches à te faire aider (et non à ce que les autres le fasse pour toi), je vais te donner quelques places qui pourraitent également causer ce problème:

-HouseInformations (tu as également HouseInformationExtended)
-GameRolePlayActorInformation (tu as 11 déviations possibles: GameRolePlayCharacterInformations, GameRolePlayHumanoidInformations, etc.)
 
A

Anonymous

Invité
#30
Edit : J'ai tout compris :D

Je donne des nouvelle demain voir ce que ça donne au debogage ;)
 
A

Anonymous

Invité
#31
Bonjour,

Mon problème n'est toujours pas résolut...

Voici ce qui ce passe quand je laisse le protocol :
Je ne sais pas si vous arrivez à voir les valeurs

Puis quand je l'enlève :

J'ai pourtant relus mes tout mes codes et je les ai comparés avec les .as mais rien ne diverge ...



Il faudrait que j'arrive à contacter Nocebo pour voir où se situait l'erreur car j'ai exactement le même Overflow ...

Ou si quelqu'un d'autre à réussi je suis preneur ;)


Merci
 

bouh2

Membre Actif
Inscrit
12 Septembre 2008
Messages
184
Reactions
21
#32
Met à jour tes classes ;)
 
A

Anonymous

Invité
#33
Salut,

Par "classes" tu entend mon dofus.Stream?

Code:
Namespace Dofus
    Public Class DofusReader
        Inherits IO.BinaryReader

        Sub New(ByVal input As IO.Stream)
            MyBase.New(input)
        End Sub

        Sub New(ByVal input As IO.Stream, ByVal encoding As System.Text.Encoding)
            MyBase.New(input, encoding)
        End Sub
        Public Function readUnsignedByte()
            Return ReadByte()
        End Function
        Public Overrides Function ReadByte() As Byte
            Return MyBase.ReadByte()
        End Function

        Public Function ReadUnSignedshort()
            Return ReadUInt16()
        End Function

        Public Overrides Function ReadUInt16() As UShort
            Return (CUShort(ReadByte()) << 8) + ReadByte()
        End Function

        Public Overrides Function ReadBoolean() As Boolean
            Return ReadByte() = 1
        End Function

        Public Function ReadShort()
            Return ReadInt16()
        End Function

        Public Overrides Function ReadInt16() As Short
            Dim Value As UShort = ReadUInt16()
            If Value > Short.MaxValue Then
                Dim Value2 As Short = -(UShort.MaxValue - Value) - 1
                Return Value2
            End If
            Return Value
        End Function

        Public Function ReadInt()
            Return ReadInt32()
        End Function

        Public Overrides Function ReadInt32() As Integer
            Dim Value As UInteger = ReadUInt32()
            If Value > Integer.MaxValue Then
                Dim Value2 As Integer = -(UInteger.MaxValue - Value) - 1
                Return Value2
            End If
            Return Value
        End Function

        Public Overrides Function ReadUInt32() As UInteger
            Return (CUInt(ReadByte()) << 24) + (CUInt(ReadByte()) << 16) + (CUInt(ReadByte()) << 8) + ReadByte()
        End Function

        Public Overrides Function ReadDouble() As Double
            Dim Bytes() As Byte = ReadBytes(8)
            Array.Reverse(Bytes)
            Return BitConverter.ToDouble(Bytes, 0)
        End Function

        Public Function ReadUTF()
            Return ReadString()
        End Function

        Public Overrides Function ReadString() As String
            Dim ByteArray() As Byte = MyBase.ReadBytes(ReadUInt16())
            Return System.Text.Encoding.UTF8.GetString(ByteArray)
        End Function

    End Class
    Public Class DofusWriter
        Shared m_Bytes As New List(Of Byte)

        Private Shared Function ComputeStaticHeader(ByVal PacketId As Integer, ByVal MessageLenghtType As Integer) As Short
            Return (PacketId << 2) Or MessageLenghtType
        End Function

        Private Shared Function ComputeTypeLen(ByVal MessageLenght As Integer) As Short
            Select Case MessageLenght
                Case Is > UShort.MaxValue
                    Return 3
                Case Is > Byte.MaxValue
                    Return 2
                Case Is > 0
                    Return 1
                Case Else
                    Return 0
            End Select
        End Function

        Friend Shared Sub Send(ByVal PacketID As Integer)
            Dim MessageLenghtType As Integer = ComputeTypeLen(m_Bytes.Count)
            Dim Header As Short = ComputeStaticHeader(PacketID, MessageLenghtType)

            Dim BytesToWrite(2 + MessageLenghtType + m_Bytes.Count - 1) As Byte
            BytesToWrite(0) = Header >> 8
            BytesToWrite(1) = Header - 256 * BytesToWrite(0)

            Dim index As Integer

            Select Case MessageLenghtType
                Case 1
                    BytesToWrite(2) = m_Bytes.Count
                    index = 3
                Case 2
                    BytesToWrite(2) = m_Bytes.Count >> 8
                    BytesToWrite(3) = m_Bytes.Count - 256 * BytesToWrite(2)
                    index = 4
                Case 3
                    BytesToWrite(2) = m_Bytes.Count >> 16
                    BytesToWrite(3) = m_Bytes.Count >> 8
                    BytesToWrite(4) = m_Bytes.Count - 256 * BytesToWrite(3) - 256 * 256 * BytesToWrite(2)
                    index = 5
            End Select
            Console.WriteLine("envoie : id = " & PacketID & ", taille = " & m_Bytes.Count) ' on ecrit l'ID et la taille
            Console.Write("0x")
            For i As Integer = index To m_Bytes.Count + index - 1
                BytesToWrite(i) = m_Bytes(i - index)
                Console.Write(BytesToWrite(i).ToString("X2"))
            Next
            Console.WriteLine()
            If Form1._socket_Connexion.Connected Then
                Form1._socket_Connexion.Send(BytesToWrite)
            Else
                Form1._socket_Jeu.Send(BytesToWrite)
            End If

            m_Bytes.Clear()

        End Sub

        Public Sub WriteByte(ByVal Value As Byte)
            m_Bytes.Add(Value)
        End Sub

        Public Sub WriteBoolean(ByVal Value As Boolean)
            If Value Then
                WriteByte(1)
            Else
                WriteByte(0)
            End If
        End Sub
        Public Sub WriteShort(ByVal Value As Short)
            WriteByte(CByte(Value >> 8))
            WriteByte(CByte(Value))
        End Sub
        Public Sub WriteUShort(ByVal Value As UShort)
            WriteByte(CByte(Value >> 8))
            WriteByte(CByte(Value And 255))
        End Sub
        Public Sub WriteUInt32(ByVal Value As UInteger)
            WriteByte(CByte(Value >> 24))
            Value -= (Value >> 24) << 24
            WriteByte(CByte(Value >> 16))
            Value -= (Value >> 16) << 16
            WriteByte(CByte(Value >> 8))
            Value -= (Value >> 8) << 8
            WriteByte(CByte(Value))
        End Sub
        Public Sub WriteDouble(ByVal Value As UInteger)
            WriteByte(CByte(Value >> 56))
            Value -= (Value >> 56) << 56
            WriteByte(CByte(Value >> 48))
            Value -= (Value >> 48) << 48
            WriteByte(CByte(Value >> 40))
            Value -= (Value >> 40) << 40
            WriteByte(CByte(Value >> 32))
            Value -= (Value >> 32) << 32
            WriteByte(CByte(Value >> 24))
            Value -= (Value >> 24) << 24
            WriteByte(CByte(Value >> 16))
            Value -= (Value >> 16) << 16
            WriteByte(CByte(Value >> 8))
            Value -= (Value >> 8) << 8
            WriteByte(CByte(Value))
        End Sub
        Public Sub WriteString(ByVal Value As String)
            WriteUTF(Value)
        End Sub
        Public Sub WriteUTF(ByVal Value As String)
            Dim BytesToWrite() As Byte = System.Text.Encoding.UTF8.GetBytes(Value)
            WriteUShort(BytesToWrite.Length)
            For Each Bit As Byte In BytesToWrite
                WriteByte(Bit)
            Next
        End Sub

        Sub WriteInt32(ByVal Target As Integer)
            Dim arr As Byte()
            arr = BitConverter.GetBytes(Target)
            WriteByte(arr(3))
            WriteByte(arr(2))
            WriteByte(arr(1))
            WriteByte(arr(0))
        End Sub

        Sub WriteInt16(ByVal Target As Integer)
            Dim arr As Byte()
            arr = BitConverter.GetBytes(Target)
            WriteByte(arr(1))
            WriteByte(arr(0))
        End Sub

        Sub WriteSingle(ByVal Target As Double)
            Dim arr As Byte()
            arr = BitConverter.GetBytes(Target)
            For Each bytte As Byte In arr
                WriteByte(bytte)
            Next
        End Sub

    End Class
End Namespace

Je le trouve à quelle endroit dans le Invoker?

Merci
 
A

Anonymous

Invité
#34
Je crois que la c'est des Classes fait par des devs pour faciliter les sockets 2.0 !
Ca ne se trouve pas dans le Invoker

A confirmer !
 

FastFrench

Membre Actif
Inscrit
19 Octobre 2010
Messages
214
Reactions
0
#35
Pour info, cette fonction est fausse :
Code:
        Public Sub WriteDouble(ByVal Value As UInteger)
            WriteByte(CByte(Value >> 56))
            Value -= (Value >> 56) << 56
            WriteByte(CByte(Value >> 48))
            Value -= (Value >> 48) << 48
            WriteByte(CByte(Value >> 40))
            Value -= (Value >> 40) << 40
            WriteByte(CByte(Value >> 32))
            Value -= (Value >> 32) << 32
            WriteByte(CByte(Value >> 24))
            Value -= (Value >> 24) << 24
            WriteByte(CByte(Value >> 16))
            Value -= (Value >> 16) << 16
            WriteByte(CByte(Value >> 8))
            Value -= (Value >> 8) << 8
            WriteByte(CByte(Value))
        End Sub
 
A

Anonymous

Invité
#36
Merci,

Mais sais-tu où les trouver ?
Pas dans le invoker d'après ce que j'ai compris :?
 
A

Anonymous

Invité
#37
Sur pimp je pense qu'ils ont beaucoup de ressources !

je pense ils ont
 
A

Anonymous

Invité
#38
NullReferenceException: Ton ProtocolTypeManager.GetInstance() retourne null (rien) quand il devrait retourner un nouvel objet. Alors verifie pourquoi un appel a cette methode ne retourne rien.
 
A

Anonymous

Invité
#39
Mon _loc_17 est Nothing car mon_loc_16 a des valeurs bizarre...

Donc mon screen plus haut _loc_16 = 12 et dans le proto.as il n'y a pas de valeur pour 12 ...


Code:
_loc_16 = param1.ReadUnSignedshort()
            _loc_17 = ProtocolTypeManager.getInstance(_loc_16)

Je précise que j'ai le même problème pour récupérer l'inventaire dans ObjectItem:

Code:
_loc_4 = param1.ReadUnSignedshort()
                _loc_5 = ProtocolTypeManager.getInstance(_loc_4)
_loc_5.deserialize(param1)
                Me.effects.Add(_loc_5)
Ici mon _loc_4 prend la valeur 1 ...


Merci pour votre aide :D
 
A

Anonymous

Invité
#40
Alors tu as encore un probleme avant meme d'arriver a cet endroit.
 
Haut Bas