Alors voici mon premier tutoriel, j'espère qu'il sera utile.
Partie A : Déplacement sur une map hors combat :
- Il vous faut connaitre la cellid sur laquelle votre personnage est positionné. (Celle - ci se récupère grâce au packet 226 : MapComplementaryInformationsDataMessage avec ses sous-classes instanciées biensur :) )
- Il vous faut connaitre la mapid sur laquelle votre personnage apparaît. (Celle-ci s'obtient grâce au packet 220 : CurrentMapMessage qui est très simple)
Donc voila nous avons toutes les informations pour faire des déplacements, voici la marche à suivre.
Exemple si vous voulez que votre personnage se déplace d'une case vers le haut (exemple que j'ai déjà effectuer et qui fonctionne donc les valeurs de cellid et mapid mettaient propre mais je vous donnerais les infos pour d'autres déplacements à la fin)
Il faudra écrire le nombre de cases pour le déplacement : ici 2 cases sont nécessaires : celle de départ et celle d'arrivée.
Exemple de code :
Dim param1 As New Dofus.DofusWriter
param1.WriteUShort(2)
Ensuite il faut écrire les cellid des différents cases dans l'ordre du déplacement : ici cellid de départ = 428 et cellid d'arrivée = 400
Exemple de code :
param1.WriteUShort(Cell_ID)
Cell_ID = Cell_ID - 28
param1.WriteUShort(Cell_ID)
Ensuite il faut écrire la mapid de la map sur laquelle on se trouve : ici mapid = 142724
Exemple de code :
param1.WriteUInt32(Map_ID)
Et pour finir il faut envoyer les packets au serveur : ici il s'agit des packets 950 et 952
Exemple de code :
Dofus.DofusWriter.Send(950)
Dofus.DofusWriter(952)
Donc voici le code final d'une fonction de déplacement d'une case vers le haut :
Dim param1 As New Dofus.DofusWriter
param1.WriteUShort(2)
param1.WriteUShort(Cell_ID)
Cell_ID = Cell_ID - 28
param1.WriteUShort(Cell_ID)
param1.WriteUInt32(Map_ID)
Dofus.DofusWriter.Send(950)
Dofus.DofusWriter(952)
Liste des différentes formules pour le calcul des cellid pour les deplacements :
Pour aller en haut :
Cell_ID = Cell_ID - 28
Pour aller en bas :
Cell_ID = Cell_ID + 28
Pour aller à droite :
Cell_ID = Cell_ID + 1
Pour aller à gauche :
Cell_ID = Cell_ID - 1
Pour les diagonales c'est un peu plus difficile il faut savoir si nous sommes sur une colonne et ligne pair ou impair :
Pour aller en diagonale (haut à droite) :
If ((Cell_ID / 28) - (Cell_ID \ 28)) >= 0.5 Then
Cell_ID = Cell_ID - 13
Else
Cell_ID = Cell_ID - 14
End If
Pour aller en diagonale (haut à gauche) :
If ((Cell_ID / 28) - (Cell_ID \ 28)) >= 0.5 Then
Cell_ID = Cell_ID - 14
Else
Cell_ID = Cell_ID - 15
End If
Pour aller en diagonale (bas à droite) :
If ((Cell_ID / 28) - (Cell_ID \ 28)) >= 0.5 Then
Cell_ID = Cell_ID + 15
Else
Cell_ID = Cell_ID + 14
End If
Pour aller en diagonale (bas à gauche) :
If ((Cell_ID / 28) - (Cell_ID \ 28)) >= 0.5 Then
Cell_ID = Cell_ID +14
Else
Cell_ID = Cell_ID + 13
End If
Tous ce code pour aller en diagonale est correct je viens de le revérifier avec l'aide de 4R7Y.
Partie B : Changement de map :
- Il vous faut encore la cellid et encore la mapid.
Dans tous cela nous savons qu'une map se compose de 560 cellid allant de 0 à 559.
Donc le but est de tester sur quelle cellid se trouve notre personnage pour savoir s'il se trouve sur un bord de la map et qu'il souhaite aller sur la map d'après.
Donc dans un premier temps nous allons voir comment effectuer un changement vers le haut puis nous verrons ensuite comment déterminer quelle changement faut-il effectuer.
Tous d'abord il faut que votre personnage soit en bordure d'une map, puis il faut écrire la mapid de la map sur laquelle vous voulez que le personnage se rend :
Dim param1 As New Dofus.DofusWriter
Map_ID = Map_ID + 1
param1.WriteUInt32(Map_ID)
Ensuite il faut simplement envoyer les données au serveur par le packet 221 :
Dofus.DofusWriter.Sens(221)
Voila vous avez enfin réussi un changement de map vers le haut en voici le code complet :
Dim param1 As New Dofus.DofusWriter
Map_ID = Map_ID + 1
param1.WriteUInt32(Map_ID)
Dofus.DofusWriter.Sens(221)
Maintenant voici les valeurs pour les changements de map :
Pour aller vers le haut :
Map_ID = Map_ID + 1
Pour aller vers le bas :
Map_ID = Map_ID - 1
Pour aller vers la droite :
Map_ID = Map_ID - 512
Pour aller vers la gauche :
Map_ID = Map_ID + 512
Suite à cela voici comment changé de map en fonction de la cellid où l'on se trouve :
Pour aller vers le haut :
For i = 0 To 27
If Cell_ID = i Then
Map_ID = Map_ID + 1
param1.WriteUInt32(Map_ID)
Dofus.DofusWriter(221)
End If
Next
Pour aller vers le bas :
For i = 532 To 559
If Cell_ID = i Then
Map_ID = Map_ID - 1
param1.WriteUInt32(Map_ID)
Dofus.DofusWriter(221)
End If
Next
Pour aller vers la droite :
For i = 27 To 559 Step 28
If Cell_ID = i Then
Map_ID = Map_ID - 512
param1.WriteUInt32(Map_ID)
Dofus.DofusWriter(221)
End If
Next
For i = 13 To 545 Step 28
If Cell_ID = i Then
Map_ID = Map_ID - 512
param1.WriteUInt32(Map_ID)
Dofus.DofusWriter(221)
End If
Next
Pour aller vers la gauche :
For i = 0 To 532 Step 28
If Cell_ID = i Then
Map_ID = Map_ID + 512
param1.WriteUInt32(Map_ID)
Dofus.DofusWriter(221)
End If
Next
For i = 14 To 518 Step 28
If Cell_ID = i Then
Map_ID = Map_ID + 512
param1.WriteUInt32(Map_ID)
Dofus.DofusWriter(221)
End If
Next
ATTENTION j'ai remarquer que par endroits dans le jeu D. (exemple : au repère 0, Y ou au repère X, 0) les valeurs d'addition ou de soustraction donné pour les changements de map sont faussés il faudra trouvé une nouvelle forme de calcul. (Je n'ai pas encore eu le temps de me pencher dessus.)
Conclusion : J'espère que ce tutoriel sera utile pour bien des personnes et qu'il n'est pas parfait donc n'hésiter pas à faire des critiques et donner des conseils constructifs.
Liens utiles :
Post sur une connexion en VB.Net au jeu D. C'est grâce à ce post que j'ai pu fournir ce tutoriel.
Post sur la decompilation des maps .d2o
Cadernis, Apprenons ensemble.