FE Outfit Changer OPEN SOURCE
Key RequiredUniversal

FE Outfit Changer OPEN SOURCE

Universal ScriptPickelkingkongPickelkingkong 513 views 5.5K executesUpdated Jul 10, 2026
Unrated
00
Lua Script•1142 lines (46014 chars)
-- Ensure old UI is removed cleanly
local CoreGui = game:GetService("CoreGui")
if CoreGui:FindFirstChild("OutfitChangerGUI") then
    CoreGui.OutfitChangerGUI:Destroy()
end

-- Create Main ScreenGui
local OutfitChangerGUI = Instance.new("ScreenGui")
OutfitChangerGUI.Name = "OutfitChangerGUI"
OutfitChangerGUI.Parent = CoreGui
OutfitChangerGUI.ResetOnSpawn = false

-- Premium Minimalist Palette
local THEME = {
    Background = Color3.fromRGB(18, 18, 22),
    Header = Color3.fromRGB(12, 12, 15),
    Accent = Color3.fromRGB(242, 185, 34),     -- Vivid Gold
    AccentDim = Color3.fromRGB(165, 125, 23),
    Text = Color3.fromRGB(255, 255, 255),
    TextDim = Color3.fromRGB(140, 140, 150),
    Button = Color3.fromRGB(28, 28, 34),
    ButtonHover = Color3.fromRGB(36, 36, 44),
    Input = Color3.fromRGB(10, 10, 12),
    Border = Color3.fromRGB(35, 35, 42),
    Success = Color3.fromRGB(46, 204, 113)
}

-- Services
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer

local T_FAST = TweenInfo.new(0.2, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
local T_BOUNCE = TweenInfo.new(0.3, Enum.EasingStyle.Back, Enum.EasingDirection.Out)

-- Global Automation Settings & Originals Tracking Map
local SaveOnDeathEnabled = false
local LastCustomOutfit = {
    Shirt = nil,
    Pants = nil,
    TShirt = nil,
    FaceTexture = nil,
    SkinColor = nil, -- Tracks custom HSV applied skin tone
    Accessories = {} -- Tracks custom added accessory IDs
}

local OriginalOutfitSnapshot = {
    Shirt = nil,
    Pants = nil,
    TShirt = nil,
    FaceTexture = nil,
    BodyColors = {},  -- Stored original RGB color map
    Accessories = {}  -- Stored array of deep cloned original models
}

--------------------------------------------------------------------------------
-- Core Systems Snapshot Mapping
--------------------------------------------------------------------------------
local function captureOriginalOutfit()
    local char = LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait()
    task.wait(0.5) -- Allow engine to replicate serverside assets fully
    
    local shirt = char:FindFirstChildOfClass("Shirt")
    OriginalOutfitSnapshot.Shirt = shirt and shirt.ShirtTemplate or ""
    
    local pants = char:FindFirstChildOfClass("Pants")
    OriginalOutfitSnapshot.Pants = pants and pants.PantsTemplate or ""
    
    local tShirt = char:FindFirstChildOfClass("ShirtGraphic")
    OriginalOutfitSnapshot.TShirt = tShirt and tShirt.Graphic or ""
    
    local head = char:FindFirstChild("Head")
    if head then
        local face = head:FindFirstChild("face")
        OriginalOutfitSnapshot.FaceTexture = face and face.Texture or ""
    end
    
    local bc = char:FindFirstChildOfClass("BodyColors")
    if bc then
        OriginalOutfitSnapshot.BodyColors = {
            HeadColor3 = bc.HeadColor3,
            LeftArmColor3 = bc.LeftArmColor3,
            RightArmColor3 = bc.RightArmColor3,
            TorsoColor3 = bc.TorsoColor3,
            LeftLegColor3 = bc.LeftLegColor3,
            RightLegColor3 = bc.RightLegColor3
        }
    else
        -- Fallback if BodyColors instance missing natively (uses Head color)
        local fallbackColor = head and head.Color or Color3.fromRGB(163, 162, 165)
        OriginalOutfitSnapshot.BodyColors = {
            HeadColor3 = fallbackColor, LeftArmColor3 = fallbackColor, RightArmColor3 = fallbackColor,
            TorsoColor3 = fallbackColor, LeftLegColor3 = fallbackColor, RightLegColor3 = fallbackColor
        }
    end
    
    -- Clear out old stored accessory models safely
    for _, clone in ipairs(OriginalOutfitSnapshot.Accessories) do
        pcall(function() clone:Destroy() end)
    end
    OriginalOutfitSnapshot.Accessories = {}
    
    -- Deep map accessories natively
    for _, item in ipairs(char:GetChildren()) do
        if item:IsA("Accessory") then
            local arch = item.Archivable
            item.Archivable = true
            local copy = item:Clone()
            item.Archivable = arch
            table.insert(OriginalOutfitSnapshot.Accessories, copy)
        end
    end
end

-- Kickstart snapshot profile
if LocalPlayer.Character then captureOriginalOutfit() end
LocalPlayer.CharacterAdded:Connect(function()
    if not SaveOnDeathEnabled then
        captureOriginalOutfit()
    end
end)

--------------------------------------------------------------------------------
-- UI Helper Functions
--------------------------------------------------------------------------------
local function round(parent, radius)
    local corner = Instance.new("UICorner")
    corner.CornerRadius = UDim.new(0, radius or 6)
    corner.Parent = parent
    return corner
end

local function stroke(parent, color, thickness, transparency)
    local uistroke = Instance.new("UIStroke")
    uistroke.Color = color
    uistroke.Thickness = thickness or 1
    uistroke.Transparency = transparency or 0
    uistroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border
    uistroke.Parent = parent
    return uistroke
end

local function applyPremiumSpring(btn, hoverBg, baseBg, accentColor)
    local scale = Instance.new("UIScale")
    scale.Parent = btn
    
    btn.MouseEnter:Connect(function()
        TweenService:Create(btn, T_BOUNCE, {Scale = 1.02}):Play()
        TweenService:Create(btn, T_FAST, {BackgroundColor3 = hoverBg}):Play()
        if accentColor and btn:IsA("TextButton") then
            TweenService:Create(btn, T_FAST, {TextColor3 = THEME.Accent}):Play()
        end
    end)
    btn.MouseLeave:Connect(function()
        TweenService:Create(btn, T_BOUNCE, {Scale = 1.0}):Play()
        TweenService:Create(btn, T_FAST, {BackgroundColor3 = baseBg}):Play()
        if accentColor and btn:IsA("TextButton") then
            TweenService:Create(btn, T_FAST, {TextColor3 = accentColor}):Play()
        end
    end)
    btn.MouseButton1Down:Connect(function()
        TweenService:Create(btn, T_FAST, {Scale = 0.97}):Play()
    end)
    btn.MouseButton1Up:Connect(function()
        TweenService:Create(btn, T_BOUNCE, {Scale = 1.02}):Play()
    end)
end

--------------------------------------------------------------------------------
-- Main UI Frame Architecture
--------------------------------------------------------------------------------
local MainFrame = Instance.new("Frame")
MainFrame.Name = "MainFrame"
MainFrame.Size = UDim2.new(0, 390, 0, 600)
MainFrame.Position = UDim2.new(0.5, -195, 0.5, -300)
MainFrame.BackgroundColor3 = THEME.Background
MainFrame.BorderSizePixel = 0
MainFrame.Parent = OutfitChangerGUI
round(MainFrame, 12)
stroke(MainFrame, THEME.Accent, 1, 0.15)

-- Drop Shadow Effect
local Shadow = Instance.new("Frame")
Shadow.Size = UDim2.new(1, 16, 1, 16)
Shadow.Position = UDim2.new(0, -8, 0, -8)
Shadow.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
Shadow.BackgroundTransparency = 0.65
Shadow.ZIndex = -1
Shadow.Parent = MainFrame
round(Shadow, 16)

-- Header Bar
local Header = Instance.new("Frame")
Header.Size = UDim2.new(1, 0, 0, 48)
Header.BackgroundColor3 = THEME.Header
Header.BorderSizePixel = 0
Header.Parent = MainFrame
round(Header, 12)

local HeaderFlatten = Instance.new("Frame")
HeaderFlatten.Size = UDim2.new(1, 0, 0, 16)
HeaderFlatten.Position = UDim2.new(0, 0, 1, -16)
HeaderFlatten.BackgroundColor3 = THEME.Header
HeaderFlatten.BorderSizePixel = 0
HeaderFlatten.Parent = Header

local Title = Instance.new("TextLabel")
Title.Size = UDim2.new(1, -60, 1, 0)
Title.Position = UDim2.new(0, 16, 0, 0)
Title.BackgroundTransparency = 1
Title.Text = "FE OUTFIT CHANGER BY PKL"
Title.TextColor3 = THEME.Text
Title.TextSize = 14
Title.Font = Enum.Font.GothamBold
Title.TextXAlignment = Enum.TextXAlignment.Left
Title.Parent = Header

local CloseBtn = Instance.new("TextButton")
CloseBtn.Size = UDim2.new(0, 28, 0, 28)
CloseBtn.Position = UDim2.new(1, -38, 0, 10)
CloseBtn.BackgroundColor3 = THEME.Button
CloseBtn.Text = "×"
CloseBtn.TextColor3 = THEME.TextDim
CloseBtn.TextSize = 20
CloseBtn.Font = Enum.Font.GothamMedium
CloseBtn.Parent = Header
round(CloseBtn, 6)
stroke(CloseBtn, THEME.Border, 1)
applyPremiumSpring(CloseBtn, Color3.fromRGB(200, 60, 60), THEME.Button, Color3.fromRGB(255,255,255))
CloseBtn.MouseButton1Click:Connect(function() OutfitChangerGUI:Destroy() end)

--------------------------------------------------------------------------------
-- Drag Logic
--------------------------------------------------------------------------------
local dragging, dragInput, dragStart, startPos
Header.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        dragging = true
        dragStart = input.Position
        startPos = MainFrame.Position
        input.Changed:Connect(function()
            if input.UserInputState == Enum.UserInputState.End then dragging = false end
        end)
    end
end)
Header.InputChanged:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
        dragInput = input
    end
end)
UserInputService.InputChanged:Connect(function(input)
    if input == dragInput and dragging 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
end)

--------------------------------------------------------------------------------
-- Anti-Clipping Scroll Canvas Container Layout
--------------------------------------------------------------------------------
local Container = Instance.new("ScrollingFrame")
Container.Size = UDim2.new(1, 0, 1, -58)
Container.Position = UDim2.new(0, 0, 0, 52)
Container.BackgroundTransparency = 1
Container.BorderSizePixel = 0
Container.AutomaticCanvasSize = Enum.AutomaticSize.Y
Container.CanvasSize = UDim2.new(0, 0, 0, 0)
Container.ScrollBarThickness = 5
Container.ScrollBarImageColor3 = THEME.Accent
Container.ScrollBarImageTransparency = 0.3
Container.Parent = MainFrame

local ContainerPadding = Instance.new("UIPadding")
ContainerPadding.PaddingTop = UDim.new(0, 10)
ContainerPadding.PaddingBottom = UDim.new(0, 16)
ContainerPadding.PaddingLeft = UDim.new(0, 14)
ContainerPadding.PaddingRight = UDim.new(0, 18)
ContainerPadding.Parent = Container

local UIListLayout = Instance.new("UIListLayout")
UIListLayout.Padding = UDim.new(0, 14)
UIListLayout.SortOrder = Enum.SortOrder.LayoutOrder
UIListLayout.Parent = Container

-- Context Popout Frame
local PopoutScroll = Instance.new("ScrollingFrame")
PopoutScroll.BackgroundColor3 = THEME.Header
PopoutScroll.BorderSizePixel = 0
PopoutScroll.ScrollBarThickness = 3
PopoutScroll.ScrollBarImageColor3 = THEME.Accent
PopoutScroll.Visible = false
PopoutScroll.ZIndex = 10
PopoutScroll.Parent = MainFrame
round(PopoutScroll, 6)
stroke(PopoutScroll, THEME.AccentDim, 1)

local PopoutLayout = Instance.new("UIListLayout")
PopoutLayout.Padding = UDim.new(0, 5)
PopoutLayout.SortOrder = Enum.SortOrder.LayoutOrder
PopoutLayout.Parent = PopoutScroll
local PopoutPadding = Instance.new("UIPadding")
PopoutPadding.PaddingTop = UDim.new(0, 5)
PopoutPadding.PaddingBottom = UDim.new(0, 5)
PopoutPadding.PaddingLeft = UDim.new(0, 5)
PopoutPadding.PaddingRight = UDim.new(0, 5)
PopoutPadding.Parent = PopoutScroll

--------------------------------------------------------------------------------
-- Master Save & Restore Action Functions
--------------------------------------------------------------------------------
local function weldParts(part0, part1, c0, c1)
    local weld = Instance.new("Weld")
    weld.Part0, weld.Part1, weld.C0, weld.C1 = part0, part1, c0, c1
    weld.Parent = part0
    return weld
end

local function findAttachment(rootPart, name)
    for _, descendant in pairs(rootPart:GetDescendants()) do
        if descendant:IsA("Attachment") and descendant.Name == name then return descendant end
    end
end

local function addAccessory(accessoryId, character)
    local success, objects = pcall(function() return game:GetObjects("rbxassetid://" .. tostring(accessoryId)) end)
    if not success or not objects or #objects == 0 then return end
    local accessory = objects[1]
    if not accessory or not accessory:IsA("Accessory") then return end

    accessory.Parent = workspace
    local handle = accessory:FindFirstChild("Handle")
    if handle then
        handle.CanCollide = false
        local attachment = handle:FindFirstChildOfClass("Attachment")
        if attachment then
            local parentAttachment = findAttachment(character, attachment.Name)
            if parentAttachment then
                weldParts(parentAttachment.Parent, handle, parentAttachment.CFrame, attachment.CFrame)
            else
                weldParts(character:FindFirstChild("Head"), handle, CFrame.new(0, 0, 0), attachment.CFrame)
            end
        else
            weldParts(character:FindFirstChild("Head"), handle, CFrame.new(0, 0.5, 0), accessory.AttachmentPoint)
        end
    end
    accessory.Parent = character
    
    -- Save state for death automation caching
    if not table.find(LastCustomOutfit.Accessories, accessoryId) then
        table.insert(LastCustomOutfit.Accessories, accessoryId)
    end
end

local function applySkinColor(color)
    local character = LocalPlayer.Character
    if not character then return end
    
    local bodyColors = character:FindFirstChildOfClass("BodyColors") or Instance.new("BodyColors", character)
    bodyColors.HeadColor3 = color
    bodyColors.LeftArmColor3 = color
    bodyColors.RightArmColor3 = color
    bodyColors.TorsoColor3 = color
    bodyColors.LeftLegColor3 = color
    bodyColors.RightLegColor3 = color
    
    for _, part in ipairs(character:GetChildren()) do
        if part:IsA("BasePart") then 
            pcall(function() part.Color = color end) 
        end
    end
    
    -- Cache configuration internally for respawns
    LastCustomOutfit.SkinColor = color
end

local function restoreOriginalOutfitSystem()
    local char = LocalPlayer.Character
    if not char then return end
    
    -- 1. Restore Shirt
    local shirt = char:FindFirstChildOfClass("Shirt")
    if OriginalOutfitSnapshot.Shirt ~= "" then
        if not shirt then shirt = Instance.new("Shirt", char) end
        shirt.ShirtTemplate = OriginalOutfitSnapshot.Shirt
    elseif shirt then
        shirt:Destroy()
    end
    LastCustomOutfit.Shirt = OriginalOutfitSnapshot.Shirt
    
    -- 2. Restore Pants
    local pants = char:FindFirstChildOfClass("Pants")
    if OriginalOutfitSnapshot.Pants ~= "" then
        if not pants then pants = Instance.new("Pants", char) end
        pants.PantsTemplate = OriginalOutfitSnapshot.Pants
    elseif pants then
        pants:Destroy()
    end
    LastCustomOutfit.Pants = OriginalOutfitSnapshot.Pants
    
    -- 3. Restore T-Shirt
    local tShirt = char:FindFirstChildOfClass("ShirtGraphic")
    if OriginalOutfitSnapshot.TShirt ~= "" then
        if not tShirt then tShirt = Instance.new("ShirtGraphic", char) end
        tShirt.Graphic = OriginalOutfitSnapshot.TShirt
    elseif tShirt then
        tShirt:Destroy()
    end
    LastCustomOutfit.TShirt = OriginalOutfitSnapshot.TShirt
    
    -- 4. Restore Face
    local head = char:FindFirstChild("Head")
    if head then
        local face = head:FindFirstChild("face")
        if OriginalOutfitSnapshot.FaceTexture ~= "" then
            if not face then
                face = Instance.new("Decal")
                face.Name = "face"
                face.Face = Enum.NormalId.Front
                face.Parent = head
            end
            face.Texture = OriginalOutfitSnapshot.FaceTexture
        elseif face then
            face:Destroy()
        end
    end
    LastCustomOutfit.FaceTexture = OriginalOutfitSnapshot.FaceTexture
    
    -- 5. Restore Skin Color (R6 / R15 Architecture Fix)
    local bc = char:FindFirstChildOfClass("BodyColors")
    if bc and OriginalOutfitSnapshot.BodyColors.HeadColor3 then
        bc.HeadColor3 = OriginalOutfitSnapshot.BodyColors.HeadColor3
        bc.LeftArmColor3 = OriginalOutfitSnapshot.BodyColors.LeftArmColor3
        bc.RightArmColor3 = OriginalOutfitSnapshot.BodyColors.RightArmColor3
        bc.TorsoColor3 = OriginalOutfitSnapshot.BodyColors.TorsoColor3
        bc.LeftLegColor3 = OriginalOutfitSnapshot.BodyColors.LeftLegColor3
        bc.RightLegColor3 = OriginalOutfitSnapshot.BodyColors.RightLegColor3
        
        -- Force updates on every individual bone/limbp part to fully support standard R15 structures
        for _, part in ipairs(char:GetChildren()) do
            if part:IsA("BasePart") then
                if part.Name == "Head" then part.Color = bc.HeadColor3
                elseif part.Name:find("LeftArm") or part.Name:find("LeftUpperArm") or part.Name:find("LeftLowerArm") or part.Name:find("LeftHand") then part.Color = bc.LeftArmColor3
                elseif part.Name:find("RightArm") or part.Name:find("RightUpperArm") or part.Name:find("RightLowerArm") or part.Name:find("RightHand") then part.Color = bc.RightArmColor3
                elseif part.Name:find("LeftLeg") or part.Name:find("LeftUpperLeg") or part.Name:find("LeftLowerLeg") or part.Name:find("LeftFoot") then part.Color = bc.LeftLegColor3
                elseif part.Name:find("RightLeg") or part.Name:find("RightUpperLeg") or part.Name:find("RightLowerLeg") or part.Name:find("RightFoot") then part.Color = bc.RightLegColor3
                else part.Color = bc.TorsoColor3 end
            end
        end
        LastCustomOutfit.SkinColor = bc.TorsoColor3
    end
    
    -- 6. Remap Accessories smoothly preventing duplications
    for _, item in ipairs(char:GetChildren()) do
        if item:IsA("Accessory") then item:Destroy() end
    end
    LastCustomOutfit.Accessories = {}
    for _, originalClone in ipairs(OriginalOutfitSnapshot.Accessories) do
        local newClone = originalClone:Clone()
        newClone.Parent = workspace
        local handle = newClone:FindFirstChild("Handle")
        if handle then
            handle.CanCollide = false
            local attachment = handle:FindFirstChildOfClass("Attachment")
            if attachment then
                local parentAttachment = findAttachment(char, attachment.Name)
                if parentAttachment then
                    weldParts(parentAttachment.Parent, handle, parentAttachment.CFrame, attachment.CFrame)
                else
                    weldParts(char:FindFirstChild("Head"), handle, CFrame.new(0, 0, 0), attachment.CFrame)
                end
            else
                weldParts(char:FindFirstChild("Head"), handle, CFrame.new(0, 0.5, 0), newClone.AttachmentPoint)
            end
        end
        newClone.Parent = char
    end
end

--------------------------------------------------------------------------------
-- Automation Control Row Frame Panel
--------------------------------------------------------------------------------
local ControlRowFrame = Instance.new("Frame")
ControlRowFrame.Size = UDim2.new(1, 0, 0, 125)
ControlRowFrame.BackgroundColor3 = THEME.Header
ControlRowFrame.LayoutOrder = -1 
ControlRowFrame.Parent = Container
round(ControlRowFrame, 8)
stroke(ControlRowFrame, THEME.Border, 1)

local ControlLabel = Instance.new("TextLabel")
ControlLabel.Size = UDim2.new(1, -24, 0, 24)
ControlLabel.Position = UDim2.new(0, 12, 0, 6)
ControlLabel.BackgroundTransparency = 1
ControlLabel.Text = "OUTFIT AUTOMATION & UTILITIES"
ControlLabel.TextColor3 = THEME.TextDim
ControlLabel.Font = Enum.Font.GothamBold
ControlLabel.TextSize = 11
ControlLabel.TextXAlignment = Enum.TextXAlignment.Left
ControlLabel.Parent = ControlRowFrame

local RestoreBtn = Instance.new("TextButton")
RestoreBtn.Size = UDim2.new(1, -24, 0, 32)
RestoreBtn.Position = UDim2.new(0, 12, 0, 34)
RestoreBtn.BackgroundColor3 = THEME.Button
RestoreBtn.Text = "Restore Server-Sided Default Outfit"
RestoreBtn.TextColor3 = THEME.Accent
RestoreBtn.Font = Enum.Font.GothamBold
RestoreBtn.TextSize = 11
RestoreBtn.Parent = ControlRowFrame
round(RestoreBtn, 6)
stroke(RestoreBtn, THEME.Border, 1)
applyPremiumSpring(RestoreBtn, THEME.ButtonHover, THEME.Button, THEME.Accent)

local ToggleSaveDeathBtn = Instance.new("TextButton")
ToggleSaveDeathBtn.Size = UDim2.new(1, -24, 0, 32)
ToggleSaveDeathBtn.Position = UDim2.new(0, 12, 0, 72)
ToggleSaveDeathBtn.BackgroundColor3 = THEME.Button
ToggleSaveDeathBtn.Text = "Save Outfit On Death: DISABLED"
ToggleSaveDeathBtn.TextColor3 = Color3.fromRGB(240, 90, 90)
ToggleSaveDeathBtn.Font = Enum.Font.GothamBold
ToggleSaveDeathBtn.TextSize = 11
ToggleSaveDeathBtn.Parent = ControlRowFrame
round(ToggleSaveDeathBtn, 6)
stroke(ToggleSaveDeathBtn, THEME.Border, 1)
applyPremiumSpring(ToggleSaveDeathBtn, THEME.ButtonHover, THEME.Button, Color3.fromRGB(240, 90, 90))

local ClientReminderLabel = Instance.new("TextLabel")
ClientReminderLabel.Size = UDim2.new(1, -24, 0, 16)
ClientReminderLabel.Position = UDim2.new(0, 12, 0, 106)
ClientReminderLabel.BackgroundTransparency = 1
ClientReminderLabel.Text = "⚠️ Reminder: Customizations reset if you leave and rejoin the server."
ClientReminderLabel.TextColor3 = Color3.fromRGB(180, 150, 100)
ClientReminderLabel.Font = Enum.Font.Gotham
ClientReminderLabel.TextSize = 9
ClientReminderLabel.TextXAlignment = Enum.TextXAlignment.Left
ClientReminderLabel.Parent = ControlRowFrame

RestoreBtn.MouseButton1Click:Connect(function()
    restoreOriginalOutfitSystem()
end)

ToggleSaveDeathBtn.MouseButton1Click:Connect(function()
    SaveOnDeathEnabled = not SaveOnDeathEnabled
    if SaveOnDeathEnabled then
        ToggleSaveDeathBtn.Text = "Save Outfit On Death: ENABLED"
        ToggleSaveDeathBtn.TextColor3 = THEME.Success
        TweenService:Create(ToggleSaveDeathBtn:FindFirstChildOfClass("UIStroke"), T_FAST, {Color = THEME.Success}):Play()
    else
        ToggleSaveDeathBtn.Text = "Save Outfit On Death: DISABLED"
        ToggleSaveDeathBtn.TextColor3 = Color3.fromRGB(240, 90, 90)
        TweenService:Create(ToggleSaveDeathBtn:FindFirstChildOfClass("UIStroke"), T_FAST, {Color = THEME.Border}):Play()
    end
end)

--------------------------------------------------------------------------------
-- Respawn Runtime Execution Loop
--------------------------------------------------------------------------------
LocalPlayer.CharacterAdded:Connect(function(newCharacter)
    if SaveOnDeathEnabled then
        task.wait(0.6) -- Give rig construction time to map limbs securely
        
        -- 1. Apply customized skin tone cache across structural nodes
        if LastCustomOutfit.SkinColor then
            applySkinColor(LastCustomOutfit.SkinColor)
        end
        
        -- 2. Force Shirt customization configurations
        if LastCustomOutfit.Shirt and LastCustomOutfit.Shirt ~= "" then
            local s = newCharacter:FindFirstChildOfClass("Shirt") or Instance.new("Shirt", newCharacter)
            s.ShirtTemplate = LastCustomOutfit.Shirt
        end
        
        -- 3. Force Pants customization configurations
        if LastCustomOutfit.Pants and LastCustomOutfit.Pants ~= "" then
            local p = newCharacter:FindFirstChildOfClass("Pants") or Instance.new("Pants", newCharacter)
            p.PantsTemplate = LastCustomOutfit.Pants
        end
        
        -- 4. Force T-Shirt customization configurations
        if LastCustomOutfit.TShirt and LastCustomOutfit.TShirt ~= "" then
            local tg = newCharacter:FindFirstChildOfClass("ShirtGraphic") or Instance.new("ShirtGraphic", newCharacter)
            tg.Graphic = LastCustomOutfit.TShirt
        end
        
        -- 5. Force Face texture transformations
        if LastCustomOutfit.FaceTexture and LastCustomOutfit.FaceTexture ~= "" then
            local h = newCharacter:FindFirstChild("Head")
            if h then
                local face = h:FindFirstChild("face") or Instance.new("Decal", h)
                face.Name = "face"
                face.Texture = LastCustomOutfit.FaceTexture
            end
        end
        
        -- 6. Force clean injection of added accessories map tracking
        for _, accId in ipairs(LastCustomOutfit.Accessories) do
            addAccessory(accId, newCharacter)
        end
    end
end)

--------------------------------------------------------------------------------
-- Context Popout Frame
--------------------------------------------------------------------------------
local function closePopout()
    TweenService:Create(PopoutScroll, TweenInfo.new(0.2, Enum.EasingStyle.Quad, Enum.EasingDirection.In), {Size = UDim2.new(0, 160, 0, 0)}):Play()
    task.wait(0.2)
    if PopoutScroll.Size.Y.Offset == 0 then PopoutScroll.Visible = false end
end

local function handleDeletion(className, buttonObj)
    local character = LocalPlayer.Character
    if not character then return end
    
    local matches = {}
    for _, item in ipairs(character:GetChildren()) do
        if item:IsA(className) then table.insert(matches, item) end
    end
    if #matches == 0 then return end
    if #matches == 1 then matches[1]:Destroy() return end
    
    for _, child in ipairs(PopoutScroll:GetChildren()) do
        if child:IsA("TextButton") then child:Destroy() end
    end
    
    PopoutScroll.Position = UDim2.new(0, buttonObj.AbsolutePosition.X - MainFrame.AbsolutePosition.X - 168, 0, buttonObj.AbsolutePosition.Y - MainFrame.AbsolutePosition.Y)
    PopoutScroll.Visible = true
    
    local calcHeight = math.clamp((#matches * 31) + 10, 40, 160)
    TweenService:Create(PopoutScroll, T_BOUNCE, {Size = UDim2.new(0, 160, 0, calcHeight)}):Play()
    PopoutScroll.CanvasSize = UDim2.new(0, 0, 0, (#matches * 31) + 10)
    
    for i, instance in ipairs(matches) do
        local opt = Instance.new("TextButton")
        opt.Size = UDim2.new(1, 0, 0, 26)
        opt.BackgroundColor3 = THEME.Button
        opt.Text = instance.Name .. " [" .. i .. "]"
        opt.TextColor3 = THEME.Text
        opt.Font = Enum.Font.Gotham
        opt.TextSize = 11
        opt.ZIndex = 11
        opt.Parent = PopoutScroll
        round(opt, 4)
        stroke(opt, THEME.Border, 1)
        applyPremiumSpring(opt, THEME.ButtonHover, THEME.Button, THEME.Text)
        
        opt.MouseButton1Click:Connect(function()
            if instance and instance.Parent then instance:Destroy() end
            closePopout()
        end)
    end
end

--------------------------------------------------------------------------------
-- Clean UI Row Builder
--------------------------------------------------------------------------------
local function createInteractiveRow(labelTitle, className)
    local RowFrame = Instance.new("Frame")
    RowFrame.Size = UDim2.new(1, 0, 0, 112)
    RowFrame.BackgroundColor3 = THEME.Header
    RowFrame.Parent = Container
    round(RowFrame, 8)
    stroke(RowFrame, THEME.Border, 1)
    
    local Label = Instance.new("TextLabel")
    Label.Size = UDim2.new(1, -24, 0, 28)
    Label.Position = UDim2.new(0, 12, 0, 6)
    Label.BackgroundTransparency = 1
    Label.Text = labelTitle:upper()
    Label.TextColor3 = THEME.TextDim
    Label.Font = Enum.Font.GothamBold
    Label.TextSize = 11
    Label.TextXAlignment = Enum.TextXAlignment.Left
    Label.Parent = RowFrame
    
    local TextBox = Instance.new("TextBox")
    TextBox.Size = UDim2.new(1, -24, 0, 34)
    TextBox.Position = UDim2.new(0, 12, 0, 34)
    TextBox.BackgroundColor3 = THEME.Input
    TextBox.Text = ""
    TextBox.PlaceholderText = "Enter " .. labelTitle .. " Asset ID..."
    TextBox.TextColor3 = THEME.Text
    TextBox.PlaceholderColor3 = Color3.fromRGB(75, 75, 85)
    TextBox.Font = Enum.Font.Gotham
    TextBox.TextSize = 12
    TextBox.ClearTextOnFocus = false
    TextBox.Parent = RowFrame
    round(TextBox, 6)
    stroke(TextBox, THEME.Border, 1)
    
    TextBox.Focused:Connect(function()
        TweenService:Create(TextBox:FindFirstChildOfClass("UIStroke"), T_FAST, {Color = THEME.AccentDim}):Play()
    end)
    TextBox.FocusLost:Connect(function()
        TweenService:Create(TextBox:FindFirstChildOfClass("UIStroke"), T_FAST, {Color = THEME.Border}):Play()
    end)
    
    local AddBtn = Instance.new("TextButton")
    AddBtn.Size = UDim2.new(0.5, -16, 0, 30)
    AddBtn.Position = UDim2.new(0, 12, 0, 74)
    AddBtn.BackgroundColor3 = THEME.Button
    AddBtn.Text = "Add " .. labelTitle
    AddBtn.TextColor3 = THEME.Accent
    AddBtn.Font = Enum.Font.GothamBold
    AddBtn.TextSize = 11
    AddBtn.Parent = RowFrame
    round(AddBtn, 6)
    stroke(AddBtn, THEME.Border, 1)
    applyPremiumSpring(AddBtn, THEME.ButtonHover, THEME.Button, THEME.Accent)
    
    local DelBtn = Instance.new("TextButton")
    DelBtn.Size = UDim2.new(0.5, -16, 0, 30)
    DelBtn.Position = UDim2.new(0.5, 4, 0, 74)
    DelBtn.BackgroundColor3 = THEME.Button
    DelBtn.Text = "Remove"
    DelBtn.TextColor3 = Color3.fromRGB(240, 90, 90)
    DelBtn.Font = Enum.Font.GothamBold
    DelBtn.TextSize = 11
    DelBtn.Parent = RowFrame
    round(DelBtn, 6)
    stroke(DelBtn, THEME.Border, 1)
    applyPremiumSpring(DelBtn, THEME.ButtonHover, THEME.Button, Color3.fromRGB(240, 90, 90))
    
    AddBtn.MouseButton1Click:Connect(function()
        local character = LocalPlayer.Character
        if not character or TextBox.Text == "" then return end
        local cleanId = TextBox.Text:match("%d+")
        if not cleanId then return end
        
        if className == "Accessory" then
            addAccessory(cleanId, character)
        else
            local useClass = (className == "T-Shirt") and "ShirtGraphic" or className
            local targetProperty = (className == "Shirt") and "ShirtTemplate" or (className == "Pants" and "PantsTemplate" or "Graphic")
            local finalAssetTemplateId = "rbxassetid://" .. cleanId
            
            local loadSuccess, assetObjects = pcall(function() return game:GetObjects("rbxassetid://" .. cleanId) end)
            if loadSuccess and assetObjects and assetObjects[1] then
                local obj = assetObjects[1]
                if obj:IsA("Shirt") and useClass == "Shirt" then finalAssetTemplateId = obj.ShirtTemplate
                elseif obj:IsA("Pants") and useClass == "Pants" then finalAssetTemplateId = obj.PantsTemplate
                elseif obj:IsA("ShirtGraphic") and useClass == "ShirtGraphic" then finalAssetTemplateId = obj.Graphic end
                obj:Destroy()
            end
            
            local existingAsset = character:FindFirstChildOfClass(useClass)
            if existingAsset then existingAsset[targetProperty] = finalAssetTemplateId
            else
                local newAsset = Instance.new(useClass)
                newAsset[targetProperty] = finalAssetTemplateId
                newAsset.Parent = character
            end
            
            -- Keep cache in lock-step sync for runtime survival automation
            if className == "Shirt" then LastCustomOutfit.Shirt = finalAssetTemplateId
            elseif className == "Pants" then LastCustomOutfit.Pants = finalAssetTemplateId
            elseif className == "T-Shirt" then LastCustomOutfit.TShirt = finalAssetTemplateId end
        end
        TextBox.Text = ""
    end)
    
    DelBtn.MouseButton1Click:Connect(function()
        handleDeletion((className == "T-Shirt") and "ShirtGraphic" or className, DelBtn)
    end)
end

--------------------------------------------------------------------------------
-- Build Structured Rows
--------------------------------------------------------------------------------
createInteractiveRow("Shirt", "Shirt")
createInteractiveRow("Pants", "Pants")
createInteractiveRow("T-Shirt", "T-Shirt")
createInteractiveRow("Accessory", "Accessory")

--------------------------------------------------------------------------------
-- Dynamic Face Controller Row
--------------------------------------------------------------------------------
local FaceRowFrame = Instance.new("Frame")
FaceRowFrame.Size = UDim2.new(1, 0, 0, 112)
FaceRowFrame.BackgroundColor3 = THEME.Header
FaceRowFrame.Parent = Container
round(FaceRowFrame, 8)
stroke(FaceRowFrame, THEME.Border, 1)

local FaceLabel = Instance.new("TextLabel")
FaceLabel.Size = UDim2.new(1, -24, 0, 28)
FaceLabel.Position = UDim2.new(0, 12, 0, 6)
FaceLabel.BackgroundTransparency = 1
FaceLabel.Text = "DYNAMIC FACE CONTROLLER"
FaceLabel.TextColor3 = THEME.TextDim
FaceLabel.Font = Enum.Font.GothamBold
FaceLabel.TextSize = 11
FaceLabel.TextXAlignment = Enum.TextXAlignment.Left
FaceLabel.Parent = FaceRowFrame

local FaceTextBox = Instance.new("TextBox")
FaceTextBox.Size = UDim2.new(1, -24, 0, 34)
FaceTextBox.Position = UDim2.new(0, 12, 0, 34)
FaceTextBox.BackgroundColor3 = THEME.Input
FaceTextBox.Text = ""
FaceTextBox.PlaceholderText = "Scanning character design rig map..."
FaceTextBox.TextColor3 = THEME.Text
FaceTextBox.PlaceholderColor3 = Color3.fromRGB(75, 75, 85)
FaceTextBox.Font = Enum.Font.Gotham
FaceTextBox.TextSize = 12
FaceTextBox.ClearTextOnFocus = false
FaceTextBox.Parent = FaceRowFrame
round(FaceTextBox, 6)
stroke(FaceTextBox, THEME.Border, 1)

local ApplyFaceBtn = Instance.new("TextButton")
ApplyFaceBtn.Size = UDim2.new(1, -24, 0, 30)
ApplyFaceBtn.Position = UDim2.new(0, 12, 0, 74)
ApplyFaceBtn.BackgroundColor3 = THEME.Button
ApplyFaceBtn.Text = "Apply Face Transformation"
ApplyFaceBtn.TextColor3 = THEME.Accent
ApplyFaceBtn.Font = Enum.Font.GothamBold
ApplyFaceBtn.TextSize = 11
ApplyFaceBtn.Parent = FaceRowFrame
round(ApplyFaceBtn, 6)
stroke(ApplyFaceBtn, THEME.Border, 1)
applyPremiumSpring(ApplyFaceBtn, THEME.ButtonHover, THEME.Button, THEME.Accent)

task.spawn(function()
    while task.wait(1) do
        if OutfitChangerGUI.Parent == nil then break end
        local character = LocalPlayer.Character
        if character then
            local head = character:FindFirstChild("Head")
            if head then
                if head:FindFirstChildOfClass("FaceControls") or character:FindFirstChildOfClass("FaceControls", true) then
                    FaceTextBox.PlaceholderText = "Detected: Dynamic Animated Head"
                elseif head:FindFirstChild("face") then
                    FaceTextBox.PlaceholderText = "Detected: Classic Head Decal Face"
                else
                    FaceTextBox.PlaceholderText = "Enter Face Texture/Asset ID..."
                end
            end
        end
    end
end)

ApplyFaceBtn.MouseButton1Click:Connect(function()
    local character = LocalPlayer.Character
    if not character or FaceTextBox.Text == "" then return end
    local cleanId = FaceTextBox.Text:match("%d+")
    if not cleanId then return end
    local head = character:FindFirstChild("Head")
    if not head then return end
    
    local finalFaceTexture = "rbxassetid://" .. cleanId
    local loadSuccess, assetObjects = pcall(function() return game:GetObjects("rbxassetid://" .. cleanId) end)
    if loadSuccess and assetObjects and assetObjects[1] then
        local obj = assetObjects[1]
        if obj:IsA("Decal") or obj:IsA("Texture") or obj:IsA("FaceInstance") then finalFaceTexture = obj.Texture end
        obj:Destroy()
    end
    
    local faceControls = head:FindFirstChildOfClass("FaceControls") or character:FindFirstChildOfClass("FaceControls", true)
    local classicFace = head:FindFirstChild("face")
    
    if faceControls then
        local sa = head:FindFirstChildOfClass("SurfaceAppearance")
        if sa then sa.ColorMap = finalFaceTexture
        else
            for _, child in ipairs(head:GetChildren()) do
                if child:IsA("MeshPart") or child:IsA("SpecialMesh") then pcall(function() child.TextureID = finalFaceTexture end) end
            end
        end
    elseif classicFace and classicFace:IsA("Decal") then
        classicFace.Texture = finalFaceTexture
    else
        local newFace = Instance.new("Decal")
        newFace.Name = "face"
        newFace.Face = Enum.NormalId.Front
        newFace.Texture = finalFaceTexture
        newFace.Parent = head
    end
    LastCustomOutfit.FaceTexture = finalFaceTexture
    FaceTextBox.Text = ""
end)

--------------------------------------------------------------------------------
-- Procedural Skin Color Panel Layout (Asset-Free Engine)
--------------------------------------------------------------------------------
local ColorRowFrame = Instance.new("Frame")
ColorRowFrame.Size = UDim2.new(1, 0, 0, 190)
ColorRowFrame.BackgroundColor3 = THEME.Header
ColorRowFrame.Parent = Container
round(ColorRowFrame, 8)
stroke(ColorRowFrame, THEME.Border, 1)

local ColorLabel = Instance.new("TextLabel")
ColorLabel.Size = UDim2.new(1, -24, 0, 28)
ColorLabel.Position = UDim2.new(0, 12, 0, 6)
ColorLabel.BackgroundTransparency = 1
ColorLabel.Text = "SKIN COLOR CUSTOMIZER"
ColorLabel.TextColor3 = THEME.TextDim
ColorLabel.Font = Enum.Font.GothamBold
ColorLabel.TextSize = 11
ColorLabel.TextXAlignment = Enum.TextXAlignment.Left
ColorLabel.Parent = ColorRowFrame

-- Structural Layout Wrapper
local WheelWrapper = Instance.new("Frame")
WheelWrapper.Name = "WheelWrapper"
WheelWrapper.Size = UDim2.new(0, 130, 0, 130)
WheelWrapper.Position = UDim2.new(0, 12, 0, 44)
WheelWrapper.BackgroundTransparency = 1
WheelWrapper.ZIndex = 2
WheelWrapper.Parent = ColorRowFrame
round(WheelWrapper, 65)

local function createSpectrumLayer(angle, color1, color2)
    local layer = Instance.new("Frame")
    layer.Size = UDim2.new(1, 0, 1, 0)
    layer.BackgroundTransparency = 0.3
    layer.ZIndex = 3
    layer.Parent = WheelWrapper
    round(layer, 65)
    
    local grad = Instance.new("UIGradient")
    grad.Rotation = angle
    grad.Color = ColorSequence.new({
        ColorSequenceKeypoint.new(0, color1),
        ColorSequenceKeypoint.new(1, color2)
    })
    grad.Parent = layer
end

createSpectrumLayer(0,   Color3.fromRGB(255, 0, 0),   Color3.fromRGB(0, 255, 255))
createSpectrumLayer(60,  Color3.fromRGB(255, 255, 0), Color3.fromRGB(0, 0, 255))
createSpectrumLayer(120, Color3.fromRGB(0, 255, 0),   Color3.fromRGB(255, 0, 255))
createSpectrumLayer(180, Color3.fromRGB(0, 255, 255), Color3.fromRGB(255, 0, 0))
createSpectrumLayer(240, Color3.fromRGB(0, 0, 255),   Color3.fromRGB(255, 255, 0))
createSpectrumLayer(300, Color3.fromRGB(255, 0, 255), Color3.fromRGB(0, 255, 0))

local CenterWhiteCore = Instance.new("Frame")
CenterWhiteCore.Size = UDim2.new(1, 0, 1, 0)
CenterWhiteCore.BackgroundTransparency = 1
CenterWhiteCore.ZIndex = 4
CenterWhiteCore.Parent = WheelWrapper
round(CenterWhiteCore, 65)

local CoreGradient = Instance.new("UIGradient")
CoreGradient.Transparency = NumberSequence.new({
    NumberSequenceKeypoint.new(0, 0.4),
    NumberSequenceKeypoint.new(0.5, 0.85),
    NumberSequenceKeypoint.new(1, 1)
})
CoreGradient.Color = ColorSequence.new(Color3.fromRGB(255,255,255))
CoreGradient.Parent = CenterWhiteCore

stroke(WheelWrapper, THEME.Border, 2)

local WheelHitbox = Instance.new("TextButton")
WheelHitbox.Name = "WheelHitbox"
WheelHitbox.Size = UDim2.new(1, 0, 1, 0)
WheelHitbox.BackgroundTransparency = 1
WheelHitbox.Text = ""
WheelHitbox.ZIndex = 5
WheelHitbox.Parent = WheelWrapper

local PickerPin = Instance.new("Frame")
PickerPin.Size = UDim2.new(0, 8, 0, 8)
PickerPin.Position = UDim2.new(0.5, -4, 0.5, -4)
PickerPin.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
PickerPin.ZIndex = 6
PickerPin.Parent = WheelWrapper
round(PickerPin, 4)
stroke(PickerPin, Color3.fromRGB(0, 0, 0), 1.5)

local SliderRail = Instance.new("Frame")
SliderRail.Name = "SliderRail"
SliderRail.Size = UDim2.new(0, 16, 0, 130)
SliderRail.Position = UDim2.new(0, 156, 0, 44)
SliderRail.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
SliderRail.ZIndex = 2
SliderRail.Parent = ColorRowFrame
round(SliderRail, 8)
stroke(SliderRail, THEME.Border, 1)

local SliderGradient = Instance.new("UIGradient")
SliderGradient.Rotation = 90
SliderGradient.Color = ColorSequence.new({
    ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 255, 255)),
    ColorSequenceKeypoint.new(1, Color3.fromRGB(0, 0, 0))
})
SliderGradient.Parent = SliderRail

local SliderKnob = Instance.new("TextButton")
SliderKnob.Size = UDim2.new(0, 22, 0, 10)
SliderKnob.Position = UDim2.new(0.5, -11, 0, 0)
SliderKnob.BackgroundColor3 = THEME.Text
SliderKnob.Text = ""
SliderKnob.ZIndex = 5
SliderKnob.Parent = SliderRail
round(SliderKnob, 4)
stroke(SliderKnob, Color3.fromRGB(0,0,0), 1)

--------------------------------------------------------------------------------
-- Right Side Indicators & Controls
--------------------------------------------------------------------------------
local ControlGroup = Instance.new("Frame")
ControlGroup.Size = UDim2.new(1, -192, 0, 130)
ControlGroup.Position = UDim2.new(0, 182, 0, 44)
ControlGroup.BackgroundTransparency = 1
ControlGroup.Parent = ColorRowFrame

local CurrentIndicator = Instance.new("Frame")
CurrentIndicator.Size = UDim2.new(0, 34, 0, 34)
CurrentIndicator.Position = UDim2.new(0, 0, 0, 0)
CurrentIndicator.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
CurrentIndicator.Parent = ControlGroup
round(CurrentIndicator, 6)
stroke(CurrentIndicator, THEME.Border, 1)

local HexBox = Instance.new("TextBox")
HexBox.Size = UDim2.new(1, -44, 0, 34)
HexBox.Position = UDim2.new(0, 44, 0, 0)
HexBox.BackgroundColor3 = THEME.Input
HexBox.Text = "#FFFFFF"
HexBox.TextColor3 = THEME.Text
HexBox.Font = Enum.Font.Gotham
HexBox.TextSize = 12
HexBox.Parent = ControlGroup
round(HexBox, 6)
stroke(HexBox, THEME.Border, 1)

local ApplyColorBtn = Instance.new("TextButton")
ApplyColorBtn.Size = UDim2.new(1, 0, 0, 36)
ApplyColorBtn.Position = UDim2.new(0, 0, 0, 46)
ApplyColorBtn.BackgroundColor3 = THEME.Button
ApplyColorBtn.Text = "Apply Tone"
ApplyColorBtn.TextColor3 = THEME.Accent
ApplyColorBtn.Font = Enum.Font.GothamBold
ApplyColorBtn.TextSize = 11
ApplyColorBtn.Parent = ControlGroup
round(ApplyColorBtn, 6)
stroke(ApplyColorBtn, THEME.Border, 1)
applyPremiumSpring(ApplyColorBtn, THEME.ButtonHover, THEME.Button, THEME.Accent)

--------------------------------------------------------------------------------
-- Color Space Mathematics Mechanics Engine
--------------------------------------------------------------------------------
local currentH, currentS, currentV = 0, 0, 1
local isSelectingWheel = false
local isSelectingSlider = false

local function updateColorOutput()
    local finalColor = Color3.fromHSV(currentH, currentS, currentV)
    CurrentIndicator.BackgroundColor3 = finalColor
    HexBox.Text = "#" .. finalColor:ToHex():upper()
    SliderGradient.Color = ColorSequence.new({
        ColorSequenceKeypoint.new(0, Color3.fromHSV(currentH, currentS, 1)),
        ColorSequenceKeypoint.new(1, Color3.fromRGB(0, 0, 0))
    })
end

local function processWheelInput(input)
    local rX = input.Position.X - WheelWrapper.AbsolutePosition.X
    local rY = input.Position.Y - WheelWrapper.AbsolutePosition.Y
    local centerX = WheelWrapper.AbsoluteSize.X / 2
    local centerY = WheelWrapper.AbsoluteSize.Y / 2
    local dx = rX - centerX
    local dy = rY - centerY
    local dist = math.sqrt(dx*dx + dy*dy)
    local maxRadius = WheelWrapper.AbsoluteSize.X / 2
    
    if dist > maxRadius then
        dx = (dx / dist) * maxRadius
        dy = (dy / dist) * maxRadius
        dist = maxRadius
    end
    
    PickerPin.Position = UDim2.new(0, centerX + dx - 4, 0, centerY + dy - 4)
    currentH = (math.atan2(-dy, dx) / (math.pi * 2)) % 1
    currentS = dist / maxRadius
    updateColorOutput()
end

local function processSliderInput(input)
    local rY = input.Position.Y - SliderRail.AbsolutePosition.Y
    local percentage = math.clamp(rY / SliderRail.AbsoluteSize.Y, 0, 1)
    SliderKnob.Position = UDim2.new(0.5, -11, 0, (percentage * SliderRail.AbsoluteSize.Y) - 5)
    currentV = 1 - percentage
    updateColorOutput()
end

WheelHitbox.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        isSelectingWheel = true
        processWheelInput(input)
    end
end)

SliderKnob.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then isSelectingSlider = true end
end)
SliderRail.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        isSelectingSlider = true
        processSliderInput(input)
    end
end)

UserInputService.InputChanged:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
        if isSelectingWheel then processWheelInput(input)
        elseif isSelectingSlider then processSliderInput(input) end
    end
end)

UserInputService.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        isSelectingWheel = false
        isSelectingSlider = false
    end
end)

HexBox.FocusLost:Connect(function()
    local text = HexBox.Text:gsub("#","")
    local success, result = pcall(function() return Color3.fromHex(text) end)
    if success and result then
        currentH, currentS, currentV = Color3.toHSV(result)
        CurrentIndicator.BackgroundColor3 = result
        local angle = currentH * (math.pi * 2)
        local radius = currentS * (WheelWrapper.AbsoluteSize.X / 2)
        local dx = math.cos(angle) * radius
        local dy = -math.sin(angle) * radius
        PickerPin.Position = UDim2.new(0, (WheelWrapper.AbsoluteSize.X/2) + dx - 4, 0, (WheelWrapper.AbsoluteSize.Y/2) + dy - 4)
        SliderKnob.Position = UDim2.new(0.5, -11, 0, ((1 - currentV) * SliderRail.AbsoluteSize.Y) - 5)
        updateColorOutput()
    else
        updateColorOutput()
    end
end)

ApplyColorBtn.MouseButton1Click:Connect(function()
    applySkinColor(Color3.fromHSV(currentH, currentS, currentV))
end)

Features & Information

You can change your shirt, pants, or t-shirt, add multiple accessories, delete accessories, and change your skin color. You can also save your new outfit on death. To go back to your original avatar, simply click 'Restore Server-Sided Default Outfit'. Additionally, this GUI is draggable.
#free#keyless

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts