Триггербот для Rainbow Six Siege на Python
Доброго дня, если это день. Мне немного жаль тратить время на такие развлечения, как компьютерные игры, но иногда не могу отказать себе в удовольствии чуть-чуть пострелять в виртуальном пространстве. Одной из игр, которая находится в моем арсенале, является Rainbow Six Siege, онлайн шутер с элементами тактико-специальной подготовки.
Одной из "фишек" игры являются индивидуальные умения оперативников. Например, российский оперативник GLAZ является снайпером, а на его винтовке установлена оптика с умным тепловизором, который окрашивает силуэт противника в ярко-желтый цвет, так что промахнуться достаточно тяжело, как думают многие новички.
На практике же те, кто выбирает этого оперативника, часто не имеют достаточной реакции, чтобы сделать выстрел, как только противник показался в прицеле. И вот эту проблему отчасти можно решить с помощью помощника, написанного за 5 минут на Python.
Хотелось бы сразу отметить, что читерство я исключительно осуждаю, но помощник к запрещенному софту не имеет никакого отношения, это всего лишь небольшой костыль для тех, кто плохо ходит, и не более того. Статья носит развлекательный характер в целях популяризации программирования, опытные же разработчики вряд ли почерпнут из нее что-то новое.
И так, рассмотрим механику игры, которую можно автоматизировать. На мой взгляд самое очевидное решение, это написать программу, которая будет делать клик мышью сразу, как только в перекрестии прицела появится ярко-желтый цвет. Этим и займемся.
Нам понадобятся три библиотеки.
import pyautogui
import keyboard
import time
Первая будет брать управление мышью, а точнее отвечать за клик. Вторая нужна для назначения горячей клавиши, чтобы включать и отключать бота по желанию. И третья нужна для временной задержки между циклами.
Следующая строчка отключает fail-safe механизм библиотеки pyautogui, что делать не рекомендуется. Но в связи с особенностями игры сделать это придется, чтобы бот не вылетал произвольно, когда мы этого совсем не ждем.
pyautogui.FAILSAFE = False
Теперь назначим две переменные: work будет участвовать в функции-переключателе, которая будет включать и отключать работу бота. А trigger будет содержать координаты пикселя, на цвет которого и будет реагировать наша программа.
work = False
trigger = tuple()
Так как перекрестие прицела оперативника находится ровно в середине экрана, то триггером будет область, выше перекрестия на три пикселя, так как само перекрестие имеет всегда один цвет.
Напишем для вычисления координат соответствующую функцию.
def trigger_position() -> None:
global trigger
# Вычисление координат центра экрана
screen_width, screen_height = pyautogui.size()
x = screen_width // 2
y = screen_height // 2
trigger = (x, y-3)
Теперь напишем функцию-переключатель, которая просто будет менять значение переменной worker на противоположное, и писать в консоль, в каком состоянии сейчас находится бот.
def change_clicker() -> None:
global work
work = not work
if work:
print('Кликер включен!', end='\r')
else:
print('Кликер выключен!', end='\r')
И функцию, отвечающую за клик мышью в случае, если триггер окрашен в цвет, соответствующий нужным условиям.
def clicker(trigger):
screenshot = pyautogui.screenshot()
red, green, blue = screenshot.getpixel(trigger)
if red in range(190, 220) and green > 190 and blue > 30:
pyautogui.click()
С помощью функции screenshot(), как можно догадаться, делается именно скриншот, после чего методом getpixel() программа получает цвет пикселя по координатам trigger. Метод возвращает кортеж из трех чисел, каждое из которых отвечает за свой цвет по системе RGB, то есть red, green и blue. Поэтому распаковываем его в переменные с соответствующими названиями. И дальше ставим условие, что красный должен находится в диапазоне от 190 до 220, зеленый быть больше 190, а синий более 30. Этот диапазон я определил методом тыка, возможно его стоит улучшить. А пока клик мышью делается как только цвет отслеживаемого пикселя будет соответствовать этому диапазону цветов.
Теперь нужна основная функция с бесконечным циклом, которая будет управлять работой функции кликера.
def main():
keyboard.add_hotkey('`', change_clicker)
try:
while True:
if work:
clicker(trigger)
time.sleep(0.0001)
except KeyboardInterrupt:
print('\nВыход из программы')
Вот тут нам и понадобилась библиотека keyboard, с помощью которой была назначена горячая клавиша (тильда). При нажатии на нее вызывается функция change_clicker, изменяющая значение переменной worker. И если worker равен False, функция clicker() в цикле перестает вызываться. И наоборот.
Последними строчками нужно прописать порядок запуска, так как для определения координат триггера сначала должна быть запущена функция trigger_position(), а потом уже main().
if __name__ == '__main__':
trigger_position()
main()
Вот и всё. Теперь можно запустить скрипт, включить помощника нажатием на горячую клавишу, и радоваться прибавке одного очка к реакции. К сожалению, бот имеет небольшое ограничение, так как процессы игры каким-то образом подавляют постоянную автосрельбу будто бы залипшей кнопкой мыши, поэтому после выстрела бота нужно сделать выстрел рукой, и дальше бот опять берет управление. Получается такая стрельба по очереди. Но даже так помощник со своей задачей очень неплохо справляется в ситуациях, когда противник в прицеле появляется слишком внезапно.
Кстати, у меня есть небольшое сообщество в телеграм, где люди делятся, в том числе, и автоматизацией всяких интересных штук.