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


-- УПРАВЛЕНИЕ
-- Нажми №4 перед стрельбой или во время удержания ЛКМ.
-- После запуска боковую можно отпустить.
-- Отпустил ЛКМ — помощь закончилась.
--
-- При отпущенной ЛКМ:
-- Shift + №4        = увеличить силу
-- Ctrl + №4         = уменьшить силу
-- Shift + Ctrl + №4 = вернуть исходную силу

-- ===== НАСТРОЙКИ =====

local sideButton = 5
local startWindowMs = 400 -- Сколько мс ждать ЛКМ после нажатия №4

local startStep = 6
local endStep = 17
local rampMs = 1300
local delayMs = 7
local horizontalStep = 0
local smoothRamp = true

local defaultPower = 100
local powerStep = 5
local minPower = 50
local maxPower = 200

-- Включи true для проверки запусков в журнале G HUB
local debugLog = false

-- ===== ДАЛЬШЕ МЕНЯТЬ НЕ НУЖНО =====

local power = defaultPower
local pendingUntil = nil

local function SetPower(value, label)
    power = math.max(minPower, math.min(maxPower, value))
    OutputLogMessage(
        "%s | POWER: %d%% | START: %.2f | END: %.2f\n",
        label, power,
        startStep * power / 100,
        endStep * power / 100
    )
end

function OnEvent(event, arg)
    if event == "PROFILE_ACTIVATED" then
        EnablePrimaryMouseButtonEvents(true)
        pendingUntil = nil
        SetPower(defaultPower, "READY")
        return
    end

    if event == "PROFILE_DEACTIVATED" then
        pendingUntil = nil
        return
    end

    if event ~= "MOUSE_BUTTON_PRESSED" then return end
    if arg ~= 1 and arg ~= sideButton then return end

    local now = GetRunningTime()
    local leftHeld = IsMouseButtonPressed(1)
    local shouldStart = false

    if arg == sideButton then
        -- Регулировка силы при отпущенной ЛКМ
        if not leftHeld then
            local shift = IsModifierPressed("shift")
            local ctrl = IsModifierPressed("ctrl")

            if shift or ctrl then
                pendingUntil = nil

                if shift and ctrl then
                    SetPower(defaultPower, "RESET")
                elseif shift then
                    SetPower(power + powerStep, "UP")
                else
                    SetPower(power - powerStep, "DOWN")
                end
                return
            end
        end

        if leftHeld then
            -- Событие нажатия №4 уже получено:
            -- удерживать боковую для запуска не требуется
            shouldStart = true
        else
            -- Коротко запоминаем нажатие перед стрельбой
            pendingUntil = now + math.max(startWindowMs, 0)
            if debugLog then OutputLogMessage("WAIT LMB\n") end
            return
        end

    elseif arg == 1 then
        local recentSidePress =
            pendingUntil ~= nil and now <= pendingUntil

        shouldStart = recentSidePress
            or IsMouseButtonPressed(sideButton)

        -- Ожидание расходуется на это нажатие ЛКМ
        pendingUntil = nil
    end

    if not shouldStart or not IsMouseButtonPressed(1) then
        return
    end

    pendingUntil = nil
    if debugLog then OutputLogMessage("START\n") end

    local startedAt = GetRunningTime()
    local remainder = 0

    -- После запуска удерживать нужно только ЛКМ
    while IsMouseButtonPressed(1) do
        local progress = math.min(
            (GetRunningTime() - startedAt) / math.max(rampMs, 1), 1
        )

        local step = startStep + (endStep - startStep) * progress
        if not smoothRamp then step = math.floor(step) end

        local movement = step * power / 100 + remainder
        local wholeStep = math.floor(movement)
        remainder = movement - wholeStep

        MoveMouseRelative(horizontalStep, wholeStep)

        local pauseStarted = GetRunningTime()
        repeat
            if not IsMouseButtonPressed(1) then break end
            Sleep(1)
        until GetRunningTime() - pauseStarted >= math.max(delayMs, 1)
    end

    if debugLog then OutputLogMessage("STOP\n") end
end