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


-- КАК ПОЛЬЗОВАТЬСЯ
-- Нажатие №4 добавляет время работы помощи.
-- Пока время осталось, ЛКМ запускает компенсацию.
-- Каждая очередь начинает усиление заново.
-- Если время истекло во время очереди:
-- помощь продолжается до отпускания ЛКМ.
--
-- При отпущенной ЛКМ:
-- Shift + №4        = увеличить силу.
-- Ctrl + №4         = уменьшить силу.
-- Shift + Ctrl + №4 = вернуть исходную силу.
-- Эти сочетания время не добавляют.

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

local sideButton = 5
local addSeconds = 5      -- Сколько секунд добавляет одно нажатие

local startStep = 3       -- Шаг вниз в начале очереди
local endStep = 9         -- Шаг вниз после усиления
local rampMs = 1200       -- Время усиления, мс
local delayMs = 7         -- Пауза между движениями, мс
local horizontalStep = 0  -- 0 = без сдвига; 1 = вправо
local smoothRamp = true   -- Плавное усиление

local defaultPower = 100  -- Исходная сила, %
local powerStep = 5       -- Шаг изменения силы
local minPower = 50
local maxPower = 200

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

local power = defaultPower
local activeUntil = 0
local sideWasDown = false

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

local function AddTime()
    local now = GetRunningTime()
    activeUntil = math.max(now, activeUntil)
        + math.max(addSeconds, 0) * 1000

    OutputLogMessage(
        "TIME LEFT: %.1f sec | POWER: %d%%\n",
        (activeUntil - now) / 1000, power
    )
end

local function CheckSide(isDown)
    if isDown == nil then
        isDown = IsMouseButtonPressed(sideButton)
    end

    if isDown and not sideWasDown then
        if not IsMouseButtonPressed(1) then
            local shift = IsModifierPressed("shift")
            local ctrl = IsModifierPressed("ctrl")

            if shift and ctrl then
                SetPower(defaultPower, "RESET")
            elseif shift then
                SetPower(power + powerStep, "UP")
            elseif ctrl then
                SetPower(power - powerStep, "DOWN")
            else
                AddTime()
            end
        else
            -- Во время стрельбы боковая добавляет время
            AddTime()
        end
    end

    sideWasDown = isDown
end

function OnEvent(event, arg)
    if event == "PROFILE_ACTIVATED" then
        EnablePrimaryMouseButtonEvents(true)
        activeUntil = 0
        sideWasDown = IsMouseButtonPressed(sideButton)
        SetPower(defaultPower, "READY")
        return
    end

    if event == "PROFILE_DEACTIVATED" then
        activeUntil = 0
        return
    end

    if event ~= "MOUSE_BUTTON_PRESSED"
        and event ~= "MOUSE_BUTTON_RELEASED" then
        return
    end

    if arg == sideButton then
        CheckSide(event == "MOUSE_BUTTON_PRESSED")
    end

    if event ~= "MOUSE_BUTTON_PRESSED" then return end
    if arg ~= 1 and arg ~= sideButton then return end
    if not IsMouseButtonPressed(1) then return end
    if GetRunningTime() >= activeUntil then return end

    local startedAt = GetRunningTime()
    local remainder = 0

    -- Начатую очередь завершаем независимо от таймера
    while IsMouseButtonPressed(1) do
        CheckSide()

        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
            CheckSide()
            if not IsMouseButtonPressed(1) then return end
            Sleep(1)
        until GetRunningTime() - pauseStarted >= math.max(delayMs, 1)
    end
end