Lua Script for Game Drawing Functions
Lua Script for Game Drawing Functions
local bit = {
badd = newcclosure(function(a, b)
return a + b
end),
bsub = newcclosure(function(a, b)
return a - b
end),
bmul = newcclosure(function(a, b)
return a * b
end),
bdiv = newcclosure(function(a, b)
return [Link](a, b)
end),
tobit = newcclosure(function(a)
a = a % (2 ^ 32)
if a >= 0x80000000 then
a = a - (2 ^ 32)
end
return a
end),
bswap = newcclosure(function(a)
a = a % (2 ^ 32)
local b = [Link](a, 0xff)
a = [Link](a, 8)
local c = [Link](a, 0xff)
a = [Link](a, 8)
local d = [Link](a, 0xff)
a = [Link](a, 8)
return [Link]([Link]([Link]([Link](b, 8) + c, 8) +
d, 8) + [Link](a, 0xff))
end),
ror = newcclosure(function(a, b)
return [Link]([Link](a % 2 ^ 32, b % 32))
end),
rol = newcclosure(function(a, b)
return [Link]([Link](a % 2 ^ 32, b % 32))
end),
tohex = newcclosure(function(num)
local hex = [Link]("%08x", [Link](num))
return hex
end),
}
for i, v in bit32 do
bit[i] = v
end
getgenv().bit = bit
setreadonly(bit, true);
local drawing = {
Fonts = {
UI = 0,
System = 1,
Plex = 2,
Monospace = 3
}
};
local pi = [Link];
local huge = [Link];
do -- This may look completely useless, but it allows TextBounds to update without
yielding and therefore breaking the metamethods.
local fonts = {
[Link]("rbxasset://fonts/families/[Link]",
[Link], [Link]),
[Link]("rbxasset://fonts/families/[Link]",
[Link], [Link]),
[Link]("rbxasset://fonts/families/[Link]",
[Link], [Link]),
[Link]("rbxasset://fonts/families/[Link]",
[Link], [Link])
};
for i, v in fonts do
game:GetService("TextService"):GetTextBoundsAsync(create("GetTextBoundsParams", {
Text = "Hi",
Size = 12,
Font = v,
Width = huge
}));
end
end
do
local drawingDirectory = create("ScreenGui", {
DisplayOrder = 15,
IgnoreGuiInset = true,
Name = "drawingDirectory",
Parent = gethui(),
ZIndexBehavior = [Link]
});
local itemCounter = 0;
local cache = {};
function [Link]()
itemCounter = itemCounter + 1;
local id = itemCounter;
cache[id] = newLine;
return newLine;
end
function line:__index(k)
local prop = self._properties[k];
if prop ~= nil then
return prop;
end
return line[k];
end
function line:__newindex(k, v)
if self.__OBJECT_EXISTS == true then
self._properties[k] = v;
if k == "Color" then
self._frame.BackgroundColor3 = v;
elseif k == "From" then
self:_updatePosition();
elseif k == "Thickness" then
self._frame.Size = _udim2fromoffset(self._frame.AbsoluteSize.X,
_mathmax(v, 1));
elseif k == "To" then
self:_updatePosition();
elseif k == "Transparency" then
self._frame.BackgroundTransparency = _mathclamp(1 - v, 0, 1);
elseif k == "Visible" then
self._frame.Visible = v;
elseif k == "ZIndex" then
self._frame.ZIndex = v;
end
end
end
function line:__iter()
return next, self._properties;
end
function line:__tostring()
return "Drawing";
end
function line:Destroy()
cache[self._id] = nil;
self.__OBJECT_EXISTS = false;
_destroy(self._frame);
end
function line:_updatePosition()
local props = self._properties;
updatePosition(self._frame, [Link], [Link],
[Link]);
end
[Link] = [Link];
[Link] = line;
end
do
local circle = {};
function [Link]()
itemCounter = itemCounter + 1;
local id = itemCounter;
cache[id] = newCircle;
return newCircle;
end
function circle:__index(k)
local prop = self._properties[k];
if prop ~= nil then
return prop;
end
return circle[k];
end
function circle:__newindex(k, v)
if self.__OBJECT_EXISTS == true then
local props = self._properties;
props[k] = v;
if k == "Color" then
self._frame.BackgroundColor3 = v;
self._frame._stroke.Color = v;
elseif k == "Filled" then
self._frame.BackgroundTransparency = v and 1 -
[Link] or 1;
elseif k == "Position" then
self._frame.Position = _udim2fromoffset(v.X, v.Y);
elseif k == "Radius" then
self:_updateRadius();
elseif k == "Thickness" then
self._frame._stroke.Thickness = _mathmax(v, 1);
self:_updateRadius();
elseif k == "Transparency" then
self._frame._stroke.Transparency = 1 - v;
if [Link] then
self._frame.BackgroundTransparency = 1 - v;
end
elseif k == "Visible" then
self._frame.Visible = v;
elseif k == "ZIndex" then
self._frame.ZIndex = v;
end
end
end
function circle:__iter()
return next, self._properties;
end
function circle:__tostring()
return "Drawing";
end
function circle:Destroy()
cache[self._id] = nil;
self.__OBJECT_EXISTS = false;
_destroy(self._frame);
end
function circle:_updateRadius()
local props = self._properties;
local diameter = ([Link] * 2) - ([Link] * 2);
self._frame.Size = _udim2fromoffset(diameter, diameter);
end
[Link] = [Link];
[Link] = circle;
end
do
local enumToFont = {
[[Link]] =
[Link]("rbxasset://fonts/families/[Link]", [Link],
[Link]),
[[Link]] =
[Link]("rbxasset://fonts/families/[Link]", [Link],
[Link]),
[[Link]] =
[Link]("rbxasset://fonts/families/[Link]", [Link],
[Link]),
[[Link]] =
[Link]("rbxasset://fonts/families/[Link]", [Link],
[Link])
};
function [Link]()
itemCounter = itemCounter + 1;
local id = itemCounter;
cache[id] = newText;
return newText;
end
function text:__index(k)
local prop = self._properties[k];
if prop ~= nil then
return prop;
end
return text[k];
end
function text:__newindex(k, v)
if self.__OBJECT_EXISTS == true then
if k ~= "TextBounds" then
self._properties[k] = v;
end
if k == "Center" then
self._frame.TextXAlignment = v and
[Link] or [Link];
elseif k == "Color" then
self._frame.TextColor3 = v;
elseif k == "Font" then
self._frame.FontFace = enumToFont[v];
self:_updateTextBounds();
elseif k == "Outline" then
self._frame._stroke.Enabled = v;
elseif k == "OutlineColor" then
self._frame._stroke.Color = v;
elseif k == "Position" then
self._frame.Position = _udim2fromoffset(v.X, v.Y);
elseif k == "Size" then
self._frame.TextSize = v;
self:_updateTextBounds();
elseif k == "Text" then
self._frame.Text = v;
self:_updateTextBounds();
elseif k == "Transparency" then
self._frame.TextTransparency = 1 - v;
self._frame._stroke.Transparency = 1 - v;
elseif k == "Visible" then
self._frame.Visible = v;
elseif k == "ZIndex" then
self._frame.ZIndex = v;
end
end
end
function text:__iter()
return next, self._properties;
end
function text:__tostring()
return "Drawing";
end
function text:Destroy()
cache[self._id] = nil;
self.__OBJECT_EXISTS = false;
_destroy(self._frame);
end
function text:_updateTextBounds()
local props = self._properties;
[Link] = _gettextboundsasync(textService,
create("GetTextBoundsParams", {
Text = [Link],
Size = [Link],
Font = enumToFont[[Link]],
Width = huge
}));
end
[Link] = [Link];
[Link] = text;
end
do
local square = {};
function [Link]()
itemCounter = itemCounter + 1;
local id = itemCounter;
cache[id] = newSquare;
return newSquare;
end
function square:__index(k)
local prop = self._properties[k];
if prop ~= nil then
return prop;
end
return square[k];
end
function square:__newindex(k, v)
if self.__OBJECT_EXISTS == true then
local props = self._properties;
props[k] = v;
if k == "Color" then
self._frame.BackgroundColor3 = v;
self._frame._stroke.Color = v;
elseif k == "Filled" then
self._frame.BackgroundTransparency = v and 1 -
[Link] or 1;
elseif k == "Position" then
self:_updateScale();
elseif k == "Size" then
self:_updateScale();
elseif k == "Thickness" then
self._frame._stroke.Thickness = v;
self:_updateScale();
elseif k == "Transparency" then
self._frame._stroke.Transparency = 1 - v;
if [Link] then
self._frame.BackgroundTransparency = 1 - v;
end
elseif k == "Visible" then
self._frame.Visible = v;
elseif k == "ZIndex" then
self._frame.ZIndex = v;
end
end
end
function square:__iter()
return next, self._properties;
end
function square:__tostring()
return "Drawing";
end
function square:Destroy()
cache[self._id] = nil;
self.__OBJECT_EXISTS = false;
_destroy(self._frame);
end
function square:_updateScale()
local props = self._properties;
self._frame.Position = _udim2fromoffset([Link].X +
[Link], [Link].Y + [Link]);
self._frame.Size = _udim2fromoffset([Link].X -
[Link] * 2, [Link].Y - [Link] * 2);
end
[Link] = [Link];
[Link] = square;
end
do
local image = {};
function [Link]()
itemCounter = itemCounter + 1;
local id = itemCounter;
cache[id] = newImage;
return newImage;
end
function image:__index(k)
_assert(k ~= "Data", _stringformat("Attempt to read writeonly
property '%s'", k));
if k == "Loaded" then
return self._frame.IsLoaded;
end
local prop = self._properties[k];
if prop ~= nil then
return prop;
end
return image[k];
end
function image:__newindex(k, v)
if self.__OBJECT_EXISTS == true then
self._properties[k] = v;
if k == "Color" then
self._frame.ImageColor3 = v;
elseif k == "Data" then
self:_newImage(v);
elseif k == "Position" then
self._frame.Position = _udim2fromoffset(v.X, v.Y);
elseif k == "Rounding" then
self._frame._corner.CornerRadius = _udimnew(0, v);
elseif k == "Size" then
self._frame.Size = _udim2fromoffset(v.X, v.Y);
elseif k == "Transparency" then
self._frame.ImageTransparency = 1 - v;
elseif k == "Uri" then
self:_newImage(v, true);
elseif k == "Visible" then
self._frame.Visible = v;
elseif k == "ZIndex" then
self._frame.ZIndex = v;
end
end
end
function image:__iter()
return next, self._properties;
end
function image:__tostring()
return "Drawing";
end
function image:Destroy()
cache[self._id] = nil;
self.__OBJECT_EXISTS = false;
_destroy(self._frame);
end
[Link] = [Link];
[Link] = image;
end
do
local triangle = {};
function [Link]()
itemCounter = itemCounter + 1;
local id = itemCounter;
cache[id] = newTriangle;
return newTriangle;
end
function triangle:__index(k)
local prop = self._properties[k];
if prop ~= nil then
return prop;
end
return triangle[k];
end
function triangle:__newindex(k, v)
if self.__OBJECT_EXISTS == true then
local props, frame = self._properties, self._frame;
props[k] = v;
if k == "Color" then
frame._line1.BackgroundColor3 = v;
frame._line2.BackgroundColor3 = v;
frame._line3.BackgroundColor3 = v;
elseif k == "Filled" then
-- TODO
elseif k == "PointA" then
self:_updateVertices({
{ frame._line1, [Link], [Link] },
{ frame._line3, [Link], [Link] }
});
if [Link] then
self:_calculateFill();
end
elseif k == "PointB" then
self:_updateVertices({
{ frame._line1, [Link], [Link] },
{ frame._line2, [Link], [Link] }
});
if [Link] then
self:_calculateFill();
end
elseif k == "PointC" then
self:_updateVertices({
{ frame._line2, [Link], [Link] },
{ frame._line3, [Link], [Link] }
});
if [Link] then
self:_calculateFill();
end
elseif k == "Thickness" then
local thickness = _mathmax(v, 1);
frame._line1.Size =
_udim2fromoffset(frame._line1.AbsoluteSize.X, thickness);
frame._line2.Size =
_udim2fromoffset(frame._line2.AbsoluteSize.X, thickness);
frame._line3.Size =
_udim2fromoffset(frame._line3.AbsoluteSize.X, thickness);
elseif k == "Transparency" then
frame._line1.BackgroundTransparency = 1 - v;
frame._line2.BackgroundTransparency = 1 - v;
frame._line3.BackgroundTransparency = 1 - v;
elseif k == "Visible" then
self._frame.Visible = v;
elseif k == "ZIndex" then
self._frame.ZIndex = v;
end
end
end
function triangle:__iter()
return next, self._properties;
end
function triangle:__tostring()
return "Drawing";
end
function triangle:Destroy()
cache[self._id] = nil;
self.__OBJECT_EXISTS = false;
_destroy(self._frame);
end
function triangle:_updateVertices(vertices)
local thickness = self._properties.Thickness;
for i, v in vertices do
updatePosition(v[1], v[2], v[3], thickness);
end
end
function triangle:_calculateFill()
end
[Link] = [Link];
[Link] = triangle;
end
do
local quad = {};
function [Link]()
itemCounter = itemCounter + 1;
local id = itemCounter;
cache[id] = newQuad;
return newQuad;
end
function quad:__index(k)
local prop = self._properties[k];
if prop ~= nil then
return prop;
end
return quad[k];
end
function quad:__newindex(k, v)
if self.__OBJECT_EXISTS == true then
local props, frame = self._properties, self._frame;
props[k] = v;
if k == "Color" then
frame._line1.BackgroundColor3 = v;
frame._line2.BackgroundColor3 = v;
frame._line3.BackgroundColor3 = v;
frame._line4.BackgroundColor3 = v;
elseif k == "Filled" then
-- TODO
elseif k == "PointA" then
self:_updateVertices({
{ frame._line1, [Link], [Link] },
{ frame._line4, [Link], [Link] }
});
if [Link] then
self:_calculateFill();
end
elseif k == "PointB" then
self:_updateVertices({
{ frame._line1, [Link], [Link] },
{ frame._line2, [Link], [Link] }
});
if [Link] then
self:_calculateFill();
end
elseif k == "PointC" then
self:_updateVertices({
{ frame._line2, [Link], [Link] },
{ frame._line3, [Link], [Link] }
});
if [Link] then
self:_calculateFill();
end
elseif k == "PointD" then
self:_updateVertices({
{ frame._line3, [Link], [Link] },
{ frame._line4, [Link], [Link] }
});
if [Link] then
self:_calculateFill();
end
elseif k == "Thickness" then
local thickness = _mathmax(v, 1);
frame._line1.Size =
_udim2fromoffset(frame._line1.AbsoluteSize.X, thickness);
frame._line2.Size =
_udim2fromoffset(frame._line2.AbsoluteSize.X, thickness);
frame._line3.Size =
_udim2fromoffset(frame._line3.AbsoluteSize.X, thickness);
frame._line4.Size =
_udim2fromoffset(frame._line3.AbsoluteSize.X, thickness);
elseif k == "Transparency" then
frame._line1.BackgroundTransparency = 1 - v;
frame._line2.BackgroundTransparency = 1 - v;
frame._line3.BackgroundTransparency = 1 - v;
frame._line4.BackgroundTransparency = 1 - v;
elseif k == "Visible" then
self._frame.Visible = v;
elseif k == "ZIndex" then
self._frame.ZIndex = v;
end
end
end
function quad:__iter()
return next, self._properties;
end
function quad:__tostring()
return "Drawing";
end
function quad:Destroy()
cache[self._id] = nil;
self.__OBJECT_EXISTS = false;
_destroy(self._frame);
end
function quad:_updateVertices(vertices)
local thickness = self._properties.Thickness;
for i, v in vertices do
updatePosition(v[1], v[2], v[3], thickness);
end
end
function quad:_calculateFill()
end
[Link] = [Link];
[Link] = quad;
end
[Link] = newcclosure(function(x)
return _assert(classes[x], _stringformat("Invalid drawing type '%s'",
x)).new();
end);
[Link] = newcclosure(function()
for i, v in cache do
if v.__OBJECT_EXISTS then
v:Destroy();
end
end
end);
[Link] = cache;
end
setreadonly(drawing, true);
setreadonly([Link], true);
[Link] = drawing;
[Link] = [Link];
[Link] = newcclosure(function(x)
return tostring(x) == "Drawing";
end);
[Link] = newcclosure(function(x, y)
_assert(_isrenderobj(x), _stringformat("invalid argument #1 to
'getrenderproperty' (Drawing expected, got %s)", _typeof(x)));
return x[y];
end);
[Link] = newcclosure(function(x, y, z)
_assert(_isrenderobj(x), _stringformat("invalid argument #1 to
'setrenderproperty' (Drawing expected, got %s)", _typeof(x)));
x[y] = z;
end);
[Link] = true;