├── COPYRIGHT.md ├── README.md ├── aimsource.py ├── config.txt ├── installer.bat ├── keybind_list.txt ├── keybinds.py └── version.txt /COPYRIGHT.md: -------------------------------------------------------------------------------- 1 | # Copyright Policy 2 | 3 | Copyright 2024 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this Python software and associated documentation files (the software), to deal in the software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and to permit persons to whom the program is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the program. 8 | 9 | Any fork, modification, distribution, or use of the Software that does not adhere to the following conditions is prohibited: 10 | 11 | Redistributions of this Python program must include proper attribution to Seconb and a link to the original repository. 12 | Any modification or derivative work based on the Software must be clearly marked and identified as such. 13 | Prior written permission must be obtained from the original author(s) for any commercial use of the Software. 14 | The derivative work is not used commercially or otherwise involved financially 15 | Changes have been made to the code as improvements must be supplied through GitHub. Ergo, if a user wishes to improve it, the changes cannot be made in another repository or download page. 16 | THE SOFTWARE IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 17 | 18 | # NOTICE: 19 | This project was created for educational purposes only. It may be abandoned at any time. The user is liable for any bans, timeouts, kicks, etc. by ROBLOX developers and administration. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WIKI 2 | - See the wiki for a full usage guide and other usage information (i.e Troubleshooting). 3 | - https://github.com/Seconb/Roblox-Colorbot/wiki 4 | 5 | # CREDITS 6 | 7 | - Seconb (Primary developer) 8 | - AndrewDarkyy (https://github.com/AndrewDarkyy) (https://discord.com/invite/K8gdWHthVw) (Co-developer, contributed many features such as triggerbot, smoothening, version checker, and optimizations) 9 | - Befia/Taylor (Contributed some bugfixes and comments to explain certain areas of code, and added basic error handling. Not an actual developer for the project though) 10 | - Hariangr for their HSVRangeTool (https://github.com/hariangr/HsvRangeTool) 11 | - PossibIy (Contributed the Show FOV feature) (https://github.com/possibIy) 12 | 13 | # FEATURES 14 | 15 | - Colorbot based on the outlines around enemies in some Roblox games, namely: Arsenal, Aimblox, and Bad Business 16 | - Custom color feature which allows for multi-game support. 17 | - Triggerbot (automatically shoots enemies if enabled!) 18 | - Adjustable aim (where it aims like their head or their body, and the speed and distance it does that from) 19 | - Easy configuration via a file! 20 | - Many choices for enemy outline colors! 21 | -------------------------------------------------------------------------------- /aimsource.py: -------------------------------------------------------------------------------- 1 | from keyboard import is_pressed 2 | from os import system, chdir 3 | from os.path import dirname, join 4 | import configparser 5 | from cv2 import dilate, threshold, findContours, RETR_EXTERNAL, CHAIN_APPROX_NONE, contourArea, cvtColor, COLOR_BGR2HSV, inRange, THRESH_BINARY 6 | import numpy as np 7 | import win32api 8 | from threading import Thread 9 | from colorama import Fore, Style 10 | from time import time, sleep, strftime, localtime 11 | import pygetwindow as gw 12 | from urllib.request import urlopen 13 | from webbrowser import open as openwebpage 14 | from math import sqrt 15 | import sys 16 | import tkinter as tk 17 | from PIL import Image, ImageDraw, ImageTk 18 | from keybinds import * 19 | 20 | system("title Colorbot") 21 | kernel = np.ones((3, 3), np.uint8) 22 | toggleholdmodes = ("Hold", "Toggle") 23 | 24 | def log_error(error_message): 25 | timestamp = strftime('%Y-%m-%d %H:%M:%S', localtime()) 26 | log_entry = f"{timestamp}: {error_message}\n" 27 | try: 28 | with open(error_log_path, 'a') as log_file: 29 | log_file.write(log_entry) 30 | except FileNotFoundError: 31 | with open(error_log_path, 'w') as log_file: 32 | log_file.write(log_entry) 33 | 34 | try: 35 | if getattr(sys, 'frozen', False): 36 | application_path = dirname(sys.executable) 37 | config_file_path = join(application_path, 'config.txt') 38 | #last_launch_path = join(application_path, 'lastlaunch.txt') 39 | error_log_path = join(application_path, "log.txt") 40 | chdir(application_path) 41 | else: 42 | script_directory = dirname(__file__) 43 | config_file_path = join(script_directory, "config.txt") 44 | #last_launch_path = join(script_directory, "lastlaunch.txt") 45 | error_log_path = join(script_directory, "log.txt") 46 | chdir(script_directory) 47 | except Exception as e: 48 | print(f"An error occurred checking if you're using the .py or the .exe: {e}") 49 | log_error(e) 50 | exit() 51 | 52 | ''' Disabled auto-joining the Discord and instead I just put the invite in the banner. 53 | try: 54 | buffer = open(last_launch_path, "r") 55 | currenttime = time() 56 | if currenttime - float(buffer.read()) >= 17990: 57 | buffer2 = open(last_launch_path, "w+") 58 | buffer2.write(str(currenttime)) 59 | buffer2.close() 60 | openwebpage("https://discord.com/invite/K8gdWHthVw") 61 | buffer.close() 62 | except: 63 | buffer = open(last_launch_path, "w+") 64 | buffer.write(str(currenttime)) 65 | buffer.close() 66 | openwebpage("https://discord.com/invite/K8gdWHthVw") 67 | ''' 68 | 69 | try: # checks for updates using the version number we defined earlier, pasted from andrewdarkyy cuz im lazy and his colorbot is just a modded version of mine so like who cares 70 | if not "14" in urlopen("https://raw.githubusercontent.com/Seconb/Roblox-Colorbot/main/version.txt").read().decode("utf-8"): 71 | print("Outdated version, redownload: https://github.com/Seconb/Roblox-Colorbot/releases") 72 | print("Press Enter to continue anyway...") 73 | while True: 74 | if is_pressed("Enter"): 75 | break 76 | except Exception as e: 77 | print("Error checking update: ", e) 78 | log_error(e) 79 | print("Continuing anyway!") 80 | sleep(5) 81 | pass 82 | 83 | try: 84 | config = configparser.ConfigParser() 85 | config.optionxform = str 86 | config.read(config_file_path) 87 | except Exception as e: 88 | print("Error reading config:", e) 89 | log_error(e) 90 | exit() 91 | 92 | def rbxfocused(): 93 | try: 94 | return "Roblox" == gw.getActiveWindow().title 95 | except AttributeError: 96 | # if youre in the middle of alt tabbing it screws things up, so we'll just ignore if youre doing that 97 | return False 98 | except Exception as e: 99 | print("An error occurred checking if Roblox is focused: ", e) 100 | log_error(e) 101 | exit() 102 | 103 | def change_config_setting(setting_name, new_value): 104 | try: 105 | config.set("Config", setting_name, str(new_value)) 106 | with open(config_file_path, "w") as configfile: 107 | config.write(configfile) 108 | load() # Update global variables after changing config 109 | print(f"Config setting '{setting_name}' changed to {new_value}") 110 | except Exception as e: 111 | print(f"Error changing config setting '{setting_name}': {e}") 112 | log_error(e) 113 | exit() 114 | 115 | def load(): 116 | global center, screenshot, camera, region, TOGGLE_HOLD_MODE, CAM_TYPE, sct, CAM_FOV_COLOR, AIM_FOV_COLOR, SHOW_FOV, AIM_KEY, SWITCH_MODE_KEY, FOV_KEY_UP, FOV_KEY_DOWN, CAM_FOV, AIM_OFFSET_Y, AIM_OFFSET_X, AIM_SPEED_X, AIM_SPEED_Y, upper, lower, UPDATE_KEY, AIM_FOV, BINDMODE, COLOR, colorname, TRIGGERBOT, TRIGGERBOT_DELAY, SMOOTHENING, SMOOTH_FACTOR, TRIGGERBOT_DISTANCE, HIDE_CONSOLE 117 | 118 | try: 119 | config = configparser.ConfigParser() 120 | config.optionxform = str 121 | config.read(config_file_path) 122 | except Exception as e: 123 | print("Error reading config:", e) 124 | log_error(e) 125 | exit() 126 | 127 | try: 128 | AIM_KEY = config.get("Config", "AIM_KEY") 129 | SWITCH_MODE_KEY = config.get("Config", "SWITCH_MODE_KEY") 130 | UPDATE_KEY = config.get("Config", "UPDATE_KEY") 131 | FOV_KEY_UP = config.get("Config", "FOV_KEY_UP") 132 | FOV_KEY_DOWN = config.get("Config", "FOV_KEY_DOWN") 133 | CAM_FOV = int(config.get("Config", "CAM_FOV")) 134 | AIM_FOV = int(config.get("Config", "AIM_FOV")) 135 | AIM_OFFSET_Y = int(config.get("Config", "AIM_OFFSET_Y")) 136 | AIM_OFFSET_X = int(config.get("Config", "AIM_OFFSET_X")) 137 | AIM_SPEED_X = float(config.get("Config", "AIM_SPEED_X")) 138 | AIM_SPEED_Y = float(config.get("Config", "AIM_SPEED_Y")) 139 | TRIGGERBOT = config.get("Config", "TRIGGERBOT") 140 | TRIGGERBOT_DELAY = int(config.get("Config", "TRIGGERBOT_DELAY")) 141 | TRIGGERBOT_DISTANCE = int(config.get("Config", "TRIGGERBOT_DISTANCE")) 142 | SMOOTHENING = config.get("Config", "SMOOTHENING") 143 | SMOOTH_FACTOR = float(config.get("Config", "SMOOTH_FACTOR")) 144 | UPPER_COLOR = tuple(map(int, config.get("Config", "UPPER_COLOR").split(', '))) 145 | LOWER_COLOR = tuple(map(int, config.get("Config", "LOWER_COLOR").split(', '))) 146 | CAM_FOV_COLOR = tuple(map(int, config.get("Config", "CAM_FOV_COLOR").split(', '))) 147 | AIM_FOV_COLOR = tuple(map(int, config.get("Config", "AIM_FOV_COLOR").split(', '))) 148 | HIDE_CONSOLE = config.get("Config", "HIDE_CONSOLE") 149 | SHOW_FOV = config.get("Config", "SHOW_FOV") 150 | CAM_TYPE = config.get("Config", "CAM_TYPE") 151 | TOGGLE_HOLD_MODE = config.get("Config", "TOGGLE_HOLD_MODE") 152 | center = CAM_FOV / 2 153 | if TOGGLE_HOLD_MODE.lower() == "hold": 154 | TOGGLE_HOLD_MODE = 0 155 | else: 156 | TOGGLE_HOLD_MODE = 1 157 | if CAM_TYPE.lower() == "mss": 158 | import mss 159 | sct = mss.mss() 160 | screenshot = sct.monitors[1] #this is the settings for the screen capture, the program screenshots your first monitor and continues to look for enemies. 161 | screenshot["left"] = int((screenshot["width"] / 2) - (CAM_FOV / 2)) 162 | screenshot["top"] = int((screenshot["height"] / 2) - (CAM_FOV / 2)) 163 | screenshot["width"] = CAM_FOV 164 | screenshot["height"] = CAM_FOV 165 | else: 166 | import bettercam 167 | usersize = [win32api.GetSystemMetrics(0), win32api.GetSystemMetrics(1)] 168 | left, top = (usersize[0] - CAM_FOV) // 2, (usersize[1] - CAM_FOV) // 2 169 | right, bottom = left + CAM_FOV, top + CAM_FOV 170 | region = (left, top, right, bottom) 171 | camera = bettercam.create(output_idx=0, output_color="BGR") 172 | if HIDE_CONSOLE.lower() == "enabled": 173 | import ctypes 174 | import win32gui 175 | whnd = ctypes.windll.kernel32.GetConsoleWindow() 176 | if whnd != 0: 177 | ctypes.windll.user32.ShowWindow(whnd, 0) 178 | win32gui.ShowWindow(whnd, 0) 179 | if SMOOTH_FACTOR <= 0: 180 | SMOOTHENING = "disabled" 181 | COLOR = config.get("Config", "COLOR") 182 | COLORS = { 183 | "yellow": (Fore.YELLOW, np.array((30, 255, 229), dtype="uint8"), np.array((30, 255, 229), dtype="uint8")), 184 | "blue": (Fore.BLUE, np.array((120, 255, 229), dtype="uint8"), np.array((120, 255, 229), dtype="uint8")), 185 | "pink": (Fore.MAGENTA, np.array((150, 255, 229), dtype="uint8"), np.array((150, 255, 229), dtype="uint8")), 186 | "magenta": (Fore.MAGENTA, np.array((150, 255, 229), dtype="uint8"), np.array((150, 255, 229), dtype="uint8")), 187 | "purple": (Fore.MAGENTA, np.array((150, 255, 229), dtype="uint8"), np.array((150, 255, 229), dtype="uint8")), 188 | "green": (Fore.GREEN, np.array((60, 255, 229), dtype="uint8"), np.array((60, 255, 229), dtype="uint8")), 189 | "cyan": (Fore.CYAN, np.array((90, 255, 229), dtype="uint8"), np.array((90, 255, 229), dtype="uint8")), 190 | "red": (Fore.RED, np.array((0, 255, 229), dtype="uint8"), np.array((0, 255, 229), dtype="uint8")), 191 | "custom": (Fore.WHITE, np.array(UPPER_COLOR, dtype="uint8"), np.array(LOWER_COLOR, dtype="uint8")), 192 | "0000ff": (Fore.BLUE, np.array((123, 255, 255), dtype="uint8"), np.array((120, 147, 69), dtype="uint8")), 193 | "aimblox": (Fore.LIGHTRED_EX, np.array((4, 225, 206), dtype="uint8"), np.array((0, 175, 119), dtype="uint8")), 194 | "black": (Fore.WHITE, np.array((0, 0, 0), dtype="uint8"), np.array((0, 0, 0), dtype="uint8")), 195 | } 196 | try: 197 | colorname, upper, lower = COLORS[COLOR.lower()] 198 | except KeyError: 199 | print(f"Color '{COLOR}' is not supported.") 200 | 201 | except Exception as e: 202 | print("Error loading settings:", e) 203 | log_error(e) 204 | exit() 205 | load() 206 | 207 | def clicked(KEY): 208 | try: 209 | return win32api.GetAsyncKeyState(get_keycode(KEY)) < 0 210 | except Exception as e: 211 | print("Error checking key state:", e) 212 | log_error(e) 213 | exit() 214 | 215 | def create_circle_outline_image(radius, color, alpha, outline_width): 216 | image = Image.new('RGBA', (2*radius, 2*radius), (0, 0, 0, 0)) 217 | draw = ImageDraw.Draw(image) 218 | draw.ellipse((outline_width//2, outline_width//2, 2*radius-outline_width//2, 2*radius-outline_width//2), fill=(0, 0, 0, 0), outline=color+(alpha,), width=outline_width) 219 | return image 220 | 221 | def create_circle(radius, color, alpha): 222 | global overlay_window 223 | screen_width = root.winfo_screenwidth() 224 | screen_height = root.winfo_screenheight() 225 | 226 | circle_alpha = alpha # Transparency level (0-255) 227 | circle_outline_width = 2 # Width of the circle outline 228 | circle_outline_image = create_circle_outline_image(radius, color, circle_alpha, circle_outline_width) 229 | 230 | circle_outline_photo = ImageTk.PhotoImage(circle_outline_image) 231 | 232 | overlay_window = tk.Toplevel(root) 233 | overlay_window.overrideredirect(True) # Remove window decorations 234 | overlay_window.attributes('-topmost', True) # Always on top 235 | overlay_window.attributes('-transparentcolor', 'black') # Make the background transparent 236 | overlay_window.geometry(f'+{screen_width//2-radius}+{screen_height//2-radius}') # Center the window 237 | 238 | circle_outline_label = tk.Label(overlay_window, image=circle_outline_photo, bg='black') 239 | circle_outline_label.image = circle_outline_photo # Keep a reference to prevent garbage collection 240 | circle_outline_label.pack() 241 | 242 | class trbot: 243 | def __init__(self): 244 | self.aimtoggled = False 245 | self.switchmode = TOGGLE_HOLD_MODE 246 | self.__clicks = 0 247 | self.__shooting = False 248 | 249 | def __stop(self): 250 | oldclicks = self.__clicks 251 | sleep(.05) 252 | if self.__clicks == oldclicks: 253 | win32api.mouse_event(0x0004, 0, 0, 0, 0) 254 | 255 | def __delayedaim(self): 256 | self.__shooting = True 257 | sleep(TRIGGERBOT_DELAY / 1000) 258 | win32api.mouse_event(0x0002, 0, 0, 0, 0) 259 | self.__clicks += 1 260 | Thread(target = self.__stop).start() 261 | self.__shooting = False 262 | 263 | def process(self): 264 | if rbxfocused(): 265 | try: 266 | if CAM_TYPE.lower() == "bettercam": 267 | img = camera.grab(region=region) 268 | else: 269 | img = np.array(sct.grab(screenshot)) 270 | if img is not None: 271 | hsv = cvtColor(img, COLOR_BGR2HSV) 272 | mask = inRange(hsv, lower, upper) 273 | dilated = dilate(mask, kernel, iterations=5) 274 | thresh = threshold(dilated, 60, 255, THRESH_BINARY)[1] 275 | (contours, hierarchy) = findContours(thresh, RETR_EXTERNAL, CHAIN_APPROX_NONE) 276 | if len(contours) != 0: 277 | contour = max(contours, key=contourArea) 278 | topmost = tuple(contour[contour[:, :, 1].argmin()][0]) 279 | x = topmost[0] - center + AIM_OFFSET_X 280 | y = topmost[1] - center + AIM_OFFSET_Y 281 | distance = sqrt(x**2 + y**2) 282 | if distance <= AIM_FOV: 283 | x2 = x * AIM_SPEED_X 284 | y2 = y * AIM_SPEED_Y 285 | x2 = int(x2) 286 | y2 = int(y2) 287 | if SMOOTHENING.lower() != "disabled": 288 | if distance >= SMOOTH_FACTOR: 289 | win32api.mouse_event(0x0001, x2, y2, 0, 0) 290 | else: 291 | win32api.mouse_event(0x0001, x2, y2, 0, 0) 292 | if TRIGGERBOT != "disabled" and distance <= TRIGGERBOT_DISTANCE: 293 | if TRIGGERBOT_DELAY != 0: 294 | if self.__shooting == False: 295 | Thread(target = self.__delayedaim).start() 296 | else: 297 | win32api.mouse_event(0x0002, 0, 0, 0, 0) 298 | self.__clicks += 1 299 | Thread(target = self.__stop).start() 300 | else: 301 | pass 302 | 303 | except Exception as e: 304 | print("Error in processing:", e) 305 | log_error(e) 306 | exit() 307 | 308 | def aimtoggle(self): 309 | try: 310 | self.aimtoggled = not self.aimtoggled 311 | sleep(0.15) # very short cooldown to stop it from thinking we're rapid toggling. 312 | except Exception as e: 313 | print("Error toggling aim:", e) 314 | log_error(e) 315 | exit() 316 | 317 | def modeswitch(self): 318 | try: 319 | self.switchmode = 1 - self.switchmode 320 | sleep(0.15) 321 | except Exception as e: 322 | print("Error switching modes:", e) 323 | log_error(e) 324 | exit() 325 | 326 | def togglebot(self): 327 | while True: 328 | if clicked(AIM_KEY): 329 | if self.switchmode == 0 and not self.aimtoggled: 330 | self.aimtoggle() 331 | print_banner(self) 332 | while clicked(AIM_KEY) and self.aimtoggled: 333 | self.process() 334 | if not clicked(AIM_KEY): 335 | self.aimtoggle() 336 | print_banner(self) 337 | elif self.switchmode == 1: 338 | self.aimtoggle() 339 | print_banner(self) 340 | while self.aimtoggled: 341 | self.process() 342 | if clicked(AIM_KEY): 343 | self.aimtoggle() 344 | print_banner(self) 345 | sleep(0.01) 346 | 347 | def print_banner(bot: trbot): 348 | try: 349 | system("cls") 350 | """ # OLD LOGO 351 | print( 352 | f"{Style.BRIGHT}{Fore.CYAN}\n" 353 | f" _ ___ ___ ___ _ _ _ _ ___ ___ _ ___ ___ ___ ___ _____\n" 354 | f" /_\ | _ \/ __| __| \| | /_\ | | / __/ _ \| | / _ \| _ \ _ )/ _ \_ _|\n" 355 | f" / _ \| /\__ \ _|| .` |/ _ \| |__ | (_| (_) | |_| (_) | / _ \ (_) || | \n" 356 | f" /_/ \_\_|_\|___/___|_|\_/_/ \_\____| \___\___/|____\___/|_|_\___/\___/ |_|\n" 357 | f"{Style.RESET_ALL}" 358 | ) 359 | """ 360 | print(Style.BRIGHT + Fore.CYAN + """ 361 | ▄▄· ▄▄▌ ▄▄▄ ▄▄▄▄· ▄▄▄▄▄ 362 | ▐█ ▌▪▪ ██• ▪ ▀▄ █·▐█ ▀█▪▪ •██ 363 | ██ ▄▄ ▄█▀▄ ██▪ ▄█▀▄ ▐▀▀▄ ▐█▀▀█▄ ▄█▀▄ ▐█.▪ 364 | ▐███▌▐█▌.▐▌▐█▌▐▌▐█▌.▐▌▐█•█▌██▄▪▐█▐█▌.▐▌ ▐█▌· 365 | ·▀▀▀ ▀█▄▀▪.▀▀▀ ▀█▄▀▪.▀ ▀·▀▀▀▀ ▀█▄▀▪ ▀▀▀ 366 | """ + Style.RESET_ALL) 367 | 368 | print(" ====== Controls ======") 369 | print(f" Activate colorbot : {Fore.YELLOW}{AIM_KEY}{Style.RESET_ALL}") 370 | if SWITCH_MODE_KEY != "disabled": 371 | print(f" Switch toggle/hold : {Fore.YELLOW}{SWITCH_MODE_KEY}{Style.RESET_ALL}") 372 | if UPDATE_KEY != "disabled": 373 | print(f" Update Config : {Fore.YELLOW}{UPDATE_KEY}{Style.RESET_ALL}") 374 | if FOV_KEY_UP != "disabled" and FOV_KEY_DOWN != "disabled": 375 | print(f" Change FOV : {Fore.YELLOW}{FOV_KEY_UP}/{FOV_KEY_DOWN}{Style.RESET_ALL}") 376 | print(" ==== Information =====") 377 | print(f" Toggle/Hold Mode : {Fore.CYAN}{toggleholdmodes[bot.switchmode]}{Style.RESET_ALL}") 378 | print(f" Aim FOV : {Fore.CYAN}{AIM_FOV}{Style.RESET_ALL}") 379 | print(f" Cam FOV : {Fore.CYAN}{CAM_FOV}{Style.RESET_ALL}") 380 | if TRIGGERBOT.lower() != "disabled": 381 | print(f" Triggerbot : {Fore.GREEN}On{Style.RESET_ALL}") 382 | else: 383 | print(f" Triggerbot : {Fore.RED}Off{Style.RESET_ALL}") 384 | if TRIGGERBOT_DELAY != 0: 385 | print(f" Triggerbot Delay : {Fore.GREEN}{TRIGGERBOT_DELAY}{Style.RESET_ALL}") 386 | if SMOOTHENING != "disabled": 387 | print(f" Smoothening : {Fore.GREEN}On{Style.RESET_ALL}") 388 | print(f" Smoothening Factor : {Fore.CYAN}{SMOOTH_FACTOR}{Style.RESET_ALL}") 389 | else: 390 | print(f" Smoothening : {Fore.RED}Off{Style.RESET_ALL}") 391 | if TRIGGERBOT_DELAY != 0: 392 | print(f" Triggerbot Delay : {Fore.GREEN}{TRIGGERBOT_DELAY}{Style.RESET_ALL}") 393 | print( 394 | f" Aim Speed : {Fore.CYAN}X: {AIM_SPEED_X} Y: {AIM_SPEED_Y}{Style.RESET_ALL}" 395 | ) 396 | print( 397 | f" Aim Offset : {Fore.CYAN}X: {AIM_OFFSET_X} Y: {AIM_OFFSET_Y}{Style.RESET_ALL}" 398 | ) 399 | print( 400 | f" Aim Activated : {(Fore.GREEN if bot.aimtoggled else Fore.RED)}{bot.aimtoggled}{Style.RESET_ALL}" 401 | ) 402 | print(f" Enemy Color : {str(colorname + COLOR)}{Style.RESET_ALL}") 403 | print(" ======================") 404 | print( 405 | f"{Style.BRIGHT}{Fore.CYAN}" 406 | "\nJoin the Discord: discord.com/invite/K8gdWHthVw !\n" 407 | "If this isn't from github.com/Seconb/Roblox-Colorbot, it's not legit!" 408 | f"{Style.RESET_ALL}" 409 | ) 410 | except Exception as e: 411 | print("Error printing banner:", e) 412 | log_error(e) 413 | exit() 414 | 415 | if __name__ == "__main__": 416 | bot = trbot() 417 | root = tk.Tk() 418 | root.withdraw() 419 | system('mode con: cols=54 lines=30') 420 | 421 | if SHOW_FOV.lower() == "enabled": 422 | create_circle(CAM_FOV // 2, (CAM_FOV_COLOR), 255) 423 | create_circle(AIM_FOV // 2, (AIM_FOV_COLOR), 255) 424 | 425 | toggle_thread = Thread(target=bot.togglebot) 426 | toggle_thread.start() 427 | try: 428 | print_banner(bot) 429 | while True: 430 | root.update() 431 | if SWITCH_MODE_KEY != "disabled" and is_pressed(SWITCH_MODE_KEY): 432 | bot.modeswitch() 433 | print_banner(bot) 434 | if FOV_KEY_UP != "disabled" and is_pressed(FOV_KEY_UP): 435 | change_config_setting("AIM_FOV", AIM_FOV+5) 436 | print_banner(bot) 437 | if FOV_KEY_DOWN != "disabled" and is_pressed(FOV_KEY_DOWN): 438 | change_config_setting("AIM_FOV", AIM_FOV-5) 439 | print_banner(bot) 440 | if UPDATE_KEY != "disabled" and is_pressed(UPDATE_KEY): 441 | load() 442 | if SHOW_FOV.lower() == "enabled": 443 | root.destroy() 444 | root = tk.Tk() 445 | root.withdraw() 446 | create_circle(CAM_FOV // 2, (CAM_FOV_COLOR), 255) 447 | create_circle(AIM_FOV // 2, (AIM_FOV_COLOR), 255) 448 | bot.switchmode = TOGGLE_HOLD_MODE 449 | print_banner(bot) 450 | 451 | sleep(0.01) 452 | except Exception as e: 453 | print("An error occurred:", e) 454 | log_error(e) 455 | exit() 456 | -------------------------------------------------------------------------------- /config.txt: -------------------------------------------------------------------------------- 1 | [Config] 2 | 3 | # FULL CONFIG TUTORIAL: https://github.com/Seconb/Roblox-Colorbot/wiki/Config-Guide 4 | 5 | # Change to any key in keybind_list.txt 6 | AIM_KEY = Shift 7 | 8 | # Do you want the aimbot to toggle on and off, or only be active when you hold the aim key? The switch mode key below helps switch mods btw. 9 | TOGGLE_HOLD_MODE = toggle 10 | 11 | # Change these to any KEYBOARD key (no mouse buttons) 12 | SWITCH_MODE_KEY = F5 13 | UPDATE_KEY = F6 14 | FOV_KEY_UP = ctrl+] 15 | FOV_KEY_DOWN = ctrl+[ 16 | 17 | CAM_FOV = 90 18 | AIM_FOV = 70 19 | AIM_SPEED_X = 0.4 20 | AIM_SPEED_Y = 0.4 21 | AIM_OFFSET_X = 7 22 | AIM_OFFSET_Y = 10 23 | 24 | SMOOTHENING = disabled 25 | SMOOTH_FACTOR = 1 26 | 27 | TRIGGERBOT = disabled 28 | TRIGGERBOT_DELAY = 0 29 | TRIGGERBOT_DISTANCE = 10 30 | 31 | # Set the color of enemies to aim at. Yellow, Blue, Pink/Magenta/Purple, Green, Cyan, Red, Black, or Aimblox (for Arcade and Competitive only). 32 | COLOR = Pink 33 | # If you're playing Bad Business, use 0000ff with outline transparency set to 0. 34 | # Black is NOT recommended at all and sucks very bad. Red is also bad for Arsenal. 35 | 36 | # Get custom color from https://github.com/Seconb/Roblox-Colorbot/wiki/Custom-Color-Guide. Remember to change COLOR to custom. 37 | UPPER_COLOR = 0, 0, 0 38 | LOWER_COLOR = 0, 0, 0 39 | 40 | # Hides the menu (you can't see anything and have to use Task Manager to close Python) 41 | HIDE_CONSOLE = disabled 42 | 43 | # These colors specifically are RGB. Custom colors are HSV. 44 | SHOW_FOV = enabled 45 | CAM_FOV_COLOR = 0, 0, 255 46 | AIM_FOV_COLOR = 255, 0, 0 47 | 48 | # Bettercam is better, mss is less buggy. Change to mss if Bettercam is buggy. 49 | CAM_TYPE = bettercam 50 | -------------------------------------------------------------------------------- /installer.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | title Seconb Colorbot Installer! 3 | echo Installing requirements for the colorbot... make sure Python is downloaded and you checked "Add Python.exe to PATH" before installing! 4 | 5 | python.exe -m pip install -q --upgrade pip 6 | 7 | pip install -q keyboard configparser opencv-python numpy colorama pywin32 pygetwindow bettercam 8 | 9 | echo Requirements installed! If aimsource.py crashes, manually run "pip install keyboard mss configparser opencv-python numpy colorama pywin32 pygetwindow". 10 | pause 11 | -------------------------------------------------------------------------------- /keybind_list.txt: -------------------------------------------------------------------------------- 1 | Here is a list of all the working keybinds: 2 | 3 | Left Click 4 | Right Click 5 | Middle Click 6 | X1 # front side mouse button 7 | X2 # back side mouse button 8 | Backspace 9 | Tab 10 | Clear 11 | Enter 12 | Shift 13 | Ctrl 14 | Alt 15 | Pause 16 | Caps Lock 17 | Esc 18 | Spacebar 19 | Page Up 20 | Page Down 21 | End 22 | Home 23 | Left Arrow 24 | Up Arrow 25 | Right Arrow 26 | Down Arrow 27 | Select 28 | Print 29 | Execute 30 | Print Screen 31 | Ins 32 | Del 33 | Help 34 | 0 35 | 1 36 | 2 37 | 3 38 | 4 39 | 5 40 | 6 41 | 7 42 | 8 43 | 9 44 | A 45 | B 46 | C 47 | D 48 | E 49 | F 50 | G 51 | H 52 | I 53 | J 54 | K 55 | L 56 | M 57 | N 58 | O 59 | P 60 | Q 61 | R 62 | S 63 | T 64 | U 65 | V 66 | W 67 | X 68 | Y 69 | Z 70 | Left Windows 71 | Right Windows 72 | Applications 73 | Numeric keypad 0 74 | Numeric keypad 1 75 | Numeric keypad 2 76 | Numeric keypad 3 77 | Numeric keypad 4 78 | Numeric keypad 5 79 | Numeric keypad 6 80 | Numeric keypad 7 81 | Numeric keypad 8 82 | Numeric keypad 9 83 | Multiply 84 | Add 85 | Separator 86 | Subtract 87 | Decimal 88 | Divide 89 | F1 90 | F2 91 | F3 92 | F4 93 | F5 94 | F6 95 | F7 96 | F8 97 | F9 98 | F10 99 | F11 100 | F12 101 | Num Lock 102 | Scroll Lock 103 | Left Shift 104 | Right Shift 105 | Left Control 106 | Right Control 107 | Left Alt 108 | Right Alt -------------------------------------------------------------------------------- /keybinds.py: -------------------------------------------------------------------------------- 1 | # scroll down to the bottom to see the functions the dictionaries take a lot of lines 2 | 3 | hex_to_key = { 4 | 0x01: "Left Click", 5 | 0x02: "Right Click", 6 | 0x03: "Control-break processing", 7 | 0x04: "Middle mouse button", 8 | 0x05: "X1", 9 | 0x06: "X2", 10 | 0x08: "Backspace", 11 | 0x09: "Tab", 12 | 0x0C: "CLEAR", 13 | 0x0D: "ENTER", 14 | 0x10: "SHIFT", 15 | 0x11: "CTRL", 16 | 0x12: "ALT", 17 | 0x13: "PAUSE", 18 | 0x14: "CAPS LOCK", 19 | 0x1B: "ESC", 20 | 0x20: "SPACEBAR", 21 | 0x21: "PAGE UP", 22 | 0x22: "PAGE DOWN", 23 | 0x23: "END", 24 | 0x24: "HOME", 25 | 0x25: "LEFT ARROW", 26 | 0x26: "UP ARROW", 27 | 0x27: "RIGHT ARROW", 28 | 0x28: "DOWN ARROW", 29 | 0x29: "SELECT", 30 | 0x2A: "PRINT", 31 | 0x2B: "EXECUTE", 32 | 0x2C: "PRINT SCREEN", 33 | 0x2D: "INS", 34 | 0x2E: "DEL", 35 | 0x2F: "HELP", 36 | 0x30: "0", 37 | 0x31: "1", 38 | 0x32: "2", 39 | 0x33: "3", 40 | 0x34: "4", 41 | 0x35: "5", 42 | 0x36: "6", 43 | 0x37: "7", 44 | 0x38: "8", 45 | 0x39: "9", 46 | 0x41: "A", 47 | 0x42: "B", 48 | 0x43: "C", 49 | 0x44: "D", 50 | 0x45: "E", 51 | 0x46: "F", 52 | 0x47: "G", 53 | 0x48: "H", 54 | 0x49: "I", 55 | 0x4A: "J", 56 | 0x4B: "K", 57 | 0x4C: "L", 58 | 0x4D: "M", 59 | 0x4E: "N", 60 | 0x4F: "O", 61 | 0x50: "P", 62 | 0x51: "Q", 63 | 0x52: "R", 64 | 0x53: "S", 65 | 0x54: "T", 66 | 0x55: "U", 67 | 0x56: "V", 68 | 0x57: "W", 69 | 0x58: "X", 70 | 0x59: "Y", 71 | 0x5A: "Z", 72 | 0x5B: "Left Windows", 73 | 0x5C: "Right Windows", 74 | 0x5D: "Applications", 75 | 0x60: "Numeric keypad 0", 76 | 0x61: "Numeric keypad 1", 77 | 0x62: "Numeric keypad 2", 78 | 0x63: "Numeric keypad 3", 79 | 0x64: "Numeric keypad 4", 80 | 0x65: "Numeric keypad 5", 81 | 0x66: "Numeric keypad 6", 82 | 0x67: "Numeric keypad 7", 83 | 0x68: "Numeric keypad 8", 84 | 0x69: "Numeric keypad 9", 85 | 0x6A: "Multiply", 86 | 0x6B: "Add", 87 | 0x6C: "Separator", 88 | 0x6D: "Subtract", 89 | 0x6E: "Decimal", 90 | 0x6F: "Divide", 91 | 0x70: "F1", 92 | 0x71: "F2", 93 | 0x72: "F3", 94 | 0x73: "F4", 95 | 0x74: "F5", 96 | 0x75: "F6", 97 | 0x76: "F7", 98 | 0x77: "F8", 99 | 0x78: "F9", 100 | 0x79: "F10", 101 | 0x7A: "F11", 102 | 0x7B: "F12", 103 | 0x90: "NUM LOCK", 104 | 0x91: "SCROLL LOCK", 105 | 0xA0: "Left SHIFT", 106 | 0xA1: "Right SHIFT", 107 | 0xA2: "Left CONTROL", 108 | 0xA3: "Right CONTROL", 109 | 0xA4: "Left ALT", 110 | 0xA5: "Right ALT", 111 | } 112 | 113 | key_to_hex = { 114 | "Left Click": 0x01, 115 | "Right Click": 0x02, 116 | "Control-break processing": 0x03, 117 | "Middle mouse button": 0x04, 118 | "X1": 0x05, 119 | "X2": 0x06, 120 | "Backspace": 0x08, 121 | "Tab": 0x09, 122 | "CLEAR": 0x0C, 123 | "ENTER": 0x0D, 124 | "SHIFT": 0x10, 125 | "CTRL": 0x11, 126 | "ALT": 0x12, 127 | "PAUSE": 0x13, 128 | "CAPS LOCK": 0x14, 129 | "ESC": 0x1B, 130 | "SPACEBAR": 0x20, 131 | "PAGE UP": 0x21, 132 | "PAGE DOWN": 0x22, 133 | "END": 0x23, 134 | "HOME": 0x24, 135 | "LEFT ARROW": 0x25, 136 | "UP ARROW": 0x26, 137 | "RIGHT ARROW": 0x27, 138 | "DOWN ARROW": 0x28, 139 | "SELECT": 0x29, 140 | "PRINT": 0x2A, 141 | "EXECUTE": 0x2B, 142 | "PRINT SCREEN": 0x2C, 143 | "INS": 0x2D, 144 | "DEL": 0x2E, 145 | "HELP": 0x2F, 146 | "0": 0x30, 147 | "1": 0x31, 148 | "2": 0x32, 149 | "3": 0x33, 150 | "4": 0x34, 151 | "5": 0x35, 152 | "6": 0x36, 153 | "7": 0x37, 154 | "8": 0x38, 155 | "9": 0x39, 156 | "A": 0x41, 157 | "B": 0x42, 158 | "C": 0x43, 159 | "D": 0x44, 160 | "E": 0x45, 161 | "F": 0x46, 162 | "G": 0x47, 163 | "H": 0x48, 164 | "I": 0x49, 165 | "J": 0x4A, 166 | "K": 0x4B, 167 | "L": 0x4C, 168 | "M": 0x4D, 169 | "N": 0x4E, 170 | "O": 0x4F, 171 | "P": 0x50, 172 | "Q": 0x51, 173 | "R": 0x52, 174 | "S": 0x53, 175 | "T": 0x54, 176 | "U": 0x55, 177 | "V": 0x56, 178 | "W": 0x57, 179 | "X": 0x58, 180 | "Y": 0x59, 181 | "Z": 0x5A, 182 | "Left Windows": 0x5B, 183 | "Right Windows": 0x5C, 184 | "Applications": 0x5D, 185 | "Numeric keypad 0": 0x60, 186 | "Numeric keypad 1": 0x61, 187 | "Numeric keypad 2": 0x62, 188 | "Numeric keypad 3": 0x63, 189 | "Numeric keypad 4": 0x64, 190 | "Numeric keypad 5": 0x65, 191 | "Numeric keypad 6": 0x66, 192 | "Numeric keypad 7": 0x67, 193 | "Numeric keypad 8": 0x68, 194 | "Numeric keypad 9": 0x69, 195 | "Multiply": 0x6A, 196 | "Add": 0x6B, 197 | "Separator": 0x6C, 198 | "Subtract": 0x6D, 199 | "Decimal": 0x6E, 200 | "Divide": 0x6F, 201 | "F1": 0x70, 202 | "F2": 0x71, 203 | "F3": 0x72, 204 | "F4": 0x73, 205 | "F5": 0x74, 206 | "F6": 0x75, 207 | "F7": 0x76, 208 | "F8": 0x77, 209 | "F9": 0x78, 210 | "F10": 0x79, 211 | "F11": 0x7A, 212 | "F12": 0x7B, 213 | "NUM LOCK": 0x90, 214 | "SCROLL LOCK": 0x91, 215 | "Left SHIFT": 0xA0, 216 | "Right SHIFT": 0xA1, 217 | "Left Control": 0xA2, 218 | "Right Control": 0xA3, 219 | "Left Alt": 0xA4, 220 | "Right Alt": 0xA5, 221 | } 222 | 223 | 224 | def print_key(value): 225 | return hex_to_key.get(value, "Unknown Keybind") 226 | 227 | def get_keycode(keybind_description): 228 | for description, keycode in key_to_hex.items(): 229 | if str(description).lower() == str(keybind_description).lower(): 230 | return keycode 231 | return None 232 | -------------------------------------------------------------------------------- /version.txt: -------------------------------------------------------------------------------- 1 | v14 2 | --------------------------------------------------------------------------------