local Config = { Players = { Killer = {Color = Color3.fromRGB(255, 93, 108)}, Survivor = {Color = Color3.fromRGB(64, 224, 255)} }, Objects = { Generator = {Color = Color3.fromRGB(150, 0, 200)}, Gate = {Color = Color3.fromRGB(255, 255, 255)}, Pallet = {Color = Color3.fromRGB(74, 255, 181)}, Window = {Color = Color3.fromRGB(74, 255, 181)}, Hook = {Color = Color3.fromRGB(132, 255, 169)} } } local MaskNames = { ["Richard"] = "Rooster", ["Tony"] = "Tiger", ["Brandon"] = "Panther", ["Cobra"] = "Cobra", ["Richter"] = "Rat", ["Rabbit"] = "Rabbit", ["Alex"] = "Chainsaw" } local MaskColors = { ["Richard"] = Color3.fromRGB(255, 0, 0), ["Tony"] = Color3.fromRGB(255, 255, 0), ["Brandon"] = Color3.fromRGB(160, 32, 240), ["Cobra"] = Color3.fromRGB(0, 255, 0), ["Richter"] = Color3.fromRGB(0, 0, 0), ["Rabbit"] = Color3.fromRGB(255, 105, 180), ["Alex"] = Color3.fromRGB(255, 255, 255) } local Players = game:GetService("Players") local RunService = game:GetService("RunService") local VirtualInputManager = game:GetService("VirtualInputManager") local GuiService = game:GetService("GuiService") local Lighting = game:GetService("Lighting") local LocalPlayer = Players.LocalPlayer local PlayerGui = LocalPlayer:WaitForChild("PlayerGui") local ActiveGenerators = {} local LastUpdateTick = 0 local LastFullESPRefresh = 0 local TouchID = 8822 local ActionPath = "Survivor-mob.Controls.action.check" local HeartbeatConnection = nil local VisibilityConnection = nil local IndicatorGui = nil local function SetupGui() if PlayerGui:FindFirstChild("ChasedInds") then PlayerGui:FindFirstChild("ChasedInds"):Destroy() end IndicatorGui = Instance.new("ScreenGui") IndicatorGui.Name = "ChasedInds" IndicatorGui.IgnoreGuiInset = true IndicatorGui.DisplayOrder = 999 IndicatorGui.Parent = PlayerGui end local function GetGameValue(obj, name) if not obj then return nil end local attr = obj:GetAttribute(name) if attr ~= nil then return attr end local child = obj:FindFirstChild(name) if child then local success, val = pcall(function() return child.Value end) if success then return val end end return nil end local function ApplyHighlight(object, color) local h = object:FindFirstChild("H") or Instance.new("Highlight") h.Name = "H" h.Adornee = object h.FillColor = color h.OutlineColor = color h.FillTransparency = 0.8 h.OutlineTransparency = 0.3 h.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop h.Parent = object end local function CreateBillboardTag(text, color, size, textSize) local billboard = Instance.new("BillboardGui") billboard.Name = "BitchHook" billboard.AlwaysOnTop = true billboard.Size = size or UDim2.new(0, 120, 0, 30) local label = Instance.new("TextLabel") label.Name = "BitchHook" label.Size = UDim2.new(1, 0, 1, 0) label.BackgroundTransparency = 1 label.Text = text label.TextColor3 = color label.TextStrokeTransparency = 0 label.TextStrokeColor3 = Color3.new(0, 0, 0) label.Font = Enum.Font.GothamBold label.TextSize = textSize or 10 label.TextWrapped = true label.RichText = true label.Parent = billboard return billboard end local function updatePlayerNametag(player) if not IndicatorGui or not IndicatorGui.Parent then return end if not player.Character then local m = IndicatorGui:FindFirstChild(player.Name) if m then m:Destroy() end local c = IndicatorGui:FindFirstChild(player.Name .. "_Chased") if c then c:Destroy() end local k = IndicatorGui:FindFirstChild(player.Name .. "_Killer") if k then k:Destroy() end return end local rootPart = player.Character:FindFirstChild("HumanoidRootPart") local humanoid = player.Character:FindFirstChildOfClass("Humanoid") if not rootPart then return end local teamName = (player.Team and player.Team.Name:lower()) or "" local selectedKillerAttr = GetGameValue(player, "SelectedKiller") local rawMask = GetGameValue(player, "Mask") or GetGameValue(player.Character, "Mask") local isKnocked = GetGameValue(player.Character, "Knocked") local isHooked = GetGameValue(player.Character, "IsHooked") local isChased = GetGameValue(player.Character, "IsChased") local isKiller = teamName:find("killer") ~= nil local color = isKiller and Config.Players.Killer.Color or Config.Players.Survivor.Color if isHooked then color = Color3.fromRGB(255, 182, 193) elseif humanoid and humanoid.Health < humanoid.MaxHealth then color = isKnocked and Color3.fromRGB(200, 100, 0) or Color3.fromRGB(200, 200, 0) end local distance = 0 if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then distance = math.floor((rootPart.Position - LocalPlayer.Character.HumanoidRootPart.Position).Magnitude) end local baseName = (isKiller and selectedKillerAttr and tostring(selectedKillerAttr) ~= "") and tostring(selectedKillerAttr) or player.Name local billboard = rootPart:FindFirstChild("BitchHook") local nameText = baseName .. "\n[" .. distance .. " studs]" if not billboard then billboard = CreateBillboardTag(nameText, color) billboard.Adornee = rootPart billboard.Parent = rootPart else local lbl = billboard:FindFirstChild("BitchHook") or billboard:FindFirstChildOfClass("TextLabel") if lbl then lbl.Text = nameText lbl.TextColor3 = color end end ApplyHighlight(player.Character, color) local hasMask = false if isKiller and string.match(tostring(selectedKillerAttr):lower(), "masked") and rawMask then local searchMask = tostring(rawMask):lower() for key, name in pairs(MaskNames) do if key:lower() == searchMask then hasMask = true local maskBillboard = rootPart:FindFirstChild("MaskHook") if not maskBillboard then maskBillboard = CreateBillboardTag(name, MaskColors[key] or Color3.new(1,1,1), UDim2.new(0, 100, 0, 20), 12) maskBillboard.Name = "MaskHook" maskBillboard.StudsOffset = Vector3.new(0, 3, 0) maskBillboard.Adornee = rootPart maskBillboard.Parent = rootPart else local lbl = maskBillboard:FindFirstChild("BitchHook") or maskBillboard:FindFirstChildOfClass("TextLabel") if lbl then lbl.Text = name lbl.TextColor3 = MaskColors[key] or Color3.new(1,1,1) end end break end end end if not hasMask then local maskBillboard = rootPart:FindFirstChild("MaskHook") if maskBillboard then maskBillboard:Destroy() end end local chasedLabel2D = IndicatorGui:FindFirstChild(player.Name .. "_Chased") if isChased then local ct3 = billboard:FindFirstChild("ChasedLabel") if not ct3 then ct3 = Instance.new("TextLabel", billboard) ct3.Name = "ChasedLabel" ct3.Size, ct3.Position, ct3.BackgroundTransparency = UDim2.new(1,0,1,0), UDim2.new(0,0,-1.2,0), 1 ct3.Font, ct3.TextSize = Enum.Font.GothamBold, 24 end ct3.Text, ct3.TextColor3, ct3.TextStrokeTransparency = "!!", color, 0 if not chasedLabel2D then chasedLabel2D = Instance.new("TextLabel", IndicatorGui) chasedLabel2D.Name, chasedLabel2D.BackgroundTransparency = player.Name .. "_Chased", 1 chasedLabel2D.Font, chasedLabel2D.TextSize, chasedLabel2D.TextStrokeTransparency = Enum.Font.GothamBold, 24, 0 chasedLabel2D.AnchorPoint = Vector2.new(0.5, 0.5) end chasedLabel2D.Text, chasedLabel2D.TextColor3 = "!!", color local screenPos, onScreen = workspace.CurrentCamera:WorldToScreenPoint(rootPart.Position) if onScreen then chasedLabel2D.Visible = false else chasedLabel2D.Visible = true local viewportCenter = workspace.CurrentCamera.ViewportSize / 2 local direction = Vector2.new(screenPos.X, screenPos.Y) - viewportCenter if screenPos.Z < 0 then direction = -direction end local maxScale = math.max(math.abs(direction.X) / (viewportCenter.X - 30), math.abs(direction.Y) / (viewportCenter.Y - 30)) chasedLabel2D.Position = UDim2.new(0, viewportCenter.X + direction.X / (maxScale == 0 and 1 or maxScale), 0, viewportCenter.Y + direction.Y / (maxScale == 0 and 1 or maxScale)) end else if chasedLabel2D then chasedLabel2D:Destroy() end local ct3 = billboard:FindFirstChild("ChasedLabel") if ct3 then ct3:Destroy() end end local killerLabel2D = IndicatorGui:FindFirstChild(player.Name .. "_Killer") if isKiller then if not killerLabel2D then killerLabel2D = Instance.new("TextLabel", IndicatorGui) killerLabel2D.Name, killerLabel2D.BackgroundTransparency = player.Name .. "_Killer", 1 killerLabel2D.Font, killerLabel2D.TextSize, killerLabel2D.TextStrokeTransparency = Enum.Font.GothamBold, 10, 0 killerLabel2D.Size, killerLabel2D.RichText, killerLabel2D.AnchorPoint = UDim2.new(0, 120, 0, 30), true, Vector2.new(0.5, 0.5) end killerLabel2D.Text, killerLabel2D.TextColor3 = baseName .. "\n[" .. distance .. " studs]", color local screenPos, onScreen = workspace.CurrentCamera:WorldToScreenPoint(rootPart.Position) if not onScreen then killerLabel2D.Visible = true local viewportCenter = workspace.CurrentCamera.ViewportSize / 2 local direction = Vector2.new(screenPos.X, screenPos.Y) - viewportCenter if screenPos.Z < 0 then direction = -direction end local maxScale = math.max(math.abs(direction.X) / (viewportCenter.X - 30), math.abs(direction.Y) / (viewportCenter.Y - 30)) killerLabel2D.Position = UDim2.new(0, viewportCenter.X + direction.X / (maxScale == 0 and 1 or maxScale), 0, viewportCenter.Y + direction.Y / (maxScale == 0 and 1 or maxScale)) else killerLabel2D.Visible = false end elseif killerLabel2D then killerLabel2D:Destroy() end end local function updateGeneratorProgress(generator) if not generator or not generator.Parent then return true end local percent = GetGameValue(generator, "RepairProgress") or GetGameValue(generator, "Progress") or 0 local billboard = generator:FindFirstChild("GenBitchHook") if percent >= 100 then if billboard then billboard:Destroy() end local h = generator:FindFirstChild("H") if h then h:Destroy() end return true end local cp = math.clamp(percent, 0, 100) local finalColor = cp < 50 and Config.Objects.Generator.Color:Lerp(Color3.fromRGB(180, 180, 0), cp / 50) or Color3.fromRGB(180, 180, 0):Lerp(Color3.fromRGB(0, 150, 0), (cp - 50) / 50) local percentStr = string.format("[%.2f%%]", percent) if not billboard then billboard = CreateBillboardTag(percentStr, finalColor) billboard.Name, billboard.StudsOffset = "GenBitchHook", Vector3.new(0, 2, 0) billboard.Adornee = generator:FindFirstChild("defaultMaterial", true) or generator billboard.Parent = generator else local lbl = billboard:FindFirstChild("BitchHook") or billboard:FindFirstChildOfClass("TextLabel") if lbl then lbl.Text = percentStr lbl.TextColor3 = finalColor end end return false end local function updateNextKillerDisplay() if not IndicatorGui or not IndicatorGui.Parent then return end local label = IndicatorGui:FindFirstChild("NextKillerDisplay") local teamName = (LocalPlayer.Team and LocalPlayer.Team.Name:lower()) or "" if teamName:find("spectator") or teamName:find("lobby") then if not label then label = Instance.new("TextLabel", IndicatorGui) label.Name, label.Size, label.Position = "NextKillerDisplay", UDim2.new(0, 220, 0, 30), UDim2.new(0.5, 0, 0, 45) label.AnchorPoint, label.BackgroundTransparency, label.BackgroundColor3 = Vector2.new(0.5, 0), 0.5, Color3.new(0, 0, 0) label.TextColor3, label.Font, label.TextSize, label.RichText = Color3.new(1, 1, 1), Enum.Font.GothamBold, 14, true label.Text = "Next Killer: Calculating..." end local players = Players:GetPlayers() table.sort(players, function(a, b) local aA = GetGameValue(a, "AllowKiller") or false local bA = GetGameValue(b, "AllowKiller") or false if aA ~= bA then return aA == true end return (GetGameValue(a, "KillerChance") or 0) > (GetGameValue(b, "KillerChance") or 0) end) local nk = players[1] if nk then label.Text = "Next Killer: " .. (nk == LocalPlayer and "YOU" or tostring(GetGameValue(nk, "SelectedKiller") or nk.Name)) .. "" end elseif label then label:Destroy() end end local function RefreshESP() ActiveGenerators = {} for _, obj in ipairs(workspace:GetDescendants()) do if obj.Name == "Window" then ApplyHighlight(obj, Config.Objects.Window.Color) end end local Map = workspace:FindFirstChild("Map") if not Map then return end for _, obj in ipairs(Map:GetDescendants()) do if obj.Name == "Generator" then ApplyHighlight(obj, Config.Objects.Generator.Color) table.insert(ActiveGenerators, obj) elseif obj.Name == "Hook" then local m = obj:FindFirstChild("Model") if m then for _, p in ipairs(m:GetDescendants()) do if p:IsA("MeshPart") then ApplyHighlight(p, Config.Objects.Hook.Color) end end end elseif obj.Name == "Palletwrong" or obj.Name == "Pallet" then ApplyHighlight(obj, Config.Objects.Pallet.Color) elseif obj.Name == "Gate" then ApplyHighlight(obj, Config.Objects.Gate.Color) end end end local function GetActionTarget() local current = PlayerGui for segment in string.gmatch(ActionPath, "[^%.]+") do current = current and current:FindFirstChild(segment) end return current end local function TriggerMobileButton() local b = GetActionTarget() if b and b:IsA("GuiObject") then local p, s, i = b.AbsolutePosition, b.AbsoluteSize, GuiService:GetGuiInset() local cx, cy = p.X + (s.X/2) + i.X, p.Y + (s.Y/2) + i.Y pcall(function() VirtualInputManager:SendTouchEvent(TouchID, 0, cx, cy) task.wait(0.01) VirtualInputManager:SendTouchEvent(TouchID, 2, cx, cy) end) end end local function InitializeAutobuy() task.spawn(function() local prompt = PlayerGui:WaitForChild("SkillCheckPromptGui", 10) local check = prompt and prompt:WaitForChild("Check", 10) if not check then return end local line, goal = check:WaitForChild("Line"), check:WaitForChild("Goal") if VisibilityConnection then VisibilityConnection:Disconnect() end VisibilityConnection = check:GetPropertyChangedSignal("Visible"):Connect(function() if LocalPlayer.Team and LocalPlayer.Team.Name == "Survivors" and check.Visible then if HeartbeatConnection then HeartbeatConnection:Disconnect() end HeartbeatConnection = RunService.Heartbeat:Connect(function() local lr, gr = line.Rotation % 360, goal.Rotation % 360 local ss, se = (gr + 101) % 360, (gr + 115) % 360 if (ss > se and (lr >= ss or lr <= se)) or (lr >= ss and lr <= se) then TriggerMobileButton() if HeartbeatConnection then HeartbeatConnection:Disconnect() HeartbeatConnection = nil end end end) elseif HeartbeatConnection then HeartbeatConnection:Disconnect() HeartbeatConnection = nil end end) end) end workspace.ChildAdded:Connect(function(c) if c.Name == "Map" then task.wait(1) RefreshESP() end end) LocalPlayer.CharacterAdded:Connect(function() if HeartbeatConnection then HeartbeatConnection:Disconnect() end if VisibilityConnection then VisibilityConnection:Disconnect() end SetupGui() task.wait(1) InitializeAutobuy() end) RunService.Heartbeat:Connect(function() local now = tick() if now - LastUpdateTick < 0.05 then return end LastUpdateTick = now Lighting.Ambient = Color3.fromRGB(255, 255, 255) Lighting.OutdoorAmbient = Color3.fromRGB(255, 255, 255) Lighting.Brightness = 2 Lighting.ClockTime = 14 Lighting.GlobalShadows = false Lighting.FogEnd = 9e9 if now - LastFullESPRefresh > 5 then LastFullESPRefresh = now RefreshESP() end updateNextKillerDisplay() local myChar = LocalPlayer.Character local myRoot = myChar and myChar:FindFirstChild("HumanoidRootPart") local killerNearby = false for _, p in ipairs(Players:GetPlayers()) do if p ~= LocalPlayer then updatePlayerNametag(p) local pTeam = p.Team and p.Team.Name:lower() or "" if pTeam:find("killer") and myRoot and p.Character and p.Character:FindFirstChild("HumanoidRootPart") then if (p.Character.HumanoidRootPart.Position - myRoot.Position).Magnitude < 99 then killerNearby = true end end end end if myRoot then local warn = myRoot:FindFirstChild("KillerWarn") if killerNearby then if not warn then warn = CreateBillboardTag("!", Color3.fromRGB(255, 0, 0), UDim2.new(0, 50, 0, 50), 40) warn.Name, warn.StudsOffset, warn.Adornee, warn.Parent = "KillerWarn", Vector3.new(0, 4, 0), myRoot, myRoot end elseif warn then warn:Destroy() end end for i = #ActiveGenerators, 1, -1 do local g = ActiveGenerators[i] if g and g.Parent then if updateGeneratorProgress(g) then table.remove(ActiveGenerators, i) end else table.remove(ActiveGenerators, i) end end end) Players.PlayerRemoving:Connect(function(p) if not IndicatorGui then return end local l = {p.Name .. "_Chased", p.Name .. "_Killer", p.Name} for _, n in ipairs(l) do local obj = IndicatorGui:FindFirstChild(n) if obj then obj:Destroy() end end end) SetupGui() RefreshESP() InitializeAutobuy()