--[[ ADVANCE TOOLBOX By Pumpikinie Rounded UI + Creator Store Search LocalScript - StarterPlayerScripts atau bisa pakai executor ]] --============== ATUR DI SINI ============== local CONFIG = { TITLE = "Advance Toolbox", AUTHOR = "By Pumpikinie", WIDTH = 310, HEIGHT = 0.82, SLIDE_TIME = 0.28, BLACK = Color3.fromRGB(8, 8, 10), PANEL = Color3.fromRGB(17, 17, 20), CARD = Color3.fromRGB(28, 28, 33), GOLD = Color3.fromRGB(230, 177, 55), GOLD_LIGHT = Color3.fromRGB(255, 215, 110), WHITE = Color3.fromRGB(245, 245, 245), MUTED = Color3.fromRGB(155, 155, 165), FONT = Enum.Font.Arcade, } --========================================== local Players = game:GetService("Players") local TweenService = game:GetService("TweenService") local InsertService = game:GetService("InsertService") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") local FONT = CONFIG.FONT local old = playerGui:FindFirstChild("AdvanceToolbox") if old then old:Destroy() end --================================================== -- HELPER --================================================== local function make(className, props, parent) local obj = Instance.new(className) for key, value in pairs(props) do obj[key] = value end obj.Parent = parent return obj end local function corner(obj, radius) local c = obj:FindFirstChildOfClass("UICorner") if not c then c = Instance.new("UICorner") c.Parent = obj end c.CornerRadius = UDim.new(0, radius or 10) return c end local function outline(obj, color, thickness) local s = Instance.new("UIStroke") s.Color = color or CONFIG.GOLD s.Thickness = thickness or 1 s.ApplyStrokeMode = Enum.ApplyStrokeMode.Border s.Parent = obj return s end local function label(parent, text, size, color) return make("TextLabel", { BackgroundTransparency = 1, Text = text, TextColor3 = color or CONFIG.WHITE, TextSize = size or 11, Font = FONT, TextXAlignment = Enum.TextXAlignment.Left, TextYAlignment = Enum.TextYAlignment.Center, BorderSizePixel = 0, }, parent) end local function button(parent, text, size, position, color, textColor) local b = make("TextButton", { Size = size, Position = position or UDim2.new(), BackgroundColor3 = color or CONFIG.CARD, BorderSizePixel = 0, Text = text, TextColor3 = textColor or CONFIG.WHITE, TextSize = 10, Font = FONT, AutoButtonColor = true, }, parent) corner(b, 10) return b end local function pad(obj, left, right, top, bottom) make("UIPadding", { PaddingLeft = UDim.new(0, left or 0), PaddingRight = UDim.new(0, right or 0), PaddingTop = UDim.new(0, top or 0), PaddingBottom = UDim.new(0, bottom or 0), }, obj) end local function order(obj, n) obj.LayoutOrder = n return obj end --================================================== -- SCREEN GUI --================================================== local gui = make("ScreenGui", { Name = "AdvanceToolbox", ResetOnSpawn = false, DisplayOrder = 80, ZIndexBehavior = Enum.ZIndexBehavior.Sibling, }, playerGui) --================================================== -- TOMBOL BUKA --================================================== local toggle = make("TextButton", { Name = "OpenButton", Size = UDim2.fromOffset(44, 44), Position = UDim2.new(0, 10, 0.5, -22), BackgroundColor3 = CONFIG.BLACK, BorderSizePixel = 0, Text = "AT", TextColor3 = CONFIG.GOLD, TextSize = 16, Font = FONT, AutoButtonColor = true, }, gui) corner(toggle, 14) outline(toggle, CONFIG.GOLD, 2) --================================================== -- PANEL --================================================== local panel = make("Frame", { Name = "MainPanel", AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, -340, 0.5, 0), Size = UDim2.new(0.82, 0, CONFIG.HEIGHT, 0), BackgroundColor3 = CONFIG.BLACK, BorderSizePixel = 0, Visible = false, ClipsDescendants = true, }, gui) corner(panel, 18) outline(panel, CONFIG.GOLD, 1.5) make("UISizeConstraint", { MinSize = Vector2.new(245, 300), MaxSize = Vector2.new(CONFIG.WIDTH, 720), }, panel) local function panelX() local camera = workspace.CurrentCamera local viewport = camera and camera.ViewportSize.X or 400 local width = math.min(CONFIG.WIDTH, viewport * 0.82) return math.max(5, math.min(62, viewport - width - 5)) end --================================================== -- HEADER --================================================== local header = make("Frame", { Size = UDim2.new(1, 0, 0, 76), BackgroundColor3 = CONFIG.PANEL, BorderSizePixel = 0, }, panel) corner(header, 18) -- Menutup bagian bawah header supaya bentuknya tetap rapi. make("Frame", { Position = UDim2.new(0, 0, 1, -18), Size = UDim2.new(1, 0, 0, 18), BackgroundColor3 = CONFIG.PANEL, BorderSizePixel = 0, }, header) local logo = make("Frame", { Position = UDim2.fromOffset(10, 14), Size = UDim2.fromOffset(45, 45), BackgroundColor3 = Color3.fromRGB(48, 37, 17), BorderSizePixel = 0, }, header) corner(logo, 14) outline(logo, CONFIG.GOLD, 1) local logoText = label(logo, "AT", 14, CONFIG.GOLD_LIGHT) logoText.Size = UDim2.fromScale(1, 1) logoText.TextXAlignment = Enum.TextXAlignment.Center local title = label(header, CONFIG.TITLE, 12, CONFIG.WHITE) title.Position = UDim2.fromOffset(63, 10) title.Size = UDim2.new(1, -100, 0, 28) title.TextTruncate = Enum.TextTruncate.AtEnd local author = label(header, CONFIG.AUTHOR, 9, CONFIG.GOLD) author.Position = UDim2.fromOffset(64, 39) author.Size = UDim2.new(1, -100, 0, 20) local close = button( header, "X", UDim2.fromOffset(27, 27), UDim2.new(1, -34, 0, 8), CONFIG.CARD, CONFIG.GOLD ) make("Frame", { Position = UDim2.new(0, 10, 1, -2), Size = UDim2.new(1, -20, 0, 2), BackgroundColor3 = CONFIG.GOLD, BorderSizePixel = 0, }, header) --================================================== -- AREA SCROLLABLE --================================================== local content = make("ScrollingFrame", { Name = "ToolboxScroll", Position = UDim2.new(0, 0, 0, 76), Size = UDim2.new(1, 0, 1, -76), BackgroundTransparency = 1, BorderSizePixel = 0, ScrollBarThickness = 4, ScrollBarImageColor3 = CONFIG.GOLD, AutomaticCanvasSize = Enum.AutomaticSize.Y, CanvasSize = UDim2.new(), ScrollingDirection = Enum.ScrollingDirection.Y, }, panel) make("UIListLayout", { Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }, content) pad(content, 9, 9, 10, 14) --================================================== -- SEARCH BAR --================================================== local searchRow = order(make("Frame", { Size = UDim2.new(1, 0, 0, 39), BackgroundTransparency = 1, }, content), 1) local searchBox = make("TextBox", { Size = UDim2.new(1, -60, 1, 0), BackgroundColor3 = CONFIG.CARD, BorderSizePixel = 0, Text = "", PlaceholderText = "Cari Creator Store...", PlaceholderColor3 = CONFIG.MUTED, TextColor3 = CONFIG.WHITE, TextSize = 10, Font = FONT, ClearTextOnFocus = false, TextXAlignment = Enum.TextXAlignment.Left, }, searchRow) corner(searchBox, 12) pad(searchBox, 8, 4) local searchBtn = button( searchRow, "CARI", UDim2.new(0, 54, 1, 0), UDim2.new(1, -54, 0, 0), CONFIG.GOLD, CONFIG.BLACK ) --================================================== -- KATEGORI --================================================== local category = "all" local categoryBtn = order(button( content, "SEMUA KATEGORI v", UDim2.new(1, 0, 0, 38), nil, CONFIG.CARD, CONFIG.GOLD_LIGHT ), 2) categoryBtn.TextXAlignment = Enum.TextXAlignment.Left pad(categoryBtn, 10, 5) local categoryList = order(make("Frame", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, Visible = false, }, content), 3) make("UIListLayout", { Padding = UDim.new(0, 5), SortOrder = Enum.SortOrder.LayoutOrder, }, categoryList) -- Kategori tematik dipisahkan dari jenis API. -- Filter kata kunci digunakan untuk kategori tematik. local categories = { {id="all", name="SEMUA KATEGORI", keyword=nil}, {id="model", name="MODEL", keyword=nil}, {id="decal", name="DECAL / GAMBAR", keyword=nil}, {id="audio", name="AUDIO / MUSIK", keyword="audio"}, {id="plugin", name="PLUGIN", keyword="plugin"}, {id="animation", name="ANIMASI", keyword="animation"}, {id="mesh", name="MESH", keyword="mesh"}, {id="accessory", name="AKSESORI", keyword="accessory"}, {id="building", name="BANGUNAN", keyword="building"}, {id="nature", name="ALAM / POHON", keyword="tree"}, {id="vehicle", name="KENDARAAN", keyword="vehicle"}, {id="weapon", name="SENJATA", keyword="weapon"}, {id="effect", name="EFEK / VFX", keyword="effect"}, {id="ui", name="UI / GUI", keyword="gui"}, {id="texture", name="TEKSTUR", keyword="texture"}, {id="terrain", name="TERRAIN", keyword="terrain"}, {id="material", name="MATERIAL", keyword="material"}, {id="package", name="PACKAGE", keyword="package"}, {id="font", name="FONT", keyword="font"}, {id="video", name="VIDEO", keyword="video"}, } --================================================== -- STATUS & ID --================================================== local status = order(label(content, "SIAP", 10, CONFIG.MUTED), 4) status.Size = UDim2.new(1, 0, 0, 23) status.TextTruncate = Enum.TextTruncate.AtEnd local idRow = order(make("Frame", { Size = UDim2.new(1, 0, 0, 35), BackgroundTransparency = 1, }, content), 5) local idBox = make("TextBox", { Size = UDim2.new(1, -67, 1, 0), BackgroundColor3 = CONFIG.CARD, BorderSizePixel = 0, Text = "", PlaceholderText = "ID aset", PlaceholderColor3 = CONFIG.MUTED, TextColor3 = CONFIG.GOLD_LIGHT, TextSize = 10, Font = FONT, ClearTextOnFocus = false, }, idRow) corner(idBox, 11) pad(idBox, 7, 3) local copyIdBtn = button( idRow, "SALIN ID", UDim2.new(0, 62, 1, 0), UDim2.new(1, -62, 0, 0), CONFIG.GOLD, CONFIG.BLACK ) copyIdBtn.TextSize = 9 local heading = order(label( content, "BERANDA CREATOR STORE", 10, CONFIG.GOLD ), 6) heading.Size = UDim2.new(1, 0, 0, 25) heading.TextTruncate = Enum.TextTruncate.AtEnd --================================================== -- GRID HASIL --================================================== local cardGrid = order(make("Frame", { Name = "AssetResults", Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, }, content), 7) make("UIGridLayout", { CellSize = UDim2.new(0.5, -4, 0, 150), CellPadding = UDim2.fromOffset(7, 7), SortOrder = Enum.SortOrder.LayoutOrder, }, cardGrid) local moreBtn = order(button( content, "MUAT LAGI", UDim2.new(1, 0, 0, 36), nil, Color3.fromRGB(48, 37, 17), CONFIG.GOLD_LIGHT ), 8) outline(moreBtn, CONFIG.GOLD, 1) --================================================== -- SALIN ID --================================================== local selectedId = nil local function showId(id) selectedId = tostring(id) idBox.Text = selectedId end local function copyId(id) id = tostring(id or selectedId or idBox.Text):match("%d+") if not id then status.Text = "PILIH ASET TERLEBIH DAHULU" return end local clipboardFunction pcall(function() clipboardFunction = setclipboard end) if type(clipboardFunction) == "function" then local ok = pcall(clipboardFunction, id) if ok then status.Text = "ID BERHASIL DISALIN" return end end idBox.Text = id idBox:CaptureFocus() idBox.CursorPosition = #id + 1 status.Text = "CLIPBOARD TIDAK DIDUKUNG" end copyIdBtn.Activated:Connect(function() copyId(selectedId or idBox.Text) end) --================================================== -- CREATOR STORE SEARCH --================================================== local query = "" local page = 0 local loading = false local resultOrder = 0 local function clearResults() for _, child in ipairs(cardGrid:GetChildren()) do if child:IsA("Frame") then child:Destroy() end end resultOrder = 0 end local function addCard(item) local id = item.AssetId if not id then return end resultOrder += 1 local card = make("Frame", { Name = "AssetCard", BackgroundColor3 = CONFIG.CARD, BorderSizePixel = 0, LayoutOrder = resultOrder, ClipsDescendants = true, }, cardGrid) corner(card, 13) outline(card, Color3.fromRGB(75, 58, 28), 1) local image = make("ImageLabel", { Position = UDim2.fromOffset(5, 5), Size = UDim2.new(1, -10, 0, 83), BackgroundColor3 = CONFIG.BLACK, BorderSizePixel = 0, Image = "rbxthumb://type=Asset&id=" .. tostring(id) .. "&w=150&h=150", ScaleType = Enum.ScaleType.Fit, }, card) corner(image, 11) local name = label( card, tostring(item.Name or "ASSET"), 9, CONFIG.WHITE ) name.Position = UDim2.new(0, 6, 0, 91) name.Size = UDim2.new(1, -12, 0, 25) name.TextTruncate = Enum.TextTruncate.AtEnd name.TextWrapped = true local copy = button( card, "SALIN ID", UDim2.new(1, -10, 0, 24), UDim2.new(0, 5, 0, 120), CONFIG.GOLD, CONFIG.BLACK ) copy.TextSize = 9 copy.Activated:Connect(function() showId(id) copyId(id) end) end local function getResults(method, searchQuery, pageIndex) local ok, result = pcall(function() return InsertService[method]( InsertService, searchQuery, pageIndex ) end) if not ok then return nil, tostring(result) end if type(result) ~= "table" then return {}, nil end local firstPage = result[1] if type(firstPage) ~= "table" or type(firstPage.Results) ~= "table" then return {}, nil end return firstPage.Results, nil end local function fetch(loadMore) if loading then return end loading = true if not loadMore then page = 0 clearResults() else page += 1 end local searchQuery = query -- Kategori tematik menggunakan kata kunci. local chosenCategory for _, cat in ipairs(categories) do if cat.id == category then chosenCategory = cat break end end if chosenCategory and chosenCategory.keyword then if searchQuery == "" then searchQuery = chosenCategory.keyword else searchQuery = chosenCategory.keyword .. " " .. searchQuery end end heading.Text = searchQuery == "" and "BERANDA CREATOR STORE" or ("HASIL: " .. searchQuery) status.Text = "MEMUAT ASET..." searchBtn.Text = "..." task.spawn(function() local methods if category == "model" then methods = {"GetFreeModelsAsync"} elseif category == "decal" then methods = {"GetFreeDecalsAsync"} else methods = { "GetFreeModelsAsync", "GetFreeDecalsAsync", } end local count = 0 local errors = {} for _, method in ipairs(methods) do local results, err = getResults( method, searchQuery, page ) if not results then table.insert(errors, err or "PENCARIAN GAGAL") else for _, item in ipairs(results) do if item.AssetId then addCard(item) count += 1 end end end end if count > 0 then status.Text = tostring(count) .. " ASET DIMUAT" elseif #errors > 0 then status.Text = "API TIDAK TERSEDIA" else status.Text = "TIDAK ADA HASIL" end searchBtn.Text = "CARI" loading = false end) end local function doSearch() query = searchBox.Text fetch(false) end searchBtn.Activated:Connect(doSearch) searchBox.FocusLost:Connect(function(enterPressed) if enterPressed then doSearch() end end) moreBtn.Activated:Connect(function() fetch(true) end) --================================================== -- KATEGORI DROPDOWN --================================================== for i, cat in ipairs(categories) do local b = button( categoryList, cat.name, UDim2.new(1, 0, 0, 32), nil, CONFIG.CARD, CONFIG.WHITE ) b.LayoutOrder = i b.TextXAlignment = Enum.TextXAlignment.Left pad(b, 10, 5) b.Activated:Connect(function() category = cat.id categoryBtn.Text = cat.name .. " v" categoryList.Visible = false fetch(false) end) end categoryBtn.Activated:Connect(function() categoryList.Visible = not categoryList.Visible end) --================================================== -- ANIMASI SLIDE --================================================== local isOpen = false local animating = false local loaded = false local animationId = 0 local function setOpen(value) if animating or isOpen == value then return end animationId += 1 local thisAnimation = animationId animating = true isOpen = value toggle.Active = false if value then panel.Visible = true panel.Position = UDim2.new( 0, -CONFIG.WIDTH - 20, 0.5, 0 ) if not loaded then loaded = true task.defer(function() fetch(false) end) end end local destination if value then destination = UDim2.new(0, panelX(), 0.5, 0) else destination = UDim2.new( 0, -CONFIG.WIDTH - 20, 0.5, 0 ) end local tween = TweenService:Create( panel, TweenInfo.new( CONFIG.SLIDE_TIME, Enum.EasingStyle.Quint, Enum.EasingDirection.Out ), {Position = destination} ) tween:Play() tween.Completed:Connect(function() if thisAnimation ~= animationId then return end if not value then panel.Visible = false end toggle.Visible = true toggle.Active = true animating = false end) end toggle.Activated:Connect(function() setOpen(not isOpen) end) close.Activated:Connect(function() setOpen(false) end) local camera = workspace.CurrentCamera if camera then camera:GetPropertyChangedSignal("ViewportSize"):Connect(function() if isOpen and not animating then panel.Position = UDim2.new( 0, panelX(), 0.5, 0 ) end end) end print("[Advance Toolbox] By Pumpikinie loaded")