
Key RequiredUniversal

--═══════════════════════════════════════════════════════════════════════
-- NO-RECOIL SUITE v3 • springs hook + API wrap + crosshair pin
-- + built-in settings menu (drag, minimize, RightShift toggle)
-- Re-running the script is safe. Menu button / NR.restore() to revert.
--═══════════════════════════════════════════════════════════════════════
local gu = getupvalue or debug.getupvalue
local getuv = getupvalues or debug.getupvalues
local cloneref = cloneref or function(o) return o end
local ZERO = Vector3.zero or Vector3.new()
local BIND = "nr_pin"
local MENU_KEY = Enum.KeyCode.RightShift
local RS = cloneref(game:GetService("ReplicatedStorage"))
local RunService = cloneref(game:GetService("RunService"))
local UserInput = cloneref(game:GetService("UserInputService"))
local Players = cloneref(game:GetService("Players"))
local lp = Players.LocalPlayer
local env = getfenv and getfenv(0) or _G
--═══════════════════ SAFE RE-RUN / RESTORE════════════════════════════
if env.NR then pcall(env.NR.destroy) end
local NR = { hooks = {}, on = {}, watchdog = nil }
env.NR = NR
local function addHook(obj, key, orig)
NR.hooks[#NR.hooks + 1] = { obj = obj, key = key, orig = orig }
end
local function restoreAll()
for i = #NR.hooks, 1, -1 do
local h = NR.hooks[i]
pcall(function() h.obj[h.key] = h.orig end)
end
table.clear(NR.hooks)
pcall(RunService.UnbindFromRenderStep, BIND)
end
NR.restoreAll = restoreAll
--═══════════════════ UPVALUE SCAN (no hardcoded indexes) ═════════════
local function upvalues(f)
local out = {}
if type(f) ~= "function" then return out end
if getuv then
local ok, t = pcall(getuv, f)
if ok and type(t) == "table" then
for i = 1, #t do out[i] = t[i] end
return out
end
end
if gu then
local i = 1
while i <= 64 do
local ok, v = pcall(gu, f, i)
if not ok or v == nil then break end
out[i] = v
i += 1
end
end
return out
end
--═══════════════════ FIND RECOIL MODULE ══════════════════════════════
local cam
if getloadedmodules then
local mods = getloadedmodules()
for i = 1, #mods do
local ok, r = pcall(require, mods[i])
if ok and type(r) == "table"
and type(r.setWeaponRecoil) == "function"
and type(r.weaponKick) == "function" then
cam = r
break
end
end
end
if not cam then
return warn("[NR] Recoil module not found (getloadedmodules missing or module not loaded yet)")
end
--═══════════════════ SPRING DETECTION & HOOKING ══════════════════════
local function isSpring(t)
return type(t) == "table"
and type(t.setGoal) == "function"
and (type(t.setPosition) == "function"
or type(t.impulse) == "function"
or type(t.shove) == "function")
end
local SPRING_METHODS = { "setGoal", "setPosition", "impulse", "shove" }
local hookedSprings = {}
local function hookSpring(spring)
if hookedSprings[spring] then return end
hookedSprings[spring] = true
for _, m in ipairs(SPRING_METHODS) do
local orig = spring[m]
if type(orig) == "function" then
spring[m] = function(self, _, ...) return orig(self, ZERO, ...) end
addHook(spring, m, orig)
end
end
end
local function hookAllSprings()
for _, v in pairs(cam) do
if type(v) == "function" then
for _, uv in ipairs(upvalues(v)) do
if isSpring(uv) then pcall(hookSpring, uv) end
end
end
end
end
local function unhookSprings()
for i = #NR.hooks, 1, -1 do
local h = NR.hooks[i]
if hookedSprings[h.obj] then
pcall(function() h.obj[h.key] = h.orig end)
table.remove(NR.hooks, i)
end
end
table.clear(hookgedSprings or hookedSprings)
table.clear(hookedSprings)
end
--═══════════════════ FEATURE: NO RECOIL (API wrap + springs) ═════════
local apiWrapped = false
local function setNoRecoil(state)
if state then
if not apiWrapped then
apiWrapped = true
for _, name in ipairs({ "setWeaponRecoil", "weaponKick" }) do
local orig = cam[name]
if type(orig) == "function" then
cam[name] = function(a, _, ...) return orig(a, ZERO, ...) end
addHook(cam, name, orig)
end
end
end
hookAllSprings()
else
unhookSprings()
end
NR.on.noRecoil = state
end
--═══════════════════ FEATURE: FOLLOW RECOIL SETTING ══════════════════
local settingsModule, oldFollow
pcall(function()
settingsModule = require(RS.Interface.Screens.Gameplay.Middle.Crosshair.Settings)
oldFollow = settingsModule["Follow Recoil"]
end)
local function setFollowRecoil(state)
if settingsModule then
pcall(function() settingsModule["Follow Recoil"] = not state end)
end
NR.on.followOff = state
end
--═══════════════════ FEATURE: CROSSHAIR PIN ══════════════════════════
local crosshairFrame
pcall(function()
local gui = lp:WaitForChild("PlayerGui", 5)
local main = gui and gui:WaitForChild("MainGui", 5)
local gp = main and main:WaitForChild("Gameplay", 5)
local mid = gp and gp:WaitForChild("Middle", 5)
crosshairFrame = mid and mid:WaitForChild("Crosshair", 5)
end)
local function setCrosshairPin(state)
pcall(RunService.UnbindFromRenderStep, BIND)
if state and crosshairFrame then
local centre = UDim2.fromScale(0.5, 0.5)
RunService:BindToRenderStep(BIND, Enum.RenderPriority.Last.Value, function()
if not crosshairFrame.Parent then return end
if crosshairFrame.Position ~= centre then crosshairFrame.Position = centre end
end)
end
NR.on.crosshairPin = state
end
--═══════════════════ FEATURE: WATCHDOG (auto re-hook) ════════════════
local function setWatchdog(state)
if NR.watchdogConn then NR.watchdogConn:Disconnect() NR.watchdogConn = nil end
if state then
NR.watchdogConn = RunService.Heartbeat:Connect(function()
-- cheap periodic re-scan while no-recoil is active
task.wait(0)
end)
task.spawn(function()
while NR.on.watchdog do
if NR.on.noRecoil then pcall(hookAllSprings) end
task.wait(5)
end
end)
end
NR.on.watchdog = state
end
--═══════════════════ SETTINGS MENU (self-contained GUI) ══════════════
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "NR_Menu_" .. tostring(math.random(1e5, 9e5))
screenGui.ResetOnSpawn = false
screenGui.DisplayOrder = 9999
pcall(function() screenGui.Parent = lp:WaitForChild("PlayerGui", 5) end)
if not screenGui.Parent then screenGui.Parent = gethui and gethui() or coregui end
local root = Instance.new("Frame")
root.Size = UDim2.fromOffset(260, 300)
root.Position = UDim2.new(0.5, -130, 0.5, -150)
root.BackgroundColor3 = Color3.fromRGB(24, 24, 28)
root.BorderSizePixel = 0
root.Active = true
root.Draggable = true -- still works on most executors; fallback below
root.Parent = screenGui
local corner = Instance.new("UICorner", root) corner.CornerRadius = UDim.new(0, 8)
local stroke = Instance.new("UIStroke", root)
stroke.Color = Color3.fromRGB(90, 90, 110) stroke.Thickness = 1
-- manual drag fallback
do
local dragging, dragStart, startPos
root.InputBegan:Connect(function(inp)
if inp.UserInputType == Enum.UserInputType.MouseButton1 or inp.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = inp.Position
startPos = root.Position
end
end)
UserInput.InputChanged:Connect(function(inp)
if dragging and (inp.UserInputType == Enum.UserInputType.MouseMovement or inp.UserInputType == Enum.UserInputType.Touch) then
local delta = inp.Position - dragStart
root.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
end
end)
UserInput.InputEnded:Connect(function(inp)
if inp.UserInputType == Enum.UserInputType.MouseButton1 or inp.UserInputType == Enum.UserInputType.Touch then
dragging = false
end
end)
end
-- title bar
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -60, 0, 30)
title.Position = UDim2.fromOffset(10, 0)
title.BackgroundTransparency = 1
title.Text = "NO-RECOIL SUITE"
title.TextColor3 = Color3.fromRGB(235, 235, 245)
title.Font = Enum.Font.GothamBold
title.TextSize = 14
title.TextXAlignment = Enum.TextXAlignment.Left
title.Parent = root
local btnMin = Instance.new("TextButton")
btnMin.Size = UDim2.fromOffset(24, 24)
btnMin.Position = UDim2.new(1, -56, 0, 3)
btnMin.Text = "-"
btnMin.BackgroundColor3 = Color3.fromRGB(45, 45, 55)
btnMin.TextColor3 = Color3.fromRGB(220, 220, 230)
btnMin.Font = Enum.Font.GothamBold
btnMin.TextSize = 14
btnMin.BorderSizePixel = 0
btnMin.Parent = root
Instance.new("UICorner", btnMin).CornerRadius = UDim.new(0, 6)
local btnClose = Instance.new("TextButton")
btnClose.Size = UDim2.fromOffset(24, 24)
btnClose.Position = UDim2.new(1, -28, 0, 3)
btnClose.Text = "X"
btnClose.BackgroundColor3 = Color3.fromRGB(170, 50, 50)
btnClose.TextColor3 = Color3.fromRGB(255, 235, 235)
btnClose.Font = Enum.Font.GothamBold
btnClose.TextSize = 12
btnClose.BorderSizePixel = 0
btnClose.Parent = root
Instance.new("UICorner", btnClose).CornerRadius = UDim.new(0, 6)
local body = Instance.new("Frame")
body.Size = UDim2.new(1, -16, 1, -38)
body.Position = UDim2.fromOffset(8, 34)
body.BackgroundTransparency = 1
body.Parent = root
local list = Instance.new("UIListLayout", body)
list.Padding = UDim.new(0, 6)
list.SortOrder = Enum.SortOrder.LayoutOrder
local minimized = false
btnMin.MouseButton1Click:Connect(function()
minimized = not minimized
body.Visible = not minimized
root.Size = minimized and UDim2.fromOffset(260, 34) or UDim2.fromOffset(260, 300)
end)
-- toggle factory
local function makeToggle(text, default, callback, order)
local btn = Instance.new("TextButton")
btn.Size = UDim2.new(1, 0, 0, 30)
btn.BackgroundColor3 = Color3.fromRGB(34, 34, 40)
btn.TextColor3 = Color3.fromRGB(220, 220, 230)
btn.Font = Enum.Font.Gotham
btn.TextSize = 13
btn.BorderSizePixel = 0
btn.TextXAlignment = Enum.TextXAlignment.Left
btn.Text = " " .. text .. " : OFF"
btn.LayoutOrder = order
btn.Parent = body
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 6)
local state = false
local function render()
btn.Text = " " .. text .. " : " .. (state and "ON" or "OFF")
btn.BackgroundColor3 = state and Color3.fromRGB(40, 90, 50) or Color3.fromRGB(34, 34, 40)
end
btn.MouseButton1Click:Connect(function()
state = not state
render()
pcall(callback, state)
end)
if default then
task.defer(function() state = true; render(); pcall(callback, true) end)
else
render()
end
return btn
end
local function makeButton(text, callback, order)
local btn = Instance.new("TextButton")
btn.Size = UDim2.new(1, 0, 0, 30)
btn.BackgroundColor3 = Color3.fromRGB(50, 50, 62)
btn.TextColor3 = Color3.fromRGB(230, 230, 240)
btn.Font = Enum.Font.Gotham
btn.TextSize = 13
btn.BorderSizePixel = 0
btn.Text = text
btn.LayoutOrder = order
btn.Parent = body
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 6)
btn.MouseButton1Click:Connect(function() pcall(callback) end)
return btn
end
makeToggle("No Recoil", true, setNoRecoil, 1)
makeToggle("Crosshair Pin", true, setCrosshairPin, 2)
makeToggle("Follow Recoil Off",true, setFollowRecoil, 3)
makeToggle("Auto Re-Hook (5s)",false, setWatchdog, 4)
makeButton("Re-Inject Hooks", function() if NR.on.noRecoil then unhookSprings(); hookAllSprings() end end, 5)
makeButton("Restore Everything", function()
setWatchdog(false)
setCrosshairPin(false)
setFollowRecoil(false)
if settingsModule and oldFollow ~= nil then
pcall(function() settingsModule["Follow Recoil"] = oldFollow end)
end
unhookSprings()
-- unwrap API
for i = #NR.hooks, 1, -1 do
local h = NR.hooks[i]
pcall(function() h.obj[h.key] = h.orig end)
end
table.clear(NR.hooks)
apiWrapped = false
end, 6)
-- menu keybind toggle
UserInput.InputBegan:Connect(function(inp, processed)
if processed then return end
if inp.KeyCode == MENU_KEY then
screenGui.Enabled = not screenGui.Enabled
end
end)
-- full cleanup (used on re-run too)
NR.destroy = function()
setWatchdog(false)
restoreAll()
if settingsModule and oldFollow ~= nil then
pcall(function() settingsModule["Follow Recoil"] = oldFollow end)
end
pcall(function() screenGui:Destroy() end)
end
print("[NR] Suite loaded — RightShift toggles the menu")No comments yet for this script.



![Sir Meme Hub | [16 GAMES] [$14.99 LIFETIME] | FARM/AIM/ESP](https://scriptblox.com/images/sb/-1-1791044877945.webp)