Загрузка данных
-- УПРАВЛЕНИЕ
-- Нажми №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