local ReplicatedStorage = game:GetService("ReplicatedStorage") local LocalPlayer = game:GetService("Players").LocalPlayer local TweenService = game:GetService("TweenService") local UserInputService = game:GetService("UserInputService") local BaseCustomization = ReplicatedStorage:WaitForChild("Remotes"):WaitForChild("BaseCustomization") local UpdateMaterial = BaseCustomization:WaitForChild("UpdateBaseMaterial") -- ONLY verified, working materials. No dead buttons. local CategorizedMaterials = { ["Standard & Plastic"] = { "Plastic", "SmoothPlastic", "Neon", "Wood", "WoodPlanks", "Glass", "ForceField", "Fabric" }, ["Environment & Terrain"] = { "Basalt", "Slate", "CrackedLava", "Concrete", "Limestone", "Pavement", "Brick", "Pebble", "Cobblestone", "Rock", "Sandstone", "Grass", "LeafyGrass", "Sand", "Snow", "Mud", "Ground", "Asphalt", "Salt", "Ice", "Glacier" }, ["Metals"] = { "Metal", "CorrodedMetal", "DiamondPlate", "Foil", "Marble", "Granite" }, ["Rare (2024 PBR Update)"] = { "Cardboard", "Carpet", "CeramicTiles", "ClayRoofTiles", "RoofShingles", "Leather", "Plaster", "Rubber" } } -- GUI Creation local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "MaterialCustomizerFinal" ScreenGui.ResetOnSpawn = false ScreenGui.Parent = LocalPlayer:WaitForChild("PlayerGui") local MainFrame = Instance.new("Frame") MainFrame.Name = "Main" MainFrame.Size = UDim2.new(0, 260, 0, 420) MainFrame.Position = UDim2.new(0.5, -130, 0.5, -210) MainFrame.BackgroundColor3 = Color3.fromRGB(15, 15, 18) MainFrame.BorderSizePixel = 0 MainFrame.Active = true MainFrame.Draggable = true MainFrame.Parent = ScreenGui Instance.new("UICorner", MainFrame).CornerRadius = UDim.new(0, 8) local TopBar = Instance.new("Frame") TopBar.Size = UDim2.new(1, 0, 0, 40) TopBar.BackgroundColor3 = Color3.fromRGB(25, 25, 30) TopBar.Parent = MainFrame Instance.new("UICorner", TopBar).CornerRadius = UDim.new(0, 8) local Title = Instance.new("TextLabel") Title.Size = UDim2.new(1, 0, 1, 0) Title.BackgroundTransparency = 1 Title.Text = "Base Materials" Title.TextColor3 = Color3.fromRGB(0, 255, 150) Title.Font = Enum.Font.GothamBold Title.TextSize = 16 Title.Parent = TopBar -- Search Bar local SearchBox = Instance.new("TextBox") SearchBox.Size = UDim2.new(1, -20, 0, 30) SearchBox.Position = UDim2.new(0, 10, 0, 50) SearchBox.BackgroundColor3 = Color3.fromRGB(30, 30, 35) SearchBox.TextColor3 = Color3.fromRGB(255, 255, 255) SearchBox.PlaceholderText = "🔍 Search materials..." SearchBox.Font = Enum.Font.Gotham SearchBox.TextSize = 12 SearchBox.ClearTextOnFocus = false SearchBox.Parent = MainFrame Instance.new("UICorner", SearchBox).CornerRadius = UDim.new(0, 4) -- Material List local ScrollFrame = Instance.new("ScrollingFrame") ScrollFrame.Size = UDim2.new(1, -20, 1, -95) ScrollFrame.Position = UDim2.new(0, 10, 0, 90) ScrollFrame.BackgroundTransparency = 1 ScrollFrame.BorderSizePixel = 0 ScrollFrame.ScrollBarThickness = 4 ScrollFrame.ScrollBarImageColor3 = Color3.fromRGB(80, 80, 80) ScrollFrame.CanvasSize = UDim2.new(0, 0, 0, 0) ScrollFrame.Parent = MainFrame local UIListLayout = Instance.new("UIListLayout") UIListLayout.Padding = UDim.new(0, 6) UIListLayout.SortOrder = Enum.SortOrder.LayoutOrder UIListLayout.Parent = ScrollFrame UIListLayout.Changed:Connect(function() ScrollFrame.CanvasSize = UDim2.new(0, 0, 0, UIListLayout.AbsoluteContentSize.Y + 10) end) local allButtons = {} local layoutOrder = 1 local function addMaterialCategory(catName, materials) local catLabel = Instance.new("TextLabel") catLabel.Size = UDim2.new(1, 0, 0, 20) catLabel.BackgroundTransparency = 1 catLabel.Text = catName catLabel.TextColor3 = Color3.fromRGB(0, 255, 150) catLabel.Font = Enum.Font.GothamBold catLabel.TextSize = 12 catLabel.TextXAlignment = Enum.TextXAlignment.Left catLabel.LayoutOrder = layoutOrder catLabel.Parent = ScrollFrame layoutOrder = layoutOrder + 1 for _, matName in ipairs(materials) do local Button = Instance.new("TextButton") Button.Size = UDim2.new(1, 0, 0, 32) Button.BackgroundColor3 = Color3.fromRGB(35, 35, 42) Button.Text = " " .. matName Button.TextColor3 = Color3.fromRGB(230, 230, 230) Button.Font = Enum.Font.Gotham Button.TextSize = 12 Button.TextXAlignment = Enum.TextXAlignment.Left Button.BorderSizePixel = 0 Button.LayoutOrder = layoutOrder Button.Parent = ScrollFrame Instance.new("UICorner", Button).CornerRadius = UDim.new(0, 5) table.insert(allButtons, {btn = Button, name = matName}) Button.MouseEnter:Connect(function() TweenService:Create(Button, TweenInfo.new(0.15), {BackgroundColor3 = Color3.fromRGB(60, 60, 75)}):Play() end) Button.MouseLeave:Connect(function() TweenService:Create(Button, TweenInfo.new(0.15), {BackgroundColor3 = Color3.fromRGB(35, 35, 42)}):Play() end) Button.MouseButton1Click:Connect(function() UpdateMaterial:FireServer(matName) Button.BackgroundColor3 = Color3.fromRGB(0, 200, 100) task.delay(0.3, function() Button.BackgroundColor3 = Color3.fromRGB(35, 35, 42) end) end) layoutOrder = layoutOrder + 1 end end for catName, mats in pairs(CategorizedMaterials) do addMaterialCategory(catName, mats) end -- Search Logic SearchBox:GetPropertyChangedSignal("Text"):Connect(function() local query = string.lower(SearchBox.Text) for _, data in ipairs(allButtons) do local isMatch = string.find(string.lower(data.name), query) ~= nil data.btn.Visible = isMatch end end) -- Dragging Logic local dragging, dragInput, dragStart, startPos MainFrame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 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) MainFrame.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement 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)