--// Texture Changer GUI --// Put this LocalScript in StarterPlayerScripts or StarterGui --// Local-only visual changer local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local player = Players.LocalPlayer local rng = Random.new() --======================== -- EDIT HERE --======================== local guiTitle = "Texture Changer" local mainButtonText = "Apply" local smallButtonText = "Open" local defaultTextureId = "" -- example: 5373446510 or rbxassetid://5373446510 local defaultColorText = "" -- example: 255,0,0 or #FF0000 local defaultChaosPool = "" -- comma-separated texture ids for chaos mode local defaultMaterialName = "Plastic" --======================== local materialList = { Enum.Material.Plastic, Enum.Material.SmoothPlastic, Enum.Material.Neon, Enum.Material.Wood, Enum.Material.WoodPlanks, Enum.Material.Glass, Enum.Material.Concrete, Enum.Material.Granite, Enum.Material.Slate, Enum.Material.Metal, Enum.Material.CorrodedMetal, Enum.Material.DiamondPlate, Enum.Material.Foil, Enum.Material.Ice, Enum.Material.Fabric, Enum.Material.Grass, Enum.Material.Pebble, Enum.Material.ForceField, } local materialIndex = 1 for i, mat in ipairs(materialList) do if mat.Name == defaultMaterialName then materialIndex = i break end end local chaosOn = false local chaosToken = 0 local originalState = {} -- [part] = {Color=, Material=, Reflectance=, Transparency=, Extras={clones...}} local faces = { Enum.NormalId.Front, Enum.NormalId.Back, Enum.NormalId.Left, Enum.NormalId.Right, Enum.NormalId.Top, Enum.NormalId.Bottom, } local function trimText(s) return (tostring(s or ""):gsub("^%s+", ""):gsub("%s+$", "")) end local function normalizeTextureId(text) text = trimText(text) if text == "" then return nil end local id = text:match("(%d+)") if not id then return nil end return "rbxassetid://" .. id end local function parseColor(text) text = trimText(text) if text == "" then return nil end if text:sub(1, 1) == "#" then text = text:sub(2) end if #text == 6 and text:match("^[%da-fA-F]+$") then local r = tonumber(text:sub(1, 2), 16) local g = tonumber(text:sub(3, 4), 16) local b = tonumber(text:sub(5, 6), 16) if r and g and b then return Color3.fromRGB(r, g, b) end end local nums = {} for n in text:gmatch("%d+") do nums[#nums + 1] = tonumber(n) end if #nums >= 3 then return Color3.fromRGB( math.clamp(nums[1], 0, 255), math.clamp(nums[2], 0, 255), math.clamp(nums[3], 0, 255) ) end return nil end local function parseTexturePool(text) text = trimText(text) local pool = {} if text == "" then return pool end for token in text:gmatch("[^,%s;]+") do local id = normalizeTextureId(token) if id then pool[#pool + 1] = id end end return pool end local function getAllParts() local parts = {} for _, obj in ipairs(workspace:GetDescendants()) do if obj:IsA("BasePart") then parts[#parts + 1] = obj end end return parts end local function saveOriginal(part) if originalState[part] or not part or not part.Parent then return end local extras = {} for _, child in ipairs(part:GetChildren()) do if child:IsA("Texture") or child:IsA("Decal") or child:IsA("SurfaceAppearance") then extras[#extras + 1] = child:Clone() child:Destroy() end end originalState[part] = { Color = part.Color, Material = part.Material, Reflectance = part.Reflectance, Transparency = part.Transparency, Extras = extras, } end local function clearGeneratedTextures(part) for _, face in ipairs(faces) do local tex = part:FindFirstChild("TC_" .. face.Name) if tex and tex:IsA("Texture") then tex:Destroy() end end end local function applyTextureToPart(part, textureId) if not textureId or textureId == "" then clearGeneratedTextures(part) return end saveOriginal(part) clearGeneratedTextures(part) for _, face in ipairs(faces) do local tex = Instance.new("Texture") tex.Name = "TC_" .. face.Name tex.Face = face tex.Texture = textureId tex.StudsPerTileU = 1 tex.StudsPerTileV = 1 tex.Parent = part end end local function applyColorToPart(part, color3) if color3 then saveOriginal(part) part.Color = color3 end end local function applyMaterialToPart(part, materialEnum) if materialEnum then saveOriginal(part) part.Material = materialEnum end end local function restorePart(part) if not (part and part.Parent and originalState[part]) then clearGeneratedTextures(part) return end local old = originalState[part] part.Color = old.Color part.Material = old.Material part.Reflectance = old.Reflectance part.Transparency = old.Transparency clearGeneratedTextures(part) for _, childClone in ipairs(old.Extras or {}) do childClone.Parent = part end originalState[part] = nil end local function restoreAll() chaosOn = false chaosToken += 1 for part, _ in pairs(originalState) do restorePart(part) end end local function applyToAllParts(textureId, color3, materialEnum) for _, part in ipairs(getAllParts()) do if textureId then applyTextureToPart(part, textureId) else clearGeneratedTextures(part) end if color3 then applyColorToPart(part, color3) end if materialEnum then applyMaterialToPart(part, materialEnum) end end end -- GUI local screenGui = Instance.new("ScreenGui") screenGui.Name = "TextureChangerGui" screenGui.ResetOnSpawn = false screenGui.Parent = player:WaitForChild("PlayerGui") local mainFrame = Instance.new("Frame") mainFrame.Size = UDim2.new(0, 340, 0, 430) mainFrame.Position = UDim2.new(0.5, -170, 0.5, -215) mainFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 25) mainFrame.BorderSizePixel = 0 mainFrame.Active = true mainFrame.ClipsDescendants = true mainFrame.Parent = screenGui local mainCorner = Instance.new("UICorner") mainCorner.CornerRadius = UDim.new(0, 12) mainCorner.Parent = mainFrame local titleBar = Instance.new("TextLabel") titleBar.Size = UDim2.new(1, 0, 0, 35) titleBar.BackgroundColor3 = Color3.fromRGB(35, 35, 35) titleBar.BorderSizePixel = 0 titleBar.Text = guiTitle titleBar.TextColor3 = Color3.fromRGB(255, 255, 255) titleBar.TextScaled = true titleBar.Font = Enum.Font.GothamBold titleBar.Active = true titleBar.Parent = mainFrame local titleCorner = Instance.new("UICorner") titleCorner.CornerRadius = UDim.new(0, 12) titleCorner.Parent = titleBar local hideButton = Instance.new("TextButton") hideButton.Size = UDim2.new(0, 60, 0, 25) hideButton.Position = UDim2.new(1, -65, 0, 5) hideButton.BackgroundColor3 = Color3.fromRGB(70, 70, 70) hideButton.Text = "Hide" hideButton.TextColor3 = Color3.fromRGB(255, 255, 255) hideButton.TextScaled = true hideButton.Font = Enum.Font.Gotham hideButton.BorderSizePixel = 0 hideButton.Parent = mainFrame local hideCorner = Instance.new("UICorner") hideCorner.CornerRadius = UDim.new(0, 8) hideCorner.Parent = hideButton local closeButton = Instance.new("TextButton") closeButton.Size = UDim2.new(0, 25, 0, 25) closeButton.Position = UDim2.new(1, -30, 0, 5) closeButton.BackgroundColor3 = Color3.fromRGB(170, 50, 50) closeButton.Text = "X" closeButton.TextColor3 = Color3.fromRGB(255, 255, 255) closeButton.TextScaled = true closeButton.Font = Enum.Font.GothamBold closeButton.BorderSizePixel = 0 closeButton.Parent = mainFrame local closeCorner = Instance.new("UICorner") closeCorner.CornerRadius = UDim.new(0, 8) closeCorner.Parent = closeButton local scrollFrame = Instance.new("ScrollingFrame") scrollFrame.Size = UDim2.new(1, 0, 1, -35) scrollFrame.Position = UDim2.new(0, 0, 0, 35) scrollFrame.BackgroundTransparency = 1 scrollFrame.BorderSizePixel = 0 scrollFrame.ScrollBarThickness = 5 scrollFrame.CanvasSize = UDim2.new(0, 0, 0, 0) scrollFrame.Parent = mainFrame local content = Instance.new("Frame") content.Size = UDim2.new(1, -10, 0, 0) content.Position = UDim2.new(0, 5, 0, 5) content.BackgroundTransparency = 1 content.BorderSizePixel = 0 content.Parent = scrollFrame local layout = Instance.new("UIListLayout") layout.Padding = UDim.new(0, 6) layout.SortOrder = Enum.SortOrder.LayoutOrder layout.Parent = content layout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function() content.Size = UDim2.new(1, -10, 0, layout.AbsoluteContentSize.Y) scrollFrame.CanvasSize = UDim2.new(0, 0, 0, layout.AbsoluteContentSize.Y + 10) end) local function roundify(obj, radius) local c = Instance.new("UICorner") c.CornerRadius = UDim.new(0, radius) c.Parent = obj return c end local function makeLabel(text, height) local lbl = Instance.new("TextLabel") lbl.Size = UDim2.new(1, 0, 0, height or 22) lbl.BackgroundTransparency = 1 lbl.Text = text lbl.TextColor3 = Color3.fromRGB(255, 255, 255) lbl.TextScaled = true lbl.Font = Enum.Font.Gotham lbl.Parent = content return lbl end local function makeBox(labelText, defaultText) local row = Instance.new("Frame") row.Size = UDim2.new(1, 0, 0, 52) row.BackgroundColor3 = Color3.fromRGB(32, 32, 32) row.BorderSizePixel = 0 row.Parent = content roundify(row, 10) local lbl = Instance.new("TextLabel") lbl.Size = UDim2.new(1, -12, 0, 18) lbl.Position = UDim2.new(0, 6, 0, 4) lbl.BackgroundTransparency = 1 lbl.Text = labelText lbl.TextColor3 = Color3.fromRGB(255, 255, 255) lbl.TextScaled = true lbl.Font = Enum.Font.Gotham lbl.Parent = row local box = Instance.new("TextBox") box.Size = UDim2.new(1, -12, 0, 22) box.Position = UDim2.new(0, 6, 0, 26) box.BackgroundColor3 = Color3.fromRGB(45, 45, 45) box.Text = defaultText box.TextColor3 = Color3.fromRGB(255, 255, 255) box.TextScaled = true box.Font = Enum.Font.Gotham box.BorderSizePixel = 0 box.ClearTextOnFocus = false box.Parent = row roundify(box, 8) return box end local function makeButton(text, color, height) local btn = Instance.new("TextButton") btn.Size = UDim2.new(1, 0, 0, height or 30) btn.BackgroundColor3 = color btn.Text = text btn.TextColor3 = Color3.fromRGB(255, 255, 255) btn.TextScaled = true btn.Font = Enum.Font.GothamBold btn.BorderSizePixel = 0 btn.Parent = content roundify(btn, 10) return btn end makeLabel("Edit everything here", 22) local textureBox = makeBox("Texture ID", defaultTextureId) local colorBox = makeBox("Color (RGB or Hex)", defaultColorText) local chaosPoolBox = makeBox("Chaos Texture Pool", defaultChaosPool) local materialButton = makeButton("Material: " .. materialList[materialIndex].Name, Color3.fromRGB(80, 80, 140), 30) local applyButton = makeButton(mainButtonText, Color3.fromRGB(50, 120, 50), 34) local chaosButton = makeButton("CHAOS! : OFF", Color3.fromRGB(150, 90, 40), 34) local returnButton = makeButton("Return", Color3.fromRGB(120, 60, 60), 34) local statusLabel = makeLabel("Status: Ready", 24) local smallButton = Instance.new("TextButton") smallButton.Size = UDim2.new(0, 70, 0, 30) smallButton.Position = UDim2.new(0, 10, 0.5, -15) smallButton.BackgroundColor3 = Color3.fromRGB(35, 35, 35) smallButton.Text = smallButtonText smallButton.TextColor3 = Color3.fromRGB(255, 255, 255) smallButton.TextScaled = true smallButton.Font = Enum.Font.GothamBold smallButton.BorderSizePixel = 0 smallButton.Visible = false smallButton.Active = true smallButton.Parent = screenGui roundify(smallButton, 10) local function updateStatus(text) statusLabel.Text = "Status: " .. text end local function refreshMaterialText() materialButton.Text = "Material: " .. materialList[materialIndex].Name end materialButton.MouseButton1Click:Connect(function() materialIndex += 1 if materialIndex > #materialList then materialIndex = 1 end refreshMaterialText() updateStatus("Material selected: " .. materialList[materialIndex].Name) end) applyButton.MouseButton1Click:Connect(function() local textureId = normalizeTextureId(textureBox.Text) local color3 = parseColor(colorBox.Text) local materialEnum = materialList[materialIndex] applyToAllParts(textureId, color3, materialEnum) if textureId or color3 or materialEnum then updateStatus("Applied to all parts") else updateStatus("Nothing to apply") end end) returnButton.MouseButton1Click:Connect(function() restoreAll() updateStatus("Restored to normal") end) chaosButton.MouseButton1Click:Connect(function() chaosOn = not chaosOn chaosToken += 1 local myToken = chaosToken if chaosOn then chaosButton.Text = "CHAOS! : ON" chaosButton.BackgroundColor3 = Color3.fromRGB(170, 60, 60) updateStatus("Chaos running") task.spawn(function() while chaosOn and chaosToken == myToken and screenGui.Parent do local pool = parseTexturePool(chaosPoolBox.Text) local textureId = nil if #pool > 0 then textureId = pool[rng:NextInteger(1, #pool)] elseif normalizeTextureId(textureBox.Text) then textureId = normalizeTextureId(textureBox.Text) end for _, part in ipairs(getAllParts()) do saveOriginal(part) if textureId then applyTextureToPart(part, textureId) else clearGeneratedTextures(part) end part.Color = Color3.fromRGB( rng:NextInteger(0, 255), rng:NextInteger(0, 255), rng:NextInteger(0, 255) ) part.Material = materialList[rng:NextInteger(1, #materialList)] end task.wait(0.06) end if not chaosOn then chaosButton.Text = "CHAOS! : OFF" chaosButton.BackgroundColor3 = Color3.fromRGB(150, 90, 40) end end) else restoreAll() chaosButton.Text = "CHAOS! : OFF" chaosButton.BackgroundColor3 = Color3.fromRGB(150, 90, 40) updateStatus("Chaos stopped") end end) hideButton.MouseButton1Click:Connect(function() mainFrame.Visible = false smallButton.Visible = true end) smallButton.MouseButton1Click:Connect(function() mainFrame.Visible = true smallButton.Visible = false end) closeButton.MouseButton1Click:Connect(function() restoreAll() screenGui:Destroy() end) -- Fixed draggable: drag the TITLE BAR to move the whole GUI local function makeDraggable(handle, target) local dragging = false local dragInput local dragStart local startPos handle.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = target.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) handle.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 target.Position = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y ) end end) end makeDraggable(titleBar, mainFrame) makeDraggable(smallButton, smallButton) refreshMaterialText() updateStatus("Ready")