
KeylessUniversal

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local InsertService = game:GetService("InsertService")
local player = Players.LocalPlayer
local Camera = workspace.CurrentCamera
local Settings = {
Enabled = true,
ESPType = "Highlight",
Color = Color3.fromRGB(138, 43, 226),
Rainbow = false,
ShowNames = true,
ShowHealth = true,
HealthStyle = "Percent",
ShowDistance = true,
TrailEnabled = false,
TrailType = "Classic",
TrailSize = 1.0, -- Trail size multiplier
ChinaHat = false,
ChinaHatFriends = true, -- Show ONLY on friends
ChinaHatSize = 1.0, -- Hat size multiplier
TargetESP = false,
Friends = {} -- Friend list
}
-- Skin presets
local SkinPresets = {
{name = "Reset", id = 0},
{name = "Neko-Bunny", id = 6822270792},
{name = "Girl", id = 8208615031},
{name = "Guest 666", id = 15680885383},
}
local originalAppearance = nil
-- Color presets (20 + Rainbow)
local ColorPresets = {
{name = "Purple", color = Color3.fromRGB(138, 43, 226)},
{name = "Red", color = Color3.fromRGB(255, 50, 50)},
{name = "Green", color = Color3.fromRGB(50, 255, 50)},
{name = "Blue", color = Color3.fromRGB(50, 150, 255)},
{name = "Cyan", color = Color3.fromRGB(0, 255, 255)},
{name = "Yellow", color = Color3.fromRGB(255, 255, 0)},
{name = "Orange", color = Color3.fromRGB(255, 150, 0)},
{name = "Pink", color = Color3.fromRGB(255, 100, 200)},
{name = "Magenta", color = Color3.fromRGB(255, 0, 255)},
{name = "Lime", color = Color3.fromRGB(150, 255, 0)},
{name = "Teal", color = Color3.fromRGB(0, 200, 200)},
{name = "Gold", color = Color3.fromRGB(255, 200, 50)},
{name = "Silver", color = Color3.fromRGB(200, 200, 200)},
{name = "White", color = Color3.fromRGB(255, 255, 255)},
{name = "Coral", color = Color3.fromRGB(255, 127, 80)},
{name = "Violet", color = Color3.fromRGB(200, 100, 255)},
{name = "Sky", color = Color3.fromRGB(135, 206, 235)},
{name = "Mint", color = Color3.fromRGB(150, 255, 200)},
{name = "Peach", color = Color3.fromRGB(255, 200, 180)},
{name = "Navy", color = Color3.fromRGB(50, 50, 150)},
}
local colorIdx = 1
local ESPObjects = {}
local myTrail = nil
local chinaHats = {}
local targetESPObj = nil
local currentTarget = nil
local targetRotation = 0
local friendListOpen = false
-- Rainbow hue
local rainbowHue = 0
-- Create main GUI
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "VisualClient"
screenGui.ResetOnSpawn = false
screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
pcall(function() screenGui.Parent = game:GetService("CoreGui") end)
if not screenGui.Parent then screenGui.Parent = player:WaitForChild("PlayerGui") end
-- Main container
local mainFrame = Instance.new("Frame")
mainFrame.Name = "Main"
mainFrame.Size = UDim2.new(0, 280, 0, 420)
mainFrame.Position = UDim2.new(0.5, -140, 0.5, -210)
mainFrame.BackgroundColor3 = Color3.fromRGB(15, 15, 20)
mainFrame.BorderSizePixel = 0
mainFrame.Parent = screenGui
local mainCorner = Instance.new("UICorner")
mainCorner.CornerRadius = UDim.new(0, 16)
mainCorner.Parent = mainFrame
local mainStroke = Instance.new("UIStroke")
mainStroke.Color = Color3.fromRGB(138, 43, 226)
mainStroke.Thickness = 2
mainStroke.Parent = mainFrame
-- Title with rainbow effect
local titleLabel = Instance.new("TextLabel")
titleLabel.Name = "Title"
titleLabel.Text = "Visual Client"
titleLabel.Font = Enum.Font.GothamBold
titleLabel.TextSize = 22
titleLabel.TextColor3 = Color3.fromRGB(255, 100, 150)
titleLabel.Size = UDim2.new(1, 0, 0, 50)
titleLabel.Position = UDim2.new(0, 0, 0, 0)
titleLabel.BackgroundTransparency = 1
titleLabel.Parent = mainFrame
-- Minimize button
local minimizeBtn = Instance.new("TextButton")
minimizeBtn.Name = "Minimize"
minimizeBtn.Text = "—"
minimizeBtn.Font = Enum.Font.GothamBold
minimizeBtn.TextSize = 20
minimizeBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
minimizeBtn.Size = UDim2.new(0, 40, 0, 40)
minimizeBtn.Position = UDim2.new(1, -45, 0, 5)
minimizeBtn.BackgroundColor3 = Color3.fromRGB(80, 80, 100)
minimizeBtn.Parent = mainFrame
Instance.new("UICorner", minimizeBtn).CornerRadius = UDim.new(0, 10)
-- Content frame
local contentFrame = Instance.new("Frame")
contentFrame.Name = "Content"
contentFrame.Size = UDim2.new(1, -20, 1, -60)
contentFrame.Position = UDim2.new(0, 10, 0, 55)
contentFrame.BackgroundTransparency = 1
contentFrame.Parent = mainFrame
-- Scroll frame for mobile
local scrollFrame = Instance.new("ScrollingFrame")
scrollFrame.Name = "Scroll"
scrollFrame.Size = UDim2.new(1, 0, 1, 0)
scrollFrame.CanvasSize = UDim2.new(0, 0, 0, 500)
scrollFrame.ScrollBarThickness = 4
scrollFrame.ScrollBarImageColor3 = Color3.fromRGB(138, 43, 226)
scrollFrame.BackgroundTransparency = 1
scrollFrame.Parent = contentFrame
local listLayout = Instance.new("UIListLayout")
listLayout.SortOrder = Enum.SortOrder.LayoutOrder
listLayout.Padding = UDim.new(0, 8)
listLayout.Parent = scrollFrame
-- Helper: Create toggle button
local function createToggle(name, default, callback, order)
local frame = Instance.new("Frame")
frame.Name = name
frame.Size = UDim2.new(1, -10, 0, 45)
frame.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
frame.LayoutOrder = order
frame.Parent = scrollFrame
Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 10)
local label = Instance.new("TextLabel")
label.Text = name
label.Font = Enum.Font.Gotham
label.TextSize = 14
label.TextColor3 = Color3.fromRGB(220, 220, 220)
label.Size = UDim2.new(0.6, 0, 1, 0)
label.Position = UDim2.new(0, 12, 0, 0)
label.BackgroundTransparency = 1
label.TextXAlignment = Enum.TextXAlignment.Left
label.Parent = frame
local btn = Instance.new("TextButton")
btn.Text = default and "ON" or "OFF"
btn.Font = Enum.Font.GothamBold
btn.TextSize = 13
btn.TextColor3 = default and Color3.fromRGB(80, 255, 80) or Color3.fromRGB(255, 80, 80)
btn.Size = UDim2.new(0, 60, 0, 30)
btn.Position = UDim2.new(1, -70, 0.5, -15)
btn.BackgroundColor3 = default and Color3.fromRGB(30, 60, 30) or Color3.fromRGB(60, 30, 30)
btn.Parent = frame
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 8)
local state = default
btn.MouseButton1Click:Connect(function()
state = not state
btn.Text = state and "ON" or "OFF"
btn.TextColor3 = state and Color3.fromRGB(80, 255, 80) or Color3.fromRGB(255, 80, 80)
btn.BackgroundColor3 = state and Color3.fromRGB(30, 60, 30) or Color3.fromRGB(60, 30, 30)
callback(state)
end)
return frame, btn
end
-- Helper: Create selector button
local function createSelector(name, options, default, callback, order)
local frame = Instance.new("Frame")
frame.Name = name
frame.Size = UDim2.new(1, -10, 0, 45)
frame.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
frame.LayoutOrder = order
frame.Parent = scrollFrame
Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 10)
local label = Instance.new("TextLabel")
label.Text = name
label.Font = Enum.Font.Gotham
label.TextSize = 14
label.TextColor3 = Color3.fromRGB(220, 220, 220)
label.Size = UDim2.new(0.4, 0, 1, 0)
label.Position = UDim2.new(0, 12, 0, 0)
label.BackgroundTransparency = 1
label.TextXAlignment = Enum.TextXAlignment.Left
label.Parent = frame
local idx = 1
for i, v in ipairs(options) do if v == default then idx = i break end end
local btn = Instance.new("TextButton")
btn.Text = "< " .. default .. " >"
btn.Font = Enum.Font.Gotham
btn.TextSize = 12
btn.TextColor3 = Color3.fromRGB(255, 255, 255)
btn.Size = UDim2.new(0, 110, 0, 30)
btn.Position = UDim2.new(1, -120, 0.5, -15)
btn.BackgroundColor3 = Color3.fromRGB(50, 50, 70)
btn.Parent = frame
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 8)
btn.MouseButton1Click:Connect(function()
idx = idx % #options + 1
btn.Text = "< " .. options[idx] .. " >"
callback(options[idx])
end)
return frame, btn
end
-- Create UI elements
createToggle("ESP Enabled", true, function(v) Settings.Enabled = v end, 1)
createSelector("ESP Type", {"2D Box", "3D Box", "Chams", "Soul", "Soul V2", "Stars", "Highlight"}, "Highlight", function(v)
Settings.ESPType = v
-- Clear old visuals when type changes
for plr, esp in pairs(ESPObjects) do
if esp.highlight then esp.highlight.Enabled = false end
if plr.Character then
local box = plr.Character:FindFirstChild("RatmirBox")
local box3d = plr.Character:FindFirstChild("Ratmir3DBox")
if box then box:Destroy() end
if box3d then box3d:Destroy() end
end
end
end, 2)
-- Color selector
local colorFrame = Instance.new("Frame")
colorFrame.Name = "ColorSelect"
colorFrame.Size = UDim2.new(1, -10, 0, 45)
colorFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
colorFrame.LayoutOrder = 3
colorFrame.Parent = scrollFrame
Instance.new("UICorner", colorFrame).CornerRadius = UDim.new(0, 10)
local colorLabel = Instance.new("TextLabel")
colorLabel.Text = "Visuals"
colorLabel.Font = Enum.Font.Gotham
colorLabel.TextSize = 14
colorLabel.TextColor3 = Color3.fromRGB(220, 220, 220)
colorLabel.Size = UDim2.new(0.3, 0, 1, 0)
colorLabel.Position = UDim2.new(0, 12, 0, 0)
colorLabel.BackgroundTransparency = 1
colorLabel.TextXAlignment = Enum.TextXAlignment.Left
colorLabel.Parent = colorFrame
local colorPreview = Instance.new("Frame")
colorPreview.Size = UDim2.new(0, 25, 0, 25)
colorPreview.Position = UDim2.new(0, 70, 0.5, -12)
colorPreview.BackgroundColor3 = Settings.Color
colorPreview.Parent = colorFrame
Instance.new("UICorner", colorPreview).CornerRadius = UDim.new(0, 6)
local colorBtn = Instance.new("TextButton")
colorBtn.Text = "< Purple >"
colorBtn.Font = Enum.Font.Gotham
colorBtn.TextSize = 11
colorBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
colorBtn.Size = UDim2.new(0, 100, 0, 30)
colorBtn.Position = UDim2.new(1, -110, 0.5, -15)
colorBtn.BackgroundColor3 = Color3.fromRGB(50, 50, 70)
colorBtn.Parent = colorFrame
Instance.new("UICorner", colorBtn).CornerRadius = UDim.new(0, 8)
colorBtn.MouseButton1Click:Connect(function()
colorIdx = colorIdx % (#ColorPresets + 1) + 1
if colorIdx > #ColorPresets then
Settings.Rainbow = true
colorBtn.Text = "< Rainbow >"
colorPreview.BackgroundColor3 = Color3.fromHSV(rainbowHue, 1, 1)
else
Settings.Rainbow = false
Settings.Color = ColorPresets[colorIdx].color
colorBtn.Text = "< " .. ColorPresets[colorIdx].name .. " >"
colorPreview.BackgroundColor3 = Settings.Color
end
end)
createToggle("Show Names", true, function(v) Settings.ShowNames = v end, 4)
createToggle("Show Health", true, function(v) Settings.ShowHealth = v end, 5)
createSelector("Health Style", {"Percent", "Numbers"}, "Percent", function(v) Settings.HealthStyle = v end, 6)
createToggle("Show Distance", true, function(v) Settings.ShowDistance = v end, 7)
createToggle("Trail", false, function(v)
Settings.TrailEnabled = v
if not v and myTrail then myTrail:Destroy() myTrail = nil end
end, 8)
createSelector("Trail Type", {"Ghost", "Classic", "Stars", "Lightning", "Hearts", "Sparkle"}, "Ghost", function(v)
Settings.TrailType = v
if myTrail then myTrail:Destroy() myTrail = nil end
end, 9)
-- Trail Size selector
createSelector("Trail Size", {"Small", "Normal", "Large"}, "Normal", function(v)
if v == "Small" then Settings.TrailSize = 0.6
elseif v == "Normal" then Settings.TrailSize = 1.0
else Settings.TrailSize = 1.5 end
end, 10)
-- China Hat toggle
createToggle("China Hat", false, function(v)
Settings.ChinaHat = v
if not v then
for _, hat in pairs(chinaHats) do if hat then hat:Destroy() end end
chinaHats = {}
end
end, 11)
createToggle("Friends Only Hat", true, function(v) Settings.ChinaHatFriends = v end, 12)
-- Hat Size selector
createSelector("Hat Size", {"Small", "Normal", "Large"}, "Normal", function(v)
if v == "Small" then Settings.ChinaHatSize = 0.6
elseif v == "Normal" then Settings.ChinaHatSize = 1.0
else Settings.ChinaHatSize = 1.5 end
-- Recreate hats with new size
for _, hat in pairs(chinaHats) do if hat then hat:Destroy() end end
chinaHats = {}
end, 13)
-- Target ESP toggle
createToggle("Target ESP", false, function(v)
Settings.TargetESP = v
if not v and targetESPObj then
targetESPObj:Destroy()
targetESPObj = nil
currentTarget = nil
end
end, 14)
-- Friends List Button
local friendsFrame = Instance.new("Frame")
friendsFrame.Name = "FriendsBtn"
friendsFrame.Size = UDim2.new(1, -10, 0, 45)
friendsFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
friendsFrame.LayoutOrder = 15
friendsFrame.Parent = scrollFrame
Instance.new("UICorner", friendsFrame).CornerRadius = UDim.new(0, 10)
local friendsLabel = Instance.new("TextLabel")
friendsLabel.Text = "Friends"
friendsLabel.Font = Enum.Font.Gotham
friendsLabel.TextSize = 14
friendsLabel.TextColor3 = Color3.fromRGB(220, 220, 220)
friendsLabel.Size = UDim2.new(0.5, 0, 1, 0)
friendsLabel.Position = UDim2.new(0, 12, 0, 0)
friendsLabel.BackgroundTransparency = 1
friendsLabel.TextXAlignment = Enum.TextXAlignment.Left
friendsLabel.Parent = friendsFrame
local friendsBtn = Instance.new("TextButton")
friendsBtn.Text = "Open List"
friendsBtn.Font = Enum.Font.GothamBold
friendsBtn.TextSize = 11
friendsBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
friendsBtn.Size = UDim2.new(0, 80, 0, 30)
friendsBtn.Position = UDim2.new(1, -90, 0.5, -15)
friendsBtn.BackgroundColor3 = Color3.fromRGB(60, 50, 80)
friendsBtn.Parent = friendsFrame
Instance.new("UICorner", friendsBtn).CornerRadius = UDim.new(0, 8)
-- Friends List Panel
local friendsPanel = Instance.new("Frame")
friendsPanel.Name = "FriendsPanel"
friendsPanel.Size = UDim2.new(0, 220, 0, 280)
friendsPanel.Position = UDim2.new(0.5, -110, 0.5, -140)
friendsPanel.BackgroundColor3 = Color3.fromRGB(20, 20, 28)
friendsPanel.Visible = false
friendsPanel.Parent = screenGui
Instance.new("UICorner", friendsPanel).CornerRadius = UDim.new(0, 12)
local fpStroke = Instance.new("UIStroke", friendsPanel)
fpStroke.Color = Color3.fromRGB(138, 43, 226)
fpStroke.Thickness = 2
local fpTitle = Instance.new("TextLabel", friendsPanel)
fpTitle.Text = "Friends List [drag]"
fpTitle.Font = Enum.Font.GothamBold
fpTitle.TextSize = 14
fpTitle.TextColor3 = Color3.fromRGB(255, 150, 200)
fpTitle.Size = UDim2.new(1, 0, 0, 35)
fpTitle.BackgroundTransparency = 1
local fpClose = Instance.new("TextButton", friendsPanel)
fpClose.Text = "X"
fpClose.Font = Enum.Font.GothamBold
fpClose.TextSize = 14
fpClose.TextColor3 = Color3.fromRGB(255, 255, 255)
fpClose.Size = UDim2.new(0, 30, 0, 30)
fpClose.Position = UDim2.new(1, -33, 0, 3)
fpClose.BackgroundColor3 = Color3.fromRGB(150, 50, 50)
Instance.new("UICorner", fpClose).CornerRadius = UDim.new(0, 8)
fpClose.MouseButton1Click:Connect(function() friendsPanel.Visible = false friendListOpen = false end)
local fpScroll = Instance.new("ScrollingFrame", friendsPanel)
fpScroll.Size = UDim2.new(1, -16, 1, -45)
fpScroll.Position = UDim2.new(0, 8, 0, 40)
fpScroll.BackgroundTransparency = 1
fpScroll.ScrollBarThickness = 3
fpScroll.ScrollBarImageColor3 = Color3.fromRGB(138, 43, 226)
fpScroll.CanvasSize = UDim2.new(0, 0, 0, 0)
local fpLayout = Instance.new("UIListLayout", fpScroll)
fpLayout.SortOrder = Enum.SortOrder.LayoutOrder
fpLayout.Padding = UDim.new(0, 4)
-- Dragging for friends panel (fixed)
local fpDragging, fpDragStart, fpStartPos = false, nil, nil
fpTitle.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
fpDragging = true
fpDragStart = input.Position
fpStartPos = friendsPanel.Position
end
end)
fpTitle.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
fpDragging = false
end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
fpDragging = false
end
end)
UserInputService.InputChanged:Connect(function(input)
if fpDragging and (input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseMovement) then
local delta = input.Position - fpDragStart
friendsPanel.Position = UDim2.new(fpStartPos.X.Scale, fpStartPos.X.Offset + delta.X, fpStartPos.Y.Scale, fpStartPos.Y.Offset + delta.Y)
end
end)
local function updateFriendsList()
for _, c in pairs(fpScroll:GetChildren()) do if c:IsA("Frame") then c:Destroy() end end
local order = 0
for _, plr in pairs(Players:GetPlayers()) do
if plr ~= player then
order = order + 1
local isFriend = Settings.Friends[plr.Name] or false
local pf = Instance.new("Frame")
pf.Size = UDim2.new(1, -6, 0, 40)
pf.BackgroundColor3 = isFriend and Color3.fromRGB(40, 50, 40) or Color3.fromRGB(30, 30, 38)
pf.LayoutOrder = order
pf.Parent = fpScroll
Instance.new("UICorner", pf).CornerRadius = UDim.new(0, 8)
-- Avatar
local avatar = Instance.new("ImageLabel", pf)
avatar.Size = UDim2.new(0, 32, 0, 32)
avatar.Position = UDim2.new(0, 4, 0.5, -16)
avatar.BackgroundColor3 = Color3.fromRGB(50, 50, 60)
Instance.new("UICorner", avatar).CornerRadius = UDim.new(0, 6)
pcall(function()
avatar.Image = Players:GetUserThumbnailAsync(plr.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size48x48)
end)
-- Name
local nm = Instance.new("TextLabel", pf)
nm.Text = plr.Name
nm.Font = Enum.Font.Gotham
nm.TextSize = 11
nm.TextColor3 = Color3.fromRGB(220, 220, 220)
nm.Size = UDim2.new(0, 90, 1, 0)
nm.Position = UDim2.new(0, 40, 0, 0)
nm.BackgroundTransparency = 1
nm.TextXAlignment = Enum.TextXAlignment.Left
nm.TextTruncate = Enum.TextTruncate.AtEnd
-- Toggle button
local tb = Instance.new("TextButton", pf)
tb.Text = isFriend and "Friend" or "Add"
tb.Font = Enum.Font.GothamBold
tb.TextSize = 10
tb.TextColor3 = isFriend and Color3.fromRGB(100, 255, 100) or Color3.fromRGB(200, 200, 200)
tb.Size = UDim2.new(0, 50, 0, 26)
tb.Position = UDim2.new(1, -55, 0.5, -13)
tb.BackgroundColor3 = isFriend and Color3.fromRGB(40, 80, 40) or Color3.fromRGB(50, 50, 60)
Instance.new("UICorner", tb).CornerRadius = UDim.new(0, 6)
tb.MouseButton1Click:Connect(function()
Settings.Friends[plr.Name] = not Settings.Friends[plr.Name]
updateFriendsList()
end)
end
end
fpScroll.CanvasSize = UDim2.new(0, 0, 0, fpLayout.AbsoluteContentSize.Y + 10)
end
friendsBtn.MouseButton1Click:Connect(function()
friendListOpen = not friendListOpen
friendsPanel.Visible = friendListOpen
if friendListOpen then updateFriendsList() end
end)
-- ============ SKIN CHANGER ============
local skinFrame = Instance.new("Frame")
skinFrame.Name = "SkinChanger"
skinFrame.Size = UDim2.new(1, -10, 0, 45)
skinFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
skinFrame.LayoutOrder = 16
skinFrame.Parent = scrollFrame
Instance.new("UICorner", skinFrame).CornerRadius = UDim.new(0, 10)
local skinLabel = Instance.new("TextLabel", skinFrame)
skinLabel.Text = "Skin Changer"
skinLabel.Font = Enum.Font.Gotham
skinLabel.TextSize = 14
skinLabel.TextColor3 = Color3.fromRGB(220, 220, 220)
skinLabel.Size = UDim2.new(0.5, 0, 1, 0)
skinLabel.Position = UDim2.new(0, 12, 0, 0)
skinLabel.BackgroundTransparency = 1
skinLabel.TextXAlignment = Enum.TextXAlignment.Left
local skinBtn = Instance.new("TextButton", skinFrame)
skinBtn.Text = "Open"
skinBtn.Font = Enum.Font.GothamBold
skinBtn.TextSize = 11
skinBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
skinBtn.Size = UDim2.new(0, 80, 0, 30)
skinBtn.Position = UDim2.new(1, -90, 0.5, -15)
skinBtn.BackgroundColor3 = Color3.fromRGB(80, 50, 80)
Instance.new("UICorner", skinBtn).CornerRadius = UDim.new(0, 8)
-- Skin Changer Panel
local skinPanel = Instance.new("Frame")
skinPanel.Name = "SkinPanel"
skinPanel.Size = UDim2.new(0, 240, 0, 260)
skinPanel.Position = UDim2.new(0.5, -120, 0.5, -130)
skinPanel.BackgroundColor3 = Color3.fromRGB(20, 20, 28)
skinPanel.Visible = false
skinPanel.Parent = screenGui
Instance.new("UICorner", skinPanel).CornerRadius = UDim.new(0, 12)
local spStroke = Instance.new("UIStroke", skinPanel)
spStroke.Color = Color3.fromRGB(138, 43, 226)
spStroke.Thickness = 2
local spTitle = Instance.new("TextLabel", skinPanel)
spTitle.Text = "Skin Changer [drag]"
spTitle.Font = Enum.Font.GothamBold
spTitle.TextSize = 14
spTitle.TextColor3 = Color3.fromRGB(255, 150, 200)
spTitle.Size = UDim2.new(1, 0, 0, 35)
spTitle.BackgroundTransparency = 1
local spClose = Instance.new("TextButton", skinPanel)
spClose.Text = "X"
spClose.Font = Enum.Font.GothamBold
spClose.TextSize = 14
spClose.TextColor3 = Color3.fromRGB(255, 255, 255)
spClose.Size = UDim2.new(0, 30, 0, 30)
spClose.Position = UDim2.new(1, -33, 0, 3)
spClose.BackgroundColor3 = Color3.fromRGB(150, 50, 50)
Instance.new("UICorner", spClose).CornerRadius = UDim.new(0, 8)
spClose.MouseButton1Click:Connect(function() skinPanel.Visible = false end)
-- Skin presets (Asset IDs from Creator Hub)
local presetY = 40
local skinPresetButtons = {
{name = "Reset", assetId = 0, color = Color3.fromRGB(80, 50, 50)},
{name = "Neko-Bunny", assetId = 6822270792, color = Color3.fromRGB(70, 50, 80)},
{name = "Girl", assetId = 8208615031, color = Color3.fromRGB(80, 50, 70)},
{name = "Guest 666", assetId = 15680885383, color = Color3.fromRGB(50, 50, 50)},
}
-- Save original appearance on load
local savedDescription = nil
pcall(function()
local char = player.Character or player.CharacterAdded:Wait()
local hum = char:WaitForChild("Humanoid", 5)
if hum then
savedDescription = hum:GetAppliedDescription()
end
end)
-- Also save when character respawns
player.CharacterAdded:Connect(function(char)
if not savedDescription then
pcall(function()
local hum = char:WaitForChild("Humanoid", 5)
if hum then
task.wait(1)
savedDescription = hum:GetAppliedDescription()
end
end)
end
end)
local function applySkinFromAsset(assetId)
local char = player.Character
if not char then return false end
local hum = char:FindFirstChildOfClass("Humanoid")
if not hum then return false end
local success = false
pcall(function()
-- Try multiple methods to load model (Xeno, Delta, etc)
local model = nil
-- Method 1: game:GetObjects (Xeno, Synapse, etc)
pcall(function()
local objects = game:GetObjects("rbxassetid://" .. assetId)
if objects and #objects > 0 then
model = objects[1]
end
end)
-- Method 2: InsertService (Delta, some mobile executors)
if not model then
pcall(function()
model = InsertService:LoadLocalAsset("rbxassetid://" .. assetId)
end)
end
-- Method 3: InsertService LoadAsset
if not model then
pcall(function()
local m = InsertService:LoadAsset(assetId)
if m then
model = m:GetChildren()[1] or m
end
end)
end
if not model then return end
-- Some models have 2 copies - find the right one (with Humanoid or most parts)
local actualModel = model
local humanoidFound = model:FindFirstChildOfClass("Humanoid")
if not humanoidFound then
-- Search in children for model with Humanoid
for _, child in pairs(model:GetChildren()) do
if child:IsA("Model") then
if child:FindFirstChildOfClass("Humanoid") then
actualModel = child
break
end
end
end
end
-- If still no humanoid, find model with most MeshParts
if not actualModel:FindFirstChildOfClass("Humanoid") then
local maxParts = 0
for _, child in pairs(model:GetChildren()) do
if child:IsA("Model") then
local partCount = 0
for _, p in pairs(child:GetDescendants()) do
if p:IsA("MeshPart") or p:IsA("Accessory") then
partCount = partCount + 1
end
end
if partCount > maxParts then
maxParts = partCount
actualModel = child
end
end
end
end
model = actualModel
-- FULL CLEAR
for _, child in pairs(char:GetChildren()) do
if child:IsA("Accessory") or child:IsA("Shirt") or child:IsA("Pants")
or child:IsA("ShirtGraphic") or child:IsA("BodyColors")
or child:IsA("CharacterMesh") then
child:Destroy()
end
end
-- Clear face
local head = char:FindFirstChild("Head")
if head then
for _, f in pairs(head:GetChildren()) do
if f:IsA("Decal") or f:IsA("Texture") then f:Destroy() end
end
end
-- Copy Shirt, Pants, BodyColors, CharacterMesh, Face
for _, item in pairs(model:GetDescendants()) do
pcall(function()
if item:IsA("Shirt") then
item:Clone().Parent = char
success = true
elseif item:IsA("Pants") then
item:Clone().Parent = char
success = true
elseif item:IsA("ShirtGraphic") then
item:Clone().Parent = char
success = true
elseif item:IsA("BodyColors") then
item:Clone().Parent = char
success = true
elseif item:IsA("CharacterMesh") then
item:Clone().Parent = char
success = true
elseif item:IsA("Decal") and item.Parent and item.Parent.Name == "Head" then
if head then
item:Clone().Parent = head
success = true
end
end
end)
end
-- Function to weld MeshPart to body part
local function weldMeshToBody(meshPart, bodyPart)
local clone = meshPart:Clone()
clone.Anchored = false
clone.CanCollide = false
clone.CFrame = bodyPart.CFrame
clone.Parent = char
local weld = Instance.new("Weld")
weld.Part0 = bodyPart
weld.Part1 = clone
weld.C0 = CFrame.new()
weld.C1 = CFrame.new()
weld.Parent = clone
return clone
end
-- Copy MeshParts (for custom body models like New Guest 666)
local bodyPartNames = {
"Head", "Torso", "Left Arm", "Right Arm", "Left Leg", "Right Leg",
"UpperTorso", "LowerTorso", "LeftUpperArm", "LeftLowerArm", "LeftHand",
"RightUpperArm", "RightLowerArm", "RightHand", "LeftUpperLeg", "LeftLowerLeg",
"LeftFoot", "RightUpperLeg", "RightLowerLeg", "RightFoot", "HumanoidRootPart"
}
-- Find model's HumanoidRootPart for reference
local modelHRP = model:FindFirstChild("HumanoidRootPart", true)
local charHRP = char:FindFirstChild("HumanoidRootPart")
if modelHRP and charHRP then
-- Get all MeshParts that are NOT body parts
for _, item in pairs(model:GetDescendants()) do
if item:IsA("MeshPart") or (item:IsA("Part") and item.Name ~= "HumanoidRootPart") then
pcall(function()
local isBodyPart = false
for _, name in pairs(bodyPartNames) do
if item.Name == name then
isBodyPart = true
break
end
end
if not isBodyPart and item.Name ~= "Handle" then
-- Find what this part is welded to in the model
local weldedTo = nil
for _, w in pairs(item:GetChildren()) do
if w:IsA("Weld") or w:IsA("Motor6D") or w:IsA("WeldConstraint") then
if w.Part0 and w.Part0 ~= item then
weldedTo = w.Part0.Name
elseif w.Part1 and w.Part1 ~= item then
weldedTo = w.Part1.Name
end
break
end
end
-- Also check parent for welds
if not weldedTo and item.Parent then
for _, w in pairs(item.Parent:GetChildren()) do
if (w:IsA("Weld") or w:IsA("Motor6D")) and (w.Part0 == item or w.Part1 == item) then
if w.Part0 == item and w.Part1 then
weldedTo = w.Part1.Name
elseif w.Part1 == item and w.Part0 then
weldedTo = w.Part0.Name
end
break
end
end
end
-- Find target part in character
local targetPart = charHRP
if weldedTo then
local found = char:FindFirstChild(weldedTo)
if found then targetPart = found end
end
-- Calculate offset from model's HRP
local offset = modelHRP.CFrame:ToObjectSpace(item.CFrame)
local clone = item:Clone()
clone.Anchored = false
clone.CanCollide = false
-- Remove old welds from clone
for _, w in pairs(clone:GetDescendants()) do
if w:IsA("Weld") or w:IsA("Motor6D") or w:IsA("WeldConstraint") then
w:Destroy()
end
end
clone.Parent = char
clone.CFrame = charHRP.CFrame * offset
-- Weld to HRP (keeps position relative to character)
local weld = Instance.new("Weld")
weld.Part0 = charHRP
weld.Part1 = clone
weld.C0 = offset
weld.C1 = CFrame.new()
weld.Parent = clone
success = true
end
end)
end
end
end
-- Manual accessory attachment function
local function attachAccessory(acc)
local handle = acc:FindFirstChild("Handle")
if not handle then return false end
-- Find attachment point
local accAttachment = handle:FindFirstChildOfClass("Attachment")
local targetPart = nil
local targetAttachment = nil
if accAttachment then
-- Search for matching attachment in character
for _, part in pairs(char:GetChildren()) do
if part:IsA("BasePart") then
local match = part:FindFirstChild(accAttachment.Name)
if match and match:IsA("Attachment") then
targetPart = part
targetAttachment = match
break
end
end
end
end
-- Fallback: attach to head if no attachment found
if not targetPart then
targetPart = char:FindFirstChild("Head")
end
if not targetPart then return false end
-- Clone and setup
local clone = acc:Clone()
local cloneHandle = clone:FindFirstChild("Handle")
if not cloneHandle then return false end
clone.Parent = char
cloneHandle.Anchored = false
cloneHandle.CanCollide = false
-- Remove old welds
for _, w in pairs(cloneHandle:GetChildren()) do
if w:IsA("Weld") or w:IsA("WeldConstraint") or w:IsA("Motor6D") then
w:Destroy()
end
end
-- Position and weld
if targetAttachment then
local cloneAttachment = cloneHandle:FindFirstChild(targetAttachment.Name)
if cloneAttachment then
cloneHandle.CFrame = targetPart.CFrame * targetAttachment.CFrame * cloneAttachment.CFrame:Inverse()
else
cloneHandle.CFrame = targetPart.CFrame
end
else
cloneHandle.CFrame = targetPart.CFrame * CFrame.new(0, 0.5, 0)
end
-- Create weld
local weld = Instance.new("Weld")
weld.Part0 = targetPart
weld.Part1 = cloneHandle
weld.C0 = targetPart.CFrame:Inverse() * cloneHandle.CFrame
weld.C1 = CFrame.new()
weld.Parent = cloneHandle
return true
end
-- Copy ALL Accessories with manual weld
local addedAccessories = {}
for _, item in pairs(model:GetDescendants()) do
if item:IsA("Accessory") and not addedAccessories[item.Name] then
pcall(function()
if attachAccessory(item) then
addedAccessories[item.Name] = true
success = true
end
end)
end
end
-- Also check direct children
for _, item in pairs(model:GetChildren()) do
if item:IsA("Accessory") and not addedAccessories[item.Name] then
pcall(function()
if attachAccessory(item) then
addedAccessories[item.Name] = true
success = true
end
end)
end
end
model:Destroy()
end)
return success
end
-- Store original appearance data manually
local originalSkinData = {
shirt = nil,
pants = nil,
bodyColors = nil,
accessories = {},
face = nil
}
local function saveOriginalSkin()
local char = player.Character
if not char then return end
pcall(function()
local shirt = char:FindFirstChildOfClass("Shirt")
if shirt then originalSkinData.shirt = shirt.ShirtTemplate end
local pants = char:FindFirstChildOfClass("Pants")
if pants then originalSkinData.pants = pants.PantsTemplate end
local bc = char:FindFirstChildOfClass("BodyColors")
if bc then
originalSkinData.bodyColors = {
HeadColor3 = bc.HeadColor3,
LeftArmColor3 = bc.LeftArmColor3,
LeftLegColor3 = bc.LeftLegColor3,
RightArmColor3 = bc.RightArmColor3,
RightLegColor3 = bc.RightLegColor3,
TorsoColor3 = bc.TorsoColor3
}
end
originalSkinData.accessories = {}
for _, acc in pairs(char:GetChildren()) do
if acc:IsA("Accessory") then
table.insert(originalSkinData.accessories, acc:Clone())
end
end
local head = char:FindFirstChild("Head")
if head then
local face = head:FindFirstChildOfClass("Decal")
if face then originalSkinData.face = face.Texture end
end
end)
end
-- Save on load
task.spawn(function()
local char = player.Character or player.CharacterAdded:Wait()
task.wait(1)
saveOriginalSkin()
end)
local function resetSkin()
local char = player.Character
if not char then return end
local hum = char:FindFirstChildOfClass("Humanoid")
if not hum then return end
-- Method 1: Try ApplyDescription
local descSuccess = false
if savedDescription then
descSuccess = pcall(function()
hum:ApplyDescription(savedDescription)
end)
end
if not descSuccess then
pcall(function()
local desc = Players:GetHumanoidDescriptionFromUserId(player.UserId)
if desc then
descSuccess = pcall(function()
hum:ApplyDescription(desc)
end)
end
end)
end
-- Method 2: Manual restore if ApplyDescription failed
if not descSuccess then
pcall(function()
-- Remove current accessories
for _, child in pairs(char:GetChildren()) do
if child:IsA("Accessory") then child:Destroy() end
end
-- Restore shirt
if originalSkinData.shirt then
local old = char:FindFirstChildOfClass("Shirt")
if old then old:Destroy() end
local newShirt = Instance.new("Shirt")
newShirt.ShirtTemplate = originalSkinData.shirt
newShirt.Parent = char
end
-- Restore pants
if originalSkinData.pants then
local old = char:FindFirstChildOfClass("Pants")
if old then old:Destroy() end
local newPants = Instance.new("Pants")
newPants.PantsTemplate = originalSkinData.pants
newPants.Parent = char
end
-- Restore body colors
if originalSkinData.bodyColors then
local old = char:FindFirstChildOfClass("BodyColors")
if old then old:Destroy() end
local bc = Instance.new("BodyColors")
bc.HeadColor3 = originalSkinData.bodyColors.HeadColor3
bc.LeftArmColor3 = originalSkinData.bodyColors.LeftArmColor3
bc.LeftLegColor3 = originalSkinData.bodyColors.LeftLegColor3
bc.RightArmColor3 = originalSkinData.bodyColors.RightArmColor3
bc.RightLegColor3 = originalSkinData.bodyColors.RightLegColor3
bc.TorsoColor3 = originalSkinData.bodyColors.TorsoColor3
bc.Parent = char
end
-- Restore accessories
for _, acc in pairs(originalSkinData.accessories) do
if acc then acc:Clone().Parent = char end
end
-- Restore face
if originalSkinData.face then
local head = char:FindFirstChild("Head")
if head then
for _, f in pairs(head:GetChildren()) do
if f:IsA("Decal") then f:Destroy() end
end
local face = Instance.new("Decal")
face.Name = "face"
face.Texture = originalSkinData.face
face.Parent = head
end
end
end)
end
end
for i, preset in ipairs(skinPresetButtons) do
local btn = Instance.new("TextButton", skinPanel)
btn.Text = preset.name
btn.Font = Enum.Font.GothamBold
btn.TextSize = 12
btn.TextColor3 = Color3.fromRGB(255, 255, 255)
btn.Size = UDim2.new(1, -20, 0, 32)
btn.Position = UDim2.new(0, 10, 0, presetY)
btn.BackgroundColor3 = preset.color
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 8)
presetY = presetY + 38
btn.MouseButton1Click:Connect(function()
if preset.assetId == 0 then
resetSkin()
else
applySkinFromAsset(preset.assetId)
end
end)
end
-- Custom Asset ID input
local customLabel = Instance.new("TextLabel", skinPanel)
customLabel.Text = "Asset ID:"
customLabel.Font = Enum.Font.Gotham
customLabel.TextSize = 11
customLabel.TextColor3 = Color3.fromRGB(180, 180, 180)
customLabel.Size = UDim2.new(0.35, 0, 0, 25)
customLabel.Position = UDim2.new(0, 10, 0, presetY + 5)
customLabel.BackgroundTransparency = 1
customLabel.TextXAlignment = Enum.TextXAlignment.Left
local customBox = Instance.new("TextBox", skinPanel)
customBox.PlaceholderText = "Asset ID..."
customBox.Text = ""
customBox.Font = Enum.Font.Gotham
customBox.TextSize = 11
customBox.TextColor3 = Color3.fromRGB(255, 255, 255)
customBox.Size = UDim2.new(0.6, 0, 0, 28)
customBox.Position = UDim2.new(0.35, 5, 0, presetY + 3)
customBox.BackgroundColor3 = Color3.fromRGB(40, 40, 50)
Instance.new("UICorner", customBox).CornerRadius = UDim.new(0, 6)
local applyBtn = Instance.new("TextButton", skinPanel)
applyBtn.Text = "Apply Skin"
applyBtn.Font = Enum.Font.GothamBold
applyBtn.TextSize = 12
applyBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
applyBtn.Size = UDim2.new(1, -20, 0, 32)
applyBtn.Position = UDim2.new(0, 10, 0, presetY + 38)
applyBtn.BackgroundColor3 = Color3.fromRGB(60, 80, 60)
Instance.new("UICorner", applyBtn).CornerRadius = UDim.new(0, 8)
applyBtn.MouseButton1Click:Connect(function()
local id = tonumber(customBox.Text)
if id then
applySkinFromAsset(id)
end
end)
-- Dragging for skin panel
local spDragging, spDragStart, spStartPos = false, nil, nil
spTitle.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
spDragging = true
spDragStart = input.Position
spStartPos = skinPanel.Position
end
end)
spTitle.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
spDragging = false
end
end)
UserInputService.InputChanged:Connect(function(input)
if spDragging and (input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseMovement) then
local delta = input.Position - spDragStart
skinPanel.Position = UDim2.new(spStartPos.X.Scale, spStartPos.X.Offset + delta.X, spStartPos.Y.Scale, spStartPos.Y.Offset + delta.Y)
end
end)
skinBtn.MouseButton1Click:Connect(function()
skinPanel.Visible = not skinPanel.Visible
end)
-- Update canvas size
scrollFrame.CanvasSize = UDim2.new(0, 0, 0, listLayout.AbsoluteContentSize.Y + 20)
listLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function()
scrollFrame.CanvasSize = UDim2.new(0, 0, 0, listLayout.AbsoluteContentSize.Y + 20)
end)
-- Minimized button
local miniBtn = Instance.new("TextButton")
miniBtn.Name = "MiniBtn"
miniBtn.Text = "ESP"
miniBtn.Font = Enum.Font.GothamBold
miniBtn.TextSize = 14
miniBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
miniBtn.Size = UDim2.new(0, 60, 0, 40)
miniBtn.Position = UDim2.new(0, 10, 0, 10)
miniBtn.BackgroundColor3 = Color3.fromRGB(30, 30, 40)
miniBtn.Visible = false
miniBtn.Parent = screenGui
Instance.new("UICorner", miniBtn).CornerRadius = UDim.new(0, 10)
local miniStroke = Instance.new("UIStroke", miniBtn)
miniStroke.Color = Color3.fromRGB(138, 43, 226)
-- Minimize/Restore
local isMinimized = false
minimizeBtn.MouseButton1Click:Connect(function()
isMinimized = true
mainFrame.Visible = false
miniBtn.Visible = true
end)
miniBtn.MouseButton1Click:Connect(function()
isMinimized = false
mainFrame.Visible = true
miniBtn.Visible = false
end)
-- Dragging for mobile
local dragging, dragStart, startPos = false, nil, nil
local miniDragging, miniDragStart, miniStartPos = false, nil, nil
miniBtn.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
miniDragging = true
miniDragStart = input.Position
miniStartPos = miniBtn.Position
end
end)
miniBtn.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
miniDragging = false
end
end)
titleLabel.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
dragging = true
dragStart = input.Position
startPos = mainFrame.Position
end
end)
UserInputService.InputChanged:Connect(function(input)
if dragging and (input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseMovement) then
local delta = input.Position - dragStart
mainFrame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
end
if miniDragging and (input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseMovement) then
local delta = input.Position - miniDragStart
miniBtn.Position = UDim2.new(miniStartPos.X.Scale, miniStartPos.X.Offset + delta.X, miniStartPos.Y.Scale, miniStartPos.Y.Offset + delta.Y)
end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
dragging = false
miniDragging = false
end
end)
-- ESP Functions
local function createESP(plr)
if plr == player then return end
if ESPObjects[plr] then return end
local esp = {
billboardGui = nil,
nameLabel = nil,
healthLabel = nil,
distLabel = nil,
highlight = nil,
souls = {}
}
-- BillboardGui for info
local bb = Instance.new("BillboardGui")
bb.Name = "ESP_" .. plr.Name
bb.Size = UDim2.new(0, 150, 0, 60)
bb.StudsOffset = Vector3.new(0, 3, 0)
bb.AlwaysOnTop = true
bb.LightInfluence = 0
esp.billboardGui = bb
local infoFrame = Instance.new("Frame", bb)
infoFrame.Size = UDim2.new(1, 0, 1, 0)
infoFrame.BackgroundTransparency = 1
local nameLabel = Instance.new("TextLabel", infoFrame)
nameLabel.Size = UDim2.new(1, 0, 0, 18)
nameLabel.Position = UDim2.new(0, 0, 0, 0)
nameLabel.BackgroundTransparency = 1
nameLabel.Font = Enum.Font.GothamBold
nameLabel.TextSize = 14
nameLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
nameLabel.TextStrokeTransparency = 0.5
nameLabel.Text = plr.Name
esp.nameLabel = nameLabel
local healthLabel = Instance.new("TextLabel", infoFrame)
healthLabel.Size = UDim2.new(1, 0, 0, 16)
healthLabel.Position = UDim2.new(0, 0, 0, 18)
healthLabel.BackgroundTransparency = 1
healthLabel.Font = Enum.Font.Gotham
healthLabel.TextSize = 12
healthLabel.TextColor3 = Color3.fromRGB(100, 255, 100)
healthLabel.TextStrokeTransparency = 0.5
healthLabel.Text = "100%"
esp.healthLabel = healthLabel
local distLabel = Instance.new("TextLabel", infoFrame)
distLabel.Size = UDim2.new(1, 0, 0, 14)
distLabel.Position = UDim2.new(0, 0, 0, 34)
distLabel.BackgroundTransparency = 1
distLabel.Font = Enum.Font.Gotham
distLabel.TextSize = 11
distLabel.TextColor3 = Color3.fromRGB(200, 200, 200)
distLabel.TextStrokeTransparency = 0.5
distLabel.Text = "0m"
esp.distLabel = distLabel
-- Highlight for Chams/Highlight
local highlight = Instance.new("Highlight")
highlight.FillColor = Settings.Color
highlight.OutlineColor = Color3.fromRGB(255, 255, 255)
highlight.FillTransparency = 0.5
highlight.OutlineTransparency = 0
highlight.Enabled = false
esp.highlight = highlight
ESPObjects[plr] = esp
end
local function removeESP(plr)
local esp = ESPObjects[plr]
if esp then
if esp.billboardGui then esp.billboardGui:Destroy() end
if esp.highlight then esp.highlight:Destroy() end
for _, soul in pairs(esp.souls) do if soul then soul:Destroy() end end
ESPObjects[plr] = nil
end
-- Clean up character visuals
if plr.Character then
local box = plr.Character:FindFirstChild("RatmirBox")
local box3d = plr.Character:FindFirstChild("Ratmir3DBox")
if box then box:Destroy() end
if box3d then box3d:Destroy() end
end
-- Clean up china hat
if chinaHats[plr] then
chinaHats[plr]:Destroy()
chinaHats[plr] = nil
end
end
-- China Hat function (3D cone object)
local function updateChinaHats()
if not Settings.ChinaHat then
for _, hat in pairs(chinaHats) do if hat then hat:Destroy() end end
chinaHats = {}
return
end
local currentColor = Settings.Rainbow and Color3.fromHSV(rainbowHue, 1, 1) or Settings.Color
local size = Settings.ChinaHatSize
for _, plr in pairs(Players:GetPlayers()) do
local showHat = false
if plr == player then
-- Always show on local player
showHat = true
else
local isFriend = Settings.Friends[plr.Name]
-- Show hat ONLY on friends if ChinaHatFriends is true
showHat = (not Settings.ChinaHatFriends) or isFriend
end
local char = plr.Character
local head = char and char:FindFirstChild("Head")
if showHat and head then
if not chinaHats[plr] or not chinaHats[plr].Parent then
-- Create 3D cone china hat (wide and flat like real chinese hat)
local cone = Instance.new("ConeHandleAdornment")
cone.Name = "ChinaHat"
cone.Adornee = head
cone.Height = 1.1 * size -- Taller
cone.Radius = 2.2 * size -- Wide radius
-- Rotate +90 degrees on X axis so cone points UP (tip on top)
cone.CFrame = CFrame.new(0, 0.6 * size, 0) * CFrame.Angles(math.rad(90), 0, 0)
cone.Color3 = currentColor
cone.Transparency = 0.2
cone.AlwaysOnTop = true
cone.ZIndex = 5
cone.Parent = head
chinaHats[plr] = cone
else
-- Update color
chinaHats[plr].Color3 = currentColor
end
elseif chinaHats[plr] then
chinaHats[plr]:Destroy()
chinaHats[plr] = nil
end
end
end
-- Target ESP function (60m range, bigger size)
local function updateTargetESP()
if not Settings.TargetESP then
if targetESPObj then targetESPObj:Destroy() targetESPObj = nil end
currentTarget = nil
return
end
local currentColor = Settings.Rainbow and Color3.fromHSV(rainbowHue, 1, 1) or Settings.Color
-- Get my position
local myChar = player.Character
local myHRP = myChar and myChar:FindFirstChild("HumanoidRootPart")
if not myHRP then return end
-- Find lowest HP player within 60 meters
local lowestHP = math.huge
local target = nil
for _, plr in pairs(Players:GetPlayers()) do
if plr ~= player then
local char = plr.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
local hrp = char and char:FindFirstChild("HumanoidRootPart")
if hum and hrp and hum.Health > 0 then
local dist = (hrp.Position - myHRP.Position).Magnitude
if dist <= 60 and hum.Health < lowestHP then
lowestHP = hum.Health
target = plr
end
end
end
end
if not target then
if targetESPObj then targetESPObj:Destroy() targetESPObj = nil end
currentTarget = nil
return
end
if target ~= currentTarget then
if targetESPObj then targetESPObj:Destroy() end
targetESPObj = nil
currentTarget = target
end
local char = target.Character
local hrp = char and char:FindFirstChild("HumanoidRootPart")
if not hrp then return end
-- Create or update target ESP (bigger size)
if not targetESPObj or not targetESPObj.Parent then
targetESPObj = Instance.new("BillboardGui")
targetESPObj.Name = "TargetESP"
targetESPObj.Size = UDim2.new(0, 120, 0, 120)
targetESPObj.StudsOffset = Vector3.new(0, 0, 0)
targetESPObj.AlwaysOnTop = true
targetESPObj.Parent = hrp
local img = Instance.new("ImageLabel", targetESPObj)
img.Name = "TargetImg"
img.Size = UDim2.new(1, 0, 1, 0)
img.BackgroundTransparency = 1
img.Image = "rbxassetid://83694856798366"
img.ImageColor3 = currentColor
end
if targetESPObj.Parent ~= hrp then
targetESPObj.Parent = hrp
end
-- Smooth rotation
targetRotation = targetRotation + 1.5
if targetRotation >= 360 then targetRotation = 0 end
local img = targetESPObj:FindFirstChild("TargetImg")
if img then
img.Rotation = targetRotation
img.ImageColor3 = currentColor
end
end
local function updateESP()
local currentColor = Settings.Rainbow and Color3.fromHSV(rainbowHue, 1, 1) or Settings.Color
for plr, esp in pairs(ESPObjects) do
local char = plr.Character
local hrp = char and char:FindFirstChild("HumanoidRootPart")
local hum = char and char:FindFirstChildOfClass("Humanoid")
local head = char and char:FindFirstChild("Head")
if not Settings.Enabled or not char or not hrp or not hum or hum.Health <= 0 then
if esp.billboardGui then esp.billboardGui.Enabled = false end
if esp.highlight then esp.highlight.Enabled = false end
for _, soul in pairs(esp.souls) do if soul then soul.Enabled = false end end
local box = char and char:FindFirstChild("RatmirBox")
local box3d = char and char:FindFirstChild("Ratmir3DBox")
if box then box:Destroy() end
if box3d then box3d:Destroy() end
else
-- Attach billboard
if esp.billboardGui.Parent ~= head then
esp.billboardGui.Parent = head
end
esp.billboardGui.Enabled = true
-- Update name
esp.nameLabel.Visible = Settings.ShowNames
esp.nameLabel.TextColor3 = currentColor
-- Update health
esp.healthLabel.Visible = Settings.ShowHealth
local hp = hum.Health
local maxHp = hum.MaxHealth
if Settings.HealthStyle == "Percent" then
esp.healthLabel.Text = math.floor(hp / maxHp * 100) .. "%"
else
esp.healthLabel.Text = math.floor(hp) .. " / " .. math.floor(maxHp)
end
local hpRatio = hp / maxHp
esp.healthLabel.TextColor3 = Color3.fromRGB(255 * (1 - hpRatio), 255 * hpRatio, 50)
-- Update distance
esp.distLabel.Visible = Settings.ShowDistance
local myHRP = player.Character and player.Character:FindFirstChild("HumanoidRootPart")
if myHRP then
local dist = (hrp.Position - myHRP.Position).Magnitude
esp.distLabel.Text = math.floor(dist) .. "m"
end
-- Clear old visuals
esp.highlight.Enabled = false
for _, soul in pairs(esp.souls) do if soul then soul.Enabled = false end end
local oldBox = char:FindFirstChild("RatmirBox")
local old3DBox = char:FindFirstChild("Ratmir3DBox")
if oldBox then oldBox:Destroy() end
if old3DBox then old3DBox:Destroy() end
local espType = Settings.ESPType
-- 2D Box (BillboardGui method)
if espType == "2D Box" then
local box = Instance.new("BillboardGui")
box.Name = "RatmirBox"
box.Adornee = hrp
box.Size = UDim2.new(4, 0, 5, 0)
box.AlwaysOnTop = true
box.Parent = char
local frame = Instance.new("Frame", box)
frame.Size = UDim2.new(1, 0, 1, 0)
frame.BackgroundTransparency = 1
local stroke = Instance.new("UIStroke", frame)
stroke.Color = currentColor
stroke.Thickness = 2
-- 3D Box (BoxHandleAdornment method)
elseif espType == "3D Box" then
local folder = Instance.new("Folder")
folder.Name = "Ratmir3DBox"
folder.Parent = char
local size = Vector3.new(4, 5, 2)
local edges = {
{Vector3.new(-1,-1,-1), Vector3.new(1,-1,-1)},
{Vector3.new(-1,-1,-1), Vector3.new(-1,1,-1)},
{Vector3.new(-1,-1,-1), Vector3.new(-1,-1,1)},
{Vector3.new(1,-1,-1), Vector3.new(1,1,-1)},
{Vector3.new(1,-1,-1), Vector3.new(1,-1,1)},
{Vector3.new(-1,1,-1), Vector3.new(1,1,-1)},
{Vector3.new(-1,1,-1), Vector3.new(-1,1,1)},
{Vector3.new(1,1,-1), Vector3.new(1,1,1)},
{Vector3.new(-1,-1,1), Vector3.new(1,-1,1)},
{Vector3.new(-1,-1,1), Vector3.new(-1,1,1)},
{Vector3.new(1,-1,1), Vector3.new(1,1,1)},
{Vector3.new(-1,1,1), Vector3.new(1,1,1)}
}
for _, e in pairs(edges) do
local beam = Instance.new("BoxHandleAdornment")
beam.Name = "Edge"
beam.Adornee = hrp
beam.Size = Vector3.new(0.1, 0.1, (e[2] - e[1]).Magnitude * size.Z / 2)
beam.CFrame = CFrame.new((e[1] * size/2 + e[2] * size/2) / 2, e[2] * size/2)
beam.Color3 = currentColor
beam.Transparency = 0.3
beam.AlwaysOnTop = true
beam.ZIndex = 5
beam.Parent = folder
end
-- Highlight/Chams
elseif espType == "Chams" or espType == "Highlight" then
if esp.highlight.Parent ~= char then esp.highlight.Parent = char end
esp.highlight.Enabled = true
esp.highlight.FillColor = currentColor
esp.highlight.FillTransparency = espType == "Chams" and 0.3 or 0.7
-- Soul effect
elseif espType == "Soul" then
if #esp.souls == 0 then
for i = 1, 3 do
local soul = Instance.new("BillboardGui")
soul.Size = UDim2.new(0, 20, 0, 20)
soul.AlwaysOnTop = true
soul.LightInfluence = 0
local soulImg = Instance.new("Frame", soul)
soulImg.Size = UDim2.new(1, 0, 1, 0)
soulImg.BackgroundColor3 = currentColor
soulImg.BackgroundTransparency = 0.3
Instance.new("UICorner", soulImg).CornerRadius = UDim.new(1, 0)
table.insert(esp.souls, soul)
end
end
local t = tick()
for i, soul in ipairs(esp.souls) do
if soul.Parent ~= hrp then soul.Parent = hrp end
soul.Enabled = true
local angle = t * 2 + (i - 1) * (math.pi * 2 / 3)
local radius = 2.5
local yOffset = math.sin(t * 3 + i) * 0.5
soul.StudsOffset = Vector3.new(math.cos(angle) * radius, yOffset + 1, math.sin(angle) * radius)
soul:FindFirstChildOfClass("Frame").BackgroundColor3 = currentColor
end
elseif espType == "Soul V2" then
if #esp.souls ~= 4 then
for _, s in pairs(esp.souls) do s:Destroy() end
esp.souls = {}
for i = 1, 4 do
local soul = Instance.new("BillboardGui")
soul.Size = UDim2.new(0, 15, 0, 15)
soul.AlwaysOnTop = true
local soulImg = Instance.new("Frame", soul)
soulImg.Size = UDim2.new(1, 0, 1, 0)
soulImg.BackgroundColor3 = currentColor
soulImg.BackgroundTransparency = 0.2
Instance.new("UICorner", soulImg).CornerRadius = UDim.new(1, 0)
table.insert(esp.souls, soul)
end
end
local t = tick()
for i, soul in ipairs(esp.souls) do
if soul.Parent ~= hrp then soul.Parent = hrp end
soul.Enabled = true
local angle = t * 1.5 + (i - 1) * (math.pi / 2)
local yAngle = t * 2 + i
local radius = 1.8
local yPos = math.sin(yAngle) * 2
soul.StudsOffset = Vector3.new(math.cos(angle) * radius, yPos, math.sin(angle) * radius)
soul:FindFirstChildOfClass("Frame").BackgroundColor3 = currentColor
end
elseif espType == "Stars" then
if #esp.souls ~= 5 then
for _, s in pairs(esp.souls) do s:Destroy() end
esp.souls = {}
for i = 1, 5 do
local star = Instance.new("BillboardGui")
star.Size = UDim2.new(0, 18, 0, 18)
star.AlwaysOnTop = true
local starLabel = Instance.new("TextLabel", star)
starLabel.Size = UDim2.new(1, 0, 1, 0)
starLabel.BackgroundTransparency = 1
starLabel.Text = "*"
starLabel.TextColor3 = currentColor
starLabel.TextSize = 22
starLabel.Font = Enum.Font.GothamBold
table.insert(esp.souls, star)
end
end
local t = tick()
for i, star in ipairs(esp.souls) do
if star.Parent ~= hrp then star.Parent = hrp end
star.Enabled = true
local angle = t * 1.2 + (i - 1) * (math.pi * 2 / 5)
local radius = 2 + math.sin(t * 2 + i) * 0.5
local yPos = math.sin(t * 3 + i * 0.7) * 1.5
star.StudsOffset = Vector3.new(math.cos(angle) * radius, yPos + 0.5, math.sin(angle) * radius)
star:FindFirstChildOfClass("TextLabel").TextColor3 = currentColor
end
end
end
end
end
-- Player management
for _, plr in pairs(Players:GetPlayers()) do
createESP(plr)
end
Players.PlayerAdded:Connect(function(plr)
wait(1)
createESP(plr)
end)
Players.PlayerRemoving:Connect(function(plr)
removeESP(plr)
end)
-- Character respawn handling
for _, plr in pairs(Players:GetPlayers()) do
if plr ~= player then
plr.CharacterAdded:Connect(function()
wait(0.5)
if ESPObjects[plr] then
ESPObjects[plr].billboardGui.Parent = nil
ESPObjects[plr].highlight.Parent = nil
end
end)
end
end
local updateCounter = 0
local function updateTrail()
local char = player.Character
local hrp = char and char:FindFirstChild("HumanoidRootPart")
local torso = char and (char:FindFirstChild("UpperTorso") or char:FindFirstChild("Torso"))
if not Settings.TrailEnabled or not hrp or not torso then return end
local currentColor = Settings.Rainbow and Color3.fromHSV(rainbowHue, 1, 1) or Settings.Color
local size = Settings.TrailSize
if not myTrail or not myTrail.Parent then
myTrail = Instance.new("Folder")
myTrail.Name = "VisualTrail"
myTrail.Parent = char
end
local trailType = Settings.TrailType
local backPos = torso.CFrame * CFrame.new(0, 0, 1)
if trailType == "Ghost" then
local baseSize = 60 * size
local ghost = Instance.new("BillboardGui")
ghost.Size = UDim2.new(0, baseSize, 0, baseSize)
ghost.AlwaysOnTop = false
ghost.StudsOffsetWorldSpace = backPos.Position
ghost.Parent = myTrail
local frame = Instance.new("Frame", ghost)
frame.Size = UDim2.new(1, 0, 1, 0)
frame.BackgroundColor3 = currentColor
frame.BackgroundTransparency = 0.3
frame.BorderSizePixel = 0
Instance.new("UICorner", frame).CornerRadius = UDim.new(0.5, 0)
spawn(function()
for i = 1, 30 do
if not ghost.Parent then return end
frame.BackgroundTransparency = 0.3 + (i / 30) * 0.7
local newSize = baseSize - i * (1.5 * size)
ghost.Size = UDim2.new(0, math.max(newSize, 5), 0, math.max(newSize, 5))
wait(0.02)
end
ghost:Destroy()
end)
elseif trailType == "Classic" then
local baseSize = 45 * size
local bill = Instance.new("BillboardGui")
bill.Size = UDim2.new(0, baseSize, 0, baseSize)
bill.AlwaysOnTop = false
bill.StudsOffsetWorldSpace = backPos.Position
bill.Parent = myTrail
local frame = Instance.new("Frame", bill)
frame.Size = UDim2.new(1, 0, 1, 0)
frame.BackgroundColor3 = currentColor
frame.BackgroundTransparency = 0.5
frame.BorderSizePixel = 0
Instance.new("UICorner", frame).CornerRadius = UDim.new(1, 0)
spawn(function()
for i = 1, 20 do
if not bill.Parent then return end
frame.BackgroundTransparency = 0.5 + (i / 20) * 0.5
wait(0.03)
end
bill:Destroy()
end)
else
local symbols = {Stars = "*", Hearts = "<3", Lightning = "!", Sparkle = "+"}
local baseSize = 50 * size
local textSize = 32 * size
local bill = Instance.new("BillboardGui")
bill.Size = UDim2.new(0, baseSize, 0, baseSize)
bill.AlwaysOnTop = false
bill.StudsOffsetWorldSpace = backPos.Position
bill.Parent = myTrail
local lbl = Instance.new("TextLabel", bill)
lbl.Size = UDim2.new(1, 0, 1, 0)
lbl.BackgroundTransparency = 1
lbl.Text = symbols[trailType] or "*"
lbl.TextColor3 = currentColor
lbl.TextSize = textSize
lbl.Font = Enum.Font.GothamBold
lbl.TextStrokeColor3 = currentColor
lbl.TextStrokeTransparency = 0.5
spawn(function()
for i = 1, 25 do
if not bill.Parent then return end
lbl.TextTransparency = i / 25
lbl.TextStrokeTransparency = 0.5 + (i / 25) * 0.5
wait(0.03)
end
bill:Destroy()
end)
end
end
RunService.Heartbeat:Connect(function(dt)
-- Rainbow title animation
rainbowHue = (rainbowHue + dt * 0.3) % 1
titleLabel.TextColor3 = Color3.fromHSV(rainbowHue, 0.8, 1)
mainStroke.Color = Color3.fromHSV(rainbowHue, 0.7, 0.9)
miniStroke.Color = Color3.fromHSV(rainbowHue, 0.7, 0.9)
fpStroke.Color = Color3.fromHSV(rainbowHue, 0.7, 0.9)
-- Update color preview if rainbow
if Settings.Rainbow then
colorPreview.BackgroundColor3 = Color3.fromHSV(rainbowHue, 1, 1)
end
-- Update ESP (throttled for performance)
updateCounter = updateCounter + 1
if updateCounter >= 3 then
updateCounter = 0
updateESP()
updateTrail()
updateChinaHats()
updateTargetESP()
end
end)
![[KEYLESS] Moondiety Script | 17+ supported Games](https://scriptblox.com/images/sb/0-1753093706828.png)


@notabotwyvern vro, im using my ofn deobusficator🤞🥀
@LOLkidd ur schizo bro
i like this because i can turn into neko girl and stroke my cobk
@wesdfr XD