local Players = game:GetService("Players") local Workspace = game:GetService("Workspace") local LocalPlayer = Players.LocalPlayer local NPC_KEYWORDS = {"pak","bu","mas","mbak","mbah","warga","penjual","pembeli","bakso","mang","bang","tukang","customer","orang","bapak","ibu","firstcustomer"} local ANOMALY_KEYWORDS = {"pocong","kuyang","mbakun","kuntilanak","genderuwo","suster","jenglot","leak","banaspati","palasik","hantu","ghost","pontianak","wayang"} -- WHITELIST KHUSUS NPC GRANNY (PAKAI NAMA EXACT) local GRANNY_WHITELIST = {"NPCGranny", "NPCLady_Granny", "GrannyNPC", "OldLady"} local function isGrannyNPC(model) for _, name in GRANNY_WHITELIST do if model.Name == name or (model.Parent and model.Parent.Name == name) then return true end end return false end local function isNPC(nameLower) for _, word in NPC_KEYWORDS do if nameLower:find(word) then return true end end return false end local function isAnomaly(nameLower) for _, word in ANOMALY_KEYWORDS do if nameLower:find(word) then return true end end return false end local function addESP(model) if model:FindFirstChild("HEADESP_V3") or Players:GetPlayerFromCharacter(model) then return end if not model:FindFirstChild("Head") then return end local nameLower = model.Name:lower() -- GRANNY WHITELIST PRIORITAS PALING ATAS if isGrannyNPC(model) then -- dipaksa jadi NPC hijau else local isPreman = nameLower:find("badman") or (model.Parent and model.Parent.Parent and model.Parent.Parent.Parent and model.Parent.Parent.Parent.Name == "BikeGang") local isAnom = isAnomaly(nameLower) or model:GetAttribute("IsAnomaly") or model:FindFirstChild("Jumpscare") local isNpc = isNPC(nameLower) or model:FindFirstChild("Humanoid") if not isPreman and not isAnom and not isNpc then return end end local head = model.Head local label = Instance.new("BillboardGui") label.Name = "HEADESP_V3" label.Parent = head label.Adornee = head label.Size = UDim2.new(0, 300, 0, 60) label.StudsOffset = Vector3.new(0, 3.3, 0) label.AlwaysOnTop = true label.LightInfluence = 0 label.MaxDistance = 400 local text = Instance.new("TextLabel", label) text.BackgroundTransparency = 1 text.Size = UDim2.new(1,0,1,0) text.TextStrokeTransparency = 0 text.TextStrokeColor3 = Color3.new(0,0,0) text.Font = Enum.Font.GothamBlack text.TextSize = 26 game:GetService("RunService").Heartbeat:Connect(function() if not model.Parent or not head.Parent then label:Destroy() return end local dist = math.floor((LocalPlayer.Character.HumanoidRootPart.Position - head.Position).Magnitude) if dist > 400 then label.Enabled = false return end label.Enabled = true if isGrannyNPC(model) then text.Text = "NPC GRANNY\n"..dist.."m" text.TextColor3 = Color3.fromRGB(0,255,0) -- hijau aman elseif nameLower:find("badman") or (model.Parent and model.Parent.Parent and model.Parent.Parent.Parent and model.Parent.Parent.Parent.Name == "BikeGang") then text.Text = "PREMAN\n"..dist.."m" text.TextColor3 = Color3.fromRGB(255,255,0) elseif isAnomaly(nameLower) or model:GetAttribute("IsAnomaly") or model:FindFirstChild("Jumpscare") then text.Text = model.Name:upper():gsub("NPC",""):gsub("_"," ").."\n"..dist.."m" text.TextColor3 = Color3.fromRGB(255,0,0) else text.Text = "NPC\n"..dist.."m" text.TextColor3 = Color3.fromRGB(0,255,0) end end) end -- SCAN SEMUA for _, v in Workspace:GetDescendants() do if v:IsA("Model") and v:FindFirstChild("Head") then task.spawn(addESP, v) end end Workspace.DescendantAdded:Connect(function(v) task.wait(1.5) if v:IsA("Model") and v:FindFirstChild("Head") then addESP(v) end end)