- Status
- Offline
- Joined
- Mar 3, 2026
- Messages
- 546
- Reaction score
- 7
If you're tired of fighting the vertical kick in Rainbow Six Siege while some sweat with an SMG-11 beams you from across the map, this is for you. This isn't a memory-writing external or a risky internal; it's a high-level Logitech LUA script running directly through your mouse's memory. Since it relies on the Logitech G Hub environment, it remains arguably one of the safest ways to handle recoil without tripping the anti-cheat's signature scanners.
Core Requirements
Optimized Environment Settings
To get the most out of the compensation logic, your settings need to align with the script's calculation table. If you're running different sensitivity, you'll need to adjust the values inside the Lua code manually.
Windows Settings: Speed 6/11, Pointer Precision OFF.
G Hub Settings: 800 DPI.
In-game Settings:
On-the-Fly Controls
Installation Guide
Open G Hub, go to your active profile, and click the Scripting icon at the bottom. Create a new script, paste the full code, and hit Save (Ctrl+S). Make sure the profile is locked as persistent if you want it to work across all modes.
Keep in mind that while LUA scripts aren't usually targeted by AC signatures, weirdly perfect recoil can still lead to manual reports. Use it with a bit of common sense.
Drop your custom sensitivity offsets below if you've tweaked these for other DPIs.
Core Requirements
- Logitech G Series mouse with onboard memory support.
- Logitech G HUB installed and active.
- Persistent profile enabled (to prevent the script from breaking during Alt+Tab).
Optimized Environment Settings
To get the most out of the compensation logic, your settings need to align with the script's calculation table. If you're running different sensitivity, you'll need to adjust the values inside the Lua code manually.
Windows Settings: Speed 6/11, Pointer Precision OFF.
G Hub Settings: 800 DPI.
In-game Settings:
- Aspect Ratio: 4:3
- FOV: 89
- Sensitivity: Horizontal 5 / Vertical 5
- ADS Sensitivity: 1x (42), 2.5x (57), 3.5x (65), 5.0x (75), 12.0x (60)
On-the-Fly Controls
- Scroll Lock: Toggle between Attacker and Defender lists.
- Ctrl + Middle Mouse Button (MMB): Cycle through the operator list for the selected side.
- RMB + LMB: The script activates compensation while aiming and firing.
The script uses indexed tables for every operator in the game, allowing for specific recoil curves. You can expand the console log in the G Hub editor to see which operator is currently active.
Code:
-- Core Logic Snippet
attackers = {
"Ace","Amaru","Ash","Blackbeard","Brava","Buck","Capitao","Deimos",
"Dokkaebi","Finka","Flores","Fuze","Glaz","Gridlock","Grim","Hibana",
"Iana","IQ","Jackal","Kali","Lion","Maverick","Nokk","Nomad","Osa",
"Rauora","Ram","Sens","Sledge","Solid Snake","Striker","Thatcher","Thermite","Twitch","Ying",
"Zero","Zofia"
}
defenders = {
"Alibi","Aruni","Azami","Bandit","Castle","Caveira","Clash","Denari",
"Doc","Echo","Ela","Fenrir","Frost","Goyo","Jager","Kaid","Kapkan",
"Lesion","Maestro","Melusi","Mira","Mozzie","Mute","Oryx","Pulse",
"Rook","Sentry","Skopos","Solis","Smoke","Tachanka","Thorn","Thunderbird",
"Tubarao","Valkyrie","Vigil","Wamai","Warden"
}
attacker_index = 1 -- Ace
defender_index = 1 -- Alibi
recoil = {}
recoil["Ace"] = {0, 46, 80, -1, 38, 600, -1, 40, 520, -1, 44, 900}
recoil["Alibi"] = {0, 32, 60, 1, 22, 600, 2, 25, 200, 2, 25, 300, 2, 25, 680}
recoil["Aruni"] = {-1, 23, 50}
recoil["Amaru"] = {0, 36, 150, -1, 32, 400, -1, 35, 700, -1, 35, 300, -1, 36, 150, -2, 37, 400, -2, 37, 550, -2, 37, 300, -1, 40, 250, -1, 41, 250}
recoil["Ash"] = {-1, 45, 50, -1, 43, 600, -1, 46, 1100}
recoil["Azami"] = {-1, 37, 60}
recoil["Bandit"] = {0, 18, 70, 0, 17, 800, 0, 19, 300, 0, 20, 500, -2, 19, 300}
recoil["Blackbeard"] = {0, 20, 150, 2, 15, 250, 3, 16, 650, 1, 17, 900}
recoil["Brava"] = {0, 28, 150, -1, 26, 400, 0, 29, 1000, -1, 32, 900, 0, 36, 300}
recoil["Buck"] = {0, 41, 150, 0, 30, 650, 0, 33, 650, -2, 36, 400, -1, 37, 300}
recoil["Capitao"] = {0, 28, 150, -1, 26, 400, 0, 29, 1000, -1, 32, 900, 0, 36, 300}
recoil["Castle"] = {0, 21, 30, 0, 10, 250, 0, 11, 700, -1, 11, 900, 0, 11, 700}
recoil["Caveira"] = {0, 10, 1000, -1, 9, 900, 0, 10, 600, 0, 9, 400, -1, 11, 400}
recoil["Clash"] = {0, 16, 1000, 0, 13, 400}
recoil["Deimos"] = {0, 43, 70, -1, 21, 1200, -1, 24, 700, -1, 25, 1000, -1, 27, 750}
recoil["Denari"] = {0, 36, 60, 2, 20, 400, 2, 29, 400, 3, 30, 500, 2, 31, 500, 2, 30, 300}
recoil["Doc"] = {0, 24, 30, 0, 16, 600, 0, 18, 300, 1, 19, 500, 0, 19, 1600}
recoil["Dokkaebi"] = {-1, 23, 50}
recoil["Echo"] = {0, 26, 30, -1, 16, 600, 0, 18, 300, -1, 19, 1250}
recoil["Ela"] = {0, 36, 60, 2, 20, 400, 2, 29, 400, 3, 30, 500, 2, 31, 500, 2, 30, 300}
recoil["Fenrir"] = {0, 18, 70, 0, 17, 800, 0, 19, 300, 0, 20, 500, -2, 19, 300}
recoil["Finka"] = {0, 48, 50, -1, 39, 400, -1, 42, 500, 0, 43, 500, -1, 44, 500, 0, 46, 500}
recoil["Flores"] = {0, 38, 80, -1, 26, 350, 0, 28, 300, -1, 30, 200, -1, 32, 1000}
recoil["Frost"] = {0, 18, 30, 0, 11, 600, 0, 11, 1100, 1, 11, 500, 0, 12, 1300}
recoil["Fuze"] = {0, 46, 80, -1, 38, 600, -1, 40, 520, -1, 44, 900}
recoil["Glaz"] = {0, 34, 60, 0, 28, 500, -1, 27, 800}
recoil["Goyo"] = {0, 27, 60, 1, 25, 250, 1, 25, 300, 1, 28, 600}
recoil["Gridlock"] = {0, 42, 50, -1, 31, 400, -1, 33, 500, -1, 36, 500, 0, 37, 500, 0, 38, 300}
recoil["Grim"] = {0, 37, 110, 0, 27, 500, -1, 29, 500, -1, 31, 850, 0, 32, 600}
recoil["Hibana"] = {0, 42, 40, -1, 35, 600, -1, 36, 300, -2, 37, 500}
recoil["Iana"] = {0, 45, 60, -1, 28, 700, -1, 29, 400, -1, 32, 500}
recoil["IQ"] = {0, 37, 110, 0, 27, 500, -1, 29, 500, -1, 31, 850, 0, 32, 600}
recoil["Jager"] = {0, 25, 60, -1, 21, 300, -1, 22, 1000, 0, 22, 600}
recoil["Jackal"] = {0, 44, 70, 0, 41, 500, -1, 42, 600, -1, 46, 500, -1, 48, 500}
recoil["Kaid"] = {0, 23, 60, 1, 15, 300, 1, 16, 800, 0, 17, 700, 0, 18, 700}
recoil["Kali"] = {0, 16, 1000, 0, 13, 400}
recoil["Kapkan"] = {0, 30, 10, 0, 19, 650, -1, 20, 800, 0, 21, 400, -1, 22, 500}
recoil["Lesion"] = {0, 22, 50, 0, 21, 500, -1, 22, 300, 0, 23, 300, -1, 24, 100, 1, 23, 800}
recoil["Lion"] = {0, 43, 60, 0, 24, 300, 0, 28, 1700, 0, 33, 2150}
recoil["Maestro"] = {0, 32, 20, 0, 17, 500, 0, 20, 500, 0, 21, 500, -1, 21, 600, 0, 21, 600, 0, 23, 2500}
recoil["Maverick"] = {0, 52, 50, -1, 34, 500, -1, 35, 500, -1, 38, 500, -1, 40, 700}
recoil["Melusi"] = {0, 24, 40, 0, 18, 600, -1, 20, 900, -1, 21, 700}
recoil["Mira"] = {0, 27, 60, 1, 25, 250, 1, 25, 300, 1, 28, 600}
recoil["Mozzie"] = {0, 26, 50, 0, 15, 300, -1, 16, 300, 0, 18, 400, 0, 18, 400, 0, 18, 400}
recoil["Mute"] = {0, 39, 60, 0, 32, 650}
recoil["Nokk"] = {0, 22, 40, 1, 16, 200, 0, 17, 800, 1, 19, 1200}
recoil["Nomad"] = {0, 45, 60, -1, 28, 700, -1, 29, 400, -1, 32, 500}
recoil["Oryx"] = {0, 22, 50, 0, 21, 500, -1, 22, 300, 0, 23, 300, -1, 24, 100, 1, 23, 800}
recoil["Osa"] = {0, 28, 80, 2, 24, 600, 2, 25, 300, 3, 26, 1600}
recoil["Pulse"] = {0, 21, 30, 0, 10, 250, 0, 11, 700, -1, 11, 900, 0, 11, 700}
recoil["Rauora"] = {0, 25, 50, -1, 22, 1500, -1, 28, 800, -1, 27, 2300, -1, 29, 4600}
recoil["Ram"] = {-1, 45, 50, -1, 43, 600, -1, 46, 1100}
recoil["Rook"] = {0, 24, 30, 0, 16, 600, 0, 18, 300, 1, 19, 500, 0, 19, 1600}
recoil["Sens"] = {1, 48, 40, 0, 30, 400, 0, 31, 1600, -1, 33, 300, -1, 33, 800, -1, 33, 800}
recoil["Sentry"] = {0, 26, 50, 0, 15, 300, -1, 16, 300, 0, 18, 400, 0, 18, 400, 0, 18, 400}
recoil["Skopos"] = {0, 18, 50, 0, 16, 500, -1, 16, 500, 0, 16, 500, -1, 17, 700}
recoil["Sledge"] = {0, 38, 60, 1, 24, 450, 2, 26, 300, 2, 27, 1500, 2, 29, 300}
recoil["Smoke"] = {0, 39, 60, 0, 32, 650}
recoil["Solid Snake"] = {0, 55, 80, -1, 52, 600, 0, 53, 200, -1, 54, 650}
recoil["Solis"] = {0, 39, 60, 0, 32, 650}
recoil["Striker"] = {0, 52, 50, -1, 34, 500, -1, 35, 500, -1, 38, 500, -1, 40, 700}
recoil["Tachanka"] = {0, 14, 50, 1, 8, 2900, 2, 8, 4600}
recoil["Thatcher"] = {0, 38, 60, 1, 24, 450, 2, 26, 300, 2, 27, 1500, 2, 29, 300}
recoil["Thermite"] = {0, 28, 80, 2, 24, 600, 2, 25, 300, 3, 26, 1600}
recoil["Thorn"] = {0, 23, 50, 0, 18, 500, 1, 19, 500, 1, 21, 500, 0, 21, 300}
recoil["Thunderbird"] = {0, 25, 30, -1, 22, 250, 0, 22, 250, -1, 23, 500, 0, 24, 500, -1, 24, 500, 0, 25, 400}
recoil["Tubarao"] = {0, 25, 60}
recoil["Twitch"] = {0, 55, 80, -1, 52, 600, 0, 53, 200, -1, 54, 650}
recoil["Valkyrie"] = {0, 24, 20, 0, 17, 500, 0, 18, 500, 0, 18, 500, -1, 19, 500}
recoil["Vigil"] = {0, 22, 30, 0, 19, 300, -1, 20, 500, -1, 21, 1700}
recoil["Wamai"] = {0, 23, 40, 0, 18, 500, 1, 19, 500, 1, 20, 500, 0, 19, 500, 0, 22, 400}
recoil["Warden"] = {0, 24, 20, 0, 17, 500, 0, 18, 500, 0, 18, 500, -1, 19, 500}
recoil["Ying"] = {0, 38, 60, -1, 29, 300, -1, 30, 450, 0, 32, 1800, 2, 36, 4700}
recoil["Zero"] = {0, 51, 40, -1, 40, 200, -1, 42, 700, -1, 45, 350, 0, 47, 500}
recoil["Zofia"] = {0, 56, 50, 1, 36, 600, 1, 37, 500, -1, 40, 600, 0, 42, 600}
weaponInfo = {}
weaponInfo["Ace"] = "AK-12 (2.5x, compensator, angled grip)"
weaponInfo["Alibi"] = "Mx4 Storm (x1, compensator, angled grip)"
weaponInfo["Aruni"] = "Mk 14 EBR (2.5x, muzzle brake, angled grip)"
weaponInfo["Amaru"] = "G8A1 (2.5x, compensator, angled grip)"
weaponInfo["Ash"] = "R4-C (2.5x, compensator, angled grip)"
weaponInfo["Azami"] = "ACS12 (2.5x, angled grip)"
weaponInfo["Bandit"] = "MP7 (x1, compensator)"
weaponInfo["Blackbeard"] = "MK17 CQB (2.5x, compensator, angled grip)"
weaponInfo["Brava"] = "PARA-308 (2.5x, compensator, angled grip)"
weaponInfo["Buck"] = "C8SFW (2.5x, compensator)"
weaponInfo["Capitao"] = "PARA-308 (2.5x, compensator, angled grip)"
weaponInfo["Castle"] = "UMP45 (x1, compensator, angled grip)"
weaponInfo["Caveira"] = "M12 (x1, compensator)"
weaponInfo["Clash"] = "SPSMG9 (x1, compensator)"
weaponInfo["Deimos"] = "AK-74M (2.5x, compensator, angled grip)"
weaponInfo["Denari"] = "SCORPION EVO 3 A1 (x1, compensator, angled grip)"
weaponInfo["Doc"] = "P90 (x1, compensator)"
weaponInfo["Dokkaebi"] = "Mk 14 EBR (2.5x, muzzle brake, angled grip)"
weaponInfo["Echo"] = "MP5SD (x1, angled grip)"
weaponInfo["Ela"] = "SCORPION EVO 3 A1 (x1, compensator, angled grip)"
weaponInfo["Fenrir"] = "MP7 (x1, compensator)"
weaponInfo["Finka"] = "SPEAR .308 (2.5x, compensator, angled grip)"
weaponInfo["Flores"] = "AR33 (2.5x, compensator, angled grip)"
weaponInfo["Frost"] = "9mm C1 (x1, compensator, angled grip)"
weaponInfo["Fuze"] = "AK-12 (2.5x, compensator, angled grip)"
weaponInfo["Glaz"] = "BEARING 9 (x1, compensator)"
weaponInfo["Goyo"] = "VECTOR .45 ACP (x1, compensator, angled grip)"
weaponInfo["Gridlock"] = "F90 (2.5x, compensator, angled grip)"
weaponInfo["Grim"] = "552 COMMANDO (2.5x, compensator, angled grip)"
weaponInfo["Hibana"] = "TYPE-89 (2.5x, compensator, angled grip)"
weaponInfo["Iana"] = "ARX200 (2.5x, compensator, angled grip)"
weaponInfo["IQ"] = "552 COMMANDO (2.5x, compensator, angled grip)"
weaponInfo["Jager"] = "416-C CARBINE (x1, compensator, angled grip)"
weaponInfo["Jackal"] = "C7E (2.5x, compensator, angled grip)"
weaponInfo["Kaid"] = "AUG A3 (x1, compensator, angled grip)"
weaponInfo["Kali"] = "SPSMG9 (x1, compensator)"
weaponInfo["Kapkan"] = "9x19VSN (x1, compensator, angled grip)"
weaponInfo["Lesion"] = "T-5 SMG (x1, compensator, angled grip)"
weaponInfo["Lion"] = "V308 (2.5x, compensator, angled grip)"
weaponInfo["Maestro"] = "ALDA 5.56 (x1, compensator, vertical grip)"
weaponInfo["Maverick"] = "M4 (2.5x, compensator, angled grip)"
weaponInfo["Melusi"] = "MP5 (x1, compensator, angled grip)"
weaponInfo["Mira"] = "VECTOR .45 ACP (x1, compensator, angled grip)"
weaponInfo["Mozzie"] = "COMMANDO 9 (x1, compensator, angled grip)"
weaponInfo["Mute"] = "SMG-11 (x1, compensator, angled grip)"
weaponInfo["Nokk"] = "FMG-9 (x1, compensator)"
weaponInfo["Nomad"] = "ARX200 (2.5x, compensator, angled grip)"
weaponInfo["Oryx"] = "T-5 SMG (x1, compensator, angled grip)"
weaponInfo["Osa"] = "556Xl (2.5x, compensator, angled grip)"
weaponInfo["Pulse"] = "UMP45 (x1, compensator, angled grip)"
weaponInfo["Rauora"] = "M249 (2.5x, compensator, angled grip)"
weaponInfo["Ram"] = "R4-C (2.5x, compensator, angled grip)"
weaponInfo["Rook"] = "P90 (x1, compensator)"
weaponInfo["Sens"] = "POF-9 (2.5x, compensator, angled grip)"
weaponInfo["Sentry"] = "COMMANDO 9 (x1, compensator, angled grip)"
weaponInfo["Skopos"] = "PCX-33 (x1, compensator, angled grip)"
weaponInfo["Sledge"] = "L85A2 (2.5x, compensator, angled grip)"
weaponInfo["Smoke"] = "SMG-11 (x1, compensator, angled grip)"
weaponInfo["Solid Snake"] = "F2 (2.5x, compensator, angled grip)"
weaponInfo["Solis"] = "SMG-11 (x1, compensator, angled grip)"
weaponInfo["Striker"] = "M4 (2.5x, compensator, angled grip)"
weaponInfo["Tachanka"] = "DP27 (1x)"
weaponInfo["Thatcher"] = "L85A2 (2.5x, compensator, angled grip)"
weaponInfo["Thermite"] = "556Xl (2.5x, compensator, angled grip)"
weaponInfo["Thorn"] = "UZK50Gl (x1, compensator, angled grip)"
weaponInfo["Thunderbird"] = "SPEAR .308 (1x, compensator, angled grip)"
weaponInfo["Tubarao"] = "AR-15.50 (2.5x, muzzle brake, angled grip)"
weaponInfo["Twitch"] = "F2 (2.5x, compensator, angled grip)"
weaponInfo["Valkyrie"] = "MPX (1x, compensator, angled grip)"
weaponInfo["Vigil"] = "K1A (1x, compensator, angled grip)"
weaponInfo["Wamai"] = "AUG A2 (1x, compensator)"
weaponInfo["Warden"] = "MPX (1x, compensator, angled grip)"
weaponInfo["Ying"] = "T-95 LSW (2.5x, compensator, angled grip)"
weaponInfo["Zero"] = "SC3000K (2.5x, compensator, angled grip)"
weaponInfo["Zofia"] = "M762 (2.5x, compensator, angled grip)"
function getCurrentOperator()
if IsKeyLockOn("scrolllock") then
return defenders[defender_index]
else
return attackers[attacker_index]
end
end
function nextOperator()
if IsKeyLockOn("scrolllock") then
defender_index = defender_index + 1
if defender_index > #defenders then
defender_index = 1
end
else
attacker_index = attacker_index + 1
if attacker_index > #attackers then
attacker_index = 1
end
end
end
function drawGrid(list, selected, columns)
local PADDING = 2
local maxLen = 0
for i = 1, #list do
local len = string.len(list[i])
if len > maxLen then
maxLen = len
end
end
local CELL_WIDTH = maxLen + PADDING * 2
local function centerText(text, width)
local len = string.len(text)
if len >= width then
return text
end
local left = math.floor((width - len) / 2)
local right = width - len - left
return string.rep(" ", left)
.. text
.. string.rep(" ", right)
end
local result = ""
local rows = math.ceil(#list / columns)
result = result ..
"+" ..
string.rep("-", CELL_WIDTH * columns + columns - 1) ..
"+\n"
for r = 1, rows do
result = result .. "|"
for c = 1, columns do
local i = r + (c-1)*rows
local name = list[i]
if name then
if name == selected then
local label =
"> "
.. string.upper(name)
.. " <"
result =
result
.. centerText(label, CELL_WIDTH)
else
result =
result
.. centerText(name, CELL_WIDTH)
end
else
result =
result
.. string.rep(" ", CELL_WIDTH)
end
if c < columns then
result = result .. "|"
end
end
result = result .. "|\n"
end
result = result ..
"+" ..
string.rep("-", CELL_WIDTH * columns + columns - 1) ..
"+\n"
return result
end
function Log()
ClearLog()
local op = getCurrentOperator()
local gun = weaponInfo[op] or "unknown"
if IsKeyLockOn("scrolllock") then
OutputLogMessage(" MODE: > > > DEFENDERS < < <\n\n")
else
OutputLogMessage(" MODE: > > > ATTACKERS < < <\n\n")
end
OutputLogMessage(
"SELECTED OPERATOR: ► ► ► %s\nSELECTED WEAPON: ► ► ► %s\n\n",
op,
gun
)
if IsKeyLockOn("scrolllock") then
OutputLogMessage(drawGrid(defenders, op, 4))
else
OutputLogMessage(drawGrid(attackers, op, 4))
end
end
function applyRecoil(pattern)
for i=3,#pattern,3 do
local start = GetRunningTime()
local x = pattern[i-2]
local y = pattern[i-1]
local duration = pattern[i]
repeat
MoveMouseRelative(x,y)
Sleep(10)
until GetRunningTime() - start >= duration
or not IsMouseButtonPressed(1)
or not IsMouseButtonPressed(3)
end
end
function OnEvent(event,arg)
EnablePrimaryMouseButtonEvents(true)
if event == "PROFILE_ACTIVATED" then
Log()
end
if event == "MOUSE_BUTTON_PRESSED"
and arg == 3
and IsModifierPressed("lctrl") then
nextOperator()
Log()
end
if event == "MOUSE_BUTTON_PRESSED"
and arg == 1
and IsMouseButtonPressed(3) then
local op = getCurrentOperator()
local pattern = recoil[op]
if pattern then
applyRecoil(pattern)
end
end
end
Installation Guide
Open G Hub, go to your active profile, and click the Scripting icon at the bottom. Create a new script, paste the full code, and hit Save (Ctrl+S). Make sure the profile is locked as persistent if you want it to work across all modes.
Keep in mind that while LUA scripts aren't usually targeted by AC signatures, weirdly perfect recoil can still lead to manual reports. Use it with a bit of common sense.
Drop your custom sensitivity offsets below if you've tweaked these for other DPIs.