Simple Open Source Esp
Key RequiredUniversal

Simple Open Source Esp

Universal Scriptwtiawtia 34 views 40 executesUpdated Jul 12, 2026
Unrated
00
Lua Script•1286 lines (37547 chars)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")

local localPlayer = Players.LocalPlayer
local camera = workspace.CurrentCamera

local BOXES_ENABLED = true
local CHAMS_ENABLED = false
local TRACERS_ENABLED = false

local ESP_COLOR = Color3.fromRGB(0, 255, 100)
local BOX_THICKNESS = 2
local BOX_THICKNESS_MIN = 1
local BOX_THICKNESS_MAX = 12
local BOX_FILL_TRANSPARENCY = 1 -- 1 = hollow outline only

local CHAMS_FILL_TRANSPARENCY = 0.6
local CHAMS_OUTLINE_TRANSPARENCY = 0.2
local TRACER_THICKNESS = 1

local MENU_KEY = Enum.KeyCode.RightShift
local UI_VISIBLE = true

local currentHue = 0.4
local currentSat = 1
local currentVal = 1

local function getESPColor()
	return Color3.fromHSV(currentHue, currentSat, currentVal)
end

ESP_COLOR = getESPColor()

local screenGui = Instance.new("ScreenGui")
screenGui.Name = "PlayerESP"
screenGui.IgnoreGuiInset = true
screenGui.ResetOnSpawn = false
screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
screenGui.Parent = localPlayer:WaitForChild("PlayerGui")

local BUTTON_HEIGHT = 34
local BUTTON_GAP = 8
local PANEL_PADDING = 12
local TITLE_BLOCK = 46
local BUTTON_COUNT = 4 
local WHEEL_SIZE = 140 
local VALUE_SLIDER_HEIGHT = 16
local COLOR_SECTION_GAP = 10
local THICKNESS_LABEL_HEIGHT = 18
local THICKNESS_SECTION_HEIGHT = THICKNESS_LABEL_HEIGHT + 6 + VALUE_SLIDER_HEIGHT + COLOR_SECTION_GAP
local THICKNESS_COLLAPSED_HEIGHT = THICKNESS_LABEL_HEIGHT + COLOR_SECTION_GAP
local COLOR_SECTION_HEIGHT = 22 + COLOR_SECTION_GAP + WHEEL_SIZE + 8 + VALUE_SLIDER_HEIGHT + 8 + 28

local PANEL_HEIGHT = TITLE_BLOCK
	+ PANEL_PADDING
	+ BUTTON_COUNT * BUTTON_HEIGHT
	+ (BUTTON_COUNT - 1) * BUTTON_GAP
	+ COLOR_SECTION_GAP
	+ THICKNESS_SECTION_HEIGHT
	+ COLOR_SECTION_HEIGHT
	+ PANEL_PADDING
local COLLAPSED_PANEL_HEIGHT = PANEL_HEIGHT - (COLOR_SECTION_HEIGHT - 22)

local panel = Instance.new("Frame")
panel.Name = "TogglePanel"
panel.AnchorPoint = Vector2.new(1, 0)
panel.Position = UDim2.new(1, -16, 0, 16)
panel.Size = UDim2.fromOffset(190, PANEL_HEIGHT)
panel.BackgroundColor3 = Color3.fromRGB(25, 25, 30)
panel.BackgroundTransparency = 0.15
panel.BorderSizePixel = 0
panel.Active = true
panel.ClipsDescendants = true
panel.ZIndex = 10
panel.Visible = UI_VISIBLE
panel.Parent = screenGui

local panelScale = Instance.new("UIScale")
panelScale.Scale = 1
panelScale.Parent = panel

local panelCorner = Instance.new("UICorner")
panelCorner.CornerRadius = UDim.new(0, 10)
panelCorner.Parent = panel

local panelStroke = Instance.new("UIStroke")
panelStroke.Color = Color3.fromRGB(70, 70, 80)
panelStroke.Thickness = 1
panelStroke.Parent = panel

local titleBar = Instance.new("Frame")
titleBar.Name = "TitleBar"
titleBar.Size = UDim2.new(1, 0, 0, TITLE_BLOCK)
titleBar.BackgroundColor3 = Color3.fromRGB(35, 35, 42)
titleBar.BackgroundTransparency = 0.05
titleBar.BorderSizePixel = 0
titleBar.Active = true
titleBar.ZIndex = 11
titleBar.Parent = panel

local titleBarCorner = Instance.new("UICorner")
titleBarCorner.CornerRadius = UDim.new(0, 10)
titleBarCorner.Parent = titleBar

local titleBarBottom = Instance.new("Frame")
titleBarBottom.Name = "TitleBarBottomFill"
titleBarBottom.AnchorPoint = Vector2.new(0, 1)
titleBarBottom.Position = UDim2.fromScale(0, 1)
titleBarBottom.Size = UDim2.new(1, 0, 0, 12)
titleBarBottom.BackgroundColor3 = titleBar.BackgroundColor3
titleBarBottom.BackgroundTransparency = titleBar.BackgroundTransparency
titleBarBottom.BorderSizePixel = 0
titleBarBottom.ZIndex = 11
titleBarBottom.Parent = titleBar

local title = Instance.new("TextLabel")
title.Name = "Title"
title.BackgroundTransparency = 1
title.Position = UDim2.fromOffset(12, 8)
title.Size = UDim2.new(1, -24, 0, 22)
title.Font = Enum.Font.GothamBold
title.Text = "Player ESP"
title.TextColor3 = Color3.fromRGB(240, 240, 245)
title.TextSize = 15
title.TextXAlignment = Enum.TextXAlignment.Left
title.Active = false
title.ZIndex = 12
title.Parent = titleBar

local dragHint = Instance.new("TextLabel")
dragHint.Name = "DragHint"
dragHint.BackgroundTransparency = 1
dragHint.Position = UDim2.fromOffset(12, 28)
dragHint.Size = UDim2.new(1, -24, 0, 14)
dragHint.Font = Enum.Font.Gotham
dragHint.Text = "Drag here to move"
dragHint.TextColor3 = Color3.fromRGB(150, 150, 160)
dragHint.TextSize = 11
dragHint.TextXAlignment = Enum.TextXAlignment.Left
dragHint.Active = false
dragHint.ZIndex = 12
dragHint.Parent = titleBar

local function addClickAnimation(button)
	local scale = Instance.new("UIScale")
	scale.Parent = button

	local function tweenScale(value, duration)
		TweenService:Create(scale, TweenInfo.new(duration, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
			Scale = value,
		}):Play()
	end

	button.MouseButton1Down:Connect(function()
		tweenScale(0.94, 0.08)
	end)
	button.MouseButton1Up:Connect(function()
		tweenScale(1.03, 0.14)
	end)
	button.MouseEnter:Connect(function()
		tweenScale(1.03, 0.14)
	end)
	button.MouseLeave:Connect(function()
		tweenScale(1, 0.14)
	end)
end

local function createToggleButton(name, layoutIndex)
	local y = TITLE_BLOCK + PANEL_PADDING + (layoutIndex - 1) * (BUTTON_HEIGHT + BUTTON_GAP)
	local button = Instance.new("TextButton")
	button.Name = name
	button.Position = UDim2.fromOffset(PANEL_PADDING, y)
	button.Size = UDim2.new(1, -PANEL_PADDING * 2, 0, BUTTON_HEIGHT)
	button.BackgroundColor3 = Color3.fromRGB(160, 50, 50)
	button.BorderSizePixel = 0
	button.Font = Enum.Font.GothamMedium
	button.Text = ""
	button.TextColor3 = Color3.fromRGB(255, 255, 255)
	button.TextSize = 14
	button.AutoButtonColor = true
	button.ZIndex = 11
	button.Parent = panel

	local corner = Instance.new("UICorner")
	corner.CornerRadius = UDim.new(0, 8)
	corner.Parent = button
	addClickAnimation(button)

	return button
end

local boxesButton = createToggleButton("BoxesButton", 1)
local chamsButton = createToggleButton("ChamsButton", 2)
local tracersButton = createToggleButton("TracersButton", 3)
local keybindButton = createToggleButton("KeybindButton", 4)

local thicknessSectionTop = TITLE_BLOCK
	+ PANEL_PADDING
	+ BUTTON_HEIGHT
	+ BUTTON_GAP

chamsButton.Position = UDim2.fromOffset(PANEL_PADDING, thicknessSectionTop + THICKNESS_SECTION_HEIGHT)
tracersButton.Position = UDim2.fromOffset(PANEL_PADDING, thicknessSectionTop + THICKNESS_SECTION_HEIGHT + BUTTON_HEIGHT + BUTTON_GAP)
keybindButton.Position = UDim2.fromOffset(PANEL_PADDING, thicknessSectionTop + THICKNESS_SECTION_HEIGHT + (BUTTON_HEIGHT + BUTTON_GAP) * 2)

local thicknessLabel = Instance.new("TextLabel")
thicknessLabel.Name = "ThicknessLabel"
thicknessLabel.BackgroundTransparency = 1
thicknessLabel.Position = UDim2.fromOffset(PANEL_PADDING, thicknessSectionTop)
thicknessLabel.Size = UDim2.new(1, -PANEL_PADDING * 2, 0, THICKNESS_LABEL_HEIGHT)
thicknessLabel.Font = Enum.Font.GothamBold
thicknessLabel.Text = "Box Thickness: " .. BOX_THICKNESS
thicknessLabel.TextColor3 = Color3.fromRGB(240, 240, 245)
thicknessLabel.TextSize = 14
thicknessLabel.TextXAlignment = Enum.TextXAlignment.Left
thicknessLabel.ZIndex = 11
thicknessLabel.Parent = panel

local thicknessDropdownButton = Instance.new("TextButton")
thicknessDropdownButton.Name = "ThicknessDropdownButton"
thicknessDropdownButton.BackgroundTransparency = 1
thicknessDropdownButton.Position = UDim2.fromOffset(PANEL_PADDING, thicknessSectionTop)
thicknessDropdownButton.Size = UDim2.new(1, -PANEL_PADDING * 2, 0, THICKNESS_LABEL_HEIGHT)
thicknessDropdownButton.Text = ""
thicknessDropdownButton.ZIndex = 10
thicknessDropdownButton.Parent = panel
addClickAnimation(thicknessDropdownButton)

local thicknessDropdownArrow = Instance.new("TextLabel")
thicknessDropdownArrow.Name = "ThicknessDropdownArrow"
thicknessDropdownArrow.BackgroundTransparency = 1
thicknessDropdownArrow.AnchorPoint = Vector2.new(1, 0.5)
thicknessDropdownArrow.Position = UDim2.new(1, -PANEL_PADDING, 0, thicknessSectionTop + THICKNESS_LABEL_HEIGHT * 0.5)
thicknessDropdownArrow.Size = UDim2.fromOffset(16, 18)
thicknessDropdownArrow.Font = Enum.Font.GothamBold
thicknessDropdownArrow.Text = "^"
thicknessDropdownArrow.TextColor3 = Color3.fromRGB(190, 190, 200)
thicknessDropdownArrow.TextSize = 12
thicknessDropdownArrow.ZIndex = 12
thicknessDropdownArrow.Parent = panel

local thicknessSlider = Instance.new("Frame")
thicknessSlider.Name = "ThicknessSlider"
thicknessSlider.Position = UDim2.fromOffset(PANEL_PADDING, thicknessSectionTop + THICKNESS_LABEL_HEIGHT + 6)
thicknessSlider.Size = UDim2.new(1, -PANEL_PADDING * 2, 0, VALUE_SLIDER_HEIGHT)
thicknessSlider.BackgroundColor3 = Color3.fromRGB(45, 45, 55)
thicknessSlider.BorderSizePixel = 0
thicknessSlider.Active = true
thicknessSlider.ZIndex = 11
thicknessSlider.Parent = panel

local thicknessSliderCorner = Instance.new("UICorner")
thicknessSliderCorner.CornerRadius = UDim.new(0, 6)
thicknessSliderCorner.Parent = thicknessSlider

local thicknessFill = Instance.new("Frame")
thicknessFill.Name = "Fill"
thicknessFill.Size = UDim2.fromScale(
	(BOX_THICKNESS - BOX_THICKNESS_MIN) / (BOX_THICKNESS_MAX - BOX_THICKNESS_MIN),
	1
)
thicknessFill.BackgroundColor3 = Color3.fromRGB(0, 170, 80)
thicknessFill.BorderSizePixel = 0
thicknessFill.ZIndex = 12
thicknessFill.Parent = thicknessSlider

local thicknessFillCorner = Instance.new("UICorner")
thicknessFillCorner.CornerRadius = UDim.new(0, 6)
thicknessFillCorner.Parent = thicknessFill

local thicknessKnob = Instance.new("Frame")
thicknessKnob.Name = "ThicknessKnob"
thicknessKnob.AnchorPoint = Vector2.new(0.5, 0.5)
thicknessKnob.Position = UDim2.fromScale(
	(BOX_THICKNESS - BOX_THICKNESS_MIN) / (BOX_THICKNESS_MAX - BOX_THICKNESS_MIN),
	0.5
)
thicknessKnob.Size = UDim2.fromOffset(10, VALUE_SLIDER_HEIGHT + 4)
thicknessKnob.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
thicknessKnob.BorderSizePixel = 0
thicknessKnob.ZIndex = 13
thicknessKnob.Parent = thicknessSlider

local thicknessKnobCorner = Instance.new("UICorner")
thicknessKnobCorner.CornerRadius = UDim.new(0, 4)
thicknessKnobCorner.Parent = thicknessKnob

local thicknessKnobStroke = Instance.new("UIStroke")
thicknessKnobStroke.Color = Color3.fromRGB(40, 40, 45)
thicknessKnobStroke.Thickness = 1
thicknessKnobStroke.Parent = thicknessKnob

local colorSectionTop = keybindButton.Position.Y.Offset + BUTTON_HEIGHT + COLOR_SECTION_GAP

local colorLabel = Instance.new("TextLabel")
colorLabel.Name = "ColorLabel"
colorLabel.BackgroundTransparency = 1
colorLabel.Position = UDim2.fromOffset(PANEL_PADDING, colorSectionTop)
colorLabel.Size = UDim2.new(1, -PANEL_PADDING * 2 - 36, 0, 22)
colorLabel.Font = Enum.Font.GothamBold
colorLabel.Text = "Color"
colorLabel.TextColor3 = Color3.fromRGB(240, 240, 245)
colorLabel.TextSize = 14
colorLabel.TextXAlignment = Enum.TextXAlignment.Left
colorLabel.ZIndex = 12
colorLabel.Parent = panel

local colorPreview = Instance.new("Frame")
colorPreview.Name = "ColorPreview"
colorPreview.AnchorPoint = Vector2.new(1, 0)
colorPreview.Position = UDim2.new(1, -PANEL_PADDING, 0, colorSectionTop)
colorPreview.Size = UDim2.fromOffset(28, 22)
colorPreview.BackgroundColor3 = ESP_COLOR
colorPreview.BorderSizePixel = 0
colorPreview.ZIndex = 12
colorPreview.Parent = panel

local previewCorner = Instance.new("UICorner")
previewCorner.CornerRadius = UDim.new(0, 6)
previewCorner.Parent = colorPreview

local previewStroke = Instance.new("UIStroke")
previewStroke.Color = Color3.fromRGB(200, 200, 210)
previewStroke.Thickness = 1
previewStroke.Parent = colorPreview

local colorDropdownButton = Instance.new("TextButton")
colorDropdownButton.Name = "ColorDropdownButton"
colorDropdownButton.BackgroundTransparency = 1
colorDropdownButton.Position = UDim2.fromOffset(PANEL_PADDING, colorSectionTop)
colorDropdownButton.Size = UDim2.new(1, -PANEL_PADDING * 2, 0, 22)
colorDropdownButton.Text = ""
colorDropdownButton.ZIndex = 11
colorDropdownButton.Parent = panel
addClickAnimation(colorDropdownButton)

local colorDropdownArrow = Instance.new("TextLabel")
colorDropdownArrow.Name = "DropdownArrow"
colorDropdownArrow.BackgroundTransparency = 1
colorDropdownArrow.AnchorPoint = Vector2.new(1, 0.5)
colorDropdownArrow.Position = UDim2.new(1, -PANEL_PADDING - 34, 0, colorSectionTop + 11)
colorDropdownArrow.Size = UDim2.fromOffset(16, 18)
colorDropdownArrow.Font = Enum.Font.GothamBold
colorDropdownArrow.Text = "^"
colorDropdownArrow.TextColor3 = Color3.fromRGB(190, 190, 200)
colorDropdownArrow.TextSize = 12
colorDropdownArrow.ZIndex = 13
colorDropdownArrow.Parent = panel

local wheelTop = colorSectionTop + 22 + COLOR_SECTION_GAP
local wheelLeft = math.floor((190 - WHEEL_SIZE) / 2)

local wheelHolder = Instance.new("Frame")
wheelHolder.Name = "ColorWheel"
wheelHolder.Position = UDim2.fromOffset(wheelLeft, wheelTop)
wheelHolder.Size = UDim2.fromOffset(WHEEL_SIZE, WHEEL_SIZE)
wheelHolder.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
wheelHolder.BorderSizePixel = 0
wheelHolder.Active = true
wheelHolder.ZIndex = 11
wheelHolder.ClipsDescendants = true
wheelHolder.Parent = panel

local wheelHolderCorner = Instance.new("UICorner")
wheelHolderCorner.CornerRadius = UDim.new(0, 6)
wheelHolderCorner.Parent = wheelHolder

local wheelOutline = Instance.new("UIStroke")
wheelOutline.Color = Color3.fromRGB(90, 90, 100)
wheelOutline.Thickness = 1
wheelOutline.Parent = wheelHolder

local saturationGradient = Instance.new("UIGradient")
saturationGradient.Color = ColorSequence.new({
	ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 255, 255)),
	ColorSequenceKeypoint.new(1, Color3.fromHSV(currentHue, 1, 1)),
})
saturationGradient.Parent = wheelHolder

local brightnessOverlay = Instance.new("Frame")
brightnessOverlay.Name = "BrightnessOverlay"
brightnessOverlay.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
brightnessOverlay.BorderSizePixel = 0
brightnessOverlay.Size = UDim2.fromScale(1, 1)
brightnessOverlay.ZIndex = 13
brightnessOverlay.Parent = wheelHolder

local brightnessGradient = Instance.new("UIGradient")
brightnessGradient.Rotation = 90
brightnessGradient.Transparency = NumberSequence.new({
	NumberSequenceKeypoint.new(0, 1),
	NumberSequenceKeypoint.new(1, 0),
})
brightnessGradient.Parent = brightnessOverlay

local wheelSelector = Instance.new("Frame")
wheelSelector.Name = "WheelSelector"
wheelSelector.AnchorPoint = Vector2.new(0.5, 0.5)
wheelSelector.Size = UDim2.fromOffset(12, 12)
wheelSelector.BackgroundTransparency = 1
wheelSelector.BorderSizePixel = 0
wheelSelector.ZIndex = 20
wheelSelector.Parent = wheelHolder

local selectorStroke = Instance.new("UIStroke")
selectorStroke.Color = Color3.fromRGB(255, 255, 255)
selectorStroke.Thickness = 2
selectorStroke.Parent = wheelSelector

local selectorCorner = Instance.new("UICorner")
selectorCorner.CornerRadius = UDim.new(1, 0)
selectorCorner.Parent = wheelSelector

local selectorFill = Instance.new("Frame")
selectorFill.Name = "SelectorCore"
selectorFill.AnchorPoint = Vector2.new(0.5, 0.5)
selectorFill.Position = UDim2.fromScale(0.5, 0.5)
selectorFill.Size = UDim2.fromOffset(4, 4)
selectorFill.BackgroundColor3 = Color3.fromRGB(30, 30, 35)
selectorFill.BorderSizePixel = 0
selectorFill.ZIndex = 21
selectorFill.Parent = wheelSelector

local selectorFillCorner = Instance.new("UICorner")
selectorFillCorner.CornerRadius = UDim.new(1, 0)
selectorFillCorner.Parent = selectorFill

local valueTop = wheelTop + WHEEL_SIZE + 8
local valueSlider = Instance.new("Frame")
valueSlider.Name = "ValueSlider"
valueSlider.Position = UDim2.fromOffset(PANEL_PADDING, valueTop)
valueSlider.Size = UDim2.new(1, -PANEL_PADDING * 2, 0, VALUE_SLIDER_HEIGHT)
valueSlider.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
valueSlider.BorderSizePixel = 0
valueSlider.Active = true
valueSlider.ZIndex = 11
valueSlider.Parent = panel

local valueCorner = Instance.new("UICorner")
valueCorner.CornerRadius = UDim.new(0, 6)
valueCorner.Parent = valueSlider

local valueGradient = Instance.new("UIGradient")
valueGradient.Color = ColorSequence.new({
	ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 0, 0)),
	ColorSequenceKeypoint.new(0.17, Color3.fromRGB(255, 255, 0)),
	ColorSequenceKeypoint.new(0.33, Color3.fromRGB(0, 255, 0)),
	ColorSequenceKeypoint.new(0.5, Color3.fromRGB(0, 255, 255)),
	ColorSequenceKeypoint.new(0.67, Color3.fromRGB(0, 0, 255)),
	ColorSequenceKeypoint.new(0.83, Color3.fromRGB(255, 0, 255)),
	ColorSequenceKeypoint.new(1, Color3.fromRGB(255, 0, 0)),
})
valueGradient.Parent = valueSlider

local valueKnob = Instance.new("Frame")
valueKnob.Name = "ValueKnob"
valueKnob.AnchorPoint = Vector2.new(0.5, 0.5)
valueKnob.Position = UDim2.fromScale(currentHue, 0.5)
valueKnob.Size = UDim2.fromOffset(10, VALUE_SLIDER_HEIGHT + 4)
valueKnob.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
valueKnob.BorderSizePixel = 0
valueKnob.ZIndex = 12
valueKnob.Parent = valueSlider

local valueKnobCorner = Instance.new("UICorner")
valueKnobCorner.CornerRadius = UDim.new(0, 4)
valueKnobCorner.Parent = valueKnob

local valueKnobStroke = Instance.new("UIStroke")
valueKnobStroke.Color = Color3.fromRGB(40, 40, 45)
valueKnobStroke.Thickness = 1
valueKnobStroke.Parent = valueKnob

local hexLabel = Instance.new("TextLabel")
hexLabel.Name = "HexLabel"
hexLabel.BackgroundTransparency = 1
hexLabel.Position = UDim2.fromOffset(PANEL_PADDING, valueTop + VALUE_SLIDER_HEIGHT + 6)
hexLabel.Size = UDim2.new(1, -PANEL_PADDING * 2, 0, 18)
hexLabel.Font = Enum.Font.GothamMedium
hexLabel.Text = ""
hexLabel.TextColor3 = Color3.fromRGB(180, 180, 190)
hexLabel.TextSize = 12
hexLabel.TextXAlignment = Enum.TextXAlignment.Center
hexLabel.ZIndex = 11
hexLabel.Parent = panel

local thicknessDropdownOpen = true
local colorDropdownOpen = true
local panelResizeTween = nil
local colorDropdownRequest = 0

local thicknessShiftedItems = {
	chamsButton,
	tracersButton,
	keybindButton,
	colorLabel,
	colorPreview,
	colorDropdownButton,
	colorDropdownArrow,
	wheelHolder,
	valueSlider,
	hexLabel,
}
local thicknessItemPositions = {}
for _, gui in ipairs(thicknessShiftedItems) do
	thicknessItemPositions[gui] = gui.Position
end

local function getPanelTargetHeight()
	local height = PANEL_HEIGHT
	if not thicknessDropdownOpen then
		height = height - (THICKNESS_SECTION_HEIGHT - THICKNESS_COLLAPSED_HEIGHT)
	end
	if not colorDropdownOpen then
		height = height - (COLOR_SECTION_HEIGHT - 22)
	end
	return height
end

local function resizePanel()
	if panelResizeTween then
		panelResizeTween:Cancel()
	end
	panelResizeTween = TweenService:Create(
		panel,
		TweenInfo.new(0.22, Enum.EasingStyle.Quart, Enum.EasingDirection.Out),
		{ Size = UDim2.fromOffset(190, getPanelTargetHeight()) }
	)
	panelResizeTween:Play()
	return panelResizeTween
end

local function setThicknessDropdown(open)
	if thicknessDropdownOpen == open then
		return
	end

	thicknessDropdownOpen = open
	thicknessDropdownArrow.Text = open and "^" or "v"
	thicknessSlider.Visible = open

	local shift = open and 0 or -(THICKNESS_SECTION_HEIGHT - THICKNESS_COLLAPSED_HEIGHT)
	for _, gui in ipairs(thicknessShiftedItems) do
		local originalPosition = thicknessItemPositions[gui]
		TweenService:Create(
			gui,
			TweenInfo.new(0.22, Enum.EasingStyle.Quart, Enum.EasingDirection.Out),
			{
				Position = UDim2.new(
					originalPosition.X.Scale,
					originalPosition.X.Offset,
					originalPosition.Y.Scale,
					originalPosition.Y.Offset + shift
				),
			}
		):Play()
	end
	resizePanel()
end

thicknessDropdownButton.MouseButton1Click:Connect(function()
	setThicknessDropdown(not thicknessDropdownOpen)
end)

local function setColorDropdown(open)
	if colorDropdownOpen == open then
		return
	end

	colorDropdownOpen = open
	colorDropdownRequest = colorDropdownRequest + 1
	local request = colorDropdownRequest
	colorDropdownArrow.Text = open and "^" or "v"

	if open then
		wheelHolder.Visible = true
		valueSlider.Visible = true
		hexLabel.Visible = true
	end

	local resizeTween = resizePanel()

	if not open then
		resizeTween.Completed:Connect(function(playbackState)
			if request == colorDropdownRequest and playbackState == Enum.PlaybackState.Completed then
				wheelHolder.Visible = false
				valueSlider.Visible = false
				hexLabel.Visible = false
			end
		end)
	end
end

colorDropdownButton.MouseButton1Click:Connect(function()
	setColorDropdown(not colorDropdownOpen)
end)

local function colorToHex(color)
	local r = math.floor(color.R * 255 + 0.5)
	local g = math.floor(color.G * 255 + 0.5)
	local b = math.floor(color.B * 255 + 0.5)
	return string.format("#%02X%02X%02X", r, g, b)
end

local dragging = false
local dragStart = nil
local startPos = nil

titleBar.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1
		or input.UserInputType == Enum.UserInputType.Touch
	then
		dragging = true
		dragStart = input.Position
		startPos = panel.Position

		local endedConn
		endedConn = input.Changed:Connect(function()
			if input.UserInputState == Enum.UserInputState.End then
				dragging = false
				dragStart = nil
				startPos = nil
				endedConn:Disconnect()
			end
		end)
	end
end)

UserInputService.InputChanged:Connect(function(input)
	if not dragging or not dragStart or not startPos then
		return
	end
	if input.UserInputType == Enum.UserInputType.MouseMovement
		or input.UserInputType == Enum.UserInputType.Touch
	then
		local delta = input.Position - dragStart
		panel.Position = UDim2.new(
			startPos.X.Scale,
			startPos.X.Offset + delta.X,
			startPos.Y.Scale,
			startPos.Y.Offset + delta.Y
		)
	end
end)

local listeningForKeybind = false

local function refreshKeybindButton()
	if listeningForKeybind then
		keybindButton.Text = "Press any key..."
		keybindButton.BackgroundColor3 = Color3.fromRGB(70, 90, 180)
	else
		keybindButton.Text = "Menu Key: " .. MENU_KEY.Name
		keybindButton.BackgroundColor3 = Color3.fromRGB(55, 55, 70)
	end
end

local function setUiVisible(visible)
	UI_VISIBLE = visible
	if visible then
		panel.Visible = true
		panelScale.Scale = 0.88
		TweenService:Create(
			panelScale,
			TweenInfo.new(0.2, Enum.EasingStyle.Back, Enum.EasingDirection.Out),
			{ Scale = 1 }
		):Play()
	else
		local closeTween = TweenService:Create(
			panelScale,
			TweenInfo.new(0.14, Enum.EasingStyle.Quad, Enum.EasingDirection.In),
			{ Scale = 0.88 }
		)
		closeTween:Play()
		closeTween.Completed:Once(function(playbackState)
			if playbackState == Enum.PlaybackState.Completed and not UI_VISIBLE then
				panel.Visible = false
			end
		end)
	end
end

keybindButton.MouseButton1Click:Connect(function()
	listeningForKeybind = true
	refreshKeybindButton()
end)

UserInputService.InputBegan:Connect(function(input, _gameProcessed)
	if listeningForKeybind then
		if input.UserInputType == Enum.UserInputType.Keyboard then
			if input.KeyCode == Enum.KeyCode.Escape then
				listeningForKeybind = false
				refreshKeybindButton()
				return
			end
			MENU_KEY = input.KeyCode
			listeningForKeybind = false
			refreshKeybindButton()
		end
		return
	end

	if input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode == MENU_KEY then
		setUiVisible(not UI_VISIBLE)
	end
end)

refreshKeybindButton()

local boxes = {}
local chams = {}
local tracers = {}

local function setToggleLook(button, label, enabled)
	if enabled then
		button.Text = label .. ": ON"
		button.BackgroundColor3 = Color3.fromRGB(0, 170, 80)
	else
		button.Text = label .. ": OFF"
		button.BackgroundColor3 = Color3.fromRGB(160, 50, 50)
	end
end

local function applyColorToVisuals(color)
	ESP_COLOR = color
	colorPreview.BackgroundColor3 = color
	hexLabel.Text = colorToHex(color)

	saturationGradient.Color = ColorSequence.new({
		ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 255, 255)),
		ColorSequenceKeypoint.new(1, Color3.fromHSV(currentHue, 1, 1)),
	})

	for _, container in pairs(boxes) do
		local fill = container:FindFirstChild("Fill")
		if fill and fill:IsA("Frame") then
			fill.BackgroundColor3 = color
		end
		for _, child in container:GetChildren() do
			if child:IsA("Frame") and child.Name ~= "Fill" then
				child.BackgroundColor3 = color
			end
		end
	end

	for _, highlight in pairs(chams) do
		highlight.FillColor = color
		highlight.OutlineColor = color
	end

	for _, line in pairs(tracers) do
		line.BackgroundColor3 = color
	end
end

local function updateWheelSelector()
	wheelSelector.Position = UDim2.fromScale(currentSat, 1 - currentVal)
	valueKnob.Position = UDim2.fromScale(currentHue, 0.5)
end

local function setColorFromHSV(h, s, v)
	currentHue = math.clamp(h, 0, 1)
	currentSat = math.clamp(s, 0, 1)
	currentVal = math.clamp(v, 0, 1)
	updateWheelSelector()
	applyColorToVisuals(getESPColor())
end

local function pickFromWheel(mouseX, mouseY)
	local abs = wheelHolder.AbsolutePosition
	local size = wheelHolder.AbsoluteSize
	local saturation = math.clamp((mouseX - abs.X) / math.max(size.X, 1), 0, 1)
	local value = 1 - math.clamp((mouseY - abs.Y) / math.max(size.Y, 1), 0, 1)
	setColorFromHSV(currentHue, saturation, value)
end

local function pickFromValueSlider(mouseX)
	local abs = valueSlider.AbsolutePosition
	local size = valueSlider.AbsoluteSize
	local t = math.clamp((mouseX - abs.X) / math.max(size.X, 1), 0, 1)
	setColorFromHSV(t, currentSat, currentVal)
end

local pickingWheel = false
local pickingValue = false

local function bindPicker(gui, onBegin, onMove)
	gui.InputBegan:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.MouseButton1
			or input.UserInputType == Enum.UserInputType.Touch
		then
			onBegin(input)
			local conn
			conn = input.Changed:Connect(function()
				if input.UserInputState == Enum.UserInputState.End then
					pickingWheel = false
					pickingValue = false
					conn:Disconnect()
				end
			end)
		end
	end)
end

bindPicker(wheelHolder, function()
	pickingWheel = true
	local mouse = UserInputService:GetMouseLocation()
	pickFromWheel(mouse.X, mouse.Y)
end, function() end)

bindPicker(valueSlider, function()
	pickingValue = true
	local mouse = UserInputService:GetMouseLocation()
	pickFromValueSlider(mouse.X)
end, function() end)

UserInputService.InputChanged:Connect(function(input)
	if input.UserInputType ~= Enum.UserInputType.MouseMovement
		and input.UserInputType ~= Enum.UserInputType.Touch
	then
		return
	end
	if pickingWheel then
		pickFromWheel(input.Position.X, input.Position.Y)
	elseif pickingValue then
		pickFromValueSlider(input.Position.X)
	end
end)

local function createBoxFrame()
	local container = Instance.new("Frame")
	container.Name = "PlayerBox2D"
	container.BackgroundTransparency = 1
	container.BorderSizePixel = 0
	container.Visible = false
	container.ZIndex = 1
	container.Parent = screenGui

	if BOX_FILL_TRANSPARENCY < 1 then
		local fill = Instance.new("Frame")
		fill.Name = "Fill"
		fill.BackgroundColor3 = ESP_COLOR
		fill.BackgroundTransparency = BOX_FILL_TRANSPARENCY
		fill.BorderSizePixel = 0
		fill.Size = UDim2.fromScale(1, 1)
		fill.ZIndex = 1
		fill.Parent = container
	end

	local function makeEdge(name, position, size)
		local edge = Instance.new("Frame")
		edge.Name = name
		edge.BackgroundColor3 = ESP_COLOR
		edge.BackgroundTransparency = 0
		edge.BorderSizePixel = 0
		edge.Position = position
		edge.Size = size
		edge.ZIndex = 2
		edge.Parent = container
	end

	local t = BOX_THICKNESS
	makeEdge("Top", UDim2.fromOffset(0, 0), UDim2.new(1, 0, 0, t))
	makeEdge("Bottom", UDim2.new(0, 0, 1, -t), UDim2.new(1, 0, 0, t))
	makeEdge("Left", UDim2.fromOffset(0, 0), UDim2.new(0, t, 1, 0))
	makeEdge("Right", UDim2.new(1, -t, 0, 0), UDim2.new(0, t, 1, 0))

	return container
end

local function setBoxThickness(thickness)
	BOX_THICKNESS = math.clamp(thickness, BOX_THICKNESS_MIN, BOX_THICKNESS_MAX)

	local range = BOX_THICKNESS_MAX - BOX_THICKNESS_MIN
	local percentage = range > 0 and (BOX_THICKNESS - BOX_THICKNESS_MIN) / range or 0
	thicknessLabel.Text = string.format("Box Thickness: %.1f", BOX_THICKNESS)
	thicknessFill.Size = UDim2.fromScale(percentage, 1)
	thicknessKnob.Position = UDim2.fromScale(percentage, 0.5)

	for _, container in pairs(boxes) do
		local top = container:FindFirstChild("Top")
		local bottom = container:FindFirstChild("Bottom")
		local left = container:FindFirstChild("Left")
		local right = container:FindFirstChild("Right")

		if top and top:IsA("Frame") then
			top.Size = UDim2.new(1, 0, 0, BOX_THICKNESS)
		end
		if bottom and bottom:IsA("Frame") then
			bottom.Position = UDim2.new(0, 0, 1, -BOX_THICKNESS)
			bottom.Size = UDim2.new(1, 0, 0, BOX_THICKNESS)
		end
		if left and left:IsA("Frame") then
			left.Size = UDim2.new(0, BOX_THICKNESS, 1, 0)
		end
		if right and right:IsA("Frame") then
			right.Position = UDim2.new(1, -BOX_THICKNESS, 0, 0)
			right.Size = UDim2.new(0, BOX_THICKNESS, 1, 0)
		end
	end
end

local function pickFromThicknessSlider(mouseX)
	local absolutePosition = thicknessSlider.AbsolutePosition
	local absoluteSize = thicknessSlider.AbsoluteSize
	local percentage = math.clamp((mouseX - absolutePosition.X) / math.max(absoluteSize.X, 1), 0, 1)
	setBoxThickness(BOX_THICKNESS_MIN + percentage * (BOX_THICKNESS_MAX - BOX_THICKNESS_MIN))
end

local pickingThickness = false

thicknessSlider.InputBegan:Connect(function(input)
	if input.UserInputType ~= Enum.UserInputType.MouseButton1
		and input.UserInputType ~= Enum.UserInputType.Touch
	then
		return
	end

	pickingThickness = true
	pickFromThicknessSlider(input.Position.X)

	local connection
	connection = input.Changed:Connect(function()
		if input.UserInputState == Enum.UserInputState.End then
			pickingThickness = false
			connection:Disconnect()
		end
	end)
end)

UserInputService.InputChanged:Connect(function(input)
	if pickingThickness and (input.UserInputType == Enum.UserInputType.MouseMovement
		or input.UserInputType == Enum.UserInputType.Touch) then
		pickFromThicknessSlider(input.Position.X)
	end
end)

local function clearBox(character)
	local frame = boxes[character]
	if frame then
		frame:Destroy()
		boxes[character] = nil
	end
end

local function hideAllBoxes()
	for _, frame in pairs(boxes) do
		frame.Visible = false
	end
end

local function ensureBox(character)
	local frame = boxes[character]
	if not frame then
		frame = createBoxFrame()
		boxes[character] = frame
	end
	return frame
end

local function clearCham(character)
	local highlight = chams[character]
	if highlight then
		highlight:Destroy()
		chams[character] = nil
	end
end

local function clearAllChams()
	for character in pairs(chams) do
		clearCham(character)
	end
end

local function ensureCham(character)
	local highlight = chams[character]
	if not highlight then
		highlight = Instance.new("Highlight")
		highlight.Name = "PlayerChams"
		highlight.Adornee = character
		highlight.FillColor = ESP_COLOR
		highlight.FillTransparency = CHAMS_FILL_TRANSPARENCY
		highlight.OutlineColor = ESP_COLOR
		highlight.OutlineTransparency = CHAMS_OUTLINE_TRANSPARENCY
		highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
		highlight.Parent = character
		chams[character] = highlight
	else
		highlight.FillColor = ESP_COLOR
		highlight.OutlineColor = ESP_COLOR
	end
	return highlight
end

local function createTracerFrame()
	local line = Instance.new("Frame")
	line.Name = "PlayerTracer"
	line.AnchorPoint = Vector2.new(0.5, 0.5)
	line.BackgroundColor3 = ESP_COLOR
	line.BackgroundTransparency = 0
	line.BorderSizePixel = 0
	line.Visible = false
	line.ZIndex = 1
	line.Parent = screenGui
	return line
end

local function clearTracer(character)
	local line = tracers[character]
	if line then
		line:Destroy()
		tracers[character] = nil
	end
end

local function hideAllTracers()
	for _, line in pairs(tracers) do
		line.Visible = false
	end
end

local function ensureTracer(character)
	local line = tracers[character]
	if not line then
		line = createTracerFrame()
		tracers[character] = line
	else
		line.BackgroundColor3 = ESP_COLOR
	end
	return line
end

local function updateTracerLine(line, fromX, fromY, toX, toY)
	local dx = toX - fromX
	local dy = toY - fromY
	local length = math.sqrt(dx * dx + dy * dy)
	if length < 1 then
		line.Visible = false
		return
	end

	line.Visible = true
	line.BackgroundColor3 = ESP_COLOR
	line.Size = UDim2.fromOffset(length, TRACER_THICKNESS)
	line.Position = UDim2.fromOffset((fromX + toX) * 0.5, (fromY + toY) * 0.5)
	line.Rotation = math.deg(math.atan2(dy, dx))
end

local function clearAllVisuals(character)
	clearBox(character)
	clearCham(character)
	clearTracer(character)
end

local function refreshToggleUI()
	setToggleLook(boxesButton, "Boxes", BOXES_ENABLED)
	setToggleLook(chamsButton, "Chams", CHAMS_ENABLED)
	setToggleLook(tracersButton, "Tracers", TRACERS_ENABLED)

	if not BOXES_ENABLED then
		hideAllBoxes()
	end
	if not CHAMS_ENABLED then
		clearAllChams()
	end
	if not TRACERS_ENABLED then
		hideAllTracers()
	end
end

boxesButton.MouseButton1Click:Connect(function()
	BOXES_ENABLED = not BOXES_ENABLED
	refreshToggleUI()
end)

chamsButton.MouseButton1Click:Connect(function()
	CHAMS_ENABLED = not CHAMS_ENABLED
	refreshToggleUI()
end)

tracersButton.MouseButton1Click:Connect(function()
	TRACERS_ENABLED = not TRACERS_ENABLED
	refreshToggleUI()
end)

refreshToggleUI()
setColorFromHSV(currentHue, currentSat, currentVal)

local function getCorners(cf, size)
	local half = size * 0.5
	local x, y, z = half.X, half.Y, half.Z
	return {
		cf:PointToWorldSpace(Vector3.new(-x, -y, -z)),
		cf:PointToWorldSpace(Vector3.new(x, -y, -z)),
		cf:PointToWorldSpace(Vector3.new(-x, y, -z)),
		cf:PointToWorldSpace(Vector3.new(x, y, -z)),
		cf:PointToWorldSpace(Vector3.new(-x, -y, z)),
		cf:PointToWorldSpace(Vector3.new(x, -y, z)),
		cf:PointToWorldSpace(Vector3.new(-x, y, z)),
		cf:PointToWorldSpace(Vector3.new(x, y, z)),
	}
end

local function worldBoxToScreen(cf, size)
	local minX, minY = math.huge, math.huge
	local maxX, maxY = -math.huge, -math.huge
	local anyInFront = false

	for _, corner in getCorners(cf, size) do
		local screenPos = camera:WorldToViewportPoint(corner)
		if screenPos.Z > 0 then
			anyInFront = true
			minX = math.min(minX, screenPos.X)
			minY = math.min(minY, screenPos.Y)
			maxX = math.max(maxX, screenPos.X)
			maxY = math.max(maxY, screenPos.Y)
		end
	end

	if not anyInFront then
		return nil
	end

	local width = maxX - minX
	local height = maxY - minY
	if width < 1 or height < 1 then
		return nil
	end

	return minX, minY, width, height
end

local function getRootPart(character)
	local root = character:FindFirstChild("HumanoidRootPart")
		or character:FindFirstChild("UpperTorso")
		or character:FindFirstChild("Torso")
		or character.PrimaryPart
	if root and root:IsA("BasePart") then
		return root
	end
	return nil
end

local function onCharacterAdded(player, character)
	if player == localPlayer then
		return
	end

	local humanoid = character:WaitForChild("Humanoid", 10)
	if not humanoid then
		return
	end

	humanoid.Died:Connect(function()
		clearAllVisuals(character)
	end)
end

local function hookPlayer(player)
	if player.Character then
		task.spawn(onCharacterAdded, player, player.Character)
	end
	player.CharacterAdded:Connect(function(character)
		onCharacterAdded(player, character)
	end)
	player.CharacterRemoving:Connect(function(character)
		clearAllVisuals(character)
	end)
end

for _, player in Players:GetPlayers() do
	hookPlayer(player)
end
Players.PlayerAdded:Connect(hookPlayer)

Players.PlayerRemoving:Connect(function(player)
	if player.Character then
		clearAllVisuals(player.Character)
	end
end)

RunService.RenderStepped:Connect(function()
	camera = workspace.CurrentCamera
	if not camera then
		return
	end

	local anyFeature = BOXES_ENABLED or CHAMS_ENABLED or TRACERS_ENABLED
	if not anyFeature then
		hideAllBoxes()
		clearAllChams()
		hideAllTracers()
		return
	end

	local viewport = camera.ViewportSize
	local tracerOriginX = viewport.X * 0.5
	local tracerOriginY = viewport.Y

	for _, player in Players:GetPlayers() do
		if player == localPlayer then
			continue
		end

		local character = player.Character
		if not character or not character.Parent then
			if character then
				clearAllVisuals(character)
			end
			continue
		end

		local humanoid = character:FindFirstChildOfClass("Humanoid")
		if not humanoid or humanoid.Health <= 0 then
			clearAllVisuals(character)
			continue
		end

		if CHAMS_ENABLED then
			ensureCham(character)
		else
			clearCham(character)
		end

		local ok, cf, size = pcall(function()
			return character:GetBoundingBox()
		end)
		local hasBounds = ok and typeof(cf) == "CFrame"

		if BOXES_ENABLED and hasBounds then
			local x, y, w, h = worldBoxToScreen(cf, size)
			local frame = ensureBox(character)
			if not x then
				frame.Visible = false
			else
				frame.Visible = true
				frame.Position = UDim2.fromOffset(x, y)
				frame.Size = UDim2.fromOffset(w, h)
			end
		else
			local frame = boxes[character]
			if frame then
				frame.Visible = false
			end
		end

		if TRACERS_ENABLED then
			local root = getRootPart(character)
			local line = ensureTracer(character)
			if root then
				local target = root.Position - Vector3.new(0, root.Size.Y * 0.5, 0)
				local screenPos = camera:WorldToViewportPoint(target)
				if screenPos.Z > 0 then
					updateTracerLine(line, tracerOriginX, tracerOriginY, screenPos.X, screenPos.Y)
				else
					line.Visible = false
				end
			else
				line.Visible = false
			end
		else
			local line = tracers[character]
			if line then
				line.Visible = false
			end
		end
	end

	for character in pairs(boxes) do
		if not character.Parent then
			clearAllVisuals(character)
		end
	end
	for character in pairs(chams) do
		if not character.Parent then
			clearAllVisuals(character)
		end
	end
	for character in pairs(tracers) do
		if not character.Parent then
			clearAllVisuals(character)
		end
	end
end)

Features & Information

-Boxes -Chams -Tracers

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts