Analyse Sockets 1.29, problème de déplacement après un combat !

Inscrit
30 Septembre 2015
Messages
5
Reactions
0
#1
Bonjour,

J'ai repris les sources d'un bot très connu et je l'ai adapté pour serveur privé, tout fonctionne.

j'ai juste un problème de socket à la fin d'un combat contre l'épouvantail, le programme fait une boule.

Voici les sockets reçu et envoyé lorsqu'on fauche (quand ça marche) :



Send: GA001db6
On ordonne au personnage de se déplacer jusqu'au blé
Recv: GA0;1;173238;abEdbS On reçois "Ok, tu te déplace"
Send: GA500122;45 "On ordonne de faucher ce blé"
Send: GKK0 On arrive à destination
Recv: BN On reçois "Ok, t'es arrivé"
Recv: GA1;501;173238;122,7300 On reçois "ton perso est en train de faucher"
Send: GKK1 Une fois le temps de fauche attendu, on envois "C'est bon, j'ai fini"

Et la boucle recommence

Ok ! Maintenant, imaginons que je tombe en combat contre un épouvantail.
Le combat se déroule comme prévu, mon personnage tue l'épouvantail.
Maintenant, retour à la fauche. et là, le problème arrive ; voiçi les sockets envoyés et reçus :



Send: GA001geyhcm
On ordonne au personnage de se déplacer jusqu'au blé
Recv: GA1;1;173238;afVgeyhcA On reçois "Ok, tu te déplace"
Send: GA500140;45 "On ordonne de faucher ce blé"
Send: GKK0 On arrive à destination
Send: GA001geyhcm "On ordonne de faucher ce blé"
Recv: GA2;1;173238;afVgeyhcA On reçois "Ok, tu te déplace"
Send: GA500140;45 "On ordonne de faucher ce blé"
Send: GKK0 On arrive à destination
Send: GA001geyhcm "On ordonne de faucher ce blé"
Recv: GA3;1;173238;afVgeyhcA On reçois "Ok, tu te déplace"



Et voilà ! ce qui fait que mon personnage se déplace jusqu'au blé, ce TP la ou il était et se re-déplace jusqu'au même blé. Mais, pourquoi cela arrive-t-il après un combat?

J'aimerais savoir aussi pourquoi le packets GA0 s'incrémente. Si vous regardez bien, pendant le bug, on voit GA1;1, puis GA2;1, puis GA3;1... j'ai été ce matin jusqu'au packet G27;1 !

J'ai aussi essayé de stopper le programme de déplacement juste après un tour de boucle, ce qui me donne ceci :


Send: GA001geyhcm "On ordonne de faucher ce blé"
Recv: GA2;1;173238;afVgeyhcA On reçois "Ok, tu te déplace"
Send: GA500140;45 "On ordonne de faucher ce blé"
Send: GKK0 On arrive à destination



Et cela reste bloqué, on ne reçois même pas le "BN" du serveur.
Et donc, ne fauche pas.

Voilà j'espère que quelqu'un va me venir en aide !
je peux envoyer les sources du bot si vous voulez.

J'ai publié ici même il y a deux-trois jours, donc désolé du double post !

PS : J'ai aussi analysé les packets avec WPE, et oui, c'est exactement les mêmes,mais je n'ai jamais vu de GA2;1,GA3;1 mais toujours GA0;1.


Merci d'avance

Bonne journée
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#2
D'apprès ce que je peux voir, la cause de tous tes problèmes est l'absence de la confirmation du déplacement après un combat.
-> Recv: BN On reçois "Ok, t'es arrivé"

Du coup ton timer attends un certains temps et retente le même déplacement à l'infini, si je ne me trompe pas ?

C'est un peu difficile de t'aider en l'absence de code.
 
Inscrit
30 Septembre 2015
Messages
5
Reactions
0
#3
Ici, c'est le traitement des packets "GA", donc des packets d'action.

Code:
 ElseIf (Mid(packet, 1, 5) = "GA;1;") Then
                .TabUtilisateur.TextLogInfos.AppendText("Deplacement en cellule ... (" & Mid(packet, 1, 6) & ")" & vbCrLf)
                .sock.Envoyer("GI")

            ElseIf (Mid(packet, 1, 5) = "GA;4;") Then
                Dim pate As String = Gettok(packet, ";", 4)
                .caseActuelle = Gettok(pate, ",", 1)

                ElseIf (Mid(packet, 1, 6) = "GA;900") Then
                    .sock.Envoyer("GA902" & Gettok(packet, ";", 3))

                ElseIf (Mid(packet, 1, 7) = "GA1;501") Then
                    If (Gettok(packet, ";", 3) = .monIdDofus) Then

                        Dim pate As String = Gettok(packet, ";", 4)
                        Dim tempsDeFauche As Integer = CInt(Gettok(pate, ",", 2))

                    .WaitFauche(tempsDeFauche)
                    End If

                ElseIf (Mid(packet, 1, 6) = "GA0;1;") Then
                .TabUtilisateur.TextLogInfos.AppendText("Deplacement en cellule ... (" & Mid(packet, 1, 6) & ")" & vbCrLf)

                If (.enCombat = 0) Then

                    If (Gettok(packet, ";", 3) = .monIdDofus) Then

                        Dim cherche As String = Gettok(packet, ";", 4)
                        cherche = Mid(cherche, cherche.Length - 1)
                        Dim trouve As Integer = -1

                        For i As Integer = 0 To 1024
                            If (cases(i) = cherche) Then
                                trouve = i
                                i = 1025
                            End If
                        Next

                        If (trouve <> -1) Then
                            .caseActuelle = trouve
                            .Debug("Moving cell " & trouve & " found")
                        End If

                    ElseIf isOnMonsterTab(index, Gettok(packet, ";", 3)) Then

                        Dim item As ListViewItem = onMonsterTab(index, Gettok(packet, ";", 3))

                        Dim cherche As String = Gettok(packet, ";", 4)
                        cherche = Mid(cherche, cherche.Length - 1)
                        Dim trouve As Integer = -1

                        For i As Integer = 0 To 1024
                            If (cases(i) = cherche) Then
                                trouve = i
                                i = 1025
                            End If
                        Next

                        If trouve <> -1 Then item.SubItems(1).Text = trouve.ToString
End if
End if


Et voici le fichier la ou la fauche se déroule :

Code:
 Public Sub GetFauche()
        If TimerFauche.Enabled = True Then
            If (TabUtilisateur.InvokeRequired) Then
                TabUtilisateur.Invoke(New ThreadDelegate(AddressOf GetFauche))
            Else

                If isIdle() Then
                    TabUtilisateur.TextLogInfos.AppendText("Fonction GetFauche" & vbCrLf)
                    For i As Integer = 0 To TabUtilisateur.ListeRessources.Items.Count - 1

                        If (TabUtilisateur.ListeRessources.Items(i).SubItems(0).Text = nomRessource) Then
                            If (TabUtilisateur.ListeRessources.Items(i).SubItems(2).Text = "Non coupé") Then

                                Dim caseAFaucher As Integer = TabUtilisateur.ListeRessources.Items(i).SubItems(1).Text

                                If caseAFaucher <> caseActuelle Then
                                    Faucher(caseAFaucher)
                                    Exit Sub
                                End If

                            End If
                        End If

                    Next
                    TabUtilisateur.TextLogInfos.AppendText("Fonction Changer map" & vbCrLf)
                    ChangerMap()

                End If

            End If
        Else
            Exit Sub
        End If
    End Sub

    Public Sub Faucher(ByVal caseFauche As Integer)

        If TimerFauche.Enabled = True Then
            TabUtilisateur.TextLogInfos.AppendText("Fonction Faucher" & vbCrLf)
            Dim ThreadFauche As New Threading.Thread(AddressOf Fauche)
            ThreadFauche.IsBackground = True
            caseDeFauche = caseFauche
            ThreadFauche.Start()
        Else
            Exit Sub
        End If
    End Sub

    Private Sub Fauche()
        If TimerFauche.Enabled = True Then
            If (TabUtilisateur.InvokeRequired) Then
                TabUtilisateur.Invoke(New ThreadDelegate(AddressOf Fauche))
            Else
                TabUtilisateur.TextLogInfos.AppendText("Fonction Fauche" & vbCrLf)
                Dim caseFauche As Integer = caseDeFauche
                If (bloqueGA = 0) Then
                    bloqueGA = 1

                    Debug("Collecting cell " & caseFauche)

                    Dim Rand As New Random
                    Dim nbr As Integer
                    Dim path As String = ""
                    Dim pather As New Pathfinding
                    If (mapDataActuel(caseFauche).movement = 2) Then
                        path = pather.pathing(mapDataActuel, caseActuelle, caseFauche)
                    Else
                        path = pather.pathing(mapDataActuel, caseActuelle, caseFauche, True)
                    End If

                    If path <> "" Then

                        nbr = Rand.Next(400, 3000)
                        TabUtilisateur.nbrAlea.Text = nbr
                        wait(nbr)
                        'If countFauche = 0 Then
                        countFauche = 1
                        TabUtilisateur.TextLogInfos.AppendText("Deplacement GA001 (fauche)" & vbCrLf)
                        sock.Envoyer("GA001" & path)
                        enDeplacement = 1
                        sock.Envoyer("GA500" & caseFauche & ";" & idRessource)

                        countFauche = 1
                        wait(distance(caseActuelle, caseFauche) * 330)
                        TabUtilisateur.TextLogInfos.AppendText("Debut" & vbCrLf)
                        sock.Envoyer("GKK0")






                        bloqueGA = 0
                        enDeplacement = 0
                        'Else
                        '   MessageBox.Show("Count à 1")
                        'End If
                        If combatAvant = True Then
                            combatAvant = False
                            Exit Sub
                        End If

La fonction GetFauche est appelée à chaque tick du timer (donc, pour commencer à faucher, on active tout simplement ce timer (.enabled = true)) :

Code:
 Private Sub TimerFauche_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerFauche.Tick
        GetFauche()
    End Sub

Et enfin, les fonctions d'attente de la fauche.

Code:
Public Sub WaitFauche(ByVal tempsDeFauche As Integer)
        TabUtilisateur.TextLogInfos.AppendText("Fonction Wait Fauche" & vbCrLf)
        Dim ThreadWaitFauche As New Threading.Thread(AddressOf WaitingFauche)
        tempsFauche = tempsDeFauche
        ThreadWaitFauche.IsBackground = True
        ThreadWaitFauche.Start()

    End Sub

    Public Sub WaitingFauche()
       
            Debug("Waiting for collect")

            Dim Rand As New Random
            Dim tempsDeFauche As Integer = tempsFauche

            enFauche = 1

            Threading.Thread.Sleep(tempsDeFauche)
            sock.Envoyer("GKK1")

            enFauche = 0
        countFauche = 0
            Debug("End of collect-waiting")
    End Sub


Et j'allais oublier, pour finir le code de combat (seulement la fin, quand le combat se termine) :

Code:
 ElseIf (Mid(packet, 1, 2) = "GE") Then
                    .nombreDeCombat += 1
                    If ((.nombreDeCombat >= AuBoutDeCombats) AndAlso (ChangerDeMap)) Then
                        .changeDeMap = 1
                    End If
                    .TimerLaunch.Enabled = False
                    .enCombat = 0
                    .sock.Envoyer("GC1")

                    wait(500)
                    .TabUtilisateur.TextLogInfos.AppendText("Combat terminé ! " & vbCrLf)

                    wait(2000)

J'ai donc mis le Timer de fauche à False en fin de combat pour voir en détails les packets envoyés (c'est plus simple pour mes analyses).
je le réactive donc en relançant la fauche, et c'est la que le bug apparait.


Voilà !

Ce serait vraiment cool de m'aider, car j'avoue que je ne trouve aucun moyen d’arrêter cette foutu boucle !
J'ai le dossier des sources au complet si tu veux.

Merci d'avance !
 
Inscrit
30 Mars 2016
Messages
12
Reactions
0
#4
Est ce que tu voudrais pas tenter de le faire manuellement avec le client 1.29 tout en surveillant les paquets envoyés reçus pour trouver l'éventuel mismatch ?
Ça sera peut être plus pratique
 
Inscrit
7 Juillet 2016
Messages
3
Reactions
0
#5
Je sais que je déterre un peu ce poste, mais je pense avoir trouvé la raison de ce comportement étrange... Donc ça pourrait être utile à d'autres qui rencontreraient ce problème...
En fait, le nombre après "GA", du genre GA2;... ou GA27;... correspond à une sorte d'ID de l'action en cours (un déplacement, une récolte, etc...). Pour que le serveur réponde correctement, il faut alors renvoyer "GKK" + l'ID en question, et non pas simplement GKK0.
 
Inscrit
4 Aout 2016
Messages
166
Reactions
0
#6
Bien jouer Sharlock.. o-o
 
Haut Bas