From bbda12709f477d2887dd006f5e9732cb61ff749d Mon Sep 17 00:00:00 2001 From: aeon0 Date: Mon, 6 Dec 2021 18:15:58 +0100 Subject: [PATCH] Connect all towns (#220) --- README.md | 1 + assets/templates/a3_stash.png | Bin 0 -> 9703 bytes assets/templates/a3_wp.png | Bin 0 -> 40104 bytes assets/templates/a4_wp.png | Bin 0 -> 44614 bytes game.ini | 1 + params.ini | 1 + src/bot.py | 181 +++++++++++++++------------------- src/char/hammerdin.py | 10 +- src/char/i_char.py | 7 +- src/char/sorceress.py | 6 +- src/config.py | 1 + src/death_manager.py | 5 +- src/health_manager.py | 4 +- src/pather.py | 81 +++++++++------ src/town/__init__.py | 5 + src/town/a3.py | 52 ++++++++++ src/town/a4.py | 41 ++++++++ src/town/a5.py | 67 +++++++++++++ src/town/i_act.py | 24 +++++ src/town/town_manager.py | 149 ++++++++++++++++++++++++++++ src/ui_manager.py | 42 ++++---- 21 files changed, 511 insertions(+), 167 deletions(-) create mode 100644 assets/templates/a3_stash.png create mode 100644 assets/templates/a3_wp.png create mode 100644 assets/templates/a4_wp.png create mode 100644 src/town/__init__.py create mode 100644 src/town/a3.py create mode 100644 src/town/a4.py create mode 100644 src/town/a5.py create mode 100644 src/town/i_act.py create mode 100644 src/town/town_manager.py diff --git a/README.md b/README.md index fa6a127..916ca8f 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,7 @@ run_shenk=0 | show_items | Hotkey for "show | | inventory_screen | Hotkey to open up | | stand_still | Hotkey for "stand still". Note this can not be the default shift key as it would interfere with the merc healing routine. | +| force_move | Hotkey for "force move" | | tp | Hotkey for using a town | | belt_rows | Integer value of how many rows the char's belt has | | show_belt | Hotkey for "show | diff --git a/assets/templates/a3_stash.png b/assets/templates/a3_stash.png new file mode 100644 index 0000000000000000000000000000000000000000..17dcfd5981152ee590ddaefdc9f909682662bcf9 GIT binary patch literal 9703 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 literal 0 HcmV?d00001 diff --git a/assets/templates/a3_wp.png b/assets/templates/a3_wp.png new file mode 100644 index 0000000000000000000000000000000000000000..7233b753581740d30023720dc74d27fb332abc8e GIT binary patch literal 40104 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 literal 0 HcmV?d00001 diff --git a/assets/templates/a4_wp.png b/assets/templates/a4_wp.png new file mode 100644 index 0000000000000000000000000000000000000000..f68a4634fa96cc3c503e11abbdb4582042c03af1 GIT binary patch literal 44614 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 z≫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 SqVwSZ0000 4 and self._ui_manager.should_stash(self._config.char["num_loot_columns"])): - self._no_stash_counter = 0 - Logger.info("Stashing picked up items.") - if not self._pather.traverse_nodes(self._curr_location, Location.A5_STASH, self._char): - self.trigger_or_stop("end_game") - return - self._curr_location = Location.A5_STASH - time.sleep(0.3) - stash_is_open_func = lambda: self._template_finder.search("INVENTORY_GOLD_BTN", self._screen.grab(), roi=self._config.ui_roi["gold_btn"]).valid - if self._char.select_by_template("A5_STASH", stash_is_open_func): - self._ui_manager.stash_all_items(self._config.char["num_loot_columns"], self._item_finder) - self._picked_up_items = False - time.sleep(1.2) # otherwise next grab of screen will still have inventory - else: - Logger.warning("Could not find stash, continue...") - - if self._tps_left < 3 or (self._config.char["tp"] and not self._ui_manager.has_tps()): - Logger.info("Repairing and buying TPs at Larzuk.") - if not self._pather.traverse_nodes(self._curr_location, Location.A5_LARZUK, self._char): - self.trigger_or_stop("end_game") - return - self._curr_location = Location.A5_LARZUK - self._npc_manager.open_npc_menu(Npc.LARZUK) - self._npc_manager.press_npc_btn(Npc.LARZUK, "trade_repair") - if self._ui_manager.repair_and_fill_up_tp(): - wait(0.1, 0.2) - self._ui_manager.close_vendor_screen() - self._tps_left = 20 wait(0.5) - + self._belt_manager.update_pot_needs() + # Do some healing TODO: If tp is up we always go back into the portal... could use force move here? + img = self._screen.grab() + hp = HealthManager.get_health(self._config, img) + mp = HealthManager.get_mana(self._config, img) + if hp < 0.6 or mp < 0.2: + Logger.info("Healing at next possible Vendor") + self._curr_loc = self._town_manager.heal(self._curr_loc) + if not self._curr_loc: + return self.trigger_or_stop("end_game") + # Stash stuff, either when item was picked up or after 4 runs without stashing (so unwanted loot will not cause inventory full) + self._no_stash_counter += 1 + force_stash = self._no_stash_counter > 4 and self._ui_manager.should_stash(self._config.char["num_loot_columns"]) + if self._picked_up_items or force_stash: + self._no_stash_counter = 0 + Logger.info("Stashing items") + self._curr_loc = self._town_manager.stash(self._curr_loc) + if not self._curr_loc: + return self.trigger_or_stop("end_game") + wait(1.0) + # Check if we are out of tps + if self._tps_left < 3 or (self._config.char["tp"] and not self._ui_manager.has_tps()): + Logger.info("Repairing and buying TPs at next Vendor") + self._curr_loc = self._town_manager.repair_and_fill_tps(self._curr_loc) + if not self._curr_loc: + return self.trigger_or_stop("end_game") + wait(1.0) # Check if merc needs to be revived merc_alive = self._template_finder.search("MERC", self._screen.grab(), threshold=0.9, roi=[0, 0, 200, 200]).valid if not merc_alive and self._config.char["use_merc"]: - Logger.info("Reviving merc.") - if not self._pather.traverse_nodes(self._curr_location, Location.A5_QUAL_KEHK, self._char): - self.trigger_or_stop("end_game") - return - self._curr_location = Location.A5_QUAL_KEHK - if self._npc_manager.open_npc_menu(Npc.QUAL_KEHK): - self._npc_manager.press_npc_btn(Npc.QUAL_KEHK, "resurrect") - time.sleep(1.2) - + Logger.info("Resurrect merc") + self._curr_loc = self._town_manager.resurrect(self._curr_loc) + if not self._curr_loc: + return self.trigger_or_stop("end_game") # Start a new run started_run = False for key in self._do_runs: @@ -230,12 +202,15 @@ class Bot: def on_run_pindle(self): def do_it() -> bool: Logger.info("Run Pindle") - if not self._pather.traverse_nodes(self._curr_location, Location.A5_NIHLATHAK_PORTAL, self._char): return False - self._curr_location = Location.A5_NIHLATHAK_PORTAL - wait(0.3, 0.4) # otherwise will often missclick because still moving + self._curr_loc = self._town_manager.go_to_act(5, self._curr_loc) + if not self._curr_loc: + return False + if not self._pather.traverse_nodes(self._curr_loc, Location.A5_NIHLATHAK_PORTAL, self._char): return False + self._curr_loc = Location.A5_NIHLATHAK_PORTAL + wait(0.4) found_loading_screen_func = lambda: self._ui_manager.wait_for_loading_screen(2.0) if not self._char.select_by_template(["A5_RED_PORTAL", "A5_RED_PORTAL_TEXT"], found_loading_screen_func): return False - self._curr_location = Location.PINDLE_START + self._curr_loc = Location.A5_PINDLE_START if not self._template_finder.search_and_wait(["PINDLE_0", "PINDLE_1"], threshold=0.65, time_out=20).valid: return False if not self._pre_buffed: self._char.pre_buff() @@ -243,9 +218,10 @@ class Bot: if self._config.char["static_path_pindle"]: self._pather.traverse_nodes_fixed("pindle_save_dist", self._char) else: - if not self._pather.traverse_nodes(Location.PINDLE_START, Location.PINDLE_SAVE_DIST, self._char): return False + if not self._pather.traverse_nodes(Location.A5_PINDLE_START, Location.A5_PINDLE_SAVE_DIST, self._char): return False self._char.kill_pindle() self._picked_up_items = self._pickit.pick_up_items(self._char) + self._curr_loc = Location.A5_PINDLE_END return True self._do_runs["run_pindle"] = False @@ -258,14 +234,11 @@ class Bot: def on_run_shenk(self): def do_it(): Logger.info("Run Eldritch") - if not self._pather.traverse_nodes(self._curr_location, Location.A5_WP, self._char): return False - self._curr_location = Location.A5_WP - wait(0.5, 0.7) # otherwise will missclick because still moving - found_wp_func = lambda: self._template_finder.search("WAYPOINT_MENU", self._screen.grab()).valid - if not self._char.select_by_template("A5_WP", found_wp_func): return False - self._ui_manager.use_wp(4, 1) + self._curr_loc = self._town_manager.open_wp(self._curr_loc) + wait(0.4) + self._ui_manager.use_wp(5, 1) # eldritch - self._curr_location = Location.ELDRITCH_START + self._curr_loc = Location.A5_ELDRITCH_START if not self._template_finder.search_and_wait(["ELDRITCH_0", "ELDRITCH_START"], threshold=0.65, time_out=20).valid: return False if not self._pre_buffed: self._char.pre_buff() @@ -273,17 +246,19 @@ class Bot: if self._config.char["static_path_eldritch"]: self._pather.traverse_nodes_fixed("eldritch_save_dist", self._char) else: - if not self._pather.traverse_nodes(Location.ELDRITCH_START, Location.ELDRITCH_SAVE_DIST, self._char): return False + if not self._pather.traverse_nodes(Location.A5_ELDRITCH_START, Location.A5_ELDRITCH_SAVE_DIST, self._char): return False self._char.kill_eldritch() + self._curr_loc = Location.A5_ELDRITCH_END self._picked_up_items = self._pickit.pick_up_items(self._char) # shenk if self._route_config["run_shenk"]: Logger.info("Run Shenk") - self._curr_location = Location.SHENK_START - if not self._pather.traverse_nodes(Location.SHENK_START, Location.SHENK_SAVE_DIST, self._char): return False + self._curr_loc = Location.A5_SHENK_START + if not self._pather.traverse_nodes(Location.A5_SHENK_START, Location.A5_SHENK_SAVE_DIST, self._char): return False self._char.kill_shenk() - wait(1.9, 2.4) # sometimes merc needs some time to kill shenk... + wait(1.9, 2.4) # sometimes merc needs some more time to kill shenk... self._picked_up_items |= self._pickit.pick_up_items(self._char) + self._curr_loc = Location.A5_SHENK_END return True self._do_runs["run_shenk"] = False @@ -310,10 +285,8 @@ class Bot: success = self._char.tp_town() if success: self._tps_left -= 1 - success = self._template_finder.search_and_wait(["A5_TOWN_1", "A5_TOWN_0"], time_out=10).valid - if success: - self._tp_is_up = True - self._curr_location = Location.A5_TOWN_START + self._curr_loc = self._town_manager.wait_for_tp(self._curr_loc) + if self._curr_loc: self.trigger_or_stop("maintenance") else: self.trigger_or_stop("end_game") @@ -329,6 +302,6 @@ if __name__ == "__main__": config = Config() screen = Screen(config.general["monitor"]) bot = Bot(screen) - bot.state = "a5_town" - bot._curr_location = Location.A5_TOWN_START + bot.state = "town" + bot._curr_loc = Location.A5_TOWN_START bot.on_maintenance() diff --git a/src/char/hammerdin.py b/src/char/hammerdin.py index 3c5308a..6723694 100644 --- a/src/char/hammerdin.py +++ b/src/char/hammerdin.py @@ -65,10 +65,10 @@ class Hammerdin(IChar): if not self._do_pre_move: keyboard.send(self._skill_hotkeys["concentration"]) wait(0.05, 0.15) - self._pather.traverse_nodes(Location.PINDLE_SAVE_DIST, Location.PINDLE_END, self, time_out=1.0, do_pre_move=self._do_pre_move) + self._pather.traverse_nodes(Location.A5_PINDLE_SAVE_DIST, Location.A5_PINDLE_END, self, time_out=1.0, do_pre_move=self._do_pre_move) self._cast_hammers(1) # pindle sometimes knocks back, get back in - self._pather.traverse_nodes(Location.PINDLE_SAVE_DIST, Location.PINDLE_END, self, time_out=0.1) + self._pather.traverse_nodes(Location.A5_PINDLE_SAVE_DIST, Location.A5_PINDLE_END, self, time_out=0.1) self._cast_hammers(max(1, self._char_config["atk_len_pindle"] - 1)) wait(0.1, 0.15) self._do_redemption() @@ -81,7 +81,7 @@ class Hammerdin(IChar): if not self._do_pre_move: keyboard.send(self._skill_hotkeys["concentration"]) wait(0.05, 0.15) - self._pather.traverse_nodes(Location.ELDRITCH_SAVE_DIST, Location.ELDRITCH_END, self, time_out=1.0, do_pre_move=self._do_pre_move) + self._pather.traverse_nodes(Location.A5_ELDRITCH_SAVE_DIST, Location.A5_ELDRITCH_END, self, time_out=1.0, do_pre_move=self._do_pre_move) wait(0.05, 0.1) self._cast_hammers(self._char_config["atk_len_eldritch"]) wait(0.05, 0.15) @@ -92,7 +92,7 @@ class Hammerdin(IChar): if not self._do_pre_move: keyboard.send(self._skill_hotkeys["concentration"]) wait(0.05, 0.15) - self._pather.traverse_nodes(Location.SHENK_SAVE_DIST, Location.SHENK_END, self, time_out=1.0, do_pre_move=self._do_pre_move) + self._pather.traverse_nodes(Location.A5_SHENK_SAVE_DIST, Location.A5_SHENK_END, self, time_out=1.0, do_pre_move=self._do_pre_move) wait(0.05, 0.1) self._cast_hammers(self._char_config["atk_len_shenk"]) wait(0.05, 0.15) @@ -124,5 +124,5 @@ if __name__ == "__main__": ui_manager = UiManager(screen, t_finder) char = Hammerdin(config.hammerdin, config.char, screen, t_finder, ui_manager, pather) char.pre_buff() - pather.traverse_nodes(Location.ELDRITCH_START, Location.ELDRITCH_SAVE_DIST, char) + pather.traverse_nodes(Location.A5_ELDRITCH_START, Location.A5_ELDRITCH_SAVE_DIST, char) char.kill_eldritch() diff --git a/src/char/i_char.py b/src/char/i_char.py index 0ae24a0..277abca 100644 --- a/src/char/i_char.py +++ b/src/char/i_char.py @@ -72,7 +72,7 @@ class IChar: keyboard.send(self._skill_hotkeys["teleport"]) wait(0.15, 0.25) - def move(self, pos_monitor: Tuple[float, float], force_tp: bool = False): + def move(self, pos_monitor: Tuple[float, float], force_tp: bool = False, force_move: bool = False): factor = self._config.advanced_options["pathing_delay_factor"] if self._skill_hotkeys["teleport"] and (force_tp or self._ui_manager.is_right_skill_active()): mouse.move(pos_monitor[0], pos_monitor[1], randomize=3, delay_factor=[factor*0.1, factor*0.14]) @@ -91,7 +91,10 @@ class IChar: x, y = self._screen.convert_abs_to_monitor(pos_abs) mouse.move(x, y, randomize=5, delay_factor=[factor*0.1, factor*0.14]) wait(0.012, 0.02) - mouse.click(button="left") + if force_move: + keyboard.send(self._config.char["force_move"]) + else: + mouse.click(button="left") def tp_town(self): if not self._ui_manager.has_tps(): diff --git a/src/char/sorceress.py b/src/char/sorceress.py index b5c0a7d..211fe81 100644 --- a/src/char/sorceress.py +++ b/src/char/sorceress.py @@ -96,7 +96,7 @@ class Sorceress(IChar): if self._config.char["static_path_pindle"]: self._pather.traverse_nodes_fixed("pindle_end", self) else: - self._pather.traverse_nodes(Location.PINDLE_SAVE_DIST, Location.PINDLE_END, self, force_tp=True) + self._pather.traverse_nodes(Location.A5_PINDLE_SAVE_DIST, Location.A5_PINDLE_END, self, force_tp=True) return True return False @@ -117,7 +117,7 @@ class Sorceress(IChar): if self._config.char["static_path_eldritch"]: self._pather.traverse_nodes_fixed("eldritch_end", self) else: - self._pather.traverse_nodes(Location.ELDRITCH_SAVE_DIST, Location.ELDRITCH_END, self, time_out=0.6, force_tp=True) + self._pather.traverse_nodes(Location.A5_ELDRITCH_SAVE_DIST, Location.A5_ELDRITCH_END, self, time_out=0.6, force_tp=True) return True return False @@ -135,7 +135,7 @@ class Sorceress(IChar): self._left_attack(cast_pos_abs, delay, 90) wait(self._cast_duration, self._cast_duration + 0.2) # Move to items - self._pather.traverse_nodes(Location.SHENK_SAVE_DIST, Location.SHENK_END, self, time_out=1.4, force_tp=True) + self._pather.traverse_nodes(Location.A5_SHENK_SAVE_DIST, Location.A5_SHENK_END, self, time_out=1.4, force_tp=True) return True return False diff --git a/src/config.py b/src/config.py index f185f0f..80bc174 100644 --- a/src/config.py +++ b/src/config.py @@ -51,6 +51,7 @@ class Config: "show_items": self._select_val("char", "show_items"), "inventory_screen": self._select_val("char", "inventory_screen"), "stand_still": self._select_val("char", "stand_still"), + "force_move": self._select_val("char", "force_move"), "num_loot_columns": int(self._select_val("char", "num_loot_columns")), "take_health_potion": float(self._select_val("char", "take_health_potion")), "take_mana_potion": float(self._select_val("char", "take_mana_potion")), diff --git a/src/death_manager.py b/src/death_manager.py index 79e0580..d0fcebd 100644 --- a/src/death_manager.py +++ b/src/death_manager.py @@ -84,6 +84,5 @@ if __name__ == "__main__": keyboard.wait("f11") config = Config() screen = Screen(config.general["monitor"]) - template_finder = TemplateFinder(screen) - manager = DeathManager(screen, template_finder) - manager.start_monitor(None) + manager = DeathManager(screen) + manager.pick_up_corpse(config, screen) diff --git a/src/health_manager.py b/src/health_manager.py index 9ba3707..6b18b7f 100644 --- a/src/health_manager.py +++ b/src/health_manager.py @@ -44,8 +44,8 @@ class HealthManager: self._pausing = True def update_location(self, loc: Location): - if loc is not None: - bosses = ["shenk", "eldritch", "pindle"] + if loc is not None and type(loc) == str: + bosses = ["shenk", "eldritch", "pindle", "trav"] self._pausing = not any(substring in loc for substring in bosses) @staticmethod diff --git a/src/pather.py b/src/pather.py index 559cdb2..7c81f78 100644 --- a/src/pather.py +++ b/src/pather.py @@ -20,23 +20,24 @@ class Location: A5_TOWN_START = "a5_town_start" A5_STASH = "a5_stash" A5_WP = "a5_wp" - A5_QUAL_KEHK = "qual_kehk" - A5_MALAH = "malah" - A5_NIHLATHAK_PORTAL = "nihlathak_portal" - A5_LARZUK = "larzuk" + A5_QUAL_KEHK = "a5_qual_kehk" + A5_MALAH = "a5_malah" + A5_NIHLATHAK_PORTAL = "a5_nihlathak_portal" + A5_LARZUK = "a5_larzuk" # Pindle - PINDLE_START = "pindle_start" - PINDLE_SAVE_DIST = "pindle_save_dist" - PINDLE_END = "pindle_end" + A5_PINDLE_START = "a5_pindle_start" + A5_PINDLE_SAVE_DIST = "a5_pindle_save_dist" + A5_PINDLE_END = "a5_pindle_end" # Eldritch - ELDRITCH_START = "eldritch_start" - ELDRITCH_SAVE_DIST = "eldritch_save_dist" - ELDRITCH_END = "eldritch_end" + A5_ELDRITCH_START = "a5_eldritch_start" + A5_ELDRITCH_SAVE_DIST = "a5_eldritch_save_dist" + A5_ELDRITCH_END = "a5_eldritch_end" # Shenk - SHENK_START = "shenk_start" - SHENK_SAVE_DIST = "shenk_save_dist" - SHENK_END = "shenk_end" + A5_SHENK_START = "a5_shenk_start" + A5_SHENK_SAVE_DIST = "a5_shenk_save_dist" + A5_SHENK_END = "a5_shenk_end" # A4 Town + A4_TOWN_START = "a4_town_start" A4_WP = "a4_town_wp" A4_TYRAEL_STASH = "a4_tyrael_stash" A4_VENDOR = "a4_vendor" @@ -44,11 +45,11 @@ class Location: A3_TOWN_START = "a3_town_start" A3_ORMUS = "a3_ormus" A3_STASH_WP = "a3_stash_wp" - A3_ASHEARA = "ar_asheara" + A3_ASHEARA = "a3_asheara" # Trav - TRAV_START = "trav_start" - TRAV_SAVE_DIST = "trav_save_dist" - TRAV_END = "trav_end" + A3_TRAV_START = "a3_trav_start" + A3_TRAV_SAVE_DIST = "a3_trav_save_dist" + A3_TRAV_END = "a3_trav_end" class Pather: """ @@ -145,32 +146,37 @@ class Pather: (Location.A5_STASH, Location.A5_QUAL_KEHK): [5, 6, 10, 11, 12], (Location.A5_STASH, Location.A5_LARZUK): [13, 14], (Location.A5_STASH, Location.A5_WP): [], + (Location.A5_WP, Location.A5_STASH): [], + (Location.A5_WP, Location.A5_NIHLATHAK_PORTAL): [6, 8, 9], (Location.A5_QUAL_KEHK, Location.A5_NIHLATHAK_PORTAL): [12, 11, 10, 6, 8, 9], (Location.A5_QUAL_KEHK, Location.A5_WP): [12, 11, 10, 6], (Location.A5_LARZUK, Location.A5_QUAL_KEHK): [13, 14, 5, 6, 10, 11, 12], (Location.A5_LARZUK, Location.A5_NIHLATHAK_PORTAL): [14, 13, 5, 6, 8, 9], (Location.A5_LARZUK, Location.A5_WP): [14, 13, 5], # Pindle - (Location.PINDLE_START, Location.PINDLE_SAVE_DIST): [100, 101, 102, 103], - (Location.PINDLE_SAVE_DIST, Location.PINDLE_END): [104], + (Location.A5_PINDLE_START, Location.A5_PINDLE_SAVE_DIST): [100, 101, 102, 103], + (Location.A5_PINDLE_SAVE_DIST, Location.A5_PINDLE_END): [104], # Eldritch - (Location.ELDRITCH_START, Location.ELDRITCH_SAVE_DIST): [120, 121, 122], - (Location.ELDRITCH_SAVE_DIST, Location.ELDRITCH_END): [123], + (Location.A5_ELDRITCH_START, Location.A5_ELDRITCH_SAVE_DIST): [120, 121, 122], + (Location.A5_ELDRITCH_SAVE_DIST, Location.A5_ELDRITCH_END): [123], # Shenk - (Location.SHENK_START, Location.SHENK_SAVE_DIST): [140, 141, 142, 143, 144, 145, 146, 147, 148], - (Location.SHENK_SAVE_DIST, Location.SHENK_END): [149], + (Location.A5_SHENK_START, Location.A5_SHENK_SAVE_DIST): [140, 141, 142, 143, 144, 145, 146, 147, 148], + (Location.A5_SHENK_SAVE_DIST, Location.A5_SHENK_END): [149], # A4 Town (Location.A4_WP, Location.A4_TYRAEL_STASH): [160, 161], (Location.A4_TYRAEL_STASH, Location.A4_WP): [161, 160], + (Location.A4_TOWN_START, Location.A4_WP): [162], # A3 Town (Location.A3_TOWN_START, Location.A3_STASH_WP): [180, 181, 182, 183, 184, 185, 186, 187, 188], (Location.A3_TOWN_START, Location.A3_ORMUS): [180, 181, 182, 183, 184, 185], (Location.A3_ORMUS, Location.A3_STASH_WP): [186, 187, 188], (Location.A3_ORMUS, Location.A3_ASHEARA): [189, 190, 191, 192], (Location.A3_ASHEARA, Location.A3_STASH_WP): [191, 190, 189, 185, 186, 187, 188], + (Location.A3_STASH_WP, Location.A3_STASH_WP): [188], + (Location.A3_STASH_WP, Location.A3_ORMUS): [187, 186, 185], # Trav - (Location.TRAV_START, Location.TRAV_SAVE_DIST): [220, 221, 222, 223, 224, 225, 226, 227], - (Location.TRAV_SAVE_DIST, Location.TRAV_END): [228], + (Location.A3_TRAV_START, Location.A3_TRAV_SAVE_DIST): [220, 221, 222, 223, 224, 225, 226, 227], + (Location.A3_TRAV_SAVE_DIST, Location.A3_TRAV_END): [228], } def _get_node(self, key: int, template: str): @@ -234,17 +240,32 @@ class Pather: return node_pos_abs return None - def traverse_nodes(self, start_location: Location, end_location: Location, char: IChar, time_out: float = 7, force_tp: bool = False, do_pre_move: bool = True) -> bool: + def traverse_nodes( + self, + start_location: Location, + end_location: Location, + char: IChar,# + time_out: float = 7, + force_tp: bool = False, + do_pre_move: bool = True, + force_move: bool = False) -> bool: """ Traverse from one location to another :param start_location: Location the char is starting at :param end_location: Location the char is supposed to end up :param char: Char that is traversing the nodes :param time_out: Timeout in second. If no more move was found in that time it will cancel traverse + :param force_move: Bool value if force move should be used for pathing :return: Bool if traversed succesfull or False if it got stuck """ Logger.debug(f"Traverse from {start_location} to {end_location}") - path = self._paths[(start_location, end_location)] + try: + path = self._paths[(start_location, end_location)] + except KeyError: + if start_location == end_location: + return True + Logger.error(f"Don't know how to traverse from {start_location} to {end_location}") + return False if do_pre_move: char.pre_move() for i, node_idx in enumerate(path): @@ -276,7 +297,7 @@ class Pather: else: # Move the char x_m, y_m = self._screen.convert_abs_to_monitor(node_pos_abs) - char.move((x_m, y_m), force_tp=force_tp) + char.move((x_m, y_m), force_tp=force_tp, force_move=force_move) last_move = time.time() return True @@ -331,6 +352,6 @@ if __name__ == "__main__": ui_manager = UiManager(screen, t_finder) char = Hammerdin(config.hammerdin, config.char, screen, t_finder, ui_manager, pather) # pather.traverse_nodes_fixed("pindle_save_dist", char) - pather.traverse_nodes(Location.TRAV_START, Location.TRAV_SAVE_DIST, char) - pather.traverse_nodes(Location.TRAV_SAVE_DIST, Location.TRAV_END, char) + # pather.traverse_nodes(Location.A3_TRAV_START, Location.A3_TRAV_SAVE_DIST, char) + pather.traverse_nodes(Location.A3_STASH_WP, Location.A3_STASH_WP, char) # display_all_nodes(pather, filter="TRAV") diff --git a/src/town/__init__.py b/src/town/__init__.py new file mode 100644 index 0000000..d38c745 --- /dev/null +++ b/src/town/__init__.py @@ -0,0 +1,5 @@ +from .a3 import A3 +from .a4 import A4 +from .a5 import A5 +from .i_act import IAct +from .town_manager import TownManager diff --git a/src/town/a3.py b/src/town/a3.py new file mode 100644 index 0000000..3d40739 --- /dev/null +++ b/src/town/a3.py @@ -0,0 +1,52 @@ +from char.i_char import IChar +from town.i_act import IAct +from screen import Screen +from config import Config +from npc_manager import NpcManager, Npc +from pather import Pather, Location +from typing import Union +from template_finder import TemplateFinder +from utils.misc import wait +from utils.custom_mouse import mouse + + +class A3(IAct): + def __init__(self, screen: Screen, template_finder: TemplateFinder, pather: Pather, char: IChar, npc_manager: NpcManager): + self._config = Config() + self._screen = screen + self._pather = pather + self._char = char + self._npc_manager = npc_manager + self._template_finder = template_finder + + def get_wp_location(self) -> Location: return Location.A3_STASH_WP + def can_heal(self) -> bool: return True + def can_stash(self) -> bool: return True + + def heal(self, curr_loc: Location) -> Union[Location, bool]: + if not self._pather.traverse_nodes(curr_loc, Location.A3_ORMUS, self._char): return False + self._npc_manager.open_npc_menu(Npc.ORMUS) + return Location.A3_ORMUS + + def open_stash(self, curr_loc: Location) -> Union[Location, bool]: + if not self._pather.traverse_nodes(curr_loc, Location.A3_STASH_WP, self._char): return False + wait(0.3) + def stash_is_open_func(): + found = self._template_finder.search("INVENTORY_GOLD_BTN", self._screen.grab(), roi=self._config.ui_roi["gold_btn"]).valid + found |= self._template_finder.search("INVENTORY_GOLD_BTN", self._screen.grab(), roi=self._config.ui_roi["gold_btn_stash"]).valid + return found + if not self._char.select_by_template("A3_STASH", stash_is_open_func): return False + return Location.A3_STASH_WP + + def open_wp(self, curr_loc: Location) -> bool: + if not self._pather.traverse_nodes(curr_loc, Location.A3_STASH_WP, self._char): return False + wait(0.5, 0.7) + found_wp_func = lambda: self._template_finder.search("WAYPOINT_MENU", self._screen.grab()).valid + return self._char.select_by_template("A3_WP", found_wp_func) + + def wait_for_tp(self) -> Union[Location, bool]: + template_match = self._template_finder.search_and_wait("A3_TOWN_10", time_out=20) + if template_match.valid: + self._pather.traverse_nodes(Location.A3_STASH_WP, Location.A3_STASH_WP, self._char, force_move=True) + return Location.A3_STASH_WP + return False diff --git a/src/town/a4.py b/src/town/a4.py new file mode 100644 index 0000000..1eb0b62 --- /dev/null +++ b/src/town/a4.py @@ -0,0 +1,41 @@ +from char.i_char import IChar +from town.i_act import IAct +from screen import Screen +from config import Config +from npc_manager import NpcManager, Npc +from pather import Pather, Location +from typing import Union +from template_finder import TemplateFinder +from utils.misc import wait + + +class A4(IAct): + def __init__(self, screen: Screen, template_finder: TemplateFinder, pather: Pather, char: IChar, npc_manager: NpcManager): + self._config = Config() + self._screen = screen + self._pather = pather + self._char = char + self._npc_manager = npc_manager + self._template_finder = template_finder + + def get_wp_location(self) -> Location: return Location.A4_WP + def can_resurrect(self) -> bool: return True + + def resurrect(self, curr_loc: Location) -> Union[Location, bool]: + if not self._pather.traverse_nodes(curr_loc, Location.A4_TYRAEL_STASH, self._char): return False + if self._npc_manager.open_npc_menu(Npc.TYRAEL): + self._npc_manager.press_npc_btn(Npc.TYRAEL, "resurrect") + return Location.A4_TYRAEL_STASH + return False + + def open_wp(self, curr_loc: Location) -> bool: + if not self._pather.traverse_nodes(curr_loc, Location.A4_WP, self._char): return False + wait(0.5, 0.7) + found_wp_func = lambda: self._template_finder.search("WAYPOINT_MENU", self._screen.grab()).valid + return self._char.select_by_template("A4_WP", found_wp_func) + + def wait_for_tp(self) -> Union[Location, bool]: + success = self._template_finder.search_and_wait(["A4_TOWN_4", "A4_TOWN_5", "A4_TOWN_6"], time_out=20).valid + if success: + return Location.A4_TOWN_START + return False \ No newline at end of file diff --git a/src/town/a5.py b/src/town/a5.py new file mode 100644 index 0000000..f3bbc2f --- /dev/null +++ b/src/town/a5.py @@ -0,0 +1,67 @@ +from char.i_char import IChar +from town.i_act import IAct +from screen import Screen +from config import Config +from npc_manager import NpcManager, Npc +from pather import Pather, Location +from typing import Union +from template_finder import TemplateFinder +from utils.misc import wait + + +class A5(IAct): + def __init__(self, screen: Screen, template_finder: TemplateFinder, pather: Pather, char: IChar, npc_manager: NpcManager): + self._config = Config() + self._screen = screen + self._pather = pather + self._char = char + self._npc_manager = npc_manager + self._template_finder = template_finder + + def get_wp_location(self) -> Location: return Location.A5_WP + + def can_heal(self) -> bool: return True + def can_resurrect(self) -> bool: return True + def can_stash(self) -> bool: return True + def can_trade_and_repair(self) -> bool: return True + + def heal(self, curr_loc: Location) -> Union[Location, bool]: + if not self._pather.traverse_nodes(curr_loc, Location.A5_MALAH, self._char, force_move=True): return False + self._npc_manager.open_npc_menu(Npc.MALAH) + if not self._pather.traverse_nodes(Location.A5_MALAH, Location.A5_TOWN_START, self._char, force_move=True): return False + return Location.A5_TOWN_START + + def resurrect(self, curr_loc: Location) -> Union[Location, bool]: + if not self._pather.traverse_nodes(curr_loc, Location.A5_QUAL_KEHK, self._char): return False + if self._npc_manager.open_npc_menu(Npc.QUAL_KEHK): + self._npc_manager.press_npc_btn(Npc.QUAL_KEHK, "resurrect") + return Location.A5_QUAL_KEHK + return False + + def open_stash(self, curr_loc: Location) -> Union[Location, bool]: + if not self._pather.traverse_nodes(curr_loc, Location.A5_STASH, self._char): return False + wait(0.3) + def stash_is_open_func(): + found = self._template_finder.search("INVENTORY_GOLD_BTN", self._screen.grab(), roi=self._config.ui_roi["gold_btn"]).valid + found |= self._template_finder.search("INVENTORY_GOLD_BTN", self._screen.grab(), roi=self._config.ui_roi["gold_btn_stash"]).valid + return found + if not self._char.select_by_template("A5_STASH", stash_is_open_func): return False + return Location.A5_STASH + + def open_trade_and_repair_menu(self, curr_loc: Location) -> Union[Location, bool]: + if not self._pather.traverse_nodes(curr_loc, Location.A5_LARZUK, self._char): return + self._npc_manager.open_npc_menu(Npc.LARZUK) + self._npc_manager.press_npc_btn(Npc.LARZUK, "trade_repair") + return Location.A5_LARZUK + + def open_wp(self, curr_loc: Location) -> bool: + if not self._pather.traverse_nodes(curr_loc, Location.A5_WP, self._char): return False + wait(0.5, 0.7) + found_wp_func = lambda: self._template_finder.search("WAYPOINT_MENU", self._screen.grab()).valid + return self._char.select_by_template("A5_WP", found_wp_func) + + def wait_for_tp(self) -> Union[Location, bool]: + success = self._template_finder.search_and_wait(["A5_TOWN_1", "A5_TOWN_0"], time_out=20).valid + if success: + return Location.A5_TOWN_START + return False diff --git a/src/town/i_act.py b/src/town/i_act.py new file mode 100644 index 0000000..80e32de --- /dev/null +++ b/src/town/i_act.py @@ -0,0 +1,24 @@ +from typing import Union +from pather import Location + +class IAct: + # Open waypoint menu + def open_wp(self, curr_loc: Location) -> bool: return False + # Get Location that is closest to waypoint to continue pathing from there + def get_wp_location(self) -> Location: pass + # Wait until we arrive in town after using town portal (by searching for templates close it) + def wait_for_tp(self) -> Union[Location, bool]: return False + + # Is healing implemented for this Town? + def can_heal(self) -> bool: return False + # Is merc resurrection implemented for this Town? + def can_resurrect(self) -> bool: return False + # Is stashing implemented in this Town? + def can_stash(self) -> bool: return False + # Is trade/repair implemented in this Town? + def can_trade_and_repair(self) -> bool: return False + # If any of the above functions return True for the Town, the respective method must be implemented + def heal(self, curr_loc: Location) -> Union[Location, bool]: return False + def resurrect(self, curr_loc: Location) -> Union[Location, bool]: return False + def open_stash(self, curr_loc: Location) -> Union[Location, bool]: return False + def open_trade_and_repair_menu(self, curr_loc: Location) -> Union[Location, bool]: return False diff --git a/src/town/town_manager.py b/src/town/town_manager.py new file mode 100644 index 0000000..c5201fd --- /dev/null +++ b/src/town/town_manager.py @@ -0,0 +1,149 @@ +from typing import Union +from item_finder import ItemFinder +from template_finder import TemplateFinder +from config import Config +from pather import Location +from logger import Logger +from ui_manager import UiManager +from town import IAct, A3, A4, A5 +from utils.misc import wait + + +class TownManager: + def __init__(self, template_finder: TemplateFinder, ui_manager: UiManager, a3: A3, a4: A4, a5: A5): + self._template_finder = template_finder + self._ui_manager = ui_manager + self._item_finder = ItemFinder() + self._config = Config() + self._acts: dict[Location, IAct] = { + Location.A3_TOWN_START: a3, + Location.A4_TOWN_START: a4, + Location.A5_TOWN_START: a5 + } + + @staticmethod + def get_act_from_location(loc: Location) -> Location: + location = None + if loc.upper().startswith("A5_"): + location = Location.A5_TOWN_START + elif loc.upper().startswith("A4_"): + location = Location.A4_TOWN_START + elif loc.upper().startswith("A3_"): + location = Location.A3_TOWN_START + return location + + def wait_for_town_spawn(self, time_out: float = None) -> Location: + """Wait for the char to spawn in town after starting a new game + :param time_out: Optional float value for time out in seconds, defaults to None + :return: Location of the town (e.g. Location.A4_TOWN_START) or None if nothing was found within time_out time + """ + template_match = self._template_finder.search_and_wait([ + "A5_TOWN_0", "A5_TOWN_1", + "A4_TOWN_0", "A4_TOWN_1", + "A3_TOWN_0", "A3_TOWN_1" + ], time_out=time_out) + if template_match.valid: + return TownManager.get_act_from_location(template_match.name) + return None + + def wait_for_tp(self, curr_loc: Location): + curr_act = TownManager.get_act_from_location(curr_loc) + if curr_act is None: return False + return self._acts[curr_act].wait_for_tp() + + def open_wp(self, curr_loc: Location): + curr_act = TownManager.get_act_from_location(curr_loc) + if curr_act is None: return False + return self._acts[curr_act].open_wp(curr_loc) + + def go_to_act(self, act_idx: int, curr_loc: Location) -> Union[Location, bool]: + curr_act = TownManager.get_act_from_location(curr_loc) + if curr_act is None: return False + # check if we already are in the desired act + if act_idx == 3: act = Location.A3_TOWN_START + elif act_idx == 4: act = Location.A4_TOWN_START + elif act_idx == 5: act = Location.A5_TOWN_START + else: + Logger.error(f"Act {act_idx} is not supported") + return False + if curr_act == act: + return curr_loc + # if not, move to the desired act via waypoint + if not self._acts[curr_act].open_wp(curr_loc): return False + self._ui_manager.use_wp(act_idx, 0) + return self._acts[act].get_wp_location() + + def heal(self, curr_loc: Location) -> Union[Location, bool]: + curr_act = TownManager.get_act_from_location(curr_loc) + if curr_act is None: return False + # check if we can heal in current act + if self._acts[curr_act].can_heal(): + return self._acts[curr_act].heal(curr_loc) + Logger.warning(f"Could not heal in {curr_act}. Continue without healing") + return curr_loc + + def resurrect(self, curr_loc: Location) -> Union[Location, bool]: + curr_act = TownManager.get_act_from_location(curr_loc) + if curr_act is None: return False + # check if we can resurrect in current act + if self._acts[curr_act].can_resurrect(): + return self._acts[curr_act].resurrect(curr_loc) + new_loc = self.go_to_act(4, curr_loc) + if not new_loc: return False + return self._acts[Location.A4_TOWN_START].resurrect(new_loc) + + def stash(self, curr_loc: Location) -> Union[Location, bool]: + curr_act = TownManager.get_act_from_location(curr_loc) + if curr_act is None: return False + # check if we can stash in current act + if self._acts[curr_act].can_stash(): + new_loc = self._acts[curr_act].open_stash(curr_loc) + if not new_loc: return False + self._ui_manager.stash_all_items(self._config.char["num_loot_columns"], self._item_finder) + return new_loc + new_loc = self.go_to_act(5, curr_loc) + if not new_loc: return False + new_loc = self._acts[Location.A5_TOWN_START].open_stash(new_loc) + if not new_loc: return False + self._ui_manager.stash_all_items(self._config.char["num_loot_columns"], self._item_finder) + return new_loc + + def repair_and_fill_tps(self, curr_loc: Location) -> Union[Location, bool]: + curr_act = TownManager.get_act_from_location(curr_loc) + if curr_act is None: return False + # check if we can rapair in current act + if self._acts[curr_act].can_trade_and_repair(): + new_loc = self._acts[curr_act].open_trade_and_repair_menu(curr_loc) + if not new_loc: return False + if self._ui_manager.repair_and_fill_up_tp(): + wait(0.1, 0.2) + self._ui_manager.close_vendor_screen() + return new_loc + # TODO: Got to Act 5 for repair and fill up tps + Logger.warning(f"Could not repair in {curr_act}. Continue without repairing") + return curr_loc + + +# Test: Move to desired location in d2r and run any town action you want to test from there +if __name__ == "__main__": + import keyboard + import os + keyboard.add_hotkey('f12', lambda: Logger.info('Force Exit (f12)') or os._exit(1)) + print("Move to d2r window and press f11") + keyboard.wait("f11") + from char.hammerdin import Hammerdin + from pather import Pather + from screen import Screen + from npc_manager import NpcManager + config = Config() + screen = Screen(config.general["monitor"]) + template_finder = TemplateFinder(screen) + npc_manager = NpcManager(screen, template_finder) + pather = Pather(screen, template_finder) + ui_manager = UiManager(screen, template_finder) + char = Hammerdin(config.hammerdin, config.char, screen, template_finder, ui_manager, pather) + a5 = A5(screen, template_finder, pather, char, npc_manager) + a4 = A4(screen, template_finder, pather, char, npc_manager) + a3 = A3(screen, template_finder, pather, char, npc_manager) + town_manager = TownManager(template_finder, ui_manager, a3, a4, a5) + print(town_manager.wait_for_tp(Location.A3_TRAV_END)) diff --git a/src/ui_manager.py b/src/ui_manager.py index d394c40..2306ae5 100644 --- a/src/ui_manager.py +++ b/src/ui_manager.py @@ -27,20 +27,25 @@ class UiManager(): def use_wp(self, act: int, idx: int): """ Use Waypoint. The menu must be opened when calling the function. - :param act: Index of the act from left. Note that it start at 0. e.g. Act5 -> act=4 - :param idx: Index of the waypoint from top. Note that it start at 0. + :param act: Index of the desired act starting at 1 [A1 = 1, A2 = 2, A3 = 3, ...] + :param idx: Index of the waypoint from top. Note that it start at 0! """ - # Note: We are currently only in act 5, thus no need to click here. - # pos_act_btn = (self._config.ui_pos["wp_act_i_btn_x"] + self._config.ui_pos["wp_act_btn_width"] * act, self._config.ui_pos["wp_act_i_btn_y"]) - # x, y = self._screen.convert_screen_to_monitor(pos_act_btn) - # mouse.move(x, y, randomize=8) - # mouse.click(button="left") - # wait(0.3, 0.4) + # TODO: Optimize by checking if wp already has desired act active + pos_act_btn = (self._config.ui_pos["wp_act_i_btn_x"] + self._config.ui_pos["wp_act_btn_width"] * (act - 1), self._config.ui_pos["wp_act_i_btn_y"]) + x, y = self._screen.convert_screen_to_monitor(pos_act_btn) + mouse.move(x, y, randomize=8) + mouse.click(button="left") + wait(0.3, 0.4) pos_wp_btn = (self._config.ui_pos["wp_first_btn_x"], self._config.ui_pos["wp_first_btn_y"] + self._config.ui_pos["wp_btn_height"] * idx) x, y = self._screen.convert_screen_to_monitor(pos_wp_btn) - mouse.move(x, y, randomize=[110, 20], delay_factor=[0.9, 1.4]) + mouse.move(x, y, randomize=[60, 9], delay_factor=[0.9, 1.4]) wait(0.4, 0.5) mouse.click(button="left") + # wait till loading screen is over + if self.wait_for_loading_screen(): + while 1: + if not self.wait_for_loading_screen(0.2): + return def is_right_skill_active(self) -> bool: """ @@ -80,19 +85,20 @@ class UiManager(): return True return False - def wait_for_loading_screen(self, time_out: float) -> bool: + def wait_for_loading_screen(self, time_out: float = None) -> bool: """ Waits until loading screen apears :param time_out: Maximum time to search for a loading screen :return: True if loading screen was found within the timeout. False otherwise """ start = time.time() - while time.time() - start < time_out: + while True: img = self._screen.grab() is_loading_black_roi = np.average(img[:700, 0:250]) < 3.5 if is_loading_black_roi: return True - return False + if time_out is not None and time.time() - start > time_out: + return False def save_and_exit(self, does_chicken: bool = False) -> bool: """ @@ -265,6 +271,10 @@ class UiManager(): # TODO: Do not stash portal scrolls and potions but throw them out of inventory on the ground! # then the pickit check for potions and belt free can also be removed Logger.debug("Searching for inventory gold btn...") + # Move cursor to center + x, y = self._screen.convert_abs_to_monitor((0, 0)) + mouse.move(x, y, randomize=[40, 200], delay_factor=[1.0, 1.5]) + # Wait till gold btn is found gold_btn = self._template_finder.search_and_wait("INVENTORY_GOLD_BTN", roi=self._config.ui_roi["gold_btn"], time_out=20) if not gold_btn.valid: Logger.error("Could not determine to be in stash menu. Continue...") @@ -318,9 +328,7 @@ class UiManager(): time.sleep(0.3) curr_pos = mouse.get_position() # move mouse away from inventory, for some reason it was sometimes included in the grabed img - top_left_slot = (self._config.ui_pos["inventory_top_left_slot_x"], self._config.ui_pos["inventory_top_left_slot_y"]) - move_to = (top_left_slot[0] - 300, top_left_slot[1] - 200) - x, y = self._screen.convert_screen_to_monitor(move_to) + x, y = self._screen.convert_abs_to_monitor((0, 0)) mouse.move(x, y, randomize=[40, 200], delay_factor=[1.0, 1.5]) item_check_img = self._screen.grab() mouse.move(*curr_pos, randomize=2) @@ -341,9 +349,7 @@ class UiManager(): Logger.debug("Check if stash is full") time.sleep(0.6) # move mouse away from inventory, for some reason it was sometimes included in the grabed img - top_left_slot = (self._config.ui_pos["inventory_top_left_slot_x"], self._config.ui_pos["inventory_top_left_slot_y"]) - move_to = (top_left_slot[0] - 300, top_left_slot[1] - 200) - x, y = self._screen.convert_screen_to_monitor(move_to) + x, y = self._screen.convert_abs_to_monitor((0, 0)) mouse.move(x, y, randomize=[40, 200], delay_factor=[1.0, 1.5]) img = self._screen.grab() if self._inventory_has_items(img, num_loot_columns):