2.0 Récupérer les déplacements en combat

Inscrit
27 Novembre 2018
Messages
7
Reactions
0
#1
Bonjour,

Contexte :
Je suis en train de construire un Overlay pour Dofus afin de rendre plus sympa l'interface en combat.
J'affiche donc des information par dessus la fenêtre de Dofus (en C# avec WPF). Le but est de pouvoir jouer efficacement sans devoir activer cet horreur de mode tactique moche !
J'ai donc décidé de me baser uniquement sur les packets reçu par le client (c'est eux qui font foie). Pour ça j'utilise Pcap (le portage C#) et filtre sur le protocole et le port de dofus.
Je n'envoie jamais au serveur de packets fait "à la main".

Ce que je fais :
Grosso modo, je récupère la map active dès que reçu, lis les données de la map depuis les fichiers du jeu (.d2p), en retire les informations, affiche en conséquence des infos dans mon Overlay (merci à vous ce forum m'a beaucoup aidé !).

Là où ça coince :
Cependant j'aimerais aller un peu plus loin en affichant des informations en dessous ou au dessus de chaque personnage en combat. Les informations en question, je les récupère bien, là où ça bloque c'est la position des entités en combat (la cellule où ils sont).

J'ai pas mal fouiné pour essayer de trouver où pouvait apparaître cet information (toujours que dans les packets reçus), et la seule possibilité semble être le message SequenceStartMessage quand il a le type SEQUENCE_MOVE (5). Il contient un payload assez conséquent parfois (50-60 bytes suivant le déplacement), c'est donc possible qu'il contienne bien quelque chose !
Jusqu'ici, je décompilais moi même les sources du client, et recodais les classes qui allait bien en C#, le kwak c'est que SequenceStartMessage ne semble pas contenir grand chose d'après les sources (le type de sequence et l'AuthorId).

Ma/Mes questions :
C'est là où j'aurais un peu besoin d'aide, est-ce bien dans le SequenceStartMessage qu'il faut chercher ?
Si oui, où est décrit dans les sources sa déserialization ? Ou comment le déserializer ?
Si non, qu'est ce qu'il me manque ? Je loupe un message ?


Si c'est pas tout à fait claire dites moi, j'ai tout codé à la mimine à partir de libs libre/open et du code source de Dofus, je devrais pouvoir éclairer. Merci !
 
Inscrit
26 Mars 2011
Messages
26
Reactions
1
#2
Bonsoir,
Alors pour les informations du combat, tu dois regarder les packets suivants (pour avoir plus de detail , tu dois utiliser un sniffer que tu trouvera ici sur le forum):

les informations generals sont dans com.ankamagames.dofus.network.messages.game.context.fight

-Les placements possibles lors de la phase de preparation : GameFightPlacementPossiblePositionsMessage,si tu regarde les sources, tu trouveras les positions possibles pour les monstres dans positionsForDefenders et ceux pour ta team(ou toi) dans positionsForChallengers.

-Les placements du debut de combat sont dans le dernier GameEntitiesDispositionMessage que tu recois.

-les informations des mouvements sont soit dans GameMapMovementMessage ou bien pour les mouvements par sort dans GameActionFightSlideMessage si il ya eu une poussee par exemple.

Les actions dans le combat se trouve dans le package com.ankamagames.dofus.network.messages.game.actions.fight, par example

-les invocations dans GameActionFightSummonMessage

-les sorts dans GameActionFightSpellCastMessage


en ce qui concerne le SequenceStartMessage , il indique le commencement d'une sequence d'actions et se fini par SequenceEndMessage .

Bref si j'ai pas dis de betise , tu dois regarder les packages indiques plus haut, pour deserialiser tu dois decompiler avec JPEXS par exemple et puis convertir le code en C# dans ton cas.

Cordialement
 
Inscrit
27 Novembre 2018
Messages
7
Reactions
0
#3
Bonjour,
Merci pour la réponse, de ce que je comprends, c'est donc que je ne détecte pas tous les messages !
Après un SequenceStartMessage je ne détecte pas de GameMapMovementMessage ou GameActionFightSpellCastMessage.
Je vais regarder du coté de mon Sniffer voir ce qui cloche.
 
Inscrit
27 Novembre 2018
Messages
7
Reactions
0
#4
Merci beaucoup Headspace !
C'était exactement mon problème, je ne lisais pas comme il faut au delà du premier message d'un packet, une petite adaptation pour rendre la méthode récursive et ça y est je capte bien tous les messages maintenant.

Je repars dans le code de l'Overlay :)
 

tazman59

Contributeur
Inscrit
20 Decembre 2012
Messages
149
Reactions
27
#5
Ca a l'air vachement interessant comme projet en tout cas !
 
Inscrit
27 Novembre 2018
Messages
7
Reactions
0
#6
Bonjour,
J'ai avancé et j'arrive maintenant à récupérer toutes les informations dont j'ai besoin... sauf une !
Je n'arrive pas à récupérer l'ID de mon personnage, et ce fait, je ne peux pas cibler explicitement mon personnage pour afficher des informations.

J'ai cru comprendre que d'habitude les gens récupéraient cet ID à la connexion, sauf que ça correspond pas à la façon d'utiliser mon overlay. Le principe est plutôt de le lancer une fois en jeu.

Y a t-il moyen de récupérer mon ID sans devoir recouper plusieurs messages et extrapoler ?
Si il n'y a vraiment aucun moyen je m'arrangerai pour que l'overlay se lance en même temps que le client, mais c'est pas top pour plusieurs raisons :
- possibilité d’arrêter/lancer l'overlay n'importe quand sans reconnecter son personnage
- rassurant car il n'a pas besoin d'être lancé pendant qu'on tape le login/mdp ou choisi un personnage
- lancé à la demande (possibilité de lancer Dofus sans overlay)

Si vous avez une idée je suis preneur !
 
Inscrit
26 Mars 2011
Messages
26
Reactions
1
#7
L'id du personnage se trouve dans CharacterSelectedSuccessMessage.as que tu recois apres le choix du personnage, il ya un champs CharacterBaseInformations qui contient l'Id, je ne sais pas (et je ne pense pas) que tu pourras le recuperer autrement
 
Inscrit
27 Novembre 2018
Messages
7
Reactions
0
#8
Bonjour,
Je ne suis pas sûr que l'on parle du même ID. dans CharacterSelectedSuccessMessage il y'a le player ID (comme dans le BasicWhoIsMessage).
Cependant pour le combat et placement j'ai besoin d'un Contextual ID, hors ce dernier n'as pas le même format (le player ID est non signé par exemple).

Je suis à coté de la plaque ? Ou alors il me manque quelque chose pour faire la passerelle entre player et contextual ID ?
 
Dernière édition:

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#9
Il y a un paquet, dont je ne pourrais pas de te donner le nom, qui fait un récapitulatif des membres du combats (enemies et alliés) juste après la fin de phase de placement.
 
Inscrit
27 Novembre 2018
Messages
7
Reactions
0
#10
Merci pour vos réponses ! J'ai trouvé un moyen de contourner le problème.
J'envoie un "/whoami" -> je reçois l'account ID
J'envoie un "/sit" -> je reçois la paire account ID et player ID

C'est pas très élégant, mais de cette façon je sais quel est le player ID auquel je correspond sans fabriquer de packets moi même
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#11
Tu devrais vérifier que le client n'envoit pas de BasicStatMessage (si ce paquet est toujours d'actualité), lorsque tu utilises le chat en local.
 
Inscrit
27 Novembre 2018
Messages
7
Reactions
0
#12
@DlueDream : J'ai un peu plus observé les messages reçus après mes commandes, il n'y a rien qui ressemble à BasicStatMessage.
En tout cas je peux maintenant avancer comme je veux sur mon interface, j'aurais bientôt une version de démo !
 
Inscrit
12 Avril 2014
Messages
22
Reactions
5
#13
Avec Pcap j'avais aussi eu ce problème de devoir reconstituer les messages parce qu'ils étaient répartis sur plusieurs paquets TCP parfois. Mais sinon le sniffage c'est bon pour la santé (celle de tes comptes bien sur :p)
 
Haut Bas