2.0 Intêret de l'utilisation de ProtocolTypeManager ?

Inscrit
13 Juin 2023
Messages
1
Reactions
0
#1
Bonjour à tous,

Je travaille à développer un package python qui me permettra de parser automatiquement les sources du jeu relatives au protocole de communication afin d'avoir des données exploitables pour d'autres projets (analyse des échanges client-serveur, et plus si affinités :))
Je me suis basé sur l'approche du fameux Kouin-Kouin et son labot dans mon développement reconstruire le protocole. J'ai bien compris que certains aspects du projet sont maintenant outdated mais l'approche globale semble toujours valable.

En me promenant dans les fichiers sources pour fix les regexes permettant d'extraire les détails relatifs aux variables des différentes classes du protocole, je me suis rendu compte qu'il y avait deux approches concurrentes dans les sources pour la deserialization desdites variables par le client. Je pense plus particulièrement aux variables représentant des instances d'autres classes du jeu.
1) L'instanciation de la classe, directement, puis la lecture des données dans le stream reçu pour set la classe correctement.
2) La lecture d'un ID (short) dans les données reçues, puis l'appel à une méthode de la classe ProtocolTypeManager pour effectuer un lookup dans sa table de correspondance et obtenir la classe à instancier dans la variable, et enfi la lecture dans les données reçues pour set la classe correctement.


Si c'est pas clair je pourrai poster des bouts de code du jeu, mais m'est avis que vous voyez ce dont je veux parler.

Je me demandais donc : qu'est ce qui justifie l'existence de ces deux méthodes de deserialization ? Quel est l'intérêt de l'utilisation de ProtocolTypeManager ?

Bonne fin de week-end à vous
 
Inscrit
16 Octobre 2019
Messages
27
Reactions
14
#2
Montre des codes, car je n'ai rien compris.
 

Lakh92

Membre Actif
Inscrit
24 Decembre 2009
Messages
118
Reactions
0
#3
Prenons un exemple simple pour aider à comprendre :

Imagine que tu aies un message EntityJoined, avec dans ce message les propriétés de l'entité. Il y a plusieurs entités dans Dofus, des joueurs, des monstres, des ressources, etc.
Le ProtocolTypeManager sert à correctement désérialiser dans ces cas. On ajoute un identifiant qui représente le type de l'entité. ProtocolTypeManager sait (à partir du numéro) comment désérialiser l'entité.
 

tazman59

Contributeur
Inscrit
20 Decembre 2012
Messages
149
Reactions
27
#4
Hello,

Les Types dans le protocole Dofus représentent des entités "physiques" comme les items de l'inventaire, les montures dans les enclos, etc.

Prenons l'exemple de l'enclos. Celui-ci peut contenir des montures ou des objets.
Le paquet contenant les infos de l'enclos te fournira donc une liste d'ID des objets disponibles dans l'enclos.
Ces objets seront soit du Type Monture soit du Type Objet (pour la faire courte) et il est impossible de prévoir à l'avance ce que le serveur t'enverra car cela dépend de ce qu'il y a dans l'enclos au moment ou tu reçois le paquet.

Le ProtocolTypeManager sert à récupérer de manière dynamique un Type en fonction de son ID.

Les avantages sont multiples. L'un d'entre eux est que si un Type B hérite d'un Type A (chacun avec un ID différent) le serveur peut décider de lui même du degré d'héritage qui commencera à déserializer (en t'envoyant l'ID du Type B ou du Type A).

Les IDs des Types ne dépendent pas des IDs des Messages. Ainsi, un Type peut avoir le même ID qu'un Message et c'est sûrement pour ça qu'ils ont enregistré les Types dans un autre tableau. Utile ou pas ? C'est un détail.
 
Inscrit
4 Decembre 2019
Messages
9
Reactions
3
#5
A moins que tu aies envies d'écrire un gros switch sur le PacketID ou un gros if ou tu instances manuellement chacune des classes à la reception du protocoleID correspondant, tu devras avoir un mécanisme qui te permet de générer les messages par réflexion...
Sinon tu passeras ta vie à coder ... Après, je trouve la manière dont Ankama le fait un peu dégueu (grosse classe avec 10 000 lignes dans le constructeur lol)
 
Inscrit
1 Juin 2016
Messages
20
Reactions
2
#6
A moins que tu aies envies d'écrire un gros switch sur le PacketID ou un gros if ou tu instances manuellement chacune des classes à la reception du protocoleID correspondant, tu devras avoir un mécanisme qui te permet de générer les messages par réflexion...
Sinon tu passeras ta vie à coder ... Après, je trouve la manière dont Ankama le fait un peu dégueu (grosse classe avec 10 000 lignes dans le constructeur lol)
Parce qu'ils "enregistrent" chacun des messages, ils n'utilisent pas vraiment de mécanisme de réflexion. D'ailleurs ce mécanisme a un coût au runtime, mais c'est pas comme si tu avais besoin "d'enregistrer" les messages toutes les 30 secondes.. donc c'est plutôt une bonne idée.
 
Dernière édition:
Inscrit
4 Decembre 2019
Messages
9
Reactions
3
#7
Parce qu'ils "enregistrent" chacun des messages, ils n'utilisent pas vraiment de mécanisme de réflexion. D'ailleurs ce mécanisme a un coup au runtime, mais c'est pas comme si tu avais besoin "d'enregistrer" les messages toutes les 30 secondes.. donc c'est plutôt une bonne idée.
Tout à fait d'accord avec toi pour le coût au runtime. mais ça manque d'élégance :p
 
Haut Bas