-- 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)