NORECOIL SUITE v3 springs hook API wrap crosshair
[OPEN TESTING] BloxStrikeDescription
BloxStrike Script Update : 08.10.2026 No Recoil — finds the game's recoil controller module by scanning loaded modules for the setWeaponRecoil / weaponKick signature, then neutralizes recoil two independent ways: it wraps the module's public API so every incoming recoil vector is replaced with Vector3.zero , and it hooks every spring object found in the upvalues of the module's functions (setGoal, setPosition, impulse, shove all receive zero input). Double coverage means recoil stays dead even if the game rebuilds its spring objects. Crosshair Pin — binds to RenderStep at last priority and forces the crosshair frame back to screen center every frame, cancelling visual crosshair kick. Safely stops if the GUI gets destroyed. Follow Recoil Off — flips the game's own "Follow Recoil" setting in the crosshair settings module to false, and remembers the original value for restore. Auto Re-Hook (off by default) — a background loop that re-scans for springs every 5 seconds and re-hooks any new ones, for games that recreate recoil springs mid-session. Re-Inject Hooks — manual one-shot re-scan and re-hook. Restore Everything — unwraps the API, restores every hooked spring method, resets the settings value, and unbinds the render-step pin
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. Deal with caution.
--
-- Stay safe:
-- • Never log in on unofficial Roblox sites or lookalike domains.
-- • Real Roblox links use roblox.com (check the .com ending).
-- • Treat fake Roblox login / "claim reward" pages as phishing.
-- [[ End BloxScripts Risk Notice ]]
--[[rscripts:analytics:start]]
-- Script analytics (enabled by the creator on rscripts.net).
-- Runs in its own thread and cannot affect the script below.
task.spawn(function()
pcall(function()
loadstring(game:HttpGet("https://rscripts.net/api/telemetry/v2/client.lua?s=6ac724078fe5a7b664a4de1f"))()
end)
end)
--[[rscripts:analytics:end]]
--═══════════════════════════════════════════════════════════════════════
-- 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")Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.


Your community, in one place