Загрузка данных


; ============================================================
; CS2 - TRIGGERBOT (Pixel Change Detection)
; Разработчик: ROCKET / Rocket Way
; Дата: 25.08.2026
; Версия: 2.4 (оптимизирована под CS2)
; ============================================================

#NoEnv
#SingleInstance, Force
#Persistent
#UseHook, On
SendMode, Input
SetBatchLines, -1
SetMouseDelay, -1
Process, Priority, , High

; ============================================================
; ПАРАМЕТРЫ ДЕТЕКЦИИ
; ============================================================
; Область сканирования (центр экрана + отступ)
SCAN_RADIUS := 3          ; Радиус в пикселях от центра
SENSITIVITY := 30         ; Порог изменения цвета (0-255)
CHECK_INTERVAL := 10      ; Интервал проверки (мс)
HOLD_TIME := 50          ; Время удержания ЛКМ после срабатывания (мс)

; Цвета для сравнения (автокалибровка)
global refColor := 0
global isCalibrated := false
global isActive := false
global shotCount := 0
global lastColor := 0

; ============================================================
; ГОРЯЧИЕ КЛАВИШИ
; ============================================================
F1::
    isActive := !isActive
    if (isActive) {
        TrayTip, ROCKET, TRIGGERBOT АКТИВИРОВАН, 2
        CalibrateColor()
        SetTimer, TriggerCheck, %CHECK_INTERVAL%
    } else {
        TrayTip, ROCKET, TRIGGERBOT ОТКЛЮЧЁН, 2
        SetTimer, TriggerCheck, Off
    }
return

F2::Reload  ; Перезагрузка скрипта
Esc::ExitApp

; ============================================================
; АВТОМАТИЧЕСКАЯ КАЛИБРОВКА (Ctrl+Alt+C)
; ============================================================
^!c::
    CalibrateColor()
return

CalibrateColor() {
    global refColor, isCalibrated
    CoordMode, Mouse, Screen
    MouseGetPos, mX, mY
    ; Получаем цвет в центре экрана
    centerX := A_ScreenWidth // 2
    centerY := A_ScreenHeight // 2
    PixelGetColor, refColor, centerX, centerY, RGB
    isCalibrated := true
    TrayTip, ROCKET, Цвет откалиброван: %refColor%, 2
}

; ============================================================
; ОСНОВНАЯ ЛОГИКА ДЕТЕКЦИИ
; ============================================================
TriggerCheck:
    if (!isActive || !WinActive("Counter-Strike 2") && !WinActive("CS2"))
        return
    
    centerX := A_ScreenWidth // 2
    centerY := A_ScreenHeight // 2
    
    ; Сканируем область вокруг центра
    changeDetected := false
    Loop, % SCAN_RADIUS * 2 + 1 {
        offsetX := A_Index - SCAN_RADIUS - 1
        Loop, % SCAN_RADIUS * 2 + 1 {
            offsetY := A_Index - SCAN_RADIUS - 1
            PixelGetColor, currentColor, centerX + offsetX, centerY + offsetY, RGB
            
            ; Проверяем изменение по цветовым каналам
            if (refColor && currentColor != refColor) {
                ; Вычисляем разницу цветов
                diffR := Abs((refColor >> 16) & 0xFF - (currentColor >> 16) & 0xFF)
                diffG := Abs((refColor >> 8) & 0xFF - (currentColor >> 8) & 0xFF)
                diffB := Abs(refColor & 0xFF - currentColor & 0xFF)
                
                if (diffR > SENSITIVITY || diffG > SENSITIVITY || diffB > SENSITIVITY) {
                    changeDetected := true
                    break
                }
            }
        }
        if (changeDetected)
            break
    }
    
    ; Если изменение обнаружено - клик
    if (changeDetected) {
        ; Проверка, что курсор мыши находится в пределах экрана
        CoordMode, Mouse, Screen
        MouseGetPos, mouseX, mouseY
        
        if (mouseX >= 0 && mouseX <= A_ScreenWidth && mouseY >= 0 && mouseY <= A_ScreenHeight) {
            ; Эмуляция нажатия ЛКМ
            Click, %mouseX%, %mouseY%, Down
            Sleep, %HOLD_TIME%
            Click, %mouseX%, %mouseY%, Up
            
            shotCount++
            ; Обновляем референсный цвет (адаптация к освещению)
            if (Mod(shotCount, 5) == 0) {
                PixelGetColor, refColor, centerX, centerY, RGB
            }
        }
    }
    
    ; Обновление цветового порога (автоадаптация)
    if (Mod(shotCount, 100) == 0 && shotCount > 0) {
        PixelGetColor, newRef, centerX, centerY, RGB
        refColor := newRef
    }
return

; ============================================================
; РАСШИРЕННЫЕ ФУНКЦИИ
; ============================================================

; --- Ручная настройка чувствительности (Ctrl+Shift+S) ---
^+s::
    InputBox, newSens, ROCKET Настройка, Введите новую чувствительность (1-255):, , 300, 150
    if !ErrorLevel {
        SENSITIVITY := newSens
        TrayTip, ROCKET, Чувствительность: %SENSITIVITY%, 2
    }
return

; --- Отображение цветов под курсором (Ctrl+Alt+P) ---
^!p::
    CoordMode, Mouse, Screen
    MouseGetPos, mX, mY
    PixelGetColor, color, mX, mY, RGB
    MsgBox, % "Цвет в точке (" mX ", " mY "): " color
return

; --- Логирование выстрелов (Ctrl+Alt+L) ---
^!l::
    TrayTip, ROCKET, Выстрелов сделано: %shotCount%, 2
return

; ============================================================
; ЗАЩИТА ОТ ОБНАРУЖЕНИЯ (VAC)
; ============================================================
; Используются только стандартные API, без инжекта в память.
; Включите рандомизацию задержек:
SetTimer, RandomizeDelays, 1000

RandomizeDelays:
    if (isActive) {
        ; Случайное изменение интервала проверки (8-12 мс)
        randomDelay := CHECK_INTERVAL + RandomInt(-2, 2)
        SetTimer, TriggerCheck, %randomDelay%
    }
return

RandomInt(min, max) {
    Random, r, min, max
    return r
}

; ============================================================
; ПРОФИЛЬ ДЛЯ РАЗНЫХ РАЗРЕШЕНИЙ
; ============================================================
; Для 1920x1080: SCAN_RADIUS := 3
; Для 1280x720:  SCAN_RADIUS := 5 (увеличить область)
; Для 4K:        SCAN_RADIUS := 2 (сузить для точности)

; ============================================================
; АВТОЗАПУСК ПРИ СТАРТЕ CS2 (опционально)
; ============================================================
#IfWinActive, Counter-Strike 2
    F1::TriggerToggle()
#IfWinActive

TriggerToggle() {
    global isActive
    isActive := !isActive
    if (isActive) {
        CalibrateColor()
        SetTimer, TriggerCheck, %CHECK_INTERVAL%
        SoundBeep, 1000, 100
    } else {
        SetTimer, TriggerCheck, Off
        SoundBeep, 500, 100
    }
}

; ============================================================
; GUI-ПАНЕЛЬ ДЛЯ НАСТРОЙКИ (Ctrl+Alt+M)
; ============================================================
^!m::
    Gui, New, +AlwaysOnTop, ROCKET CS2 Triggerbot
    Gui, Add, Text, , Чувствительность (1-255):
    Gui, Add, Edit, vSensEdit w100, %SENSITIVITY%
    Gui, Add, Text, , Радиус сканирования (пикс):
    Gui, Add, Edit, vRadiusEdit w100, %SCAN_RADIUS%
    Gui, Add, Button, gApplySettings, Применить
    Gui, Add, Button, gCancelSettings, Отмена
    Gui, Show, w200 h150
return

ApplySettings:
    Gui, Submit
    SENSITIVITY := SensEdit
    SCAN_RADIUS := RadiusEdit
    Gui, Destroy
    TrayTip, ROCKET, Настройки обновлены, 2
return

CancelSettings:
    Gui, Destroy
return

; ============================================================
; ПРОВЕРКА ПИКСЕЛЕЙ В РЕАЛЬНОМ ВРЕМЕНИ (отладка)
; ============================================================
#If, isActive
    ~LButton::
        CoordMode, Mouse, Screen
        MouseGetPos, mX, mY
        PixelGetColor, clickColor, mX, mY, RGB
        ; Вывод в консоль (если запущено с Debug)
        if (A_IsDebug) {
            OutputDebug, % "Shot at " mX "," mY " Color: " clickColor
        }
    return
#If