VB/VB.Net GameMapNoMovementMessage

A

Anonymous

Invité
#1
Bonsoir,

d'habitude j'aime pas trop poster deux topic a la suite sur le fofo mais vu que ya peu d'ambiance en ce moment voila tout :)
Je recoi un GameMapNoMovementMessage -> SANS RAISON !

Prenons un personnage, Il est a la cellid 241, il veut se déplacer a la 242:

Code:
Public Sub MoveOnMap(ByVal CellToGo As Integer)
            Dim Path As New Pathfinding.Pathfinding
            Path.FindPath(MapInfo.Cells, CharacterInfo.CellId, CellToGo)

            If Not Path.chemin.Count = 0 Then
                Dim GMMRM As New Network.Game.Map.Movement.Request.GameMapMovementRequestMessage
                GMMRM.init(Path.chemin, MapInfo.MapId)
                GMMRM.pack(ServerSock)

                    Dim TimeToWait As Integer

                    If Path.chemin.Count <= 2 Then
                        TimeToWait = Path.chemin.Count * 500
                    Else
                        TimeToWait = Path.chemin.Count * 300
                    End If

                    pause(TimeToWait)

                    Dim GMMCM As New Network.Game.Map.Movement.GameMapMovementConfirmMessage
                    GMMCM.pack(ServerSock)
            End If
        End Sub
Donc mon Path.Chemin = 241 et 242.
Map id Ok.

Mais WTF ?!?

Si c'est les informations sont bonnes, sa viendrai de l'envoi du paquet ?


Voilà ma classe qui est tout a fait normal:
Code:
Imports FullBot.Utils.SocketManager.Parsing

Namespace Network.Game.Map.Movement.Request
    Public Class GameMapMovementRequestMessage

        Public keyMovements As New List(Of UInteger)
        Public mapId As UInteger = 0
        Public Const protocolId As UInteger = 950

        Public Function init(param1 As List(Of UInteger), param2 As UInteger) As GameMapMovementRequestMessage

            Me.keyMovements = param1
            Me.mapId = param2
            Return Me
        End Function

        Public Function deserialize(param1 As DofusReader)

            Dim _loc_4 As UInteger = 0
            Dim _loc_2 = param1.ReadUnSignedshort()
            Dim _loc_3 As UInteger = 0
            While (_loc_3 < _loc_2)


                _loc_4 = param1.ReadShort()
                Me.keyMovements.Add(_loc_4)
                _loc_3 = _loc_3 + 1
            End While
            Me.mapId = param1.ReadInt()
            Return Me
        End Function

        Public Function pack(ByVal sock As Object)
            Dim _Writer As New DofusWriter()
            Me.serialize(_Writer)
            DofusWriter.Send(GameMapMovementRequestMessage.protocolId, sock)
            Return Me
        End Function
        Public Function serialize(param1 As DofusWriter)

            param1.WriteShort(Me.keyMovements.Count)
            Dim _loc_2 As UInteger = 0
            While (_loc_2 < Me.keyMovements.Count)


                param1.WriteShort(Me.keyMovements(_loc_2))
                _loc_2 = _loc_2 + 1
            End While
            param1.WriteInt16(Me.mapId)
            Return Me
        End Function
    End Class
End Namespace

Donc a priori rien d'étonnant jusqu'ici.

Code:
Friend Shared Function Send(ByVal PacketID As Integer, ByVal sock As Object)
            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

            Dim send_debug As String = Nothing
            For i As Integer = index To m_Bytes.Count + index - 1
                BytesToWrite(i) = m_Bytes(i - index)
            Next
            m_Bytes.Clear()
            sock.Send(BytesToWrite)
            Console.WriteLine("envoie : id -> " & PacketID & " len -> " & MessageLenghtType)
            Console.WriteLine()

            Return (BytesToWrite)

        End Function

Je ne pense pas que sa vienne de mon send puisque c'est celui de ToOnS et c'est celui que j'ai utilisé pour XX de mes projets.

Mais la seul chose qui me parait louche est que Mon 950 -> GameMapMovementMessage -> Lenght -> 1
o_O ? Nan ?

J'attend vos avis
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#2
Salut , bon déjà je suppose que c'est toujours un MITM donc la pause elle sert a rien car le client officiel envoit le GameMapMovementConfirmMessage au bon moment (donc faut pas l'envoyer avec le bot)
tu peux supprimer ca :
Code:
Dim TimeToWait As Integer

                    If Path.chemin.Count <= 2 Then
                        TimeToWait = Path.chemin.Count * 500
                    Else
                        TimeToWait = Path.chemin.Count * 300
                    End If

                    pause(TimeToWait)

                    Dim GMMCM As New Network.Game.Map.Movement.GameMapMovementConfirmMessage
                    GMMCM.pack(ServerSock)
apres je sais pas si juste le fait de pas envoyer le GameMapMovementConfirmMessage avec le bot (comme c'est le client officiel qui l'envoit) reglera le probleme mais en tout ca il sera pas envoyé 2 fois
et pour savoir si ton deplacement est fini tu mets un boolean : dim le_vilain_bouge as boolean = false , juste avant de bouger donc avant Dim GMMRM As New Network.Game.Map.Movement.Request.GameMapMovementRequestMessage tu le mets a true , tu "parse" ce que le client envoit (si tu le fais pas déjà) et quand il envoit GameMapMovementConfirmMessage alors tu as fini de bouger , tu remets a false

du coup tu peux changer la pause si vraiment il en faut une mais c'est de l'option par :
Code:
do while le_vilain_bouge
            pause(100)
loop
ensuite Console.WriteLine("envoie : id -> " & PacketID & " len -> " & MessageLenghtType) c'est plutôt : Console.WriteLine("envoie : id -> " & PacketID & " len -> " & BytesToWrite.count-1) ou meme BytesToWrite.count - index (pour ne pas prendre en compte le "header")
pour gagner un peu de performance , comme tu utilises pas Dim send_debug As String = Nothing
tu peux remplacer
Code:
Dim send_debug As String = Nothing
            For i As Integer = index To m_Bytes.Count + index - 1
                BytesToWrite(i) = m_Bytes(i - index)
            Next
par array.copy(m_Bytes,0,BytesToWrite,index,m_Bytes.Count-1)
 
A

Anonymous

Invité
#3
Bonsoir ToOnS,

merci de ta réponse, mais toujours pas :S:
envoie : id -> 950 len -> 8
Reception id -> 954, Lenght -> 0
Reception id -> 176, Lenght -> 0
Reception id -> 951, Lenght -> 10
Reception id -> 5632, Lenght -> 97

J'envoi 950 et encore NoMovement.

Je comprend vraiment pas...

Code:
Public Sub MoveOnMap(ByVal CellToGo As Integer)
            Dim Path As New Pathfinding.Pathfinding
            Path.FindPath(MapInfo.Cells, CharacterInfo.CellId, CellToGo)

            If Not Path.chemin.Count = 0 Then
                Dim GMMRM As New Network.Game.Map.Movement.Request.GameMapMovementRequestMessage
                GMMRM.init(Path.chemin, MapInfo.MapId)
                GMMRM.pack(ServerSock)
            End If
        End Sub
Ya vraiment un souci avec les sources de ce MITM.
Car déjà j'ai un souci de changement de map. Le bot se déplace jusqu'au bout de la map et ne change pas. Il faut que je reclique une deuxieme fois sur le changement de map pour qu'il l'effectue.

Déjà ce problème que j'ai mit de côté qui me parrait vraiment étrange sachant que je redirige les paquets imméditements mais là je comprend pas. Yaurai ptetre un lien entre ces deux soucis ?

Si vous avez une idée, même si elle vous parrait peut cohérente, transmettez la moi ;)
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#4
faudrait le voire tourner en live
 
Inscrit
29 Septembre 2011
Messages
393
Reactions
3
#5
tu utilise le pathfinding de Small?
 
A

Anonymous

Invité
#6
Cela vient surement du pathfinding de Tifoux, recode le.
 
A

Anonymous

Invité
#7
Nan Rkyada j'ai dis que les cellids était bonne.

@Tifoux, euh bah oui celui de small enfin le mien quoi.
Je ne t'avais pas envoyé la version avec le pathfidnign y me semble.
 
A

Anonymous

Invité
#9
Merci a Toons qui a encore résolu mon problème

je pense que sans lui la communauté du fofo qui est déjà faible serai divisé en 2.
Oui, sans lui moi je ne serai pas la.

Merci à toi
 

Geraff

Administrateur
Membre du personnel
Inscrit
13 Mars 2008
Messages
564
Reactions
0
#10
Salut,

Pourrais-tu poster la réponse pour les autres membres?

Merci !!
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#11
la reponse c'est que mapid est sur 4 bytes , pas sur 2 :p
 
Haut Bas