Version / Update: v1.0.0
- Download / Script Link
- --// CONFIG
local COLORS = {
KILLER = Color3.fromRGB(255, 0, 0),
ALIVE = Color3.fromRGB(0, 255, 0),
GENERATOR = Color3.fromRGB(255, 255, 0),
ESCAPE = Color3.fromRGB(255, 255, 255)
}
--// STATE
local connections = {}
local currentMap = nil
local function disconnectAll()
for _, c in ipairs(connections) do
c:Disconnect()
end
table.clear(connections)
end
local function track(c)
table.insert(connections, c)
end
--// RESOLVE CHARACTER
local function resolveCharacter(obj)
if not obj then return nil end
if obj:IsA("Model") and obj:FindFirstChildOfClass("Humanoid") then
return obj
end
for _, v in ipairs(obj:GetChildren()) do
if v:IsA("Model") then
return v
end
end
return obj
end
--// ESP (SELF HEAL)
local function applyESP(target, color)
if not target then return end
local function create()
if not target or not target.Parent then return end
local h = target:FindFirstChild("ESP")
if not h then
h = Instance.new("Highlight")
h.Name = "ESP"
h.FillTransparency = 0.5
h.OutlineTransparency = 0
h.Parent = target
end
h.Adornee = target
h.FillColor = color
h.OutlineColor = color
end
create()
track(target.ChildRemoved:Connect(function(child)
if child:IsA("Highlight") and child.Name == "ESP" then
task.defer(create)
end
end))
end
--// PLAYERS
local function setupPlayers(playersFolder)
local alive = playersFolder:WaitForChild("ALIVE")
for _, char in ipairs(alive:GetChildren()) do
applyESP(resolveCharacter(char), COLORS.ALIVE)
end
track(alive.ChildAdded:Connect(function(char)
applyESP(resolveCharacter(char), COLORS.ALIVE)
end))
-- Killer (fully robust)
local function bindKiller(killerContainer)
if not killerContainer then return end
local function update()
local char = resolveCharacter(killerContainer)
if char then
applyESP(char, COLORS.KILLER)
end
end
update()
track(killerContainer.ChildAdded:Connect(function()
task.defer(update)
end))
track(killerContainer.ChildRemoved:Connect(function()
task.defer(update)
end))
end
local killer = playersFolder:FindFirstChild("KILLER")
if killer then
bindKiller(killer)
end
track(playersFolder.ChildAdded:Connect(function(obj)
if obj.Name == "KILLER" then
task.wait()
bindKiller(obj)
end
end))
end
--// MAP
local function setupMap(map)
local generators = map:WaitForChild("Generators")
local escapes = map:WaitForChild("Escapes")
for _, g in ipairs(generators:GetChildren()) do
applyESP(g, COLORS.GENERATOR)
end
track(generators.ChildAdded:Connect(function(g)
applyESP(g, COLORS.GENERATOR)
end))
for _, e in ipairs(escapes:GetChildren()) do
applyESP(e, COLORS.ESCAPE)
end
track(escapes.ChildAdded:Connect(function(e)
applyESP(e, COLORS.ESCAPE)
end))
end
--// MAIN LOOP (RELIABLE ROUND DETECTION)
local playersFolder = workspace:WaitForChild("PLAYERS")
local mapsFolder = workspace:WaitForChild("MAPS")
task.spawn(function()
while true do
local map = mapsFolder:FindFirstChild("GAME MAP")
if map and map ~= currentMap then
currentMap = map
disconnectAll()
setupPlayers(playersFolder)
setupMap(map)
end
task.wait(0.5) -- lightweight check (2x/sec)
end
end)[ View More ]
Used with Chatgpt, no useless key system and other bullshitReveals The Killer, Survivors, Generators and Escape Gates.