From b2afbaab93b785d291934a554dc255efef243afd Mon Sep 17 00:00:00 2001 From: Randi Date: Fri, 13 Mar 2026 22:21:47 -0400 Subject: [PATCH] Minor tweaks to pickup --- src/char/i_char.py | 36 ++++++++++++++++++--------------- src/char/sorceress/sorceress.py | 4 ++-- src/item/pickit.py | 3 ++- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/char/i_char.py b/src/char/i_char.py index 14497cf..36bd9c3 100644 --- a/src/char/i_char.py +++ b/src/char/i_char.py @@ -89,8 +89,8 @@ class IChar: def on_capabilities_discovered(self, capabilities: CharacterCapabilities): pass - def pick_up_item(self, pos: tuple[float, float], item_name: str = None, distance: int = 0, tele: bool = True): - if tele and self.capabilities.can_teleport_natively and (distance >= Config().ui_pos["item_dist"]) and item_name != "Chest": + def pick_up_item(self, pos: tuple[float, float], item_name: str = None, distance: int = 0, force_run: bool = False): + if not force_run and self.capabilities.can_teleport_natively and (distance >= Config().ui_pos["item_dist"]) and item_name != "Chest": self.pre_move() self.move(pos, force_tp=True) self._stationary = True #We teleported so we should be guaranteed stationary now @@ -102,21 +102,25 @@ class IChar: time.sleep(0.1) mouse.click(button="left") - #When character moves, it typically doesn't move less than 30 - if distance < 30: - distance = 30 + #Current logic only sets force_run if we previously teled. + #Therefore, we only need to perform run delay if force_run is not set + if not force_run: + #When character moves, it typically doesn't move less than 30 + if distance < 30: + distance = 30 + + #By default we ignore pickup distance and do a full delay in case we misclick + pickup_distance = 0 + + #If we are stationary, we can account for pickup distance to potentially allow instant pickups + if self._stationary: + pickup_distance = 110 #we can instant pickup items 110 units away + + if distance > pickup_distance: + run_time = 0.003125 * (distance-pickup_distance) #estimated run speed of (2sec/640pixels) = 0.003125 + wait(run_time, run_time) #wait until we move to item and pick it up - #By default we ignore pickup distance and do a full delay in case we misclick - pickup_distance = 0 - - #If we are stationary, we can account for pickup distance to potentially allow instant pickups - if self._stationary: - pickup_distance = 110 #we can instant pickup items 110 units away - self._stationary = False #Moving so we don't guarantee stationary state (delay is accurate not exorbitant) - - if distance > pickup_distance: - run_time = 0.003125 * (distance-pickup_distance) #estimated run speed of (2sec/640pixels) = 0.003125 - wait(run_time, run_time) #wait until we move to item and pick it up + self._stationary = False #Moving so we don't guarantee stationary state (delay is accurate not exorbitant) return True def select_by_template( diff --git a/src/char/sorceress/sorceress.py b/src/char/sorceress/sorceress.py index 1822f70..a21da7c 100644 --- a/src/char/sorceress/sorceress.py +++ b/src/char/sorceress/sorceress.py @@ -25,7 +25,7 @@ class Sorceress(IChar): self._action_frame = 4 self._action_duration = self._action_frame * 0.04 - def pick_up_item(self, pos: tuple[float, float], item_name: str = None, distance: int = 0, tele: bool = True): + def pick_up_item(self, pos: tuple[float, float], item_name: str = None, distance: int = 0, force_run: bool = False): if self._skill_hotkeys["telekinesis"] and any(x in item_name for x in ['Potion', 'GOLD', 'Scroll of', 'Chest']): keyboard.send(self._skill_hotkeys["telekinesis"]) mouse.move(pos[0], pos[1]) @@ -35,7 +35,7 @@ class Sorceress(IChar): self._stationary = True #We used telekinesis so we should be guaranteed stationary now return True else: - return super().pick_up_item(pos, item_name, distance, tele) + return super().pick_up_item(pos, item_name, distance, force_run) def select_by_template( self, diff --git a/src/item/pickit.py b/src/item/pickit.py index 4bf6b82..0e10047 100644 --- a/src/item/pickit.py +++ b/src/item/pickit.py @@ -94,7 +94,7 @@ class PickIt: if item.Name == i.Name: tele_success = True Logger.info(f"Teled to pickup item {i.Name} and now at distance {i.Distance}") - char.pick_up_item((i.CenterMonitor['x'], i.CenterMonitor['y']), item_name=i.Name, distance=i.Distance, tele=False) + char.pick_up_item((i.CenterMonitor['x'], i.CenterMonitor['y']), item_name=i.Name, distance=i.Distance, force_run=True) break if not tele_success: Logger.warning(f"Failed to scan item {i.Name} after tele.") @@ -139,6 +139,7 @@ class PickIt: self._reset_state() keyboard.send(Config().char["show_items"]) wait(0.16, 0.16) #wait 4 frames for items to refresh + char._stationary = True #Character should start out stationary when pickup starts pickit_phase_start = time.time() items, img = self._locate_items()