warn ("[VOXI] Loaded DrawingLib") local coreGui = game:GetService("CoreGui") local camera = workspace.CurrentCamera local drawingUI = Instance.new("ScreenGui") drawingUI.Name = "Drawing | Xeno" drawingUI.IgnoreGuiInset = true drawingUI.DisplayOrder = 0x7fffffff drawingUI.Parent = coreGui local drawingIndex = 0 local drawingFontsEnum = { [0] = Font.fromEnum(Enum.Font.Roboto), [1] = Font.fromEnum(Enum.Font.Legacy), [2] = Font.fromEnum(Enum.Font.SourceSans), [3] = Font.fromEnum(Enum.Font.RobotoMono) } local function getFontFromIndex(fontIndex) return drawingFontsEnum[fontIndex] end local function convertTransparency(transparency) return math.clamp(1 - transparency, 0, 1) end local baseDrawingObj = setmetatable({ Visible = true, ZIndex = 0, Transparency = 1, Color = Color3.new(), Remove = function(self) setmetatable(self, nil) end, Destroy = function(self) setmetatable(self, nil) end, SetProperty = function(self, index, value) if self[index] ~= nil then self[index] = value else warn("Attempted to set invalid property: " .. tostring(index)) end end, GetProperty = function(self, index) if self[index] ~= nil then return self[index] else warn("Attempted to get invalid property: " .. tostring(index)) return nil end end, SetParent = function(self, parent) self.Parent = parent end }, { __add = function(t1, t2) local result = {} for index, value in pairs(t1) do result[index] = value end for index, value in pairs(t2) do result[index] = value end return result end }) local DrawingLib = {} DrawingLib.Fonts = { ["UI"] = 0, ["System"] = 1, ["Plex"] = 2, ["Monospace"] = 3 } function DrawingLib.new(drawingType) drawingIndex += 1 if drawingType == "Line" then return DrawingLib.createLine() elseif drawingType == "Text" then return DrawingLib.createText() elseif drawingType == "Circle" then return DrawingLib.createCircle() elseif drawingType == "Square" then return DrawingLib.createSquare() elseif drawingType == "Image" then return DrawingLib.createImage() elseif drawingType == "Quad" then return DrawingLib.createQuad() elseif drawingType == "Triangle" then return DrawingLib.createTriangle() elseif drawingType == "Frame" then return DrawingLib.createFrame() elseif drawingType == "ScreenGui" then return DrawingLib.createScreenGui() elseif drawingType == "TextButton" then return DrawingLib.createTextButton() elseif drawingType == "TextLabel" then return DrawingLib.createTextLabel() elseif drawingType == "TextBox" then return DrawingLib.createTextBox() else error("Invalid drawing type: " .. tostring(drawingType)) end end function DrawingLib.createLine() local lineObj = ({ From = Vector2.zero, To = Vector2.zero, Thickness = 1 } + baseDrawingObj) local lineFrame = Instance.new("Frame") lineFrame.Name = drawingIndex lineFrame.AnchorPoint = Vector2.new(0.5, 0.5) lineFrame.BorderSizePixel = 0 lineFrame.Parent = drawingUI return setmetatable({Parent = drawingUI}, { __newindex = function(_, index, value) if lineObj[index] == nil then warn("Invalid property: " .. tostring(index)) return end if index == "From" or index == "To" then local direction = (index == "From" and lineObj.To or value) - (index == "From" and value or lineObj.From) local center = (lineObj.To + lineObj.From) / 2 local distance = direction.Magnitude local theta = math.deg(math.atan2(direction.Y, direction.X)) lineFrame.Position = UDim2.fromOffset(center.X, center.Y) lineFrame.Rotation = theta lineFrame.Size = UDim2.fromOffset(distance, lineObj.Thickness) elseif index == "Thickness" then lineFrame.Size = UDim2.fromOffset((lineObj.To - lineObj.From).Magnitude, value) elseif index == "Visible" then lineFrame.Visible = value elseif index == "ZIndex" then lineFrame.ZIndex = value elseif index == "Transparency" then lineFrame.BackgroundTransparency = convertTransparency(value) elseif index == "Color" then lineFrame.BackgroundColor3 = value elseif index == "Parent" then lineFrame.Parent = value end lineObj[index] = value end, __index = function(self, index) if index == "Remove" or index == "Destroy" then return function() lineFrame:Destroy() lineObj:Remove() end end return lineObj[index] end, __tostring = function() return "Drawing" end }) end function DrawingLib.createText() local textObj = ({ Text = "", Font = DrawingLib.Fonts.UI, Size = 0, Position = Vector2.zero, Center = false, Outline = false, OutlineColor = Color3.new() } + baseDrawingObj) local textLabel, uiStroke = Instance.new("TextLabel"), Instance.new("UIStroke") textLabel.Name = drawingIndex textLabel.AnchorPoint = Vector2.new(0.5, 0.5) textLabel.BorderSizePixel = 0 textLabel.BackgroundTransparency = 1 local function updateTextPosition() local textBounds = textLabel.TextBounds local offset = textBounds / 2 textLabel.Size = UDim2.fromOffset(textBounds.X, textBounds.Y) textLabel.Position = UDim2.fromOffset(textObj.Position.X + (not textObj.Center and offset.X or 0), textObj.Position.Y + offset.Y) end textLabel:GetPropertyChangedSignal("TextBounds"):Connect(updateTextPosition) uiStroke.Thickness = 1 uiStroke.Enabled = textObj.Outline uiStroke.Color = textObj.Color textLabel.Parent, uiStroke.Parent = drawingUI, textLabel return setmetatable({Parent = drawingUI}, { __newindex = function(_, index, value) if textObj[index] == nil then warn("Invalid property: " .. tostring(index)) return end if index == "Text" then textLabel.Text = value elseif index == "Font" then textLabel.FontFace = getFontFromIndex(math.clamp(value, 0, 3)) elseif index == "Size" then textLabel.TextSize = value elseif index == "Position" then updateTextPosition() elseif index == "Center" then textLabel.Position = UDim2.fromOffset((value and camera.ViewportSize / 2 or textObj.Position).X, textObj.Position.Y) elseif index == "Outline" then uiStroke.Enabled = value elseif index == "OutlineColor" then uiStroke.Color = value elseif index == "Visible" then textLabel.Visible = value elseif index == "ZIndex" then textLabel.ZIndex = value elseif index == "Transparency" then local transparency = convertTransparency(value) textLabel.TextTransparency = transparency uiStroke.Transparency = transparency elseif index == "Color" then textLabel.TextColor3 = value elseif index == "Parent" then textLabel.Parent = value end textObj[index] = value end, __index = function(self, index) if index == "Remove" or index == "Destroy" then return function() textLabel:Destroy() textObj:Remove() end elseif index == "TextBounds" then return textLabel.TextBounds end return textObj[index] end, __tostring = function() return "Drawing" end }) end function DrawingLib.createCircle() local circleObj = ({ Radius = 150, Position = Vector2.zero, Thickness = 0.7, Filled = false } + baseDrawingObj) local circleFrame, uiCorner, uiStroke = Instance.new("Frame"), Instance.new("UICorner"), Instance.new("UIStroke") circleFrame.Name = drawingIndex circleFrame.AnchorPoint = Vector2.new(0.5, 0.5) circleFrame.BorderSizePixel = 0 uiCorner.CornerRadius = UDim.new(1, 0) circleFrame.Size = UDim2.fromOffset(circleObj.Radius, circleObj.Radius) uiStroke.Thickness = circleObj.Thickness uiStroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border circleFrame.Parent, uiCorner.Parent, uiStroke.Parent = drawingUI, circleFrame, circleFrame return setmetatable({Parent = drawingUI}, { __newindex = function(_, index, value) if circleObj[index] == nil then warn("Invalid property: " .. tostring(index)) return end if index == "Radius" then local radius = value * 2 circleFrame.Size = UDim2.fromOffset(radius, radius) elseif index == "Position" then circleFrame.Position = UDim2.fromOffset(value.X, value.Y) elseif index == "Thickness" then uiStroke.Thickness = math.clamp(value, 0.6, 0x7fffffff) elseif index == "Filled" then circleFrame.BackgroundTransparency = value and convertTransparency(circleObj.Transparency) or 1 uiStroke.Enabled = not value elseif index == "Visible" then circleFrame.Visible = value elseif index == "ZIndex" then circleFrame.ZIndex = value elseif index == "Transparency" then local transparency = convertTransparency(value) circleFrame.BackgroundTransparency = circleObj.Filled and transparency or 1 uiStroke.Transparency = transparency elseif index == "Color" then circleFrame.BackgroundColor3 = value uiStroke.Color = value elseif index == "Parent" then circleFrame.Parent = value end circleObj[index] = value end, __index = function(self, index) if index == "Remove" or index == "Destroy" then return function() circleFrame:Destroy() circleObj:Remove() end end return circleObj[index] end, __tostring = function() return "Drawing" end }) end function DrawingLib.createSquare() local squareObj = ({ Size = Vector2.zero, Position = Vector2.zero, Thickness = 0.7, Filled = false } + baseDrawingObj) local squareFrame, uiStroke = Instance.new("Frame"), Instance.new("UIStroke") squareFrame.Name = drawingIndex squareFrame.BorderSizePixel = 0 squareFrame.Parent, uiStroke.Parent = drawingUI, squareFrame return setmetatable({Parent = drawingUI}, { __newindex = function(_, index, value) if squareObj[index] == nil then warn("Invalid property: " .. tostring(index)) return end if index == "Size" then squareFrame.Size = UDim2.fromOffset(value.X, value.Y) elseif index == "Position" then squareFrame.Position = UDim2.fromOffset(value.X, value.Y) elseif index == "Thickness" then uiStroke.Thickness = math.clamp(value, 0.6, 0x7fffffff) elseif index == "Filled" then squareFrame.BackgroundTransparency = value and convertTransparency(squareObj.Transparency) or 1 uiStroke.Enabled = not value elseif index == "Visible" then squareFrame.Visible = value elseif index == "ZIndex" then squareFrame.ZIndex = value elseif index == "Transparency" then local transparency = convertTransparency(value) squareFrame.BackgroundTransparency = squareObj.Filled and transparency or 1 uiStroke.Transparency = transparency elseif index == "Color" then squareFrame.BackgroundColor3 = value uiStroke.Color = value elseif index == "Parent" then squareFrame.Parent = value end squareObj[index] = value end, __index = function(self, index) if index == "Remove" or index == "Destroy" then return function() squareFrame:Destroy() squareObj:Remove() end end return squareObj[index] end, __tostring = function() return "Drawing" end }) end function DrawingLib.createImage() local imageObj = ({ Data = "", DataURL = "rbxassetid://0", Size = Vector2.zero, Position = Vector2.zero } + baseDrawingObj) local imageFrame = Instance.new("ImageLabel") imageFrame.Name = drawingIndex imageFrame.BorderSizePixel = 0 imageFrame.ScaleType = Enum.ScaleType.Stretch imageFrame.BackgroundTransparency = 1 imageFrame.Parent = drawingUI return setmetatable({Parent = drawingUI}, { __newindex = function(_, index, value) if imageObj[index] == nil then warn("Invalid property: " .. tostring(index)) return end if index == "Data" then elseif index == "DataURL" then imageFrame.Image = value elseif index == "Size" then imageFrame.Size = UDim2.fromOffset(value.X, value.Y) elseif index == "Position" then imageFrame.Position = UDim2.fromOffset(value.X, value.Y) elseif index == "Visible" then imageFrame.Visible = value elseif index == "ZIndex" then imageFrame.ZIndex = value elseif index == "Transparency" then imageFrame.ImageTransparency = convertTransparency(value) elseif index == "Color" then imageFrame.ImageColor3 = value elseif index == "Parent" then imageFrame.Parent = value end imageObj[index] = value end, __index = function(self, index) if index == "Remove" or index == "Destroy" then return function() imageFrame:Destroy() imageObj:Remove() end elseif index == "Data" then return nil end return imageObj[index] end, __tostring = function() return "Drawing" end }) end function DrawingLib.createQuad() local quadObj = ({ PointA = Vector2.zero, PointB = Vector2.zero, PointC = Vector2.zero, PointD = Vector2.zero, Thickness = 1, Filled = false } + baseDrawingObj) local _linePoints = { A = DrawingLib.createLine(), B = DrawingLib.createLine(), C = DrawingLib.createLine(), D = DrawingLib.createLine() } local fillFrame = Instance.new("Frame") fillFrame.Name = drawingIndex .. "_Fill" fillFrame.BorderSizePixel = 0 fillFrame.BackgroundTransparency = quadObj.Transparency fillFrame.BackgroundColor3 = quadObj.Color fillFrame.ZIndex = quadObj.ZIndex fillFrame.Visible = quadObj.Visible and quadObj.Filled fillFrame.Parent = drawingUI return setmetatable({Parent = drawingUI}, { __newindex = function(_, index, value) if quadObj[index] == nil then warn("Invalid property: " .. tostring(index)) return end if index == "PointA" then _linePoints.A.From = value _linePoints.B.To = value elseif index == "PointB" then _linePoints.B.From = value _linePoints.C.To = value elseif index == "PointC" then _linePoints.C.From = value _linePoints.D.To = value elseif index == "PointD" then _linePoints.D.From = value _linePoints.A.To = value elseif index == "Thickness" or index == "Visible" or index == "Color" or index == "ZIndex" then for _, linePoint in pairs(_linePoints) do linePoint[index] = value end if index == "Visible" then fillFrame.Visible = value and quadObj.Filled elseif index == "Color" then fillFrame.BackgroundColor3 = value elseif index == "ZIndex" then fillFrame.ZIndex = value end elseif index == "Filled" then for _, linePoint in pairs(_linePoints) do linePoint.Transparency = value and 1 or quadObj.Transparency end fillFrame.Visible = value elseif index == "Parent" then fillFrame.Parent = value end quadObj[index] = value end, __index = function(self, index) if index == "Remove" or index == "Destroy" then return function() for _, linePoint in pairs(_linePoints) do linePoint:Remove() end fillFrame:Destroy() quadObj:Remove() end end return quadObj[index] end, __tostring = function() return "Drawing" end }) end function DrawingLib.createTriangle() local triangleObj = ({ PointA = Vector2.zero, PointB = Vector2.zero, PointC = Vector2.zero, Thickness = 1, Filled = false } + baseDrawingObj) local _linePoints = { A = DrawingLib.createLine(), B = DrawingLib.createLine(), C = DrawingLib.createLine() } local fillFrame = Instance.new("Frame") fillFrame.Name = drawingIndex .. "_Fill" fillFrame.BorderSizePixel = 0 fillFrame.BackgroundTransparency = triangleObj.Transparency fillFrame.BackgroundColor3 = triangleObj.Color fillFrame.ZIndex = triangleObj.ZIndex fillFrame.Visible = triangleObj.Visible and triangleObj.Filled fillFrame.Parent = drawingUI return setmetatable({Parent = drawingUI}, { __newindex = function(_, index, value) if triangleObj[index] == nil then warn("Invalid property: " .. tostring(index)) return end if index == "PointA" then _linePoints.A.From = value _linePoints.B.To = value elseif index == "PointB" then _linePoints.B.From = value _linePoints.C.To = value elseif index == "PointC" then _linePoints.C.From = value _linePoints.A.To = value elseif index == "Thickness" or index == "Visible" or index == "Color" or index == "ZIndex" then for _, linePoint in pairs(_linePoints) do linePoint[index] = value end if index == "Visible" then fillFrame.Visible = value and triangleObj.Filled elseif index == "Color" then fillFrame.BackgroundColor3 = value elseif index == "ZIndex" then fillFrame.ZIndex = value end elseif index == "Filled" then for _, linePoint in pairs(_linePoints) do linePoint.Transparency = value and 1 or triangleObj.Transparency end fillFrame.Visible = value elseif index == "Parent" then fillFrame.Parent = value end triangleObj[index] = value end, __index = function(self, index) if index == "Remove" or index == "Destroy" then return function() for _, linePoint in pairs(_linePoints) do linePoint:Remove() end fillFrame:Destroy() triangleObj:Remove() end end return triangleObj[index] end, __tostring = function() return "Drawing" end }) end function DrawingLib.createFrame() local frameObj = ({ Size = UDim2.new(0, 100, 0, 100), Position = UDim2.new(0, 0, 0, 0), Color = Color3.new(1, 1, 1), Transparency = 0, Visible = true, ZIndex = 1 } + baseDrawingObj) local frame = Instance.new("Frame") frame.Name = drawingIndex frame.Size = frameObj.Size frame.Position = frameObj.Position frame.BackgroundColor3 = frameObj.Color frame.BackgroundTransparency = convertTransparency(frameObj.Transparency) frame.Visible = frameObj.Visible frame.ZIndex = frameObj.ZIndex frame.BorderSizePixel = 0 frame.Parent = drawingUI return setmetatable({Parent = drawingUI}, { __newindex = function(_, index, value) if frameObj[index] == nil then warn("Invalid property: " .. tostring(index)) return end if index == "Size" then frame.Size = value elseif index == "Position" then frame.Position = value elseif index == "Color" then frame.BackgroundColor3 = value elseif index == "Transparency" then frame.BackgroundTransparency = convertTransparency(value) elseif index == "Visible" then frame.Visible = value elseif index == "ZIndex" then frame.ZIndex = value elseif index == "Parent" then frame.Parent = value end frameObj[index] = value end, __index = function(self, index) if index == "Remove" or index == "Destroy" then return function() frame:Destroy() frameObj:Remove() end end return frameObj[index] end, __tostring = function() return "Drawing" end }) end function DrawingLib.createScreenGui() local screenGuiObj = ({ IgnoreGuiInset = true, DisplayOrder = 0, ResetOnSpawn = true, ZIndexBehavior = Enum.ZIndexBehavior.Sibling, Enabled = true } + baseDrawingObj) local screenGui = Instance.new("ScreenGui") screenGui.Name = drawingIndex screenGui.IgnoreGuiInset = screenGuiObj.IgnoreGuiInset screenGui.DisplayOrder = screenGuiObj.DisplayOrder screenGui.ResetOnSpawn = screenGuiObj.ResetOnSpawn screenGui.ZIndexBehavior = screenGuiObj.ZIndexBehavior screenGui.Enabled = screenGuiObj.Enabled screenGui.Parent = coreGui return setmetatable({Parent = coreGui}, { __newindex = function(_, index, value) if screenGuiObj[index] == nil then warn("Invalid property: " .. tostring(index)) return end if index == "IgnoreGuiInset" then screenGui.IgnoreGuiInset = value elseif index == "DisplayOrder" then screenGui.DisplayOrder = value elseif index == "ResetOnSpawn" then screenGui.ResetOnSpawn = value elseif index == "ZIndexBehavior" then screenGui.ZIndexBehavior = value elseif index == "Enabled" then screenGui.Enabled = value elseif index == "Parent" then screenGui.Parent = value end screenGuiObj[index] = value end, __index = function(self, index) if index == "Remove" or index == "Destroy" then return function() screenGui:Destroy() screenGuiObj:Remove() end end return screenGuiObj[index] end, __tostring = function() return "Drawing" end }) end function DrawingLib.createTextButton() local buttonObj = ({ Text = "Button", Font = DrawingLib.Fonts.UI, Size = 20, Position = UDim2.new(0, 0, 0, 0), Color = Color3.new(1, 1, 1), BackgroundColor = Color3.new(0.2, 0.2, 0.2), Transparency = 0, Visible = true, ZIndex = 1, MouseButton1Click = nil } + baseDrawingObj) local button = Instance.new("TextButton") button.Name = drawingIndex button.Text = buttonObj.Text button.FontFace = getFontFromIndex(buttonObj.Font) button.TextSize = buttonObj.Size button.Position = buttonObj.Position button.TextColor3 = buttonObj.Color button.BackgroundColor3 = buttonObj.BackgroundColor button.BackgroundTransparency = convertTransparency(buttonObj.Transparency) button.Visible = buttonObj.Visible button.ZIndex = buttonObj.ZIndex button.Parent = drawingUI local buttonEvents = {} return setmetatable({ Parent = drawingUI, Connect = function(_, eventName, callback) if eventName == "MouseButton1Click" then if buttonEvents["MouseButton1Click"] then buttonEvents["MouseButton1Click"]:Disconnect() end buttonEvents["MouseButton1Click"] = button.MouseButton1Click:Connect(callback) else warn("Invalid event: " .. tostring(eventName)) end end }, { __newindex = function(_, index, value) if buttonObj[index] == nil then warn("Invalid property: " .. tostring(index)) return end if index == "Text" then button.Text = value elseif index == "Font" then button.FontFace = getFontFromIndex(math.clamp(value, 0, 3)) elseif index == "Size" then button.TextSize = value elseif index == "Position" then button.Position = value elseif index == "Color" then button.TextColor3 = value elseif index == "BackgroundColor" then button.BackgroundColor3 = value elseif index == "Transparency" then button.BackgroundTransparency = convertTransparency(value) elseif index == "Visible" then button.Visible = value elseif index == "ZIndex" then button.ZIndex = value elseif index == "Parent" then button.Parent = value elseif index == "MouseButton1Click" then if typeof(value) == "function" then if buttonEvents["MouseButton1Click"] then buttonEvents["MouseButton1Click"]:Disconnect() end buttonEvents["MouseButton1Click"] = button.MouseButton1Click:Connect(value) else warn("Invalid value for MouseButton1Click: expected function, got " .. typeof(value)) end end buttonObj[index] = value end, __index = function(self, index) if index == "Remove" or index == "Destroy" then return function() button:Destroy() buttonObj:Remove() end end return buttonObj[index] end, __tostring = function() return "Drawing" end }) end function DrawingLib.createTextLabel() local labelObj = ({ Text = "Label", Font = DrawingLib.Fonts.UI, Size = 20, Position = UDim2.new(0, 0, 0, 0), Color = Color3.new(1, 1, 1), BackgroundColor = Color3.new(0.2, 0.2, 0.2), Transparency = 0, Visible = true, ZIndex = 1 } + baseDrawingObj) local label = Instance.new("TextLabel") label.Name = drawingIndex label.Text = labelObj.Text label.FontFace = getFontFromIndex(labelObj.Font) label.TextSize = labelObj.Size label.Position = labelObj.Position label.TextColor3 = labelObj.Color label.BackgroundColor3 = labelObj.BackgroundColor label.BackgroundTransparency = convertTransparency(labelObj.Transparency) label.Visible = labelObj.Visible label.ZIndex = labelObj.ZIndex label.Parent = drawingUI return setmetatable({Parent = drawingUI}, { __newindex = function(_, index, value) if labelObj[index] == nil then warn("Invalid property: " .. tostring(index)) return end if index == "Text" then label.Text = value elseif index == "Font" then label.FontFace = getFontFromIndex(math.clamp(value, 0, 3)) elseif index == "Size" then label.TextSize = value elseif index == "Position" then label.Position = value elseif index == "Color" then label.TextColor3 = value elseif index == "BackgroundColor" then label.BackgroundColor3 = value elseif index == "Transparency" then label.BackgroundTransparency = convertTransparency(value) elseif index == "Visible" then label.Visible = value elseif index == "ZIndex" then label.ZIndex = value elseif index == "Parent" then label.Parent = value end labelObj[index] = value end, __index = function(self, index) if index == "Remove" or index == "Destroy" then return function() label:Destroy() labelObj:Remove() end end return labelObj[index] end, __tostring = function() return "Drawing" end }) end function DrawingLib.createTextBox() local boxObj = ({ Text = "", Font = DrawingLib.Fonts.UI, Size = 20, Position = UDim2.new(0, 0, 0, 0), Color = Color3.new(1, 1, 1), BackgroundColor = Color3.new(0.2, 0.2, 0.2), Transparency = 0, Visible = true, ZIndex = 1 } + baseDrawingObj) local textBox = Instance.new("TextBox") textBox.Name = drawingIndex textBox.Text = boxObj.Text textBox.FontFace = getFontFromIndex(boxObj.Font) textBox.TextSize = boxObj.Size textBox.Position = boxObj.Position textBox.TextColor3 = boxObj.Color textBox.BackgroundColor3 = boxObj.BackgroundColor textBox.BackgroundTransparency = convertTransparency(boxObj.Transparency) textBox.Visible = boxObj.Visible textBox.ZIndex = boxObj.ZIndex textBox.Parent = drawingUI return setmetatable({Parent = drawingUI}, { __newindex = function(_, index, value) if boxObj[index] == nil then warn("Invalid property: " .. tostring(index)) return end if index == "Text" then textBox.Text = value elseif index == "Font" then textBox.FontFace = getFontFromIndex(math.clamp(value, 0, 3)) elseif index == "Size" then textBox.TextSize = value elseif index == "Position" then textBox.Position = value elseif index == "Color" then textBox.TextColor3 = value elseif index == "BackgroundColor" then textBox.BackgroundColor3 = value elseif index == "Transparency" then textBox.BackgroundTransparency = convertTransparency(value) elseif index == "Visible" then textBox.Visible = value elseif index == "ZIndex" then textBox.ZIndex = value elseif index == "Parent" then textBox.Parent = value end boxObj[index] = value end, __index = function(self, index) if index == "Remove" or index == "Destroy" then return function() textBox:Destroy() boxObj:Remove() end end return boxObj[index] end, __tostring = function() return "Drawing" end }) end local drawingFunctions = {} function drawingFunctions.isrenderobj(drawingObj) local success, isrenderobj = pcall(function() return drawingObj.Parent == drawingUI end) if not success then return false end return isrenderobj end function drawingFunctions.getrenderproperty(drawingObj, property) local success, drawingProperty = pcall(function() return drawingObj[property] end) if not success then return end if drawingProperty ~= nil then return drawingProperty end end function drawingFunctions.setrenderproperty(drawingObj, property, value) assert(drawingFunctions.getrenderproperty(drawingObj, property), "'" .. tostring(property) .. "' is not a valid property of " .. tostring(drawingObj) .. ", " .. tostring(typeof(drawingObj))) drawingObj[property] = value end function drawingFunctions.cleardrawcache() for _, drawing in drawingUI:GetDescendants() do drawing:Remove() end end return {Drawing = DrawingLib, functions = drawingFunctions}