Vi que ultimamente está tendo uma boa procura para um macro de Lan, então tomei a liberdade de ajustar os Autodrop postado anteriormente para que funcione como um macro para Lan, onde ele irá andar dentro da zona de drop (não é tão preciso).
Ele fará uma verificação de onde o personagem está, com isso ele entrará na zona de drop e fará a filtragem dos itens que julgar preciosos para o player.
import pyautogui import cv2 import numpy as np import time import os from PIL import ImageGrab
Caminhos para os templates (imagens dos itens e do mapa)
TEMPLATE_DIR = "templates/" ITEM_LAN_KEY_IMAGE = TEMPLATE_DIR + "item_lan.png" # Imagem do item que entra na Lan CHECK_LAN_ZONE_IMAGE = TEMPLATE_DIR + "zona_lan_check.png" # Imagem que confirma que o player está na Lan
Região da tela onde está o inventário (ajuste conforme sua resolução e posição)
INVENTORY_REGION = {"left": 1440, "top": 160, "width": 420, "height": 460}
Lista de itens que NÃO devem ser deletados (itens importantes ou usados pelo macro)
WHITELIST = [ "templates/item_valioso1.png", "templates/item_valioso2.png", "templates/item_lan.png" # protege o item de entrada da Lan ]
Captura uma imagem da região do inventário da tela
def capture_inventory(region): bbox = (region["left"], region["top"], region["left"] + region["width"], region["top"] + region["height"]) screenshot = ImageGrab.grab(bbox=bbox) return cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
Procura por uma imagem (template) dentro da captura atual da tela
def match_template(image, template_path, threshold=0.85): if not os.path.exists(template_path): print(f"Template não encontrado: {template_path}") return [] template = cv2.imread(template_path) result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED) locations = np.where(result >= threshold) return list(zip(locations[1], locations[0])) # retorna lista de coordenadas
Simula clique com botão direito na tela, nas coordenadas recebidas
def right_click(x, y): pyautogui.moveTo(x, y) pyautogui.click(button='right')
Verifica se já está dentro da zona da Lan; caso não esteja, procura e usa o item de entrada
def usar_item_entrada_lan(): print("Verificando se já estamos dentro da zona da Lan...") screenshot = capture_inventory(INVENTORY_REGION) if match_template(screenshot, CHECK_LAN_ZONE_IMAGE, 0.85): print("Já estamos na zona da Lan.") return
print("Procurando item de entrada para a Lan...")
matches = match_template(screenshot, ITEM_LAN_KEY_IMAGE, 0.85)
if matches:
x, y = matches[0]
abs_x = x + INVENTORY_REGION["left"]
abs_y = y + INVENTORY_REGION["top"]
right_click(abs_x, abs_y) # usa o item com clique direito
print("Item usado. Aguardando teleporte...")
time.sleep(5) # espera o tempo do teleporte
else:
print("Item de entrada para a Lan não encontrado.")
Percorre o inventário e remove os itens que não estão na whitelist
def manage_inventory(screenshot): for file in os.listdir(TEMPLATE_DIR): if file.startswith("item_") and os.path.join(TEMPLATE_DIR, file) not in WHITELIST: path = os.path.join(TEMPLATE_DIR, file) matches = match_template(screenshot, path, 0.9) for (x, y) in matches: abs_x = x + INVENTORY_REGION["left"] abs_y = y + INVENTORY_REGION["top"] right_click(abs_x, abs_y) # deleta com clique direito print(f"Item deletado: {file} em ({abs_x}, {abs_y})") time.sleep(0.2) # tempo entre cliques
Função principal do macro: entra na Lan e gerencia o inventário
def main(): print("Macro Lan + AutoDrop iniciado.") usar_item_entrada_lan() # entra na Lan se ainda não estiver time.sleep(2)
# Loop infinito que gerencia o inventário
while True:
screenshot = capture_inventory(INVENTORY_REGION)
manage_inventory(screenshot)
time.sleep(5) # tempo entre verificações
if name == "main": main()
Esse código eu testei apenas em um servidor de testes, então qualquer dúvida ou bug, comente aqui que vamos melhorar, mas como o objetivo é criar algo interativo e didático, iremos fazer juntos.