Files
my-botty/src/chest.py
T

77 lines
3.2 KiB
Python

import time
import os
from pathlib import Path
from logger import Logger
import template_finder
from screen import grab
from char import IChar
from config import Config
from input_layer import mouse
from utils.misc import wait
from item import consumables
class Chest:
def __init__(self, char: IChar, template: str = None):
self._char = char
self._folder_name = "chests"
self._assets_path = Path(__file__).parent.parent / "assets"
# load all templates
self._templates = []
for filename in os.listdir(f'{self._assets_path}/{self._folder_name}/{template}'):
filename = filename.lower()
if filename.endswith('.png'):
chest = filename[:-4].upper()
self._templates.append(chest)
def open_up_chests(self, timeout: float = 8.0, threshold: float = 0.73) -> bool:
Logger.debug("Open chests")
templates = self._templates
found_chest = True
start = time.time()
while time.time() - start < timeout:
template_match = template_finder.search(templates, grab(), roi=Config().ui_roi["reduce_to_center"], threshold=threshold, use_grayscale=True, best_match=True)
# search for at least 1.5 second, if no chest found, break
if not template_match.valid:
if time.time() - start > 1.5:
break
else:
found_chest = True
# move mouse and check for label
mouse.move(*template_match.center_monitor, delay_factor=[0.4, 0.6])
wait(0.13, 0.16)
chest_label_img = grab()
chest_label = template_finder.search("CHEST_LABEL", chest_label_img, threshold=0.85)
is_locked = template_finder.search("LOCKED", chest_label_img, threshold=0.85).valid
if chest_label.valid:
if is_locked:
consumables.increment_need("key", 1)
Logger.debug(f"Opening {template_match.name} ({template_match.score*100:.1f}% confidence)")
# TODO: Act as picking up a potion to support telekinesis. This workaround needs a proper solution.
self._char.pick_up_item(template_match.center_monitor, 'Chest')
wait(0.33, 0.36)
if template_finder.search("LOCKED", grab(), threshold=0.85).valid:
templates.remove(template_match.name)
Logger.debug("No more keys, removing locked chest template")
continue
else:
templates.remove(template_match.name)
Logger.debug("No chests left")
return found_chest
if __name__ == "__main__":
from input_layer 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 config import Config
pather = Pather()
char = Hammerdin(Config().hammerdin, Config().char, pather)
chest = Chest(char, 'arcane')
chest.open_up_chests(threshold=0.8)