Josiahiscool73

UDbot

Jan 23rd, 2026
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.13 KB | None | 0 0
  1. import cv2
  2. import numpy as np
  3. import mss
  4. import win32api
  5. import win32con
  6. import time
  7. import keyboard
  8. import threading
  9. import tkinter as tk
  10. import json
  11. from tkinter import ttk, colorchooser, simpledialog, messagebox
  12. from PIL import Image, ImageTk
  13.  
  14. # --- Default Configuration ---
  15. DEFAULT_AIM_HOTKEY = 'shift'
  16. DEFAULT_SCREEN_CAPTURE_FOV = 300
  17. DEFAULT_LOWER_COLOR = np.array([0, 0, 0])
  18. DEFAULT_UPPER_COLOR = np.array([179, 255, 50])
  19. DEFAULT_AIM_SPEED_X = 0.3
  20. DEFAULT_AIM_SPEED_Y = 0.3
  21. DEFAULT_MIN_CONTOUR_AREA = 10
  22.  
  23. PREDEFINED_COLORS = {
  24. "Black": ([0, 0, 0], [179, 255, 50]),
  25. "White": ([0, 0, 180], [179, 40, 255]),
  26. "Red": ([0, 120, 70], [10, 255, 255]),
  27. "Green": ([35, 80, 50], [85, 255, 255]),
  28. "Blue": ([95, 100, 50], [135, 255, 255]),
  29. "Yellow": ([20, 100, 100], [35, 255, 255]),
  30. "Pink": ([140, 80, 100], [170, 255, 255]),
  31. "Cyan": ([80, 100, 80], [100, 255, 255])
  32. }
  33.  
  34. class ColorbotGUI:
  35. def __init__(self, root):
  36. self.root = root
  37. self.root.title("Advanced Colorbot GUI (Configurable)")
  38.  
  39. self.bot_thread = None
  40. self.bot_running = False
  41.  
  42. # Variables
  43. self.aim_hotkey = tk.StringVar(value=DEFAULT_AIM_HOTKEY)
  44. self.fov_size = tk.IntVar(value=DEFAULT_SCREEN_CAPTURE_FOV)
  45. self.aim_speed_x = tk.DoubleVar(value=DEFAULT_AIM_SPEED_X)
  46. self.aim_speed_y = tk.DoubleVar(value=DEFAULT_AIM_SPEED_Y)
  47. self.show_esp_box_main = tk.BooleanVar(value=True)
  48. self.min_contour_area = tk.IntVar(value=DEFAULT_MIN_CONTOUR_AREA)
  49. self.always_on_top = tk.BooleanVar(value=False)
  50.  
  51. self.lower_color = list(DEFAULT_LOWER_COLOR)
  52. self.upper_color = list(DEFAULT_UPPER_COLOR)
  53. self.current_color_name = tk.StringVar(value="Black (Default)")
  54.  
  55. # --- Layout ---
  56. main_frame = ttk.Frame(root, padding="10")
  57. main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
  58.  
  59. # Left Column
  60. left_panel = ttk.Frame(main_frame)
  61. left_panel.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.W, tk.E), padx=5)
  62.  
  63. controls_frame = ttk.LabelFrame(left_panel, text="Controls", padding="10")
  64. controls_frame.pack(fill=tk.X, pady=5)
  65.  
  66. color_select_frame = ttk.LabelFrame(left_panel, text="Color Selection", padding="10")
  67. color_select_frame.pack(fill=tk.X, pady=5)
  68.  
  69. config_frame = ttk.LabelFrame(left_panel, text="Config Manager", padding="10")
  70. config_frame.pack(fill=tk.X, pady=5)
  71.  
  72. # Right Column (Video)
  73. video_frame = ttk.LabelFrame(main_frame, text="Live Feed", padding="10")
  74. video_frame.grid(row=0, column=1, sticky=(tk.N, tk.S, tk.W, tk.E), padx=5, pady=5)
  75.  
  76. root.columnconfigure(0, weight=1)
  77. main_frame.columnconfigure(1, weight=3)
  78. main_frame.columnconfigure(0, weight=1)
  79.  
  80. # --- Video Feed ---
  81. self.video_label = ttk.Label(video_frame, text="Bot Inactive")
  82. self.video_label.pack(expand=True, fill=tk.BOTH)
  83.  
  84. # --- Controls Section ---
  85. row_idx = 0
  86. self.start_stop_button = ttk.Button(controls_frame, text="Start Bot", command=self.toggle_bot)
  87. self.start_stop_button.grid(row=row_idx, column=0, columnspan=2, pady=5, sticky=tk.EW); row_idx += 1
  88.  
  89. ttk.Label(controls_frame, text="Aim Key:").grid(row=row_idx, column=0, sticky=tk.W, pady=2)
  90. self.aim_key_label = ttk.Label(controls_frame, textvariable=self.aim_hotkey)
  91. self.aim_key_label.grid(row=row_idx, column=1, sticky=tk.W, pady=2); row_idx += 1
  92. ttk.Button(controls_frame, text="Set Aim Key", command=self.set_aim_key).grid(row=row_idx, column=0, columnspan=2, pady=2, sticky=tk.EW); row_idx += 1
  93.  
  94. ttk.Label(controls_frame, text="FOV Size:").grid(row=row_idx, column=0, sticky=tk.W, pady=2)
  95. ttk.Scale(controls_frame, from_=50, to=800, variable=self.fov_size, orient=tk.HORIZONTAL, command=lambda v: self.fov_size.set(int(float(v)))).grid(row=row_idx, column=1, sticky=tk.EW, pady=2); row_idx += 1
  96.  
  97. ttk.Label(controls_frame, text="Min Color Size (Area):").grid(row=row_idx, column=0, sticky=tk.W, pady=2)
  98. ttk.Scale(controls_frame, from_=1, to=500, variable=self.min_contour_area, orient=tk.HORIZONTAL, command=lambda v: self.min_contour_area.set(int(float(v)))).grid(row=row_idx, column=1, sticky=tk.EW, pady=2); row_idx += 1
  99.  
  100. ttk.Label(controls_frame, text="Aim Speed X:").grid(row=row_idx, column=0, sticky=tk.W, pady=2)
  101. ttk.Scale(controls_frame, from_=0.01, to=2.0, variable=self.aim_speed_x, orient=tk.HORIZONTAL).grid(row=row_idx, column=1, sticky=tk.EW, pady=2); row_idx += 1
  102.  
  103. ttk.Label(controls_frame, text="Aim Speed Y:").grid(row=row_idx, column=0, sticky=tk.W, pady=2)
  104. ttk.Scale(controls_frame, from_=0.01, to=2.0, variable=self.aim_speed_y, orient=tk.HORIZONTAL).grid(row=row_idx, column=1, sticky=tk.EW, pady=2); row_idx += 1
  105.  
  106. ttk.Checkbutton(controls_frame, text="Show ESP Box (Main Feed)", variable=self.show_esp_box_main).grid(row=row_idx, column=0, columnspan=2, pady=5, sticky=tk.W); row_idx+=1
  107. ttk.Checkbutton(controls_frame, text="Always on Top (GUI)", variable=self.always_on_top, command=self.toggle_always_on_top).grid(row=row_idx, column=0, columnspan=2, pady=5, sticky=tk.W); row_idx +=1
  108.  
  109. controls_frame.columnconfigure(1, weight=1)
  110.  
  111. # --- Color Selection Section ---
  112. ttk.Label(color_select_frame, text="Current Target Color:").pack(pady=(0,2))
  113. self.current_color_label = ttk.Label(color_select_frame, textvariable=self.current_color_name, font=("Arial", 10, "bold"))
  114. self.current_color_label.pack(pady=(0,5))
  115. self.color_preview = tk.Frame(color_select_frame, width=100, height=20, bg=self.get_hex_from_hsv_upper())
  116. self.color_preview.pack(pady=(0,10))
  117.  
  118. # NEW: Visualizer Button
  119. ttk.Button(color_select_frame, text="Open Color Visualizer", command=self.open_visualizer).pack(fill=tk.X, pady=2)
  120.  
  121. ttk.Button(color_select_frame, text="Pick Custom Color", command=self.pick_custom_color).pack(fill=tk.X, pady=5)
  122. ttk.Label(color_select_frame, text="Quick Palette:").pack(pady=(10,2))
  123. palette_frame = ttk.Frame(color_select_frame)
  124. palette_frame.pack()
  125.  
  126. col_count = 0; palette_row_idx = 0; max_cols = 3
  127. for color_name, (lower, upper) in PREDEFINED_COLORS.items():
  128. b = ttk.Button(palette_frame, text=color_name, command=lambda l=list(lower), u=list(upper), n=color_name: self.set_target_color(l, u, n))
  129. b.grid(row=palette_row_idx, column=col_count % max_cols, padx=2, pady=2, sticky=tk.EW)
  130. col_count += 1
  131. if col_count % max_cols == 0: palette_row_idx +=1
  132.  
  133. # --- Config Manager Section ---
  134. ttk.Label(config_frame, text="Config String:").pack(anchor=tk.W)
  135. self.config_entry = ttk.Entry(config_frame)
  136. self.config_entry.pack(fill=tk.X, pady=5)
  137.  
  138. btn_frame = ttk.Frame(config_frame)
  139. btn_frame.pack(fill=tk.X)
  140. ttk.Button(btn_frame, text="Copy Config", command=self.copy_config).pack(side=tk.LEFT, expand=True, fill=tk.X, padx=2)
  141. ttk.Button(btn_frame, text="Load Config", command=self.load_config).pack(side=tk.LEFT, expand=True, fill=tk.X, padx=2)
  142.  
  143. self.update_color_preview()
  144. self.root.protocol("WM_DELETE_WINDOW", self.on_closing)
  145.  
  146. # --- Visualizer / Minimap Function ---
  147. def open_visualizer(self):
  148. viz_win = tk.Toplevel(self.root)
  149. viz_win.title("Color Range Visualizer")
  150. viz_win.geometry("400x500")
  151. viz_win.attributes('-topmost', True)
  152.  
  153. # Image Label
  154. img_label = ttk.Label(viz_win)
  155. img_label.pack(padx=10, pady=10)
  156.  
  157. # Controls Frame
  158. ctrl_frame = ttk.Frame(viz_win, padding=10)
  159. ctrl_frame.pack(fill=tk.X)
  160.  
  161. # Tolerance Logic
  162. # We calculate tolerance based on Hue width
  163. current_h_center = (self.lower_color[0] + self.upper_color[0]) // 2
  164. current_tolerance = (self.upper_color[0] - self.lower_color[0]) // 2
  165.  
  166. tol_var = tk.IntVar(value=current_tolerance)
  167.  
  168. def update_viz_image(*args):
  169. # 1. Generate HSV Spectrum
  170. # X-axis: Hue (0-179), Y-axis: Saturation (255-0)
  171. # We use a fixed Value (Brightness) based on current settings to ensure visibility
  172. vis_v = int((self.lower_color[2] + self.upper_color[2]) / 2)
  173. if vis_v == 0: vis_v = 128 # Fallback if black
  174.  
  175. # Create grid
  176. width = 360 # 2 pixels per hue degree for better visibility
  177. height = 256
  178.  
  179. # Create Hue gradient (0 to 179 repeated to fill width)
  180. hue_range = np.linspace(0, 179, width, dtype=np.uint8)
  181. hue_grid = np.tile(hue_range, (height, 1))
  182.  
  183. # Create Saturation gradient (255 to 0)
  184. sat_range = np.linspace(255, 0, height, dtype=np.uint8).reshape(-1, 1)
  185. sat_grid = np.tile(sat_range, (1, width))
  186.  
  187. # Create Value grid
  188. val_grid = np.full((height, width), vis_v, dtype=np.uint8)
  189.  
  190. # Merge into HSV image
  191. hsv_map = cv2.merge([hue_grid, sat_grid, val_grid])
  192. bgr_map = cv2.cvtColor(hsv_map, cv2.COLOR_HSV2BGR)
  193.  
  194. # 2. Create Mask based on ACTUAL settings
  195. # We need to check if the pixels in our map fall within the bot's detection range
  196. lower_np = np.array(self.lower_color, dtype=np.uint8)
  197. upper_np = np.array(self.upper_color, dtype=np.uint8)
  198.  
  199. mask = cv2.inRange(hsv_map, lower_np, upper_np)
  200.  
  201. # 3. Apply "Grey Out" effect
  202. # Convert map to greyscale
  203. grey_map = cv2.cvtColor(bgr_map, cv2.COLOR_BGR2GRAY)
  204. grey_map_bgr = cv2.cvtColor(grey_map, cv2.COLOR_GRAY2BGR)
  205.  
  206. # Combine: Where mask is white (255), use color. Where mask is black (0), use grey.
  207. mask_inv = cv2.bitwise_not(mask)
  208.  
  209. colored_part = cv2.bitwise_and(bgr_map, bgr_map, mask=mask)
  210. grey_part = cv2.bitwise_and(grey_map_bgr, grey_map_bgr, mask=mask_inv)
  211.  
  212. final_viz = cv2.add(colored_part, grey_part)
  213.  
  214. # Add crosshair for center hue
  215. center_x = int((current_h_center / 179.0) * width)
  216. cv2.line(final_viz, (center_x, 0), (center_x, height), (255, 255, 255), 1)
  217.  
  218. # Display
  219. img_pil = Image.fromarray(cv2.cvtColor(final_viz, cv2.COLOR_BGR2RGB))
  220. imgtk = ImageTk.PhotoImage(image=img_pil)
  221. img_label.imgtk = imgtk
  222. img_label.config(image=imgtk)
  223.  
  224. def on_tolerance_change(val):
  225. try:
  226. tol = int(float(val))
  227. tol_var.set(tol)
  228.  
  229. # Update Global Colors based on center + tolerance
  230. new_lower_h = max(0, current_h_center - tol)
  231. new_upper_h = min(179, current_h_center + tol)
  232.  
  233. self.lower_color[0] = new_lower_h
  234. self.upper_color[0] = new_upper_h
  235.  
  236. # Update main GUI preview
  237. self.update_color_preview()
  238. self.current_color_label.config(text=f"Custom (Tol: {tol})")
  239.  
  240. # Update Visualizer
  241. update_viz_image()
  242. except: pass
  243.  
  244. def on_entry_change(event=None):
  245. try:
  246. val = int(tol_entry.get())
  247. tolerance_scale.set(val) # This triggers the scale command
  248. except: pass
  249.  
  250. ttk.Label(ctrl_frame, text="Hue Tolerance:").pack(anchor=tk.W)
  251.  
  252. tolerance_scale = ttk.Scale(ctrl_frame, from_=1, to=90, orient=tk.HORIZONTAL, command=on_tolerance_change)
  253. tolerance_scale.set(current_tolerance)
  254. tolerance_scale.pack(fill=tk.X, pady=5)
  255.  
  256. tol_entry = ttk.Entry(ctrl_frame, textvariable=tol_var)
  257. tol_entry.pack(fill=tk.X, pady=5)
  258. tol_entry.bind('<Return>', on_entry_change)
  259. tol_entry.bind('<FocusOut>', on_entry_change)
  260.  
  261. ttk.Label(ctrl_frame, text="* Grey areas are colors the bot will IGNORE.").pack(pady=5)
  262.  
  263. # Initial Draw
  264. update_viz_image()
  265.  
  266. # --- Config Functions ---
  267. def copy_config(self):
  268. config_data = {
  269. "aim_key": self.aim_hotkey.get(),
  270. "fov": self.fov_size.get(),
  271. "speed_x": self.aim_speed_x.get(),
  272. "speed_y": self.aim_speed_y.get(),
  273. "min_size": self.min_contour_area.get(),
  274. "esp": self.show_esp_box_main.get(),
  275. "top": self.always_on_top.get(),
  276. "color_lower": self.lower_color,
  277. "color_upper": self.upper_color,
  278. "color_name": self.current_color_name.get()
  279. }
  280. try:
  281. config_str = json.dumps(config_data)
  282. self.config_entry.delete(0, tk.END)
  283. self.config_entry.insert(0, config_str)
  284. self.root.clipboard_clear()
  285. self.root.clipboard_append(config_str)
  286. messagebox.showinfo("Config", "Config copied to clipboard!")
  287. except Exception as e:
  288. messagebox.showerror("Error", f"Failed to generate config: {e}")
  289.  
  290. def load_config(self):
  291. config_str = self.config_entry.get()
  292. if not config_str:
  293. messagebox.showwarning("Config", "Please paste a config string into the box first.")
  294. return
  295. try:
  296. data = json.loads(config_str)
  297. if "aim_key" in data: self.aim_hotkey.set(data["aim_key"])
  298. if "fov" in data: self.fov_size.set(data["fov"])
  299. if "speed_x" in data: self.aim_speed_x.set(data["speed_x"])
  300. if "speed_y" in data: self.aim_speed_y.set(data["speed_y"])
  301. if "min_size" in data: self.min_contour_area.set(data["min_size"])
  302. if "esp" in data: self.show_esp_box_main.set(data["esp"])
  303. if "top" in data:
  304. self.always_on_top.set(data["top"])
  305. self.toggle_always_on_top()
  306. if "color_lower" in data and "color_upper" in data:
  307. self.lower_color = data["color_lower"]
  308. self.upper_color = data["color_upper"]
  309. name = data.get("color_name", "Custom Config")
  310. self.current_color_name.set(name)
  311. self.update_color_preview()
  312. messagebox.showinfo("Config", "Configuration loaded successfully!")
  313. except Exception as e:
  314. messagebox.showerror("Config Error", f"Error loading config: {e}")
  315.  
  316. # --- Existing Functions ---
  317. def toggle_always_on_top(self):
  318. if self.always_on_top.get():
  319. self.root.attributes('-topmost', True)
  320. else:
  321. self.root.attributes('-topmost', False)
  322.  
  323. def get_hex_from_hsv_upper(self):
  324. try:
  325. hsv_color_array = np.uint8([[self.upper_color]])
  326. rgb_color_array = cv2.cvtColor(hsv_color_array, cv2.COLOR_HSV2RGB)
  327. return f"#{rgb_color_array[0][0][0]:02x}{rgb_color_array[0][0][1]:02x}{rgb_color_array[0][0][2]:02x}"
  328. except: return "#FFFFFF"
  329.  
  330. def update_color_preview(self):
  331. self.color_preview.config(bg=self.get_hex_from_hsv_upper())
  332.  
  333. def set_target_color(self, lower_hsv, upper_hsv, name="Custom"):
  334. self.lower_color = list(lower_hsv); self.upper_color = list(upper_hsv)
  335. self.current_color_name.set(name); self.update_color_preview()
  336.  
  337. def pick_custom_color(self):
  338. color_code = colorchooser.askcolor(title="Choose Target Color (RGB)", parent=self.root)
  339. if color_code and color_code[0]:
  340. rgb = color_code[0]; rgb_np = np.uint8([[rgb]]); hsv_np = cv2.cvtColor(rgb_np, cv2.COLOR_RGB2HSV)
  341. hue = hsv_np[0][0][0]
  342. try:
  343. s_min = simpledialog.askinteger("Saturation Min", "Enter MIN Saturation (0-255):", initialvalue=100, minvalue=0, maxvalue=255, parent=self.root)
  344. s_max = simpledialog.askinteger("Saturation Max", "Enter MAX Saturation (0-255):", initialvalue=255, minvalue=0, maxvalue=255, parent=self.root)
  345. v_min = simpledialog.askinteger("Value Min", "Enter MIN Value/Brightness (0-255):", initialvalue=100, minvalue=0, maxvalue=255, parent=self.root)
  346. v_max = simpledialog.askinteger("Value Max", "Enter MAX Value/Brightness (0-255):", initialvalue=255, minvalue=0, maxvalue=255, parent=self.root)
  347. h_tolerance = simpledialog.askinteger("Hue Tolerance", "Enter Hue Tolerance (+/- value):", initialvalue=10, minvalue=1, maxvalue=89, parent=self.root)
  348.  
  349. if None not in [s_min, s_max, v_min, v_max, h_tolerance]:
  350. lower_h = max(0, hue - h_tolerance); upper_h = min(179, hue + h_tolerance)
  351. self.set_target_color([lower_h, s_min, v_min], [upper_h, s_max, v_max], f"Custom RGB:({int(rgb[0])},{int(rgb[1])},{int(rgb[2])})")
  352. except Exception as e: messagebox.showerror("Error", f"Could not set custom color: {e}", parent=self.root)
  353.  
  354. def set_aim_key(self):
  355. self.aim_key_label.config(text="Press new aim key...")
  356. self.root.update()
  357. try:
  358. event = keyboard.read_event(suppress=True)
  359. if event.event_type == keyboard.KEY_DOWN:
  360. new_key = event.name
  361. if 'left ' in new_key: new_key = new_key.replace('left ', '')
  362. if 'right ' in new_key: new_key = new_key.replace('right ', '')
  363. if new_key == 'ctrl': new_key = 'control'
  364. self.aim_hotkey.set(new_key)
  365. except Exception as e:
  366. self.aim_key_label.config(text=self.aim_hotkey.get())
  367. messagebox.showerror("Error", f"Could not set aim key: {e}", parent=self.root)
  368.  
  369. def toggle_bot(self):
  370. if self.bot_running: self.stop_bot()
  371. else: self.start_bot()
  372.  
  373. def start_bot(self):
  374. if self.bot_running: return
  375. self.bot_running = True
  376. self.start_stop_button.config(text="Stop Bot")
  377. self.video_label.config(text="Bot Starting...", image=None)
  378. if hasattr(self.video_label, 'imgtk'): self.video_label.imgtk = None
  379.  
  380. self.bot_thread = threading.Thread(target=self.colorbot_loop, daemon=True)
  381. self.bot_thread.start()
  382.  
  383. def stop_bot(self):
  384. if not self.bot_running: return
  385. self.bot_running = False
  386. if self.bot_thread and self.bot_thread.is_alive():
  387. self.bot_thread.join(timeout=1.5)
  388. self.start_stop_button.config(text="Start Bot")
  389. self.video_label.config(image=None, text="Bot Inactive")
  390. if hasattr(self.video_label, 'imgtk'): self.video_label.imgtk = None
  391.  
  392. def on_closing(self):
  393. if self.bot_running: self.stop_bot()
  394. self.root.destroy()
  395.  
  396. def display_main_feed(self, img_pil_main_feed):
  397. try:
  398. imgtk = ImageTk.PhotoImage(image=img_pil_main_feed)
  399. self.video_label.imgtk = imgtk
  400. self.video_label.config(image=imgtk)
  401. except Exception:
  402. pass
  403.  
  404. def colorbot_loop(self):
  405. sct_local = mss.mss()
  406. last_frame_time = time.time(); target_fps = 30; min_frame_interval = 1.0 / target_fps
  407.  
  408. while self.bot_running:
  409. current_time = time.time(); delta_time = current_time - last_frame_time
  410. if delta_time < min_frame_interval:
  411. sleep_duration = min_frame_interval - delta_time
  412. if sleep_duration > 0: time.sleep(sleep_duration)
  413. last_frame_time = time.time()
  414.  
  415. try:
  416. active_aim_key = self.aim_hotkey.get(); fov = self.fov_size.get()
  417. current_lower_color = np.array(self.lower_color, dtype=np.uint8)
  418. current_upper_color = np.array(self.upper_color, dtype=np.uint8)
  419. speed_x = self.aim_speed_x.get(); speed_y = self.aim_speed_y.get()
  420. esp_on_main_gui = self.show_esp_box_main.get()
  421. min_area = self.min_contour_area.get()
  422.  
  423. cursor_x, cursor_y = win32api.GetCursorPos()
  424. monitor_region = {"top": cursor_y - fov // 2, "left": cursor_x - fov // 2, "width": fov, "height": fov}
  425.  
  426. img_np = np.array(sct_local.grab(monitor_region))
  427. frame_bgr_original = cv2.cvtColor(img_np, cv2.COLOR_BGRA2BGR)
  428.  
  429. frame_for_esp_drawing = frame_bgr_original.copy()
  430.  
  431. hsv = cv2.cvtColor(frame_bgr_original, cv2.COLOR_BGR2HSV)
  432. mask = cv2.inRange(hsv, current_lower_color, current_upper_color)
  433.  
  434. contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  435. target_center_x, target_center_y = None, None
  436.  
  437. if contours:
  438. largest_contour = max(contours, key=cv2.contourArea)
  439. if cv2.contourArea(largest_contour) >= min_area:
  440. M = cv2.moments(largest_contour)
  441. if M["m00"] != 0:
  442. target_center_x = int(M["m10"] / M["m00"])
  443. target_center_y = int(M["m01"] / M["m00"])
  444.  
  445. if esp_on_main_gui:
  446. x, y, w, h = cv2.boundingRect(largest_contour)
  447. cv2.rectangle(frame_for_esp_drawing, (x, y), (x + w, y + h), (0, 255, 0), 2)
  448. cv2.circle(frame_for_esp_drawing, (target_center_x, target_center_y), 5, (0,0,255), -1)
  449.  
  450. if keyboard.is_pressed(active_aim_key) and target_center_x is not None:
  451. frame_center_x = fov // 2; frame_center_y = fov // 2
  452. dx = target_center_x - frame_center_x; dy = target_center_y - frame_center_y
  453. move_x = int(dx * speed_x); move_y = int(dy * speed_y)
  454. if abs(move_x) > 0 or abs(move_y) > 0:
  455. win32api.mouse_event(win32con.MOUSEEVENTF_MOVE, move_x, move_y, 0, 0)
  456.  
  457. game_part_for_main_gui = frame_for_esp_drawing if esp_on_main_gui else frame_bgr_original
  458. mask_for_display_main_gui = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
  459. combined_display_main_gui = np.hstack((game_part_for_main_gui, mask_for_display_main_gui))
  460. img_pil_main_gui = Image.fromarray(cv2.cvtColor(combined_display_main_gui, cv2.COLOR_BGR2RGB))
  461. self.root.after(0, self.display_main_feed, img_pil_main_gui)
  462.  
  463. except mss.exception.ScreenShotError: time.sleep(0.05)
  464. except Exception as e:
  465. print(f"Error in colorbot loop: {e}")
  466. time.sleep(0.05)
  467.  
  468. self.root.after(0, lambda: self.video_label.config(image=None, text="Bot Inactive"))
  469. if hasattr(self.video_label, 'imgtk'): self.root.after(0, lambda: setattr(self.video_label, 'imgtk', None))
  470.  
  471. if __name__ == "__main__":
  472. root = tk.Tk()
  473. app = ColorbotGUI(root)
  474. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment