Deplacement dofus 1.29

Inscrit
5 Novembre 2016
Messages
56
Reactions
2
#1
bonjour,

enfin, finalement, j'ai réussie à connecter mon bot socket avec le serveur dofus1.29, mais la chose la plus importante, c'est de pouvoir déplacer mon personnage, ou même de changer de map si c'est possible,
Avec le wireshark, je constate que mon client envoie bien GA001 cga par exemple pour pouvoir se déplacer, mais je n'ai aucune idée comment le client le génère.
j'ai une source de Maxoubot mais il ne change pas de map, lance pas de combat ...
est ce que vous avez des pistes à me donner
merci
 

tazman59

Contributeur
Inscrit
20 Decembre 2012
Messages
148
Reactions
25
#2
"Pathfinding" "Cellules" "Algorithme"

 

Arth

Contributeur
Inscrit
28 Aout 2016
Messages
80
Reactions
3
#3
Hello, voila quelque infos qui devrait t'aider.

Le packet est de la forme:
GA001:path
path correspond au chemin que tu vas emprunter, c'est une liste de direction + cellule de fin de déplacement, cela décrit les lignes droites empruntés et leur points d'arriver.
Chaque ligne droite est décrite par 3 caractères, chaqu'un code une donnée numérique en base64. Les blocs de 3 caractères sont mis bout à bout et sont a lire dans l'ordre de lecture sinon tu seras perdu.

Voila le detail de chaque caractère:
caractère 1 : Direction (0 correspond à l'est, 1 correspond à SE, ... on continue dans le sens horaire)
caractère 2 : H = (cellid & 0xC0) >> 6 ; les 4 bits de poids fort de la fin de la cellid.
caractère 3 : L = (cellid & 0x3F) ; les 6 bit de poids faible de la cellid.

du coup tu peur récupérer la cellid:
cellid = ((H & 0xF)<<6) | (L & 0x3F)

Du coup pour générer cela, tu doit trouver un chemin composé d'un ensemble de ligne droite, parser les lignes droites comme il faut, et envoyer le packet.
Attention, toutes les cells que tu parcours sont activée, si il y a un trigger sur l'une d'elle ton chemin sera stoppé avant la fin. de plus il faut que tu vérifie que toute les cell que tu demande de parcourir soient parcourable, si tu dit au serveur que tu va marcher sur les arbres etc.. il risque de pas trop aimer.

Ça fait long temps que j'ai pas regarder les packets 1.29 alors j'ai peut-etre dit des bêtises, le mieux c'est de vérifier par toi même avec les sources, wireshark et un peu de logique.

Bonne chance.
 
Inscrit
29 Octobre 2016
Messages
65
Reactions
2
#4
Chaque case à une valeur en lettre et tout ça est compiler pour raccourcir ça pour le serveur.
Je te conseil de voir dans les sources du jeu, c'est pas avec wireshark que tu ira loin pour faire un bot, surtout pour des choses si capital.

Perso j'ai pris ceux du m4x0ubot pour vite comprendre et j'ai tout refais à 0 xD
J'espère que tu es bon en math sinon ciao les combats opti.

Et en effet faut d'abord voir si les cases sont accessible, pour ça faut télécharger le swf de la map correspondante (le serv nous donne les trucs qu'il faut pour la DL quand on va sur la map en question), qui une fois décrypté contient chacune des cellules si accessible ou pas et 2-3 infos.

Moi perso j'ai fais ça avec la map (me suis fais chier à tout faire à la main tout seul ligne par ligne):

Gris = accessible
noir = inaccessible
Jaune = étoile

ATTENTION en 1.29 TOUTES les maps n'ont pas le même nombre de cases. Si tu prend les sources du m4x0u te fait pas avoir, faudra modifier car lui prend 16 par ligne de base ..
 
Inscrit
5 Novembre 2016
Messages
56
Reactions
2
#5
franchement je suis perdu,
j'ai compris qu'il faut envoyer le G001 + caracter (direction)
par contre le path, je ne sais pas encore pour faire le deplacement
j'ai sais déjà comment faire le pathfinding a*, mais franchement je n'ai pas compris la logique du chemin, est ce que vous pouvez m'éclaircir un peu cette idée, pour l'instant je ne peux pas avancer dans mon projet :'(
je vous remercie d'avance
 
Inscrit
29 Octobre 2016
Messages
65
Reactions
2
#6
Il me semble (je dis peut être de la merde perso j'ai pris les fonctions du m4x0ubout me suis pas emmerder).
Que c'est la direction de chaque cellule dans laquelle tu vas + ce que arth à dit en 2 et 3eme caractère, je ne sais pas si la direction final de la dernière cellule est aussi à ajouté.

Je sais que moi m4x0ubot me sort 3 caractères par cellules.

Ensuite il retirer les 2 derniers sur chaque cellules (sauf la dernière).
 
Dernière édition:
Inscrit
5 Novembre 2016
Messages
56
Reactions
2
#7
bonjour, je reviens, j'ai reussi à envoyer le bon PATH,
mais le probleme maintenant, c'est que quand je me déplace, j'envoie le packet GKK0, et après, le serveur me bloque (je ne peux plus bouger).

j'ai implementé le code https://github.com/salesprendes/Bot...ster/Otros/Mapas/Movimiento/PathFinderUtil.cs méthode get_Tiempo_Desplazamiento_Mapa, pour savoir combien de temps, il faudrait pour envoyer le packet GKK0, mais il semble que ca ne marche pas.

voici mon implémentation en JAVA
getMovementTime():
public int getMovementTime() {
        int moveTime = 20;

        List<CellGame> cells = this.build();
        DurationAnimation durationAnimation = cells.size() > 6 ? DurationAnimation.RUN : DurationAnimation.WALK;

        CellGame previousCell;
        CellGame currentCell;

        for (int i = 1; i < cells.size(); i++) {
            previousCell = cells.get(i - 1);
            currentCell = cells.get(i);

            if (previousCell.getY() == currentCell.getY()) {
                moveTime += durationAnimation.getDurationHorizontal();
                
            } else if (previousCell.getX() == currentCell.getY()) {
                moveTime += durationAnimation.getDurationVertical();
                
            } else {
                moveTime += durationAnimation.getDurationLinear();
            }

            if (previousCell.getLevel() < currentCell.getLevel()) {
                moveTime += 100;
            } else if (currentCell.getLevel() > previousCell.getLevel()) {
                moveTime -= 100;
            } else if (previousCell.getSlope() != currentCell.getSlope()) {
                if (previousCell.getSlope() == 1) {
                    moveTime += 100;
                } else if (currentCell.getSlope() == 1) {
                    moveTime -= 100;
                }
            }
        }
        return moveTime;
    }
 
Inscrit
5 Novembre 2016
Messages
56
Reactions
2
#8
problème trouvé, il fallait juste envoyer \r\n au serveur
 
Haut Bas