
KeylessUniversal

-- 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)No comments yet for this script.



