-- [[ 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 ]] local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local Workspace = game:GetService("Workspace") local LocalPlayer = Players.LocalPlayer local Camera = Workspace.CurrentCamera -- CONFIGURATION / TOGGLE SETTINGS local Settings = { ESP_Outlines = true, ESP_TextUI = true, Aimbot = true, HeadSizeMod = true, TargetPlayers = true, TargetNPCs = false, } local HEAD_ADD = 2 local TRACK_SPEED = 17.5 local MIN_HEALTH_THRESHOLD = 10 local MAX_DISTANCE_STUDS = 250 local IGNORED_NAMES = { ["protsbkiller"] = true, ["protsbkiller4"] = true } local isTracking = false local currentTargetPart = nil local mobileAimEnabled = false local targetedHeads = {} local resizedHeads = {} local npcTargets = {} -- TARGET VALIDATION & SCANNING LOGIC local function isIgnoredTarget(model) if not model then return true end if LocalPlayer and LocalPlayer.Character and model == LocalPlayer.Character then return true end local modelNameLower = string.lower(model.Name) if IGNORED_NAMES[modelNameLower] then return true end local player = Players:GetPlayerFromCharacter(model) if player then if player == LocalPlayer then return true end if IGNORED_NAMES[string.lower(player.Name)] or (player.DisplayName and IGNORED_NAMES[string.lower(player.DisplayName)]) then return true end end return false end local function isValidTargetPart(targetPart) if not targetPart or not targetPart:IsA("BasePart") or not targetPart:IsDescendantOf(Workspace) then return false end local model = targetPart:FindFirstAncestorOfClass("Model") or targetPart.Parent if not model or not model:IsDescendantOf(Workspace) or isIgnoredTarget(model) then return false end local isRealPlayer = Players:GetPlayerFromCharacter(model) if isRealPlayer and not Settings.TargetPlayers then return false end if not isRealPlayer and not Settings.TargetNPCs then return false end local distance = (targetPart.Position - Camera.CFrame.Position).Magnitude if distance > MAX_DISTANCE_STUDS then return false end local humanoid = model:FindFirstChildOfClass("Humanoid") or model:FindFirstChildWhichIsA("Humanoid", true) if humanoid then if humanoid.Health <= MIN_HEALTH_THRESHOLD or humanoid:GetState() == Enum.HumanoidStateType.Dead then return false end end return true end local function getClosestHeadToCamera() local isMobile = not UserInputService.KeyboardEnabled local screenCenter = isMobile and Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y / 2) or UserInputService:GetMouseLocation() local closest = nil local shortestDistance = math.huge for head, _ in pairs(targetedHeads) do if head and head.Parent then if isValidTargetPart(head) then local screenPos, onScreen = Camera:WorldToViewportPoint(head.Position) if onScreen then local distance = (Vector2.new(screenPos.X, screenPos.Y) - screenCenter).Magnitude if distance < shortestDistance then shortestDistance = distance closest = head end end end else targetedHeads[head] = nil end end return closest end -- ESP & HEAD SIZE HANDLER local function processHeadTarget(head) if not head:IsA("BasePart") then return end if LocalPlayer.Character and head:IsDescendantOf(LocalPlayer.Character) then return end local targetModel = head:FindFirstAncestorOfClass("Model") or head.Parent local isRealPlayer = Players:GetPlayerFromCharacter(targetModel) -- HEAD SIZE MOD if Settings.HeadSizeMod and not resizedHeads[head] then resizedHeads[head] = head.Size head.Size = head.Size + Vector3.new(HEAD_ADD, HEAD_ADD, HEAD_ADD) head.CanCollide = false head.Massless = true elseif not Settings.HeadSizeMod and resizedHeads[head] then head.Size = resizedHeads[head] resizedHeads[head] = nil end targetedHeads[head] = true -- OUTLINE ESP local highlight = targetModel:FindFirstChild("TrueHighlightESP") if Settings.ESP_Outlines then if not highlight then highlight = Instance.new("Highlight") highlight.Name = "TrueHighlightESP" highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop highlight.FillTransparency = 1 highlight.OutlineTransparency = 0 highlight.OutlineColor = isRealPlayer and Color3.new(1,1,1) or Color3.new(1,0,0) highlight.Parent = targetModel end else if highlight then highlight:Destroy() end end -- TEXT ESP local gui = head:FindFirstChild("ESPDisplay") if Settings.ESP_TextUI then if not gui then gui = Instance.new("BillboardGui") gui.Name = "ESPDisplay" gui.Size = UDim2.new(5,0,2,0) gui.StudsOffset = Vector3.new(0,4,0) gui.AlwaysOnTop = true gui.Adornee = head local txt = Instance.new("TextLabel") txt.Name = "TextLabel" txt.Size = UDim2.new(1,0,1,0) txt.BackgroundTransparency = 1 txt.TextScaled = true txt.TextStrokeTransparency = 0 txt.TextColor3 = Color3.new(1,1,1) txt.TextStrokeColor3 = Color3.new(0,0,0) txt.Parent = gui gui.Parent = head end local displayName = isRealPlayer and isRealPlayer.Name or targetModel.Name local hum = targetModel:FindFirstChildOfClass("Humanoid") if hum then gui.TextLabel.Text = displayName .. "\nHP: " .. math.floor(hum.Health) local conn conn = hum.HealthChanged:Connect(function(health) if not gui or not gui.Parent then conn:Disconnect() return end if health <= 0 then if highlight then highlight:Destroy() end gui:Destroy() targetedHeads[head] = nil else gui.TextLabel.Text = displayName .. "\nHP: " .. math.floor(health) end end) else gui.TextLabel.Text = displayName end else if gui then gui:Destroy() end end end -- NPC REGISTRATION local function checkAndRegisterNPC(model) if not model:IsA("Model") or npcTargets[model] then return end if Players:GetPlayerFromCharacter(model) then return end local parent = model.Parent local isAllowedLocation = (parent == Workspace) or (parent and parent.Name == "AiZones") if not isAllowedLocation then return end local isValidNPC = false if model:FindFirstChildOfClass("Humanoid") then isValidNPC = true else for _, child in ipairs(model:GetChildren()) do if child:IsA("BasePart") then local name = child.Name:lower() if name:find("torso") or name:find("root") or name:find("arm") or name:find("leg") or name:find("head") then isValidNPC = true break end end end end if isValidNPC then npcTargets[model] = true local trackingPart = model:FindFirstChild("Head") or model:FindFirstChild("HumanoidRootPart") or model:FindFirstChildOfClass("BasePart") if trackingPart then processHeadTarget(trackingPart) end end end for _, child in ipairs(Workspace:GetChildren()) do if child:IsA("Model") then checkAndRegisterNPC(child) elseif child.Name == "AiZones" then for _, zoneChild in ipairs(child:GetChildren()) do if zoneChild:IsA("Model") then checkAndRegisterNPC(zoneChild) end end end end Workspace.ChildAdded:Connect(function(child) if child:IsA("Model") then task.wait(0.1) checkAndRegisterNPC(child) elseif child.Name == "AiZones" then child.ChildAdded:Connect(function(zoneChild) if zoneChild:IsA("Model") then task.wait(0.1) checkAndRegisterNPC(zoneChild) end end) end end) RunService.Heartbeat:Connect(function() for _, player in ipairs(Players:GetPlayers()) do if player ~= LocalPlayer and player.Character then local head = player.Character:FindFirstChild("Head") if head then processHeadTarget(head) end end end for model, _ in pairs(npcTargets) do if model and model.Parent then local trackingPart = model:FindFirstChild("Head") or model:FindFirstChild("HumanoidRootPart") or model:FindFirstChildOfClass("BasePart") if trackingPart then processHeadTarget(trackingPart) end end end end) -- KEYBINDS & TRACKING TRIGGER UserInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end -- V Key toggles Head lock if input.KeyCode == Enum.KeyCode.V then if not Settings.Aimbot then return end if isTracking then isTracking = false currentTargetPart = nil print("[AIM-ASSIST] Unlocked via V key") else currentTargetPart = getClosestHeadToCamera() if currentTargetPart then isTracking = true print("[AIM-ASSIST] Locked onto: " .. currentTargetPart.Name) else isTracking = false currentTargetPart = nil warn("[AIM-ASSIST] No valid target found in view.") end end end end) -- CAMERA LERP RunService:BindToRenderStep("AimAssistCamera", Enum.RenderPriority.Camera.Value + 1, function(dt) if isTracking and Settings.Aimbot then if not isValidTargetPart(currentTargetPart) then isTracking = false currentTargetPart = nil print("[AIM-ASSIST] Target invalid - Unlocked.") return end local targetPosition = currentTargetPart.Position local targetCFrame = CFrame.lookAt(Camera.CFrame.Position, targetPosition) local lerpAlpha = math.clamp(dt * TRACK_SPEED, 0, 1) Camera.CFrame = Camera.CFrame:Lerp(targetCFrame, lerpAlpha) end end) -- MOBILE UI BUILDER local function buildMobileMenu() local screenGui = Instance.new("ScreenGui") screenGui.Name = "TouchAimbotConfig" screenGui.ResetOnSpawn = false screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling screenGui.IgnoreGuiInset = true local container = Instance.new("Frame") container.Name = "ButtonHolder" container.Size = UDim2.new(0, 360, 0, 36) container.Position = UDim2.new(0.5, -180, 0, 0) container.BackgroundTransparency = 1 container.Parent = screenGui local layout = Instance.new("UIListLayout") layout.FillDirection = Enum.FillDirection.Horizontal layout.SortOrder = Enum.SortOrder.LayoutOrder layout.Padding = UDim.new(0, 6) layout.Parent = container local function formatButton(btn, text, isActive) btn.Size = UDim2.new(0, 116, 1, 0) btn.Font = Enum.Font.SourceSansBold btn.TextSize = 12 btn.Text = text btn.TextStrokeTransparency = 0 local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 4) corner.Parent = btn if isActive then btn.BackgroundColor3 = Color3.fromRGB(0,180,50) btn.TextColor3 = Color3.new(1,1,1) else btn.BackgroundColor3 = Color3.fromRGB(30,30,30) btn.TextColor3 = Color3.fromRGB(140,140,140) end end -- AIM BUTTON local btnAim = Instance.new("TextButton") btnAim.Name = "ToggleAim" formatButton(btnAim, "AIM: OFF", false) btnAim.Parent = container -- PLAYERS BUTTON local btnPlayers = Instance.new("TextButton") btnPlayers.Name = "TogglePlayers" formatButton(btnPlayers, "PLAYERS: ON", Settings.TargetPlayers) btnPlayers.Parent = container -- NPC BUTTON local btnNPCs = Instance.new("TextButton") btnNPCs.Name = "ToggleNPCs" formatButton(btnNPCs, "NPCs: OFF", Settings.TargetNPCs) btnNPCs.Parent = container btnAim.MouseButton1Click:Connect(function() mobileAimEnabled = not mobileAimEnabled if mobileAimEnabled then currentTargetPart = getClosestHeadToCamera() if currentTargetPart then isTracking = true else mobileAimEnabled = false isTracking = false end else isTracking = false currentTargetPart = nil end formatButton( btnAim, isTracking and "AIM: ON" or "AIM: OFF", isTracking ) end) btnPlayers.MouseButton1Click:Connect(function() Settings.TargetPlayers = not Settings.TargetPlayers if Settings.TargetPlayers then Settings.TargetNPCs = false end formatButton( btnPlayers, Settings.TargetPlayers and "PLAYERS: ON" or "PLAYERS: OFF", Settings.TargetPlayers ) formatButton( btnNPCs, Settings.TargetNPCs and "NPCs: ON" or "NPCs: OFF", Settings.TargetNPCs ) end) btnNPCs.MouseButton1Click:Connect(function() Settings.TargetNPCs = not Settings.TargetNPCs if Settings.TargetNPCs then Settings.TargetPlayers = false end formatButton( btnPlayers, Settings.TargetPlayers and "PLAYERS: ON" or "PLAYERS: OFF", Settings.TargetPlayers ) formatButton( btnNPCs, Settings.TargetNPCs and "NPCs: ON" or "NPCs: OFF", Settings.TargetNPCs ) end) screenGui.Parent = LocalPlayer:WaitForChild("PlayerGui") end if not UserInputService.KeyboardEnabled then buildMobileMenu() end