From 40e4dd8a4f981e6981aec8edef28e756f2fba885 Mon Sep 17 00:00:00 2001 From: alexpolo1 Date: Fri, 12 Jun 2026 09:13:52 +0200 Subject: [PATCH] Skill hotkeys select the RIGHT slot - fix cast flow, prove auto-binding live Live finding (fresh game, 2026-06-12): D2R skill hotkeys select onto the RIGHT skill slot, not the left as the old comments assumed. The left slot permanently holds Blessed Hammer. Consequence: _cast_hammers pressing the hammer hotkey after activating an aura was REPLACING the aura on the right slot every cast cycle - the true root cause of fights running without Concentration. _cast_hammers no longer touches the hammer hotkey: select aura (lands on right, stays active), hold stand-still, spam left-click. Verified live: full Diablo kill at 09:04, ~55s from last seal to kill. Auto skill binding proven end-to-end (tools/set_binds_from_params.py): blessed_hammer/concentration/redemption/vigor/holy_shield/teleport all bound via the in-game picker and visually verified (6/7 OK; conviction correctly reported missing - not skilled on this char). - capture tool + preflight verify now watch the RIGHT slot - fresh skill slot templates + clean PICKER_* cell templates captured at current settings (blessed_hammer, concentration, redemption, vigor, holy_shield, teleport) - removed bogus conviction.png (had captured vigor's icon) Co-Authored-By: Claude Fable 5 --- assets/templates/ui/skills/blessed_hammer.png | Bin 0 -> 3459 bytes assets/templates/ui/skills/concentration.png | Bin 0 -> 3891 bytes assets/templates/ui/skills/holy_shield.png | Bin 0 -> 3813 bytes .../ui/skills/picker_blessed_hammer.png | Bin 0 -> 3946 bytes .../ui/skills/picker_concentration.png | Bin 0 -> 4121 bytes .../templates/ui/skills/picker_redemption.png | Bin 0 -> 4040 bytes assets/templates/ui/skills/picker_vigor.png | Bin 0 -> 4088 bytes assets/templates/ui/skills/redemption.png | Bin 0 -> 3821 bytes assets/templates/ui/skills/teleport.png | Bin 0 -> 3504 bytes assets/templates/ui/skills/vigor.png | Bin 2598 -> 3770 bytes src/char/paladin/hammerdin.py | 24 ++++++------------ src/utils/skill_preflight.py | 18 ++++++++----- tools/capture_skill_hotkeys.py | 7 +++-- 13 files changed, 24 insertions(+), 25 deletions(-) create mode 100644 assets/templates/ui/skills/blessed_hammer.png create mode 100644 assets/templates/ui/skills/concentration.png create mode 100644 assets/templates/ui/skills/holy_shield.png create mode 100644 assets/templates/ui/skills/picker_blessed_hammer.png create mode 100644 assets/templates/ui/skills/picker_concentration.png create mode 100644 assets/templates/ui/skills/picker_redemption.png create mode 100644 assets/templates/ui/skills/picker_vigor.png create mode 100644 assets/templates/ui/skills/redemption.png create mode 100644 assets/templates/ui/skills/teleport.png diff --git a/assets/templates/ui/skills/blessed_hammer.png b/assets/templates/ui/skills/blessed_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..2023602b6b05ccf0862c08646312730f5b25b597 GIT binary patch literal 3459 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 literal 0 HcmV?d00001 diff --git a/assets/templates/ui/skills/concentration.png b/assets/templates/ui/skills/concentration.png new file mode 100644 index 0000000000000000000000000000000000000000..0d53a1392d85e3db71e157b9a47846b3357b2496 GIT binary patch literal 3891 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 bV-5ZfP)OuSiwmYl00000NkvXXu0mjflNDvI literal 0 HcmV?d00001 diff --git a/assets/templates/ui/skills/picker_blessed_hammer.png b/assets/templates/ui/skills/picker_blessed_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..88a9e65d2c2f52a0b17a50912224fda892b97037 GIT binary patch literal 3946 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 Eg4mp->;M1& literal 0 HcmV?d00001 diff --git a/assets/templates/ui/skills/picker_concentration.png b/assets/templates/ui/skills/picker_concentration.png new file mode 100644 index 0000000000000000000000000000000000000000..e50e6f231beb82bb7b2564d26a72703c7b6d56c7 GIT binary patch literal 4121 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 X1_7kdFNE3b00000NkvXXu0mjfifj;J literal 0 HcmV?d00001 diff --git a/assets/templates/ui/skills/picker_redemption.png b/assets/templates/ui/skills/picker_redemption.png new file mode 100644 index 0000000000000000000000000000000000000000..e405ecc3649c5299f086cc03cc46f547ad101cd3 GIT binary patch literal 4040 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
h(wr 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 literal 0 HcmV?d00001 diff --git a/assets/templates/ui/skills/teleport.png b/assets/templates/ui/skills/teleport.png new file mode 100644 index 0000000000000000000000000000000000000000..738a85ceeab5cd421cd4c16a7dfcc9940a4ca24b GIT binary patch literal 3504 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 literal 2598 zcmV+>3fc9EP)MH0000T?Nklu7l*-I63Ac<+t|Zc*ajp(2M7>{ZLp2) z@i^J>CgYjeP3B5cN$sX8ld9ye`tE~k{{*_KtGoK;(+^!O>J3y7vZ-mbmDA}wN5ob} zt3^)OAkgJd&>OC%&#y*w8WFKeX|gHk@~Y|bR?_9IpxL4zVo}m$l+o!Zr_Wb&I(Vhz z6WU#Bx&!CA5UildqM+GYMw>%M#3HA~ETi31bvk&5OHF66l1`_RM!ke~tDJ~MM%Y|N zlTpe=w~{uS@^tVfqm*u!l89A7*es{jETz#br`aT<*Q-W*UQC-=dOCQ!MNY(8#s!~> zuu)2zSw_UBqSLNm?uw3;&-(e-pYx}Kx7y0+a;WIADd==6>2@fwYs3U}MT9g({O1#h)gnrME#%jp{6^&-(cOt4F*(oa3vP_xSp4 zf`9y&JsmuxmvF^%jtdSs`tnaX+MDIoliO@>jPqiDmKS?7ym~T!I{0OOH9ht+I$V{+ z+jUHiN64neILzPVFh9k_NDFOY^XcGM-4!f$>u~GkeEY@ceEr1(_HsAbNl&nwy~&5S z3I6ikI{*Glp1ss4x2G@CX_NDEX9{<{f*xl%5u1WLJ!Y1#nz(k+%T6ZF$K3!pAzk|5OJ#!UGi4bX0K%7s*Raw8++Lp>&wIJW}+PJ&G7ZB`(!@v<8HK- znP?k{d)IL3WF!`@G1FX2r=tSn`67P)CWYIg##39wz$Gs&fqE9^FSC=2vyqDOC^3ZB zQN!IqA5D%*+FWWxmpoOhUbAAV67%;zrg`<`Hm?uocwU$xy)r^}b(qwnA(rmBuRF|H?UioW2 zoA2TK_m5eAFu+KYhGx5(prwL^*&bdW-y^#bBcHp;pT0@4{CJo`ev0)}l&X~L zdvgr8Y6)AFh+1qa;vMy9%YRLJd5D8tjOTmPoE*;ba(|j9JJalK#rgR|l7Ie`NhbQqtlS{GIzo13h^2)q{Qhl% zWa2tQO?5QtCD^LZ610}Hnz+u`>F{ zt3}iv)Ut7}htYu$FZXY8T$pArH_6L`8D8w);+LOt?50LpxY@S$;Iklie8#Thn~=ZV7F*gzkWbCW{hL zS5V7vj{}3ch{@q5@~IJC6sE|pe|$8XsZqAmQL?E~cGKhZ^?118swAir7`hT5ndm2M zE~83uhHu|5bMoviZ(rQ!&CxyHoh8O}N}YWW#X z4rbX+kF%8;<7j7^qupszOGEt6k2wtGXE@rQCBGh}kc+dmK91X{#H^L`e1DE?a-4&$ zDUJ)X9Bxgso0%lP9^*g0c)$-IQuO$12A4;6 zU_TqBkolPJj_**&PI7PNBFP8+q*q2Mq$k*TJcv_YN-j0ZZf1hrbc~&iCd8FG!~oOLc7iSqjyeeeladCDilDg+k-uIbP%jYF3k38ME_&2Bs?YNFXrA4TF`nk* z9OPmg(yGu>TD92}#<2RP#*Owyl*NJJa7x3u?yjlT=rkEPlS<;UO$)`prq{m4=9%45= z&f!*^^zsb~nHbyazE< zwRD~4pq`Nq6CtAlyQY|cK}t|B;L#NG|F;!3%V@RAXf#U^`HZD_>jmt!B{($2SgVV1 z))o^qNb%JP*fe5HH6=Lpa;hs!sH!NUD^QDCb(Zb5F&Z4_=?T>0wpHUYC_ZMrj0TGw zk5-J|C?lj76EX<+bz(whDUGgkG+7mhoV8+_Z7MwV0&cCC2E9PgtR!Sn;;1RcXDG#` zS74|vAz)GB*UPbJCA9l$@tV)!&@1q2r9@m+G+8R}80EP2rMNW31PlT}vlO?s1dmQk zv$Kpw+sC5|8U;l5+G0W$6@G(+kU_w!DJD=a#!*v@M^l1RQ-ZBdf~iJ~Lnp&&P~f#x zV$;d6)Jd_`Nj~;k3D!CRw@yMpFC}P{5im#y8YBb^62e9??G6>KHYF}?2}2;TO0@D{(P@$Jf1($-?(ymXv;Y7A07*qo IM6N<$g6@GC$^ZZW diff --git a/src/char/paladin/hammerdin.py b/src/char/paladin/hammerdin.py index b289203..05ba3f5 100644 --- a/src/char/paladin/hammerdin.py +++ b/src/char/paladin/hammerdin.py @@ -35,31 +35,23 @@ class Hammerdin(Paladin): else: aura = None - # D2R: hotkey always puts skill on LEFT click. - # Right-clicking with it selected moves it to RIGHT + activates. - # Sequence: press aura (left) -> right-click (moves to right, activates) - # press hammer (left) -> left-click spam. - # Skip re-selection when the slot already holds the wanted skill - # (tracked in _active_skill; pre_move/_weapon_switch invalidate it) — - # consecutive casts then just hold the aura and spam left-click. + # D2R (verified live 2026-06-12): skill hotkeys select onto the RIGHT + # slot. The LEFT slot permanently holds Blessed Hammer (set once in the + # left-button menu) — pressing the hammer hotkey here would put the + # hammer on the RIGHT slot and REPLACE the just-activated aura, which is + # exactly why fights used to run without Concentration. So: select the + # aura (lands on right, activates), then pure left-click spam. if aura and self._active_skill["right"] != aura: - keyboard.send(self._skill_hotkeys[aura]) # aura goes to left-click + keyboard.send(self._skill_hotkeys[aura]) # aura -> right slot wait(0.15, 0.2) - mouse.click(button="right") # moves aura to right-click + activates it + mouse.click(button="right") # ensure the aura is the active right skill self._set_active_skill("right", aura) - self._set_active_skill("left", "") wait(0.15, 0.2) # Hold stand_still so we don't walk while attacking keyboard.send(Config().char["stand_still"], do_release=False) wait(0.05, 0.1) - # Set Blessed Hammer on LEFT click - if self._skill_hotkeys["blessed_hammer"] and self._active_skill["left"] != "blessed_hammer": - keyboard.send(self._skill_hotkeys["blessed_hammer"]) - self._set_active_skill("left", "blessed_hammer") - wait(0.05, 0.1) - # Spam left-clicks to cast hammers (aura stays active on right-click) start = time.time() while (time.time() - start) < time_in_s: diff --git a/src/utils/skill_preflight.py b/src/utils/skill_preflight.py index 57e6281..6165c95 100644 --- a/src/utils/skill_preflight.py +++ b/src/utils/skill_preflight.py @@ -60,20 +60,24 @@ def get_build_skill_checks(config_instance: Config, char_type: str | None = None checks = [] if char_type == "hammerdin": - char_cfg = config_instance.char + build_cfg = getattr(config_instance, "hammerdin", {}) # blessed hammer lives on left-click; auras/teleport go to right + # hotkeys select onto the RIGHT slot; left holds the hammer permanently checks.append(SkillCheck(char_type, "blessed_hammer", - _configured_hotkey(char_cfg, "blessed_hammer"), - "BLESSED_HAMMER", "left", True)) + _configured_hotkey(build_cfg, "blessed_hammer"), + "BLESSED_HAMMER", "right", True)) checks.append(SkillCheck(char_type, "concentration", - _configured_hotkey(char_cfg, "concentration"), + _configured_hotkey(build_cfg, "concentration"), "CONCENTRATION", "right", True)) for skill, template in [("redemption", "REDEMPTION"), ("vigor", "VIGOR"), - ("conviction", "CONVICTION"), ("holy_shield", "HOLY_SHIELD"), - ("teleport", "TELE_ACTIVE")]: - hotkey = _configured_hotkey(char_cfg, skill) + ("conviction", "CONVICTION"), ("holy_shield", "HOLY_SHIELD")]: + hotkey = _configured_hotkey(build_cfg, skill) if hotkey: checks.append(SkillCheck(char_type, skill, hotkey, template, "right", False)) + # teleport key sits in [char] + tp_key = _configured_hotkey(config_instance.char, "teleport") + if tp_key: + checks.append(SkillCheck(char_type, "teleport", tp_key, "TELE_ACTIVE", "right", False)) return checks if char_type != "blizz_sorc": diff --git a/tools/capture_skill_hotkeys.py b/tools/capture_skill_hotkeys.py index 29b369a..88715ae 100644 --- a/tools/capture_skill_hotkeys.py +++ b/tools/capture_skill_hotkeys.py @@ -48,12 +48,15 @@ def main(): start_detecting_window() wait(0.5) - roi = Config().ui_roi["skill_left"] + # hotkeys select onto the RIGHT slot (verified live 2026-06-12) + roi = Config().ui_roi["skill_right"] results = [] prev_icon = None try: + build_cfg = getattr(Config(), Config().char.get("type", ""), {}) for skill in SKILLS: - hotkey = Config().char.get(skill) + # build skills live in the [hammerdin]-style section; teleport in [char] + hotkey = build_cfg.get(skill) or Config().char.get(skill) if not hotkey: results.append((skill, "-", "no hotkey configured")) continue