1.29 Mapdata - Détection partielle des soleils

Inscrit
22 Février 2020
Messages
26
Reactions
18
#1
Ola les confinés,

Je cale depuis une bonne grosse semaine sur un résultat étrange de mon déchiffrage des mapdata.
Jusqu'ici j'ai bien avancé sur mon bot, il sait farmer, gère les combats et déplacements... le tout via une association sniffing des paquets & injection via l'api win32 de clicks/keys qui lui permet de fonctionner en arrière plan.

Cependant, en parcourant les maps de dofus, je me rends compte que la détection des soleils est très inconstante: tantôt ils sont tous détectés, tantôt qu'un seul voire aucun !!

Voici un exemple de la map [-8,-22]:
data déchiffrée de chaque cell_id où se trouve un soleil
HhGaeqgaaa -> cell_id 21
Hhqaeqgaaa -> cell_id 218 >Seul soleil détecté!<
HhGaeaaaaa -> cell_id 230
HhGaeqgaaa -> cell_id 456

La fonction qui permet d'extraire l'id du soleil ou d'une ressource est la suivante, traduit du code vb.net de M4xou et implémentée en python:

Python:
    def uncompress_cell(self, cell_d):
        """
        Compute and return the item or sun id regarding the given cell data
        
        """
        j = 0
        cd = []
        ZKARRAY = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
        while j < len(cell_d):
            cd.append(ZKARRAY.index(cell_d[j])) #hashcode
            j += 1
        layerObject2Num = ((cd[0]&2)<<12) + ((cd[7]&1)<<12) + (cd[8]<<6) + cd[9]
        map_changer = ((cd[2]&56) >> 3)

        if map_changer == 2:
            return 'sun'
        else:
            return layerObject2Num
On voit donc grâce à la ligne 13 du code, que la 3e lettre du data de la cellule doit être systématiquement 'q', pour être converti en 16 bitshifté en la valeur 2. La lettre 'G' donne 32 bitshifté en valeur 4...
De là, qu'une seule déduction possible : l'erreur provient lors du déchiffrage de mapdata. Mais quelle erreur pourrait être silencieuse au point de ne tronquer que partiellement la 3e lettre et laisser tout le reste intact ? ça me semble hallucinant, pas une seule ressource ne manque à la détection, que ce soit minerais bois ou même du blé. J'ai déjà vérifié en redécompilant quelques maps depuis le dossier du jeu et le mapdata est identique à celui produit par mon script de décompilation/extraction au format txt.

Quelqu'un aurait-il fait face au même soucis ou aurait une piste de réflexion a me soumettre ?

Merci d'avance,

Des bisous.
 
Inscrit
8 Septembre 2017
Messages
36
Reactions
8
#2
Oui c'est du au layer je crois ;) Il peut être en layer 1 ou 2 j'avais eu le même soucis
 
Inscrit
22 Février 2020
Messages
26
Reactions
18
#3
Salut, merci pour ta réponse, ça expliquerait tout ! En fouillant dans le code source de Dofus, j'ai trouvé ce fameux layerObject1 (dont je ne connaissais même pas l'existence...) mais je n'arrive pas à retrouver la source du mapHandler donc je ne sais pas quelle opération faire pour récupérer ce layer1 ... T'aurais pas l'algo de cette opération (peu importe le langage) pour que je puisse l'implémenter dans mon code ? A vrai dire je ne m'étais basé que sur le mapHandler de M4xoubot pour le déchiffrage du mapdata/détection des soleils.
J'ai énormément de mal à naviguer dans les sources api.gfx de Dofus, c'est bagdad là dedans :'(
Mille merci en tout cas
 
Inscrit
22 Février 2020
Messages
26
Reactions
18
#4
Bingo, trouvé ! Merci mec, tu gères la fougère.
Pour les perdus comme je l'ai été qui passeraient par là:

Python:
    def uncompress_cell(self, cell_d):
        """
        Used to build a dictionnary containing cell_ids with their sun or resources locations
        Resources are stored in layerObject2Num
        """
        j = 0
        cd = []
        ZKARRAY = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
        while j < len(cell_d):
            cd.append(ZKARRAY.index(cell_d[j])) #hashcode
            j += 1
        layerObject1Num = ((cd[0] & 4) << 11) + ((cd[4] & 1) << 12) + (cd[5] << 6) + cd[6]
        layerObject2Num = ((cd[0]&2)<<12) + ((cd[7]&1)<<12) + (cd[8]<<6) + cd[9]
        movement = ((cd[2]&56) >> 3)

        if movement == 2 or layerObject1Num == 1030:
            return 'sun'
        else:
            return layerObject2Num
Maintenant ça marche nickel, mes p'tits soleils d'amour sont tous là :inlove:
Décidément il est bizarrement codé ce jeu... mais c'est tout de même excitant !

Bon confinement à tous
 
Inscrit
24 Février 2017
Messages
9
Reactions
9
#5
Attention, 1030 n'est pas le seul trigger possible, voir les constants du loader
static var MAP_TRIGGER_LAYEROBJECTS = [1030,1029,4088];
 
Inscrit
8 Septembre 2017
Messages
36
Reactions
8
#6
Cool ! Moi je trouve au contraire, si on regarde l'époque ou a été codé le client Dofus que c'est un petit bijou quand on voit le retard qu'avait flash sur la version 2 et ce qu'on écrit entièrement ankama (le système de queue, listener, etc). Quand j'ai dev mon ému de 0 y'a 1 an et demie j'ai passé beaucoup de temps à regarder la conception du client 2.0 et même 1.29 pour m'inspirer et apprendre pour la structure de mon émulateur
 
Haut Bas