feat: per-NPC body/pose thresholds (Malah 0.35/200); skip pickit while mobs alive

User-tuned detection thresholds and a safety guard against teleporting
into live packs during loot phases.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
alex
2026-06-10 17:58:31 +02:00
parent c92b7730ee
commit d9a6e7ce40
2 changed files with 14 additions and 3 deletions

View File

@@ -184,6 +184,11 @@ class PickIt:
:param char: The character used to pick up the item
TODO :return: return a list of the items that were picked up
"""
# Safety: skip pickup if mobs are still alive — prevents teleporting into
# enemy packs during trash clearing (CS/ROF) which tanks HP to chicken levels.
from target_detect import get_visible_targets
if get_visible_targets():
return False
# Re-detect window position to mitigate 1282x720 vs 1280x720 template drift
from screen import find_and_set_window_position
find_and_set_window_position(force=True)

View File

@@ -63,7 +63,9 @@ def _build_npcs():
},
"template_group": ["MALAH_FRONT", "MALAH_BACK", "MALAH_45", "MALAH_SIDE", "MALAH_SIDE_2"],
"roi": [383, 193, (762-383), (550-193)],
"poses": [[445, 485], [526, 473], [602, 381], [623, 368], [641, 323], [605, 300], [622, 272], [638, 284], [677, 308], [710, 288]]
"poses": [[445, 485], [526, 473], [602, 381], [623, 368], [641, 323], [605, 300], [622, 272], [638, 284], [677, 308], [710, 288]],
"body_threshold": 0.35,
"pose_tolerance": 200,
},
Npc.LARZUK: {
"name_tag_white": color_filter(template_finder.get_template("LARZUK_NAME_TAG_WHITE"), Config().colors["white"])[1],
@@ -382,8 +384,12 @@ def open_npc_menu(npc_key: Npc) -> bool:
else:
in_npc_roi = True
name_tag_confirmed = (res_w.valid or res_g.valid) and in_npc_roi
body_confident = result["score"] >= 0.40
pose_confirmed = "poses" in npcs[npc_key] and result["min_dist"] < 150
# Per-NPC thresholds for body confidence and pose distance.
# Malah's templates are weaker (0.36-0.41) so she needs lower thresholds.
npc_body_threshold = npcs[npc_key].get("body_threshold", 0.40)
npc_pose_tolerance = npcs[npc_key].get("pose_tolerance", 150)
body_confident = result["score"] >= npc_body_threshold
pose_confirmed = "poses" in npcs[npc_key] and result["min_dist"] < npc_pose_tolerance
if name_tag_confirmed:
Logger.info(f"Clicking on {npc_key} at {mouse.get_position()} (name tag confirmed)")