Загрузка данных
#Requires AutoHotkey v2.0
#SingleInstance Force
; ============================================================
; НАСТРОЙКИ — ИЗМЕНЯТЬ В ПЕРВУЮ ОЧЕРЕДЬ ЗДЕСЬ
; ============================================================
; ----- ОБЛАСТЬ ПОИСКА ЗЕЛЁНОГО ЦВЕТА -----
; X1/Y1 — левый верхний угол области
; X2/Y2 — правый нижний угол области
;
; !!! ПОМЕНЯЙ ЭТИ 4 КООРДИНАТЫ ПОД СВОЙ ЭКРАН !!!
SearchX1 := 500
SearchY1 := 300
SearchX2 := 1400
SearchY2 := 800
; ----- ЗЕЛЁНЫЙ ЦВЕТ -----
; Укажи здесь HEX-код нужного зелёного цвета.
;
; Например:
; 0x00FF00 = чистый зелёный
;
; Если твой цвет, например, #35C95A,
; нужно написать:
; GreenColor := 0x35C95A
;
; !!! ПОМЕНЯЙ ЭТО ЗНАЧЕНИЕ !!!
GreenColor := 0x00FF00
; ----- БЕЛЫЙ ЦВЕТ -----
; Цвет, который появляется после изменения зелёного.
;
; 0xFFFFFF = чистый белый
;
; Если используется другой оттенок белого,
; поменяй это значение.
;
; !!! ПОМЕНЯЙ ПРИ НЕОБХОДИМОСТИ !!!
WhiteColor := 0xFFFFFF
; ----- ДОПУСК ЦВЕТА -----
; Чем больше число, тем больше оттенков цвета
; будет считаться подходящими.
;
; 0 = практически точное совпадение
; 10 = небольшой допуск
; 30 = большой допуск
;
; Если цвет немного отличается из-за сглаживания,
; попробуй 10–30.
ColorTolerance := 20
; ----- КОЛИЧЕСТВО КРУГОВ ДО НАЖАТИЯ B -----
RoundsBeforeB := 10
; ----- ПАУЗА ПОСЛЕ НАЖАТИЯ E -----
; Время в миллисекундах.
;
; Увеличь, если после E объект появляется
; не сразу.
DelayAfterE := 100
; ----- ПАУЗА ПОСЛЕ НАЖАТИЯ SPACE -----
; Нужна для защиты от повторного срабатывания.
DelayAfterSpace := 100
; ----- ИНТЕРВАЛ ПРОВЕРКИ ПИКСЕЛЯ -----
; Чем меньше число — тем чаще проверка.
;
; 5 = очень быстро
; 10 = обычно достаточно
; 20 = медленнее
CheckInterval := 10
; ============================================================
; ПЕРЕМЕННЫЕ
; ============================================================
Running := false
Paused := false
RoundCount := 0
TrackedX := 0
TrackedY := 0
; ============================================================
; F7 — ЗАПУСК
; ============================================================
F7::
{
global Running, Paused, RoundCount
; Если скрипт уже работает — ничего не делаем
if Running
return
Running := true
Paused := false
RoundCount := 0
; Запускаем основной цикл
SetTimer(MainLoop, 10)
ToolTip("СКРИПТ ЗАПУЩЕН")
SetTimer(() => ToolTip(), -1000)
}
; ============================================================
; F8 — ПАУЗА / ПРОДОЛЖЕНИЕ
; ============================================================
F8::
{
global Running, Paused
; Если скрипт не запущен — ничего не делаем
if !Running
return
Paused := !Paused
if Paused
ToolTip("ПАУЗА")
else
ToolTip("ПРОДОЛЖЕНИЕ")
SetTimer(() => ToolTip(), -1000)
}
; ============================================================
; F9 — ПОЛНОЕ ВЫКЛЮЧЕНИЕ
; ============================================================
F9::
{
global Running
Running := false
; Останавливаем основной цикл
SetTimer(MainLoop, 0)
ToolTip("СКРИПТ ВЫКЛЮЧЕН")
SetTimer(() => ToolTip(), -1000)
}
; ============================================================
; ОСНОВНОЙ ЦИКЛ
; ============================================================
MainLoop()
{
global Running
global Paused
global RoundCount
global TrackedX
global TrackedY
global SearchX1
global SearchY1
global SearchX2
global SearchY2
global GreenColor
global WhiteColor
global ColorTolerance
global DelayAfterE
global DelayAfterSpace
global RoundsBeforeB
; --------------------------------------------------------
; Если скрипт выключен — ничего не делаем
; --------------------------------------------------------
if !Running
return
; --------------------------------------------------------
; Если стоит пауза — ничего не делаем
; --------------------------------------------------------
if Paused
return
; --------------------------------------------------------
; ЭТАП 1
; Нажимаем E
; --------------------------------------------------------
Send("e")
; Ждём появления объекта
Sleep(DelayAfterE)
; --------------------------------------------------------
; ЭТАП 2
; Ищем зелёный пиксель
; --------------------------------------------------------
try
{
Found := PixelSearch(
&FoundX,
&FoundY,
SearchX1,
SearchY1,
SearchX2,
SearchY2,
GreenColor,
ColorTolerance
)
}
catch
{
return
}
; --------------------------------------------------------
; Если зелёный найден
; --------------------------------------------------------
if Found
{
; Запоминаем координату найденного зелёного пикселя
TrackedX := FoundX
TrackedY := FoundY
; ----------------------------------------------------
; ЭТАП 3
; Следим за этим пикселем,
; пока зелёный не превратится в белый
; ----------------------------------------------------
Loop
{
; Если нажали F9
if !Running
return
; Если нажали F8 — ждём снятия паузы
while Paused
{
if !Running
return
Sleep(50)
}
; Получаем текущий цвет запомненного пикселя
CurrentColor := PixelGetColor(
TrackedX,
TrackedY,
"RGB"
)
; ------------------------------------------------
; Проверяем, стал ли пиксель белым
; ------------------------------------------------
if IsColorMatch(
CurrentColor,
WhiteColor,
ColorTolerance
)
{
; --------------------------------------------
; ЗЕЛЁНЫЙ → БЕЛЫЙ
; Нажимаем SPACE
; --------------------------------------------
Send("{Space}")
; Увеличиваем количество завершённых кругов
RoundCount++
; Небольшая задержка
Sleep(DelayAfterSpace)
; --------------------------------------------
; Проверяем, достигли ли 10 кругов
; --------------------------------------------
if RoundCount >= RoundsBeforeB
{
; Нажимаем B
Send("b")
; Обнуляем счётчик
RoundCount := 0
; Небольшая задержка после B
Sleep(DelayAfterSpace)
}
; Этот круг завершён
break
}
; Частота проверки пикселя
Sleep(CheckInterval)
}
}
; --------------------------------------------------------
; Если зелёный не найден — через следующий тик
; снова будет выполнен E и поиск
; --------------------------------------------------------
return
}
; ============================================================
; ФУНКЦИЯ ПРОВЕРКИ ЦВЕТА
; ============================================================
IsColorMatch(Color1, Color2, Tolerance)
{
; Получаем RGB первого цвета
R1 := (Color1 >> 16) & 0xFF
G1 := (Color1 >> 8) & 0xFF
B1 := Color1 & 0xFF
; Получаем RGB второго цвета
R2 := (Color2 >> 16) & 0xFF
G2 := (Color2 >> 8) & 0xFF
B2 := Color2 & 0xFF
; Сравниваем каждый канал RGB
return (
Abs(R1 - R2) <= Tolerance
&& Abs(G1 - G2) <= Tolerance
&& Abs(B1 - B2) <= Tolerance
)
}