JustNao / Karrelage

MITM pour Dofus 2.XX
17 stars 8 forks source link

Exception: Middle banner not found - KeyError: 'banner##pos##mainCtr##default' #8

Closed aazeazer71 closed 2 months ago

aazeazer71 commented 5 months ago

Hello,

j'ai un petit problème quand je veux lancer une chasse au trésor j'obtiens toujours le même problème :

ERROR:app:Exception on /load [POST] Traceback (most recent call last): File "C:\Users---\Desktop\Dofus Bot\src\modules\treasure_hunter.py", line 97, in setup_bot middle_banner = ui_positions["banner##pos##mainCtr##default"]


KeyError: 'banner##pos##mainCtr##default'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\---\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1463, in wsgi_app
    response = self.full_dispatch_request()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\---\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 872, in full_dispatch_request
    rv = self.handle_user_exception(e)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\---\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 870, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\---\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 855, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\---\Desktop\Dofus Bot\app.py", line 82, in load
    manager.set_current_module(module, class_name)
  File "C:\Users\---\Desktop\Dofus Bot\src\manager.py", line 22, in set_current_module
    self.current_module = module_class()
                          ^^^^^^^^^^^^^^
  File "C:\Users\---\Desktop\Dofus Bot\src\modules\treasure_hunter.py", line 45, in __init__
    self.setup_bot()
  File "C:\Users\---\Desktop\Dofus Bot\src\modules\treasure_hunter.py", line 99, in setup_bot
    raise Exception("Middle banner not found")
Exception: Middle banner not found
j'ai jeté un coup d'oeil au script "treasure_hunter.py" 

et à la ligne ui_positions = load_dat("Berilia_ui_positions")

j'ai : 

```
{
   "popup_41##pos##lbl_title##default":{
      "x":0,
      "y":0
   },
   "popup_30##pos##ctr_items##default":{
      "x":0,
      "y":0
   },
   "popup_10##pos##lbl_title##default":{
      "x":0,
      "y":0
   },
   "popup_10##pos##lbl_content##default":{
      "x":0,
      "y":0
   },
   "chat##size##mainCtr##fight":{
      "x":402,
      "y":115
   },
   "popup_10##pos##btn_main##default":{
      "x":0,
      "y":0
   },
   "popup_21##pos##lbl_content##default":{
      "x":0,
      "y":0
   },
   "storage##pos##equipmentUi##default":{
      "x":435,
      "y":32
   },
   "itemsList##pos##ctr_window##default":"None",
   "popup_10##pos##lbl_btn_secondary##default":{
      "x":0,
      "y":0
   },
   "popup_32##pos##btn_main##default":{
      "x":0,
      "y":0
   },
   "socialBase##pos##socialBaseWindow##default":{
      "x":-60,
      "y":108
   },
   "storage##pos##equipmentUi##fight":{
      "x":203,
      "y":47
   },
   "popup_4##pos##lbl_title##default":{
      "x":0,
      "y":0
   },
   "popup_15##pos##ctr_items##default":{
      "x":0,
      "y":0
   },
   "mountAncestors##pos##ctr_window##default":{
      "x":-304,
      "y":24
   },
   "popup_19##pos##btn_main##fight":{
      "x":0,
      "y":0
   },
   "partyDisplay##pos##ctr_main##default":{
      "x":1517.421219868517,
      "y":83
   },
   "guidebook##pos##mainCtr##default":{
      "x":1,
      "y":81
   },
   "popup_30##pos##btn_main##default":{
      "x":0,
      "y":0
   },
   "guildCard3611##pos##window1889##fight":{
      "x":212,
      "y":34
   },
   "popup_10##pos##ctr_items##default":{
      "x":0,
      "y":0
   },
   "smileys##pos##mainCtr##fight":{
      "x":754,
      "y":693
   },
   "treasureHunt##pos##ctr_hunt##default":{
      "x":529,
      "y":106
   },
   "popup_4##pos##lbl_btn_secondary##default":{
      "x":0,
      "y":0
   },
   "popup_15##pos##lbl_title##default":{
      "x":0,
      "y":0
   },
   "chat##pos##mainCtr##default":{
      "x":17,
      "y":887
   },
   "jobTab##pos##ctr_main##default":{
      "x":102,
      "y":222
   },
   "popup_19##pos##lbl_content##default":{
      "x":0,
      "y":0
   },
   **"banner##pos##mainCtr##fight":{
      "x":297,
      "y":909
   },**
   "popup_15##pos##btn_main##default":{
      "x":0,
      "y":0
   },
   "popup_41##pos##lbl_btn_secondary##default":{
      "x":0,
      "y":0
   },
   "questList##size##ctr_list##default":{
      "x":240,
      "y":505
   },
   "characterSheetUi##pos##charSheetWindow##fight":{
      "x":0,
      "y":50
   },
   "popup_40##pos##ctr_items##default":{
      "x":0,
      "y":0
   },
   "popup_41##pos##btn_main##default":{
      "x":0,
      "y":0
   },
   "cartographyUi##pos##ctr_locTreeAnomaly##default":{
      "x":-38.208156329651615,
      "y":139
   },
   "popup_21##pos##lbl_btn_secondary##default":{
      "x":0,
      "y":0
   },
   "popup_19##pos##lbl_btn_secondary##default":{
      "x":0,
      "y":0
   },
   "popup_40##pos##lbl_content##default":{
      "x":0,
      "y":0
   },
   "popup_30##pos##lbl_btn_secondary##default":{
      "x":0,
      "y":0
   },
   **"bannerMenu##pos##mainCtr##fight":{
      "x":1047,
      "y":909
   },**
   "popup_19##pos##ctr_items##default":{
      "x":0,
      "y":0
   },
   "questList##pos##ctr_main##default":{
      "x":-317.4,
      "y":282
   },
   "popup_32##pos##lbl_content##default":{
      "x":0,
      "y":0
   },
   "popup_19##pos##lbl_btn_secondary##fight":{
      "x":0,
      "y":0
   },
   "popup_30##pos##lbl_title##default":{
      "x":0,
      "y":0
   },
   "previewedAlterationsUi##pos##ctr_previewedAlterationsUi##fight":{
      "x":1302,
      "y":78
   },
   "evolutiveFeedUi##pos##ctr_feed##default":{
      "x":-37,
      "y":50
   },
   "externalActionBar_0##pos##mainCtr##default":{
      "x":28,
      "y":116
   },
   "questList##pos##ctr_list##default":{
      "x":0,
      "y":0
   },
   "popup_32##pos##ctr_items##default":{
      "x":0,
      "y":0
   },
   "popup_21##pos##lbl_title##default":{
      "x":0,
      "y":0
   },
   "chat##size##mainCtr##default":{
      "x":385,
      "y":115
   },
   **"bannerMap##pos##mainCtr##default":{
      "x":1090,
      "y":887
   },**
   "popup_40##pos##lbl_title##default":{
      "x":0,
      "y":0
   },
   "popup_32##pos##lbl_title##default":{
      "x":0,
      "y":0
   },
   "externalActionBar_3##pos##mainCtr##default":{
      "x":0,
      "y":0
   },
   **"bannerMenu##pos##mainCtr##default":{
      "x":987,
      "y":909
   },**
   "externalActionBar_1##pos##mainCtr##default":{
      "x":0,
      "y":0
   },
   **"bannerMenu##size##mainCtr##fight":{
      "x":127,
      "y":115
   },**
   "popup_4##pos##lbl_content##default":{
      "x":0,
      "y":0
   },
   "popup_19##pos##ctr_items##fight":{
      "x":0,
      "y":0
   },
   "popup_21##pos##ctr_items##default":{
      "x":0,
      "y":0
   },
   "popup_21##pos##btn_main##default":{
      "x":0,
      "y":0
   },
   "characterBuildsUi##pos##wnd_builds##default":{
      "x":56,
      "y":216
   },
   "popup_40##pos##btn_main##default":{
      "x":0,
      "y":0
   },
   "previewedAlterationsUi##pos##ctr_previewedAlterationsUi##default":{
      "x":1460,
      "y":0
   },
   "timeline##pos##timelineCtr##fight":{
      "x":740.5712198685171,
      "y":759
   },
   "popup_40##pos##lbl_btn_secondary##default":{
      "x":0,
      "y":0
   },
   "popup_19##pos##btn_main##default":{
      "x":0,
      "y":0
   },
   "chat##pos##mainCtr##fight":{
      "x":-230.7,
      "y":882
   },
   "popup_19##pos##lbl_content##fight":{
      "x":0,
      "y":0
   },
   "popup_15##pos##lbl_content##default":{
      "x":0,
      "y":0
   },
   "zaapiSelection##pos##window293##default":{
      "x":34,
      "y":-16
   },
   "challengeDisplay##pos##mainCtr##fight":{
      "x":-317.4287801314829,
      "y":94
   },
   "popup_19##pos##lbl_title##fight":{
      "x":0,
      "y":0
   },
   "popup_41##pos##ctr_items##default":{
      "x":0,
      "y":0
   },
   "questBase##pos##mainCtr##fight":{
      "x":-129,
      "y":164
   },
   "popup_19##pos##lbl_title##default":{
      "x":0,
      "y":0
   },
   "popup_15##pos##lbl_btn_secondary##default":{
      "x":0,
      "y":0
   },
   "popup_41##pos##lbl_content##default":{
      "x":0,
      "y":0
   },
   "popup_4##pos##btn_main##default":{
      "x":0,
      "y":0
   },
   "itemsSet##pos##ctr_window##default":{
      "x":-281,
      "y":8
   },
   "questListMinimized##pos##mainCtr##default":{
      "x":-317.4287801314829,
      "y":197
   },
   "popup_4##pos##ctr_items##default":{
      "x":0,
      "y":0
   },
   "externalActionBar_2##pos##mainCtr##default":{
      "x":0,
      "y":0
   },
   "partyDisplay##pos##ctr_main##fight":{
      "x":1350.5712198685171,
      "y":88
   },
   "popup_32##pos##lbl_btn_secondary##default":{
      "x":0,
      "y":0
   },
   "popup_30##pos##lbl_content##default":{
      "x":0,
      "y":0
   }
}
```
et donc c'était pour savoir si vous saviez quelle valeur dois-je utiliser ? je vais faire mes recherches de mon coté aussi mais c'est parce qu'il exste plusieurs type de banner ou bannerMenu et je ne sais pas à quoi chaque chose correspond dans le Berilia_ui_positions

Merci d'avance pour votre aide!
aazeazer71 commented 5 months ago

Désolé! Ca ne marche pas que si l'appli se lance aprés la chasse au trésor mb

Par contre, étant donné que j'ai eu le temps de jeter un oeil au script depuis, j'ai une petite question :

comment faire pour check si un packet est sniffé et porte un nom spécifique? par rapport à ton code bien entendu!

merci d'avance encore désolé pour le premier message

JustNao commented 5 months ago

Salut, merci d'avoir trouvé le bug ! C'est quand même bizarre, le lancement de la chasse avant ou après Karrelage n'est pas censé affecter le fonctionnement. Il y'a peut être eu des changements au niveau leur sauvegarde de positions, je regarderai ça. Tu avais déjà lancé une chasse aux trésors sur ton client ?

Sinon pour gérer les packets, ça se fait par le nom de function. Toutes les classes qui héritent de DofusModule peuvent gérer les packets par leur nom en possédant une fonction du nom handle_NAME (tu peux voir la fonction qui redirige ici). Par exemple, Treasure Hunter gère le packet "CurrentMapMessage" par la fonction handle_CurrentMapMessage.

aazeazer71 commented 5 months ago

yes je vois merci beaucoup! j'ai réussi à créer 2 fonctions comme ça! Dernière question :

est-ce que tu pourrais m'expliquer ton code sur cette partie :

    def click_next_step(self):
        hunt_panel_position = load_dat("Berilia_ui_positions")[
            "treasureHunt##pos##ctr_hunt##default"
        ]
        panel_x, panel_y = (
            hunt_panel_position["x"] + DOFUS_X_OFFSET,
            hunt_panel_position["y"],
        )
        if self.current_step >= 0:
            y_offset = self.current_step * 42  # Offset for each step
            click_x, click_y = (  # Click on the next flag icon
                panel_x * DOFUS_SCALING + 433,
                panel_y * DOFUS_SCALING + 170 + y_offset,
            )
            click_position = on_screen_position((click_x, click_y))
            ag.moveTo(click_position, duration=0.2)
            ag.click()
        elif self.current_step == -1:
            click_x, click_y = (  # Click on the "next step" button
                panel_x * DOFUS_SCALING + 412,
                panel_y * DOFUS_SCALING + 170 + self.current_total_steps * 42,
            )
            click_position = on_screen_position((click_x, click_y))
            ag.moveTo(click_position, duration=0.2)
            ag.click()

et ça :

DOFUS_X_OFFSET = 270.2
DOFUS_SCALING = 1.404

Par exemple : mon panel de la chasse au trésor est en (0,788) en valeur absolue (récupéré via pyinput mouse) et ton script me renvoie : panel_x : -42.19999999999999 et panel_y : 568 donc 220 en différentiel de X et 42.2 en Y mais je comprends pas le DOFUS_SCALING...

Merci d'avance pour ton aide parce que j'arrive pas à mettre une valeur fixe (à la place de 412/433 et 170 ça décale progressivement à chaque valeur donc j'imagine que c'est la valeur de scaling que je dois changer, mais comment la trouver?

JustNao commented 5 months ago

Aïe, c'était une tentative d'adaptation aux différentes résolutions. En gros le fichier Berilia_ui_positions.dat est là où sont sauvegardées les positions de ton interface (le point en haut à gauche de chaque élément). De ce que j'ai pu tester, Ankama utilise un système cartésien qui ne correspond pas 1:1 à nos écrans. Le point tout en haut à gauche, qui correspond à (0, 0) via pyinput, correspond à (270.2, 0) dans la base de Dofus, et c'est de là que provient le DOFUS_X_OFFSET. De plus, bouger un élément de 100 pixels sur notre écran ne va pas sauvegarder un shift de 100 dans le .dat, mais un shift de 100 / 1.404 ~= 71.22, d'où le DOFUS_SCALING=1.404. Je pensais que ce système de scaling permettait de gérer les différentes résolutions d'écrans, mais du coup j'étais à côté de la plaque. Il doit y avoir une formule quelque part pour gérer tout ça, avec en plus la taille de la fenêtre du client. Probablement quelque part dans le DofusInvoker.swf, je devrais chercher un de ces quatre.

treasureHunt##pos##ctr_hunt##default correspond à la position du panel de chasse au trésor.

Ernaw commented 4 months ago

Salut, j'ai essayé d'enlever "l'adaptation des résolutions" mais sans succès. Il faut malgré tout ajouter un offset ou un scaling quoi qu'il en soit. Connais-tu cette valeur ?

JustNao commented 4 months ago

Non pas de progrès de mon côté, ça fait quelque temps que j'ai pas touché à cette partie. Si quelqu'un trouve la fonction de conversion entre positions internes de Dofus et positions sur écran utilisateur, je suis preneur