NO-RECOIL SUITE v3  springs hook + API wrap + crosshair p
Key Required

NO-RECOIL SUITE v3 springs hook + API wrap + crosshair p

[NEW MAP] BloxStrikedeborahmartinn073deborahmartinn073 551 views 589 executesUpdated Oct 8, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•388 lines (13083 chars)
--═══════════════════════════════════════════════════════════════════════
--  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")

Features & Information

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

Community Comments (0)

No comments yet for this script.

More Scripts for [NEW MAP] BloxStrike