Доброго дня, если это день. Мне немного жаль тратить время на такие развлечения, как компьютерные игры, но иногда не могу отказать себе в удовольствии чуть-чуть пострелять в виртуальном пространстве. Одной из игр, которая находится в моем арсенале, является 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()

Вот и всё. Теперь можно запустить скрипт, включить помощника нажатием на горячую клавишу, и радоваться прибавке одного очка к реакции. К сожалению, бот имеет небольшое ограничение, так как процессы игры каким-то образом подавляют постоянную автосрельбу будто бы залипшей кнопкой мыши, поэтому после выстрела бота нужно сделать выстрел рукой, и дальше бот опять берет управление. Получается такая стрельба по очереди. Но даже так помощник со своей задачей очень неплохо справляется в ситуациях, когда противник в прицеле появляется слишком внезапно.

Кстати, у меня есть небольшое сообщество в телеграм, где люди делятся, в том числе, и автоматизацией всяких интересных штук.

Комментарии (17)


  1. GennPen
    08.06.2024 16:05
    +3

    Я смотрю, с античит системой в этой игре все печально, раз не ловят за такие простые кликеры. Во многих других играх за такое сразу прилетает.


    1. it_police Автор
      08.06.2024 16:05

      По моему ни в каких не прилетает. Это же совсем не чит, он не лезет в процессы, не меняет файлы, работает исключительно со стороны клиента, прямо как юзер. В CS2 с их VAC аналогично работает без проблем. Но и никакого особого преимущества он тоже не даёт. Так, небольшой помощник.


      1. Mapaxa864
        08.06.2024 16:05
        +6

        Это же совсем не чит

        Но и никакого особого преимущества он тоже не даёт. Так, небольшой помощник.

        Инста-шот - "Небольшой помощник". Ясно-понятно.


    1. SquareRootOfZero
      08.06.2024 16:05
      +1

      Да вроде ж уже даже специальные "читерские мыши" есть, камера смотрит в монитор, в нужные моменты посылает клик, к компьютеру подключена по USB как мышь, никакого дополнительного софта, чтобы его детектить античитом - мышь и мышь. Давай, лови. Тут уж просто совсем примитивный случай описан, даже распознавать ничего не надо - просто жди, пока нужный оттенок жёлтого окажется по центру экрана.


      1. qeeveex
        08.06.2024 16:05

        Встроенные в мышь макросы знаю, а про камеру нет. Можете скинуть пример такой мыши?


        1. SquareRootOfZero
          08.06.2024 16:05

          На ютубе попадалось, например, вот или вот. Не знаю, дошло ли что-то подобное до потребительского рынка - но до него, в конце концов, и обычные софтверные читы не то чтобы дошли - только в самых тайных комнатах самых секретных чатов в самых потаённых углах самых тёмных глубин даркнета и т. д. И с колёсиками, конечно, совсем необязательно было так угорать - куда проще сразу симулировать мышь прямо на микросхеме. Тут вон недавно была статья, как зарутовать смартфон и превратить его в "клавиатуру" - можно ж и в "мышь", и камера уже встроенная есть.


    1. madeuler
      08.06.2024 16:05
      +1

      Не прилетает, как раа-таки именно триггер и работает дольше всех читов


  1. smallTi
    08.06.2024 16:05
    +2

    Ну да, триггер бот это не чит. Также как и макросы чтоб без отдачи стрелять. Чисто помощь для тех, кто не умеет играть. Так и запишем)


  1. QerO
    08.06.2024 16:05
    +1

    [Где-то в мире киберпанка]
    -Вы на спортивный марафон отправили инвалида с киберпротезами вместо ног
    -Да это так, небольшой костыль-помощник для тех, кто не умеет ходить