-- [[ 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 ]] -- Silent Aim for Pilgrammed (bows / muskets / ranged) | toggleable GUI -- Hooks CommonToolModule.Aim (the game's own aim calc) -> redirects to nearest enemy -- RightShift shows / hides the GUI. Aim toggling is via the GUI button only. -- Singleton: re-running collapses old hooks and disconnects old handlers first. getgenv().SA = getgenv().SA or {} local G = getgenv().SA -- disconnect service-level connections left by previous runs of this script if G.conns then for _, c in ipairs(G.conns) do pcall(function() c:Disconnect() end) end end G.conns = {} local function track(conn) table.insert(G.conns, conn) return conn end local Players = game:GetService("Players") local UIS = game:GetService("UserInputService") local RunService = game:GetService("RunService") local Workspace = game:GetService("Workspace") local LocalPlayer = Players.LocalPlayer local MobHelper = require(game:GetService("ReplicatedStorage").MobHelper) local ClientGameData = require(game:GetService("ReplicatedStorage").ClientGameData) local CTM = require(game:GetService("ReplicatedStorage").Modules.CommonToolModule) -- Lock the game's own AimAssist to OFF at the table level (it has no wallcheck -- and must never fire while our hook is active; also neuters stale script copies). pcall(function() if typeof(getmetatable) == "function" and typeof(setmetatable) == "function" then local mt = getmetatable(ClientGameData) if not (mt and mt.__SA_Lock) then setmetatable(ClientGameData, { __SA_Lock = true, __index = function(t, k) if k == "AimAssist" then return nil end return rawget(t, k) end, __newindex = function(t, k, v) if k == "AimAssist" then return end rawset(t, k, v) end, }) end else ClientGameData.AimAssist = nil end end) -- Shared config persists across re-runs so the GUI toggle always controls the live hook. G.config = G.config or {} local Config = G.config if Config.Enabled == nil then Config.Enabled = true end if Config.Range == nil then Config.Range = 400 end if Config.TargetPart == nil then Config.TargetPart = "Head" end if Config.RangedOnly == nil then Config.RangedOnly = true end Config.GuiKey = Enum.KeyCode.RightShift -- show / hide GUI only Config.WallCheck = nil -- wallcheck removed per user request local OldAim = nil local function IsRangedTool(tool) if not tool or not tool:IsA("Tool") then return false end local okT, typ = pcall(function() return tool:GetAttribute("Type") end) if okT and typ ~= nil then local t = string.lower(tostring(typ)) if t == "gun" or t == "bow" then return true end end local okV, vel = pcall(function() return tool:GetAttribute("Velocity") end) if okV and vel ~= nil then return true end local okR, mr = pcall(function() return tool:GetAttribute("MaxRange") end) if okR and mr ~= nil then return true end return false end local function GetEquippedTool() local char = LocalPlayer.Character if not char then return nil end return char:FindFirstChildOfClass("Tool") end local CurrentTarget = nil local CurrentTargetPos = nil local function PickAimPart(mob) if not mob then return nil end if Config.TargetPart == "Head" then return mob:FindFirstChild("Head") or mob:FindFirstChild("HumanoidRootPart") or mob.PrimaryPart elseif Config.TargetPart == "HumanoidRootPart" then return mob:FindFirstChild("HumanoidRootPart") or mob:FindFirstChild("Head") or mob.PrimaryPart elseif Config.TargetPart == "Torso" then return mob:FindFirstChild("Torso") or mob:FindFirstChild("HumanoidRootPart") or mob:FindFirstChild("Head") or mob.PrimaryPart else -- Closest part to character local char = LocalPlayer.Character local pp = char and char.PrimaryPart if not pp then return mob.PrimaryPart end local best, bestD = nil, math.huge for _, d in ipairs(mob:GetDescendants()) do if d:IsA("BasePart") then local dd = (d.Position - pp.Position).Magnitude if dd < bestD then best, bestD = d, dd end end end return best or mob.PrimaryPart end end local function GetNearestEnemy() local char = LocalPlayer.Character local pp = char and char.PrimaryPart if not pp then return nil, nil end local ok, mob = pcall(function() return MobHelper.GetClosestMob(pp.Position, Config.Range) end) if not ok or not mob then return nil, nil end local hum = mob:FindFirstChildOfClass("Humanoid") if hum and hum.Health <= 0 then return nil, nil end local part = PickAimPart(mob) if not part then return nil, nil end return mob, part end local function SilentAimHook(playerArg, mouseArg, arg3, ...) if Config.Enabled and playerArg == LocalPlayer then local doit = true if Config.RangedOnly then doit = IsRangedTool(GetEquippedTool()) end if doit then local mob, part = GetNearestEnemy() if mob and part then CurrentTarget = mob CurrentTargetPos = part.Position return part.Position, 1 end end end CurrentTarget = nil return OldAim(playerArg, mouseArg, arg3, ...) end -- Collapse any hook chain left by previous runs, then install exactly one hook. if G.original == nil then G.original = CTM.Aim -- first run captures the true original end if typeof(restorefunction) == "function" and typeof(isfunctionhooked) == "function" then for _ = 1, 10 do local h = false pcall(function() h = isfunctionhooked(CTM.Aim) end) if not h then break end pcall(function() restorefunction(CTM.Aim) end) end end CTM.Aim = G.original -- reset field in case an assignment-style hook replaced it if typeof(hookfunction) == "function" then local ok, res = pcall(function() return hookfunction(G.original, SilentAimHook) end) OldAim = (ok and res) or G.original else OldAim = G.original CTM.Aim = SilentAimHook end G.hooked = true -- ============ GUI ============ local parentGui = nil pcall(function() if typeof(gethui) == "function" then parentGui = gethui() end end) if not parentGui then parentGui = game:GetService("CoreGui") end pcall(function() local old = parentGui:FindFirstChild("SilentAimGui") if old then old:Destroy() end end) local gui = Instance.new("ScreenGui") gui.Name = "SilentAimGui" gui.ResetOnSpawn = false gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling gui.Parent = parentGui local frame = Instance.new("Frame") frame.Name = "Main" frame.Size = UDim2.new(0, 250, 0, 264) frame.Position = UDim2.new(0, 20, 0.5, -132) frame.BackgroundColor3 = Color3.fromRGB(20, 20, 25) frame.BorderSizePixel = 0 frame.Active = true frame.Draggable = true frame.Visible = true frame.Parent = gui Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 8) local stroke = Instance.new("UIStroke", frame) stroke.Color = Color3.fromRGB(80, 80, 100) stroke.Thickness = 1 local function mkLabel(text, y, h, size, color) local l = Instance.new("TextLabel") l.Size = UDim2.new(1, -20, 0, h or 20) l.Position = UDim2.new(0, 10, 0, y) l.BackgroundTransparency = 1 l.Text = text l.TextColor3 = color or Color3.fromRGB(230, 230, 230) l.Font = Enum.Font.GothamBold l.TextSize = size or 13 l.TextXAlignment = Enum.TextXAlignment.Left l.Parent = frame return l end local title = mkLabel("Silent Aim (Pilgrammed)", 8, 22, 14) title.Font = Enum.Font.GothamBlack local status = mkLabel("Status: ON", 32, 18) status.TextColor3 = Color3.fromRGB(90, 255, 130) status.Name = "StatusLabel" local function mkButton(name, text, y, h) local b = Instance.new("TextButton") b.Name = name b.Size = UDim2.new(1, -20, 0, h or 30) b.Position = UDim2.new(0, 10, 0, y) b.Text = text b.Font = Enum.Font.GothamBold b.TextSize = 13 b.TextColor3 = Color3.fromRGB(255, 255, 255) b.BackgroundColor3 = Color3.fromRGB(45, 45, 60) b.BorderSizePixel = 0 b.Parent = frame Instance.new("UICorner", b).CornerRadius = UDim.new(0, 6) return b end local toggleBtn = mkButton("ToggleBtn", "Toggle: ON", 54, 30) toggleBtn.BackgroundColor3 = Color3.fromRGB(30, 140, 60) local targetLabel = mkLabel("Target: none", 88, 18, 13, Color3.fromRGB(180, 200, 255)) targetLabel.Name = "TargetLabel" mkLabel("Range (studs):", 110, 18) local rangeBox = Instance.new("TextBox") rangeBox.Name = "RangeBox" rangeBox.Size = UDim2.new(1, -20, 0, 26) rangeBox.Position = UDim2.new(0, 10, 0, 130) rangeBox.Text = tostring(Config.Range) rangeBox.Font = Enum.Font.GothamBold rangeBox.TextSize = 13 rangeBox.BackgroundColor3 = Color3.fromRGB(35, 35, 48) rangeBox.TextColor3 = Color3.fromRGB(255, 255, 255) rangeBox.BorderSizePixel = 0 rangeBox.Parent = frame Instance.new("UICorner", rangeBox).CornerRadius = UDim.new(0, 6) local partBtn = mkButton("PartBtn", "Aim Part: Head", 162, 28) local rangedBtn = mkButton("RangedBtn", "Ranged Only: ON", 194, 28) local hideBtn = mkButton("HideBtn", "Hide GUI (RightShift)", 226, 28) local function refresh() toggleBtn.Text = "Toggle: " .. (Config.Enabled and "ON" or "OFF") toggleBtn.BackgroundColor3 = Config.Enabled and Color3.fromRGB(30, 140, 60) or Color3.fromRGB(150, 40, 40) status.Text = "Status: " .. (Config.Enabled and "ON" or "OFF") status.TextColor3 = Config.Enabled and Color3.fromRGB(90, 255, 130) or Color3.fromRGB(255, 110, 110) partBtn.Text = "Aim Part: " .. Config.TargetPart rangedBtn.Text = "Ranged Only: " .. (Config.RangedOnly and "ON" or "OFF") rangeBox.Text = tostring(Config.Range) end toggleBtn.MouseButton1Click:Connect(function() Config.Enabled = not Config.Enabled refresh() end) partBtn.MouseButton1Click:Connect(function() local order = { "Head", "HumanoidRootPart", "Torso", "Closest" } local idx = table.find(order, Config.TargetPart) or 1 Config.TargetPart = order[(idx % #order) + 1] refresh() end) rangedBtn.MouseButton1Click:Connect(function() Config.RangedOnly = not Config.RangedOnly refresh() end) rangeBox.FocusLost:Connect(function(enter) if not enter then return end local n = tonumber(rangeBox.Text) if n then Config.Range = math.clamp(math.floor(n), 20, 2000) rangeBox.Text = tostring(Config.Range) else rangeBox.Text = tostring(Config.Range) end end) local function toggleGui() frame.Visible = not frame.Visible end G.guiToggleFn = toggleGui -- exposed for testing hideBtn.MouseButton1Click:Connect(toggleGui) -- NOTE: no game-processed guard here on purpose: the game sinks RightShift, -- which is exactly why the old keybind never fired. Hiding a GUI is harmless -- even if the game also uses the key. track(UIS.InputBegan:Connect(function(input) if input.KeyCode == Config.GuiKey then toggleGui() end end)) refresh() -- live target readout (throttled probe, 5x/sec) local lastProbe = 0 local probedName = "none" track(RunService.RenderStepped:Connect(function() if not Config.Enabled then targetLabel.Text = "Target: (disabled)" return end local tool = GetEquippedTool() if Config.RangedOnly and not IsRangedTool(tool) then targetLabel.Text = "Target: equip bow/musket..." return end if CurrentTarget and CurrentTarget.Parent then local d = nil pcall(function() local pp = LocalPlayer.Character and LocalPlayer.Character.PrimaryPart if pp and CurrentTargetPos then d = math.floor((CurrentTargetPos - pp.Position).Magnitude) end end) targetLabel.Text = "Target: " .. CurrentTarget.Name .. (d and (" (" .. d .. "m)") or "") return end local now = os.clock() if now - lastProbe >= 0.2 then lastProbe = now local mob = GetNearestEnemy() probedName = mob and mob.Name or "none in range" end targetLabel.Text = "Target: " .. probedName end)) print("[SilentAim] loaded. RightShift or Hide button shows/hides GUI. Toggle aim via GUI button.")