-- [[ 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 ]] -- Made by Sonia the slop crator local ScreenGui = Instance.new("ScreenGui") local MainFrame = Instance.new("Frame") local Title = Instance.new("TextLabel") local ToggleBtn = Instance.new("TextButton") local StatusLabel = Instance.new("TextLabel") local RefreshBtn = Instance.new("TextButton") ScreenGui.Name = "SoniaHub" ScreenGui.Parent = game:GetService("CoreGui") ScreenGui.ResetOnSpawn = false MainFrame.Name = "Main" MainFrame.Parent = ScreenGui MainFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 25) MainFrame.Position = UDim2.new(0.1, 0, 0.3, 0) MainFrame.Size = UDim2.new(0, 230, 0, 160) MainFrame.Active = true MainFrame.Draggable = true Title.Name = "Title" Title.Parent = MainFrame Title.BackgroundColor3 = Color3.fromRGB(35, 35, 40) Title.Size = UDim2.new(1, 0, 0, 30) Title.Font = Enum.Font.SourceSansBold Title.Text = "Supernatural NPC Lock | Sonia" Title.TextColor3 = Color3.fromRGB(255, 255, 255) Title.TextSize = 15 ToggleBtn.Name = "Toggle" ToggleBtn.Parent = MainFrame ToggleBtn.BackgroundColor3 = Color3.fromRGB(180, 50, 50) ToggleBtn.Position = UDim2.new(0.05, 0, 0.25, 0) ToggleBtn.Size = UDim2.new(0.9, 0, 0, 35) ToggleBtn.Font = Enum.Font.SourceSansBold ToggleBtn.Text = "Lock NPC: OFF" ToggleBtn.TextColor3 = Color3.fromRGB(255, 255, 255) ToggleBtn.TextSize = 16 StatusLabel.Name = "Status" StatusLabel.Parent = MainFrame StatusLabel.BackgroundTransparency = 1 StatusLabel.Position = UDim2.new(0.05, 0, 0.52, 0) StatusLabel.Size = UDim2.new(0.9, 0, 0, 20) StatusLabel.Font = Enum.Font.SourceSans StatusLabel.Text = "Target: Click Scan Below" StatusLabel.TextColor3 = Color3.fromRGB(200, 200, 200) StatusLabel.TextSize = 14 RefreshBtn.Name = "Refresh" RefreshBtn.Parent = MainFrame RefreshBtn.BackgroundColor3 = Color3.fromRGB(45, 65, 95) RefreshBtn.Position = UDim2.new(0.05, 0, 0.70, 0) RefreshBtn.Size = UDim2.new(0.9, 0, 0, 30) RefreshBtn.Font = Enum.Font.SourceSansBold RefreshBtn.Text = "Deep Scan For NPCs" RefreshBtn.TextColor3 = Color3.fromRGB(255, 255, 255) RefreshBtn.TextSize = 14 local Players = game:GetService("Players") local RunService = game:GetService("RunService") local LocalPlayer = Players.LocalPlayer local isLocked = false local currentTargetNPC = nil local loopConnection = nil local function getClosestNPC() local character = LocalPlayer.Character local myRoot = character and character:FindFirstChild("HumanoidRootPart") if not myRoot then return nil end local closestTarget = nil local shortestDistance = math.huge for _, obj in ipairs(workspace:GetDescendants()) do if obj:IsA("Model") and obj:FindFirstChild("Humanoid") and obj:FindFirstChild("HumanoidRootPart") then if not Players:GetPlayerFromCharacter(obj) and obj.Name ~= LocalPlayer.Name then local targetRoot = obj.HumanoidRootPart local dist = (myRoot.Position - targetRoot.Position).Magnitude if dist < shortestDistance then shortestDistance = dist closestTarget = obj end end end end return closestTarget end local function runTrackingLoop() if loopConnection then loopConnection:Disconnect() end loopConnection = RunService.RenderStepped:Connect(function() if not isLocked then return end local char = LocalPlayer.Character local myRoot = char and char:FindFirstChild("HumanoidRootPart") if not myRoot then return end if not currentTargetNPC or not currentTargetNPC.Parent or not currentTargetNPC:FindFirstChild("HumanoidRootPart") then currentTargetNPC = getClosestNPC() if currentTargetNPC then StatusLabel.Text = "Locked on: " .. currentTargetNPC.Name else StatusLabel.Text = "Scanning folders..." return end end local targetRoot = currentTargetNPC:FindFirstChild("HumanoidRootPart") if targetRoot then local targetCF = targetRoot.CFrame local behindPos = targetCF.Position - (targetCF.LookVector * 4) + Vector3.new(0, 0.5, 0) myRoot.CFrame = CFrame.new(behindPos, behindPos + targetCF.LookVector) end end) end ToggleBtn.MouseButton1Click:Connect(function() isLocked = not isLocked if isLocked then ToggleBtn.Text = "Lock NPC: ON" ToggleBtn.BackgroundColor3 = Color3.fromRGB(50, 150, 50) currentTargetNPC = getClosestNPC() if currentTargetNPC then StatusLabel.Text = "Locked on: " .. currentTargetNPC.Name else StatusLabel.Text = "No NPCs found yet" end runTrackingLoop() else ToggleBtn.Text = "Lock NPC: OFF" ToggleBtn.BackgroundColor3 = Color3.fromRGB(180, 50, 50) if loopConnection then loopConnection:Disconnect() end end end) RefreshBtn.MouseButton1Click:Connect(function() currentTargetNPC = getClosestNPC() if currentTargetNPC then StatusLabel.Text = "Locked on: " .. currentTargetNPC.Name else StatusLabel.Text = "Scan failed. Move closer to NPCs!" end end)