Exunys

Drawing2 by liam0999 (edited)

Jul 15th, 2024 (edited)
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 35.35 KB | None | 0 0
  1. if not LPH_OBFUSCATED then
  2.     LPH_CRASH = function() while true do end end
  3.     LPH_ENCNUM = function(n) return n end
  4.     LPH_ENCSTR = function(s) return s end
  5.     LPH_JIT = function(f) return f end
  6.     LPH_NO_VIRTUALIZE = function(f) return f end
  7.     LPH_NO_UPVALUES = function(f) return f end
  8. end
  9.  
  10. LPH_NO_VIRTUALIZE(function()
  11.  
  12.     assert(getcustomasset, "This enviornment does not support 'getcustomasset'!")
  13.     assert(gethui, "This enviornment does not support 'gethui'!")
  14.     assert(isfolder, "This enviornment does not support 'isfolder'!")
  15.     assert(makefolder, "This enviornment does not support 'makefolder'!")
  16.     assert(isfile, "This enviornment does not support 'isfile'!")
  17.     assert(delfile, "This enviornment does not support 'delfile'!")
  18.     assert(readfile, "This enviornment does not support 'readfile'!")
  19.     assert(writefile, "This enviornment does not support 'writefile'!")
  20.     assert(crypt, "This enviornment does not support 'crypt'!")
  21.  
  22.     if cleardrawcache then
  23.         cleardrawcache()
  24.     end
  25.  
  26.     local env = getgenv and getgenv() or _G
  27.     local cloneref = cloneref or function(v) return v end
  28.     local clonefunction = clonefunction or function(v) return v end
  29.  
  30.     -- // Variables
  31.     local TextService = cloneref(game:GetService("TextService"))
  32.     local HttpService = cloneref(game:GetService("HttpService"))
  33.  
  34.     local HttpGet = clonefunction(game.HttpGet)
  35.     local GetTextBoundsAsync = clonefunction(TextService.GetTextBoundsAsync)
  36.  
  37.     local math = {
  38.         atan2 = clonefunction(math.atan2),
  39.         clamp = clonefunction(math.clamp),
  40.         max = clonefunction(math.max),
  41.         min = clonefunction(math.min),
  42.         pi = math.pi,
  43.         huge = math.huge
  44.     }
  45.  
  46.     local string = {
  47.         format = clonefunction(string.format),
  48.         sub = clonefunction(string.sub)
  49.     }
  50.  
  51.     local UDim2 = {
  52.         new = clonefunction(UDim2.new),
  53.         fromOffset = clonefunction(UDim2.fromOffset),
  54.         fromScale = clonefunction(UDim2.fromScale)
  55.     }
  56.  
  57.     local Vector2 = {
  58.         new = clonefunction(Vector2.new),
  59.         zero = Vector2.zero
  60.     }
  61.  
  62.     local Color3 = {
  63.         new = clonefunction(Color3.new),
  64.     }
  65.  
  66.     -- // Drawing
  67.     local Drawing = {}
  68.  
  69.     Drawing.__CLASSES = {}
  70.     Drawing.__OBJECT_CACHE = {}
  71.     Drawing.__IMAGE_CACHE = {}
  72.  
  73.     Drawing.Font = {
  74.         Count = 0,
  75.         Fonts = {},
  76.         Enums = {}
  77.     }
  78.  
  79.     function Drawing.new(class)
  80.         if not Drawing.__CLASSES[class] then
  81.             error(`Invalid argument #1, expected a valid drawing type`, 2)
  82.         end
  83.  
  84.         return Drawing.__CLASSES[class].new()
  85.     end
  86.  
  87.     function Drawing.Font.new(FontName, FontData)
  88.  
  89.         local FontID = Drawing.Font.Count
  90.         local FontObject
  91.  
  92.         Drawing.Font.Count += 1
  93.         Drawing.Font.Fonts[FontName] = FontID
  94.  
  95.         if string.sub(FontData, 1, 11) == "rbxasset://" then
  96.             FontObject = Font.new(FontData, Enum.FontWeight.Regular, Enum.FontStyle.Normal)
  97.         else
  98.             local TempPath = HttpService:GenerateGUID(false)
  99.  
  100.             if not isfile(FontData) then
  101.                 writefile(`DrawingFontCache/{FontName}.ttf`, crypt.base64.decode(FontData))
  102.                 FontData = `DrawingFontCache/{FontName}.ttf`
  103.             end
  104.        
  105.             writefile(TempPath, HttpService:JSONEncode({
  106.                 ["name"] = FontName,
  107.                 ["faces"] = {
  108.                     {
  109.                         ["name"] = "Regular",
  110.                         ["weight"] = 100,
  111.                         ["style"] = "normal",
  112.                         ["assetId"] = getcustomasset(FontData)
  113.                     }
  114.                 }
  115.             }))
  116.  
  117.             FontObject = Font.new(getcustomasset(TempPath), Enum.FontWeight.Regular, Enum.FontStyle.Normal)
  118.  
  119.             delfile(TempPath)
  120.         end
  121.  
  122.         if not FontObject then
  123.             error("Internal Error while creating new font.", 2)
  124.         end
  125.  
  126.         Drawing.__TEXT_BOUND_PARAMS.Text = "Text"
  127.         Drawing.__TEXT_BOUND_PARAMS.Size = 12
  128.         Drawing.__TEXT_BOUND_PARAMS.Font = FontObject
  129.         Drawing.__TEXT_BOUND_PARAMS.Width = math.huge
  130.  
  131.         GetTextBoundsAsync(TextService, Drawing.__TEXT_BOUND_PARAMS) -- Preload/Cache font for GetTextBoundsAsync to avoid yielding across metamethods
  132.  
  133.         Drawing.Font.Enums[FontID] = FontObject
  134.  
  135.         return FontObject
  136.     end
  137.  
  138.     function Drawing.CreateInstance(class, properties, children)
  139.         local object = Instance.new(class)
  140.  
  141.         for property, value in properties or {} do
  142.             object[property] = value
  143.         end
  144.  
  145.         for idx, child in children or {} do
  146.             child.Parent = object
  147.         end
  148.  
  149.         return object
  150.     end
  151.  
  152.     function Drawing.ClearCache()
  153.         for idx, object in Drawing.__OBJECT_CACHE do
  154.             if rawget(object, "__OBJECT_EXISTS") then
  155.                 object:Remove()
  156.             end
  157.         end
  158.     end
  159.  
  160.     function Drawing.UpdatePosition(object, from, to, thickness)
  161.         local center = (from + to) / 2
  162.         local offset = to - from
  163.  
  164.         object.Position = UDim2.fromOffset(center.X, center.Y)
  165.         object.Size = UDim2.fromOffset(offset.Magnitude, thickness)
  166.         object.Rotation = math.atan2(offset.Y, offset.X) * 180 / math.pi
  167.     end
  168.  
  169.     Drawing.__ROOT = Drawing.CreateInstance("ScreenGui", {
  170.         IgnoreGuiInset = true,
  171.         DisplayOrder = 10,
  172.         Name = HttpService:GenerateGUID(false),
  173.         ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
  174.         Parent = gethui()
  175.     })
  176.  
  177.     Drawing.__TEXT_BOUND_PARAMS = Drawing.CreateInstance("GetTextBoundsParams", { Width = math.huge })
  178.  
  179.     --#region Line
  180.     local Line = {}
  181.  
  182.     Drawing.__CLASSES["Line"] = Line
  183.  
  184.     function Line.new()
  185.         local LineObject = setmetatable({
  186.             __OBJECT_EXISTS = true,
  187.             __PROPERTIES = {
  188.                 Color = Color3.new(0, 0, 0),
  189.                 From = Vector2.zero,
  190.                 To = Vector2.zero,
  191.                 Thickness = 1,
  192.                 Transparency = 1,
  193.                 ZIndex = 0,
  194.                 Visible = false
  195.             },
  196.             __OBJECT = Drawing.CreateInstance("Frame", {
  197.                 AnchorPoint = Vector2.new(0.5, 0.5),
  198.                 BackgroundColor3 = Color3.new(0, 0, 0),
  199.                 Position = UDim2.new(0, 0, 0, 0),
  200.                 Size = UDim2.new(0, 0, 0, 0),
  201.                 BorderSizePixel = 0,
  202.                 ZIndex = 0,
  203.                 Visible = false,
  204.                 Parent = Drawing.__ROOT
  205.             })
  206.         }, Line)
  207.  
  208.         table.insert(Drawing.__OBJECT_CACHE, LineObject)
  209.  
  210.         return LineObject
  211.     end
  212.  
  213.     function Line:__index(property)
  214.         local value = self.__PROPERTIES[property]
  215.  
  216.         if value ~= nil then
  217.             return value
  218.         end
  219.  
  220.         return Line[property]
  221.     end
  222.  
  223.     function Line:__newindex(property, value)
  224.         if not self.__OBJECT_EXISTS then
  225.             return error("Attempt to modify drawing that no longer exists!", 2)
  226.         end
  227.  
  228.         local Properties = self.__PROPERTIES
  229.  
  230.         Properties[property] = value
  231.  
  232.         if property == "Color" then
  233.             self.__OBJECT.BackgroundColor3 = value
  234.         elseif property == "From" then
  235.             Drawing.UpdatePosition(self.__OBJECT, Properties.From, Properties.To, Properties.Thickness)
  236.         elseif property == "To" then
  237.             Drawing.UpdatePosition(self.__OBJECT, Properties.From, Properties.To, Properties.Thickness)
  238.         elseif property == "Thickness" then
  239.             self.__OBJECT.Size = UDim2.fromOffset(self.__OBJECT.AbsoluteSize.X, math.max(value, 1))
  240.         elseif property == "Transparency" then
  241.             self.__OBJECT.Transparency = math.clamp(1 - value, 0, 1)
  242.         elseif property == "Visible" then
  243.             self.__OBJECT.Visible = value
  244.         elseif property == "ZIndex" then
  245.             self.__OBJECT.ZIndex = value
  246.         end
  247.     end
  248.  
  249.     function Line:__iter()
  250.         return next, self.__PROPERTIES
  251.     end
  252.  
  253.     function Line:__tostring()
  254.         return "Drawing"
  255.     end
  256.  
  257.     function Line:Remove()
  258.         self.__OBJECT_EXISTS = false
  259.         self.__OBJECT.Destroy(self.__OBJECT)
  260.         table.remove(Drawing.__OBJECT_CACHE, table.find(Drawing.__OBJECT_CACHE, self))
  261.     end
  262.  
  263.     function Line:Destroy()
  264.         self:Remove()
  265.     end
  266.     --#endregion
  267.  
  268.     --#region Circle
  269.     local Circle = {}
  270.  
  271.     Drawing.__CLASSES["Circle"] = Circle
  272.  
  273.     function Circle.new()
  274.         local CircleObject = setmetatable({
  275.             __OBJECT_EXISTS = true,
  276.             __PROPERTIES = {
  277.                 Color = Color3.new(0, 0, 0),
  278.                 Position = Vector2.new(0, 0),
  279.                 NumSides = 0,
  280.                 Radius = 0,
  281.                 Thickness = 1,
  282.                 Transparency = 1,
  283.                 ZIndex = 0,
  284.                 Filled = false,
  285.                 Visible = false
  286.             },
  287.             __OBJECT = Drawing.CreateInstance("Frame", {
  288.                 AnchorPoint = Vector2.new(0.5, 0.5),
  289.                 BackgroundColor3 = Color3.new(0, 0, 0),
  290.                 Position = UDim2.new(0, 0, 0, 0),
  291.                 Size = UDim2.new(0, 0, 0, 0),
  292.                 BorderSizePixel = 0,
  293.                 BackgroundTransparency = 1,
  294.                 ZIndex = 0,
  295.                 Visible = false,
  296.                 Parent = Drawing.__ROOT
  297.             }, {
  298.                 Drawing.CreateInstance("UICorner", {
  299.                     Name = "_CORNER",
  300.                     CornerRadius = UDim.new(1, 0)
  301.                 }),
  302.                 Drawing.CreateInstance("UIStroke", {
  303.                     Name = "_STROKE",
  304.                     Color = Color3.new(0, 0, 0),
  305.                     Thickness = 1
  306.                 })
  307.             }),
  308.         }, Circle)
  309.  
  310.         table.insert(Drawing.__OBJECT_CACHE, CircleObject)
  311.  
  312.         return CircleObject
  313.     end
  314.  
  315.     function Circle:__index(property)
  316.         local value = self.__PROPERTIES[property]
  317.  
  318.         if value ~= nil then
  319.             return value
  320.         end
  321.  
  322.         return Circle[property]
  323.     end
  324.  
  325.     function Circle:__newindex(property, value)
  326.         if not self.__OBJECT_EXISTS then
  327.             return error("Attempt to modify drawing that no longer exists!", 2)
  328.         end
  329.  
  330.         local Properties = self.__PROPERTIES
  331.  
  332.         Properties[property] = value
  333.  
  334.         if property == "Color" then
  335.             self.__OBJECT.BackgroundColor3 = value
  336.             self.__OBJECT._STROKE.Color = value
  337.         elseif property == "Filled" then
  338.             self.__OBJECT.BackgroundTransparency = value and 1 - Properties.Transparency or 1
  339.         elseif property == "Position" then
  340.             self.__OBJECT.Position = UDim2.fromOffset(value.X, value.Y)
  341.         elseif property == "Radius" then
  342.             self:__UPDATE_RADIUS()
  343.         elseif property == "Thickness" then
  344.             self:__UPDATE_RADIUS()
  345.         elseif property == "Transparency" then
  346.             self.__OBJECT._STROKE.Transparency = math.clamp(1 - value, 0, 1)
  347.             self.__OBJECT.Transparency = Properties.Filled and math.clamp(1 - value, 0, 1) or self.__OBJECT.Transparency
  348.         elseif property == "Visible" then
  349.             self.__OBJECT.Visible = value
  350.         elseif property == "ZIndex" then
  351.             self.__OBJECT.ZIndex = value
  352.         end
  353.     end
  354.  
  355.     function Circle:__iter()
  356.         return next, self.__PROPERTIES
  357.     end
  358.  
  359.     function Circle:__tostring()
  360.         return "Drawing"
  361.     end
  362.  
  363.     function Circle:__UPDATE_RADIUS()
  364.         local diameter = (self.__PROPERTIES.Radius * 2) - (self.__PROPERTIES.Thickness * 2)
  365.         self.__OBJECT.Size = UDim2.fromOffset(diameter, diameter)
  366.     end
  367.  
  368.     function Circle:Remove()
  369.         self.__OBJECT_EXISTS = false
  370.         self.__OBJECT.Destroy(self.__OBJECT)
  371.         table.remove(Drawing.__OBJECT_CACHE, table.find(Drawing.__OBJECT_CACHE, self))
  372.     end
  373.  
  374.     function Circle:Destroy()
  375.         self:Remove()
  376.     end
  377.     --#endregion
  378.  
  379.     --#region Text
  380.     local Text = {}
  381.  
  382.     Drawing.__CLASSES["Text"] = Text
  383.  
  384.     function Text.new()
  385.         local TextObject = setmetatable({
  386.             __OBJECT_EXISTS = true,
  387.             __PROPERTIES = {
  388.                 Color = Color3.new(1, 1, 1),
  389.                 OutlineColor = Color3.new(0, 0, 0),
  390.                 Position = Vector2.new(0, 0),
  391.                 TextBounds = Vector2.new(0, 0),
  392.                 Text = "",
  393.                 Font = Drawing.Font.Enums[2],
  394.                 Size = 13,
  395.                 Transparency = 1,
  396.                 ZIndex = 0,
  397.                 Center = false,
  398.                 Outline = false,
  399.                 Visible = false
  400.             },
  401.             __OBJECT = Drawing.CreateInstance("TextLabel", {
  402.                 TextColor3 = Color3.new(1, 1, 1),
  403.                 Position = UDim2.new(0, 0, 0, 0),
  404.                 Size = UDim2.new(0, 0, 0, 0),
  405.                 TextXAlignment = Enum.TextXAlignment.Left,
  406.                 TextYAlignment = Enum.TextYAlignment.Top,
  407.                 FontFace = Drawing.Font.Enums[1],
  408.                 TextSize = 12,
  409.                 BackgroundTransparency = 1,
  410.                 ZIndex = 0,
  411.                 Visible = false,
  412.                 Parent = Drawing.__ROOT
  413.             }, {
  414.                 Drawing.CreateInstance("UIStroke", {
  415.                     Name = "_STROKE",
  416.                     Color = Color3.new(0, 0, 0),
  417.                     LineJoinMode = Enum.LineJoinMode.Miter,
  418.                     Enabled = false,
  419.                     Thickness = 1
  420.                 })
  421.             })
  422.         }, Text)
  423.  
  424.         table.insert(Drawing.__OBJECT_CACHE, TextObject)
  425.  
  426.         return TextObject
  427.     end
  428.  
  429.     function Text:__index(property)
  430.         local value = self.__PROPERTIES[property]
  431.  
  432.         if value ~= nil then
  433.             return value
  434.         end
  435.  
  436.         return Text[property]
  437.     end
  438.  
  439.     function Text:__newindex(property, value)
  440.         if not self.__OBJECT_EXISTS then
  441.             return error("Attempt to modify drawing that no longer exists!", 2)
  442.         end
  443.  
  444.         if value == "TextBounds" then
  445.             error("Attempt to modify read-only property", 2)
  446.         end
  447.  
  448.         local Properties = self.__PROPERTIES
  449.  
  450.         Properties[property] = value
  451.  
  452.         if property == "Color" then
  453.             self.__OBJECT.TextColor3 = value
  454.         elseif property == "Position" then
  455.             self.__OBJECT.Position = UDim2.fromOffset(value.X, value.Y)
  456.         elseif property == "Size" then
  457.             self.__OBJECT.TextSize = value - 1
  458.             self:_UPDATE_TEXT_BOUNDS()
  459.         elseif property == "Text" then
  460.             self.__OBJECT.Text = value
  461.             self:_UPDATE_TEXT_BOUNDS()
  462.         elseif property == "Font" then
  463.             if type(value) == "string" then
  464.                 value = Drawing.Font.Enums[Drawing.Font.Fonts[value]]
  465.             elseif type(value) == "number" then
  466.                 value = Drawing.Font.Enums[value]
  467.             end
  468.  
  469.             Properties.Font = value
  470.  
  471.             self.__OBJECT.FontFace = value
  472.             self:_UPDATE_TEXT_BOUNDS()
  473.         elseif property == "Outline" then
  474.             self.__OBJECT._STROKE.Enabled = value
  475.         elseif property == "OutlineColor" then
  476.             self.__OBJECT._STROKE.Color = value
  477.         elseif property == "Center" then
  478.             self.__OBJECT.TextXAlignment = value and Enum.TextXAlignment.Center or Enum.TextXAlignment.Left
  479.         elseif property == "Transparency" then
  480.             self.__OBJECT.Transparency = math.clamp(1 - value, 0, 1)
  481.         elseif property == "Visible" then
  482.             self.__OBJECT.Visible = value
  483.         elseif property == "ZIndex" then
  484.             self.__OBJECT.ZIndex = value
  485.         end
  486.     end
  487.  
  488.     function Text:__iter()
  489.         return next, self.__PROPERTIES
  490.     end
  491.  
  492.     function Text:__tostring()
  493.         return "Drawing"
  494.     end
  495.  
  496.     function Text:_UPDATE_TEXT_BOUNDS()
  497.         local Properties = self.__PROPERTIES
  498.  
  499.         Drawing.__TEXT_BOUND_PARAMS.Text = Properties.Text
  500.         Drawing.__TEXT_BOUND_PARAMS.Size = Properties.Size - 1
  501.         Drawing.__TEXT_BOUND_PARAMS.Font = Properties.Font
  502.         Drawing.__TEXT_BOUND_PARAMS.Width = math.huge
  503.  
  504.         Properties.TextBounds = GetTextBoundsAsync(TextService, Drawing.__TEXT_BOUND_PARAMS)
  505.     end
  506.  
  507.     function Text:Remove()
  508.         self.__OBJECT_EXISTS = false
  509.         self.__OBJECT.Destroy(self.__OBJECT)
  510.         table.remove(Drawing.__OBJECT_CACHE, table.find(Drawing.__OBJECT_CACHE, self))
  511.     end
  512.  
  513.     function Text:Destroy()
  514.         self:Remove()
  515.     end
  516.     --#endregion
  517.  
  518.     --#region Square
  519.     local Square = {}
  520.  
  521.     Drawing.__CLASSES["Square"] = Square
  522.  
  523.     function Square.new()
  524.         local SquareObject = setmetatable({
  525.             __OBJECT_EXISTS = true,
  526.             __PROPERTIES = {
  527.                 Color = Color3.new(0, 0, 0),
  528.                 Position = Vector2.new(0, 0),
  529.                 Size = Vector2.new(0, 0),
  530.                 Rounding = 0,
  531.                 Thickness = 0,
  532.                 Transparency = 1,
  533.                 ZIndex = 0,
  534.                 Filled = false,
  535.                 Visible = false
  536.             },
  537.             __OBJECT = Drawing.CreateInstance("Frame", {
  538.                 Position = UDim2.new(0, 0, 0, 0),
  539.                 Size = UDim2.new(0, 0, 0, 0),
  540.                 BackgroundColor3 = Color3.new(0, 0, 0),
  541.                 BackgroundTransparency = 1,
  542.                 BorderSizePixel = 0,
  543.                 ZIndex = 0,
  544.                 Visible = false,
  545.                 Parent = Drawing.__ROOT
  546.             }, {
  547.                 Drawing.CreateInstance("UIStroke", {
  548.                     Name = "_STROKE",
  549.                     Color = Color3.new(0, 0, 0),
  550.                     LineJoinMode = Enum.LineJoinMode.Miter,
  551.                     Thickness = 1
  552.                 }),
  553.                 Drawing.CreateInstance("UICorner", {
  554.                     Name = "_CORNER",
  555.                     CornerRadius = UDim.new(0, 0)
  556.                 })
  557.             })
  558.         }, Square)
  559.  
  560.         table.insert(Drawing.__OBJECT_CACHE, SquareObject)
  561.  
  562.         return SquareObject
  563.     end
  564.  
  565.     function Square:__index(property)
  566.         local value = self.__PROPERTIES[property]
  567.  
  568.         if value ~= nil then
  569.             return value
  570.         end
  571.  
  572.         return Square[property]
  573.     end
  574.  
  575.     function Square:__newindex(property, value)
  576.         if not self.__OBJECT_EXISTS then
  577.             return error("Attempt to modify drawing that no longer exists!", 2)
  578.         end
  579.  
  580.         local Properties = self.__PROPERTIES
  581.  
  582.         Properties[property] = value
  583.  
  584.         if property == "Color" then
  585.             self.__OBJECT.BackgroundColor3 = value
  586.             self.__OBJECT._STROKE.Color = value
  587.         elseif property == "Position" then
  588.             self:__UPDATE_SCALE()
  589.         elseif property == "Size" then
  590.             self:__UPDATE_SCALE()
  591.         elseif property == "Thickness" then
  592.             self.__OBJECT._STROKE.Thickness = value
  593.             self.__OBJECT._STROKE.Enabled = not Properties.Filled
  594.             self:__UPDATE_SCALE()
  595.         elseif property == "Rounding" then
  596.             self.__OBJECT._CORNER.CornerRadius = UDim.new(0, value)
  597.         elseif property == "Filled" then
  598.             self.__OBJECT._STROKE.Enabled = not value
  599.             self.__OBJECT.BackgroundTransparency = value and 1 - Properties.Transparency or 1
  600.         elseif property == "Transparency" then
  601.             self.__OBJECT.Transparency = math.clamp(1 - value, 0, 1)
  602.         elseif property == "Visible" then
  603.             self.__OBJECT.Visible = value
  604.         elseif property == "ZIndex" then
  605.             self.__OBJECT.ZIndex = value
  606.         end
  607.     end
  608.  
  609.     function Square:__iter()
  610.         return next, self.__PROPERTIES
  611.     end
  612.  
  613.     function Square:__tostring()
  614.         return "Drawing"
  615.     end
  616.  
  617.     function Square:__UPDATE_SCALE()
  618.         local Properties = self.__PROPERTIES
  619.  
  620.         self.__OBJECT.Position = UDim2.fromOffset(Properties.Position.X + Properties.Thickness, Properties.Position.Y + Properties.Thickness)
  621.         self.__OBJECT.Size = UDim2.fromOffset(Properties.Size.X - Properties.Thickness * 2, Properties.Size.Y - Properties.Thickness * 2)
  622.     end
  623.  
  624.     function Square:Remove()
  625.         self.__OBJECT_EXISTS = false
  626.         self.__OBJECT.Destroy(self.__OBJECT)
  627.         table.remove(Drawing.__OBJECT_CACHE, table.find(Drawing.__OBJECT_CACHE, self))
  628.     end
  629.  
  630.     function Square:Destroy()
  631.         self:Remove()
  632.     end
  633.     --#endregion
  634.  
  635.     --#region Image
  636.     local Image = {}
  637.  
  638.     Drawing.__CLASSES["Image"] = Image
  639.  
  640.     function Image.new()
  641.         local ImageObject = setmetatable({
  642.             __OBJECT_EXISTS = true,
  643.             __PROPERTIES = {
  644.                 Color = Color3.new(0, 0, 0),
  645.                 Position = Vector2.new(0, 0),
  646.                 Size = Vector2.new(0, 0),
  647.                 Data = "",
  648.                 Uri = "",
  649.                 Thickness = 0,
  650.                 Transparency = 1,
  651.                 ZIndex = 0,
  652.                 Filled = false,
  653.                 Visible = false
  654.             },
  655.             __OBJECT = Drawing.CreateInstance("ImageLabel", {
  656.                 Position = UDim2.new(0, 0, 0, 0),
  657.                 Size = UDim2.new(0, 0, 0, 0),
  658.                 BackgroundColor3 = Color3.new(0, 0, 0),
  659.                 Image = "",
  660.                 BackgroundTransparency = 1,
  661.                 BorderSizePixel = 0,
  662.                 ZIndex = 0,
  663.                 Visible = false,
  664.                 Parent = Drawing.__ROOT
  665.             }, {
  666.                 Drawing.CreateInstance("UICorner", {
  667.                     Name = "_CORNER",
  668.                     CornerRadius = UDim.new(0, 0)
  669.                 })
  670.             })
  671.         }, Image)
  672.  
  673.         table.insert(Drawing.__OBJECT_CACHE, ImageObject)
  674.  
  675.         return ImageObject
  676.     end
  677.  
  678.     function Image:__index(property)
  679.         local value = self.__PROPERTIES[property]
  680.  
  681.         if value ~= nil then
  682.             return value
  683.         end
  684.  
  685.         return Image[property]
  686.     end
  687.  
  688.     function Image:__newindex(property, value)
  689.         if not self.__OBJECT_EXISTS then
  690.             return error("Attempt to modify drawing that no longer exists!", 2)
  691.         end
  692.  
  693.         local Properties = self.__PROPERTIES
  694.  
  695.         Properties[property] = value
  696.  
  697.         if property == "Data" then
  698.             self:__SET_IMAGE(value)
  699.         elseif property == "Uri" then
  700.             self:__SET_IMAGE(value, true)
  701.         elseif property == "Rounding" then
  702.             self.__OBJECT._CORNER.CornerRadius = UDim.new(0, value)
  703.         elseif property == "Color" then
  704.             self.__OBJECT.ImageColor3 = value
  705.         elseif property == "Position" then
  706.             self.__OBJECT.Position = UDim2.fromOffset(value.X, value.Y)
  707.         elseif property == "Size" then
  708.             self.__OBJECT.Size = UDim2.fromOffset(value.X, value.Y)
  709.         elseif property == "Transparency" then
  710.             self.__OBJECT.ImageTransparency = math.clamp(1 - value, 0, 1)
  711.         elseif property == "Visible" then
  712.             self.__OBJECT.Visible = value
  713.         elseif property == "ZIndex" then
  714.             self.__OBJECT.ZIndex = value
  715.         end
  716.     end
  717.  
  718.     function Image:__iter()
  719.         return next, self.__PROPERTIES
  720.     end
  721.  
  722.     function Image:__tostring()
  723.         return "Drawing"
  724.     end
  725.  
  726.     function Image:__SET_IMAGE(data, isUri)
  727.         task.spawn(function()
  728.             if isUri then
  729.                 data = HttpGet(game, data, true)
  730.             end
  731.  
  732.             if not Drawing.__IMAGE_CACHE[data] then
  733.                 local TempPath = HttpService:GenerateGUID(false)
  734.  
  735.                 writefile(TempPath, data)
  736.                 Drawing.__IMAGE_CACHE[data] = getcustomasset(TempPath)
  737.                 delfile(TempPath)
  738.             end
  739.  
  740.             self.__PROPERTIES.Data = Drawing.__IMAGE_CACHE[data]
  741.             self.__OBJECT.Image = Drawing.__IMAGE_CACHE[data]
  742.         end)
  743.     end
  744.  
  745.     function Image:Remove()
  746.         self.__OBJECT_EXISTS = false
  747.         self.__OBJECT.Destroy(self.__OBJECT)
  748.         table.remove(Drawing.__OBJECT_CACHE, table.find(Drawing.__OBJECT_CACHE, self))
  749.     end
  750.  
  751.     function Image:Destroy()
  752.         self:Remove()
  753.     end
  754.     --#endregion
  755.  
  756.     --#region Triangle
  757.     local Triangle = {}
  758.  
  759.     Drawing.__CLASSES["Triangle"] = Triangle
  760.  
  761.     function Triangle.new()
  762.         local TriangleObject = setmetatable({
  763.             __OBJECT_EXISTS = true,
  764.             __PROPERTIES = {
  765.                 Color = Color3.new(0, 0, 0),
  766.                 PointA = Vector2.new(0, 0),
  767.                 PointB = Vector2.new(0, 0),
  768.                 PointC = Vector2.new(0, 0),
  769.                 Thickness = 1,
  770.                 Transparency = 1,
  771.                 ZIndex = 0,
  772.                 Filled = false,
  773.                 Visible = false
  774.             },
  775.             __OBJECT = Drawing.CreateInstance("Frame", {
  776.                 Size = UDim2.new(1, 0, 1, 0),
  777.                 BackgroundTransparency = 1,
  778.                 ZIndex = 0,
  779.                 Visible = false,
  780.                 Parent = Drawing.__ROOT
  781.             }, {
  782.                 Drawing.CreateInstance("Frame", {
  783.                     Name = "_A",
  784.                     Position = UDim2.new(0, 0, 0, 0),
  785.                     Size = UDim2.new(0, 0, 0, 0),
  786.                     AnchorPoint = Vector2.new(0.5, 0.5),
  787.                     BackgroundColor3 = Color3.new(0, 0, 0),
  788.                     BorderSizePixel = 0,
  789.                     ZIndex = 0
  790.                 }),
  791.                 Drawing.CreateInstance("Frame", {
  792.                     Name = "_B",
  793.                     Position = UDim2.new(0, 0, 0, 0),
  794.                     Size = UDim2.new(0, 0, 0, 0),
  795.                     AnchorPoint = Vector2.new(0.5, 0.5),
  796.                     BackgroundColor3 = Color3.new(0, 0, 0),
  797.                     BorderSizePixel = 0,
  798.                     ZIndex = 0
  799.                 }),
  800.                 Drawing.CreateInstance("Frame", {
  801.                     Name = "_C",
  802.                     Position = UDim2.new(0, 0, 0, 0),
  803.                     Size = UDim2.new(0, 0, 0, 0),
  804.                     AnchorPoint = Vector2.new(0.5, 0.5),
  805.                     BackgroundColor3 = Color3.new(0, 0, 0),
  806.                     BorderSizePixel = 0,
  807.                     ZIndex = 0
  808.                 })
  809.             })
  810.         }, Triangle)
  811.  
  812.         table.insert(Drawing.__OBJECT_CACHE, TriangleObject)
  813.  
  814.         return TriangleObject
  815.     end
  816.  
  817.     function Triangle:__index(property)
  818.         local value = self.__PROPERTIES[property]
  819.  
  820.         if value ~= nil then
  821.             return value
  822.         end
  823.  
  824.         return Triangle[property]
  825.     end
  826.  
  827.     function Triangle:__newindex(property, value)
  828.         if not self.__OBJECT_EXISTS then
  829.             return error("Attempt to modify drawing that no longer exists!", 2)
  830.         end
  831.  
  832.         local Properties, Object = self.__PROPERTIES, self.__OBJECT
  833.  
  834.         Properties[property] = value
  835.  
  836.         if property == "Color" then
  837.             Object._A.BackgroundColor3 = value
  838.             Object._B.BackgroundColor3 = value
  839.             Object._C.BackgroundColor3 = value
  840.         elseif property == "Transparency" then
  841.             Object._A.BackgroundTransparency = 1 - values
  842.             Object._B.BackgroundTransparency = 1 - values
  843.             Object._C.BackgroundTransparency = 1 - values
  844.         elseif property == "Thickness" then
  845.             Object._A.BackgroundColor3 = UDim2.fromOffset(Object._A.AbsoluteSize.X, math.max(value, 1));
  846.             Object._B.BackgroundColor3 = UDim2.fromOffset(Object._B.AbsoluteSize.X, math.max(value, 1));
  847.             Object._C.BackgroundColor3 = UDim2.fromOffset(Object._C.AbsoluteSize.X, math.max(value, 1));
  848.         elseif property == "PointA" then
  849.             self:__UPDATE_VERTICIES({
  850.                 { Object._A, Properties.PointA, Properties.PointB },
  851.                 { Object._C, Properties.PointC, Properties.PointA }
  852.             })
  853.         elseif property == "PointB" then
  854.             self:__UPDATE_VERTICIES({
  855.                 { Object._A, Properties.PointA, Properties.PointB },
  856.                 { Object._B, Properties.PointB, Properties.PointC }
  857.             })
  858.         elseif property == "PointC" then
  859.             self:__UPDATE_VERTICIES({
  860.                 { Object._B, Properties.PointB, Properties.PointC },
  861.                 { Object._C, Properties.PointC, Properties.PointA }
  862.             })
  863.         elseif property == "Visible" then
  864.             Object.Visible = value
  865.         elseif property == "ZIndex" then
  866.             Object.ZIndex = value
  867.         end
  868.     end
  869.  
  870.     function Triangle:__iter()
  871.         return next, self.__PROPERTIES
  872.     end
  873.  
  874.     function Triangle:__tostring()
  875.         return "Drawing"
  876.     end
  877.  
  878.     function Triangle:__UPDATE_VERTICIES(verticies)
  879.         local thickness = self.__PROPERTIES.Thickness
  880.  
  881.         for idx, verticy in verticies do
  882.             Drawing.UpdatePosition(verticy[1], verticy[2], verticy[3], thickness)
  883.         end
  884.     end
  885.  
  886.     function Triangle:Remove()
  887.         self.__OBJECT_EXISTS = false
  888.         self.__OBJECT.Destroy(self.__OBJECT)
  889.         table.remove(Drawing.__OBJECT_CACHE, table.find(Drawing.__OBJECT_CACHE, self))
  890.     end
  891.  
  892.     function Triangle:Destroy()
  893.         self:Remove()
  894.     end
  895.     --#endregion
  896.  
  897.     --#region Quad
  898.     local Quad = {}
  899.  
  900.     Drawing.__CLASSES["Quad"] = Quad
  901.  
  902.     function Quad.new()
  903.         local QuadObject = setmetatable({
  904.             __OBJECT_EXISTS = true,
  905.             __PROPERTIES = {
  906.                 Color = Color3.new(0, 0, 0),
  907.                 PointA = Vector2.new(0, 0),
  908.                 PointB = Vector2.new(0, 0),
  909.                 PointC = Vector2.new(0, 0),
  910.                 PointD = Vector2.new(0, 0),
  911.                 Thickness = 1,
  912.                 Transparency = 1,
  913.                 ZIndex = 0,
  914.                 Filled = false,
  915.                 Visible = false
  916.             },
  917.             __OBJECT = Drawing.CreateInstance("Frame", {
  918.                 Size = UDim2.new(1, 0, 1, 0),
  919.                 BackgroundTransparency = 1,
  920.                 ZIndex = 0,
  921.                 Visible = false,
  922.                 Parent = Drawing.__ROOT
  923.             }, {
  924.                 Drawing.CreateInstance("Frame", {
  925.                     Name = "_A",
  926.                     Position = UDim2.new(0, 0, 0, 0),
  927.                     Size = UDim2.new(0, 0, 0, 0),
  928.                     AnchorPoint = Vector2.new(0.5, 0.5),
  929.                     BackgroundColor3 = Color3.new(0, 0, 0),
  930.                     BorderSizePixel = 0,
  931.                     ZIndex = 0
  932.                 }),
  933.                 Drawing.CreateInstance("Frame", {
  934.                     Name = "_B",
  935.                     Position = UDim2.new(0, 0, 0, 0),
  936.                     Size = UDim2.new(0, 0, 0, 0),
  937.                     AnchorPoint = Vector2.new(0.5, 0.5),
  938.                     BackgroundColor3 = Color3.new(0, 0, 0),
  939.                     BorderSizePixel = 0,
  940.                     ZIndex = 0
  941.                 }),
  942.                 Drawing.CreateInstance("Frame", {
  943.                     Name = "_C",
  944.                     Position = UDim2.new(0, 0, 0, 0),
  945.                     Size = UDim2.new(0, 0, 0, 0),
  946.                     AnchorPoint = Vector2.new(0.5, 0.5),
  947.                     BackgroundColor3 = Color3.new(0, 0, 0),
  948.                     BorderSizePixel = 0,
  949.                     ZIndex = 0
  950.                 }),
  951.                 Drawing.CreateInstance("Frame", {
  952.                     Name = "_D",
  953.                     Position = UDim2.new(0, 0, 0, 0),
  954.                     Size = UDim2.new(0, 0, 0, 0),
  955.                     AnchorPoint = Vector2.new(0.5, 0.5),
  956.                     BackgroundColor3 = Color3.new(0, 0, 0),
  957.                     BorderSizePixel = 0,
  958.                     ZIndex = 0
  959.                 })
  960.             })
  961.         }, Quad)
  962.  
  963.         table.insert(Drawing.__OBJECT_CACHE, QuadObject)
  964.  
  965.         return QuadObject
  966.     end
  967.  
  968.     function Quad:__index(property)
  969.         local value = self.__PROPERTIES[property]
  970.  
  971.         if value ~= nil then
  972.             return value
  973.         end
  974.  
  975.         return Quad[property]
  976.     end
  977.  
  978.     function Quad:__newindex(property, value)
  979.         if not self.__OBJECT_EXISTS then
  980.             return error("Attempt to modify drawing that no longer exists!", 2)
  981.         end
  982.  
  983.         local Properties, Object = self.__PROPERTIES, self.__OBJECT
  984.  
  985.         Properties[property] = value
  986.  
  987.         if property == "Color" then
  988.             Object._A.BackgroundColor3 = value
  989.             Object._B.BackgroundColor3 = value
  990.             Object._C.BackgroundColor3 = value
  991.             Object._D.BackgroundColor3 = value
  992.         elseif property == "Transparency" then
  993.             Object._A.BackgroundTransparency = 1 - values
  994.             Object._B.BackgroundTransparency = 1 - values
  995.             Object._C.BackgroundTransparency = 1 - values
  996.             Object._D.BackgroundTransparency = 1 - values
  997.         elseif property == "Thickness" then
  998.             Object._A.BackgroundColor3 = UDim2.fromOffset(Object._A.AbsoluteSize.X, math.max(value, 1));
  999.             Object._B.BackgroundColor3 = UDim2.fromOffset(Object._B.AbsoluteSize.X, math.max(value, 1));
  1000.             Object._C.BackgroundColor3 = UDim2.fromOffset(Object._C.AbsoluteSize.X, math.max(value, 1));
  1001.             Object._D.BackgroundColor3 = UDim2.fromOffset(Object._D.AbsoluteSize.X, math.max(value, 1));
  1002.         elseif property == "PointA" then
  1003.             self:__UPDATE_VERTICIES({
  1004.                 { Object._A, Properties.PointA, Properties.PointB },
  1005.                 { Object._D, Properties.PointD, Properties.PointA }
  1006.             })
  1007.         elseif property == "PointB" then
  1008.             self:__UPDATE_VERTICIES({
  1009.                 { Object._A, Properties.PointA, Properties.PointB },
  1010.                 { Object._B, Properties.PointB, Properties.PointC }
  1011.             })
  1012.         elseif property == "PointC" then
  1013.             self:__UPDATE_VERTICIES({
  1014.                 { Object._B, Properties.PointB, Properties.PointC },
  1015.                 { Object._C, Properties.PointC, Properties.PointD }
  1016.             })
  1017.         elseif property == "PointD" then
  1018.             self:__UPDATE_VERTICIES({
  1019.                 { Object._C, Properties.PointC, Properties.PointD },
  1020.                 { Object._D, Properties.PointD, Properties.PointA }
  1021.             })
  1022.         elseif property == "Visible" then
  1023.             Object.Visible = value
  1024.         elseif property == "ZIndex" then
  1025.             Object.ZIndex = value
  1026.         end
  1027.     end
  1028.  
  1029.     function Quad:__iter()
  1030.         return next, self.__PROPERTIES
  1031.     end
  1032.  
  1033.     function Quad:__tostring()
  1034.         return "Drawing"
  1035.     end
  1036.  
  1037.     function Quad:__UPDATE_VERTICIES(verticies)
  1038.         local thickness = self.__PROPERTIES.Thickness
  1039.  
  1040.         for idx, verticy in verticies do
  1041.             Drawing.UpdatePosition(verticy[1], verticy[2], verticy[3], thickness)
  1042.         end
  1043.     end
  1044.  
  1045.     function Quad:Remove()
  1046.         self.__OBJECT_EXISTS = false
  1047.         self.__OBJECT.Destroy(self.__OBJECT)
  1048.         table.remove(Drawing.__OBJECT_CACHE, table.find(Drawing.__OBJECT_CACHE, self))
  1049.     end
  1050.  
  1051.     function Quad:Destroy()
  1052.         self:Remove()
  1053.     end
  1054.     --#endregion
  1055.  
  1056.     if not isfolder("DrawingFontCache") then
  1057.         makefolder("DrawingFontCache")
  1058.     end
  1059.  
  1060.     Drawing.Font.new("UI", "rbxasset://fonts/families/Arial.json")
  1061.     Drawing.Font.new("System", "rbxasset://fonts/families/HighwayGothic.json")
  1062.     Drawing.Font.new("Plex", "rbxasset://fonts/families/SourceSansPro.json")
  1063.     Drawing.Font.new("Monospace", "rbxasset://fonts/families/RobotoMono.json")
  1064.  
  1065.     env.Drawing = Drawing
  1066.     env.cleardrawcache = Drawing.ClearCache
  1067. end)()
Add Comment
Please, Sign In to add comment