Visual Client CRACKED
Key RequiredUniversal

Visual Client CRACKED

Universal ScriptImKomodOrNEKOMODImKomodOrNEKOMOD 820 views 302 executesUpdated Jan 26, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•1825 lines (69520 chars)
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)

Features & Information

Yo, WSP! This is a crack of some crappy visual client. It's obvious the author is incompetent and didn't even delete the AI ​​comments. Anyway, I cracked it using my tool and then deubusficated it. Play it, you might steal something from the code.
#crack#FE#Visual#hack#sourcecode

Community Comments (4)

ImKomodOrNEKOMODImKomodOrNEKOMODJan 26, 2026

@notabotwyvern vro, im using my ofn deobusficator🤞🥀

Replying to @ImKomodOrNEKOMOD
wesdfrwesdfrJan 26, 2026

@LOLkidd ur schizo bro

wesdfrwesdfrJan 26, 2026

i like this because i can turn into neko girl and stroke my cobk

Replying to @wesdfr
ImKomodOrNEKOMODImKomodOrNEKOMODJan 27, 2026

@wesdfr XD

More Scripts for Universal Scripts