-- // OpenLua UI Library — dark / orange restyle if getgenv().Library then pcall(function() getgenv().Library:Unload() end) end local Library do local UserInputService = game:GetService("UserInputService") local Players = game:GetService("Players") local Workspace = game:GetService("Workspace") local HttpService = game:GetService("HttpService") local TweenService = game:GetService("TweenService") local RunService = game:GetService("RunService") local CoreGui = cloneref and cloneref(game:GetService("CoreGui")) or game:GetService("CoreGui") gethui = gethui or function() return CoreGui end local LocalPlayer = Players.LocalPlayer local Camera = Workspace.CurrentCamera local Mouse = LocalPlayer:GetMouse() local FromRGB = Color3.fromRGB local FromHSV = Color3.fromHSV local FromHex = Color3.fromHex local RGBSequence = ColorSequence.new local RGBSequenceKeypoint = ColorSequenceKeypoint.new local NumSequence = NumberSequence.new local NumSequenceKeypoint = NumberSequenceKeypoint.new local UDim2New = UDim2.new local UDimNew = UDim.new local Vector2New = Vector2.new local InstanceNew = Instance.new local TweenInfoNew = TweenInfo.new local RectNew = Rect.new local MathClamp, MathFloor, MathAbs, MathSin, MathCos, MathRad = math.clamp, math.floor, math.abs, math.sin, math.cos, math.rad local TableInsert, TableFind, TableRemove, TableConcat, TableClone, TableUnpack = table.insert, table.find, table.remove, table.concat, table.clone, table.unpack local StringFormat, StringFind, StringGSub, StringLower, StringUpper, StringSub = string.format, string.find, string.gsub, string.lower, string.upper, string.sub Library = { Flags = { }, SetFlags = { }, MenuKeybind = tostring(Enum.KeyCode.Z), Tween = { Time = 0.18, Style = Enum.EasingStyle.Quad, Direction = Enum.EasingDirection.Out }, Folders = { Directory = "zoophack", Configs = "zoophack/Configs", Assets = "zoophack/Assets", Themes = "zoophack/Themes" }, Images = { ["Saturation"] = { "Saturation.png", "https://github.com/sametexe001/images/blob/main/saturation.png?raw=true" }, ["Value"] = { "Value.png", "https://github.com/sametexe001/images/blob/main/value.png?raw=true" }, ["Hue"] = { "Hue.png", "https://github.com/sametexe001/images/blob/main/horizontalhue.png?raw=true" }, ["Checkers"] = { "Checkers.png", "https://github.com/sametexe001/images/blob/main/checkers.png?raw=true" }, ["Scrollbar"] = { "Scrollbar.png", "https://github.com/sametexe001/images/blob/main/scrollbar.png?raw=true" }, }, -- named procedural icons can be swapped for image assets here -- e.g. Library.IconImages["Crosshair"] = "rbxassetid://1234567890" IconImages = { }, -- Ignore below Pages = { }, Sections = { }, Connections = { }, Threads = { }, Keybinds = { }, ThemeMap = { }, ThemeItems = { }, Themes = { }, CurrentFrames = { }, ThemeColorpickers = { }, UnnamedConnections = 0, UnnamedFlags = 0, Holder = nil, UnusedHolder = nil, NotifHolder = nil, Font = nil, BoldFont = nil, } local Keys = { ["Unknown"] = "Unknown", ["Backspace"] = "Back", ["Tab"] = "Tab", ["Clear"] = "Clear", ["Return"] = "Return", ["Pause"] = "Pause", ["Escape"] = "Escape", ["Space"] = "Space", ["QuotedDouble"] = '"', ["Hash"] = "#", ["Dollar"] = "$", ["Percent"] = "%", ["Ampersand"] = "&", ["Quote"] = "'", ["LeftParenthesis"] = "(", ["RightParenthesis"] = " )", ["Asterisk"] = "*", ["Plus"] = "+", ["Comma"] = ",", ["Minus"] = "-", ["Period"] = ".", ["Slash"] = "`", ["Three"] = "3", ["Seven"] = "7", ["Eight"] = "8", ["Colon"] = ":", ["Semicolon"] = ";", ["LessThan"] = "<", ["GreaterThan"] = ">", ["Question"] = "?", ["Equals"] = "=", ["At"] = "@", ["LeftBracket"] = "LeftBracket", ["RightBracket"] = "RightBracked", ["BackSlash"] = "BackSlash", ["Caret"] = "^", ["Underscore"] = "_", ["Backquote"] = "`", ["LeftCurly"] = "{", ["Pipe"] = "|", ["RightCurly"] = "}", ["Tilde"] = "~", ["Delete"] = "Delete", ["End"] = "End", ["KeypadZero"] = "Keypad0", ["KeypadOne"] = "Keypad1", ["KeypadTwo"] = "Keypad2", ["KeypadThree"] = "Keypad3", ["KeypadFour"] = "Keypad4", ["KeypadFive"] = "Keypad5", ["KeypadSix"] = "Keypad6", ["KeypadSeven"] = "Keypad7", ["KeypadEight"] = "Keypad8", ["KeypadNine"] = "Keypad9", ["KeypadPeriod"] = "KeypadP", ["KeypadDivide"] = "KeypadD", ["KeypadMultiply"] = "KeypadM", ["KeypadMinus"] = "KeypadM", ["KeypadPlus"] = "KeypadP", ["KeypadEnter"] = "KeypadE", ["KeypadEquals"] = "KeypadE", ["Insert"] = "Insert", ["Home"] = "Home", ["PageUp"] = "PageUp", ["PageDown"] = "PageDown", ["RightShift"] = "RightShift", ["LeftShift"] = "LeftShift", ["RightControl"] = "RightControl", ["LeftControl"] = "LeftControl", ["LeftAlt"] = "LeftAlt", ["RightAlt"] = "RightAlt" } Library.__index = Library Library.Pages.__index = Library.Pages Library.Sections.__index = Library.Sections -- folders + local assets for _, Path in { Library.Folders.Directory, Library.Folders.Configs, Library.Folders.Assets, Library.Folders.Themes } do pcall(function() if not isfolder(Path) then makefolder(Path) end end) end for _, Image in Library.Images do pcall(function() local Path = Library.Folders.Assets .. "/" .. Image[1] if not isfile(Path) then local Data = game:HttpGet(Image[2]) if type(Data) == "string" and #Data > 0 then writefile(Path, Data) end end end) end local AssetCache = { } local Themes = { ["Default"] = { ["Background"] = FromRGB(16, 16, 18), ["Inline"] = FromRGB(21, 22, 25), ["Card"] = FromRGB(21, 22, 25), ["Card Header"] = FromRGB(28, 29, 33), ["Element"] = FromRGB(31, 32, 37), ["Off"] = FromRGB(58, 59, 65), ["Border"] = FromRGB(38, 39, 45), ["Text"] = FromRGB(255, 255, 255), ["SubText"] = FromRGB(122, 126, 134), ["Image"] = FromRGB(255, 255, 255), ["Accent"] = FromRGB(224, 138, 43), ["Light Accent"] = FromRGB(255, 169, 77), ["Accent Dim"] = FromRGB(85, 52, 16), } } Library.Theme = TableClone(Themes["Default"]) Library.Themes = Themes -- Accepts either a raw Instance or an Instances wrapper table local function Raw(Item) if typeof(Item) == "Instance" then return Item elseif type(Item) == "table" then return Item.Instance end return Item end -- Tweening local Tween = { } do Tween.__index = Tween Tween.Create = function(self, Item, Info, Goal, IsRawItem) Item = IsRawItem and Item or Item.Instance Info = Info or TweenInfoNew(Library.Tween.Time, Library.Tween.Style, Library.Tween.Direction) local NewTween = { Tween = TweenService:Create(Item, Info, Goal), Info = Info, Goal = Goal, Item = Item } NewTween.Tween:Play() setmetatable(NewTween, Tween) return NewTween end Tween.Get = function(self) if not self.Tween then return end return self.Tween, self.Info, self.Goal end Tween.Pause = function(self) if not self.Tween then return end self.Tween:Pause() end Tween.Play = function(self) if not self.Tween then return end self.Tween:Play() end Tween.Clean = function(self) if not self.Tween then return end self.Tween:Pause() self = nil end end -- Instances local Instances = { } do Instances.__index = Instances Instances.Create = function(self, Class, Properties) local NewItem = { Instance = InstanceNew(Class), Properties = Properties or { }, Class = Class } setmetatable(NewItem, Instances) for Property, Value in pairs(NewItem.Properties) do if Value ~= nil then NewItem.Instance[Property] = Value end end return NewItem end Instances.AddToTheme = function(self, Properties) if not self.Instance then return end Library:AddToTheme(self, Properties) return self end Instances.ChangeItemTheme = function(self, Properties) if not self.Instance then return end Library:ChangeItemTheme(self, Properties) return self end Instances.Set = function(self, Properties) if not self.Instance then return end for Property, Value in pairs(Properties) do if Value ~= nil then self.Instance[Property] = Value end end return self end Instances.Connect = function(self, Event, Callback, Name) if not self.Instance then return end if not self.Instance[Event] then return end return Library:Connect(self.Instance[Event], Callback, Name) end Instances.Tween = function(self, Info, Goal) if not self.Instance then return end return Tween:Create(self, Info, Goal) end Instances.Disconnect = function(self, Name) if not self.Instance then return end return Library:Disconnect(Name) end Instances.Clean = function(self) if not self.Instance then return end self.Instance:Destroy() self = nil end Instances.MakeDraggable = function(self, Regions) if not self.Instance then return end local RawGui = self local Gui = self.Instance local RegionList = { } if type(Regions) == "table" and Regions.Instance == nil then for _, Region in Regions do local RawRegion = Raw(Region) if RawRegion then TableInsert(RegionList, RawRegion) end end else TableInsert(RegionList, Raw(Regions) or Gui) end local Dragging = false local DragStart local StartPosition local ParentScale = 1 pcall(function() local Parent = Gui.Parent if Parent then local ScaleObject = Parent:FindFirstChildOfClass("UIScale") if ScaleObject then ParentScale = ScaleObject.Scale end end end) if ParentScale <= 0 then ParentScale = 1 end local function IsControl(Target, Stop) local Node = Target local Guard = 0 while Node and Node ~= Stop and Guard < 16 do if Node:IsA("TextButton") or Node:IsA("ImageButton") or Node:IsA("TextBox") then return true end Node = Node.Parent Guard += 1 end return false end local function Set(Input) local DragDelta = Input.Position - DragStart Gui.Position = UDim2New(StartPosition.X.Scale, StartPosition.X.Offset + (DragDelta.X / ParentScale), StartPosition.Y.Scale, StartPosition.Y.Offset + (DragDelta.Y / ParentScale)) end for _, Region in RegionList do Library:Connect(Region.InputBegan, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then if Input.Target and IsControl(Input.Target, Region) then return end Dragging = true DragStart = Input.Position StartPosition = Gui.Position RawGui.Debounce = true end end) Library:Connect(Region.InputEnded, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Dragging = false RawGui.Debounce = false end end) end -- legacy Mouse fallback: independent of GUI input routing local function ControlUnderPoint(X, Y) for _, Item in ipairs(Gui:GetDescendants()) do if Item:IsA("TextButton") or Item:IsA("ImageButton") or Item:IsA("TextBox") then if Item.Visible and Item.AbsoluteSize.X > 0 and Item.AbsoluteSize.Y > 0 then local Position = Item.AbsolutePosition local Size = Item.AbsoluteSize if X >= Position.X and X <= Position.X + Size.X and Y >= Position.Y and Y <= Position.Y + Size.Y then return true end end end end return false end Library:Connect(Mouse.Button1Down, function() local X, Y = Mouse.X, Mouse.Y local Position = Gui.AbsolutePosition local Size = Gui.AbsoluteSize if X < Position.X or X > Position.X + Size.X or Y < Position.Y or Y > Position.Y + Size.Y then return end if ControlUnderPoint(X, Y) then return end Dragging = true DragStart = Vector3.new(X, Y, 0) StartPosition = Gui.Position RawGui.Debounce = true end) Library:Connect(Mouse.Move, function() if not Dragging then return end local Delta = Vector3.new(Mouse.X, Mouse.Y, 0) - DragStart Gui.Position = UDim2New(StartPosition.X.Scale, StartPosition.X.Offset + (Delta.X / ParentScale), StartPosition.Y.Scale, StartPosition.Y.Offset + (Delta.Y / ParentScale)) end) Library:Connect(Mouse.Button1Up, function() Dragging = false RawGui.Debounce = false end) -- global fallback: works even when the press target is a frame that does not pass input up Library:Connect(UserInputService.InputBegan, function(Input, Processed) if Processed then return end if Input.UserInputType ~= Enum.UserInputType.MouseButton1 and Input.UserInputType ~= Enum.UserInputType.Touch then return end local Target = Input.Target if not Target or not Target:IsDescendantOf(Gui) then return end if Target ~= Gui and IsControl(Target, Gui) then return end Dragging = true DragStart = Input.Position StartPosition = Gui.Position RawGui.Debounce = true end) Library:Connect(UserInputService.InputEnded, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Dragging = false RawGui.Debounce = false end end) Library:Connect(UserInputService.InputChanged, function(Input) if not Dragging then return end if Input.UserInputType == Enum.UserInputType.MouseMovement or Input.UserInputType == Enum.UserInputType.Touch then RawGui.Debounce = true Set(Input) end end) return Dragging end Instances.MakeResizeable = function(self, Minimum, Maximum) if not self.Instance then return end local RawGui = self local Gui = self.Instance local Resizing = false local Start = UDim2New() local Delta = UDim2New() local ResizeButton = Instances:Create("TextButton", { Parent = Gui, AnchorPoint = Vector2New(1, 1), Size = UDim2New(0, 12, 0, 12), Position = UDim2New(1, 0, 1, 0), Name = "\0", BackgroundTransparency = 1, AutoButtonColor = false, ZIndex = 2000, Visible = true, Text = "" }) ResizeButton:Connect("InputBegan", function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Resizing = true Start = Gui.Size - UDim2New(0, Input.Position.X, 0, Input.Position.Y) end end) ResizeButton:Connect("InputEnded", function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Resizing = false end end) Library:Connect(UserInputService.InputChanged, function(Input) if (Input.UserInputType == Enum.UserInputType.MouseMovement or Input.UserInputType == Enum.UserInputType.Touch) and Resizing then local ResizeMax = Maximum or Gui.Parent.AbsoluteSize - Gui.AbsoluteSize Delta = Start + UDim2New(0, Input.Position.X, 0, Input.Position.Y) Delta = UDim2New(0, MathClamp(Delta.X.Offset, Minimum.X, ResizeMax.X), 0, MathClamp(Delta.Y.Offset, Minimum.Y, ResizeMax.Y)) Gui.Size = Delta end end) return Resizing end Instances.OnHover = function(self, Function) if not self.Instance then return end return Library:Connect(self.Instance.MouseEnter, Function) end Instances.OnHoverLeave = function(self, Function) if not self.Instance then return end return Library:Connect(self.Instance.MouseLeave, Function) end end -- Fonts local function SafeAsset(Path) local Ok, Result = pcall(function() return getcustomasset(Path) end) if Ok then return Result end return nil end Library.GetImage = function(self, Image) if AssetCache[Image] then return AssetCache[Image] end local ImageData = self.Images[Image] if not ImageData then return nil end local Path = SafeAsset(self.Folders.Assets .. "/" .. ImageData[1]) if Path then AssetCache[Image] = Path end return Path end local CustomFont = { } do local function Load(Name, Weight, Style, Url) local JsonPath = Library.Folders.Assets .. "/" .. Name .. ".json" local TtfPath = Library.Folders.Assets .. "/" .. Name .. ".ttf" if not isfile(JsonPath) then local Ok = pcall(function() if not isfile(TtfPath) then local Data = game:HttpGet(Url) if type(Data) ~= "string" or #Data == 0 then error("empty font download") end writefile(TtfPath, Data) end local FontData = { name = Name, faces = { { name = "Regular", weight = Weight, style = Style, assetId = getcustomasset(TtfPath) } } } writefile(JsonPath, HttpService:JSONEncode(FontData)) end) if not Ok then return false end end return true end function CustomFont:New(Name, Weight, Style, Data) if Load(Name, Weight, Style, Data.Url) then local Path = SafeAsset(Library.Folders.Assets .. "/" .. Name .. ".json") if Path then local Ok, Face = pcall(function() return Font.new(Path) end) if Ok then return Face end end end return nil end function CustomFont:Get(Name) local Path = SafeAsset(Library.Folders.Assets .. "/" .. Name .. ".json") if not Path then return nil end local Ok, Face = pcall(function() return Font.new(Path) end) if Ok then return Face end return nil end end local function FallbackFont(Weight) local Ok, Face = pcall(function() return Font.new("rbxasset://fonts/families/GothamSSm.json", Weight) end) if Ok then return Face end return Font.fromEnum(Enum.Font.GothamMedium) end CustomFont:New("Jakarta", 400, "Regular", { Url = "https://raw.githubusercontent.com/tokotype/PlusJakartaSans/master/fonts/ttf/PlusJakartaSans-Regular.ttf" }) CustomFont:New("JakartaMedium", 500, "Regular", { Url = "https://raw.githubusercontent.com/tokotype/PlusJakartaSans/master/fonts/ttf/PlusJakartaSans-Medium.ttf" }) CustomFont:New("JakartaBold", 700, "Bold", { Url = "https://raw.githubusercontent.com/tokotype/PlusJakartaSans/master/fonts/ttf/PlusJakartaSans-SemiBold.ttf" }) Library.Font = CustomFont:Get("JakartaMedium") or CustomFont:Get("Jakarta") or FallbackFont(Enum.FontWeight.Medium) Library.BoldFont = CustomFont:Get("JakartaBold") or FallbackFont(Enum.FontWeight.Bold) -- Icons (procedural, 16x16 design grid) local Icons = { } do local function Ctx(Holder, Size, Color, ZIndex) local K = Size / 16 local function Add(Class, Props) local Item = InstanceNew(Class) for Property, Value in pairs(Props) do if Value ~= nil then Item[Property] = Value end end Item.Parent = Holder return Item end local function Rect(X, Y, W, H, Radius, Rotation) local Item = Add("Frame", { AnchorPoint = Vector2New(0.5, 0.5), Position = UDim2New(0, X * K, 0, Y * K), Size = UDim2New(0, W * K, 0, H * K), BackgroundColor3 = Color, BorderSizePixel = 0, Rotation = Rotation or 0, ZIndex = ZIndex }) if Radius then Add("UICorner", { CornerRadius = UDimNew(Radius, 0) }) end return Item end local function Ring(X, Y, Diameter, Thickness) local Item = Add("Frame", { AnchorPoint = Vector2New(0.5, 0.5), Position = UDim2New(0, X * K, 0, Y * K), Size = UDim2New(0, Diameter * K, 0, Diameter * K), BackgroundTransparency = 1, BorderSizePixel = 0, ZIndex = ZIndex }) Add("UICorner", { CornerRadius = UDimNew(1, 0) }) Add("UIStroke", { Color = Color, Thickness = (Thickness or 1.4) * K, ApplyStrokeMode = Enum.ApplyStrokeMode.Border }) return Item end local function Oval(X, Y, W, H, Thickness) local Item = Add("Frame", { AnchorPoint = Vector2New(0.5, 0.5), Position = UDim2New(0, X * K, 0, Y * K), Size = UDim2New(0, W * K, 0, H * K), BackgroundTransparency = 1, BorderSizePixel = 0, ZIndex = ZIndex }) Add("UICorner", { CornerRadius = UDimNew(0.5, 0) }) Add("UIStroke", { Color = Color, Thickness = (Thickness or 1.4) * K, ApplyStrokeMode = Enum.ApplyStrokeMode.Border }) return Item end return { Rect = Rect, Ring = Ring, Oval = Oval, K = K } end local Builders = { } Builders["Crosshair"] = function(C) C.Ring(8, 8, 10, 1.4) C.Rect(8, 8, 1.8, 1.8, 1) C.Rect(8, 2.4, 1.4, 2.8, 0.7) C.Rect(8, 13.6, 1.4, 2.8, 0.7) C.Rect(2.4, 8, 2.8, 1.4, 0.7) C.Rect(13.6, 8, 2.8, 1.4, 0.7) end Builders["Eye"] = function(C) C.Oval(8, 8, 15, 9.5, 1.4) C.Rect(8, 8, 4.4, 4.4, 1) end Builders["Globe"] = function(C) C.Ring(8, 8, 13, 1.4) C.Oval(8, 8, 6.4, 13, 1.3) C.Rect(8, 8, 13, 1.4, 0.7) end Builders["Person"] = function(C) C.Ring(8, 5.4, 4.8, 1.4) C.Rect(8, 12.6, 10.6, 6.6, 0.5) end Builders["People"] = function(C) C.Ring(6, 5.6, 4.2, 1.3) C.Rect(6, 12.6, 9, 6.2, 0.5) C.Ring(12.4, 6.4, 3.4, 1.2) C.Rect(12.4, 12, 6.4, 5.2, 0.5) end Builders["Car"] = function(C) C.Rect(8, 9.8, 15, 5, 1.2) C.Rect(8, 6.6, 7.6, 3.6, 1) C.Rect(5, 13, 3, 3, 1) C.Rect(11, 13, 3, 3, 1) end Builders["Settings"] = function(C) for Index = 1, 8 do local Angle = Index * 45 C.Rect(8 + MathCos(MathRad(Angle)) * 6, 8 + MathSin(MathRad(Angle)) * 6, 2.2, 3.6, 1, Angle) end C.Ring(8, 8, 8.6, 1.5) C.Ring(8, 8, 2.4, 1.4) end Builders["Folder"] = function(C) C.Rect(8, 9.4, 14.4, 9.4, 1.6) C.Rect(6.4, 4.4, 6, 3, 0.9) end Builders["Search"] = function(C) C.Ring(7, 7, 10.4, 1.5) C.Rect(12.4, 12.4, 1.6, 5.4, 0.8, -45) end Builders["Keyboard"] = function(C) C.Rect(8, 7.6, 15, 10, 1.6) C.Rect(4.6, 6.4, 1.4, 1.4, 0.7) C.Rect(8, 6.4, 1.4, 1.4, 0.7) C.Rect(11.4, 6.4, 1.4, 1.4, 0.7) C.Rect(8, 9.4, 6.4, 1.3, 0.6) end Builders["Cart"] = function(C) C.Rect(3.4, 4.2, 3.6, 1.4, 0.7, 32) C.Rect(9.2, 9.6, 11.2, 6.6, 1.2) C.Rect(6.8, 13.8, 2.2, 2.2, 1) C.Rect(11.6, 13.8, 2.2, 2.2, 1) end Builders["Check"] = function(C) C.Rect(5.3, 10.6, 2, 4.8, 1, -45) C.Rect(9.7, 9.2, 2, 8.8, 1, 45) end Builders["Chevron"] = function(C) C.Rect(6.4, 9, 1.5, 4.2, 0.75, -45) C.Rect(9.6, 9, 1.5, 4.2, 0.75, 45) end Builders["Dots"] = function(C) C.Rect(4.6, 8, 1.8, 1.8, 1) C.Rect(8, 8, 1.8, 1.8, 1) C.Rect(11.4, 8, 1.8, 1.8, 1) end Builders["Bolt"] = function(C) C.Rect(8.4, 5.2, 2.4, 7, 0.9, 22) C.Rect(7.6, 10.8, 2.4, 7, 0.9, 22) end Builders["Shield"] = function(C) C.Rect(8, 8, 11, 12, 1.6) C.Ring(8, 8, 5, 1.4) end Builders["Sword"] = function(C) C.Rect(8.4, 7, 1.8, 12, 0.9, 45) C.Rect(4.8, 11.2, 1.6, 5, 0.8, -45) end Builders["Bug"] = function(C) C.Ring(8, 8, 7.4, 1.4) C.Rect(8, 3.6, 1.4, 3, 0.7, -30) C.Rect(8, 3.6, 1.4, 3, 0.7, 30) C.Rect(8, 8, 1.4, 8, 0.7) end function Icons.Draw(Name, Parent, Size, Color) if not Name then return nil end local Image = Library.IconImages[Name] if not Image and (StringFind(tostring(Name), "^%d") or StringFind(tostring(Name), "rbxassetid")) then Image = StringFind(tostring(Name), "rbxassetid") and Name or ("rbxassetid://" .. Name) end if Image then local Label = Instances:Create("ImageLabel", { Parent = Parent, BackgroundTransparency = 1, BorderSizePixel = 0, Size = UDim2New(0, Size, 0, Size), Image = Image, ImageColor3 = Color, ZIndex = (Parent.ZIndex or 1) + 1 }) return Label end local Builder = Builders[Name] if not Builder then Builder = Builders["Dots"] end local Holder = Instances:Create("Frame", { Parent = Parent, BackgroundTransparency = 1, BorderSizePixel = 0, Size = UDim2New(0, Size, 0, Size), ZIndex = (Parent.ZIndex or 1) + 1 }) Builder(Ctx(Holder.Instance, Size, Color, Holder.Instance.ZIndex)) return Holder end function Icons.Set(Name, Builder) Builders[Name] = Builder end Library.Icons = Icons end