ESP Template
Key RequiredUniversal

ESP Template

Universal ScriptAFriendlyExploiterAFriendlyExploiter 117 views 954 executesUpdated Aug 5, 2026
Unrated
00
Lua Script•172 lines (7423 chars)
-- ESP script template version 1
-- 100% free with no key, and it always will be
-- Made with Visual Studio Code and Roblox Studio

local function create(className, parent, instanceName)
	if className then
		local newInstance = Instance.new(className)
		if parent then
			newInstance.Parent = parent
		end
		if instanceName then
			newInstance.Name = instanceName
		end
		return newInstance
	end
end

local function getChildren(parent, specificName, specificClass)
	local children = {}
	for _, child in pairs(parent:GetChildren()) do
		local insertPosition = #children + 1
		if specificName and specificClass then
			if child.Name == specificName and child.ClassName == specificClass then
				table.insert(children, insertPosition, child)
			end
		elseif specificName then
			if child.Name == specificName then
				table.insert(children, insertPosition, child)
			end
		elseif specificClass then
			if child.ClassName == specificClass then
				table.insert(children, insertPosition, child)
			end
		else
			table.insert(children, insertPosition, child)
		end
	end
	return children
end

local function getDescendants(ancestor, specificName, specificClass)
	local descendants = {}
	for _, descendant in pairs(ancestor:GetDescendants()) do
		local insertPosition = #descendants + 1
		if specificName and specificClass then
			if descendant.Name == specificName and descendant.ClassName == specificClass then
				table.insert(descendants, insertPosition, descendant)
			end
		elseif specificName then
			if descendant.Name == specificName then
				table.insert(descendants, insertPosition, descendant)
			end
		elseif specificClass then
			if descendant.ClassName == specificClass then
				table.insert(descendants, insertPosition, descendant)
			end
		else
			table.insert(descendants, insertPosition, descendant)
		end
	end
	return descendants
end

local coreGui = game:GetService("CoreGui")

-- Removes any existing ESP folders (if you are re-executing the script)
for _, asset in pairs(getChildren(coreGui, "ESP Folder", "Folder")) do
	asset:Destroy()
end

local directory = create("Folder", coreGui, "ESP Folder")

local function espObject(object, color, showHighlight, showText, textToDisplay)
	if object then

		-- This removes any existing folders linked to the object Instance, preventing any unneccessary stacking
		for _, target in pairs(getChildren(directory, object.Name, "Folder")) do
			if target:FindFirstChild("ESP Highlight") then
				if target["ESP Highlight"].Adornee == object then
					target:Destroy()
				end
			end
		end

		-- The actual ESP creation
		local folder = create("Folder", directory, object.Name)
		local highlight = create("Highlight", folder, "ESP Highlight")
		highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
		highlight.FillColor = color or Color3.new(0, 1, 0)
		highlight.OutlineColor = color or Color3.new(0, 1, 0)
		highlight.Adornee = object
		if showHighlight then
			highlight.Enabled = true
		else
			highlight.Enabled = false
		end
		if showText then
			local gui = create("BillboardGui", folder, "ESP Gui")
			gui.Size = UDim2.fromOffset(125, 35)
			gui.Adornee = object
			gui.AlwaysOnTop = true
			local textMain = create("TextLabel", gui, "Main Text")
			textMain.TextScaled = true
			textMain.Text = textToDisplay or object.Name
			textMain.BackgroundTransparency = 1
			textMain.Size = UDim2.fromScale(1, 1)
			textMain.TextColor3 = color or Color3.new(0, 1, 0)
			local textStroke = create("UIStroke", textMain, "Text Outline")
			textStroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Contextual
			textStroke.StrokeSizingMode = Enum.StrokeSizingMode.ScaledSize
			textStroke.Thickness = 0.05
			textStroke.Color = Color3.new(0, 0, 0)
		end
	end
end

-- By this point, the script (should have) done the following:
-- ► Created an "ESP Folder" directory inside game/CoreGui
-- ► Defined all required functions to create ESP elements
-- ► Have predefined functions: create, getChildren, getDescendants and espObject

-- If one or more of those functions are not working, or the entire script itself is broken, check the Roblox console
-- You can do this by pressing F9 (PC) or by typing /console into the Roblox chat
-- Look for any yellow or red text seemingly related to the script, such as something like "LocalScript:38::Failed to index nil with Name"

-- The getChildren and getDescendants functions are essentially better versions of Instance:GetChildren() and Instance:GetDescendants()
-- The difference being they can be more precise, returning only instances matching the given parameters, rather than every instance in the library

-- An example of getChildren:
-- local allChildren = getChildren(directory, nil, "Folder")

-- Say there were 5 folders inside the directory Instance.
-- As the specificName parameter is nil (does not exist / undefined) and the specificClass is "Folder", the function returns a table of every child Instance that is a folder
-- So the returned table would look something like this:
-- allChildren = {
--    Instance_1,
--    Instance_2,
--    Instance_3,
--    Instance_4,
--    Instance_5
--}

-- To get one of the instances in the table, you simply type the table name, followed by the position of where the desired Instance is in the table
-- So if I wanted Instance_3, I would type allChildren[3]
-- This gets the third Instance in the table
-- Most programming languages start table positions at 0, but Luau starts at 1

-- It's the same with getDescendants, but that get all instances that can be found inside the ancestor, including nested ones (an instance inside another instance)
-- getDescendants can cause performance drops due to it essentially being a deep search, so it advised you do not loop it too much
-- If you need a looping search, I recommend using getChildren, setting the parent parameter to the specific Instance you want to search inside

-- An example of espObject:
-- local object = game.Workspace.Part
-- local espColor = Color3.fromRGB(255, 255, 255)
-- espObject(object, espColor, true, true, "Just a part")

-- This adds a highlight and text to the main directory folder and links them to the object Instance, both of which take on the given color parameter (in this case, white)
-- If no color parameter is provided, the highlight and the text colors will default to green.
-- The given color parameters must be in Color3 format for the function to work
-- To load colors from RGB, Hex or HSV, use Color3.fromRGB(red, green, blue), Color3.fromHex(hexColorCode) or Color3.fromHSV(hue, saturation, volume)
-- Color3.new is basically rgb but on a scale of 0 to 1 for each, 0 being the lowest and 1 being the highest
-- So to get red you'd use Color3.new(1, 0, 0), green you'd use Color3.new(0, 1, 0) and blue you'd use Color3.new(0, 0, 1)
-- To get colors in between, you use decimals
-- Like if I wanted to get dark blue I'd use Color3.new(0, 0, 0.5) or if I wanted pastel pink I'd use Color3.new(1, 0.7, 1)

-- Every line with -- before them are comments, they do not change how the script works (so you do not have to delete these comments if you do not want to)

-- That is all I have to say regarding this script. Have fun making your own ESP scripts using this template.
-- Credit is appreciated, but I'm not going to force it
-- This is just text on a screen, after all

-- Created with care by XT44_Scripts (@XT4472 on Roblox) and AFriendlyExploiter (@AFriendlyExploiter_1 on Discord) ♥

Features & Information

Easily customizable, 100% free and keyless ESP script template. Supports 99% of executors. Comes with pre-programmed functions to save time while making an ESP script.
#ESP#Template#Universal#Free#Keyless

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts