-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. 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 Rscripts Risk Notice ]] --═══════════════════════════════════════════════════════════════════════ -- 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")