Décoder le GameMapMovementRequestMessage

Inscrit
15 Mai 2020
Messages
11
Reactions
1
#1
Bonjour,

Cela fais plusieurs heures que je cherche a comprendre comment est fais le GameMapMovementRequestMessage plus précisément la valeur de keymovement.

public function serializeAs_GameMapMovementRequestMessage(output:ICustomDataOutput) : void
{
output.writeShort(this.keyMovements.length);
for(var _i1:uint = 0; _i1 < this.keyMovements.length; _i1++)
{
if(this.keyMovements[_i1] < 0)
{
throw new Error("Forbidden value (" + this.keyMovements[_i1] + ") on element 1 (starting at 1) of keyMovements.");
}
output.writeShort(this.keyMovements[_i1]);
}
if(this.mapId < 0 || this.mapId > 9007199254740990)
{
throw new Error("Forbidden value (" + this.mapId + ") on element mapId.");
}
output.writeDouble(this.mapId);
}


Quand je convertit les shorts en décimale que je reçois ça correspond en gros a ça.
2 20893 20879 16806 61456 3072 0 23640 54095 56254 32100 62079 9396 12532 32557 20635 24651 35354 7782 14484 28954 1935 48793 25595 28227 60 38368 55059

Je suis perdu, si quelqu'un pourrais me mettre sur la bonne piste, merci d'avance.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
1 912
Reactions
39
#2
Ce sont des cellules compressés, je pense que ce fichier devrait t'éclairer:
https://github.com/alexandre10044/Pathfinder-2.0/blob/master/PathingUtils.cs

C#:
public static short[] GetCompressedPath(List<CellWithOrientation> path)    
        {    
            List<short> compressedPath = new List<short>();    
            if (path.Count < 2)    
            {    
                foreach (CellWithOrientation node in path)    
                {    
                    node.GetCompressedValue();    
                    compressedPath.Add(node.CompressedValue);    
                }    
            }    
            else    
            {    
                for (int i = 0; i < path.Count - 1; i++)    
                {    
                    path[i].SetOrientation(path[i + 1]);    
                }    
                path[path.Count - 1].SetOrientation(path[path.Count - 2].Orientation);    
                foreach (CellWithOrientation cell in path)    
                {    
                    cell.GetCompressedValue();    
                }    
                compressedPath.Add(path[0].CompressedValue);    
                for (int i = 1; i < path.Count - 1; i++)    
                {    
                    if (path[i].Orientation != path[i - 1].Orientation)    
                        compressedPath.Add(path[i].CompressedValue);    
                }    
                compressedPath.Add(path[path.Count - 1].CompressedValue);    
            }    
            return compressedPath.ToArray();    
         }
https://github.com/alexandre10044/Pathfinder-2.0/blob/master/CellWithOrientation.cs
C#:
CompressedValue = (short)(((int)Orientation & 7) << 12 | Id & 4095);
 
Dernière édition:
Inscrit
15 Mai 2020
Messages
11
Reactions
1
#3
Merci, j'ai réussi a décompresser ce que je reçoit et ça me donne donc la valeur de la rotation et l'id de la cellule, mais j'ai toujours un problème, à partir d'une valeur avant le premier zéro, les valeurs n'ont aucun sens :
Par exemple cette partie la
61456 0 61456 Correspond a la direction 15 et cellId 16 or la valeur maximum que la direction pourrait avoir est 7
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
1 912
Reactions
39
#4
Il faudrait check si la formule n'a pas changé.
C'est dans un fichier qui s'appelle MapMovementAdapter, il me semble.
 
Inscrit
15 Mai 2020
Messages
11
Reactions
1
#5
La fonction pour le serveur elle n'a pas changé.

Mais ce que j'aimerais faire est envoyer le packet GameMapMovementRequestMessage, donc je dois me fier a la fonction getServerMovement ou getClientMovement?
Code:
      public static function getServerMovement(path:MovementPath) : Vector.<uint>
      {
         var pe:PathElement = null;
         var lastValue:* = 0;
         var value:* = 0;
         var movStr:String = null;
         var movCell:uint = 0;
         path.compress();
         var movement:Vector.<uint> = new Vector.<uint>();
         var lastOrientation:uint = 0;
         var moveCount:uint = 0;
         for each(pe in path.path)
         {
            lastOrientation = pe.orientation;
            value = (lastOrientation & 7) << 12 | pe.step.cellId & 4095;
            movement.push(value);
            moveCount++;
         }
         lastValue = (lastOrientation & 7) << 12 | path.end.cellId & 4095;
         movement.push(lastValue);
         if(DEBUG_ADAPTER)
         {
            movStr = "";
            for each(movCell in movement)
            {
               movStr = movStr + ((movCell & 4095) + " > ");
            }
            _log.debug("Sending path : " + movStr);
         }
         return movement;
      }

Code:
      public static function getClientMovement(path:Vector.<uint>) : MovementPath
      {
         var previousElement:PathElement = null;
         var movement:int = 0;
         var destination:MapPoint = null;
         var pe:PathElement = null;
         var movStr:* = null;
         var movElement:PathElement = null;
         var mp:MovementPath = new MovementPath();
         var moveCount:uint = 0;
         for each(movement in path)
         {
            destination = MapPoint.fromCellId(movement & 4095);
            pe = new PathElement();
            pe.step = destination;
            if(moveCount == 0)
            {
               mp.start = destination;
            }
            else
            {
               previousElement.orientation = previousElement.step.orientationTo(pe.step);
            }
            if(moveCount == path.length - 1)
            {
               mp.end = destination;
               break;
            }
            mp.addPoint(pe);
            previousElement = pe;
            moveCount++;
         }
         mp.fill();
         if(DEBUG_ADAPTER)
         {
            movStr = "Start : " + mp.start.cellId + " | ";
            for each(movElement in mp.path)
            {
               movStr = movStr + (movElement.step.cellId + " > ");
            }
            _log.debug("Received path : " + movStr + " | End : " + mp.end.cellId);
         }
         return mp;
      }
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
1 912
Reactions
39
#6
Pour envoyer un déplacement c'est getServerMovement :)
 
Inscrit
19 Mai 2020
Messages
15
Reactions
2
#7
Salut j'ai le même problème je dev principalement en python et pour la première fois je coince sur la compréhension du code pour décompressé je n'arrive donc pas a refaire la fonction en python si quelqu'un a bien compris comment ça se passe une petite explication m'aiderai beaucoup pour espéré envoyé un déplacement avec getServerMovement comme BlueDream le propose plus haut :)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
1 912
Reactions
39
#8
C'est tout simple, cette formule permet la compression d'un id de cellule et d'une orientation.
C#:
CompressedValue = (short)(((int)Orientation & 7) << 12 | Id & 4095);
Si tu veux décompresser, tu reverse la formule.
Les cellules pour les lignes droites sont supprimées, le serveur n’envoie que les cellules d'intersections.
Si tu veux plus d'infos, va voir le fichier MapMovementAdapter.as.
 
Inscrit
19 Mai 2020
Messages
15
Reactions
2
#9
Merci je regarde bien attentivement ce soir et si jamais je reviendrai vers toi !
 
Inscrit
15 Mai 2020
Messages
11
Reactions
1
#10
Hello, je reviens sur ce thread car j'ai encore un problème, par exemple :

00 02 41
ac 41 ab 41 a6 c8 00 08 00 00 00 ae 00 2c 7b 54
92 13 92 d4 3f b9 6e 7e 3b 6b 43 21 f7 b3 52 8e
e3 43 78 44 ba c7 fe fc 5d 5f d9 f4 3d 64 e9 ae
db 86 77 58 df a5 27 df cd b0 89


00 02 == writeShort(this.keyMovements.length)
41 ac == writeShort(this.keyMovements[_i1])
41 ab == writeShort(this.keyMovements[_i1])
41 a6 c8 00 08 00 00 00 == writeDouble(this.mapId)

On vois bien que les 14 premiers bytes sont comme si dessus la taille et la valeur de keymovement ainsi que l'id de la map, or il reste des bytes après, et j'ai cherché partout, impossible de trouver a quoi correspondes ces bytes.

Merci d'avance de votre aide.
 
Inscrit
26 Janvier 2016
Messages
76
Reactions
13
#11
As tu bien découper ta frame par rapport à la length de data trouvé dans le header ?
 
Inscrit
15 Mai 2020
Messages
11
Reactions
1
#12
Oui
 
Inscrit
15 Mai 2020
Messages
11
Reactions
1
#13
Salut, je donne la réponse pour ceux qui cherchent : il faut décoder le rawdatamessage a l'aide du fichier signature.as pour en sortir un fichier swf et récupérer la hashfunction, sinon si vous voulez contourner ça absolument vous pouvez envoyer 8 bytes random a la place dans le
GameMapMovementRequestMessage. (Je déconseille fortement car c'est grillé par le serveur)
 
Inscrit
3 Mai 2020
Messages
31
Reactions
11
#14
Salut,

Merci Cedex pour ta réponse. J'en suis aussi à vouloir me déplacer avec mon bot MITM.

J'ai lu tout ce que je pouvais sur Cadernis concernant le RDM et la HASH_FUNCTION mais j'arrive pas à comprendre la finalité de la chose :

On doit ajouter le hash à nos paquets ou pas du tout ? Ou bien un fake hash ?

Merci pour vos réponses !
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
1 912
Reactions
39
#15
Je crois qu'on doit d'abord écrire le paquet en clair puis le paquet hashé.

Je ne pense pas qu'un fake hash soit une bonne idée, autant envoyer le paquet en clair.
Tu devrais te faire banne rapidos.
 
Inscrit
15 Mai 2020
Messages
11
Reactions
1
#16
Je ne suis pas encore arrivé a ce stade la mais d'après ce que j'ai compris tu dois rajouté a la suite du packet, les valeurs de ton packet hashé exemple avec le GameMapMovementRequestMessage tu dois hasher le nombre de keymovements, les keymovement et le mapid et le rajouter a la suite du packet
 
Haut Bas