from typing import Callable import pynput.keyboard as keyboard import pynput.mouse as mouse from secrets import randbelow from pynput.mouse import Button from pynput.keyboard import Key from datetime import datetime, timedelta import time # Constants potion_doses = 16 * 6 potion_duration_seconds = 7.5 * 60 key_quick_prayers = 'o' key_book_activation = 'p' key_pvm_hub_teleport = 'h' key_aggression_potion = '7' key_lantadyme_stick = '8' position_compass = (1173, 34) position_bank_chest_teleport = (896, 238) position_bank_chest_after = (676, 339) position_ectoplasm = (1210, 478) position_ectoplasmator = (1210, 447) position_open_page = (1250, 443) position_select_all_page = (1205, 484) position_open_springs = (1290, 444) position_select_all_springs = (1256, 485) position_open_divine_charge = (1330, 444) position_select_all_divine_charge = (1267, 518) k = keyboard.Controller() m = mouse.Controller() def random_between(minimum: int, maximum: int) -> int: delta = maximum - minimum return minimum + randbelow(delta) def random_sleep_between(min_milliseconds: int, max_milliseconds: int) -> int: sleep_microseconds = random_between(min_milliseconds * 1_000, max_milliseconds * 1_000) sleep_seconds = sleep_microseconds / 1_000_000 print(f"Sleeping for: {sleep_seconds} seconds") time.sleep(sleep_seconds) return sleep_microseconds def click_at(position: tuple[int, int]): m.position = position m.click(Button.left) def right_click_at(position: tuple[int, int]): m.position = position m.click(Button.right) def full_setup(): k.tap(key_pvm_hub_teleport) random_sleep_between(6_000, 7_000) click_at(position_compass) random_sleep_between(100, 300) click_at(position_bank_chest_teleport) random_sleep_between(4_000, 5_000) k.tap('2') random_sleep_between(1_800, 2_200) click_at(position_ectoplasm) random_sleep_between(500, 700) click_at(position_ectoplasmator) random_sleep_between(1_200, 1_400) k.type('999') random_sleep_between(500, 700) k.tap(Key.enter) random_sleep_between(500, 700) right_click_at(position_open_page) random_sleep_between(500, 700) click_at(position_select_all_page) random_sleep_between(500, 700) right_click_at(position_open_springs) random_sleep_between(500, 700) click_at(position_select_all_springs) random_sleep_between(500, 700) right_click_at(position_open_divine_charge) random_sleep_between(500, 700) click_at(position_select_all_divine_charge) random_sleep_between(500, 700) click_at(position_bank_chest_after) random_sleep_between(1_800, 2_200) k.tap('1') def start_abyssal_beasts(): k.tap(key_quick_prayers) random_sleep_between(600, 700) k.tap(key_book_activation) random_sleep_between(600, 700) global potion_doses for dose in range(potion_doses): start_of_dose_time = datetime.now() dose_ends_at = start_of_dose_time + timedelta( seconds=potion_duration_seconds) print(f"{start_of_dose_time} : Dose {dose + 1} out of {potion_doses}") k.tap(key_aggression_potion) print("Pressed overload") random_sleep_between(600, 1300) k.tap(key_lantadyme_stick) print("Pressed lantadyme stick") while datetime.now() < dose_ends_at: k.tap(" ") print("Pressed space - looting") delta_to_dose_end = dose_ends_at - datetime.now() print(f"Time until dose ends: {delta_to_dose_end}") if (delta_to_dose_end.total_seconds() < timedelta(seconds=90).total_seconds()): print("Reduced sleep") random_sleep_between(25_000, 40_000) else: print("Regular sleep") random_sleep_between(45_000, 100_000) def add_keybind(keybind: str | Key, action: Callable): def on_release(key): try: if key == keybind: action() else: if key.char == keybind: action() except: pass keyboard.Listener(on_release=on_release).start() add_keybind(Key.f11, start_abyssal_beasts) add_keybind(Key.f12, full_setup) while True: time.sleep(1000)