From f70ba6488a9257c2141703e99074e01139c08f43 Mon Sep 17 00:00:00 2001
From: tul <27+tul@noreply.localhost>
Date: Mon, 27 Jul 2026 20:27:36 +0000
Subject: [PATCH] Better font handling
---
UI/library.lua | 5258 ++++++++++++++++++++++++------------------------
1 file changed, 2631 insertions(+), 2627 deletions(-)
diff --git a/UI/library.lua b/UI/library.lua
index f460bb4..07b0a84 100644
--- a/UI/library.lua
+++ b/UI/library.lua
@@ -1,2627 +1,2631 @@
--- Variables
- local uis = game:GetService("UserInputService")
- local players = game:GetService("Players")
- local ws = game:GetService("Workspace")
- local rs = game:GetService("ReplicatedStorage")
- local http_service = game:GetService("HttpService")
- local gui_service = game:GetService("GuiService")
- local lighting = game:GetService("Lighting")
- local run = game:GetService("RunService")
- local stats = game:GetService("Stats")
- local coregui = game:GetService("CoreGui")
- local debris = game:GetService("Debris")
- local tween_service = game:GetService("TweenService")
- local sound_service = game:GetService("SoundService")
-
- local vec2 = Vector2.new
- local vec3 = Vector3.new
- local dim2 = UDim2.new
- local dim = UDim.new
- local rect = Rect.new
- local cfr = CFrame.new
- local empty_cfr = cfr()
- local point_object_space = empty_cfr.PointToObjectSpace
- local angle = CFrame.Angles
- local dim_offset = UDim2.fromOffset
-
- local color = Color3.new
- local rgb = Color3.fromRGB
- local hex = Color3.fromHex
- local hsv = Color3.fromHSV
- local rgbseq = ColorSequence.new
- local rgbkey = ColorSequenceKeypoint.new
- local numseq = NumberSequence.new
- local numkey = NumberSequenceKeypoint.new
-
- local camera = ws.CurrentCamera
- local lp = players.LocalPlayer
- local mouse = lp:GetMouse()
- local gui_offset = gui_service:GetGuiInset().Y
-
- local max = math.max
- local floor = math.floor
- local min = math.min
- local abs = math.abs
- local noise = math.noise
- local rad = math.rad
- local random = math.random
- local pow = math.pow
- local sin = math.sin
- local pi = math.pi
- local tan = math.tan
- local atan2 = math.atan2
- local clamp = math.clamp
-
- local insert = table.insert
- local find = table.find
- local remove = table.remove
- local concat = table.concat
---
-
--- Library init
- getgenv().library = {
- directory = "mirrorhack",
- folders = {
- "/fonts",
- "/configs",
- },
- flags = {},
- config_flags = {},
-
- connections = {},
- notifications = {},
- playerlist_data = {
- players = {},
- player = {},
- },
- colorpicker_open = false;
- gui;
- }
-
- local themes = {
- preset = {
- outline = rgb(10, 10, 10),
- inline = rgb(35, 35, 35),
- text = rgb(180, 180, 180),
- text_outline = rgb(0, 0, 0),
- background = rgb(20, 20, 20),
- ["1"] = hex("#245771"),
- ["2"] = hex("#215D63"),
- ["3"] = hex("#1E6453"),
- },
-
- utility = {
- inline = {
- BackgroundColor3 = {}
- },
- text = {
- TextColor3 = {}
- },
- text_outline = {
- Color = {}
- },
- ["1"] = {
- BackgroundColor3 = {},
- TextColor3 = {},
- ImageColor3 = {},
- ScrollBarImageColor3 = {}
- },
- ["2"] = {
- BackgroundColor3 = {},
- TextColor3 = {},
- ImageColor3 = {},
- ScrollBarImageColor3 = {}
- },
- ["3"] = {
- BackgroundColor3 = {},
- TextColor3 = {},
- ImageColor3 = {},
- ScrollBarImageColor3 = {}
- },
- }
- }
-
- local keys = {
- [Enum.KeyCode.LeftShift] = "LS",
- [Enum.KeyCode.RightShift] = "RS",
- [Enum.KeyCode.LeftControl] = "LC",
- [Enum.KeyCode.RightControl] = "RC",
- [Enum.KeyCode.Insert] = "INS",
- [Enum.KeyCode.Backspace] = "BS",
- [Enum.KeyCode.Return] = "Ent",
- [Enum.KeyCode.LeftAlt] = "LA",
- [Enum.KeyCode.RightAlt] = "RA",
- [Enum.KeyCode.CapsLock] = "CAPS",
- [Enum.KeyCode.One] = "1",
- [Enum.KeyCode.Two] = "2",
- [Enum.KeyCode.Three] = "3",
- [Enum.KeyCode.Four] = "4",
- [Enum.KeyCode.Five] = "5",
- [Enum.KeyCode.Six] = "6",
- [Enum.KeyCode.Seven] = "7",
- [Enum.KeyCode.Eight] = "8",
- [Enum.KeyCode.Nine] = "9",
- [Enum.KeyCode.Zero] = "0",
- [Enum.KeyCode.KeypadOne] = "Num1",
- [Enum.KeyCode.KeypadTwo] = "Num2",
- [Enum.KeyCode.KeypadThree] = "Num3",
- [Enum.KeyCode.KeypadFour] = "Num4",
- [Enum.KeyCode.KeypadFive] = "Num5",
- [Enum.KeyCode.KeypadSix] = "Num6",
- [Enum.KeyCode.KeypadSeven] = "Num7",
- [Enum.KeyCode.KeypadEight] = "Num8",
- [Enum.KeyCode.KeypadNine] = "Num9",
- [Enum.KeyCode.KeypadZero] = "Num0",
- [Enum.KeyCode.Minus] = "-",
- [Enum.KeyCode.Equals] = "=",
- [Enum.KeyCode.Tilde] = "~",
- [Enum.KeyCode.LeftBracket] = "[",
- [Enum.KeyCode.RightBracket] = "]",
- [Enum.KeyCode.RightParenthesis] = ")",
- [Enum.KeyCode.LeftParenthesis] = "(",
- [Enum.KeyCode.Semicolon] = ",",
- [Enum.KeyCode.Quote] = "'",
- [Enum.KeyCode.BackSlash] = "\\",
- [Enum.KeyCode.Comma] = ",",
- [Enum.KeyCode.Period] = ".",
- [Enum.KeyCode.Slash] = "/",
- [Enum.KeyCode.Asterisk] = "*",
- [Enum.KeyCode.Plus] = "+",
- [Enum.KeyCode.Period] = ".",
- [Enum.KeyCode.Backquote] = "`",
- [Enum.UserInputType.MouseButton1] = "MB1",
- [Enum.UserInputType.MouseButton2] = "MB2",
- [Enum.UserInputType.MouseButton3] = "MB3",
- [Enum.KeyCode.Escape] = "ESC",
- [Enum.KeyCode.Space] = "SPC",
- }
-
- library.__index = library
-
- for _, path in next, library.folders do
- makefolder(library.directory .. path)
- end
-
- local flags = library.flags
- local config_flags = library.config_flags
-
- -- Font importing system
- local fonts = {}; do
- function Register_Font(Name, Weight, Style, Asset)
- if not isfile(Asset.Id) then
- writefile(Asset.Id, Asset.Font)
- end
-
- if isfile(Name .. ".font") then
- delfile(Name .. ".font")
- end
-
- local Data = {
- name = Name,
- faces = {
- {
- name = "Regular",
- weight = Weight,
- style = Style,
- assetId = getcustomasset(Asset.Id),
- },
- },
- }
-
- writefile(Name .. ".font", game:GetService("HttpService"):JSONEncode(Data))
-
- return getcustomasset(Name .. ".font");
- end
-
- local TahomaBold = Register_Font("TahomaBold", 200, "Normal", {
- Id = "TahomaBold.ttf",
- Font = game:HttpGet("https://raw.githubusercontent.com/tulontop/mirrorhack/refs/heads/main/fonts/tahomabold.ttf"),
- })
-
- local Tahoma = Register_Font("Tahoma", 200, "Normal", {
- Id = "Tahoma.ttf",
- Font = game:HttpGet("https://raw.githubusercontent.com/tulontop/mirrorhack/refs/heads/main/fonts/tahoma.ttf"),
- })
-
- local SmallestPixel = Register_Font("SmallestPixel", 200, "normal", {
- Id = "SmallestPixel.ttf",
- Font = game:HttpGet("https://raw.githubusercontent.com/tulontop/mirrorhack/refs/heads/main/fonts/smallestpixel.ttf"),
- })
-
- local ProggyClean = Register_Font("ProggyClean", 200, "normal", {
- Id = "ProggyClean.ttf",
- Font = game:HttpGet("https://raw.githubusercontent.com/tulontop/mirrorhack/refs/heads/main/fonts/proggyclean.ttf"),
- })
-
- fonts = {
- ["TahomaBold"] = Font.new(TahomaBold, Enum.FontWeight.Regular, Enum.FontStyle.Normal);
- ["Tahoma"] = Font.new(Tahoma, Enum.FontWeight.Regular, Enum.FontStyle.Normal);
- ["SmallestPixel"] = Font.new(SmallestPixel, Enum.FontWeight.Regular, Enum.FontStyle.Normal);
- ["ProggyClean"] = Font.new(ProggyClean, Enum.FontWeight.Regular, Enum.FontStyle.Normal);
- }
- end
- library.fonts = fonts
- --
---
-
--- Library functions
- -- Misc functions
- function library:tween(obj, properties)
- local tween = tween_service:Create(obj, TweenInfo.new(0.25, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut, 0, false, 0), properties):Play()
-
- return tween
- end
-
- function library:close_current_element(cfg)
- local path = library.current_element_open
-
- if path then
- path.set_visible(false)
- path.open = false
- end
- end
-
- function library:resizify(frame)
- local Frame = Instance.new("TextButton")
- Frame.Position = dim2(1, -10, 1, -10)
- Frame.BorderColor3 = rgb(0, 0, 0)
- Frame.Size = dim2(0, 10, 0, 10)
- Frame.BorderSizePixel = 0
- Frame.BackgroundColor3 = rgb(255, 255, 255)
- Frame.Parent = frame
- Frame.BackgroundTransparency = 1
- Frame.Text = ""
-
- local resizing = false
- local start_size
- local start
- local og_size = frame.Size
-
- Frame.InputBegan:Connect(function(input)
- if input.UserInputType == Enum.UserInputType.MouseButton1 then
- resizing = true
- start = input.Position
- start_size = frame.Size
- end
- end)
-
- Frame.InputEnded:Connect(function(input)
- if input.UserInputType == Enum.UserInputType.MouseButton1 then
- resizing = false
- end
- end)
-
- library:connection(uis.InputChanged, function(input, game_event)
- if resizing and input.UserInputType == Enum.UserInputType.MouseMovement then
- local viewport_x = camera.ViewportSize.X
- local viewport_y = camera.ViewportSize.Y
-
- local current_size = dim2(
- start_size.X.Scale,
- math.clamp(
- start_size.X.Offset + (input.Position.X - start.X),
- og_size.X.Offset,
- viewport_x
- ),
- start_size.Y.Scale,
- math.clamp(
- start_size.Y.Offset + (input.Position.Y - start.Y),
- og_size.Y.Offset,
- viewport_y
- )
- )
- frame.Size = current_size
- end
- end)
- end
-
- function library:mouse_in_frame(uiobject)
- local y_cond = uiobject.AbsolutePosition.Y <= mouse.Y and mouse.Y <= uiobject.AbsolutePosition.Y + uiobject.AbsoluteSize.Y
- local x_cond = uiobject.AbsolutePosition.X <= mouse.X and mouse.X <= uiobject.AbsolutePosition.X + uiobject.AbsoluteSize.X
-
- return (y_cond and x_cond)
- end
-
- library.lerp = function(start, finish, t)
- t = t or 1 / 8
-
- return start * (1 - t) + finish * t
- end
-
- function library:draggify(frame)
- local dragging = false
- local start_size = frame.Position
- local start
-
- frame.InputBegan:Connect(function(input)
- if input.UserInputType == Enum.UserInputType.MouseButton1 then
- dragging = true
- start = input.Position
- start_size = frame.Position
- end
- end)
-
- frame.InputEnded:Connect(function(input)
- if input.UserInputType == Enum.UserInputType.MouseButton1 then
- dragging = false
- end
- end)
-
- library:connection(uis.InputChanged, function(input, game_event)
- if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then
- local viewport_x = camera.ViewportSize.X
- local viewport_y = camera.ViewportSize.Y
-
- local current_position = dim2(
- 0,
- clamp(
- start_size.X.Offset + (input.Position.X - start.X),
- 0,
- viewport_x - frame.Size.X.Offset
- ),
- 0,
- math.clamp(
- start_size.Y.Offset + (input.Position.Y - start.Y),
- 0,
- viewport_y - frame.Size.Y.Offset
- )
- )
-
- frame.Position = current_position
- end
- end)
- end
-
- function library:create_island(cfg)
- local w = cfg.width or 100
- local h = cfg.height or 40
- local title = cfg.title or cfg.name or ""
-
- local sg = library:create("ScreenGui", {
- Parent = coregui,
- Name = "\0",
- IgnoreGuiInset = true,
- ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
- ResetOnSpawn = false,
- })
-
- local outer = library:create("Frame", {
- Parent = sg,
- Size = dim2(0, w, 0, h),
- Position = dim2(0.5, -w/2, 0.5, -h/2),
- BackgroundColor3 = themes.preset.outline,
- BorderSizePixel = 0,
- })
-
- local inner = library:create("Frame", {
- Parent = outer,
- Size = dim2(1, -2, 1, -2),
- Position = dim2(0, 1, 0, 1),
- BackgroundColor3 = themes.preset.background,
- BorderSizePixel = 0,
- })
-
- local title_label = library:create("TextLabel", {
- Parent = inner,
- Size = dim2(1, 0, 1, 0),
- BackgroundTransparency = 1,
- Text = title,
- TextColor3 = themes.preset.text,
- FontFace = fonts["TahomaBold"],
- TextSize = 14,
- BorderSizePixel = 0,
- TextXAlignment = Enum.TextXAlignment.Center,
- TextYAlignment = Enum.TextYAlignment.Center,
- })
-
- if cfg.draggable ~= false then
- library:draggify(outer)
- end
-
- local island = {_frame = outer, _sg = sg}
-
- function island:set_title(text)
- title_label.Text = text
- end
-
- function island:set_pos(x, y)
- outer.Position = dim2(0, x, 0, y)
- end
-
- function island:set_size(nw, nh)
- outer.Size = dim2(0, nw, 0, nh)
- end
-
- function island:set_visible(v)
- sg.Enabled = v
- end
-
- function island:get_pos()
- return outer.Position.X.Offset, outer.Position.Y.Offset
- end
-
- return island
- end
-
- function library:convert(str)
- local values = {}
-
- for value in string.gmatch(str, "[^,]+") do
- insert(values, tonumber(value))
- end
-
- if #values == 4 then
- return unpack(values)
- else
- return
- end
- end
-
- function library:convert_enum(enum)
- local enum_parts = {}
-
- for part in string.gmatch(enum, "[%w_]+") do
- insert(enum_parts, part)
- end
-
- local enum_table = Enum
- for i = 2, #enum_parts do
- local enum_item = enum_table[enum_parts[i]]
-
- enum_table = enum_item
- end
-
- return enum_table
- end
-
- local config_holder;
- function library:update_config_list()
- if not config_holder then
- return
- end
-
- local list = {}
-
- for idx, file in listfiles(library.directory .. "/configs") do
- local name = file:gsub(library.directory .. "/configs\\", ""):gsub(".cfg", ""):gsub(library.directory .. "\\configs\\", "")
- list[#list + 1] = name
- end
-
-
- config_holder.refresh_options(list)
- end
-
- function library:get_config()
- local Config = {}
-
- for _, v in flags do
- if type(v) == "table" and v.key then
- Config[_] = {active = v.active, mode = v.mode, key = tostring(v.key)}
- elseif type(v) == "table" and v["Transparency"] and v["Color"] then
- Config[_] = {Transparency = v["Transparency"], Color = v["Color"]:ToHex()}
- else
- Config[_] = v
- end
- end
-
- return http_service:JSONEncode(Config)
- end
-
- function library:load_config(config_json)
- local config = http_service:JSONDecode(config_json)
-
- for _, v in next, config do
- local function_set = library.config_flags[_]
-
- if _ == "config_name_list" then
- continue
- end
-
- if function_set then
- if type(v) == "table" and v["Transparency"] and v["Color"] then
- function_set(hex(v["Color"]), v["Transparency"])
- elseif type(v) == "table" and v["active"] then
- function_set(v)
- else
- function_set(v)
- end
- end
- end
- end
-
- function library:round(number, float)
- local multiplier = 1 / (float or 1)
-
- return floor(number * multiplier + 0.5) / multiplier
- end
-
- function library:apply_theme(instance, theme, property)
- insert(themes.utility[theme][property], instance)
- end
-
- function library:update_theme(theme, color)
- for _, property in themes.utility[theme] do
-
- for m, object in property do
- if object[_] == themes.preset[theme] then
- object[_] = color
- end
- end
- end
-
- themes.preset[theme] = color
- end
-
- function library:connection(signal, callback)
- local connection = signal:Connect(callback)
-
- insert(library.connections, connection)
-
- return connection
- end
-
- function library:apply_stroke(parent)
- local STROKE = library:create("UIStroke", {
- Parent = parent,
- Color = themes.preset.text_outline,
- LineJoinMode = Enum.LineJoinMode.Miter
- })
-
- library:apply_theme(STROKE, "text_outline", "Color")
- end
-
- function library:create(instance, options)
- local ins = Instance.new(instance)
-
- for prop, value in next, options do
- ins[prop] = value
- end
-
- if instance == "TextLabel" or instance == "TextButton" or instance == "TextBox" then
- library:apply_theme(ins, "text", "TextColor3")
- library:apply_stroke(ins)
- end
-
- return ins
- end
-
- function library:unload_menu()
- if library.gui then
- library.gui:Destroy()
- end
-
- for index, connection in next, library.connections do
- connection:Disconnect()
- connection = nil
- end
-
- if library.sgui then
- library.sgui:Destroy()
- end
-
- library = nil
- end
- --
-
- -- Library element functions
- function library:window(properties)
- local cfg = {
- name = properties.name or properties.Name or "mirrorhack",
- size = properties.size or properties.Size or dim2(0, 600, 0, 400),
- selected_tab
- }
-
- library.gui = library:create("ScreenGui", {
- Parent = coregui,
- Name = "\0",
- Enabled = true,
- ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
- IgnoreGuiInset = true,
- })
-
- -- Window
- local window_outline = library:create("Frame", {
- Parent = library.gui;
- Position = dim2(0.5, -cfg.size.X.Offset / 2, 0.5, -cfg.size.Y.Offset / 2);
- BorderColor3 = rgb(0, 0, 0);
- Size = cfg.size;
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- });
- window_outline.Position = dim2(0, window_outline.AbsolutePosition.Y, 0, window_outline.AbsolutePosition.Y)
- cfg.main_outline = window_outline
-
- library:resizify(window_outline)
- library:draggify(window_outline)
-
- local title_holder = library:create("Frame", {
- Parent = window_outline;
- BackgroundTransparency = 0.800000011920929;
- Position = dim2(0, 2, 0, 2);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -4, 0, 20);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(0, 0, 0)
- });
-
- local ui_title = library:create("TextLabel", {
- FontFace = fonts["TahomaBold"];
- TextColor3 = rgb(255, 255, 255);
- BorderColor3 = rgb(0, 0, 0);
- Text = cfg.name;
- Parent = title_holder;
- BackgroundTransparency = 1;
- Size = dim2(1, 0, 1, 0);
- BorderSizePixel = 0;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- library.gradient = library:create("UIGradient", {
- Color = rgbseq{
- rgbkey(0, themes.preset["1"]),
- rgbkey(0.5, themes.preset["2"]),
- rgbkey(1, themes.preset["3"]),
- };
- Parent = window_outline
- });
-
- local tab_button_holder = library:create("Frame", {
- AnchorPoint = vec2(0, 1);
- Parent = window_outline;
- BackgroundTransparency = 0.800000011920929;
- Position = dim2(0, 2, 1, -2);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -4, 0, 20);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(0, 0, 0)
- }); cfg.tab_button_holder = tab_button_holder
-
- library:create("UIListLayout", {
- VerticalAlignment = Enum.VerticalAlignment.Center;
- FillDirection = Enum.FillDirection.Horizontal;
- HorizontalAlignment = Enum.HorizontalAlignment.Center;
- HorizontalFlex = Enum.UIFlexAlignment.Fill;
- Parent = tab_button_holder;
- SortOrder = Enum.SortOrder.LayoutOrder;
- VerticalFlex = Enum.UIFlexAlignment.Fill
- });
- --
-
- function cfg.toggle_menu(bool)
- window_outline.Visible = bool
- end
-
- return setmetatable(cfg, library)
- end
-
- function library:tab(properties)
- local cfg = {
- name = properties.name or "visuals",
- count = 0
- }
-
- -- Instances
- -- Tab Button
- local tab_button = library:create("TextButton", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(170, 170, 170);
- BorderColor3 = rgb(0, 0, 0);
- Text = cfg.name;
- Parent = self.tab_button_holder;
- BackgroundTransparency = 1;
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.XY;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
- --
-
- -- Page
- local Page = library:create("Frame", {
- Parent = self.main_outline;
- BackgroundTransparency = 0.6;
- Position = dim2(0, 2, 0, 24);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -4, 1, -48);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(0, 0, 0),
- Visible = false,
- }); cfg.page = Page
-
- library:create("UIListLayout", {
- FillDirection = Enum.FillDirection.Horizontal;
- HorizontalFlex = Enum.UIFlexAlignment.Fill;
- Parent = Page;
- Padding = dim(0, 2);
- SortOrder = Enum.SortOrder.LayoutOrder;
- VerticalFlex = Enum.UIFlexAlignment.Fill
- });
-
- library:create("UIPadding", {
- PaddingTop = dim(0, 2);
- PaddingBottom = dim(0, 2);
- Parent = Page;
- PaddingRight = dim(0, 2);
- PaddingLeft = dim(0, 2)
- });
- --
- --
-
- function cfg.open_tab()
- local selected_tab = self.selected_tab
-
- if selected_tab then
- selected_tab[1].Visible = false
- selected_tab[2].TextColor3 = rgb(170, 170, 170)
-
- selected_tab = nil
- end
-
- Page.Visible = true
- tab_button.TextColor3 = rgb(255, 255, 255)
-
- self.selected_tab = {Page, tab_button}
- end
-
- tab_button.MouseButton1Down:Connect(function()
- cfg.open_tab()
- end)
-
- if not self.selected_tab then
- cfg.open_tab(true)
- end
-
- return setmetatable(cfg, library)
- end
-
- local notifications = {notifs = {}}
-
- library.sgui = library:create("ScreenGui", {
- Name = "Hi",
- Parent = gethui()
- })
-
- function notifications:refresh_notifs()
- for i, v in notifications.notifs do
- local Position = vec2(50, 50)
- tween_service:Create(v, TweenInfo.new(1, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Position = dim_offset(Position.X, Position.Y + (i * 30))}):Play()
- end
- end
-
- function notifications:fade(path, is_fading)
- local fading = is_fading and 1 or 0
-
- tween_service:Create(path, TweenInfo.new(1, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {BackgroundTransparency = fading}):Play()
-
- for _, instance in path:GetDescendants() do
- if not instance:IsA("GuiObject") then
- if instance:IsA("UIStroke") then
- tween_service:Create(instance, TweenInfo.new(1, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Transparency = fading}):Play()
- end
-
- continue
- end
-
- if instance:IsA("TextLabel") then
- tween_service:Create(instance, TweenInfo.new(1, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {TextTransparency = fading}):Play()
- elseif instance:IsA("Frame") then
- tween_service:Create(instance, TweenInfo.new(1, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {BackgroundTransparency = instance.Transparency and 0.6 and is_fading and 1 or 0.6}):Play()
- end
- end
- end
-
- function notifications:create_notification(options)
- local cfg = {
- name = options.name or "Hit: q3sm (finobe) in the Head for 100 Damage!",
- outline;
- }
-
- -- Instances
- local outline = library:create("Frame", {
- Parent = library.sgui;
- Position = dim_offset(-50, 50 + (#notifications.notifs * 30)); -- origin (dependant on the watermark position rn)
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(0, 0, 0, 24);
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.X;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- local dark = library:create("Frame", {
- Parent = outline;
- BackgroundTransparency = 1;
- Position = dim2(0, 2, 0, 2);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -4, 1, -4);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(0, 0, 0)
- });
-
- library:create("UIPadding", {
- PaddingTop = dim(0, 7);
- PaddingBottom = dim(0, 6);
- Parent = dark;
- PaddingRight = dim(0, 7);
- PaddingLeft = dim(0, 4)
- });
-
- library:create("TextLabel", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(255, 255, 255);
- BorderColor3 = rgb(0, 0, 0);
- Text = cfg.name;
- Parent = dark;
- Size = dim2(0, 0, 1, 0);
- Position = dim2(0, 1, 0, -1);
- BackgroundTransparency = 1;
- TextXAlignment = Enum.TextXAlignment.Left;
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.X;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- library:create("UIGradient", {
- Color = rgbseq{
- rgbkey(0, themes.preset["1"]),
- rgbkey(0.5, themes.preset["2"]),
- rgbkey(1, themes.preset["3"]),
- };
- Parent = outline
- });
- --
-
- local index = #notifications.notifs + 1
- notifications.notifs[index] = outline
-
- notifications:refresh_notifs()
- tween_service:Create(outline, TweenInfo.new(1, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {AnchorPoint = vec2(0, 0)}):Play()
-
- notifications:fade(outline, false)
-
- task.spawn(function()
- task.wait(3)
-
- notifications.notifs[index] = nil
-
- notifications:fade(outline, true)
-
- task.wait(3)
-
- outline:Destroy()
- end)
- end
-
- function library:watermark(options)
- local cfg = {
- name = options.name or "nebulahax";
- }
-
- -- Instances
- local outline = library:create("Frame", {
- Parent = library.sgui;
- Position = dim2(0, 50, 0, 50);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(0, 0, 0, 24);
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.X;
- BackgroundColor3 = rgb(255, 255, 255)
- }); library.watermark_outline = outline; library:draggify(outline);
-
- local dark = library:create("Frame", {
- Parent = outline;
- BackgroundTransparency = 0.6;
- Position = dim2(0, 2, 0, 2);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -4, 1, -4);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(0, 0, 0)
- });
-
- library:create("UIPadding", {
- PaddingTop = dim(0, 7);
- PaddingBottom = dim(0, 6);
- Parent = dark;
- PaddingRight = dim(0, 7);
- PaddingLeft = dim(0, 4)
- });
-
- local text_title = library:create("TextLabel", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(255, 255, 255);
- BorderColor3 = rgb(0, 0, 0);
- Text = cfg.name;
- Parent = dark;
- Size = dim2(0, 0, 1, 0);
- Position = dim2(0, 1, 0, -1);
- BackgroundTransparency = 1;
- TextXAlignment = Enum.TextXAlignment.Left;
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.X;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- library.watermark_gradient = library:create("UIGradient", {
- Color = rgbseq{
- rgbkey(0, themes.preset["1"]),
- rgbkey(0.5, themes.preset["2"]),
- rgbkey(1, themes.preset["3"]),
- };
- Parent = outline
- });
- --
-
- function cfg.update_text(text)
- text_title.Text = text
- end
-
- cfg.update_text(cfg.name)
-
- return setmetatable(cfg, library)
- end
-
- local watermark = library:watermark({name = "mirrorhack - 100 fps - 100 ping"})
- local fps = 0
- local watermark_delay = tick()
-
- run.RenderStepped:Connect(function()
- fps += 1
-
- if tick() - watermark_delay > 1 then
- watermark_delay = tick()
- local ping = math.floor(stats.PerformanceStats.Ping:GetValue()) .. "ms"
- watermark.update_text(string.format("mirrorhack - fps: %s - ping: %s", fps, ping))
- fps = 0
- end
- end)
-
- --[[
- local pingTimeSec = game.Players.LocalPlayer:GetNetworkPing()
- local pingTimeMs = pingTimeSec * 1000
- pingLabel.Text = "Ping: " .. tostring(math.floor(pingTimeMs)) .. "ms"
-
- local realFPS = workspace:GetRealPhysicsFPS()
- fpsLabel.Text = "FPS: " .. tostring(math.floor(realFPS))
- ]]
-
- function library:column(properties)
- self.count += 1
-
- local cfg = {color = library.gradient.Color.Keypoints[self.count].Value, count = self.count}
-
- local scrolling_frame = library:create("ScrollingFrame", {
- ScrollBarImageColor3 = rgb(0, 0, 0);
- Active = true;
- AutomaticCanvasSize = Enum.AutomaticSize.Y;
- ScrollBarThickness = 0;
- Parent = self.page;
- LayoutOrder = -1;
- BackgroundTransparency = 1;
- ScrollBarImageTransparency = 1;
- BorderColor3 = rgb(0, 0, 0);
- BackgroundColor3 = rgb(0, 0, 0);
- BorderSizePixel = 0;
- CanvasSize = dim2(0, 0, 0, 0)
- }); cfg.column = scrolling_frame
-
- library:create("UIListLayout", {
- Parent = scrolling_frame;
- Padding = dim(0, 5);
- SortOrder = Enum.SortOrder.LayoutOrder
- });
-
- return setmetatable(cfg, library)
- end
-
- function library:section(properties)
- local cfg = {
- name = properties.name or properties.Name or "section",
- size = properties.size or 1,
- autofill = properties.auto_fill or false,
- count = self.count;
- color = self.color;
- }
-
- -- Instances
- local accent = library:create("Frame", {
- Parent = self.column;
- ClipsDescendants = true;
- BorderColor3 = rgb(0, 0, 0);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3");
-
- local dark = library:create("Frame", {
- Parent = accent;
- BackgroundTransparency = 0.6;
- Position = dim2(0, 2, 0, 16);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -4, 1, -18);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(0, 0, 0)
- });
-
- local elements = library:create("Frame", {
- Parent = dark;
- Position = dim2(0, 4, 0, 5);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -8, 0, 0);
- BackgroundTransparency = 1;
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- }); cfg.elements = elements
-
- if cfg.autofill == false then
- elements.AutomaticSize = Enum.AutomaticSize.Y;
- accent.AutomaticSize = Enum.AutomaticSize.Y;
- accent.Size = dim2(1, 0, 0, 0);
-
- local UIPadding = library:create("UIPadding", {
- Parent = elements,
- Name = "",
- PaddingBottom = dim(0, 7)
- })
- else
- accent.Size = dim2(1, 0, cfg.size, 0);
- end
-
- library:create("UIListLayout", {
- Parent = elements;
- Padding = dim(0, 6);
- SortOrder = Enum.SortOrder.LayoutOrder
- });
-
- local title = library:create("TextLabel", {
- FontFace = fonts["TahomaBold"];
- TextColor3 = rgb(255, 255, 255);
- BorderColor3 = rgb(0, 0, 0);
- Text = cfg.name;
- Parent = accent;
- Size = dim2(1, 0, 0, 0);
- Position = dim2(0, 4, 0, 2);
- BackgroundTransparency = 1;
- TextXAlignment = Enum.TextXAlignment.Left;
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.Y;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- library:create("UIListLayout", {
- Parent = ScrollingFrame;
- Padding = dim(0, 5);
- SortOrder = Enum.SortOrder.LayoutOrder
- });
- --
-
- return setmetatable(cfg, library)
- end
-
- -- Elements
- function library:toggle(options)
- local cfg = {
- enabled = options.enabled or nil,
- name = options.name or "Toggle",
- flag = options.flag or options.name or "Flag",
-
- default = options.default or false,
- folding = options.folding or false,
- callback = options.callback or function() end,
-
- color = self.color;
- count = self.count;
- }
-
- -- Instances
- -- Element
- local toggle = library:create("TextButton", {
- Parent = self.elements;
- BackgroundTransparency = 1;
- Text = "";
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, 0, 0, 12);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- library:create("TextLabel", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(255, 255, 255);
- BorderColor3 = rgb(0, 0, 0);
- Text = cfg.name;
- Parent = toggle;
- Size = dim2(1, 0, 1, 0);
- Position = dim2(0, 1, 0, -1);
- BackgroundTransparency = 1;
- TextXAlignment = Enum.TextXAlignment.Left;
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.X;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- local accent = library:create("Frame", {
- AnchorPoint = vec2(1, 0);
- Parent = toggle;
- Position = dim2(1, 0, 0, 0);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(0, 12, 0, 12);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3");
-
- local fill = library:create("Frame", {
- Parent = accent;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(fill, tostring(self.count), "BackgroundColor3");
-
- library:create("UIListLayout", {
- FillDirection = Enum.FillDirection.Horizontal;
- HorizontalAlignment = Enum.HorizontalAlignment.Right;
- Parent = right_components;
- Padding = dim(0, 4);
- SortOrder = Enum.SortOrder.LayoutOrder
- });
- --
-
- -- Sub sections
- local elements;
-
- if cfg.folding then
- elements = library:create("Frame", {
- Parent = self.elements;
- BackgroundTransparency = 1;
- Position = dim2(0, 4, 0, 21);
- Size = dim2(1, 0, 0, 0);
- BorderSizePixel = 0;
- Visible = false;
- AutomaticSize = Enum.AutomaticSize.Y;
- BackgroundColor3 = rgb(255, 255, 255)
- }); cfg.elements = elements
-
- library:create("UIListLayout", {
- Parent = elements;
- Padding = dim(0, 6);
- HorizontalAlignment = Enum.HorizontalAlignment.Right;
- SortOrder = Enum.SortOrder.LayoutOrder
- });
- end
- --
- --
-
- -- Functions
- function cfg.set(bool)
- fill.BackgroundColor3 = bool and themes.preset[tostring(self.count)] or themes.preset.inline
-
- flags[cfg.flag] = bool
-
- cfg.callback(bool)
-
- if cfg.folding then
- elements.Visible = bool
- end
- end
-
- cfg.set(cfg.default)
-
- config_flags[cfg.flag] = cfg.set
- --
-
- -- Connections
- toggle.MouseButton1Click:Connect(function()
- cfg.enabled = not cfg.enabled
- cfg.set(cfg.enabled)
- end)
- --
-
- return setmetatable(cfg, library)
- end
-
- function library:list(options)
- local cfg = {
- callback = options and options.callback or function() end,
- name = options.name or nil,
-
- scale = options.size or 90,
- items = options.items or {"1", "2", "3"},
- -- order = options.order or 1,
- visible = options.visible or true,
-
- option_instances = {},
- current_instance = nil,
- flag = options.flag or "SET A FLAG U NIGGER",
- }
-
- -- Elements
- local accent = library:create("Frame", {
- BorderColor3 = rgb(0, 0, 0);
- AnchorPoint = vec2(1, 0);
- Parent = self.elements;
- Position = dim2(1, 0, 0, 0);
- Size = dim2(1, 0, 0, cfg.scale);
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.Y;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3")
-
- local inline = library:create("Frame", {
- Parent = accent;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(35, 35, 35)
- }); library:apply_theme(inline, "inline", "BackgroundColor3")
-
- local scrollingframe = library:create("ScrollingFrame", {
- ScrollBarImageColor3 = rgb(0, 0, 0);
- Active = true;
- AutomaticCanvasSize = Enum.AutomaticSize.Y;
- ScrollBarThickness = 0;
- Parent = inline;
- Size = dim2(1, 0, 1, 0);
- LayoutOrder = -1;
- BackgroundTransparency = 1;
- ScrollBarImageTransparency = 1;
- BorderColor3 = rgb(0, 0, 0);
- BackgroundColor3 = rgb(0, 0, 0);
- BorderSizePixel = 0;
- CanvasSize = dim2(0, 0, 0, 0)
- });
-
- library:create("UIListLayout", {
- Parent = scrollingframe;
- Padding = dim(0, 6);
- SortOrder = Enum.SortOrder.LayoutOrder
- });
-
- library:create("UIPadding", {
- PaddingTop = dim(0, 2);
- PaddingBottom = dim(0, 4);
- Parent = scrollingframe;
- PaddingRight = dim(0, 5);
- PaddingLeft = dim(0, 5)
- });
- --
-
- -- Functions
- function cfg.render_option(text)
- local text = library:create("TextButton", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(170, 170, 170);
- BorderColor3 = rgb(0, 0, 0);
- Text = text;
- AutoButtonColor = false;
- BackgroundTransparency = 1;
- Parent = scrollingframe;
- BorderSizePixel = 0;
- Size = dim2(1, 0, 0, 0);
- AutomaticSize = Enum.AutomaticSize.Y;
- TextSize = 12;
- TextXAlignment = Enum.TextXAlignment.Left;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- return text
- end
-
- function cfg.refresh_options(options)
- for _, v in cfg.option_instances do
- v:Destroy()
- end
-
- for _, option in next, options do
- local button = cfg.render_option(option)
-
- insert(cfg.option_instances, button)
-
- button.MouseButton1Click:Connect(function()
- if cfg.current_instance and cfg.current_instance ~= button then
- cfg.current_instance.TextColor3 = rgb(170, 170, 170)
- end
-
- cfg.current_instance = button
- button.TextColor3 = rgb(255, 255, 255)
-
- flags[cfg.flag] = button.text
-
- cfg.callback(button.text)
- end)
- end
- end
-
- function cfg.filter_options(text)
- for _, v in next, cfg.option_instances do
- if string.find(v.Text, text) then
- v.Visible = true
- else
- v.Visible = false
- end
- end
- end
-
- function cfg.set(value)
- for _, buttons in next, cfg.option_instances do
- if buttons.Text == value then
- buttons.TextColor3 = rgb(255, 255, 255)
- else
- buttons.TextColor3 = rgb(170, 170, 170)
- end
- end
-
- flags[cfg.flag] = value
- cfg.callback(value)
- end
-
- cfg.refresh_options(cfg.items)
- --
-
- return setmetatable(cfg, library)
- end
-
- function library:slider(options)
- local cfg = {
- name = options.name or nil,
- suffix = options.suffix or "",
- flag = options.flag or options.name or "Flag",
- callback = options.callback or function() end,
-
- min = options.min or options.minimum or 0,
- max = options.max or options.maximum or 100,
- intervals = options.interval or options.decimal or 1,
- default = options.default or 10,
- value = options.default or 10,
-
- ignore = options.ignore or false,
- dragging = false,
- }
-
- -- Instances
- local slider = library:create("Frame", {
- Parent = self.elements;
- BackgroundTransparency = 1;
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, 0, 0, 25);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- local eeeee = library:create("TextLabel", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(255, 255, 255);
- RichText = true;
- BorderColor3 = rgb(0, 0, 0);
- Text = "max distance : 5000";
- Parent = slider;
- Size = dim2(1, 0, 0, 0);
- Position = dim2(0, 1, 0, -2);
- BackgroundTransparency = 1;
- TextXAlignment = Enum.TextXAlignment.Left;
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.XY;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- local outline = library:create("TextButton", {
- Parent = slider;
- Text = "";
- AutoButtonColor = false;
- Position = dim2(0, 0, 0, 13);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, 0, 0, 12);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(outline, tostring(self.count), "BackgroundColor3")
-
- local inline = library:create("Frame", {
- Parent = outline;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset.inline
- }); library:apply_theme(outline, "inline", "BackgroundColor3")
-
- local accent = library:create("Frame", {
- Parent = inline;
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(0.5, 0, 1, 0);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3")
- --
-
- -- Functions
- function cfg.set(value)
- local valuee = tonumber(value)
-
- if valuee == nil then
- return
- end
-
- cfg.value = clamp(library:round(valuee, cfg.intervals), cfg.min, cfg.max)
-
- accent.Size = dim2((cfg.value - cfg.min) / (cfg.max - cfg.min), 0, 1, 0)
- eeeee.Text = cfg.name .. "" .. ' - ' .. tostring(cfg.value) .. cfg.suffix .. ""
-
- flags[cfg.flag] = cfg.value
-
- cfg.callback(flags[cfg.flag])
- end
-
- cfg.set(cfg.default)
- --
-
- -- Connections
- outline.MouseButton1Down:Connect(function()
- cfg.dragging = true
- end)
-
- library:connection(uis.InputChanged, function(input)
- if cfg.dragging and input.UserInputType == Enum.UserInputType.MouseMovement then
- local size_x = (input.Position.X - inline.AbsolutePosition.X) / inline.AbsoluteSize.X
- local value = ((cfg.max - cfg.min) * size_x) + cfg.min
-
- cfg.set(value)
- end
- end)
-
- library:connection(uis.InputEnded, function(input)
- if input.UserInputType == Enum.UserInputType.MouseButton1 then
- cfg.dragging = false
- end
- end)
- --
-
- cfg.set(cfg.default)
-
- config_flags[cfg.flag] = cfg.set
-
- return setmetatable(cfg, library)
- end
-
- function library:dropdown(options)
- local cfg = {
- name = options.name or nil,
- flag = options.flag or options.name or "Flag",
- items = options.items or {""},
- callback = options.callback or function() end,
- multi = options.multi or false,
- scrolling = options.scrolling or false,
-
- -- Ignore these
- open = false,
- option_instances = {},
- multi_items = {},
- ignore = options.ignore or false,
- }
-
- cfg.default = options.default or (cfg.multi and {cfg.items[1]}) or cfg.items[1] or "None"
-
- flags[cfg.flag] = {}
-
- -- Instances
- -- Element
- local dropdown = library:create("Frame", {
- Parent = self.elements;
- BackgroundTransparency = 1;
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, 0, 0, 16);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- local dropdown_holder = library:create("TextButton", {
- AnchorPoint = vec2(1, 0);
- AutoButtonColor = false;
- Text = "";
- Parent = dropdown;
- Position = dim2(1, 0, 0, 0);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(0.5, 0, 0, 16);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(dropdown_holder, tostring(self.count), "BackgroundColor3")
-
- local inline = library:create("Frame", {
- Parent = dropdown_holder;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(35, 35, 35)
- });
-
- local text = library:create("TextLabel", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(255, 255, 255);
- BorderColor3 = rgb(0, 0, 0);
- Text = cfg.name;
- Parent = inline;
- Size = dim2(1, 0, 1, 0);
- BackgroundTransparency = 1;
- Position = dim2(0, 0, 0, 1);
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.X;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- local title = library:create("TextLabel", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(255, 255, 255);
- BorderColor3 = rgb(0, 0, 0);
- Text = cfg.name;
- Parent = dropdown;
- Size = dim2(1, 0, 1, 0);
- Position = dim2(0, 1, 0, 0);
- BackgroundTransparency = 1;
- TextXAlignment = Enum.TextXAlignment.Left;
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.X;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
- --
-
- -- Holder
- local accent = library:create("Frame", {
- Parent = library.gui;
- Size = dim2(0.0907348021864891, 0, 0.006218905560672283, 20);
- Position = dim2(0, 500, 0, 100);
- BorderColor3 = rgb(0, 0, 0);
- BorderSizePixel = 0;
- Visible = false;
- AutomaticSize = Enum.AutomaticSize.Y;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3")
-
- local inline = library:create("Frame", {
- Parent = accent;
- Size = dim2(1, -2, 1, -2);
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.Y;
- BackgroundColor3 = themes.preset.inline
- }); library:apply_theme(inline, "inline", "BackgroundColor3")
-
- library:create("UIListLayout", {
- Parent = inline;
- Padding = dim(0, 6);
- SortOrder = Enum.SortOrder.LayoutOrder
- });
-
- library:create("UIPadding", {
- PaddingTop = dim(0, 5);
- PaddingBottom = dim(0, 2);
- Parent = inline;
- PaddingRight = dim(0, 6);
- PaddingLeft = dim(0, 6)
- });
-
- local padding = library:create("UIPadding", {
- PaddingBottom = dim(0, 2);
- Parent = accent
- });
- --
- --
-
- -- Functions
- function cfg.render_option(text)
- local title = library:create("TextButton", {
- FontFace = fonts["ProggyClean"];
- AutoButtonColor = false;
- TextColor3 = rgb(170, 170, 170);
- BorderColor3 = rgb(0, 0, 0);
- Text = text;
- Parent = inline;
- Size = dim2(1, 0, 0, 0);
- Position = dim2(0, 0, 0, 1);
- BackgroundTransparency = 1;
- TextXAlignment = Enum.TextXAlignment.Left;
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.Y;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- return title
- end
-
- function cfg.set_visible(bool)
- accent.Visible = bool
- end
-
- function cfg.set(value)
- local selected = {}
- local isTable = type(value) == "table"
-
- if value == nil then
- return
- end
-
- for _, option in next, cfg.option_instances do
- if option.Text == value or (isTable and find(value, option.Text)) then
- insert(selected, option.Text)
- cfg.multi_items = selected
- option.TextColor3 = rgb(255, 255, 255)
- else
- option.TextColor3 = rgb(170, 170, 170)
- end
- end
-
- text.Text = if isTable then concat(selected, ", ") else selected[1]
-
- flags[cfg.flag] = if isTable then selected else selected[1]
-
- cfg.callback(flags[cfg.flag])
- end
-
- function cfg.refresh_options(list)
- for _, option in next, cfg.option_instances do
- option:Destroy()
- end
-
- cfg.option_instances = {}
-
- for _, option in next, list do
- local button = cfg.render_option(option)
-
- insert(cfg.option_instances, button)
-
- button.MouseButton1Down:Connect(function()
- if cfg.multi then
- local selected_index = find(cfg.multi_items, button.Text)
-
- if selected_index then
- remove(cfg.multi_items, selected_index)
- else
- insert(cfg.multi_items, button.Text)
- end
-
- cfg.set(cfg.multi_items)
- else
- cfg.set_visible(false)
- cfg.open = false
-
- cfg.set(button.Text)
- end
- end)
- end
- end
-
- cfg.refresh_options(cfg.items)
-
- cfg.set(cfg.default)
-
- config_flags[cfg.flag] = cfg.set
- --
-
- -- Connections
- dropdown_holder.MouseButton1Click:Connect(function()
- cfg.open = not cfg.open
-
- accent.Size = dim2(0, dropdown_holder.AbsoluteSize.X, 0, accent.Size.Y.Offset)
- accent.Position = dim2(0, dropdown_holder.AbsolutePosition.X, 0, dropdown_holder.AbsolutePosition.Y + 77)
-
- cfg.set_visible(cfg.open)
- end)
-
- uis.InputEnded:Connect(function(input)
- if input.UserInputType == Enum.UserInputType.MouseButton1 then
- if not (library:mouse_in_frame(accent) or library:mouse_in_frame(dropdown)) then
- cfg.open = false
- cfg.set_visible(false)
- end
- end
- end)
- --
-
- return setmetatable(cfg, library)
- end
-
- function library:colorpicker(options)
- local cfg = {
- name = options.name or "Color",
- flag = options.flag or options.name or "Flag",
-
- color = options.color or color(1, 1, 1), -- Default to white color if not provided
- alpha = options.alpha and 1 - options.alpha or 0,
-
- open = false,
- callback = options.callback or function() end,
- }
-
- -- Instances
- -- Element
- local colorpicker_element = library:create("TextButton", {
- Parent = self.elements;
- BackgroundTransparency = 1;
- Text = "";
- AutoButtonColor = false;
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, 0, 0, 12);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- local accent = library:create("Frame", {
- AnchorPoint = vec2(1, 0);
- Parent = colorpicker_element;
- Position = dim2(1, 0, 0, 0);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(0, 30, 0, 12);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3")
-
- local colorpicker_element_color = library:create("Frame", {
- Parent = accent;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- library:create("TextLabel", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(255, 255, 255);
- BorderColor3 = rgb(0, 0, 0);
- Text = cfg.name;
- Parent = colorpicker_element;
- Size = dim2(1, 0, 1, 0);
- Position = dim2(0, 1, 0, 0);
- BackgroundTransparency = 1;
- TextXAlignment = Enum.TextXAlignment.Left;
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.X;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- --
-
- -- Elements
- local colorpicker = library:create("Frame", {
- Parent = library.gui;
- Position = dim2(0.6888179183006287, 0, 0.24751244485378265, 0);
- BorderColor3 = rgb(0, 0, 0);
- Visible = false;
- Size = dim2(0, 150, 0, 150);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(colorpicker, tostring(self.count), "BackgroundColor3")
-
- local a = library:create("Frame", {
- Parent = colorpicker;
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, 0, 1, 0);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(a, tostring(self.count), "BackgroundColor3")
-
- local e = library:create("Frame", {
- Parent = a;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(0, 0, 0);
- BackgroundTransparency = 0.6;
- ZIndex = -1
- });
-
- local _ = library:create("UIPadding", {
- PaddingTop = dim(0, 7);
- PaddingBottom = dim(0, -13);
- Parent = e;
- PaddingRight = dim(0, 6);
- PaddingLeft = dim(0, 7)
- });
-
- local textbox_holder = library:create("Frame", {
- Parent = e;
- Position = dim2(0, 0, 1, -36);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -1, 0, 16);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(textbox_holder, tostring(self.count), "BackgroundColor3")
-
- local textbox = library:create("TextBox", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(255, 255, 255);
- BorderColor3 = rgb(0, 0, 0);
- Text = "";
- Parent = textbox_holder;
- BackgroundTransparency = 0;
- ClearTextOnFocus = false;
- PlaceholderColor3 = rgb(255, 255, 255);
- Size = dim2(1, -2, 1, -2);
- Position = dim2(0, 1, 0, 1);
- BorderSizePixel = 0;
- TextSize = 12;
- TextXAlignment = Enum.TextXAlignment.Center;
- BackgroundColor3 = themes.preset.inline
- }); library:apply_theme(textbox, "inline", "BackgroundColor3")
-
- local hue_button = library:create("TextButton", {
- AnchorPoint = vec2(1, 0);
- Text = "";
- AutoButtonColor = false;
- Parent = e;
- Position = dim2(1, -1, 0, 0);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(0, 14, 1, -60);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset.inline
- }); library:apply_theme(hue_button, "inline", "BackgroundColor3")
-
- local hue_drag = library:create("Frame", {
- Parent = hue_button;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- library:create("UIGradient", {
- Rotation = 90;
- Parent = hue_drag;
- Color = rgbseq{rgbkey(0, rgb(255, 0, 0)), rgbkey(0.17, rgb(255, 255, 0)), rgbkey(0.33, rgb(0, 255, 0)), rgbkey(0.5, rgb(0, 255, 255)), rgbkey(0.67, rgb(0, 0, 255)), rgbkey(0.83, rgb(255, 0, 255)), rgbkey(1, rgb(255, 0, 0))}
- });
-
- local hue_picker = library:create("Frame", {
- Parent = hue_drag;
- BorderMode = Enum.BorderMode.Inset;
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, 2, 0, 3);
- Position = dim2(0, -1, 0, -1);
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- local alpha_button = library:create("TextButton", {
- AnchorPoint = vec2(0, 0.5);
- Text = "";
- AutoButtonColor = false;
- Parent = e;
- Position = dim2(0, 0, 1, -48);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -1, 0, 14);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset.inline
- }); library:apply_theme(alpha_button, "inline", "BackgroundColor3")
-
- local alpha_color = library:create("Frame", {
- Parent = alpha_button;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(0, 221, 255)
- });
-
- local alphaind = library:create("ImageLabel", {
- ScaleType = Enum.ScaleType.Tile;
- BorderColor3 = rgb(0, 0, 0);
- Parent = alpha_color;
- Image = "rbxassetid://18274452449";
- BackgroundTransparency = 1;
- Size = dim2(1, 0, 1, 0);
- TileSize = dim2(0, 4, 0, 4);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- library:create("UIGradient", {
- Parent = alphaind;
- Transparency = numseq{numkey(0, 0), numkey(1, 1)}
- });
-
- local alpha_picker = library:create("Frame", {
- Parent = alpha_color;
- BorderMode = Enum.BorderMode.Inset;
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(0, 3, 1, 2);
- Position = dim2(0, -1, 0, -1);
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- local saturation_value_button = library:create("TextButton", {
- Parent = e;
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -20, 1, -60);
- Text = "";
- AutoButtonColor = false;
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset.inline
- }); library:apply_theme(saturation_value_button, "inline", "BackgroundColor3")
-
- local colorpicker_color = library:create("Frame", {
- Parent = saturation_value_button;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(0, 221, 255)
- });
-
- local val = library:create("TextButton", {
- Parent = colorpicker_color;
- Text = "";
- AutoButtonColor = false;
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, 0, 1, 0);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- library:create("UIGradient", {
- Parent = val;
- Transparency = numseq{numkey(0, 0), numkey(1, 1)}
- });
-
- local saturation_value_picker = library:create("Frame", {
- Parent = colorpicker_color;
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(0, 3, 0, 3);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(0, 0, 0)
- });
-
- local inline = library:create("Frame", {
- Parent = saturation_value_picker;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- local saturation_button = library:create("TextButton", {
- Parent = colorpicker_color;
- Text = "";
- AutoButtonColor = false;
- Size = dim2(1, 0, 1, 0);
- BorderColor3 = rgb(0, 0, 0);
- ZIndex = 2;
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- library:create("UIGradient", {
- Rotation = 270;
- Transparency = numseq{numkey(0, 0), numkey(1, 1)};
- Parent = saturation_button;
- Color = rgbseq{rgbkey(0, rgb(0, 0, 0)), rgbkey(1, rgb(0, 0, 0))}
- });
-
-
- --
- --
-
- -- Functions
- local dragging_sat = false
- local dragging_hue = false
- local dragging_alpha = false
-
- local h, s, v = cfg.color:ToHSV()
- local a = cfg.alpha
-
- flags[cfg.flag] = {}
-
- function cfg.set_visible(bool)
- colorpicker.Visible = bool
-
- colorpicker.Position = dim_offset(colorpicker_element_color.AbsolutePosition.X - 1, colorpicker_element_color.AbsolutePosition.Y + colorpicker_element_color.AbsoluteSize.Y + 65)
- end
-
- function cfg.set(color, alpha)
- if color then
- h, s, v = color:ToHSV()
- end
-
- if alpha then
- a = alpha
- end
-
- local Color = Color3.fromHSV(h, s, v)
-
- hue_picker.Position = dim2(0, -1, 1 - h, -1)
- alpha_picker.Position = dim2(1 - a, -1, 0, -1)
- saturation_value_picker.Position = dim2(s, -1, 1 - v, -1)
-
- --element_alpha.ImageTransparency = 1 - a
-
- alpha_color.BackgroundColor3 = Color3.fromHSV(h, 1, 1)
- colorpicker_element_color.BackgroundColor3 = Color
- colorpicker_color.BackgroundColor3 = Color3.fromHSV(h, 1, 1)
-
- flags[cfg.flag] = {
- Color = Color;
- Transparency = a
- }
-
- local color = colorpicker_element_color.BackgroundColor3
- textbox.Text = string.format("%s, %s, %s, ", library:round(color.R * 255), library:round(color.G * 255), library:round(color.B * 255))
- textbox.Text ..= library:round(1 - a, 0.01)
-
- cfg.callback(Color, a)
- end
-
- function cfg.update_color()
- local mouse = uis:GetMouseLocation()
- local offset = vec2(mouse.X, mouse.Y - gui_offset)
-
- if dragging_sat then
- s = math.clamp((offset - saturation_value_button.AbsolutePosition).X / saturation_value_button.AbsoluteSize.X, 0, 1)
- v = 1 - math.clamp((offset - saturation_value_button.AbsolutePosition).Y / saturation_value_button.AbsoluteSize.Y, 0, 1)
- elseif dragging_hue then
- h = 1 - math.clamp((offset - hue_button.AbsolutePosition).Y / hue_button.AbsoluteSize.Y, 0, 1)
- elseif dragging_alpha then
- a = 1 - math.clamp((offset - alpha_button.AbsolutePosition).X / alpha_button.AbsoluteSize.X, 0, 1)
- end
-
- cfg.set(nil, nil)
- end
-
- cfg.set(cfg.color, cfg.alpha)
-
- config_flags[cfg.flag] = cfg.set
- --
-
- -- Connections
- colorpicker_element.MouseButton1Click:Connect(function()
- cfg.open = not cfg.open
-
- cfg.set_visible(cfg.open)
- end)
-
- uis.InputChanged:Connect(function(input)
- if (dragging_sat or dragging_hue or dragging_alpha) and input.UserInputType == Enum.UserInputType.MouseMovement then
- cfg.update_color()
- end
- end)
-
- library:connection(uis.InputEnded, function(input)
- if input.UserInputType == Enum.UserInputType.MouseButton1 then
- dragging_sat = false
- dragging_hue = false
- dragging_alpha = false
-
- if not (library:mouse_in_frame(colorpicker_element) or library:mouse_in_frame(colorpicker)) then
- cfg.open = false
- cfg.set_visible(false)
- end
- end
- end)
-
- alpha_button.MouseButton1Down:Connect(function()
- dragging_alpha = true
- end)
-
- hue_button.MouseButton1Down:Connect(function()
- dragging_hue = true
- end)
-
- saturation_button.MouseButton1Down:Connect(function()
- print("hiu")
- dragging_sat = true
- end)
-
- textbox.FocusLost:Connect(function()
- local r, g, b, a = library:convert(textbox.Text)
-
- if r and g and b and a then
- cfg.set(rgb(r, g, b), 1 - a)
- end
- end)
- --
-
- return setmetatable(cfg, library)
- end
-
- function library:textbox(options)
- local cfg = {
- name = options.name or "...",
- placeholder = options.placeholder or options.placeholdertext or options.holder or options.holdertext or "type here...",
- default = options.default,
- flag = options.flag or options.name or "Flag",
- callback = options.callback or function() end,
- visible = options.visible or true,
- }
-
- -- Instances
- local frame = library:create("TextButton", {
- AnchorPoint = vec2(1, 0);
- Text = "";
- AutoButtonColor = false;
- Parent = self.elements;
- Position = dim2(1, 0, 0, 0);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, 0, 0, 16);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(frame, tostring(self.count), "BackgroundColor3")
-
- local frame_inline = library:create("Frame", {
- Parent = frame;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset.inline
- }); library:apply_theme(frame_inline, "inline", "BackgroundColor3")
-
- local input = library:create("TextBox", {
- Parent = frame,
- Name = "",
- FontFace = fonts["ProggyClean"],
- TextTruncate = Enum.TextTruncate.AtEnd,
- TextSize = 12,
- Text = "",
- Size = dim2(1, -6, 1, 0),
- RichText = true,
- TextColor3 = rgb(255, 255, 255),
- BorderColor3 = rgb(0, 0, 0),
- CursorPosition = -1,
- BackgroundTransparency = 1,
- TextXAlignment = Enum.TextXAlignment.Left,
- Position = dim2(0, 6, 0, 0),
- BorderSizePixel = 0,
- PlaceholderColor3 = rgb(170, 170, 170),
- })
- --
-
- -- Functions
- function cfg.set(text)
- flags[cfg.flag] = text
-
- input.Text = text
-
- cfg.callback(text)
- end
-
- config_flags[cfg.flag] = cfg.set
-
- if cfg.default then
- cfg.set(cfg.default)
- end
- --
-
- -- Connections
- input:GetPropertyChangedSignal("Text"):Connect(function()
- cfg.set(input.Text)
- end)
- --
-
- return setmetatable(cfg, library)
- end
-
- function library:keybind(options)
- local cfg = {
- flag = options.flag or options.name or "Flag",
- callback = options.callback or function() end,
- open = false,
- binding = nil,
- name = options.name or nil,
- ignore_key = options.ignore or false,
-
- key = options.key or nil,
- mode = options.mode or "toggle",
- active = options.default or false,
-
- hold_instances = {},
- }
-
- flags[cfg.flag] = {}
-
- -- Instances
- -- Element
- local keybind = library:create("Frame", {
- Parent = self.elements;
- BackgroundTransparency = 1;
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, 0, 0, 16);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- local keybind_holder = library:create("TextButton", {
- AnchorPoint = vec2(1, 0);
- AutoButtonColor = false;
- Text = "";
- Parent = keybind;
- Position = dim2(1, 0, 0, 0);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(0.5, 0, 0, 16);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(keybind_holder, tostring(self.count), "BackgroundColor3")
-
- local inline = library:create("Frame", {
- Parent = keybind_holder;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = rgb(35, 35, 35)
- });
-
- local text = library:create("TextLabel", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(255, 255, 255);
- BorderColor3 = rgb(0, 0, 0);
- Text = cfg.name;
- Parent = inline;
- Size = dim2(1, 0, 1, 0);
- BackgroundTransparency = 1;
- Position = dim2(0, 0, 0, -1);
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.X;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
-
- local title = library:create("TextLabel", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(255, 255, 255);
- BorderColor3 = rgb(0, 0, 0);
- Text = cfg.name;
- Parent = keybind;
- Size = dim2(1, 0, 1, 0);
- Position = dim2(0, 1, 0, 0);
- BackgroundTransparency = 1;
- TextXAlignment = Enum.TextXAlignment.Left;
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.X;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
- --
-
- -- Holder
- local accent = library:create("Frame", {
- Parent = library.gui;
- Visible = false;
- Size = dim2(0.0907348021864891, 0, 0.006218905560672283, 20);
- Position = dim2(0, 500, 0, 100);
- BorderColor3 = rgb(0, 0, 0);
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.Y;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3")
-
- local inline = library:create("Frame", {
- Parent = accent;
- Size = dim2(1, -2, 1, -2);
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.Y;
- BackgroundColor3 = themes.preset.inline
- }); library:apply_theme(inline, "inline", "BackgroundColor3")
-
- library:create("UIListLayout", {
- Parent = inline;
- Padding = dim(0, 6);
- SortOrder = Enum.SortOrder.LayoutOrder
- });
-
- library:create("UIPadding", {
- PaddingTop = dim(0, 5);
- PaddingBottom = dim(0, 2);
- Parent = inline;
- PaddingRight = dim(0, 6);
- PaddingLeft = dim(0, 6)
- });
-
- local padding = library:create("UIPadding", {
- PaddingBottom = dim(0, 2);
- Parent = accent
- });
-
- local options = {"Hold", "Toggle", "Always"}
-
- for _, v in options do
- local option = library:create("TextButton", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(170, 170, 170);
- BorderColor3 = rgb(0, 0, 0);
- Text = v;
- Parent = inline;
- Position = dim2(0, 0, 0, 1);
- BackgroundTransparency = 1;
- TextXAlignment = Enum.TextXAlignment.Left;
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.XY;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- }); cfg.hold_instances[v] = option
-
- option.MouseButton1Click:Connect(function()
- cfg.set(v)
-
- cfg.set_visible(false)
-
- cfg.open = false
- end)
- end
- --
- --
-
- -- Functions
- function cfg.modify_mode_color(path) -- ts so frikin tuff 💀
- for _, v in cfg.hold_instances do
- v.TextColor3 = rgb(170, 170, 170)
- end
-
- if cfg.hold_instances[path] then
- cfg.hold_instances[path].TextColor3 = rgb(255, 255, 255)
- end
- end
-
- function cfg.set_mode(mode)
- cfg.mode = mode
-
- if mode == "Always" then
- cfg.set(true)
- elseif mode == "Hold" then
- cfg.set(false)
- end
-
- flags[cfg.flag]["mode"] = mode
- cfg.modify_mode_color(mode)
- end
-
- function cfg.set(input)
- if type(input) == "boolean" then
- local __cached = input
-
- if cfg.mode == "Always" then
- __cached = true
- end
-
- cfg.active = __cached
- cfg.callback(__cached)
- elseif tostring(input):find("Enum") then
- input = input.Name == "Escape" and "..." or input
-
- cfg.key = input or "..."
-
- cfg.callback(cfg.active or false)
- elseif find({"Toggle", "Hold", "Always"}, input) then
- cfg.set_mode(input)
-
- if input == "Always" then
- cfg.active = true
- end
-
- cfg.callback(cfg.active or false)
- elseif type(input) == "table" then
- input.key = type(input.key) == "string" and input.key ~= "..." and library:convert_enum(input.key) or input.key
-
- input.key = input.key == Enum.KeyCode.Escape and "..." or input.key
- cfg.key = input.key or "..."
-
- cfg.mode = input.mode or "Toggle"
- cfg.set_mode(input.mode)
-
- if input.active then
- cfg.active = input.active
- end
- end
-
- flags[cfg.flag] = {
- mode = cfg.mode,
- key = cfg.key,
- active = cfg.active
- }
-
- local _text = tostring(cfg.key) ~= "Enums" and (keys[cfg.key] or tostring(cfg.key):gsub("Enum.", "")) or nil
- local __text = _text and (tostring(_text):gsub("KeyCode.", ""):gsub("UserInputType.", ""))
-
- text.Text = " ".. __text .." "
-
- -- if keybind_list_text then
- -- keybind_list_text.Text = "[ ".. __text .." ] ".. cfg.name ..":".. string.lower(cfg.mode) .."";
- -- keybind_list_text.Visible = cfg.active
- -- end
- end
-
- function cfg.set_visible(bool)
- accent.Visible = bool
-
- accent.Size = dim2(0, keybind_holder.AbsoluteSize.X, 0, accent.Size.Y.Offset)
- accent.Position = dim2(0, keybind_holder.AbsolutePosition.X, 0, keybind_holder.AbsolutePosition.Y + 77)
- end
- --
-
- -- Connections
- keybind_holder.MouseButton1Down:Connect(function()
- task.wait()
- text.Text = "..."
-
- cfg.binding = library:connection(uis.InputBegan, function(keycode, game_event)
- cfg.set(keycode.KeyCode)
-
- cfg.binding:Disconnect()
- cfg.binding = nil
- end)
- end)
-
- keybind_holder.MouseButton2Down:Connect(function()
- cfg.open = not cfg.open
-
- cfg.set_visible(cfg.open)
- end)
-
- library:connection(uis.InputBegan, function(input, game_event)
- if not game_event then
- if input.KeyCode == cfg.key then
- if cfg.mode == "Toggle" then
- cfg.active = not cfg.active
- cfg.set(cfg.active)
- elseif cfg.mode == "Hold" then
- cfg.set(true)
- end
- end
- end
- end)
-
- library:connection(uis.InputEnded, function(input, game_event)
- if game_event then
- return
- end
-
- local selected_key = input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode or input.UserInputType
-
- if selected_key == cfg.key then
- if cfg.mode == "Hold" then
- cfg.set(false)
- end
- end
-
- if input.UserInputType == Enum.UserInputType.MouseButton1 then
- if not (library:mouse_in_frame(keybind_holder) or library:mouse_in_frame(accent)) then
- cfg.open = false
- cfg.set_visible(false)
- end
- end
- end)
- --
-
- config_flags[cfg.flag] = cfg.set
- cfg.set({mode = cfg.mode, active = cfg.active, key = cfg.key})
-
- return setmetatable(cfg, library)
- end
-
- function library:button(options)
- local cfg = {
- name = options.name or "button",
- callback = options.callback or function() end,
- }
-
- -- Instances
- local frame = library:create("TextButton", {
- AnchorPoint = vec2(1, 0);
- Text = "";
- AutoButtonColor = false;
- Parent = self.elements;
- Position = dim2(1, 0, 0, 0);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, 0, 0, 16);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset[tostring(self.count)]
- }); library:apply_theme(frame, tostring(self.count), "BackgroundColor3")
-
- local frame_inline = library:create("Frame", {
- Parent = frame;
- Position = dim2(0, 1, 0, 1);
- BorderColor3 = rgb(0, 0, 0);
- Size = dim2(1, -2, 1, -2);
- BorderSizePixel = 0;
- BackgroundColor3 = themes.preset.inline
- }); library:apply_theme(frame_inline, "inline", "BackgroundColor3")
-
- local text = library:create("TextLabel", {
- FontFace = fonts["ProggyClean"];
- TextColor3 = rgb(255, 255, 255);
- BorderColor3 = rgb(0, 0, 0);
- Text = cfg.name;
- Parent = frame;
- Size = dim2(1, 0, 1, 0);
- BackgroundTransparency = 1;
- Position = dim2(0, 1, 0, 1);
- BorderSizePixel = 0;
- AutomaticSize = Enum.AutomaticSize.X;
- TextSize = 12;
- BackgroundColor3 = rgb(255, 255, 255)
- });
- --
-
- -- Connections
- frame.MouseButton1Click:Connect(function()
- cfg.callback()
- end)
- --
-
- return setmetatable(cfg, library)
- end
-
- function library:init_config(window)
- local textbox;
- local main = window:tab({name = "Configs"})
- local section = main:column({}):section({name = "Settings", size = 1, default = true})
- config_holder = section:dropdown({name = "Configs", options = {"Report", "This", "Error", "To", "Finobe"}, callback = function(option) if textbox then textbox.set(option) end end, flag = "config_name_list"}); library:update_config_list()
- textbox = section:textbox({name = "Config name:", flag = "config_name_text"})
- section:button({name = "Save", callback = function() writefile(library.directory .. "/configs/" .. flags["config_name_text"] .. ".cfg", library:get_config()) library:update_config_list() end})
- section:button({name = "Load", callback = function() library:load_config(readfile(library.directory .. "/configs/" .. flags["config_name_text"] .. ".cfg")) library:update_config_list() end})
- section:button({name = "Delete", callback = function() delfile(library.directory .. "/configs/" .. flags["config_name_text"] .. ".cfg") library:update_config_list() end})
-
- local section = main:column({}):section({name = "Other", size = 1, default = true})
- section:keybind({name = "Menu bind", callback = function(bool) window.toggle_menu(bool) end, default = true})
- section:colorpicker({name = "Gradient 1", callback = function(color)
- library:update_theme("1", color)
-
- library.gradient.Color = rgbseq{
- rgbkey(0, themes.preset["1"]),
- rgbkey(0.5, themes.preset["2"]),
- rgbkey(1, themes.preset["3"]),
- };
-
- library.watermark_gradient.Color = rgbseq{
- rgbkey(0, themes.preset["1"]),
- rgbkey(0.5, themes.preset["2"]),
- rgbkey(1, themes.preset["3"]),
- };
- end, color = themes.preset["1"]})
- section:colorpicker({name = "Gradient 2", callback = function(color)
- library:update_theme("2", color)
-
- library.gradient.Color = rgbseq{
- rgbkey(0, themes.preset["1"]),
- rgbkey(0.5, themes.preset["2"]),
- rgbkey(1, themes.preset["3"]),
- };
-
- library.watermark_gradient.Color = rgbseq{
- rgbkey(0, themes.preset["1"]),
- rgbkey(0.5, themes.preset["2"]),
- rgbkey(1, themes.preset["3"]),
- };
- end, color = themes.preset["2"]})
- section:colorpicker({name = "Gradient 3", callback = function(color)
- library:update_theme("3", color)
-
- library.gradient.Color = rgbseq{
- rgbkey(0, themes.preset["1"]),
- rgbkey(0.5, themes.preset["2"]),
- rgbkey(1, themes.preset["3"]),
- };
-
- library.watermark_gradient.Color = rgbseq{
- rgbkey(0, themes.preset["1"]),
- rgbkey(0.5, themes.preset["2"]),
- rgbkey(1, themes.preset["3"]),
- };
- end, color = themes.preset["3"]})
-
- main:column({})
- end
- --
- --
---
-
-return library, notifications
+-- Variables
+ local uis = game:GetService("UserInputService")
+ local players = game:GetService("Players")
+ local ws = game:GetService("Workspace")
+ local rs = game:GetService("ReplicatedStorage")
+ local http_service = game:GetService("HttpService")
+ local gui_service = game:GetService("GuiService")
+ local lighting = game:GetService("Lighting")
+ local run = game:GetService("RunService")
+ local stats = game:GetService("Stats")
+ local coregui = game:GetService("CoreGui")
+ local debris = game:GetService("Debris")
+ local tween_service = game:GetService("TweenService")
+ local sound_service = game:GetService("SoundService")
+
+ local vec2 = Vector2.new
+ local vec3 = Vector3.new
+ local dim2 = UDim2.new
+ local dim = UDim.new
+ local rect = Rect.new
+ local cfr = CFrame.new
+ local empty_cfr = cfr()
+ local point_object_space = empty_cfr.PointToObjectSpace
+ local angle = CFrame.Angles
+ local dim_offset = UDim2.fromOffset
+
+ local color = Color3.new
+ local rgb = Color3.fromRGB
+ local hex = Color3.fromHex
+ local hsv = Color3.fromHSV
+ local rgbseq = ColorSequence.new
+ local rgbkey = ColorSequenceKeypoint.new
+ local numseq = NumberSequence.new
+ local numkey = NumberSequenceKeypoint.new
+
+ local camera = ws.CurrentCamera
+ local lp = players.LocalPlayer
+ local mouse = lp:GetMouse()
+ local gui_offset = gui_service:GetGuiInset().Y
+
+ local max = math.max
+ local floor = math.floor
+ local min = math.min
+ local abs = math.abs
+ local noise = math.noise
+ local rad = math.rad
+ local random = math.random
+ local pow = math.pow
+ local sin = math.sin
+ local pi = math.pi
+ local tan = math.tan
+ local atan2 = math.atan2
+ local clamp = math.clamp
+
+ local insert = table.insert
+ local find = table.find
+ local remove = table.remove
+ local concat = table.concat
+--
+
+-- Library init
+ getgenv().library = {
+ directory = "mirrorhack",
+ folders = {
+ "/fonts",
+ "/configs",
+ },
+ flags = {},
+ config_flags = {},
+
+ connections = {},
+ notifications = {},
+ playerlist_data = {
+ players = {},
+ player = {},
+ },
+ colorpicker_open = false;
+ gui;
+ }
+
+ local themes = {
+ preset = {
+ outline = rgb(10, 10, 10),
+ inline = rgb(35, 35, 35),
+ text = rgb(180, 180, 180),
+ text_outline = rgb(0, 0, 0),
+ background = rgb(20, 20, 20),
+ ["1"] = hex("#245771"),
+ ["2"] = hex("#215D63"),
+ ["3"] = hex("#1E6453"),
+ },
+
+ utility = {
+ inline = {
+ BackgroundColor3 = {}
+ },
+ text = {
+ TextColor3 = {}
+ },
+ text_outline = {
+ Color = {}
+ },
+ ["1"] = {
+ BackgroundColor3 = {},
+ TextColor3 = {},
+ ImageColor3 = {},
+ ScrollBarImageColor3 = {}
+ },
+ ["2"] = {
+ BackgroundColor3 = {},
+ TextColor3 = {},
+ ImageColor3 = {},
+ ScrollBarImageColor3 = {}
+ },
+ ["3"] = {
+ BackgroundColor3 = {},
+ TextColor3 = {},
+ ImageColor3 = {},
+ ScrollBarImageColor3 = {}
+ },
+ }
+ }
+
+ local keys = {
+ [Enum.KeyCode.LeftShift] = "LS",
+ [Enum.KeyCode.RightShift] = "RS",
+ [Enum.KeyCode.LeftControl] = "LC",
+ [Enum.KeyCode.RightControl] = "RC",
+ [Enum.KeyCode.Insert] = "INS",
+ [Enum.KeyCode.Backspace] = "BS",
+ [Enum.KeyCode.Return] = "Ent",
+ [Enum.KeyCode.LeftAlt] = "LA",
+ [Enum.KeyCode.RightAlt] = "RA",
+ [Enum.KeyCode.CapsLock] = "CAPS",
+ [Enum.KeyCode.One] = "1",
+ [Enum.KeyCode.Two] = "2",
+ [Enum.KeyCode.Three] = "3",
+ [Enum.KeyCode.Four] = "4",
+ [Enum.KeyCode.Five] = "5",
+ [Enum.KeyCode.Six] = "6",
+ [Enum.KeyCode.Seven] = "7",
+ [Enum.KeyCode.Eight] = "8",
+ [Enum.KeyCode.Nine] = "9",
+ [Enum.KeyCode.Zero] = "0",
+ [Enum.KeyCode.KeypadOne] = "Num1",
+ [Enum.KeyCode.KeypadTwo] = "Num2",
+ [Enum.KeyCode.KeypadThree] = "Num3",
+ [Enum.KeyCode.KeypadFour] = "Num4",
+ [Enum.KeyCode.KeypadFive] = "Num5",
+ [Enum.KeyCode.KeypadSix] = "Num6",
+ [Enum.KeyCode.KeypadSeven] = "Num7",
+ [Enum.KeyCode.KeypadEight] = "Num8",
+ [Enum.KeyCode.KeypadNine] = "Num9",
+ [Enum.KeyCode.KeypadZero] = "Num0",
+ [Enum.KeyCode.Minus] = "-",
+ [Enum.KeyCode.Equals] = "=",
+ [Enum.KeyCode.Tilde] = "~",
+ [Enum.KeyCode.LeftBracket] = "[",
+ [Enum.KeyCode.RightBracket] = "]",
+ [Enum.KeyCode.RightParenthesis] = ")",
+ [Enum.KeyCode.LeftParenthesis] = "(",
+ [Enum.KeyCode.Semicolon] = ",",
+ [Enum.KeyCode.Quote] = "'",
+ [Enum.KeyCode.BackSlash] = "\\",
+ [Enum.KeyCode.Comma] = ",",
+ [Enum.KeyCode.Period] = ".",
+ [Enum.KeyCode.Slash] = "/",
+ [Enum.KeyCode.Asterisk] = "*",
+ [Enum.KeyCode.Plus] = "+",
+ [Enum.KeyCode.Period] = ".",
+ [Enum.KeyCode.Backquote] = "`",
+ [Enum.UserInputType.MouseButton1] = "MB1",
+ [Enum.UserInputType.MouseButton2] = "MB2",
+ [Enum.UserInputType.MouseButton3] = "MB3",
+ [Enum.KeyCode.Escape] = "ESC",
+ [Enum.KeyCode.Space] = "SPC",
+ }
+
+ library.__index = library
+
+ for _, path in next, library.folders do
+ makefolder(library.directory .. path)
+ end
+
+ local flags = library.flags
+ local config_flags = library.config_flags
+
+ -- Font importing system
+ local fonts = {}; do
+ local font_dir = library.directory .. "/fonts/"
+
+ function Register_Font(Name, Weight, Style, Asset)
+ if not isfile(Asset.Id) then
+ writefile(Asset.Id, Asset.Font)
+ end
+
+ local font_path = font_dir .. Name .. ".font"
+
+ if isfile(font_path) then
+ delfile(font_path)
+ end
+
+ local Data = {
+ name = Name,
+ faces = {
+ {
+ name = "Regular",
+ weight = Weight,
+ style = Style,
+ assetId = getcustomasset(Asset.Id),
+ },
+ },
+ }
+
+ writefile(font_path, game:GetService("HttpService"):JSONEncode(Data))
+
+ return getcustomasset(font_path);
+ end
+
+ local TahomaBold = Register_Font("TahomaBold", 200, "Normal", {
+ Id = font_dir .. "TahomaBold.ttf",
+ Font = game:HttpGet("https://git.nfa.re/tul/mirrorhack/raw/branch/main/UI/fonts/tahomabold.ttf"),
+ })
+
+ local Tahoma = Register_Font("Tahoma", 200, "Normal", {
+ Id = font_dir .. "Tahoma.ttf",
+ Font = game:HttpGet("https://git.nfa.re/tul/mirrorhack/raw/branch/main/UI/fonts/tahoma.ttf"),
+ })
+
+ local SmallestPixel = Register_Font("SmallestPixel", 200, "normal", {
+ Id = font_dir .. "SmallestPixel.ttf",
+ Font = game:HttpGet("https://git.nfa.re/tul/mirrorhack/raw/branch/main/UI/fonts/smallestpixel.ttf"),
+ })
+
+ local ProggyClean = Register_Font("ProggyClean", 200, "normal", {
+ Id = font_dir .. "ProggyClean.ttf",
+ Font = game:HttpGet("https://git.nfa.re/tul/mirrorhack/raw/branch/main/UI/fonts/proggyclean.ttf"),
+ })
+
+ fonts = {
+ ["TahomaBold"] = Font.new(TahomaBold, Enum.FontWeight.Regular, Enum.FontStyle.Normal);
+ ["Tahoma"] = Font.new(Tahoma, Enum.FontWeight.Regular, Enum.FontStyle.Normal);
+ ["SmallestPixel"] = Font.new(SmallestPixel, Enum.FontWeight.Regular, Enum.FontStyle.Normal);
+ ["ProggyClean"] = Font.new(ProggyClean, Enum.FontWeight.Regular, Enum.FontStyle.Normal);
+ }
+ end
+ library.fonts = fonts
+ --
+--
+
+-- Library functions
+ -- Misc functions
+ function library:tween(obj, properties)
+ local tween = tween_service:Create(obj, TweenInfo.new(0.25, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut, 0, false, 0), properties):Play()
+
+ return tween
+ end
+
+ function library:close_current_element(cfg)
+ local path = library.current_element_open
+
+ if path then
+ path.set_visible(false)
+ path.open = false
+ end
+ end
+
+ function library:resizify(frame)
+ local Frame = Instance.new("TextButton")
+ Frame.Position = dim2(1, -10, 1, -10)
+ Frame.BorderColor3 = rgb(0, 0, 0)
+ Frame.Size = dim2(0, 10, 0, 10)
+ Frame.BorderSizePixel = 0
+ Frame.BackgroundColor3 = rgb(255, 255, 255)
+ Frame.Parent = frame
+ Frame.BackgroundTransparency = 1
+ Frame.Text = ""
+
+ local resizing = false
+ local start_size
+ local start
+ local og_size = frame.Size
+
+ Frame.InputBegan:Connect(function(input)
+ if input.UserInputType == Enum.UserInputType.MouseButton1 then
+ resizing = true
+ start = input.Position
+ start_size = frame.Size
+ end
+ end)
+
+ Frame.InputEnded:Connect(function(input)
+ if input.UserInputType == Enum.UserInputType.MouseButton1 then
+ resizing = false
+ end
+ end)
+
+ library:connection(uis.InputChanged, function(input, game_event)
+ if resizing and input.UserInputType == Enum.UserInputType.MouseMovement then
+ local viewport_x = camera.ViewportSize.X
+ local viewport_y = camera.ViewportSize.Y
+
+ local current_size = dim2(
+ start_size.X.Scale,
+ math.clamp(
+ start_size.X.Offset + (input.Position.X - start.X),
+ og_size.X.Offset,
+ viewport_x
+ ),
+ start_size.Y.Scale,
+ math.clamp(
+ start_size.Y.Offset + (input.Position.Y - start.Y),
+ og_size.Y.Offset,
+ viewport_y
+ )
+ )
+ frame.Size = current_size
+ end
+ end)
+ end
+
+ function library:mouse_in_frame(uiobject)
+ local y_cond = uiobject.AbsolutePosition.Y <= mouse.Y and mouse.Y <= uiobject.AbsolutePosition.Y + uiobject.AbsoluteSize.Y
+ local x_cond = uiobject.AbsolutePosition.X <= mouse.X and mouse.X <= uiobject.AbsolutePosition.X + uiobject.AbsoluteSize.X
+
+ return (y_cond and x_cond)
+ end
+
+ library.lerp = function(start, finish, t)
+ t = t or 1 / 8
+
+ return start * (1 - t) + finish * t
+ end
+
+ function library:draggify(frame)
+ local dragging = false
+ local start_size = frame.Position
+ local start
+
+ frame.InputBegan:Connect(function(input)
+ if input.UserInputType == Enum.UserInputType.MouseButton1 then
+ dragging = true
+ start = input.Position
+ start_size = frame.Position
+ end
+ end)
+
+ frame.InputEnded:Connect(function(input)
+ if input.UserInputType == Enum.UserInputType.MouseButton1 then
+ dragging = false
+ end
+ end)
+
+ library:connection(uis.InputChanged, function(input, game_event)
+ if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then
+ local viewport_x = camera.ViewportSize.X
+ local viewport_y = camera.ViewportSize.Y
+
+ local current_position = dim2(
+ 0,
+ clamp(
+ start_size.X.Offset + (input.Position.X - start.X),
+ 0,
+ viewport_x - frame.Size.X.Offset
+ ),
+ 0,
+ math.clamp(
+ start_size.Y.Offset + (input.Position.Y - start.Y),
+ 0,
+ viewport_y - frame.Size.Y.Offset
+ )
+ )
+
+ frame.Position = current_position
+ end
+ end)
+ end
+
+ function library:create_island(cfg)
+ local w = cfg.width or 100
+ local h = cfg.height or 40
+ local title = cfg.title or cfg.name or ""
+
+ local sg = library:create("ScreenGui", {
+ Parent = coregui,
+ Name = "\0",
+ IgnoreGuiInset = true,
+ ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
+ ResetOnSpawn = false,
+ })
+
+ local outer = library:create("Frame", {
+ Parent = sg,
+ Size = dim2(0, w, 0, h),
+ Position = dim2(0.5, -w/2, 0.5, -h/2),
+ BackgroundColor3 = themes.preset.outline,
+ BorderSizePixel = 0,
+ })
+
+ local inner = library:create("Frame", {
+ Parent = outer,
+ Size = dim2(1, -2, 1, -2),
+ Position = dim2(0, 1, 0, 1),
+ BackgroundColor3 = themes.preset.background,
+ BorderSizePixel = 0,
+ })
+
+ local title_label = library:create("TextLabel", {
+ Parent = inner,
+ Size = dim2(1, 0, 1, 0),
+ BackgroundTransparency = 1,
+ Text = title,
+ TextColor3 = themes.preset.text,
+ FontFace = fonts["TahomaBold"],
+ TextSize = 14,
+ BorderSizePixel = 0,
+ TextXAlignment = Enum.TextXAlignment.Center,
+ TextYAlignment = Enum.TextYAlignment.Center,
+ })
+
+ if cfg.draggable ~= false then
+ library:draggify(outer)
+ end
+
+ local island = {_frame = outer, _sg = sg}
+
+ function island:set_title(text)
+ title_label.Text = text
+ end
+
+ function island:set_pos(x, y)
+ outer.Position = dim2(0, x, 0, y)
+ end
+
+ function island:set_size(nw, nh)
+ outer.Size = dim2(0, nw, 0, nh)
+ end
+
+ function island:set_visible(v)
+ sg.Enabled = v
+ end
+
+ function island:get_pos()
+ return outer.Position.X.Offset, outer.Position.Y.Offset
+ end
+
+ return island
+ end
+
+ function library:convert(str)
+ local values = {}
+
+ for value in string.gmatch(str, "[^,]+") do
+ insert(values, tonumber(value))
+ end
+
+ if #values == 4 then
+ return unpack(values)
+ else
+ return
+ end
+ end
+
+ function library:convert_enum(enum)
+ local enum_parts = {}
+
+ for part in string.gmatch(enum, "[%w_]+") do
+ insert(enum_parts, part)
+ end
+
+ local enum_table = Enum
+ for i = 2, #enum_parts do
+ local enum_item = enum_table[enum_parts[i]]
+
+ enum_table = enum_item
+ end
+
+ return enum_table
+ end
+
+ local config_holder;
+ function library:update_config_list()
+ if not config_holder then
+ return
+ end
+
+ local list = {}
+
+ for idx, file in listfiles(library.directory .. "/configs") do
+ local name = file:gsub(library.directory .. "/configs\\", ""):gsub(".cfg", ""):gsub(library.directory .. "\\configs\\", "")
+ list[#list + 1] = name
+ end
+
+
+ config_holder.refresh_options(list)
+ end
+
+ function library:get_config()
+ local Config = {}
+
+ for _, v in flags do
+ if type(v) == "table" and v.key then
+ Config[_] = {active = v.active, mode = v.mode, key = tostring(v.key)}
+ elseif type(v) == "table" and v["Transparency"] and v["Color"] then
+ Config[_] = {Transparency = v["Transparency"], Color = v["Color"]:ToHex()}
+ else
+ Config[_] = v
+ end
+ end
+
+ return http_service:JSONEncode(Config)
+ end
+
+ function library:load_config(config_json)
+ local config = http_service:JSONDecode(config_json)
+
+ for _, v in next, config do
+ local function_set = library.config_flags[_]
+
+ if _ == "config_name_list" then
+ continue
+ end
+
+ if function_set then
+ if type(v) == "table" and v["Transparency"] and v["Color"] then
+ function_set(hex(v["Color"]), v["Transparency"])
+ elseif type(v) == "table" and v["active"] then
+ function_set(v)
+ else
+ function_set(v)
+ end
+ end
+ end
+ end
+
+ function library:round(number, float)
+ local multiplier = 1 / (float or 1)
+
+ return floor(number * multiplier + 0.5) / multiplier
+ end
+
+ function library:apply_theme(instance, theme, property)
+ insert(themes.utility[theme][property], instance)
+ end
+
+ function library:update_theme(theme, color)
+ for _, property in themes.utility[theme] do
+
+ for m, object in property do
+ if object[_] == themes.preset[theme] then
+ object[_] = color
+ end
+ end
+ end
+
+ themes.preset[theme] = color
+ end
+
+ function library:connection(signal, callback)
+ local connection = signal:Connect(callback)
+
+ insert(library.connections, connection)
+
+ return connection
+ end
+
+ function library:apply_stroke(parent)
+ local STROKE = library:create("UIStroke", {
+ Parent = parent,
+ Color = themes.preset.text_outline,
+ LineJoinMode = Enum.LineJoinMode.Miter
+ })
+
+ library:apply_theme(STROKE, "text_outline", "Color")
+ end
+
+ function library:create(instance, options)
+ local ins = Instance.new(instance)
+
+ for prop, value in next, options do
+ ins[prop] = value
+ end
+
+ if instance == "TextLabel" or instance == "TextButton" or instance == "TextBox" then
+ library:apply_theme(ins, "text", "TextColor3")
+ library:apply_stroke(ins)
+ end
+
+ return ins
+ end
+
+ function library:unload_menu()
+ if library.gui then
+ library.gui:Destroy()
+ end
+
+ for index, connection in next, library.connections do
+ connection:Disconnect()
+ connection = nil
+ end
+
+ if library.sgui then
+ library.sgui:Destroy()
+ end
+
+ library = nil
+ end
+ --
+
+ -- Library element functions
+ function library:window(properties)
+ local cfg = {
+ name = properties.name or properties.Name or "mirrorhack",
+ size = properties.size or properties.Size or dim2(0, 600, 0, 400),
+ selected_tab
+ }
+
+ library.gui = library:create("ScreenGui", {
+ Parent = coregui,
+ Name = "\0",
+ Enabled = true,
+ ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
+ IgnoreGuiInset = true,
+ })
+
+ -- Window
+ local window_outline = library:create("Frame", {
+ Parent = library.gui;
+ Position = dim2(0.5, -cfg.size.X.Offset / 2, 0.5, -cfg.size.Y.Offset / 2);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = cfg.size;
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+ window_outline.Position = dim2(0, window_outline.AbsolutePosition.Y, 0, window_outline.AbsolutePosition.Y)
+ cfg.main_outline = window_outline
+
+ library:resizify(window_outline)
+ library:draggify(window_outline)
+
+ local title_holder = library:create("Frame", {
+ Parent = window_outline;
+ BackgroundTransparency = 0.800000011920929;
+ Position = dim2(0, 2, 0, 2);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -4, 0, 20);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(0, 0, 0)
+ });
+
+ local ui_title = library:create("TextLabel", {
+ FontFace = fonts["TahomaBold"];
+ TextColor3 = rgb(255, 255, 255);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = cfg.name;
+ Parent = title_holder;
+ BackgroundTransparency = 1;
+ Size = dim2(1, 0, 1, 0);
+ BorderSizePixel = 0;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ library.gradient = library:create("UIGradient", {
+ Color = rgbseq{
+ rgbkey(0, themes.preset["1"]),
+ rgbkey(0.5, themes.preset["2"]),
+ rgbkey(1, themes.preset["3"]),
+ };
+ Parent = window_outline
+ });
+
+ local tab_button_holder = library:create("Frame", {
+ AnchorPoint = vec2(0, 1);
+ Parent = window_outline;
+ BackgroundTransparency = 0.800000011920929;
+ Position = dim2(0, 2, 1, -2);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -4, 0, 20);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(0, 0, 0)
+ }); cfg.tab_button_holder = tab_button_holder
+
+ library:create("UIListLayout", {
+ VerticalAlignment = Enum.VerticalAlignment.Center;
+ FillDirection = Enum.FillDirection.Horizontal;
+ HorizontalAlignment = Enum.HorizontalAlignment.Center;
+ HorizontalFlex = Enum.UIFlexAlignment.Fill;
+ Parent = tab_button_holder;
+ SortOrder = Enum.SortOrder.LayoutOrder;
+ VerticalFlex = Enum.UIFlexAlignment.Fill
+ });
+ --
+
+ function cfg.toggle_menu(bool)
+ window_outline.Visible = bool
+ end
+
+ return setmetatable(cfg, library)
+ end
+
+ function library:tab(properties)
+ local cfg = {
+ name = properties.name or "visuals",
+ count = 0
+ }
+
+ -- Instances
+ -- Tab Button
+ local tab_button = library:create("TextButton", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(170, 170, 170);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = cfg.name;
+ Parent = self.tab_button_holder;
+ BackgroundTransparency = 1;
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.XY;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+ --
+
+ -- Page
+ local Page = library:create("Frame", {
+ Parent = self.main_outline;
+ BackgroundTransparency = 0.6;
+ Position = dim2(0, 2, 0, 24);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -4, 1, -48);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(0, 0, 0),
+ Visible = false,
+ }); cfg.page = Page
+
+ library:create("UIListLayout", {
+ FillDirection = Enum.FillDirection.Horizontal;
+ HorizontalFlex = Enum.UIFlexAlignment.Fill;
+ Parent = Page;
+ Padding = dim(0, 2);
+ SortOrder = Enum.SortOrder.LayoutOrder;
+ VerticalFlex = Enum.UIFlexAlignment.Fill
+ });
+
+ library:create("UIPadding", {
+ PaddingTop = dim(0, 2);
+ PaddingBottom = dim(0, 2);
+ Parent = Page;
+ PaddingRight = dim(0, 2);
+ PaddingLeft = dim(0, 2)
+ });
+ --
+ --
+
+ function cfg.open_tab()
+ local selected_tab = self.selected_tab
+
+ if selected_tab then
+ selected_tab[1].Visible = false
+ selected_tab[2].TextColor3 = rgb(170, 170, 170)
+
+ selected_tab = nil
+ end
+
+ Page.Visible = true
+ tab_button.TextColor3 = rgb(255, 255, 255)
+
+ self.selected_tab = {Page, tab_button}
+ end
+
+ tab_button.MouseButton1Down:Connect(function()
+ cfg.open_tab()
+ end)
+
+ if not self.selected_tab then
+ cfg.open_tab(true)
+ end
+
+ return setmetatable(cfg, library)
+ end
+
+ local notifications = {notifs = {}}
+
+ library.sgui = library:create("ScreenGui", {
+ Name = "Hi",
+ Parent = gethui()
+ })
+
+ function notifications:refresh_notifs()
+ for i, v in notifications.notifs do
+ local Position = vec2(50, 50)
+ tween_service:Create(v, TweenInfo.new(1, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Position = dim_offset(Position.X, Position.Y + (i * 30))}):Play()
+ end
+ end
+
+ function notifications:fade(path, is_fading)
+ local fading = is_fading and 1 or 0
+
+ tween_service:Create(path, TweenInfo.new(1, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {BackgroundTransparency = fading}):Play()
+
+ for _, instance in path:GetDescendants() do
+ if not instance:IsA("GuiObject") then
+ if instance:IsA("UIStroke") then
+ tween_service:Create(instance, TweenInfo.new(1, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Transparency = fading}):Play()
+ end
+
+ continue
+ end
+
+ if instance:IsA("TextLabel") then
+ tween_service:Create(instance, TweenInfo.new(1, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {TextTransparency = fading}):Play()
+ elseif instance:IsA("Frame") then
+ tween_service:Create(instance, TweenInfo.new(1, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {BackgroundTransparency = instance.Transparency and 0.6 and is_fading and 1 or 0.6}):Play()
+ end
+ end
+ end
+
+ function notifications:create_notification(options)
+ local cfg = {
+ name = options.name or "Hit: q3sm (finobe) in the Head for 100 Damage!",
+ outline;
+ }
+
+ -- Instances
+ local outline = library:create("Frame", {
+ Parent = library.sgui;
+ Position = dim_offset(-50, 50 + (#notifications.notifs * 30)); -- origin (dependant on the watermark position rn)
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(0, 0, 0, 24);
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.X;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ local dark = library:create("Frame", {
+ Parent = outline;
+ BackgroundTransparency = 1;
+ Position = dim2(0, 2, 0, 2);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -4, 1, -4);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(0, 0, 0)
+ });
+
+ library:create("UIPadding", {
+ PaddingTop = dim(0, 7);
+ PaddingBottom = dim(0, 6);
+ Parent = dark;
+ PaddingRight = dim(0, 7);
+ PaddingLeft = dim(0, 4)
+ });
+
+ library:create("TextLabel", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(255, 255, 255);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = cfg.name;
+ Parent = dark;
+ Size = dim2(0, 0, 1, 0);
+ Position = dim2(0, 1, 0, -1);
+ BackgroundTransparency = 1;
+ TextXAlignment = Enum.TextXAlignment.Left;
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.X;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ library:create("UIGradient", {
+ Color = rgbseq{
+ rgbkey(0, themes.preset["1"]),
+ rgbkey(0.5, themes.preset["2"]),
+ rgbkey(1, themes.preset["3"]),
+ };
+ Parent = outline
+ });
+ --
+
+ local index = #notifications.notifs + 1
+ notifications.notifs[index] = outline
+
+ notifications:refresh_notifs()
+ tween_service:Create(outline, TweenInfo.new(1, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {AnchorPoint = vec2(0, 0)}):Play()
+
+ notifications:fade(outline, false)
+
+ task.spawn(function()
+ task.wait(3)
+
+ notifications.notifs[index] = nil
+
+ notifications:fade(outline, true)
+
+ task.wait(3)
+
+ outline:Destroy()
+ end)
+ end
+
+ function library:watermark(options)
+ local cfg = {
+ name = options.name or "nebulahax";
+ }
+
+ -- Instances
+ local outline = library:create("Frame", {
+ Parent = library.sgui;
+ Position = dim2(0, 50, 0, 50);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(0, 0, 0, 24);
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.X;
+ BackgroundColor3 = rgb(255, 255, 255)
+ }); library.watermark_outline = outline; library:draggify(outline);
+
+ local dark = library:create("Frame", {
+ Parent = outline;
+ BackgroundTransparency = 0.6;
+ Position = dim2(0, 2, 0, 2);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -4, 1, -4);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(0, 0, 0)
+ });
+
+ library:create("UIPadding", {
+ PaddingTop = dim(0, 7);
+ PaddingBottom = dim(0, 6);
+ Parent = dark;
+ PaddingRight = dim(0, 7);
+ PaddingLeft = dim(0, 4)
+ });
+
+ local text_title = library:create("TextLabel", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(255, 255, 255);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = cfg.name;
+ Parent = dark;
+ Size = dim2(0, 0, 1, 0);
+ Position = dim2(0, 1, 0, -1);
+ BackgroundTransparency = 1;
+ TextXAlignment = Enum.TextXAlignment.Left;
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.X;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ library.watermark_gradient = library:create("UIGradient", {
+ Color = rgbseq{
+ rgbkey(0, themes.preset["1"]),
+ rgbkey(0.5, themes.preset["2"]),
+ rgbkey(1, themes.preset["3"]),
+ };
+ Parent = outline
+ });
+ --
+
+ function cfg.update_text(text)
+ text_title.Text = text
+ end
+
+ cfg.update_text(cfg.name)
+
+ return setmetatable(cfg, library)
+ end
+
+ local watermark = library:watermark({name = "mirrorhack - 100 fps - 100 ping"})
+ local fps = 0
+ local watermark_delay = tick()
+
+ run.RenderStepped:Connect(function()
+ fps += 1
+
+ if tick() - watermark_delay > 1 then
+ watermark_delay = tick()
+ local ping = math.floor(stats.PerformanceStats.Ping:GetValue()) .. "ms"
+ watermark.update_text(string.format("mirrorhack - fps: %s - ping: %s", fps, ping))
+ fps = 0
+ end
+ end)
+
+ --[[
+ local pingTimeSec = game.Players.LocalPlayer:GetNetworkPing()
+ local pingTimeMs = pingTimeSec * 1000
+ pingLabel.Text = "Ping: " .. tostring(math.floor(pingTimeMs)) .. "ms"
+
+ local realFPS = workspace:GetRealPhysicsFPS()
+ fpsLabel.Text = "FPS: " .. tostring(math.floor(realFPS))
+ ]]
+
+ function library:column(properties)
+ self.count += 1
+
+ local cfg = {color = library.gradient.Color.Keypoints[self.count].Value, count = self.count}
+
+ local scrolling_frame = library:create("ScrollingFrame", {
+ ScrollBarImageColor3 = rgb(0, 0, 0);
+ Active = true;
+ AutomaticCanvasSize = Enum.AutomaticSize.Y;
+ ScrollBarThickness = 0;
+ Parent = self.page;
+ LayoutOrder = -1;
+ BackgroundTransparency = 1;
+ ScrollBarImageTransparency = 1;
+ BorderColor3 = rgb(0, 0, 0);
+ BackgroundColor3 = rgb(0, 0, 0);
+ BorderSizePixel = 0;
+ CanvasSize = dim2(0, 0, 0, 0)
+ }); cfg.column = scrolling_frame
+
+ library:create("UIListLayout", {
+ Parent = scrolling_frame;
+ Padding = dim(0, 5);
+ SortOrder = Enum.SortOrder.LayoutOrder
+ });
+
+ return setmetatable(cfg, library)
+ end
+
+ function library:section(properties)
+ local cfg = {
+ name = properties.name or properties.Name or "section",
+ size = properties.size or 1,
+ autofill = properties.auto_fill or false,
+ count = self.count;
+ color = self.color;
+ }
+
+ -- Instances
+ local accent = library:create("Frame", {
+ Parent = self.column;
+ ClipsDescendants = true;
+ BorderColor3 = rgb(0, 0, 0);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3");
+
+ local dark = library:create("Frame", {
+ Parent = accent;
+ BackgroundTransparency = 0.6;
+ Position = dim2(0, 2, 0, 16);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -4, 1, -18);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(0, 0, 0)
+ });
+
+ local elements = library:create("Frame", {
+ Parent = dark;
+ Position = dim2(0, 4, 0, 5);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -8, 0, 0);
+ BackgroundTransparency = 1;
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ }); cfg.elements = elements
+
+ if cfg.autofill == false then
+ elements.AutomaticSize = Enum.AutomaticSize.Y;
+ accent.AutomaticSize = Enum.AutomaticSize.Y;
+ accent.Size = dim2(1, 0, 0, 0);
+
+ local UIPadding = library:create("UIPadding", {
+ Parent = elements,
+ Name = "",
+ PaddingBottom = dim(0, 7)
+ })
+ else
+ accent.Size = dim2(1, 0, cfg.size, 0);
+ end
+
+ library:create("UIListLayout", {
+ Parent = elements;
+ Padding = dim(0, 6);
+ SortOrder = Enum.SortOrder.LayoutOrder
+ });
+
+ local title = library:create("TextLabel", {
+ FontFace = fonts["TahomaBold"];
+ TextColor3 = rgb(255, 255, 255);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = cfg.name;
+ Parent = accent;
+ Size = dim2(1, 0, 0, 0);
+ Position = dim2(0, 4, 0, 2);
+ BackgroundTransparency = 1;
+ TextXAlignment = Enum.TextXAlignment.Left;
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.Y;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ library:create("UIListLayout", {
+ Parent = ScrollingFrame;
+ Padding = dim(0, 5);
+ SortOrder = Enum.SortOrder.LayoutOrder
+ });
+ --
+
+ return setmetatable(cfg, library)
+ end
+
+ -- Elements
+ function library:toggle(options)
+ local cfg = {
+ enabled = options.enabled or nil,
+ name = options.name or "Toggle",
+ flag = options.flag or options.name or "Flag",
+
+ default = options.default or false,
+ folding = options.folding or false,
+ callback = options.callback or function() end,
+
+ color = self.color;
+ count = self.count;
+ }
+
+ -- Instances
+ -- Element
+ local toggle = library:create("TextButton", {
+ Parent = self.elements;
+ BackgroundTransparency = 1;
+ Text = "";
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, 0, 0, 12);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ library:create("TextLabel", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(255, 255, 255);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = cfg.name;
+ Parent = toggle;
+ Size = dim2(1, 0, 1, 0);
+ Position = dim2(0, 1, 0, -1);
+ BackgroundTransparency = 1;
+ TextXAlignment = Enum.TextXAlignment.Left;
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.X;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ local accent = library:create("Frame", {
+ AnchorPoint = vec2(1, 0);
+ Parent = toggle;
+ Position = dim2(1, 0, 0, 0);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(0, 12, 0, 12);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3");
+
+ local fill = library:create("Frame", {
+ Parent = accent;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(fill, tostring(self.count), "BackgroundColor3");
+
+ library:create("UIListLayout", {
+ FillDirection = Enum.FillDirection.Horizontal;
+ HorizontalAlignment = Enum.HorizontalAlignment.Right;
+ Parent = right_components;
+ Padding = dim(0, 4);
+ SortOrder = Enum.SortOrder.LayoutOrder
+ });
+ --
+
+ -- Sub sections
+ local elements;
+
+ if cfg.folding then
+ elements = library:create("Frame", {
+ Parent = self.elements;
+ BackgroundTransparency = 1;
+ Position = dim2(0, 4, 0, 21);
+ Size = dim2(1, 0, 0, 0);
+ BorderSizePixel = 0;
+ Visible = false;
+ AutomaticSize = Enum.AutomaticSize.Y;
+ BackgroundColor3 = rgb(255, 255, 255)
+ }); cfg.elements = elements
+
+ library:create("UIListLayout", {
+ Parent = elements;
+ Padding = dim(0, 6);
+ HorizontalAlignment = Enum.HorizontalAlignment.Right;
+ SortOrder = Enum.SortOrder.LayoutOrder
+ });
+ end
+ --
+ --
+
+ -- Functions
+ function cfg.set(bool)
+ fill.BackgroundColor3 = bool and themes.preset[tostring(self.count)] or themes.preset.inline
+
+ flags[cfg.flag] = bool
+
+ cfg.callback(bool)
+
+ if cfg.folding then
+ elements.Visible = bool
+ end
+ end
+
+ cfg.set(cfg.default)
+
+ config_flags[cfg.flag] = cfg.set
+ --
+
+ -- Connections
+ toggle.MouseButton1Click:Connect(function()
+ cfg.enabled = not cfg.enabled
+ cfg.set(cfg.enabled)
+ end)
+ --
+
+ return setmetatable(cfg, library)
+ end
+
+ function library:list(options)
+ local cfg = {
+ callback = options and options.callback or function() end,
+ name = options.name or nil,
+
+ scale = options.size or 90,
+ items = options.items or {"1", "2", "3"},
+ -- order = options.order or 1,
+ visible = options.visible or true,
+
+ option_instances = {},
+ current_instance = nil,
+ flag = options.flag or "SET A FLAG U NIGGER",
+ }
+
+ -- Elements
+ local accent = library:create("Frame", {
+ BorderColor3 = rgb(0, 0, 0);
+ AnchorPoint = vec2(1, 0);
+ Parent = self.elements;
+ Position = dim2(1, 0, 0, 0);
+ Size = dim2(1, 0, 0, cfg.scale);
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.Y;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3")
+
+ local inline = library:create("Frame", {
+ Parent = accent;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(35, 35, 35)
+ }); library:apply_theme(inline, "inline", "BackgroundColor3")
+
+ local scrollingframe = library:create("ScrollingFrame", {
+ ScrollBarImageColor3 = rgb(0, 0, 0);
+ Active = true;
+ AutomaticCanvasSize = Enum.AutomaticSize.Y;
+ ScrollBarThickness = 0;
+ Parent = inline;
+ Size = dim2(1, 0, 1, 0);
+ LayoutOrder = -1;
+ BackgroundTransparency = 1;
+ ScrollBarImageTransparency = 1;
+ BorderColor3 = rgb(0, 0, 0);
+ BackgroundColor3 = rgb(0, 0, 0);
+ BorderSizePixel = 0;
+ CanvasSize = dim2(0, 0, 0, 0)
+ });
+
+ library:create("UIListLayout", {
+ Parent = scrollingframe;
+ Padding = dim(0, 6);
+ SortOrder = Enum.SortOrder.LayoutOrder
+ });
+
+ library:create("UIPadding", {
+ PaddingTop = dim(0, 2);
+ PaddingBottom = dim(0, 4);
+ Parent = scrollingframe;
+ PaddingRight = dim(0, 5);
+ PaddingLeft = dim(0, 5)
+ });
+ --
+
+ -- Functions
+ function cfg.render_option(text)
+ local text = library:create("TextButton", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(170, 170, 170);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = text;
+ AutoButtonColor = false;
+ BackgroundTransparency = 1;
+ Parent = scrollingframe;
+ BorderSizePixel = 0;
+ Size = dim2(1, 0, 0, 0);
+ AutomaticSize = Enum.AutomaticSize.Y;
+ TextSize = 12;
+ TextXAlignment = Enum.TextXAlignment.Left;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ return text
+ end
+
+ function cfg.refresh_options(options)
+ for _, v in cfg.option_instances do
+ v:Destroy()
+ end
+
+ for _, option in next, options do
+ local button = cfg.render_option(option)
+
+ insert(cfg.option_instances, button)
+
+ button.MouseButton1Click:Connect(function()
+ if cfg.current_instance and cfg.current_instance ~= button then
+ cfg.current_instance.TextColor3 = rgb(170, 170, 170)
+ end
+
+ cfg.current_instance = button
+ button.TextColor3 = rgb(255, 255, 255)
+
+ flags[cfg.flag] = button.text
+
+ cfg.callback(button.text)
+ end)
+ end
+ end
+
+ function cfg.filter_options(text)
+ for _, v in next, cfg.option_instances do
+ if string.find(v.Text, text) then
+ v.Visible = true
+ else
+ v.Visible = false
+ end
+ end
+ end
+
+ function cfg.set(value)
+ for _, buttons in next, cfg.option_instances do
+ if buttons.Text == value then
+ buttons.TextColor3 = rgb(255, 255, 255)
+ else
+ buttons.TextColor3 = rgb(170, 170, 170)
+ end
+ end
+
+ flags[cfg.flag] = value
+ cfg.callback(value)
+ end
+
+ cfg.refresh_options(cfg.items)
+ --
+
+ return setmetatable(cfg, library)
+ end
+
+ function library:slider(options)
+ local cfg = {
+ name = options.name or nil,
+ suffix = options.suffix or "",
+ flag = options.flag or options.name or "Flag",
+ callback = options.callback or function() end,
+
+ min = options.min or options.minimum or 0,
+ max = options.max or options.maximum or 100,
+ intervals = options.interval or options.decimal or 1,
+ default = options.default or 10,
+ value = options.default or 10,
+
+ ignore = options.ignore or false,
+ dragging = false,
+ }
+
+ -- Instances
+ local slider = library:create("Frame", {
+ Parent = self.elements;
+ BackgroundTransparency = 1;
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, 0, 0, 25);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ local eeeee = library:create("TextLabel", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(255, 255, 255);
+ RichText = true;
+ BorderColor3 = rgb(0, 0, 0);
+ Text = "max distance : 5000";
+ Parent = slider;
+ Size = dim2(1, 0, 0, 0);
+ Position = dim2(0, 1, 0, -2);
+ BackgroundTransparency = 1;
+ TextXAlignment = Enum.TextXAlignment.Left;
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.XY;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ local outline = library:create("TextButton", {
+ Parent = slider;
+ Text = "";
+ AutoButtonColor = false;
+ Position = dim2(0, 0, 0, 13);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, 0, 0, 12);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(outline, tostring(self.count), "BackgroundColor3")
+
+ local inline = library:create("Frame", {
+ Parent = outline;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset.inline
+ }); library:apply_theme(outline, "inline", "BackgroundColor3")
+
+ local accent = library:create("Frame", {
+ Parent = inline;
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(0.5, 0, 1, 0);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3")
+ --
+
+ -- Functions
+ function cfg.set(value)
+ local valuee = tonumber(value)
+
+ if valuee == nil then
+ return
+ end
+
+ cfg.value = clamp(library:round(valuee, cfg.intervals), cfg.min, cfg.max)
+
+ accent.Size = dim2((cfg.value - cfg.min) / (cfg.max - cfg.min), 0, 1, 0)
+ eeeee.Text = cfg.name .. "" .. ' - ' .. tostring(cfg.value) .. cfg.suffix .. ""
+
+ flags[cfg.flag] = cfg.value
+
+ cfg.callback(flags[cfg.flag])
+ end
+
+ cfg.set(cfg.default)
+ --
+
+ -- Connections
+ outline.MouseButton1Down:Connect(function()
+ cfg.dragging = true
+ end)
+
+ library:connection(uis.InputChanged, function(input)
+ if cfg.dragging and input.UserInputType == Enum.UserInputType.MouseMovement then
+ local size_x = (input.Position.X - inline.AbsolutePosition.X) / inline.AbsoluteSize.X
+ local value = ((cfg.max - cfg.min) * size_x) + cfg.min
+
+ cfg.set(value)
+ end
+ end)
+
+ library:connection(uis.InputEnded, function(input)
+ if input.UserInputType == Enum.UserInputType.MouseButton1 then
+ cfg.dragging = false
+ end
+ end)
+ --
+
+ cfg.set(cfg.default)
+
+ config_flags[cfg.flag] = cfg.set
+
+ return setmetatable(cfg, library)
+ end
+
+ function library:dropdown(options)
+ local cfg = {
+ name = options.name or nil,
+ flag = options.flag or options.name or "Flag",
+ items = options.items or {""},
+ callback = options.callback or function() end,
+ multi = options.multi or false,
+ scrolling = options.scrolling or false,
+
+ -- Ignore these
+ open = false,
+ option_instances = {},
+ multi_items = {},
+ ignore = options.ignore or false,
+ }
+
+ cfg.default = options.default or (cfg.multi and {cfg.items[1]}) or cfg.items[1] or "None"
+
+ flags[cfg.flag] = {}
+
+ -- Instances
+ -- Element
+ local dropdown = library:create("Frame", {
+ Parent = self.elements;
+ BackgroundTransparency = 1;
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, 0, 0, 16);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ local dropdown_holder = library:create("TextButton", {
+ AnchorPoint = vec2(1, 0);
+ AutoButtonColor = false;
+ Text = "";
+ Parent = dropdown;
+ Position = dim2(1, 0, 0, 0);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(0.5, 0, 0, 16);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(dropdown_holder, tostring(self.count), "BackgroundColor3")
+
+ local inline = library:create("Frame", {
+ Parent = dropdown_holder;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(35, 35, 35)
+ });
+
+ local text = library:create("TextLabel", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(255, 255, 255);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = cfg.name;
+ Parent = inline;
+ Size = dim2(1, 0, 1, 0);
+ BackgroundTransparency = 1;
+ Position = dim2(0, 0, 0, 1);
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.X;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ local title = library:create("TextLabel", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(255, 255, 255);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = cfg.name;
+ Parent = dropdown;
+ Size = dim2(1, 0, 1, 0);
+ Position = dim2(0, 1, 0, 0);
+ BackgroundTransparency = 1;
+ TextXAlignment = Enum.TextXAlignment.Left;
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.X;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+ --
+
+ -- Holder
+ local accent = library:create("Frame", {
+ Parent = library.gui;
+ Size = dim2(0.0907348021864891, 0, 0.006218905560672283, 20);
+ Position = dim2(0, 500, 0, 100);
+ BorderColor3 = rgb(0, 0, 0);
+ BorderSizePixel = 0;
+ Visible = false;
+ AutomaticSize = Enum.AutomaticSize.Y;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3")
+
+ local inline = library:create("Frame", {
+ Parent = accent;
+ Size = dim2(1, -2, 1, -2);
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.Y;
+ BackgroundColor3 = themes.preset.inline
+ }); library:apply_theme(inline, "inline", "BackgroundColor3")
+
+ library:create("UIListLayout", {
+ Parent = inline;
+ Padding = dim(0, 6);
+ SortOrder = Enum.SortOrder.LayoutOrder
+ });
+
+ library:create("UIPadding", {
+ PaddingTop = dim(0, 5);
+ PaddingBottom = dim(0, 2);
+ Parent = inline;
+ PaddingRight = dim(0, 6);
+ PaddingLeft = dim(0, 6)
+ });
+
+ local padding = library:create("UIPadding", {
+ PaddingBottom = dim(0, 2);
+ Parent = accent
+ });
+ --
+ --
+
+ -- Functions
+ function cfg.render_option(text)
+ local title = library:create("TextButton", {
+ FontFace = fonts["ProggyClean"];
+ AutoButtonColor = false;
+ TextColor3 = rgb(170, 170, 170);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = text;
+ Parent = inline;
+ Size = dim2(1, 0, 0, 0);
+ Position = dim2(0, 0, 0, 1);
+ BackgroundTransparency = 1;
+ TextXAlignment = Enum.TextXAlignment.Left;
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.Y;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ return title
+ end
+
+ function cfg.set_visible(bool)
+ accent.Visible = bool
+ end
+
+ function cfg.set(value)
+ local selected = {}
+ local isTable = type(value) == "table"
+
+ if value == nil then
+ return
+ end
+
+ for _, option in next, cfg.option_instances do
+ if option.Text == value or (isTable and find(value, option.Text)) then
+ insert(selected, option.Text)
+ cfg.multi_items = selected
+ option.TextColor3 = rgb(255, 255, 255)
+ else
+ option.TextColor3 = rgb(170, 170, 170)
+ end
+ end
+
+ text.Text = if isTable then concat(selected, ", ") else selected[1]
+
+ flags[cfg.flag] = if isTable then selected else selected[1]
+
+ cfg.callback(flags[cfg.flag])
+ end
+
+ function cfg.refresh_options(list)
+ for _, option in next, cfg.option_instances do
+ option:Destroy()
+ end
+
+ cfg.option_instances = {}
+
+ for _, option in next, list do
+ local button = cfg.render_option(option)
+
+ insert(cfg.option_instances, button)
+
+ button.MouseButton1Down:Connect(function()
+ if cfg.multi then
+ local selected_index = find(cfg.multi_items, button.Text)
+
+ if selected_index then
+ remove(cfg.multi_items, selected_index)
+ else
+ insert(cfg.multi_items, button.Text)
+ end
+
+ cfg.set(cfg.multi_items)
+ else
+ cfg.set_visible(false)
+ cfg.open = false
+
+ cfg.set(button.Text)
+ end
+ end)
+ end
+ end
+
+ cfg.refresh_options(cfg.items)
+
+ cfg.set(cfg.default)
+
+ config_flags[cfg.flag] = cfg.set
+ --
+
+ -- Connections
+ dropdown_holder.MouseButton1Click:Connect(function()
+ cfg.open = not cfg.open
+
+ accent.Size = dim2(0, dropdown_holder.AbsoluteSize.X, 0, accent.Size.Y.Offset)
+ accent.Position = dim2(0, dropdown_holder.AbsolutePosition.X, 0, dropdown_holder.AbsolutePosition.Y + 77)
+
+ cfg.set_visible(cfg.open)
+ end)
+
+ uis.InputEnded:Connect(function(input)
+ if input.UserInputType == Enum.UserInputType.MouseButton1 then
+ if not (library:mouse_in_frame(accent) or library:mouse_in_frame(dropdown)) then
+ cfg.open = false
+ cfg.set_visible(false)
+ end
+ end
+ end)
+ --
+
+ return setmetatable(cfg, library)
+ end
+
+ function library:colorpicker(options)
+ local cfg = {
+ name = options.name or "Color",
+ flag = options.flag or options.name or "Flag",
+
+ color = options.color or color(1, 1, 1), -- Default to white color if not provided
+ alpha = options.alpha and 1 - options.alpha or 0,
+
+ open = false,
+ callback = options.callback or function() end,
+ }
+
+ -- Instances
+ -- Element
+ local colorpicker_element = library:create("TextButton", {
+ Parent = self.elements;
+ BackgroundTransparency = 1;
+ Text = "";
+ AutoButtonColor = false;
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, 0, 0, 12);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ local accent = library:create("Frame", {
+ AnchorPoint = vec2(1, 0);
+ Parent = colorpicker_element;
+ Position = dim2(1, 0, 0, 0);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(0, 30, 0, 12);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3")
+
+ local colorpicker_element_color = library:create("Frame", {
+ Parent = accent;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ library:create("TextLabel", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(255, 255, 255);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = cfg.name;
+ Parent = colorpicker_element;
+ Size = dim2(1, 0, 1, 0);
+ Position = dim2(0, 1, 0, 0);
+ BackgroundTransparency = 1;
+ TextXAlignment = Enum.TextXAlignment.Left;
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.X;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ --
+
+ -- Elements
+ local colorpicker = library:create("Frame", {
+ Parent = library.gui;
+ Position = dim2(0.6888179183006287, 0, 0.24751244485378265, 0);
+ BorderColor3 = rgb(0, 0, 0);
+ Visible = false;
+ Size = dim2(0, 150, 0, 150);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(colorpicker, tostring(self.count), "BackgroundColor3")
+
+ local a = library:create("Frame", {
+ Parent = colorpicker;
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, 0, 1, 0);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(a, tostring(self.count), "BackgroundColor3")
+
+ local e = library:create("Frame", {
+ Parent = a;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(0, 0, 0);
+ BackgroundTransparency = 0.6;
+ ZIndex = -1
+ });
+
+ local _ = library:create("UIPadding", {
+ PaddingTop = dim(0, 7);
+ PaddingBottom = dim(0, -13);
+ Parent = e;
+ PaddingRight = dim(0, 6);
+ PaddingLeft = dim(0, 7)
+ });
+
+ local textbox_holder = library:create("Frame", {
+ Parent = e;
+ Position = dim2(0, 0, 1, -36);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -1, 0, 16);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(textbox_holder, tostring(self.count), "BackgroundColor3")
+
+ local textbox = library:create("TextBox", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(255, 255, 255);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = "";
+ Parent = textbox_holder;
+ BackgroundTransparency = 0;
+ ClearTextOnFocus = false;
+ PlaceholderColor3 = rgb(255, 255, 255);
+ Size = dim2(1, -2, 1, -2);
+ Position = dim2(0, 1, 0, 1);
+ BorderSizePixel = 0;
+ TextSize = 12;
+ TextXAlignment = Enum.TextXAlignment.Center;
+ BackgroundColor3 = themes.preset.inline
+ }); library:apply_theme(textbox, "inline", "BackgroundColor3")
+
+ local hue_button = library:create("TextButton", {
+ AnchorPoint = vec2(1, 0);
+ Text = "";
+ AutoButtonColor = false;
+ Parent = e;
+ Position = dim2(1, -1, 0, 0);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(0, 14, 1, -60);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset.inline
+ }); library:apply_theme(hue_button, "inline", "BackgroundColor3")
+
+ local hue_drag = library:create("Frame", {
+ Parent = hue_button;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ library:create("UIGradient", {
+ Rotation = 90;
+ Parent = hue_drag;
+ Color = rgbseq{rgbkey(0, rgb(255, 0, 0)), rgbkey(0.17, rgb(255, 255, 0)), rgbkey(0.33, rgb(0, 255, 0)), rgbkey(0.5, rgb(0, 255, 255)), rgbkey(0.67, rgb(0, 0, 255)), rgbkey(0.83, rgb(255, 0, 255)), rgbkey(1, rgb(255, 0, 0))}
+ });
+
+ local hue_picker = library:create("Frame", {
+ Parent = hue_drag;
+ BorderMode = Enum.BorderMode.Inset;
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, 2, 0, 3);
+ Position = dim2(0, -1, 0, -1);
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ local alpha_button = library:create("TextButton", {
+ AnchorPoint = vec2(0, 0.5);
+ Text = "";
+ AutoButtonColor = false;
+ Parent = e;
+ Position = dim2(0, 0, 1, -48);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -1, 0, 14);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset.inline
+ }); library:apply_theme(alpha_button, "inline", "BackgroundColor3")
+
+ local alpha_color = library:create("Frame", {
+ Parent = alpha_button;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(0, 221, 255)
+ });
+
+ local alphaind = library:create("ImageLabel", {
+ ScaleType = Enum.ScaleType.Tile;
+ BorderColor3 = rgb(0, 0, 0);
+ Parent = alpha_color;
+ Image = "rbxassetid://18274452449";
+ BackgroundTransparency = 1;
+ Size = dim2(1, 0, 1, 0);
+ TileSize = dim2(0, 4, 0, 4);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ library:create("UIGradient", {
+ Parent = alphaind;
+ Transparency = numseq{numkey(0, 0), numkey(1, 1)}
+ });
+
+ local alpha_picker = library:create("Frame", {
+ Parent = alpha_color;
+ BorderMode = Enum.BorderMode.Inset;
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(0, 3, 1, 2);
+ Position = dim2(0, -1, 0, -1);
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ local saturation_value_button = library:create("TextButton", {
+ Parent = e;
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -20, 1, -60);
+ Text = "";
+ AutoButtonColor = false;
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset.inline
+ }); library:apply_theme(saturation_value_button, "inline", "BackgroundColor3")
+
+ local colorpicker_color = library:create("Frame", {
+ Parent = saturation_value_button;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(0, 221, 255)
+ });
+
+ local val = library:create("TextButton", {
+ Parent = colorpicker_color;
+ Text = "";
+ AutoButtonColor = false;
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, 0, 1, 0);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ library:create("UIGradient", {
+ Parent = val;
+ Transparency = numseq{numkey(0, 0), numkey(1, 1)}
+ });
+
+ local saturation_value_picker = library:create("Frame", {
+ Parent = colorpicker_color;
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(0, 3, 0, 3);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(0, 0, 0)
+ });
+
+ local inline = library:create("Frame", {
+ Parent = saturation_value_picker;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ local saturation_button = library:create("TextButton", {
+ Parent = colorpicker_color;
+ Text = "";
+ AutoButtonColor = false;
+ Size = dim2(1, 0, 1, 0);
+ BorderColor3 = rgb(0, 0, 0);
+ ZIndex = 2;
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ library:create("UIGradient", {
+ Rotation = 270;
+ Transparency = numseq{numkey(0, 0), numkey(1, 1)};
+ Parent = saturation_button;
+ Color = rgbseq{rgbkey(0, rgb(0, 0, 0)), rgbkey(1, rgb(0, 0, 0))}
+ });
+
+
+ --
+ --
+
+ -- Functions
+ local dragging_sat = false
+ local dragging_hue = false
+ local dragging_alpha = false
+
+ local h, s, v = cfg.color:ToHSV()
+ local a = cfg.alpha
+
+ flags[cfg.flag] = {}
+
+ function cfg.set_visible(bool)
+ colorpicker.Visible = bool
+
+ colorpicker.Position = dim_offset(colorpicker_element_color.AbsolutePosition.X - 1, colorpicker_element_color.AbsolutePosition.Y + colorpicker_element_color.AbsoluteSize.Y + 65)
+ end
+
+ function cfg.set(color, alpha)
+ if color then
+ h, s, v = color:ToHSV()
+ end
+
+ if alpha then
+ a = alpha
+ end
+
+ local Color = Color3.fromHSV(h, s, v)
+
+ hue_picker.Position = dim2(0, -1, 1 - h, -1)
+ alpha_picker.Position = dim2(1 - a, -1, 0, -1)
+ saturation_value_picker.Position = dim2(s, -1, 1 - v, -1)
+
+ --element_alpha.ImageTransparency = 1 - a
+
+ alpha_color.BackgroundColor3 = Color3.fromHSV(h, 1, 1)
+ colorpicker_element_color.BackgroundColor3 = Color
+ colorpicker_color.BackgroundColor3 = Color3.fromHSV(h, 1, 1)
+
+ flags[cfg.flag] = {
+ Color = Color;
+ Transparency = a
+ }
+
+ local color = colorpicker_element_color.BackgroundColor3
+ textbox.Text = string.format("%s, %s, %s, ", library:round(color.R * 255), library:round(color.G * 255), library:round(color.B * 255))
+ textbox.Text ..= library:round(1 - a, 0.01)
+
+ cfg.callback(Color, a)
+ end
+
+ function cfg.update_color()
+ local mouse = uis:GetMouseLocation()
+ local offset = vec2(mouse.X, mouse.Y - gui_offset)
+
+ if dragging_sat then
+ s = math.clamp((offset - saturation_value_button.AbsolutePosition).X / saturation_value_button.AbsoluteSize.X, 0, 1)
+ v = 1 - math.clamp((offset - saturation_value_button.AbsolutePosition).Y / saturation_value_button.AbsoluteSize.Y, 0, 1)
+ elseif dragging_hue then
+ h = 1 - math.clamp((offset - hue_button.AbsolutePosition).Y / hue_button.AbsoluteSize.Y, 0, 1)
+ elseif dragging_alpha then
+ a = 1 - math.clamp((offset - alpha_button.AbsolutePosition).X / alpha_button.AbsoluteSize.X, 0, 1)
+ end
+
+ cfg.set(nil, nil)
+ end
+
+ cfg.set(cfg.color, cfg.alpha)
+
+ config_flags[cfg.flag] = cfg.set
+ --
+
+ -- Connections
+ colorpicker_element.MouseButton1Click:Connect(function()
+ cfg.open = not cfg.open
+
+ cfg.set_visible(cfg.open)
+ end)
+
+ uis.InputChanged:Connect(function(input)
+ if (dragging_sat or dragging_hue or dragging_alpha) and input.UserInputType == Enum.UserInputType.MouseMovement then
+ cfg.update_color()
+ end
+ end)
+
+ library:connection(uis.InputEnded, function(input)
+ if input.UserInputType == Enum.UserInputType.MouseButton1 then
+ dragging_sat = false
+ dragging_hue = false
+ dragging_alpha = false
+
+ if not (library:mouse_in_frame(colorpicker_element) or library:mouse_in_frame(colorpicker)) then
+ cfg.open = false
+ cfg.set_visible(false)
+ end
+ end
+ end)
+
+ alpha_button.MouseButton1Down:Connect(function()
+ dragging_alpha = true
+ end)
+
+ hue_button.MouseButton1Down:Connect(function()
+ dragging_hue = true
+ end)
+
+ saturation_button.MouseButton1Down:Connect(function()
+ print("hiu")
+ dragging_sat = true
+ end)
+
+ textbox.FocusLost:Connect(function()
+ local r, g, b, a = library:convert(textbox.Text)
+
+ if r and g and b and a then
+ cfg.set(rgb(r, g, b), 1 - a)
+ end
+ end)
+ --
+
+ return setmetatable(cfg, library)
+ end
+
+ function library:textbox(options)
+ local cfg = {
+ name = options.name or "...",
+ placeholder = options.placeholder or options.placeholdertext or options.holder or options.holdertext or "type here...",
+ default = options.default,
+ flag = options.flag or options.name or "Flag",
+ callback = options.callback or function() end,
+ visible = options.visible or true,
+ }
+
+ -- Instances
+ local frame = library:create("TextButton", {
+ AnchorPoint = vec2(1, 0);
+ Text = "";
+ AutoButtonColor = false;
+ Parent = self.elements;
+ Position = dim2(1, 0, 0, 0);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, 0, 0, 16);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(frame, tostring(self.count), "BackgroundColor3")
+
+ local frame_inline = library:create("Frame", {
+ Parent = frame;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset.inline
+ }); library:apply_theme(frame_inline, "inline", "BackgroundColor3")
+
+ local input = library:create("TextBox", {
+ Parent = frame,
+ Name = "",
+ FontFace = fonts["ProggyClean"],
+ TextTruncate = Enum.TextTruncate.AtEnd,
+ TextSize = 12,
+ Text = "",
+ Size = dim2(1, -6, 1, 0),
+ RichText = true,
+ TextColor3 = rgb(255, 255, 255),
+ BorderColor3 = rgb(0, 0, 0),
+ CursorPosition = -1,
+ BackgroundTransparency = 1,
+ TextXAlignment = Enum.TextXAlignment.Left,
+ Position = dim2(0, 6, 0, 0),
+ BorderSizePixel = 0,
+ PlaceholderColor3 = rgb(170, 170, 170),
+ })
+ --
+
+ -- Functions
+ function cfg.set(text)
+ flags[cfg.flag] = text
+
+ input.Text = text
+
+ cfg.callback(text)
+ end
+
+ config_flags[cfg.flag] = cfg.set
+
+ if cfg.default then
+ cfg.set(cfg.default)
+ end
+ --
+
+ -- Connections
+ input:GetPropertyChangedSignal("Text"):Connect(function()
+ cfg.set(input.Text)
+ end)
+ --
+
+ return setmetatable(cfg, library)
+ end
+
+ function library:keybind(options)
+ local cfg = {
+ flag = options.flag or options.name or "Flag",
+ callback = options.callback or function() end,
+ open = false,
+ binding = nil,
+ name = options.name or nil,
+ ignore_key = options.ignore or false,
+
+ key = options.key or nil,
+ mode = options.mode or "toggle",
+ active = options.default or false,
+
+ hold_instances = {},
+ }
+
+ flags[cfg.flag] = {}
+
+ -- Instances
+ -- Element
+ local keybind = library:create("Frame", {
+ Parent = self.elements;
+ BackgroundTransparency = 1;
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, 0, 0, 16);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ local keybind_holder = library:create("TextButton", {
+ AnchorPoint = vec2(1, 0);
+ AutoButtonColor = false;
+ Text = "";
+ Parent = keybind;
+ Position = dim2(1, 0, 0, 0);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(0.5, 0, 0, 16);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(keybind_holder, tostring(self.count), "BackgroundColor3")
+
+ local inline = library:create("Frame", {
+ Parent = keybind_holder;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = rgb(35, 35, 35)
+ });
+
+ local text = library:create("TextLabel", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(255, 255, 255);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = cfg.name;
+ Parent = inline;
+ Size = dim2(1, 0, 1, 0);
+ BackgroundTransparency = 1;
+ Position = dim2(0, 0, 0, -1);
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.X;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+
+ local title = library:create("TextLabel", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(255, 255, 255);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = cfg.name;
+ Parent = keybind;
+ Size = dim2(1, 0, 1, 0);
+ Position = dim2(0, 1, 0, 0);
+ BackgroundTransparency = 1;
+ TextXAlignment = Enum.TextXAlignment.Left;
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.X;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+ --
+
+ -- Holder
+ local accent = library:create("Frame", {
+ Parent = library.gui;
+ Visible = false;
+ Size = dim2(0.0907348021864891, 0, 0.006218905560672283, 20);
+ Position = dim2(0, 500, 0, 100);
+ BorderColor3 = rgb(0, 0, 0);
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.Y;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(accent, tostring(self.count), "BackgroundColor3")
+
+ local inline = library:create("Frame", {
+ Parent = accent;
+ Size = dim2(1, -2, 1, -2);
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.Y;
+ BackgroundColor3 = themes.preset.inline
+ }); library:apply_theme(inline, "inline", "BackgroundColor3")
+
+ library:create("UIListLayout", {
+ Parent = inline;
+ Padding = dim(0, 6);
+ SortOrder = Enum.SortOrder.LayoutOrder
+ });
+
+ library:create("UIPadding", {
+ PaddingTop = dim(0, 5);
+ PaddingBottom = dim(0, 2);
+ Parent = inline;
+ PaddingRight = dim(0, 6);
+ PaddingLeft = dim(0, 6)
+ });
+
+ local padding = library:create("UIPadding", {
+ PaddingBottom = dim(0, 2);
+ Parent = accent
+ });
+
+ local options = {"Hold", "Toggle", "Always"}
+
+ for _, v in options do
+ local option = library:create("TextButton", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(170, 170, 170);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = v;
+ Parent = inline;
+ Position = dim2(0, 0, 0, 1);
+ BackgroundTransparency = 1;
+ TextXAlignment = Enum.TextXAlignment.Left;
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.XY;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ }); cfg.hold_instances[v] = option
+
+ option.MouseButton1Click:Connect(function()
+ cfg.set(v)
+
+ cfg.set_visible(false)
+
+ cfg.open = false
+ end)
+ end
+ --
+ --
+
+ -- Functions
+ function cfg.modify_mode_color(path) -- ts so frikin tuff 💀
+ for _, v in cfg.hold_instances do
+ v.TextColor3 = rgb(170, 170, 170)
+ end
+
+ if cfg.hold_instances[path] then
+ cfg.hold_instances[path].TextColor3 = rgb(255, 255, 255)
+ end
+ end
+
+ function cfg.set_mode(mode)
+ cfg.mode = mode
+
+ if mode == "Always" then
+ cfg.set(true)
+ elseif mode == "Hold" then
+ cfg.set(false)
+ end
+
+ flags[cfg.flag]["mode"] = mode
+ cfg.modify_mode_color(mode)
+ end
+
+ function cfg.set(input)
+ if type(input) == "boolean" then
+ local __cached = input
+
+ if cfg.mode == "Always" then
+ __cached = true
+ end
+
+ cfg.active = __cached
+ cfg.callback(__cached)
+ elseif tostring(input):find("Enum") then
+ input = input.Name == "Escape" and "..." or input
+
+ cfg.key = input or "..."
+
+ cfg.callback(cfg.active or false)
+ elseif find({"Toggle", "Hold", "Always"}, input) then
+ cfg.set_mode(input)
+
+ if input == "Always" then
+ cfg.active = true
+ end
+
+ cfg.callback(cfg.active or false)
+ elseif type(input) == "table" then
+ input.key = type(input.key) == "string" and input.key ~= "..." and library:convert_enum(input.key) or input.key
+
+ input.key = input.key == Enum.KeyCode.Escape and "..." or input.key
+ cfg.key = input.key or "..."
+
+ cfg.mode = input.mode or "Toggle"
+ cfg.set_mode(input.mode)
+
+ if input.active then
+ cfg.active = input.active
+ end
+ end
+
+ flags[cfg.flag] = {
+ mode = cfg.mode,
+ key = cfg.key,
+ active = cfg.active
+ }
+
+ local _text = tostring(cfg.key) ~= "Enums" and (keys[cfg.key] or tostring(cfg.key):gsub("Enum.", "")) or nil
+ local __text = _text and (tostring(_text):gsub("KeyCode.", ""):gsub("UserInputType.", ""))
+
+ text.Text = " ".. __text .." "
+
+ -- if keybind_list_text then
+ -- keybind_list_text.Text = "[ ".. __text .." ] ".. cfg.name ..":".. string.lower(cfg.mode) .."";
+ -- keybind_list_text.Visible = cfg.active
+ -- end
+ end
+
+ function cfg.set_visible(bool)
+ accent.Visible = bool
+
+ accent.Size = dim2(0, keybind_holder.AbsoluteSize.X, 0, accent.Size.Y.Offset)
+ accent.Position = dim2(0, keybind_holder.AbsolutePosition.X, 0, keybind_holder.AbsolutePosition.Y + 77)
+ end
+ --
+
+ -- Connections
+ keybind_holder.MouseButton1Down:Connect(function()
+ task.wait()
+ text.Text = "..."
+
+ cfg.binding = library:connection(uis.InputBegan, function(keycode, game_event)
+ cfg.set(keycode.KeyCode)
+
+ cfg.binding:Disconnect()
+ cfg.binding = nil
+ end)
+ end)
+
+ keybind_holder.MouseButton2Down:Connect(function()
+ cfg.open = not cfg.open
+
+ cfg.set_visible(cfg.open)
+ end)
+
+ library:connection(uis.InputBegan, function(input, game_event)
+ if not game_event then
+ if input.KeyCode == cfg.key then
+ if cfg.mode == "Toggle" then
+ cfg.active = not cfg.active
+ cfg.set(cfg.active)
+ elseif cfg.mode == "Hold" then
+ cfg.set(true)
+ end
+ end
+ end
+ end)
+
+ library:connection(uis.InputEnded, function(input, game_event)
+ if game_event then
+ return
+ end
+
+ local selected_key = input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode or input.UserInputType
+
+ if selected_key == cfg.key then
+ if cfg.mode == "Hold" then
+ cfg.set(false)
+ end
+ end
+
+ if input.UserInputType == Enum.UserInputType.MouseButton1 then
+ if not (library:mouse_in_frame(keybind_holder) or library:mouse_in_frame(accent)) then
+ cfg.open = false
+ cfg.set_visible(false)
+ end
+ end
+ end)
+ --
+
+ config_flags[cfg.flag] = cfg.set
+ cfg.set({mode = cfg.mode, active = cfg.active, key = cfg.key})
+
+ return setmetatable(cfg, library)
+ end
+
+ function library:button(options)
+ local cfg = {
+ name = options.name or "button",
+ callback = options.callback or function() end,
+ }
+
+ -- Instances
+ local frame = library:create("TextButton", {
+ AnchorPoint = vec2(1, 0);
+ Text = "";
+ AutoButtonColor = false;
+ Parent = self.elements;
+ Position = dim2(1, 0, 0, 0);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, 0, 0, 16);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset[tostring(self.count)]
+ }); library:apply_theme(frame, tostring(self.count), "BackgroundColor3")
+
+ local frame_inline = library:create("Frame", {
+ Parent = frame;
+ Position = dim2(0, 1, 0, 1);
+ BorderColor3 = rgb(0, 0, 0);
+ Size = dim2(1, -2, 1, -2);
+ BorderSizePixel = 0;
+ BackgroundColor3 = themes.preset.inline
+ }); library:apply_theme(frame_inline, "inline", "BackgroundColor3")
+
+ local text = library:create("TextLabel", {
+ FontFace = fonts["ProggyClean"];
+ TextColor3 = rgb(255, 255, 255);
+ BorderColor3 = rgb(0, 0, 0);
+ Text = cfg.name;
+ Parent = frame;
+ Size = dim2(1, 0, 1, 0);
+ BackgroundTransparency = 1;
+ Position = dim2(0, 1, 0, 1);
+ BorderSizePixel = 0;
+ AutomaticSize = Enum.AutomaticSize.X;
+ TextSize = 12;
+ BackgroundColor3 = rgb(255, 255, 255)
+ });
+ --
+
+ -- Connections
+ frame.MouseButton1Click:Connect(function()
+ cfg.callback()
+ end)
+ --
+
+ return setmetatable(cfg, library)
+ end
+
+ function library:init_config(window)
+ local textbox;
+ local main = window:tab({name = "Configs"})
+ local section = main:column({}):section({name = "Settings", size = 1, default = true})
+ config_holder = section:dropdown({name = "Configs", options = {"Report", "This", "Error", "To", "Finobe"}, callback = function(option) if textbox then textbox.set(option) end end, flag = "config_name_list"}); library:update_config_list()
+ textbox = section:textbox({name = "Config name:", flag = "config_name_text"})
+ section:button({name = "Save", callback = function() writefile(library.directory .. "/configs/" .. flags["config_name_text"] .. ".cfg", library:get_config()) library:update_config_list() end})
+ section:button({name = "Load", callback = function() library:load_config(readfile(library.directory .. "/configs/" .. flags["config_name_text"] .. ".cfg")) library:update_config_list() end})
+ section:button({name = "Delete", callback = function() delfile(library.directory .. "/configs/" .. flags["config_name_text"] .. ".cfg") library:update_config_list() end})
+
+ local section = main:column({}):section({name = "Other", size = 1, default = true})
+ section:keybind({name = "Menu bind", callback = function(bool) window.toggle_menu(bool) end, default = true})
+ section:colorpicker({name = "Gradient 1", callback = function(color)
+ library:update_theme("1", color)
+
+ library.gradient.Color = rgbseq{
+ rgbkey(0, themes.preset["1"]),
+ rgbkey(0.5, themes.preset["2"]),
+ rgbkey(1, themes.preset["3"]),
+ };
+
+ library.watermark_gradient.Color = rgbseq{
+ rgbkey(0, themes.preset["1"]),
+ rgbkey(0.5, themes.preset["2"]),
+ rgbkey(1, themes.preset["3"]),
+ };
+ end, color = themes.preset["1"]})
+ section:colorpicker({name = "Gradient 2", callback = function(color)
+ library:update_theme("2", color)
+
+ library.gradient.Color = rgbseq{
+ rgbkey(0, themes.preset["1"]),
+ rgbkey(0.5, themes.preset["2"]),
+ rgbkey(1, themes.preset["3"]),
+ };
+
+ library.watermark_gradient.Color = rgbseq{
+ rgbkey(0, themes.preset["1"]),
+ rgbkey(0.5, themes.preset["2"]),
+ rgbkey(1, themes.preset["3"]),
+ };
+ end, color = themes.preset["2"]})
+ section:colorpicker({name = "Gradient 3", callback = function(color)
+ library:update_theme("3", color)
+
+ library.gradient.Color = rgbseq{
+ rgbkey(0, themes.preset["1"]),
+ rgbkey(0.5, themes.preset["2"]),
+ rgbkey(1, themes.preset["3"]),
+ };
+
+ library.watermark_gradient.Color = rgbseq{
+ rgbkey(0, themes.preset["1"]),
+ rgbkey(0.5, themes.preset["2"]),
+ rgbkey(1, themes.preset["3"]),
+ };
+ end, color = themes.preset["3"]})
+
+ main:column({})
+ end
+ --
+ --
+--
+
+return library, notifications