ESP dandy
Key RequiredUniversal

ESP dandy

Universal Scriptsubl1minalsubl1minal 18.1K views 123 executesUpdated May 13, 2025
0.0/ 5(3 votes)
030% Positive
Lua Script•295 lines (9941 chars)
--// Services
local Workspace = game:GetService("Workspace")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TextChatService = game:GetService("TextChatService")

--// Chat Compatibility
local oldChat = TextChatService.ChatVersion ~= Enum.ChatVersion.TextChatService
local function Chat(msg)
	if not oldChat then
		TextChatService.TextChannels.RBXGeneral:SendAsync(msg)
	else
		ReplicatedStorage.DefaultChatSystemChatEvents.SayMessageRequest:FireServer(msg, "All")
	end
end

--// State
local adornments = {}
local nameTags = {}
local primaryParts = {}
local isKilled = false
local espEnabled = true
local playersESPEnabled = true
local guiVisible = true

--// Folder colors
local folderColors = {
	Monsters = Color3.fromRGB(255, 0, 0),
	Generators = Color3.fromRGB(255, 255, 0),
	Items = Color3.fromRGB(0, 170, 255),
	InGamePlayers = Color3.fromRGB(0, 255, 0)
}

--// GUI Setup
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")

-- ESP GUI
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "ESPGui"
screenGui.ResetOnSpawn = false
screenGui.IgnoreGuiInset = true
screenGui.Parent = playerGui

local frame = Instance.new("Frame")
frame.Size = UDim2.new(0, 200, 0, 250)
frame.Position = UDim2.new(0.5, -100, 0.2, 0)
frame.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
frame.BorderSizePixel = 0
frame.Active = true
frame.Draggable = true
frame.Parent = screenGui

local toggleButton = Instance.new("TextButton")
toggleButton.Size = UDim2.new(1, -10, 0, 40)
toggleButton.Position = UDim2.new(0, 5, 0, 10)
toggleButton.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
toggleButton.TextColor3 = Color3.new(1, 1, 1)
toggleButton.Font = Enum.Font.SourceSansBold
toggleButton.TextScaled = true
toggleButton.Text = "ESP: ON"
toggleButton.Parent = frame
toggleButton.MouseButton1Click:Connect(function()
	espEnabled = not espEnabled
	toggleButton.Text = "ESP: " .. (espEnabled and "ON" or "OFF")
	toggleButton.BackgroundColor3 = espEnabled and Color3.fromRGB(50, 50, 50) or Color3.fromRGB(100, 0, 0)
	if not espEnabled then clearAll() end
end)

local playerButton = Instance.new("TextButton")
playerButton.Size = UDim2.new(1, -10, 0, 40)
playerButton.Position = UDim2.new(0, 5, 0, 60)
playerButton.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
playerButton.TextColor3 = Color3.new(1, 1, 1)
playerButton.Font = Enum.Font.SourceSansBold
playerButton.TextScaled = true
playerButton.Text = "Players: ON"
playerButton.Parent = frame
playerButton.MouseButton1Click:Connect(function()
	playersESPEnabled = not playersESPEnabled
	playerButton.Text = "Players: " .. (playersESPEnabled and "ON" or "OFF")
	playerButton.BackgroundColor3 = playersESPEnabled and Color3.fromRGB(50, 50, 50) or Color3.fromRGB(100, 0, 0)
end)

local monsterButton = Instance.new("TextButton")
monsterButton.Size = UDim2.new(1, -10, 0, 40)
monsterButton.Position = UDim2.new(0, 5, 0, 110)
monsterButton.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
monsterButton.TextColor3 = Color3.new(1, 1, 1)
monsterButton.Font = Enum.Font.SourceSansBold
monsterButton.TextScaled = true
monsterButton.Text = "Say Monsters"
monsterButton.Parent = frame
monsterButton.MouseButton1Click:Connect(function()
	local room = Workspace:FindFirstChild("CurrentRoom")
	local model = room and room:FindFirstChildWhichIsA("Model")
	local folder = model and model:FindFirstChild("Monsters")
	local names = {}
	if folder then
		for _, obj in ipairs(folder:GetChildren()) do
			local name = obj.Name:gsub("[Mm]onster", ""):gsub("_", " "):gsub("%s+", " "):gsub("^%s*(.-)%s*$", "%1")
			table.insert(names, name)
		end
	end
	Chat(#names > 0 and "Monsters: " .. table.concat(names, ", ") or "Monsters: None found")
end)

local healthButton = Instance.new("TextButton")
healthButton.Size = UDim2.new(1, -10, 0, 40)
healthButton.Position = UDim2.new(0, 5, 0, 160)
healthButton.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
healthButton.TextColor3 = Color3.new(1, 1, 1)
healthButton.Font = Enum.Font.SourceSansBold
healthButton.TextScaled = true
healthButton.Text = "Say Health Items"
healthButton.Parent = frame
healthButton.MouseButton1Click:Connect(function()
	local room = Workspace:FindFirstChild("CurrentRoom")
	local model = room and room:FindFirstChildWhichIsA("Model")
	local folder = model and model:FindFirstChild("Items")
	local names = {}
	if folder then
		for _, obj in ipairs(folder:GetChildren()) do
			local lower = obj.Name:lower()
			if lower:find("bandage") or lower:find("healthkit") then
				table.insert(names, obj.Name)
			end
		end
	end
	Chat(#names > 0 and "Items: " .. table.concat(names, ", ") or "Items: No Health Items")
end)

-- GUI visibility toggle (RightShift)
UserInputService.InputBegan:Connect(function(input, processed)
	if processed then return end
	if input.KeyCode == Enum.KeyCode.RightShift then
		guiVisible = not guiVisible
		screenGui.Enabled = guiVisible
		if listGui then listGui.Enabled = guiVisible end
	end
end)

-- Kill switch
local listGui -- define early
UserInputService.InputBegan:Connect(function(input, processed)
	if processed then return end
	if input.KeyCode == Enum.KeyCode.L then
		isKilled = true
		clearAll()
		if screenGui then screenGui:Destroy() end
		if listGui then listGui:Destroy() end
	end
end)

-- ESP logic
function setupESP(obj, color)
	if adornments[obj] then return end
	local part = obj:IsA("Model") and obj.PrimaryPart or obj
	if obj:IsA("Model") and not part then
		obj.PrimaryPart = obj:FindFirstChild("HumanoidRootPart") or obj:FindFirstChildWhichIsA("BasePart")
		part = obj.PrimaryPart
	end
	if not part then return end
	primaryParts[obj] = part

	local box = Instance.new("BoxHandleAdornment")
	box.Adornee = part
	box.AlwaysOnTop = true
	box.ZIndex = 0
	box.Color3 = color
	box.Transparency = 0.3
	box.Size = obj:IsA("Model") and obj:GetExtentsSize() or obj.Size
	box.Parent = part
	adornments[obj] = box

	local billboard = Instance.new("BillboardGui")
	billboard.Adornee = part
	billboard.Size = UDim2.new(0, 100, 0, 20)
	billboard.StudsOffset = Vector3.new(0, 3, 0)
	billboard.AlwaysOnTop = true
	billboard.Parent = part

	local text = Instance.new("TextLabel")
	text.BackgroundTransparency = 1
	text.Size = UDim2.new(1, 0, 1, 0)
	text.Text = obj.Name
	text.TextColor3 = Color3.new(1, 1, 1)
	text.TextStrokeTransparency = 0
	text.TextScaled = true
	text.Font = Enum.Font.SourceSansBold
	text.Parent = billboard

	nameTags[obj] = billboard
end

function clearAll()
	for _, a in pairs(adornments) do if a then a:Destroy() end end
	for _, b in pairs(nameTags) do if b then b:Destroy() end end
	adornments, nameTags, primaryParts = {}, {}, {}
end

-- Create List GUI
listGui = Instance.new("ScreenGui")
listGui.Name = "ESPListGui"
listGui.ResetOnSpawn = false
listGui.IgnoreGuiInset = true
listGui.Parent = playerGui

local listFrame = Instance.new("Frame")
listFrame.Size = UDim2.new(0, 300, 0, 300)
listFrame.Position = UDim2.new(0, 30, 0.2, 0)
listFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 25)
listFrame.BorderSizePixel = 0
listFrame.Active = true
listFrame.Draggable = true
listFrame.Parent = listGui

local dragHandle = Instance.new("TextButton")
dragHandle.Size = UDim2.new(1, 0, 0, 25)
dragHandle.Position = UDim2.new(0, 0, 0, 0)
dragHandle.BackgroundColor3 = Color3.fromRGB(45, 45, 45)
dragHandle.Text = "Monster & Item List"
dragHandle.TextColor3 = Color3.new(1, 1, 1)
dragHandle.Font = Enum.Font.SourceSansBold
dragHandle.TextSize = 18
dragHandle.AutoButtonColor = false
dragHandle.Parent = listFrame

local monsterList = Instance.new("TextLabel")
monsterList.Size = UDim2.new(0.5, 0, 1, -25)
monsterList.Position = UDim2.new(0, 0, 0, 25)
monsterList.BackgroundColor3 = Color3.fromRGB(40, 0, 0)
monsterList.TextColor3 = Color3.new(1, 1, 1)
monsterList.TextXAlignment = Enum.TextXAlignment.Left
monsterList.TextYAlignment = Enum.TextYAlignment.Top
monsterList.TextWrapped = true
monsterList.TextScaled = false
monsterList.Font = Enum.Font.Code
monsterList.Text = "Monsters:"
monsterList.Parent = listFrame

local itemList = Instance.new("TextLabel")
itemList.Size = UDim2.new(0.5, 0, 1, -25)
itemList.Position = UDim2.new(0.5, 0, 0, 25)
itemList.BackgroundColor3 = Color3.fromRGB(0, 0, 40)
itemList.TextColor3 = Color3.new(1, 1, 1)
itemList.TextXAlignment = Enum.TextXAlignment.Left
itemList.TextYAlignment = Enum.TextYAlignment.Top
itemList.TextWrapped = true
itemList.TextScaled = false
itemList.Font = Enum.Font.Code
itemList.Text = "Items:"
itemList.Parent = listFrame

-- Real-time update loop
RunService.RenderStepped:Connect(function()
	if isKilled or not espEnabled then return end

	local currentRoom = Workspace:FindFirstChild("CurrentRoom")
	local activeRoom = currentRoom and currentRoom:FindFirstChildWhichIsA("Model")
	local seen = {}

	local monsters, items = {}, {}

	for folderName, color in pairs(folderColors) do
		local folder = (folderName == "InGamePlayers" and playersESPEnabled) and Workspace:FindFirstChild("InGamePlayers") or activeRoom and activeRoom:FindFirstChild(folderName)
		if folder then
			for _, obj in ipairs(folder:GetChildren()) do
				if obj:IsA("Model") or obj:IsA("BasePart") then
					setupESP(obj, color)
					seen[obj] = true
					if folderName == "Monsters" then table.insert(monsters, obj.Name) end
					if folderName == "Items" then table.insert(items, obj.Name) end
				end
			end
		end
	end

	-- Cleanup old ESPs
	for obj in pairs(adornments) do
		if not seen[obj] or not obj:IsDescendantOf(Workspace) then
			if adornments[obj] then adornments[obj]:Destroy() end
			if nameTags[obj] then nameTags[obj]:Destroy() end
			adornments[obj] = nil
			nameTags[obj] = nil
			primaryParts[obj] = nil
		end
	end

	-- Update text lists
	monsterList.Text = "Monsters:\n" .. table.concat(monsters, "\n")
	itemList.Text = "Items:\n" .. table.concat(items, "\n")
end)

Features & Information

- ESP - Say Item - Item List ( Movable GUI )

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts