Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

improved version and removed uneeded stuff. #18

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 1 addition & 37 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,37 +1 @@
# Valorant-Triggerbot
The fastest python triggerbot for Valorant.

## About
The reaction time of the bot is extremely fast as it is optimized for speed and only limited by your monitor refresh rate.

e.g. It will search 144 times per second on a 144hz monitor

## Features
- red or purple enemies
- auto counterstrafe
- hold or toggle modes
- any custom keybind
- auto install dependencies

## Preview
![Picture](https://i.ibb.co/N9cGj7J/preview.png)

## Usage
1. First run Unique.py to make the triggerbot file unique and avoid possibly getting banned.
1. Run prefire.py and follow the setup for first time usage.
2. Trigger key and mode are saved in config.txt.

### Get Python
If you dont have python installed, download the latest python version
and make sure you click on the 'ADD TO PATH' option during
the installation.

#### FAQ
Will I get banned using this?

- highly unlikely as long as you run Unique.py
- (I have not been banned in over 4 months of using this)

Why am I releasing this?

- I use another triggerbot I coded in c++ which is faster and better lol
Usage: python prefire.py [Hotkey to toggle the triggerbot] e.g home, alt [enemy highlight color] e.g red,purple,yellow [triggerbot mode] e.g hold, toggle (hold key is mouse4 or 5 i forgor)
27 changes: 0 additions & 27 deletions Unique.py

This file was deleted.

192 changes: 81 additions & 111 deletions prefire.py
Original file line number Diff line number Diff line change
@@ -1,136 +1,106 @@
from os import system, _exit
import argparse
import time
from ctypes import windll, WinDLL

system("mode 80,18 & title Prefire & powershell $H=get-host;$W=$H.ui.rawui;$B=$W.buffersize;$B.width=80;$B.height=9999;$W.buffersize=$B;")

from time import sleep, perf_counter
from ctypes import WinDLL


def exit_():
system("echo Press any key to exit . . . & pause >nul")
_exit(0)
import cv2
import numpy as np
import pyautogui
from keyboard import add_hotkey
from mss import mss

VK_XBUTTON1 = 0x05

ERROR = "\x1b[38;5;255m[\x1b[31m-\x1b[38;5;255m]"
SUCCESS = "\x1b[38;5;255m[\x1b[32m+\x1b[38;5;255m]"
INFO = "\x1b[38;5;255m[\x1b[35m*\x1b[38;5;255m]"

lower_ranges = {
"red": np.array([80, 80, 100]),
"purple": np.array([140, 110, 150]),
"yellow": np.array([30, 125, 150]),
}

upper_ranges = {
"red": np.array([130, 255, 255]),
"purple": np.array([150, 195, 255]),
"yellow": np.array([30, 255, 255]),
}

MOUSE_MOVEMENT_THRESHOLD = 5
WIDTH, HEIGHT = [windll.user32.GetSystemMetrics(0), windll.user32.GetSystemMetrics(1)]
ZONE = 3
GRAB_ZONE = (int(WIDTH / 2 - ZONE), int(HEIGHT / 2 - ZONE), int(WIDTH / 2 + ZONE), int(HEIGHT / 2 + ZONE))
monitor = {"top": GRAB_ZONE[1], "left": GRAB_ZONE[0], "width": GRAB_ZONE[2] - GRAB_ZONE[0], "height": GRAB_ZONE[3] - GRAB_ZONE[1]}

try:
from PIL.Image import frombytes
from mss import mss
from keyboard import is_pressed, add_hotkey, block_key, unblock_key
except ModuleNotFoundError:
print(f"{INFO} Installing required modules.")
o = system("pip3 install keyboard mss pillow --quiet --no-warn-script-location --disable-pip-version-check")


try:
TRIGGER, HIGHLIGHT = [line.strip() for line in open("config.txt")]
print(f"{SUCCESS} Hotkey: {TRIGGER}\n{SUCCESS} Enemy highlight colour: {HIGHLIGHT}\n")
except (FileNotFoundError, ValueError):
print(f"{ERROR} Missing or invalid config.txt\n")
HIGHLIGHT = input(f"{INFO} Enemy highlight colour\n\n[\x1b[35m1\x1b[38;5;255m] Red (default)\n[\x1b[35m2\x1b[38;5;255m] Purple\n\n> ")
if HIGHLIGHT not in ["1", "2"]:
print(f"{ERROR} Choose 1 or 2 retard.\n")
exit_()
if HIGHLIGHT == "1":
HIGHLIGHT = "red"
elif HIGHLIGHT == "2":
HIGHLIGHT = "purple"
print(f"\n{SUCCESS} Wrote enemy highlight colour to config.txt\n{INFO} Now write your hotkey in config.txt\n")
with open("config.txt", "w") as f:
f.write(f"Replace this first line with your hotkey. e.g. c or ` or even ctrl + alt + z\n{HIGHLIGHT}")
exit_()


if HIGHLIGHT == "red":
R, G, B = (152, 20, 37)
elif HIGHLIGHT == "purple":
R, G, B = (250, 100, 250)

MODE = input(f"{INFO} Mode\n\n[\x1b[35m1\x1b[38;5;255m] Hold\n[\x1b[35m2\x1b[38;5;255m] Toggle\n\n> ")
if MODE not in ["1", "2"]:
print(f"{ERROR} Choose 1 or 2 retard.\n")
exit_()


user32, kernel32, shcore = WinDLL("user32", use_last_error=True), WinDLL("kernel32", use_last_error=True), WinDLL("shcore", use_last_error=True)

shcore = WinDLL("shcore", use_last_error=True)
shcore.SetProcessDpiAwareness(2)
WIDTH, HEIGHT = [user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)]

TOLERANCE, ZONE = 20, 5
GRAB_ZONE = (int(WIDTH / 2 - ZONE), int(HEIGHT / 2 - ZONE), int(WIDTH / 2 + ZONE), int(HEIGHT / 2 + ZONE))


class PopOff:
def __init__(self):
def __init__(self, trigger, highlight, mode):
self.prev_pos = np.array(pyautogui.position())
self.active = False
self.trigger = trigger
self.highlight = highlight
self.mode = mode
self.sct = mss()

kernel32 = WinDLL("kernel32", use_last_error=True)
kernel32.Beep(440, 75), kernel32.Beep(200, 100)

def switch(self):
self.active = not self.active
kernel32 = WinDLL("kernel32", use_last_error=True)
kernel32.Beep(440, 75), kernel32.Beep(700, 100) if self.active else kernel32.Beep(440, 75), kernel32.Beep(200, 100)

def search(self):
start_time = perf_counter()
with mss() as sct:
img = sct.grab(GRAB_ZONE)
pmap = frombytes("RGB", img.size, img.bgra, "raw", "BGRX")
for x in range(0, ZONE * 2):
for y in range(0, ZONE * 2):
r, g, b = pmap.getpixel((x, y))
if R - TOLERANCE < r < R + TOLERANCE and G - TOLERANCE < g < G + TOLERANCE and B - TOLERANCE < b < B + TOLERANCE:
print(f"\x1b[2A{SUCCESS} Reaction time: {int((perf_counter() - start_time) * 1000)}ms")
blocked, held = [], []
if any(user32.GetKeyState(k) > 1 for k in [87, 65, 83, 68]):
if is_pressed("a"):
block_key(30)
blocked.append(30)
user32.keybd_event(68, 0, 0, 0)
held.append(68)
if is_pressed("d"):
block_key(32)
blocked.append(32)
user32.keybd_event(65, 0, 0, 0)
held.append(65)
if is_pressed("w"):
block_key(17)
blocked.append(17)
user32.keybd_event(83, 0, 0, 0)
held.append(83)
if is_pressed("s"):
block_key(31)
blocked.append(31)
user32.keybd_event(87, 0, 0, 0)
held.append(87)
sleep(0.1)
user32.mouse_event(2, 0, 0, 0, 0)
sleep(0.005)
user32.mouse_event(4, 0, 0, 0, 0)
for b in blocked:
unblock_key(b)
for h in held:
user32.keybd_event(h, 0, 2, 0)
break
def get_key_state(self, v_key: int) -> bool:
return bool(windll.user32.GetKeyState(v_key) & 0x80)

def search(self, pmap, mask):
start_time = time.perf_counter_ns()

# Check if the mouse is moving
current_pos = np.array(pyautogui.position())
distance = np.linalg.norm(current_pos - self.prev_pos)
if distance > MOUSE_MOVEMENT_THRESHOLD:
self.prev_pos = current_pos
return

# Shoot if the player is standing still and a pixel is detected
if np.any(mask) and distance <= MOUSE_MOVEMENT_THRESHOLD:
print(f"\x1b[2A{SUCCESS} Reaction time: {(time.perf_counter_ns() - start_time) // 1000000}ms")
pyautogui.FAILSAFE = False
# click
pyautogui.mouseDown()
pyautogui.mouseUp()

def hold(self):
while 1:
if is_pressed(TRIGGER):
while is_pressed(TRIGGER):
self.search()
else:
sleep(0.1)
while True:
img = np.array(self.sct.grab(monitor))
pmap = cv2.cvtColor(img[..., :3], cv2.COLOR_BGR2HSV)
mask = cv2.inRange(pmap, lower_ranges[self.highlight], upper_ranges[self.highlight])

# if mouse4 of the mouse is held down use pynput
if self.get_key_state(VK_XBUTTON1):
self.search(pmap, mask)

def toggle(self):
add_hotkey(TRIGGER, self.switch)
while 1:
self.search() if self.active else sleep(0.5)
add_hotkey(self.trigger, self.switch)

while True:
img = np.array(self.sct.grab(monitor))
pmap = cv2.cvtColor(img[..., :3], cv2.COLOR_BGR2HSV)

if self.active:
mask = cv2.inRange(pmap, lower_ranges[self.highlight], upper_ranges[self.highlight])
self.search(pmap, mask)


if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Valorant Triggerbot")
parser.add_argument("trigger", help="Hotkey to toggle the triggerbot")
parser.add_argument("highlight", choices=["red", "purple", "yellow"], help="Enemy highlight color")
parser.add_argument("mode", choices=["hold", "toggle"], help="Triggerbot mode")
args = parser.parse_args()

o = system("cls")
if MODE == "1":
PopOff().hold()
elif MODE == "2":
PopOff().toggle()
PopOff(args.trigger, args.highlight, args.mode).hold() if args.mode == "hold" else PopOff(args.trigger, args.highlight, args.mode).toggle()