--!nocheck
local __dcm_boot = {
hostEnv = (getgenv and getgenv()) or _G or {},
}
__dcm_boot.getLoader = function()
local hostLoader = type(__dcm_boot.hostEnv) == "table" and rawget(__dcm_boot.hostEnv, "loadstring") or nil
if type(hostLoader) == "function" then
return hostLoader
end
if type(loadstring) == "function" then
return loadstring
end
return nil
end
local __dcm_isDelta = false
if type(identifyexecutor) == "function" then
local ok, name = pcall(identifyexecutor)
__dcm_isDelta = ok and type(name) == "string" and name:lower() == "delta"
end
if not __dcm_isDelta then
pcall(function()
local loader = __dcm_boot.getLoader()
if type(loader) ~= "function" then
return
end
local src = game:HttpGet("https://gitlab.com/ltseverydayyou/Nameless-Admin/-/raw/main/NamelessAdminNotifications.lua")
local chunk = loader(src, "@NamelessAdminNotifications.lua")
if type(chunk) ~= "function" then
return
end
local mod = chunk()
if type(mod) == "table" and type(mod.Notify) == "function" then
mod.Notify({
Title = "Delta Only",
Description = "This script ONLY supports Delta's UI.\nTo that ScriptBlox reviewer: testing a Delta customizer on another executor and whining 'doesn't work' is a reading problem, not a script problem.",
Duration = 9,
})
end
end)
return
end
__dcm_boot.hostGetfenv = type(__dcm_boot.hostEnv.getfenv) == "function" and __dcm_boot.hostEnv.getfenv or getfenv
__dcm_boot.hostSetfenv = type(__dcm_boot.hostEnv.setfenv) == "function" and __dcm_boot.hostEnv.setfenv or setfenv
__dcm_boot.debug = rawget(__dcm_boot.hostEnv, "debug") or debug
__dcm_boot.getPrivateRegistry = function()
local registry
if type(getreg) == "function" then
pcall(function()
registry = getreg()
end)
end
if type(registry) ~= "table" and type(__dcm_boot.debug) == "table" and type(__dcm_boot.debug.getregistry) == "function" then
pcall(function()
registry = __dcm_boot.debug.getregistry()
end)
end
if type(registry) ~= "table" then
registry = {}
end
return registry
end
__dcm_boot.ensureTable = function(host, key)
local value = type(host) == "table" and rawget(host, key) or nil
if type(value) ~= "table" then
value = {}
if type(host) == "table" then
pcall(rawset, host, key, value)
if rawget(host, key) ~= value then
host[key] = value
end
end
end
return value
end
__dcm_boot.clearHostKey = function(host, key)
if type(host) == "table" then
pcall(rawset, host, key, nil)
pcall(function()
host[key] = nil
end)
end
end
__dcm_boot.clearLegacyGlobals = function(host)
local keys = {
"__DeltaCustomizationModuleLoaded",
"__DeltaVisualPatchLoaded",
"__DeltaThemeMenuPatchLoaded",
"__DeltaHubMusicPatch",
"DeltaIcon",
}
for i = 1, #keys do
__dcm_boot.clearHostKey(host, keys[i])
end
local sh = type(host) == "table" and rawget(host, "shared") or nil
if type(sh) == "table" and sh ~= host then
for i = 1, #keys do
__dcm_boot.clearHostKey(sh, keys[i])
end
end
end
__dcm_boot.privateRegistry = __dcm_boot.getPrivateRegistry()
__dcm_boot.privateRoot = __dcm_boot.ensureTable(__dcm_boot.privateRegistry, "__nameless_admin_private")
local __dcm_env = __dcm_boot.ensureTable(__dcm_boot.privateRoot, "delta_customization")
local __dcm_shared = __dcm_boot.ensureTable(__dcm_env, "shared")
__dcm_boot.runtimeEnv = __dcm_boot.ensureTable(__dcm_env, "runtime")
__dcm_boot.runtimeEnv.shared = __dcm_shared
__dcm_boot.runtimeEnv._G = __dcm_boot.runtimeEnv
__dcm_boot.runtimeEnv.getgenv = function()
return __dcm_boot.runtimeEnv
end
__dcm_boot.runtimeEnv.getfenv = function(target)
if target == nil or target == 0 then
return __dcm_boot.runtimeEnv
end
if type(__dcm_boot.hostGetfenv) == "function" then
return __dcm_boot.hostGetfenv(target)
end
return __dcm_boot.runtimeEnv
end
setmetatable(__dcm_boot.runtimeEnv, {
__index = function(_, key)
if key == "_G" then
return __dcm_boot.runtimeEnv
elseif key == "shared" then
return __dcm_shared
elseif key == "getgenv" then
return __dcm_boot.runtimeEnv.getgenv
elseif key == "getfenv" then
return __dcm_boot.runtimeEnv.getfenv
end
return __dcm_boot.hostEnv[key]
end,
})
if type(__dcm_boot.hostSetfenv) == "function" then
pcall(__dcm_boot.hostSetfenv, 1, __dcm_boot.runtimeEnv)
end
local __lt = (function()
local cached = rawget(__dcm_boot.privateRoot, "serviceResolver")
if type(cached) == "table" then
return cached
end
local loader = __dcm_boot.getLoader()
if type(loader) ~= "function" then
error("Service resolver loader unavailable")
end
local okSrc, src = pcall(function()
return game:HttpGet("https://gitlab.com/ltseverydayyou/ltseverydayyou.gitlab.io/-/raw/main/ServiceResolver.luau")
end)
if not (okSrc and type(src) == "string" and src ~= "") then
error("Service resolver HTTP failed: " .. tostring(typeof and typeof(src) or type(src)))
end
local resolver = loader(src, "@ServiceResolver.luau")
if type(resolver) ~= "function" then
error("Service resolver failed to compile")
end
if type(__dcm_boot.hostSetfenv) == "function" then
pcall(__dcm_boot.hostSetfenv, resolver, __dcm_boot.runtimeEnv)
end
local loaded = resolver()
if type(loaded) ~= "table" then
error("Service resolver failed to load")
end
__dcm_boot.privateRoot.serviceResolver = loaded
return loaded
end)()
local __NAUIProtector = (function()
local cacheHost = __dcm_env;
if cacheHost then
local cached = rawget(cacheHost, "__lt_ui_protector");
if type(cached) == "table" then
return cached;
end;
end;
local loader = __dcm_boot.getLoader();
if type(loader) ~= "function" then
return nil;
end;
local okSource, source = pcall(function()
return game:HttpGet("https://gitlab.com/ltseverydayyou/ltseverydayyou.gitlab.io/-/raw/main/UIprotector.luau");
end);
if not okSource or type(source) ~= "string" or source == "" then
return nil;
end;
local chunk = loader(source, "@UIprotector.luau");
if type(chunk) ~= "function" then
return nil;
end;
if type(__dcm_boot.hostSetfenv) == "function" then
pcall(__dcm_boot.hostSetfenv, chunk, __dcm_boot.runtimeEnv);
end;
local okLoaded, loaded = pcall(chunk);
if okLoaded and type(loaded) == "table" then
if cacheHost then
cacheHost.__lt_ui_protector = loaded;
end;
return loaded;
end;
return nil;
end)();
local __NAOriginalGetHui = gethui;
local gethui = function()
if __NAUIProtector and type(__NAUIProtector.huiGrabber) == "function" then
local ok, ui = pcall(__NAUIProtector.huiGrabber);
if ok and typeof(ui) == "Instance" then
return ui;
end;
end;
if type(__NAOriginalGetHui) == "function" then
local ok, ui = pcall(__NAOriginalGetHui);
if ok then
return ui;
end;
end;
return nil;
end;
local function __NAProtectUI(gui, options)
if __NAUIProtector and type(__NAUIProtector.protectUI) == "function" then
local ok, protected = pcall(__NAUIProtector.protectUI, gui, options);
if ok and protected then
return protected;
end;
end;
return nil;
end;
local function dcmAlreadyLoaded()
if __dcm_env and __dcm_env.__DeltaCustomizationModuleLoaded then
return true
end
if __dcm_shared and __dcm_shared.__DeltaCustomizationModuleLoaded then
return true
end
return false
end
local __dcm_previousMasterRuntime = rawget(__dcm_env, "__DeltaCustomizationMasterRuntime")
if type(__dcm_previousMasterRuntime) == "table" and type(__dcm_previousMasterRuntime.stop) == "function" then
pcall(__dcm_previousMasterRuntime.stop)
else
local __dcm_previousRuntime = rawget(__dcm_env, "__DeltaCustomizationV2Runtime")
if type(__dcm_previousRuntime) == "table" and type(__dcm_previousRuntime.stop) == "function" then
pcall(__dcm_previousRuntime.stop)
end
end
__dcm_env.__DeltaCustomizationModuleLoaded = nil
__dcm_shared.__DeltaCustomizationModuleLoaded = nil
__dcm_env.__DeltaVisualPatchLoaded = nil
__dcm_env.__DeltaThemeMenuPatchLoaded = nil
local __dcm_flag = {
version = "2.5.8",
loadedAt = tick(),
}
__dcm_env.__DeltaCustomizationModuleLoaded = __dcm_flag
__dcm_shared.__DeltaCustomizationModuleLoaded = __dcm_flag
local httpTxt
local UIS
local root
local settingsPath
local notify
local _naConns
local NAlib
local writeJsonFile
do
local deltaEnv = __dcm_boot.runtimeEnv
local _ref = cloneref and type(cloneref) == "function" and cloneref or function(v)
return v
end
local SRV = setmetatable({}, {
__index = function(self, n)
local ok, s = pcall(function()
return __lt.cs(n, _ref)
end)
if ok and s then
rawset(self, n, s)
return s
end
end,
})
local function Svc(n)
return SRV[n]
end
httpTxt = function(u, hdr)
if type(u) ~= "string" or u == "" then
return nil, "bad url"
end
local rq = (syn and syn.request) or request or http_request or (http and http.request)
if type(rq) == "function" then
local h = {
["User-Agent"] = "Roblox/Http/1.1",
["Accept"] = "*/*",
}
if type(hdr) == "table" then
for k, v in hdr do
h[k] = v
end
end
local ok, res = pcall(rq, {
Url = u,
Method = "GET",
Headers = h,
})
if ok and type(res) == "table" then
local code = tonumber(res.StatusCode or res.Status or res.status_code) or 0
local body = res.Body or res.body
if (code == 0 or code >= 200 and code < 300) and type(body) == "string" and body ~= "" then
return body
end
end
end
local ok, body = pcall(function()
return game:HttpGet(u)
end)
if ok and type(body) == "string" and body ~= "" then
return body
end
return nil, "HttpGet returned " .. tostring(typeof and typeof(body) or type(body))
end
local function runUrl(u, name, hdr)
local ld = __dcm_boot.getLoader()
if type(ld) ~= "function" then
return false, "loadstring unavailable"
end
local src, er = httpTxt(u, hdr)
if type(src) ~= "string" or src == "" then
return false, er or "empty source"
end
local fn, er2 = ld(src, name or ("@" .. u))
if type(fn) ~= "function" then
return false, er2 or "compile failed"
end
if type(__dcm_boot.hostSetfenv) == "function" then
pcall(__dcm_boot.hostSetfenv, fn, __dcm_boot.runtimeEnv)
end
return pcall(fn)
end
UIS = Svc("UserInputService")
local CG = Svc("CoreGui")
local HS = Svc("HttpService")
local RS = Svc("RunService")
local Stats = Svc("Stats")
local TS = Svc("TweenService")
local notifMod
local nt
local colorsPath = "DeltaCustom/Colors.json"
local colorConfig = {}
do
if HS and type(isfile) == "function" and type(readfile) == "function" then
if isfile(colorsPath) then
local ok, data = pcall(readfile, colorsPath)
if ok and data then
local ok2, decoded = pcall(function()
return __lt.cm("HttpService", "JSONDecode", data)
end)
if ok2 and type(decoded) == "table" then
colorConfig = decoded
end
end
end
end
end
settingsPath = "DeltaCustom/Settings.json"
local settingsConfig = {}
do
if HS and type(isfile) == "function" and type(readfile) == "function" then
if isfile(settingsPath) then
local ok, data = pcall(readfile, settingsPath)
if ok and data then
local ok2, decoded = pcall(function()
return __lt.cm("HttpService", "JSONDecode", data)
end)
if ok2 and type(decoded) == "table" then
settingsConfig = decoded
end
end
end
end
end
do
local n = nil
local tries = 0
repeat
tries += 1
local s, r = runUrl(
"https://gitlab.com/ltseverydayyou/Nameless-Admin/-/raw/main/NamelessAdminNotifications.lua",
"@NamelessAdminNotifications.lua"
)
if s and type(r) == "table" and type(r.Notify) == "function" then
n = r
notifMod = r
nt = r.Notify
else
task.wait(0.5)
end
until n ~= nil or tries >= 5
end
notify = function(info)
if not nt or type(info) ~= "table" then
return
end
pcall(function()
nt(info)
end)
end
_naConns = {}
NAlib = {}
function NAlib.disconnect(n)
local t = _naConns[n]
if t then
for _, c in t do
pcall(function()
c:Disconnect()
end)
end
_naConns[n] = nil
end
end
function NAlib.connect(n, c)
if not c then
return
end
_naConns[n] = _naConns[n] or {}
table.insert(_naConns[n], c)
return c
end
function NAlib.isProperty(o, p)
return pcall(function()
return o[p]
end)
end
function NAlib.setProperty(o, p, v)
pcall(function()
o[p] = v
end)
end
local uiLib = {}
uiLib.draggerV2 = function(ui, dragui)
dragui = dragui or ui
local dragging, dragInput, dragStart, startPos
local anchor = ui.AnchorPoint
local sg = ui:FindFirstAncestorWhichIsA("ScreenGui") or ui.Parent
local function sClamp(v, lo, hi)
if hi < lo then
hi = lo
end
return math.clamp(v, lo, hi)
end
local function upd(input)
pcall(function()
local p = sg.AbsoluteSize
local s = ui.AbsoluteSize
if p.X <= 0 or p.Y <= 0 then
return
end
local sx = startPos.X.Scale * p.X + startPos.X.Offset
local sy = startPos.Y.Scale * p.Y + startPos.Y.Offset
local dx = input.Position.X - dragStart.X
local dy = input.Position.Y - dragStart.Y
local minX = anchor.X * s.X
local maxX = p.X - (1 - anchor.X) * s.X
local minY = anchor.Y * s.Y
local maxY = p.Y - (1 - anchor.Y) * s.Y
local nx = sClamp(sx + dx, minX, maxX)
local ny = sClamp(sy + dy, minY, maxY)
ui.Position = UDim2.new(nx / p.X, 0, ny / p.Y, 0)
end)
end
local id = "DraggerV2_" .. ui:GetDebugId()
NAlib.disconnect(id)
NAlib.connect(
id,
dragui.InputBegan:Connect(function(input)
pcall(function()
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
dragging = true
dragStart = input.Position
startPos = ui.Position
local c = input.Changed:Connect(function()
pcall(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
end
end)
end)
NAlib.connect(id, c)
end
end)
end)
)
NAlib.connect(
id,
dragui.InputChanged:Connect(function(input)
pcall(function()
if
input.UserInputType == Enum.UserInputType.MouseMovement
or input.UserInputType == Enum.UserInputType.Touch
then
dragInput = input
end
end)
end)
)
NAlib.connect(
id,
UIS.InputChanged:Connect(function(input)
pcall(function()
if input == dragInput and dragging then
upd(input)
end
end)
end)
)
local function clampToView()
pcall(function()
local p = sg.AbsoluteSize
local s = ui.AbsoluteSize
if p.X <= 0 or p.Y <= 0 then
return
end
local pos = ui.Position
local ax = pos.X.Scale * p.X + pos.X.Offset
local ay = pos.Y.Scale * p.Y + pos.Y.Offset
local minX = anchor.X * s.X
local maxX = p.X - (1 - anchor.X) * s.X
local minY = anchor.Y * s.Y
local maxY = p.Y - (1 - anchor.Y) * s.Y
local nx = sClamp(ax, minX, maxX)
local ny = sClamp(ay, minY, maxY)
ui.Position = UDim2.new(nx / p.X, 0, ny / p.Y, 0)
end)
end
NAlib.connect(id, (sg:GetPropertyChangedSignal("AbsoluteSize")):Connect(clampToView))
if ui and ui.GetPropertyChangedSignal then
NAlib.connect(id, (ui:GetPropertyChangedSignal("AbsoluteSize")):Connect(clampToView))
end
clampToView()
if ui and NAlib.isProperty(ui, "Active") then
NAlib.setProperty(ui, "Active", true)
end
if dragui and NAlib.isProperty(dragui, "Active") then
NAlib.setProperty(dragui, "Active", true)
end
end
root = gethui and gethui() or CG
local function isGib(n)
if typeof(n) ~= "string" or n == "" then
return false
end
return not n:match("^[%w _%-]+$")
end
local function getMain()
local best
local bestScore = 0
for _, g in root:GetChildren() do
if g:IsA("ScreenGui") then
local score = 0
if g:FindFirstChild("Executor") then
score += 5
elseif g:FindFirstChild("Executor", true) then
score += 2
end
if g:FindFirstChild("Sidebar") then
score += 4
elseif g:FindFirstChild("Sidebar", true) then
score += 2
end
for _, name in { "Scripthub", "Settings", "Home", "Console" } do
if g:FindFirstChild(name) then
score += 2
elseif g:FindFirstChild(name, true) then
score += 1
end
end
if g:FindFirstChild("MainScript") then
score += 1
end
if isGib(g.Name) then
score += 1
end
if score > bestScore then
best = g
bestScore = score
end
end
end
if bestScore >= 11 then
return best
end
end
local function fixNet(rootGui)
if not rootGui then
return
end
local side = rootGui:FindFirstChild("Sidemenu", true) or rootGui
local net = side and side:FindFirstChild("Network", true)
if not (net and net:IsA("GuiObject")) then
return
end
local over = net:FindFirstChild("Overlay")
if not (over and over:IsA("GuiObject")) then
over = Instance.new("Frame")
over.Name = "Overlay"
over.BackgroundTransparency = 1
over.BorderSizePixel = 0
over.Position = UDim2.fromScale(0, 0)
over.Size = UDim2.fromScale(1, 1)
over.ClipsDescendants = false
over.ZIndex = net.ZIndex + 1
over.Parent = net
end
for _, name in { "Holder", "Information" } do
local ch = net:FindFirstChild(name)
if ch and ch ~= over and ch.Parent == net and not over:FindFirstChild(name) then
ch.Parent = over
end
end
return over
end
local function getIconGui()
local bestGui
local bestButton
local bestScore = -math.huge
for _, g in root:GetChildren() do
if g:IsA("ScreenGui") and not g:FindFirstChild("Executor", true) then
local buttons = {}
local guiCount = 0
for _, d in g:GetDescendants() do
if d:IsA("GuiObject") then
guiCount += 1
end
if d:IsA("ImageButton") then
table.insert(buttons, d)
end
end
if #buttons == 1 and guiCount <= 12 then
local button = buttons[1]
local score = 0
if button.Parent == g then
score += 4
end
if type(button.Image) == "string" and button.Image ~= "" then
score += 3
end
local size = button.AbsoluteSize
if size.X > 0 and size.Y > 0 then
local ratio = size.X / size.Y
if ratio >= 0.7 and ratio <= 1.3 then
score += 3
end
end
if isGib(g.Name) then
score += 1
end
if score > bestScore then
bestScore = score
bestGui = g
bestButton = button
end
end
end
end
return bestGui, bestButton
end
local mainGui = getMain()
local _iconGui0, _iconBtn0 = getIconGui()
local __dcm_masterRuntime = {
alive = true,
stopping = false,
objects = {},
baseline = {},
mutations = setmetatable({}, { __mode = "k" }),
customObjects = {},
roots = {},
}
__dcm_env.__DeltaCustomizationMasterRuntime = __dcm_masterRuntime
__dcm_shared.__DeltaCustomizationMasterRuntime = __dcm_masterRuntime
local __dcm_snapshotProperties = {
"Name",
"Archivable",
}
local __dcm_guiProperties = {
"Visible",
"Active",
"Selectable",
"Interactable",
"Position",
"Size",
"AnchorPoint",
"AutomaticSize",
"BackgroundColor3",
"BackgroundTransparency",
"BorderColor3",
"BorderSizePixel",
"ClipsDescendants",
"LayoutOrder",
"Rotation",
"ZIndex",
"Draggable",
}
local __dcm_textProperties = {
"Text",
"TextColor3",
"TextTransparency",
"TextStrokeColor3",
"TextStrokeTransparency",
"TextSize",
"TextScaled",
"TextWrapped",
"TextTruncate",
"TextXAlignment",
"TextYAlignment",
"FontFace",
"LineHeight",
}
local __dcm_imageProperties = {
"Image",
"ImageColor3",
"ImageTransparency",
"ScaleType",
"SliceCenter",
"SliceScale",
"ResampleMode",
"TileSize",
}
local __dcm_scrollingProperties = {
"AutomaticCanvasSize",
"CanvasPosition",
"CanvasSize",
"ElasticBehavior",
"HorizontalScrollBarInset",
"ScrollBarImageColor3",
"ScrollBarImageTransparency",
"ScrollBarThickness",
"ScrollingDirection",
"ScrollingEnabled",
"VerticalScrollBarInset",
"VerticalScrollBarPosition",
}
local function __dcm_captureProperty(object, values, property)
local ok, value = pcall(function()
return object[property]
end)
if ok then
values[property] = value
end
end
local function __dcm_captureObject(object)
if not object or __dcm_masterRuntime.baseline[object] then
return
end
local values = {}
for _, property in __dcm_snapshotProperties do
__dcm_captureProperty(object, values, property)
end
if object:IsA("LayerCollector") then
for _, property in { "Enabled", "ResetOnSpawn", "ZIndexBehavior" } do
__dcm_captureProperty(object, values, property)
end
end
if object:IsA("ScreenGui") then
for _, property in { "DisplayOrder", "IgnoreGuiInset", "ScreenInsets", "SafeAreaCompatibility", "ClipToDeviceSafeArea" } do
__dcm_captureProperty(object, values, property)
end
end
if object:IsA("CanvasGroup") then
for _, property in { "GroupColor3", "GroupTransparency" } do
__dcm_captureProperty(object, values, property)
end
end
if object:IsA("GuiButton") then
for _, property in { "AutoButtonColor", "Modal", "Selected" } do
__dcm_captureProperty(object, values, property)
end
end
if object:IsA("GuiObject") then
for _, property in __dcm_guiProperties do
__dcm_captureProperty(object, values, property)
end
end
if object:IsA("TextLabel") or object:IsA("TextButton") or object:IsA("TextBox") then
for _, property in __dcm_textProperties do
__dcm_captureProperty(object, values, property)
end
end
if object:IsA("ImageLabel") or object:IsA("ImageButton") then
for _, property in __dcm_imageProperties do
__dcm_captureProperty(object, values, property)
end
end
if object:IsA("ScrollingFrame") then
for _, property in __dcm_scrollingProperties do
__dcm_captureProperty(object, values, property)
end
elseif object:IsA("UIListLayout") or object:IsA("UIGridLayout") then
for _, property in { "Padding", "FillDirection", "HorizontalAlignment", "VerticalAlignment", "SortOrder", "Wraps", "HorizontalFlex", "VerticalFlex" } do
__dcm_captureProperty(object, values, property)
end
elseif object:IsA("UIPadding") then
for _, property in { "PaddingLeft", "PaddingRight", "PaddingTop", "PaddingBottom" } do
__dcm_captureProperty(object, values, property)
end
elseif object:IsA("UIGradient") then
for _, property in { "Color", "Transparency", "Rotation", "Offset", "Enabled" } do
__dcm_captureProperty(object, values, property)
end
elseif object:IsA("UICorner") then
__dcm_captureProperty(object, values, "CornerRadius")
elseif object:IsA("UIStroke") then
for _, property in { "Color", "Thickness", "Transparency", "Enabled", "ApplyStrokeMode", "LineJoinMode" } do
__dcm_captureProperty(object, values, property)
end
elseif object:IsA("UIScale") then
__dcm_captureProperty(object, values, "Scale")
elseif object:IsA("ValueBase") then
__dcm_captureProperty(object, values, "Value")
end
__dcm_masterRuntime.baseline[object] = true
local attributes = {}
pcall(function()
attributes = object:GetAttributes()
end)
__dcm_masterRuntime.objects[object] = {
Parent = object.Parent,
Values = values,
Attributes = attributes,
}
end
local function __dcm_captureRoot(target)
if not target then
return
end
table.insert(__dcm_masterRuntime.roots, target)
__dcm_captureObject(target)
for _, object in target:GetDescendants() do
__dcm_captureObject(object)
end
end
local function __dcm_captureMutation(object, property)
if not (object and type(property) == "string") then
return
end
local state = __dcm_masterRuntime.mutations[object]
if not state then
state = {}
__dcm_masterRuntime.mutations[object] = state
end
if state[property] ~= nil then
return
end
local ok, value = pcall(function()
return object[property]
end)
if ok then
state[property] = { value = value }
end
end
local function __dcm_setTracked(object, property, value)
if not object then
return false
end
__dcm_captureMutation(object, property)
return pcall(function()
object[property] = value
end)
end
local function __dcm_registerCustom(object)
if object then
__dcm_masterRuntime.customObjects[object] = true
end
return object
end
__dcm_masterRuntime.captureMutation = __dcm_captureMutation
__dcm_masterRuntime.setTracked = __dcm_setTracked
__dcm_masterRuntime.registerCustom = __dcm_registerCustom
__dcm_captureRoot(mainGui)
if _iconGui0 and _iconGui0 ~= mainGui then
__dcm_captureRoot(_iconGui0)
end
local function __dcm_isCustomObject(object)
local name = object.Name
if name:sub(1, 3) == "LT_" or name == "LTIcon" or name:sub(1, 11) == "DeltaCustom" then
return true
end
return name == "Section_Customization"
or name == "Section_Delta"
or name == "SidebarGestureZone"
or name == "SidebarGradientColor1"
or name == "SidebarGradientColor2"
or name == "IconColorValue"
or name == "IconSizeValue"
or name == "IconRgbSpeedValue"
or name == "DeltaIconCorner"
end
local function __dcm_restoreSnapshot()
for object in __dcm_masterRuntime.customObjects do
if object and object.Parent then
pcall(function()
object:Destroy()
end)
end
end
for object, snapshot in __dcm_masterRuntime.objects do
if object and snapshot.Parent then
pcall(function()
object.Parent = snapshot.Parent
end)
end
end
for _, target in __dcm_masterRuntime.roots do
if target and target.Parent then
local settings = target:FindFirstChild("Settings") or target:FindFirstChild("Settings", true)
local holder = settings and settings:FindFirstChild("Holder")
if holder then
for _, child in holder:GetChildren() do
if not __dcm_masterRuntime.baseline[child] and __dcm_isCustomObject(child) then
pcall(function()
child:Destroy()
end)
end
end
end
for _, object in target:GetDescendants() do
if not __dcm_masterRuntime.baseline[object] and __dcm_isCustomObject(object) then
pcall(function()
object:Destroy()
end)
end
end
end
end
for object, snapshot in __dcm_masterRuntime.objects do
if object and object.Parent then
for property, value in snapshot.Values do
pcall(function()
object[property] = value
end)
end
end
end
for object, state in __dcm_masterRuntime.mutations do
if object and object.Parent then
local baselineSnapshot = __dcm_masterRuntime.objects[object]
for property, wrapped in state do
local ownedByBaseline = baselineSnapshot
and (property == "Parent" or baselineSnapshot.Values[property] ~= nil)
if not ownedByBaseline then
pcall(function()
object[property] = wrapped.value
end)
end
end
end
end
for object, snapshot in __dcm_masterRuntime.objects do
if object and object.Parent then
pcall(function()
local original = snapshot.Attributes or {}
for name in object:GetAttributes() do
if original[name] == nil then
object:SetAttribute(name, nil)
end
end
for name, value in original do
object:SetAttribute(name, value)
end
end)
end
end
end
__dcm_masterRuntime.stop = function()
if not __dcm_masterRuntime.alive or __dcm_masterRuntime.stopping then
return
end
__dcm_masterRuntime.stopping = true
for _, key in { "__DeltaCustomizationV2Runtime", "__DeltaThemeRuntime", "__DeltaHubMusicPatch" } do
local current = rawget(__dcm_env, key)
if type(current) == "table" and current ~= __dcm_masterRuntime and type(current.stop) == "function" then
pcall(current.stop)
end
end
if type(_naConns) == "table" and type(NAlib) == "table" then
for name in _naConns do
NAlib.disconnect(name)
end
end
__dcm_restoreSnapshot()
__dcm_masterRuntime.alive = false
__dcm_masterRuntime.stopping = false
if rawget(__dcm_env, "__DeltaCustomizationMasterRuntime") == __dcm_masterRuntime then
__dcm_env.__DeltaCustomizationMasterRuntime = nil
end
if rawget(__dcm_shared, "__DeltaCustomizationMasterRuntime") == __dcm_masterRuntime then
__dcm_shared.__DeltaCustomizationMasterRuntime = nil
end
__dcm_env.__DeltaCustomizationModuleLoaded = nil
__dcm_shared.__DeltaCustomizationModuleLoaded = nil
__dcm_env.__DeltaVisualPatchLoaded = nil
__dcm_env.__DeltaThemeMenuPatchLoaded = nil
__dcm_env.DeltaIcon = nil
__dcm_env.__NewDeltaUIToggle = nil
local restoreToken = {}
__dcm_env.__DeltaCustomizationRestoreToken = restoreToken
__dcm_shared.__DeltaCustomizationRestoreToken = restoreToken
local function stabilizeRestore()
if rawget(__dcm_env, "__DeltaCustomizationRestoreToken") ~= restoreToken then
return
end
if rawget(__dcm_env, "__DeltaCustomizationMasterRuntime") ~= nil then
return
end
__dcm_restoreSnapshot()
end
task.defer(stabilizeRestore)
task.delay(0.05, stabilizeRestore)
task.delay(0.2, stabilizeRestore)
task.delay(0.6, function()
stabilizeRestore()
if rawget(__dcm_env, "__DeltaCustomizationRestoreToken") == restoreToken then
__dcm_env.__DeltaCustomizationRestoreToken = nil
end
if rawget(__dcm_shared, "__DeltaCustomizationRestoreToken") == restoreToken then
__dcm_shared.__DeltaCustomizationRestoreToken = nil
end
table.clear(__dcm_masterRuntime.mutations)
end)
end
local managedIcon = {
deltaGui = _iconGui0,
deltaBtn = _iconBtn0,
customGui = nil,
customBtn = nil,
}
managedIcon.deltaStroke = managedIcon.deltaBtn
and (
managedIcon.deltaBtn:FindFirstChildOfClass("UIStroke")
or managedIcon.deltaBtn:FindFirstChildWhichIsA("UIStroke", true)
)
managedIcon.deltaCorner = managedIcon.deltaBtn
and (
managedIcon.deltaBtn:FindFirstChildOfClass("UICorner")
or managedIcon.deltaBtn:FindFirstChildWhichIsA("UICorner", true)
)
managedIcon.customStroke = nil
managedIcon.customCorner = nil
local iconGui, iconBtn = managedIcon.deltaGui, managedIcon.deltaBtn
local iconStroke = managedIcon.deltaStroke
local iconCorner = managedIcon.deltaCorner
local iconBaseColor = iconStroke and iconStroke.Color
local iconBaseSize = iconBtn and iconBtn.Size
local iconBaseCorner = iconCorner and iconCorner.CornerRadius
local iconSzLock = false
local iconColorUseCustom = false
local iconApplyBusy = false
local updateIconStatusUI
local applyIconStrokeState
local applyIconShapeChoice
local applySavedManagedIconPosition
local bindManagedIconPositionSaver
local bindManagedIconToggle
local ensureManagedIcon
local function MouseButtonFix(button, clickCallback)
if not button or type(clickCallback) ~= "function" then
return { Disconnect = function() end }
end
local clickTimeThreshold = 0.45
local moveThreshold = 10
local mouseDownTime = 0
local isPointerDown = false
local startPosition = nil
local maxMoveDistance = 0
local connections = {}
local function getSignal(obj, signalName)
local ok, signal = pcall(function()
return obj[signalName]
end)
if ok and signal then
return signal
end
return nil
end
local function connectSignal(signal, fn)
if not signal then
return false
end
local ok, conn = pcall(function()
return signal:Connect(fn)
end)
if ok and conn then
connections[#connections + 1] = conn
return true
end
return false
end
local function isPressInput(inputType)
return inputType == Enum.UserInputType.MouseButton1 or inputType == Enum.UserInputType.Touch
end
local function resetState()
mouseDownTime = 0
isPointerDown = false
startPosition = nil
maxMoveDistance = 0
end
local function beginPointer(input)
isPointerDown = true
mouseDownTime = tick()
maxMoveDistance = 0
local pos = input and input.Position
startPosition = pos and Vector2.new(pos.X, pos.Y) or nil
end
local function endPointer()
if not isPointerDown or mouseDownTime == 0 then
resetState()
return
end
local holdDuration = tick() - mouseDownTime
local isClick = holdDuration < clickTimeThreshold and maxMoveDistance <= moveThreshold
resetState()
if isClick then
clickCallback()
end
end
local boundPress = false
local isGuiButton = type(button.IsA) == "function" and button:IsA("GuiButton")
if isGuiButton then
local downSignal = getSignal(button, "MouseButton1Down")
local upSignal = getSignal(button, "MouseButton1Up")
local downBound = connectSignal(downSignal, function()
beginPointer(nil)
end)
local upBound = connectSignal(upSignal, function()
endPointer()
end)
boundPress = downBound and upBound
end
if not boundPress then
local beganSignal = getSignal(button, "InputBegan")
local endedSignal = getSignal(button, "InputEnded")
local beganBound = connectSignal(beganSignal, function(input)
if input and isPressInput(input.UserInputType) then
beginPointer(input)
end
end)
local endedBound = connectSignal(endedSignal, function(input)
if input and isPressInput(input.UserInputType) then
endPointer()
end
end)
boundPress = beganBound and endedBound
end
local changedSignal = getSignal(button, "InputChanged")
connectSignal(changedSignal, function(input)
if not isPointerDown then
return
end
if input.UserInputType ~= Enum.UserInputType.MouseMovement and input.UserInputType ~= Enum.UserInputType.Touch then
return
end
local pos = input.Position
if not pos then
return
end
if not startPosition then
startPosition = Vector2.new(pos.X, pos.Y)
return
end
local currentPos = Vector2.new(pos.X, pos.Y)
local delta = (currentPos - startPosition).Magnitude
if delta > maxMoveDistance then
maxMoveDistance = delta
end
end)
if not boundPress then
return { Disconnect = function() end }
end
return {
Disconnect = function()
for _, conn in connections do
if conn and conn.Disconnect then
conn:Disconnect()
end
end
end,
}
end
local function hideOriginalDeltaIcon()
if managedIcon.deltaGui then
__dcm_setTracked(managedIcon.deltaGui, "Enabled", false)
end
if managedIcon.deltaBtn then
__dcm_setTracked(managedIcon.deltaBtn, "Visible", false)
__dcm_setTracked(managedIcon.deltaBtn, "Active", false)
__dcm_setTracked(managedIcon.deltaBtn, "ImageTransparency", 1)
__dcm_setTracked(managedIcon.deltaBtn, "BackgroundTransparency", 1)
end
if managedIcon.deltaStroke then
__dcm_setTracked(managedIcon.deltaStroke, "Enabled", false)
end
end
local function refreshIconRefs()
local prevIconGui = iconGui
local prevIconBtn = iconBtn
local ig, ib = getIconGui()
local deltaChanged = ig ~= managedIcon.deltaGui or ib ~= managedIcon.deltaBtn
managedIcon.deltaGui = ig
managedIcon.deltaBtn = ib
managedIcon.deltaStroke = managedIcon.deltaBtn
and (
managedIcon.deltaBtn:FindFirstChildOfClass("UIStroke")
or managedIcon.deltaBtn:FindFirstChildWhichIsA("UIStroke", true)
)
managedIcon.deltaCorner = managedIcon.deltaBtn
and (
managedIcon.deltaBtn:FindFirstChildOfClass("UICorner")
or managedIcon.deltaBtn:FindFirstChildWhichIsA("UICorner", true)
)
if managedIcon.deltaGui or managedIcon.deltaBtn then
hideOriginalDeltaIcon()
NAlib.disconnect("DeltaIcon_OriginalHideGui")
if managedIcon.deltaGui then
NAlib.connect(
"DeltaIcon_OriginalHideGui",
managedIcon.deltaGui:GetPropertyChangedSignal("Enabled"):Connect(function()
if managedIcon.deltaGui.Enabled then
hideOriginalDeltaIcon()
end
end)
)
end
NAlib.disconnect("DeltaIcon_OriginalHideBtn")
if managedIcon.deltaBtn then
NAlib.connect(
"DeltaIcon_OriginalHideBtn",
managedIcon.deltaBtn:GetPropertyChangedSignal("Visible"):Connect(function()
if managedIcon.deltaBtn.Visible then
hideOriginalDeltaIcon()
end
end)
)
end
end
if ensureManagedIcon then
ensureManagedIcon()
end
if managedIcon.customBtn and managedIcon.customBtn.Parent then
iconGui = managedIcon.customGui
iconBtn = managedIcon.customBtn
iconStroke = managedIcon.customStroke
iconCorner = managedIcon.customCorner
else
iconGui = managedIcon.deltaGui
iconBtn = managedIcon.deltaBtn
iconStroke = managedIcon.deltaStroke
iconCorner = managedIcon.deltaCorner
end
local changed = deltaChanged or iconGui ~= prevIconGui or iconBtn ~= prevIconBtn
if iconBtn then
if changed or not iconBaseSize then
iconBaseSize = iconBtn.Size
end
if iconStroke and not iconColorUseCustom and (changed or not iconBaseColor) then
iconBaseColor = iconStroke.Color
end
if iconCorner and (changed or not iconBaseCorner) then
iconBaseCorner = iconCorner.CornerRadius
end
if changed and applyIconStrokeState then
task.defer(applyIconStrokeState)
end
if changed and applyIconShapeChoice then
task.defer(applyIconShapeChoice)
end
if changed and applySavedManagedIconPosition then
task.defer(applySavedManagedIconPosition)
end
if changed and bindManagedIconPositionSaver then
task.defer(bindManagedIconPositionSaver)
end
if changed and bindManagedIconToggle then
task.defer(bindManagedIconToggle)
end
end
return changed
end
local function fsOk()
return type(isfile) == "function" and type(writefile) == "function"
end
local function gaOk()
return type(getcustomasset) == "function"
end
local function iconFsOk()
return fsOk() and gaOk()
end
local function trim(s)
if type(s) ~= "string" then
return ""
end
return s:match("^%s*(.-)%s*$") or ""
end
local function sName(name)
if type(name) ~= "string" then
return nil
end
local t = trim(name)
t = t:gsub("[^%w%._%-]", "_")
t = t:gsub("_+", "_")
t = t:gsub("^_+", "")
t = t:gsub("_+$", "")
if t == "" then
return nil
end
return t
end
local function getName(path)
if type(path) ~= "string" then
return nil
end
local n = path:gsub("\\", "/")
return n:match("([^/]+)$")
end
local function fileFromUrl(u)
if type(u) ~= "string" then
return nil
end
return u:match("/([^/%?]+)$")
end
local function iconPreUrl(u)
if type(u) ~= "string" then
return nil
end
local t = trim(u)
if t == "" then
return nil
end
t = t:gsub(" ", "%%20")
local q = t:find("%?")
local base = q and t:sub(1, q - 1) or t
return t, base
end
local function iconNormUrl(u)
local t, base = iconPreUrl(u)
if not t then
return nil
end
local owner, repo, kind, rest = base:match("^https?://github.com/([^/]+)/([^/]+)/([^/]+)/(.+)$")
if owner and repo and kind and rest then
local s = rest
if s:sub(1, 11) == "refs/heads/" then
s = s:sub(12)
elseif s:sub(1, 10) == "refs/tags/" then
s = s:sub(11)
end
local branch, path = s:match("^([^/]+)/(.+)$")
if branch and path and (kind == "blob" or kind == "raw") then
branch = branch:gsub("%%2[Ff]", "/")
path = path:gsub("%%2[Ff]", "/")
return string.format("https://raw.githubusercontent.com/%s/%s/%s/%s", owner, repo, branch, path)
end
end
local rawDir = base:match("^https?://raw%.githubusercontent%.com/.+")
if rawDir then
return t
end
return t
end
local function ensureDir(path)
if not fsOk() then
return false
end
if type(isfolder) == "function" then
local ok, ex = pcall(isfolder, path)
if ok and ex then
return true
end
if type(makefolder) ~= "function" then
return false
end
local okMk = pcall(makefolder, path)
return okMk == true
end
return true
end
local function ensureParentDir(path)
if type(path) ~= "string" or path == "" then
return false
end
local dir = path:gsub("\\", "/"):match("^(.*)/[^/]+$")
if not dir or dir == "" then
return true
end
return ensureDir(dir)
end
writeJsonFile = function(path, payload)
if not (HS and fsOk()) then
return false
end
if not ensureParentDir(path) then
return false
end
local okEnc, enc = pcall(function()
return __lt.cm("HttpService", "JSONEncode", payload)
end)
if not (okEnc and type(enc) == "string") then
return false
end
local okW = pcall(writefile, path, enc)
if okW then
return true
end
return pcall(writefile, path, enc)
end
local baseDir = "DeltaCustom"
local iconDir = baseDir .. "/DeltaIcons"
local cfgPath = baseDir .. "/delta_icon.json"
local dIcons = {
entries = {},
index = 0,
enabled = false,
localPath = "",
assetId = "",
defaultImage = "",
pendingInput = "",
}
local function ensureIconDir()
if not ensureDir(baseDir) then
return false
end
return ensureDir(iconDir)
end
local function loadIconCfg()
if not fsOk() or not HS then
return
end
if type(isfolder) == "function" and type(makefolder) == "function" then
local okB, exB = pcall(isfolder, baseDir)
if not (okB and exB) then
pcall(makefolder, baseDir)
end
end
if type(isfile) == "function" and type(writefile) == "function" then
if not isfile(cfgPath) then
pcall(
writefile,
cfgPath,
__lt.cm("HttpService", "JSONEncode", {
enabled = false,
assetId = "",
localPath = "",
index = 0,
})
)
end
end
if type(isfile) ~= "function" or type(readfile) ~= "function" then
return
end
if not isfile(cfgPath) then
return
end
local ok, raw = pcall(readfile, cfgPath)
if not (ok and type(raw) == "string") then
return
end
local okD, dec = pcall(HS.JSONDecode, HS, raw)
if not (okD and type(dec) == "table") then
return
end
if type(dec.enabled) == "boolean" then
dIcons.enabled = dec.enabled
end
if type(dec.assetId) == "string" then
dIcons.assetId = dec.assetId
end
if type(dec.localPath) == "string" then
dIcons.localPath = dec.localPath
end
if type(dec.index) == "number" then
dIcons.index = dec.index
end
end
local function saveIconCfg()
if not fsOk() or not HS then
return
end
local payload = {
enabled = dIcons.enabled and true or false,
assetId = type(dIcons.assetId) == "string" and dIcons.assetId or "",
localPath = type(dIcons.localPath) == "string" and dIcons.localPath or "",
index = tonumber(dIcons.index) or 0,
}
writeJsonFile(cfgPath, payload)
end
local function scanIcons()
dIcons.entries = {}
dIcons.index = 0
if not (fsOk() and type(listfiles) == "function") then
return
end
if not ensureIconDir() then
return
end
local ok, items = pcall(listfiles, iconDir)
if not (ok and type(items) == "table") then
return
end
local list = {}
for _, full in items do
local n = getName(full)
if n then
list[#list + 1] = { file = n }
end
end
dIcons.entries = list
if type(dIcons.localPath) == "string" and dIcons.localPath ~= "" then
local cur = getName(dIcons.localPath)
if cur then
for i, e in list do
if e.file == cur then
dIcons.index = i
if updateIconStatusUI then
updateIconStatusUI()
end
return
end
end
end
end
if #list > 0 then
dIcons.index = 1
end
if updateIconStatusUI then
updateIconStatusUI()
end
end
local function formatIconStatus()
local list = dIcons.entries
local n = #list
if n == 0 then
return "No custom icons installed"
end
if n == 1 then
return "1 custom icon installed"
end
return tostring(n) .. " custom icons installed"
end
local function resolveIconAsset(full)
if not gaOk() or type(full) ~= "string" or full == "" then
return nil
end
local tried = {}
local function tryPath(path)
if type(path) ~= "string" or path == "" or tried[path] then
return nil
end
tried[path] = true
local okA, asset = pcall(getcustomasset, path)
if okA and type(asset) == "string" and asset ~= "" then
return asset
end
return nil
end
local asset = tryPath(full)
if asset then
return asset
end
local slash = full:gsub("\\", "/")
if slash ~= full then
asset = tryPath(slash)
if asset then
return asset
end
end
local back = full:gsub("/", "\\")
if back ~= full then
asset = tryPath(back)
if asset then
return asset
end
end
local name = getName(full)
if name then
asset = tryPath(iconDir .. "/" .. name) or tryPath(iconDir .. "\\" .. name) or tryPath(name)
if asset then
return asset
end
end
return nil
end
local function iconHttpGetBinary(url, headers)
if type(url) ~= "string" or url == "" then
return nil
end
local function tryRequest(hdr)
if type(rq) ~= "function" then
return nil
end
local h = {}
if type(hdr) == "table" then
for k, v in hdr do
h[k] = v
end
end
h["User-Agent"] = h["User-Agent"] or "Roblox/Http/1.1"
h["Accept"] = h["Accept"] or "*/*"
local ok, res = pcall(rq, {
Url = url,
Method = "GET",
Headers = h,
})
if ok and res then
local code = res.StatusCode or res.Status or res.status_code or 0
local body = res.Body or res.body
if (code == 0 or (code >= 200 and code < 300)) and type(body) == "string" and body ~= "" then
return body
end
end
return nil
end
local data = tryRequest(headers)
if type(data) == "string" and data ~= "" then
return data
end
local ok2, body2 = pcall(function()
return game:HttpGet(url)
end)
if ok2 and type(body2) == "string" and body2 ~= "" then
return body2
end
return tryRequest(nil)
end
local function iconSaveFromUrl(url)
if not iconFsOk() then
return false, "Custom icons require file support and getcustomasset."
end
if not ensureIconDir() then
return false, "Unable to prepare DeltaIcons folder."
end
local norm = iconNormUrl(url)
if not norm then
return false, "Enter a valid image URL or asset id."
end
local data = iconHttpGetBinary(norm)
if not (type(data) == "string" and data ~= "") then
return false, "Unable to download icon image."
end
local remote = fileFromUrl(norm) or "DeltaIcon.png"
local safe = sName(remote) or "icon_" .. tostring(os.time()) .. ".png"
local full = iconDir .. "/" .. safe
local okW, errW = pcall(writefile, full, data)
if not okW then
return false, errW or "Unable to save icon image."
end
local asset = resolveIconAsset(full)
if not asset then
return false, "Unable to load icon image."
end
dIcons.localPath = full
local list = dIcons.entries
local idx
for i, e in list do
if e.file == safe then
idx = i
break
end
end
if not idx then
list[#list + 1] = { file = safe }
idx = #list
end
dIcons.entries = list
dIcons.index = idx
if updateIconStatusUI then
updateIconStatusUI()
end
return true, asset
end
local function applyIcon()
refreshIconRefs()
if not iconBtn or (not iconBtn:IsA("ImageButton")) then
return false
end
local img
if dIcons.enabled and type(dIcons.assetId) == "string" and dIcons.assetId ~= "" then
img = dIcons.assetId
elseif type(dIcons.defaultImage) == "string" and dIcons.defaultImage ~= "" then
img = dIcons.defaultImage
end
iconApplyBusy = true
if img and img ~= "" then
iconBtn.Image = img
iconApplyBusy = false
return true
else
iconBtn.Image = ""
end
iconApplyBusy = false
return false
end
local function setIconEnabled(flag)
if not iconFsOk() then
return false, "Custom icon requires file support and getcustomasset."
end
flag = flag and true or false
if flag and (not dIcons.assetId or dIcons.assetId == "") then
return false, "Add an asset id or image URL before enabling."
end
dIcons.enabled = flag
applyIcon()
saveIconCfg()
return true
end
local function setIconAsset(input, opts)
opts = opts or {}
if not iconFsOk() then
return false, "Custom icon requires file support and getcustomasset."
end
local raw = type(input) == "string" and input or tostring(input)
if type(raw) ~= "string" then
return false, "Enter a valid asset id or image URL."
end
raw = trim(raw)
if raw == "" then
return false, "Enter a valid asset id or image URL."
end
local digits = raw:match("^rbxassetid://(%d+)$") or raw:match("id=(%d+)") or raw:match("^(%d+)$")
local newAsset
dIcons.localPath = ""
if digits then
newAsset = "rbxassetid://" .. digits
else
local okIcon, res = iconSaveFromUrl(raw)
if not okIcon then
return false, res or "Unable to save custom icon."
end
newAsset = res
scanIcons()
end
dIcons.assetId = newAsset
if opts.autoEnable ~= false then
dIcons.enabled = true
end
applyIcon()
saveIconCfg()
if digits then
return true, digits
end
return true, raw
end
local function cycleIcon(delta)
local list = dIcons.entries
if #list == 0 then
return
end
delta = delta or 1
local idx = dIcons.index or 1
if idx < 1 or idx > #list then
idx = 1
end
idx = (idx - 1 + delta) % #list + 1
local e = list[idx]
if not e or not e.file then
return
end
local full = iconDir .. "/" .. e.file
if fsOk() and type(isfile) == "function" then
local okEx, ex = pcall(isfile, full)
if not (okEx and ex) then
scanIcons()
return
end
end
local asset = resolveIconAsset(full)
if not asset then
return
end
dIcons.localPath = full
dIcons.assetId = asset
dIcons.index = idx
dIcons.enabled = true
applyIcon()
saveIconCfg()
if updateIconStatusUI then
updateIconStatusUI()
end
end
local function delIconFile(name)
if type(name) ~= "string" or name == "" then
return
end
if not (fsOk() and type(delfile) == "function" and type(isfile) == "function") then
return
end
local full = iconDir .. "/" .. name
local okEx, ex = pcall(isfile, full)
if okEx and ex then
pcall(delfile, full)
end
end
local function clearIfCurrent(name)
if type(name) ~= "string" or name == "" then
return
end
local full = iconDir .. "/" .. name
if dIcons.localPath == full then
dIcons.localPath = ""
dIcons.assetId = ""
dIcons.index = 0
dIcons.enabled = false
applyIcon()
saveIconCfg()
end
end
local function removeIconEntry(entry)
if not (entry and entry.file) then
return
end
delIconFile(entry.file)
clearIfCurrent(entry.file)
scanIcons()
end
local function removeAllIcons()
local list = dIcons.entries or {}
for _, e in list do
if e and e.file then
delIconFile(e.file)
end
end
dIcons.entries = {}
dIcons.index = 0
dIcons.localPath = ""
dIcons.assetId = ""
dIcons.enabled = false
applyIcon()
saveIconCfg()
scanIcons()
end
ensureManagedIcon = function()
if
mainGui
and managedIcon.customBtn
and managedIcon.customBtn.Parent == mainGui
then
managedIcon.customGui = mainGui
managedIcon.customStroke = managedIcon.customBtn
and (
managedIcon.customBtn:FindFirstChildOfClass("UIStroke")
or managedIcon.customBtn:FindFirstChildWhichIsA("UIStroke", true)
)
managedIcon.customCorner = managedIcon.customBtn
and (
managedIcon.customBtn:FindFirstChildOfClass("UICorner")
or managedIcon.customBtn:FindFirstChildWhichIsA("UICorner", true)
)
return true
end
if not (mainGui and managedIcon.deltaGui and managedIcon.deltaBtn) then
return false
end
hideOriginalDeltaIcon()
local btn = managedIcon.deltaBtn:Clone()
btn.Name = "LTIcon"
btn.Visible = true
btn.Active = true
btn.ImageTransparency = managedIcon.deltaBtn.ImageTransparency
btn.BackgroundTransparency = managedIcon.deltaBtn.BackgroundTransparency
btn.Parent = mainGui
managedIcon.customGui = mainGui
managedIcon.customBtn = btn
managedIcon.customStroke = btn:FindFirstChildOfClass("UIStroke") or btn:FindFirstChildWhichIsA("UIStroke", true)
managedIcon.customCorner = btn:FindFirstChildOfClass("UICorner") or btn:FindFirstChildWhichIsA("UICorner", true)
iconGui = managedIcon.customGui
iconBtn = managedIcon.customBtn
iconStroke = managedIcon.customStroke
iconCorner = managedIcon.customCorner
return true
end
ensureManagedIcon()
refreshIconRefs()
if iconBtn and type(iconBtn.Image) == "string" and iconBtn.Image ~= "" then
dIcons.defaultImage = iconBtn.Image
end
loadIconCfg()
scanIcons()
local function refreshIconFromPath()
if not iconFsOk() then
return
end
if type(dIcons.localPath) ~= "string" or dIcons.localPath == "" then
return
end
local full = dIcons.localPath
local okEx, ex = pcall(isfile, full)
if not (okEx and ex) then
dIcons.localPath = ""
dIcons.assetId = ""
dIcons.enabled = false
saveIconCfg()
return
end
local asset = resolveIconAsset(full)
if not asset then
dIcons.assetId = ""
dIcons.enabled = false
saveIconCfg()
return
end
dIcons.assetId = asset
saveIconCfg()
end
refreshIconFromPath()
if dIcons.enabled and type(dIcons.assetId) == "string" and dIcons.assetId ~= "" then
applyIcon()
end
local function bindIconButtonWatcher()
NAlib.disconnect("DeltaIcon_ImageWatcher")
if not (iconBtn and iconBtn:IsA("ImageButton")) then
return
end
NAlib.connect(
"DeltaIcon_ImageWatcher",
iconBtn:GetPropertyChangedSignal("Image"):Connect(function()
if iconApplyBusy then
return
end
if
dIcons.enabled
and type(dIcons.assetId) == "string"
and dIcons.assetId ~= ""
and iconBtn.Image ~= dIcons.assetId
then
task.defer(applyIcon)
end
end)
)
end
local function refreshIconButtonState()
local changed = refreshIconRefs()
if iconBtn and type(iconBtn.Image) == "string" and iconBtn.Image ~= "" then
if
not (
dIcons.enabled
and type(dIcons.assetId) == "string"
and dIcons.assetId ~= ""
and iconBtn.Image == dIcons.assetId
)
then
dIcons.defaultImage = iconBtn.Image
end
end
bindIconButtonWatcher()
if changed and dIcons.enabled and type(dIcons.assetId) == "string" and dIcons.assetId ~= "" then
task.defer(applyIcon)
end
end
refreshIconButtonState()
NAlib.disconnect("DeltaIcon_RootChildAdded")
NAlib.connect(
"DeltaIcon_RootChildAdded",
root.ChildAdded:Connect(function()
task.defer(refreshIconButtonState)
end)
)
local deltaIconApi = {
status = formatIconStatus,
setEnabled = setIconEnabled,
setAsset = setIconAsset,
cycle = cycleIcon,
scan = scanIcons,
removeEntry = removeIconEntry,
removeAll = removeAllIcons,
getButton = function()
refreshIconButtonState()
return iconBtn
end,
rebindToggle = function()
if bindManagedIconToggle then
bindManagedIconToggle()
end
end,
data = dIcons,
}
deltaEnv.DeltaIcon = deltaIconApi
__dcm_env.DeltaIcon = deltaIconApi
__dcm_shared.DeltaIcon = deltaIconApi
task.defer(function()
while not mainGui do
mainGui = getMain()
if mainGui then
break
end
task.wait(0.1)
end
if not mainGui then
notify({
Title = "Delta Customization",
Description = "Failed to find Delta UI.",
Duration = 4,
})
return
end
__dcm_setTracked(mainGui, "IgnoreGuiInset", true)
fixNet(mainGui)
NAlib.disconnect("DeltaCustom_NetworkOverlayFix")
NAlib.connect("DeltaCustom_NetworkOverlayFix", mainGui.DescendantAdded:Connect(function(d)
if d and d.Name == "Network" then
task.defer(function()
fixNet(mainGui)
end)
end
end))
local execFrame = mainGui:FindFirstChild("Executor")
if not (execFrame and execFrame:IsA("Frame")) then
notify({
Title = "Delta Customization",
Description = "Executor frame not found.",
Duration = 4,
})
return
end
local execImage = execFrame:FindFirstChild("Executor")
if not (execImage and execImage:IsA("ImageLabel")) then
notify({
Title = "Delta Customization",
Description = "Executor image not found.",
Duration = 4,
})
return
end
local overlay = execImage:FindFirstChild("Overlay")
if not overlay then
notify({
Title = "Delta Customization",
Description = "Overlay frame not found.",
Duration = 4,
})
return
end
local sidebar = mainGui:FindFirstChild("Sidebar", true)
local toggleUIBtn = sidebar and sidebar:FindFirstChild("ToggleUI", true)
local activeColorValue = sidebar and sidebar:FindFirstChild("ActiveColor")
local inactiveColorValue = sidebar and sidebar:FindFirstChild("InactiveColor")
local darkOverlay = mainGui:FindFirstChild("DarkOverlay")
local sidebarGradient = nil
local sidebarGrad1 = nil
local sidebarGrad2 = nil
local sidebarClosedPos = UDim2.new(1.08, 0, 0.5, 0)
local sidebarOpenPos = UDim2.new(1, 0, 0.5, 0)
local sidebarNormalizeBusy = false
local function normalizeSidebarGeometry()
if sidebarNormalizeBusy or not (sidebar and sidebar:IsA("GuiObject")) then
return
end
sidebarNormalizeBusy = true
pcall(function()
if sidebar.Size.Y.Scale ~= 1 or sidebar.Size.Y.Offset ~= 0 then
sidebar.Size = UDim2.new(sidebar.Size.X.Scale, sidebar.Size.X.Offset, 1, 0)
end
if sidebar.Position.Y.Scale ~= 0.5 or sidebar.Position.Y.Offset ~= 0 then
sidebar.Position = UDim2.new(sidebar.Position.X.Scale, sidebar.Position.X.Offset, 0.5, 0)
end
end)
sidebarNormalizeBusy = false
end
local function setSidebarPosition(targetPos)
if not (sidebar and sidebar:IsA("GuiObject")) then
return
end
sidebar.Position = UDim2.new(targetPos.X.Scale, targetPos.X.Offset, 0.5, 0)
end
if sidebar and sidebar:IsA("GuiObject") then
normalizeSidebarGeometry()
NAlib.disconnect("Sidebar_NormalizeGeometry")
NAlib.connect(
"Sidebar_NormalizeGeometry",
sidebar:GetPropertyChangedSignal("Size"):Connect(function()
task.defer(normalizeSidebarGeometry)
end)
)
NAlib.connect(
"Sidebar_NormalizeGeometry",
sidebar:GetPropertyChangedSignal("Position"):Connect(function()
task.defer(normalizeSidebarGeometry)
end)
)
end
if iconGui and iconGui:IsA("ScreenGui") then
__dcm_setTracked(iconGui, "IgnoreGuiInset", true)
end
if iconBtn then
__dcm_setTracked(iconBtn, "Draggable", false)
uiLib.draggerV2(iconBtn, iconBtn)
end
if darkOverlay then
__dcm_setTracked(darkOverlay, "Visible", false)
__dcm_setTracked(darkOverlay, "Active", false)
NAlib.connect(
"DarkOverlay_Hide",
darkOverlay:GetPropertyChangedSignal("Visible"):Connect(function()
darkOverlay.Visible = false
end)
)
end
local settingsFrame
do
local cand = mainGui:FindFirstChild("Settings", true)
if cand and cand:IsA("Frame") and cand:FindFirstChild("Holder") then
settingsFrame = cand
end
end
local settingsHolder = settingsFrame and settingsFrame:FindFirstChild("Holder")
local settingTemplate
local function saveSettingsEntry(key, payload)
if not (HS and type(writefile) == "function") then
return
end
settingsConfig[key] = payload
writeJsonFile(settingsPath, settingsConfig)
end
local uiScaleState = {
object = nil,
value = nil,
refreshers = setmetatable({}, { __mode = "k" }),
}
local function getInterfaceViewport()
local cam = workspace.CurrentCamera
if cam and cam.ViewportSize.X > 0 and cam.ViewportSize.Y > 0 then
return cam.ViewportSize
end
return mainGui.AbsoluteSize
end
local function suggestInterfaceScale()
local vp = getInterfaceViewport()
if not vp then
return 1
end
return 1
end
local function ensureInterfaceScale()
if uiScaleState.object and uiScaleState.object.Parent == mainGui then
return uiScaleState.object
end
local sc = mainGui:FindFirstChild("LT_InterfaceScale")
if not (sc and sc:IsA("UIScale")) then
sc = Instance.new("UIScale")
sc.Name = "LT_InterfaceScale"
sc.Parent = mainGui
end
uiScaleState.object = sc
return sc
end
local function applyInterfaceScale(v)
local sc = ensureInterfaceScale()
if not sc then
return
end
pcall(function()
sc.Scale = math.clamp(tonumber(v) or 1, 0.5, 1.65)
end)
task.defer(function()
for _, delayTime in { 0, 0.03, 0.1 } do
if delayTime > 0 then
task.wait(delayTime)
end
for sf, refresh in uiScaleState.refreshers do
if sf and sf.Parent and type(refresh) == "function" then
pcall(refresh)
else
uiScaleState.refreshers[sf] = nil
end
end
end
end)
end
uiScaleState.value = Instance.new("NumberValue")
uiScaleState.value.Name = "InterfaceScaleValue"
do
local cfg = settingsConfig.InterfaceScale
local def = suggestInterfaceScale()
if type(cfg) == "table" and type(cfg.value) == "number" then
def = math.clamp(cfg.value, 0.5, 1.65)
end
uiScaleState.value.Value = def
end
applyInterfaceScale(uiScaleState.value.Value)
local function setupAutoScroll(sf, fixRows, verticalOnly)
if not (sf and sf:IsA("ScrollingFrame")) then
return
end
pcall(function()
sf.AutomaticCanvasSize = Enum.AutomaticSize.None
sf.CanvasSize = UDim2.new(0, 0, 0, 0)
if verticalOnly then
sf.ScrollingDirection = Enum.ScrollingDirection.Y
end
end)
local lay = sf:FindFirstChildWhichIsA("UIListLayout") or sf:FindFirstChildWhichIsA("UIGridLayout")
if not lay then
return
end
local id = "CanvasAuto_" .. sf:GetDebugId()
NAlib.disconnect(id)
local boundVerticalGuis = setmetatable({}, { __mode = "k" })
local function getUiScaleFactor()
local sc = uiScaleState and uiScaleState.object
local factor = sc and tonumber(sc.Scale) or 1
if not factor or factor <= 0 then
factor = 1
end
return factor
end
local function isVisibleInScroll(gui)
local cur = gui
while cur and cur ~= sf do
if cur:IsA("GuiObject") and not cur.Visible then
return false
end
cur = cur.Parent
end
return cur == sf
end
local function descendantBounds()
local maxX = 0
local maxY = 0
local canvasPos = sf.CanvasPosition
local uiScaleFactor = getUiScaleFactor()
if verticalOnly then
for _, child in sf:GetChildren() do
if child:IsA("GuiObject") and isVisibleInScroll(child) then
local relY = ((child.AbsolutePosition.Y - sf.AbsolutePosition.Y) / uiScaleFactor) + canvasPos.Y
maxY = math.max(maxY, relY + (child.AbsoluteSize.Y / uiScaleFactor))
for _, desc in child:QueryDescendants("GuiObject") do
if desc.Name == "Dropdown" and isVisibleInScroll(desc) then local dRelY = ((desc.AbsolutePosition.Y - sf.AbsolutePosition.Y) / uiScaleFactor) + canvasPos.Y
maxY = math.max(maxY, dRelY + (desc.AbsoluteSize.Y / uiScaleFactor))
end
end
end
end
else
for _, desc in sf:QueryDescendants("GuiObject") do
if isVisibleInScroll(desc) then local relX = ((desc.AbsolutePosition.X - sf.AbsolutePosition.X) / uiScaleFactor) + canvasPos.X
local relY = ((desc.AbsolutePosition.Y - sf.AbsolutePosition.Y) / uiScaleFactor) + canvasPos.Y
maxX = math.max(maxX, relX + (desc.AbsoluteSize.X / uiScaleFactor))
maxY = math.max(maxY, relY + (desc.AbsoluteSize.Y / uiScaleFactor))
end
end
end
return maxX, maxY
end
local function applyRows()
if not fixRows then
return
end
for _, ch in sf:GetChildren() do
if
ch:IsA("GuiObject")
and ch.Visible
and not ch:IsA("UIListLayout")
and not ch:IsA("UIGridLayout")
and not ch:IsA("UIPadding")
and ch.Name ~= "LT_SettingDropdown"
then
local s = ch.Size
if s.Y.Scale ~= 0 or s.Y.Offset ~= 50 then
ch.Size = UDim2.new(s.X.Scale, s.X.Offset, 0, 50)
end
end
end
end
local function upd()
if not __dcm_masterRuntime.alive or __dcm_masterRuntime.stopping then
return
end
applyRows()
local uiScaleFactor = getUiScaleFactor()
local size = lay.AbsoluteContentSize
local sizeX = size.X / uiScaleFactor
local sizeY = size.Y / uiScaleFactor
local x
local y
if verticalOnly then
local _, descY = descendantBounds()
x = 0
y = math.max(0, math.floor(math.max(sizeY + 12.5, descY + 12.5) + 0.5))
else
local descX, descY = descendantBounds()
x = math.max(0, math.floor(math.max(sizeX, descX) + 0.5))
y = math.max(0, math.floor(math.max(sizeY + 12.5, descY + 12.5) + 0.5))
end
pcall(function()
if verticalOnly then
sf.CanvasSize = UDim2.new(0, 0, 0, y)
else
sf.CanvasSize = UDim2.new(0, x, 0, y)
end
end)
end
uiScaleState.refreshers[sf] = upd
if verticalOnly then
local function bindVerticalGui(gui)
if not (gui and gui:IsA("GuiObject")) or boundVerticalGuis[gui] then
return
end
local isDirectChild = gui.Parent == sf
local isDropdownGui = gui.Name == "Dropdown" or gui.Name == "LT_SettingDropdown"
if not (isDirectChild or isDropdownGui) then
return
end
boundVerticalGuis[gui] = true
NAlib.connect(
id,
gui:GetPropertyChangedSignal("Visible"):Connect(function()
task.defer(upd)
end)
)
NAlib.connect(
id,
gui:GetPropertyChangedSignal("Size"):Connect(function()
task.defer(upd)
end)
)
NAlib.connect(
id,
gui:GetPropertyChangedSignal("Position"):Connect(function()
task.defer(upd)
end)
)
NAlib.connect(
id,
gui:GetPropertyChangedSignal("AbsoluteSize"):Connect(function()
task.defer(upd)
end)
)
end
local function bindVerticalRow(row)
if not (row and row:IsA("GuiObject")) then
return
end
bindVerticalGui(row)
for _, desc in row:QueryDescendants("GuiObject") do
if desc.Name == "Dropdown" then bindVerticalGui(desc)
end
end
NAlib.connect(
id,
row.DescendantAdded:Connect(function(desc)
if desc:IsA("GuiObject") and desc.Name == "Dropdown" then
bindVerticalGui(desc)
task.defer(upd)
end
end)
)
NAlib.connect(
id,
row.DescendantRemoving:Connect(function(desc)
if desc:IsA("GuiObject") and desc.Name == "Dropdown" then
task.defer(upd)
end
end)
)
end
for _, child in sf:GetChildren() do
bindVerticalRow(child)
end
upd()
NAlib.connect(id, lay:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(upd))
NAlib.connect(
id,
sf.DescendantAdded:Connect(function(desc)
if desc.Parent == sf then
bindVerticalRow(desc)
task.defer(upd)
end
end)
)
NAlib.connect(
id,
sf.DescendantRemoving:Connect(function()
task.defer(upd)
end)
)
NAlib.connect(
id,
sf:GetPropertyChangedSignal("AbsoluteSize"):Connect(function()
task.defer(upd)
end)
)
if uiScaleState and uiScaleState.object and uiScaleState.object.GetPropertyChangedSignal then
NAlib.connect(
id,
uiScaleState.object:GetPropertyChangedSignal("Scale"):Connect(function()
task.defer(upd)
end)
)
end
return
end
local function bindGui(gui)
if not (gui and gui:IsA("GuiObject")) then
return
end
NAlib.connect(
id,
gui:GetPropertyChangedSignal("Visible"):Connect(function()
task.defer(upd)
end)
)
NAlib.connect(
id,
gui:GetPropertyChangedSignal("Size"):Connect(function()
task.defer(upd)
end)
)
NAlib.connect(
id,
gui:GetPropertyChangedSignal("Position"):Connect(function()
task.defer(upd)
end)
)
NAlib.connect(
id,
gui:GetPropertyChangedSignal("AbsoluteSize"):Connect(function()
task.defer(upd)
end)
)
end
for _, desc in sf:QueryDescendants("Instance") do
bindGui(desc)
end
upd()
NAlib.connect(id, lay:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(upd))
NAlib.connect(
id,
sf.DescendantAdded:Connect(function(desc)
bindGui(desc)
task.defer(upd)
end)
)
NAlib.connect(
id,
sf.DescendantRemoving:Connect(function()
task.defer(upd)
end)
)
NAlib.connect(
id,
sf:GetPropertyChangedSignal("AbsoluteSize"):Connect(function()
task.defer(upd)
end)
)
if uiScaleState and uiScaleState.object and uiScaleState.object.GetPropertyChangedSignal then
NAlib.connect(
id,
uiScaleState.object:GetPropertyChangedSignal("Scale"):Connect(function()
task.defer(upd)
end)
)
end
end
local function mkDock(fr)
local d = Instance.new("Frame")
d.Name = "Dock"
d.BackgroundTransparency = 1
d.AnchorPoint = Vector2.new(1, 0.5)
d.Position = UDim2.new(1, -14, 0.5, 0)
d.Size = UDim2.new(0, 320, 0, 18)
d.Parent = fr
local l = Instance.new("UIListLayout")
l.FillDirection = Enum.FillDirection.Horizontal
l.HorizontalAlignment = Enum.HorizontalAlignment.Right
l.VerticalAlignment = Enum.VerticalAlignment.Center
l.Padding = UDim.new(0, 8)
l.Parent = d
return d
end
local function mkTog(par)
local t = Instance.new("TextButton")
t.Name = "Toggle"
t.Size = UDim2.new(0, 18, 0, 18)
t.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
t.BorderSizePixel = 0
t.Font = Enum.Font.GothamBold
t.TextSize = 11
t.TextColor3 = Color3.new(1, 1, 1)
t.Text = "C"
t.Parent = par
local c = Instance.new("UICorner")
c.CornerRadius = UDim.new(0, 4)
c.Parent = t
return t
end
local function mkBox(par)
local b = Instance.new("TextBox")
b.Name = "ValueBox"
b.Size = UDim2.new(0, 70, 0, 18)
b.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
b.BorderSizePixel = 0
b.ClearTextOnFocus = false
b.TextXAlignment = Enum.TextXAlignment.Center
b.Font = Enum.Font.Gotham
b.TextSize = 12
b.TextColor3 = Color3.new(1, 1, 1)
b.Parent = par
return b
end
local function mkSl(par, w)
local s = Instance.new("Frame")
s.Name = "Slider"
s.BackgroundTransparency = 1
s.Size = UDim2.new(0, w or 150, 0, 18)
s.Parent = par
local bar = Instance.new("Frame")
bar.Name = "Bar"
bar.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
bar.BorderSizePixel = 0
bar.AnchorPoint = Vector2.new(0.5, 0.5)
bar.Position = UDim2.new(0.5, 0, 0.5, 0)
bar.Size = UDim2.new(1, 0, 0, 6)
bar.Parent = s
local bc = Instance.new("UICorner")
bc.CornerRadius = UDim.new(0, 3)
bc.Parent = bar
local fill = Instance.new("Frame")
fill.Name = "Fill"
fill.BorderSizePixel = 0
fill.AnchorPoint = Vector2.new(0, 0.5)
fill.Position = UDim2.new(0, 0, 0.5, 0)
fill.Size = UDim2.new(0, 0, 1, 0)
fill.Parent = bar
local fc = Instance.new("UICorner")
fc.CornerRadius = UDim.new(0, 3)
fc.Parent = fill
local kb = Instance.new("Frame")
kb.Name = "Knob"
kb.Size = UDim2.new(0, 12, 0, 12)
kb.AnchorPoint = Vector2.new(0.5, 0.5)
kb.BackgroundColor3 = Color3.new(1, 1, 1)
kb.BorderSizePixel = 0
kb.Parent = bar
local kc = Instance.new("UICorner")
kc.CornerRadius = UDim.new(1, 0)
kc.Parent = kb
return s, bar, fill, kb
end
local customDropdownMenus = {}
local function closeCustomDropdowns(exceptMenu)
for i = #customDropdownMenus, 1, -1 do
local entry = customDropdownMenus[i]
local menu = type(entry) == "table" and entry.menu or entry
if not (menu and menu.Parent) then
table.remove(customDropdownMenus, i)
elseif menu ~= exceptMenu then
if type(entry) == "table" then
if type(entry.collapse) == "function" then
pcall(entry.collapse)
elseif entry.row and entry.row.Parent then
pcall(function()
menu.Visible = false
end)
local baseHeight = tonumber(entry.baseHeight) or 50
local s = entry.row.Size
entry.row.Size = UDim2.new(s.X.Scale, s.X.Offset, 0, baseHeight)
end
else
pcall(function()
menu.Visible = false
end)
end
end
end
end
if settingsHolder then
for _, c in settingsHolder:GetChildren() do
if c:IsA("Frame") and c.Name == "Button" then
settingTemplate = c
break
end
end
end
local hiddenStockDropdownTitles = {
["fps cap"] = true,
["icon size"] = true,
["icon color"] = true,
["icon shape"] = true,
}
local hiddenStockDropdownBound = setmetatable({}, { __mode = "k" })
local function enforceHiddenStockDropdownRow(child)
if not (child and child.Parent and child:IsA("Frame")) then
return
end
local size = child.Size
__dcm_setTracked(child, "Visible", false)
__dcm_setTracked(child, "Size", UDim2.new(size.X.Scale, size.X.Offset, 0, 0))
end
local function bindHiddenStockDropdownRow(child)
if not (child and child:IsA("Frame") and child.Name == "SettingDropdown") then
return
end
local title = child:FindFirstChild("Title", true)
local titleText = title and title:IsA("TextLabel") and string.lower(title.Text or "") or ""
if not hiddenStockDropdownTitles[titleText] then
return
end
enforceHiddenStockDropdownRow(child)
if not hiddenStockDropdownBound[child] then
hiddenStockDropdownBound[child] = true
local guardId = "HideManagedStockDropdownRows_" .. child:GetDebugId()
NAlib.disconnect(guardId)
NAlib.connect(
guardId,
child:GetPropertyChangedSignal("Visible"):Connect(function()
if child.Visible then
enforceHiddenStockDropdownRow(child)
end
end)
)
NAlib.connect(
guardId,
child:GetPropertyChangedSignal("Size"):Connect(function()
if child.Visible or child.Size.Y.Offset ~= 0 or child.Size.Y.Scale ~= 0 then
enforceHiddenStockDropdownRow(child)
end
end)
)
child.Destroying:Connect(function()
hiddenStockDropdownBound[child] = nil
NAlib.disconnect(guardId)
end)
end
end
local function hideManagedStockDropdownRows()
if not settingsHolder then
return
end
for _, child in settingsHolder:GetChildren() do
if child:IsA("Frame") then
bindHiddenStockDropdownRow(child)
end
end
end
if settingsHolder then
task.defer(hideManagedStockDropdownRows)
NAlib.disconnect("HideManagedStockDropdownRows")
NAlib.connect(
"HideManagedStockDropdownRows",
settingsHolder.ChildAdded:Connect(function(child)
task.defer(function()
bindHiddenStockDropdownRow(child)
end)
end)
)
end
if settingsHolder and settingTemplate then
local function makeSectionTitle(text, order, isCustom)
local f = __dcm_registerCustom(settingTemplate:Clone())
f.Name = isCustom and "Section_Customization" or "Section_Delta"
f.Parent = settingsHolder
f.LayoutOrder = order
for _, d in f:QueryDescendants("LocalScript") do
d:Destroy()
end
local btn = f:FindFirstChild("Button", true)
if btn then
btn:Destroy()
end
local tLabel = f:FindFirstChild("Title", true)
local dLabel = f:FindFirstChild("Desc", true)
local baseCol = isCustom and Color3.fromRGB(79, 164, 242) or Color3.fromRGB(112, 118, 132)
local fillCol = Color3.fromRGB(25, 28, 35)
local edgeCol = isCustom and Color3.fromRGB(88, 152, 223) or Color3.fromRGB(63, 68, 80)
f.BackgroundColor3 = fillCol
local outline = f:FindFirstChildWhichIsA("UIStroke", true)
if outline then
outline.Color = edgeCol
outline.Transparency = 0.34
outline.Thickness = 1
end
local panelGrad = f:FindFirstChildWhichIsA("UIGradient", true)
if panelGrad then
panelGrad.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(28, 31, 38)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(23, 25, 31)),
})
panelGrad.Rotation = 0
else
panelGrad = Instance.new("UIGradient")
panelGrad.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(28, 31, 38)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(23, 25, 31)),
})
panelGrad.Rotation = 0
panelGrad.Parent = f
end
if tLabel then
tLabel.Text = isCustom and "Customization" or "Delta settings"
tLabel.AnchorPoint = Vector2.new(0.5, 0.5)
tLabel.Position = UDim2.new(0.5, 0, 0.5, 0)
tLabel.Size = UDim2.new(1, -32, 0, 18)
tLabel.TextColor3 = Color3.fromRGB(236, 240, 247)
tLabel.TextXAlignment = Enum.TextXAlignment.Center
tLabel.TextYAlignment = Enum.TextYAlignment.Center
if isCustom then
local textGrad = tLabel:FindFirstChildOfClass("UIGradient") or Instance.new("UIGradient")
textGrad.Color = ColorSequence.new({
ColorSequenceKeypoint.new(
0,
activeColorValue and activeColorValue.Value or Color3.fromRGB(79, 164, 242)
),
ColorSequenceKeypoint.new(0.5, Color3.fromRGB(235, 244, 255)),
ColorSequenceKeypoint.new(
1,
inactiveColorValue and inactiveColorValue.Value or Color3.fromRGB(63, 72, 92)
),
})
textGrad.Offset = Vector2.new(-0.8, 0)
textGrad.Parent = tLabel
local function refreshCustomSectionColors()
local activeCol = activeColorValue and activeColorValue.Value or Color3.fromRGB(79, 164, 242)
local inactiveCol = inactiveColorValue and inactiveColorValue.Value
or Color3.fromRGB(63, 72, 92)
textGrad.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, activeCol),
ColorSequenceKeypoint.new(0.5, Color3.fromRGB(235, 244, 255)),
ColorSequenceKeypoint.new(1, inactiveCol),
})
if panelGrad then
panelGrad.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, activeCol:Lerp(Color3.fromRGB(14, 16, 22), 0.74)),
ColorSequenceKeypoint.new(1, inactiveCol:Lerp(Color3.fromRGB(14, 16, 22), 0.8)),
})
end
end
refreshCustomSectionColors()
if activeColorValue then
activeColorValue:GetPropertyChangedSignal("Value"):Connect(refreshCustomSectionColors)
end
if inactiveColorValue then
inactiveColorValue:GetPropertyChangedSignal("Value"):Connect(refreshCustomSectionColors)
end
if TS then
local alive = true
f.Destroying:Connect(function()
alive = false
end)
local function animateTextGradient()
if not alive or not textGrad.Parent then
return
end
textGrad.Offset = Vector2.new(-0.8, 0)
local tw = TS:Create(
textGrad,
TweenInfo.new(1.7, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut),
{
Offset = Vector2.new(0.8, 0),
}
)
tw:Play()
tw.Completed:Connect(function()
if alive then
task.delay(0.12, animateTextGradient)
end
end)
end
local function animateBackground()
if not alive or not f.Parent then
return
end
local activeCol = activeColorValue and activeColorValue.Value
or Color3.fromRGB(79, 164, 242)
local inactiveCol = inactiveColorValue and inactiveColorValue.Value
or Color3.fromRGB(63, 72, 92)
local a = activeCol:Lerp(Color3.fromRGB(12, 14, 18), 0.78)
local b = inactiveCol:Lerp(Color3.fromRGB(12, 14, 18), 0.78)
local tw1 =
TS:Create(f, TweenInfo.new(1.25, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut), {
BackgroundColor3 = a,
})
tw1:Play()
tw1.Completed:Connect(function()
if not alive or not f.Parent then
return
end
local tw2 = TS:Create(
f,
TweenInfo.new(1.25, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut),
{
BackgroundColor3 = b,
}
)
tw2:Play()
tw2.Completed:Connect(function()
if alive then
animateBackground()
end
end)
end)
end
animateTextGradient()
animateBackground()
end
end
end
if dLabel then
dLabel.Text = ""
dLabel.Visible = false
end
return f
end
makeSectionTitle("Customization", -3, true)
makeSectionTitle("Delta settings", -1, false)
end
if sidebar then
local existingGrad = sidebar:FindFirstChildOfClass("UIGradient")
local c1
local c2
if existingGrad then
local kps = existingGrad.Color.Keypoints
c1 = kps[1] and kps[1].Value or Color3.fromRGB(79, 164, 242)
c2 = kps[#kps] and kps[#kps].Value or Color3.fromRGB(28, 34, 46)
sidebarGradient = existingGrad
else
c1 = Color3.fromRGB(79, 164, 242)
c2 = Color3.fromRGB(28, 34, 46)
sidebarGradient = Instance.new("UIGradient")
sidebarGradient.Name = "DeltaCustomGradient"
sidebarGradient.Parent = sidebar
end
sidebarGradient.Rotation = 100
sidebarGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, c1),
ColorSequenceKeypoint.new(1, c2),
})
sidebarGrad1 = Instance.new("Color3Value")
sidebarGrad1.Name = "SidebarGradientColor1"
sidebarGrad1.Value = c1
sidebarGrad2 = Instance.new("Color3Value")
sidebarGrad2.Name = "SidebarGradientColor2"
sidebarGrad2.Value = c2
local sidebarSnapPending = false
NAlib.disconnect("Sidebar_OvershootSnap")
NAlib.connect(
"Sidebar_OvershootSnap",
(sidebar:GetPropertyChangedSignal("Position")):Connect(function()
local p = sidebar.Position
if p.X.Scale > sidebarOpenPos.X.Scale and not sidebarSnapPending then
sidebarSnapPending = true
task.spawn(function()
local last = p
local stable = 0
local step = 0.05
while stable < 0.1 do
task.wait(step)
local cur = sidebar.Position
if cur ~= last then
last = cur
stable = 0
else
stable += step
end
end
sidebarSnapPending = false
if sidebar.Parent and sidebar.Position.X.Scale > sidebarOpenPos.X.Scale then
setSidebarPosition(sidebarClosedPos)
normalizeSidebarGeometry()
end
end)
end
end)
)
end
local iconColorValue
if iconStroke then
iconColorValue = Instance.new("Color3Value")
iconColorValue.Name = "IconColorValue"
iconColorValue.Value = iconBaseColor or iconStroke.Color
NAlib.connect(
"IconColorValue_Changed",
iconColorValue.Changed:Connect(function()
if not iconColorUseCustom then
return
end
pcall(function()
iconStroke.Color = iconColorValue.Value
end)
end)
)
end
local iconSizeValue
if iconBtn and iconBaseSize then
iconSizeValue = Instance.new("NumberValue")
iconSizeValue.Name = "IconSizeValue"
iconSizeValue.Value = 1
local sizeCfg = settingsConfig.IconSize
if type(sizeCfg) == "table" and type(sizeCfg.value) == "number" then
iconSizeValue.Value = math.clamp(sizeCfg.value, 0.5, 5)
end
local function applyIconSize(v)
v = math.clamp(v, 0.5, 5)
if not iconBtn or not iconBaseSize then
return
end
iconSzLock = true
iconBtn.Size = UDim2.new(
iconBaseSize.X.Scale * v,
iconBaseSize.X.Offset * v,
iconBaseSize.Y.Scale * v,
iconBaseSize.Y.Offset * v
)
iconSzLock = false
end
if iconBtn and iconBtn.GetPropertyChangedSignal and mainGui and mainGui.GetPropertyChangedSignal then
NAlib.connect(
"IconSizeRebase",
(mainGui:GetPropertyChangedSignal("AbsoluteSize")):Connect(function()
task.defer(function()
if iconBtn and iconSizeValue and not iconSzLock then
local v = math.clamp(iconSizeValue.Value, 0.5, 5)
local s = iconBtn.Size
iconBaseSize = UDim2.new(s.X.Scale / v, s.X.Offset / v, s.Y.Scale / v, s.Y.Offset / v)
applyIconSize(v)
end
end)
end)
)
end
NAlib.connect(
"IconSizeValue_Changed",
iconSizeValue.Changed:Connect(function()
applyIconSize(iconSizeValue.Value)
if HS and type(writefile) == "function" then
settingsConfig.IconSize = { value = math.clamp(iconSizeValue.Value, 0.5, 5) }
writeJsonFile(settingsPath, settingsConfig)
end
end)
)
applyIconSize(iconSizeValue.Value)
end
local function ensureIconCorner()
refreshIconRefs()
if not iconBtn then
return nil
end
if not iconCorner then
iconCorner = Instance.new("UICorner")
iconCorner.Name = "DeltaIconCorner"
iconCorner.Parent = iconBtn
end
if not iconBaseCorner then
iconBaseCorner = iconCorner.CornerRadius
end
return iconCorner
end
local iconShapeName = "Squircle"
do
local cfg = settingsConfig.IconShape
if type(cfg) == "table" and type(cfg.name) == "string" and cfg.name ~= "" then
iconShapeName = cfg.name
end
end
if iconShapeName == "Default" then
iconShapeName = "Squircle"
elseif iconShapeName == "Pill" then
iconShapeName = "Circle"
end
local function getIconShapeCorner(shapeName)
if shapeName == "Square" then
return UDim.new(0, 0)
elseif shapeName == "Rounded" then
return UDim.new(0, 8)
elseif shapeName == "Squircle" then
return UDim.new(0, 12)
elseif shapeName == "Circle" then
return UDim.new(1, 0)
end
return UDim.new(0, 12)
end
applyIconShapeChoice = function()
local corner = ensureIconCorner()
if not corner then
return
end
pcall(function()
corner.CornerRadius = getIconShapeCorner(iconShapeName)
end)
end
task.defer(applyIconShapeChoice)
local iconRgbSpeedValue
if iconStroke then
iconRgbSpeedValue = Instance.new("NumberValue")
iconRgbSpeedValue.Name = "IconRgbSpeedValue"
local sp = 0.2
local spCfg = settingsConfig.IconRgbSpeed
if type(spCfg) == "table" and type(spCfg.value) == "number" then
sp = math.clamp(spCfg.value, 0.05, 2)
end
iconRgbSpeedValue.Value = sp
end
local iconVisible = true
do
local cfg = settingsConfig.IconVisible
if type(cfg) == "table" and cfg.enabled ~= nil then
iconVisible = cfg.enabled and true or false
end
end
local iconPositionSaveEnabled = false
do
local cfg = settingsConfig.IconPositionSave
if type(cfg) == "table" and cfg.enabled ~= nil then
iconPositionSaveEnabled = cfg.enabled and true or false
end
end
local iconStrokeUserEnabled = true
do
local cfg = settingsConfig.IconStrokeEnabled
if type(cfg) == "table" and cfg.enabled ~= nil then
iconStrokeUserEnabled = cfg.enabled and true or false
end
end
local iconForcedHidden = false
local tabNotifEnabled = true
do
local cfg = settingsConfig.TabNotifications
if type(cfg) == "table" and cfg.enabled ~= nil then
tabNotifEnabled = cfg.enabled and true or false
end
end
local function tweenIconVisual(imgT, bgT, instant)
if not iconBtn then
return
end
if imgT < 1 or bgT < 1 then
pcall(function()
iconBtn.Visible = true
end)
end
if TS and not instant then
pcall(function()
(__lt.cm(
"TweenService",
"Create",
iconBtn,
TweenInfo.new(0.18, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
{
ImageTransparency = imgT,
BackgroundTransparency = bgT,
}
)):Play()
end)
else
pcall(function()
iconBtn.ImageTransparency = imgT
iconBtn.BackgroundTransparency = bgT
end)
end
end
local function updateManagedIconDisplay(instant)
if not iconBtn then
return
end
local shouldShow = iconVisible and not iconForcedHidden
pcall(function()
iconBtn.Active = true
end)
pcall(function()
iconBtn.Interactable = true
end)
if shouldShow then
pcall(function()
iconBtn.Visible = true
end)
tweenIconVisual(0, 0, instant)
else
if not iconForcedHidden then
pcall(function()
iconBtn.Visible = true
end)
end
tweenIconVisual(1, 1, instant)
if iconForcedHidden then
local stamp = tick()
task.delay(instant and 0 or 0.2, function()
if not iconBtn or not iconBtn.Parent then
return
end
if stamp and not iconForcedHidden then
return
end
pcall(function()
iconBtn.Visible = false
end)
end)
end
end
applyIconStrokeState()
end
applyIconStrokeState = function()
if not iconStroke then
return
end
pcall(function()
iconStroke.Enabled = iconVisible and iconStrokeUserEnabled and not iconForcedHidden
end)
end
local function saveManagedIconPosition()
if not (iconPositionSaveEnabled and iconBtn and iconBtn.Parent) then
return
end
saveSettingsEntry("IconPosition", {
xScale = iconBtn.Position.X.Scale,
xOffset = iconBtn.Position.X.Offset,
yScale = iconBtn.Position.Y.Scale,
yOffset = iconBtn.Position.Y.Offset,
})
end
applySavedManagedIconPosition = function()
if not (iconPositionSaveEnabled and iconBtn and iconBtn.Parent) then
return
end
local cfg = settingsConfig.IconPosition
if type(cfg) ~= "table" then
return
end
local xs = tonumber(cfg.xScale)
local xo = tonumber(cfg.xOffset)
local ys = tonumber(cfg.yScale)
local yo = tonumber(cfg.yOffset)
if xs and xo and ys and yo then
pcall(function()
iconBtn.Position = UDim2.new(xs, xo, ys, yo)
end)
end
end
bindManagedIconPositionSaver = function()
NAlib.disconnect("ManagedIcon_PositionSave")
if not (iconBtn and iconBtn.Parent) then
return
end
local stamp = 0
NAlib.connect(
"ManagedIcon_PositionSave",
iconBtn:GetPropertyChangedSignal("Position"):Connect(function()
if not iconPositionSaveEnabled then
return
end
stamp += 1
local cur = stamp
task.delay(0.2, function()
if cur == stamp then
saveManagedIconPosition()
end
end)
end)
)
end
local function applyIconUserVisibility(instant)
updateManagedIconDisplay(instant)
end
local function setIconForcedHidden(hidden)
iconForcedHidden = hidden and true or false
if not iconBtn then
return
end
updateManagedIconDisplay(false)
end
task.defer(function()
applySavedManagedIconPosition()
bindManagedIconPositionSaver()
end)
applyIconUserVisibility(true)
local scriptHubHolder
local homeHolder
do
local sh = mainGui:FindFirstChild("Scripthub")
if sh then
scriptHubHolder = sh:FindFirstChild("Holder")
end
local ho = mainGui:FindFirstChild("Home")
if ho then
homeHolder = ho:FindFirstChild("Holder")
end
end
setupAutoScroll(settingsHolder, true, true)
setupAutoScroll(scriptHubHolder, false, false)
setupAutoScroll(homeHolder, true, true)
local function makeColorSlider(id, tt, dt, cVal)
if not (settingsHolder and settingTemplate and cVal) then
return
end
local key = id or tt or "Color_" .. tostring(math.random(1, 1000000000))
local slId = "ColorSlider_" .. key
local isIc = id == "IconColor" and iconStroke ~= nil
local fr = __dcm_registerCustom(settingTemplate:Clone())
fr.Parent = settingsHolder
fr.Visible = true
fr.LayoutOrder = -2
for _, d in fr:QueryDescendants("LocalScript") do
d:Destroy()
end
local tL = fr:FindFirstChild("Title", true)
local dL = fr:FindFirstChild("Desc", true)
if tL then
tL.Text = tt
end
if dL then
dL.Text = dt
end
local ob = fr:FindFirstChild("Button", true)
local ord = 0
if ob then
ord = ob.LayoutOrder
ob:Destroy()
end
local pad = 14
local vbW = 74
local tgW = 20
local slW = 190
local sl = Instance.new("Frame")
sl.Name = "ColorSlider"
sl.BackgroundTransparency = 1
sl.Size = UDim2.new(0, slW, 1, 0)
sl.AnchorPoint = Vector2.new(1, 0.5)
sl.LayoutOrder = ord
sl.Parent = fr
local vb = Instance.new("TextBox")
vb.Name = "ColorValue"
vb.Size = UDim2.new(0, vbW, 0, 18)
vb.AnchorPoint = Vector2.new(1, 0.5)
vb.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
vb.BorderSizePixel = 0
vb.ClearTextOnFocus = false
vb.TextXAlignment = Enum.TextXAlignment.Center
vb.Font = Enum.Font.Gotham
vb.TextSize = 12
vb.TextColor3 = Color3.new(1, 1, 1)
vb.Parent = fr
local tg = Instance.new("TextButton")
tg.Name = "Toggle"
tg.Size = UDim2.new(0, tgW, 0, 18)
tg.AnchorPoint = Vector2.new(1, 0.5)
tg.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
tg.BorderSizePixel = 0
tg.Font = Enum.Font.GothamBold
tg.TextSize = 11
tg.TextColor3 = Color3.new(1, 1, 1)
tg.Text = "C"
tg.Parent = fr
local tgc = Instance.new("UICorner")
tgc.CornerRadius = UDim.new(0, 4)
tgc.Parent = tg
local function lay()
local y = 0.5
vb.Position = UDim2.new(1, -pad, y, 0)
tg.Position = UDim2.new(1, -(pad + vbW + 8), y, 0)
sl.Position = UDim2.new(1, -(pad + vbW + 8 + tgW + 8), y, 0)
end
lay();
(fr:GetPropertyChangedSignal("AbsoluteSize")):Connect(lay)
local function mkBar(nm, yy)
local b = Instance.new("Frame")
b.Name = nm
b.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
b.BorderSizePixel = 0
b.AnchorPoint = Vector2.new(0.5, 0)
b.Position = UDim2.new(0.5, 0, yy, 0)
b.Size = UDim2.new(1, 0, 0, 5)
b.Active = true
b.Parent = sl
local bc = Instance.new("UICorner")
bc.CornerRadius = UDim.new(0, 3)
bc.Parent = b
local k = Instance.new("Frame")
k.Name = "Knob"
k.Size = UDim2.new(0, 9, 0, 9)
k.AnchorPoint = Vector2.new(0.5, 0.5)
k.Position = UDim2.new(0, 0, 0.5, 0)
k.BackgroundColor3 = Color3.new(1, 1, 1)
k.BorderSizePixel = 0
k.Parent = b
local kc = Instance.new("UICorner")
kc.CornerRadius = UDim.new(1, 0)
kc.Parent = k
return b, k
end
local bH, kH = mkBar("Hue", 0.2)
local bS, kS = mkBar("Sat", 0.5)
local bV, kV = mkBar("Val", 0.8)
local gH = Instance.new("UIGradient")
gH.Rotation = 0
gH.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 0, 0)),
ColorSequenceKeypoint.new(0.17, Color3.fromRGB(255, 255, 0)),
ColorSequenceKeypoint.new(0.33, Color3.fromRGB(0, 255, 0)),
ColorSequenceKeypoint.new(0.5, Color3.fromRGB(0, 255, 255)),
ColorSequenceKeypoint.new(0.67, Color3.fromRGB(0, 0, 255)),
ColorSequenceKeypoint.new(0.83, Color3.fromRGB(255, 0, 255)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(255, 0, 0)),
})
gH.Parent = bH
local gS = Instance.new("UIGradient")
gS.Rotation = 0
gS.Parent = bS
local gV = Instance.new("UIGradient")
gV.Rotation = 0
gV.Parent = bV
local defC = cVal.Value or Color3.new(1, 1, 1)
local cOn = true
local lastC = defC
local sv = colorConfig[key]
if type(sv) == "table" then
if type(sv.customColor) == "table" and #sv.customColor == 3 then
lastC = Color3.new(sv.customColor[1], sv.customColor[2], sv.customColor[3])
end
if sv.useCustom ~= nil then
cOn = sv.useCustom and true or false
end
end
local h, s, v = Color3.toHSV(lastC)
local function boxC(c)
vb.Text = string.format(
"%d,%d,%d",
math.floor(c.R * 255 + 0.5),
math.floor(c.G * 255 + 0.5),
math.floor(c.B * 255 + 0.5)
)
end
local function save()
if not (HS and type(writefile) == "function") then
return
end
colorConfig[key] = {
useCustom = cOn,
customColor = { lastC.R, lastC.G, lastC.B },
}
writeJsonFile(colorsPath, colorConfig)
end
local function updGrad()
gS.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromHSV(h, 0, v)),
ColorSequenceKeypoint.new(1, Color3.fromHSV(h, 1, v)),
})
gV.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromHSV(h, s, 0)),
ColorSequenceKeypoint.new(1, Color3.fromHSV(h, s, 1)),
})
end
local function setVis()
kH.Position = UDim2.new(h, 0, 0.5, 0)
kS.Position = UDim2.new(s, 0, 0.5, 0)
kV.Position = UDim2.new(v, 0, 0.5, 0)
updGrad()
boxC(Color3.fromHSV(h, s, v))
end
local function applyC(col, st)
if cVal then
cVal.Value = col
end
if st then
lastC = col
end
save()
end
local function setHSV(nh, ns, nv, st)
h = math.clamp(nh, 0, 1)
s = math.clamp(ns, 0, 1)
v = math.clamp(nv, 0, 1)
setVis()
applyC(Color3.fromHSV(h, s, v), st)
end
local function syncFromC(col)
h, s, v = Color3.toHSV(col)
setVis()
end
if cOn then
if isIc then
iconColorUseCustom = true
end
syncFromC(lastC)
applyC(lastC, false)
tg.Text = "C"
else
if isIc then
iconColorUseCustom = false
if iconStroke then
pcall(function()
iconStroke.Color = iconBaseColor or iconStroke.Color
end)
end
end
syncFromC(defC)
applyC(defC, false)
tg.Text = "D"
end
local drag = nil
local function relX(bar, inp)
local w = bar.AbsoluteSize.X
if w <= 1 then
return nil
end
local x = (inp.Position.X - bar.AbsolutePosition.X) / w
if x ~= x then
x = 0
end
return math.clamp(x, 0, 1)
end
local function useDrag(inp)
if not drag then
return
end
local a = relX(drag, inp)
if not a then
return
end
cOn = true
tg.Text = "C"
if isIc then
iconColorUseCustom = true
end
if drag == bH then
setHSV(a, s, v, true)
elseif drag == bS then
setHSV(h, a, v, true)
elseif drag == bV then
setHSV(h, s, a, true)
end
end
local function beg(bar, inp)
if
inp.UserInputType ~= Enum.UserInputType.MouseButton1
and inp.UserInputType ~= Enum.UserInputType.Touch
then
return
end
drag = bar
useDrag(inp)
end
bH.InputBegan:Connect(function(i)
beg(bH, i)
end)
bS.InputBegan:Connect(function(i)
beg(bS, i)
end)
bV.InputBegan:Connect(function(i)
beg(bV, i)
end)
NAlib.disconnect(slId)
NAlib.connect(
slId,
UIS.InputChanged:Connect(function(i)
if not drag then
return
end
if
i.UserInputType == Enum.UserInputType.MouseMovement
or i.UserInputType == Enum.UserInputType.Touch
then
useDrag(i)
end
end)
)
NAlib.connect(
slId,
UIS.InputEnded:Connect(function(i)
if
i.UserInputType == Enum.UserInputType.MouseButton1
or i.UserInputType == Enum.UserInputType.Touch
then
drag = nil
end
end)
)
fr.Destroying:Connect(function()
NAlib.disconnect(slId)
end)
vb.FocusLost:Connect(function()
local txt = vb.Text or ""
local r, g, b = txt:match("(%d+)%s*,%s*(%d+)%s*,%s*(%d+)")
r, g, b = tonumber(r), tonumber(g), tonumber(b)
if r and g and b then
local col =
Color3.new(math.clamp(r, 0, 255) / 255, math.clamp(g, 0, 255) / 255, math.clamp(b, 0, 255) / 255)
cOn = true
tg.Text = "C"
if isIc then
iconColorUseCustom = true
end
syncFromC(col)
applyC(col, true)
else
boxC(cVal.Value)
end
end)
tg.MouseButton1Click:Connect(function()
if cOn then
cOn = false
tg.Text = "D"
if isIc then
iconColorUseCustom = false
if iconStroke then
pcall(function()
iconStroke.Color = iconBaseColor or iconStroke.Color
end)
end
end
syncFromC(defC)
applyC(defC, false)
else
cOn = true
tg.Text = "C"
if isIc then
iconColorUseCustom = true
end
syncFromC(lastC or defC)
applyC(lastC or defC, true)
end
save()
end)
end
local function makeSizeSlider(id, titleText, descText, numValue, minV, maxV, opts)
if not (settingsHolder and settingTemplate and numValue) then
return
end
opts = type(opts) == "table" and opts or {}
local key = id or titleText or "Size_" .. tostring(math.random(1, 1000000000))
local slId = "SizeSlider_" .. key
minV = minV or 0.5
maxV = maxV or 5
local fr = __dcm_registerCustom(settingTemplate:Clone())
fr.Parent = settingsHolder
fr.Visible = true
fr.LayoutOrder = -2
local tl = fr:FindFirstChild("Title", true)
local dl = fr:FindFirstChild("Desc", true)
if tl then
tl.Text = titleText
end
if dl then
dl.Text = descText
end
local ob = fr:FindFirstChild("Button", true)
if ob then
ob:Destroy()
end
local dock = mkDock(fr)
local vb = mkBox(dock)
local sl, bar, fill, kb = mkSl(dock, 150)
local sv = settingsConfig[key]
if type(sv) == "table" and type(sv.value) == "number" then
numValue.Value = math.clamp(sv.value, minV, maxV)
end
local function save(v)
if opts.persist == false then
return
end
if not (HS and type(writefile) == "function") then
return
end
settingsConfig[key] = { value = v }
writeJsonFile(settingsPath, settingsConfig)
end
local function setVis(v)
if opts.integer then
v = math.floor((tonumber(v) or minV) + 0.5)
end
v = math.clamp(v, minV, maxV)
local denom = maxV - minV
local a = denom ~= 0 and ((v - minV) / denom) or 0
fill.Size = UDim2.new(a, 0, 1, 0)
kb.Position = UDim2.new(a, 0, 0.5, 0)
vb.Text = opts.integer and tostring(v) or string.format("%.2f", v)
end
local function commit(v)
if opts.integer then
v = math.floor((tonumber(v) or minV) + 0.5)
end
v = math.clamp(v, minV, maxV)
numValue.Value = v
setVis(v)
save(v)
if type(opts.apply) == "function" then
pcall(opts.apply, v)
end
end
setVis(numValue.Value)
local drag = false
local pendingValue = numValue.Value
local function fromIn(input)
local rel = 0
pcall(function()
rel = (input.Position.X - bar.AbsolutePosition.X) / bar.AbsoluteSize.X
end)
rel = math.clamp(rel, 0, 1)
local nextV = minV + (maxV - minV) * rel
if opts.integer then
nextV = math.floor(nextV + 0.5)
end
if opts.applyOnRelease then
pendingValue = nextV
setVis(nextV)
else
commit(nextV)
end
end
bar.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
drag = true
fromIn(input)
end
end)
NAlib.disconnect(slId)
NAlib.connect(
slId,
UIS.InputChanged:Connect(function(input)
if not drag then
return
end
if
input.UserInputType == Enum.UserInputType.MouseMovement
or input.UserInputType == Enum.UserInputType.Touch
then
fromIn(input)
end
end)
)
NAlib.connect(
slId,
UIS.InputEnded:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
if drag and opts.applyOnRelease then
commit(pendingValue)
end
drag = false
end
end)
)
fr.Destroying:Connect(function()
NAlib.disconnect(slId)
end)
vb.FocusLost:Connect(function()
local v = tonumber(vb.Text or "")
if v then
commit(v)
else
setVis(numValue.Value)
end
end)
local function updDock()
local w = math.clamp(math.floor(fr.AbsoluteSize.X * 0.46), 240, 380)
dock.Size = UDim2.new(0, w, 0, 18)
local sw = math.clamp(w - 78, 140, 280)
sl.Size = UDim2.new(0, sw, 0, 18)
end
updDock()
fr:GetPropertyChangedSignal("AbsoluteSize"):Connect(function()
task.defer(updDock)
end)
end
local function makeEnumDropdown(id, titleText, descText, enumItems, getCurrentName, setSelectedName, opts)
if not (settingsHolder and settingTemplate and type(setSelectedName) == "function") then
return
end
opts = type(opts) == "table" and opts or {}
local names = {}
for _, item in enumItems or {} do
if typeof(item) == "EnumItem" then
names[#names + 1] = item.Name
elseif type(item) == "string" and item ~= "" then
names[#names + 1] = item
end
end
if #names == 0 then
return
end
local baseHeight = 50
local fr = Instance.new("Frame")
fr.Name = "LT_SettingDropdown"
fr.Parent = settingsHolder
fr.Visible = true
fr.LayoutOrder = -2
fr.BackgroundTransparency = 1
fr.BorderSizePixel = 0
fr.ClipsDescendants = false
fr.Size = UDim2.new(1, 0, 0, baseHeight)
local card = __dcm_registerCustom(settingTemplate:Clone())
card.Name = "Card"
card.Parent = fr
card.Visible = true
card.Size = UDim2.new(1, 0, 0, baseHeight)
card.Position = UDim2.new(0, 0, 0, 0)
for _, d in card:QueryDescendants("LocalScript") do
d:Destroy()
end
local tl = card:FindFirstChild("Title", true)
local dl = card:FindFirstChild("Desc", true)
if tl then
tl.Text = titleText
tl.TextScaled = false
tl.TextWrapped = false
tl.TextTruncate = Enum.TextTruncate.AtEnd
tl.TextYAlignment = Enum.TextYAlignment.Center
end
if dl then
dl.Text = descText
dl.TextScaled = false
dl.TextWrapped = false
dl.TextTruncate = Enum.TextTruncate.AtEnd
dl.TextYAlignment = Enum.TextYAlignment.Center
end
local ob = card:FindFirstChild("Button", true)
if ob then
ob:Destroy()
end
local dock = mkDock(card)
local dockLayout = dock:FindFirstChildWhichIsA("UIListLayout")
if dockLayout then
dockLayout:Destroy()
end
dock.Size = UDim2.new(0, 168, 0, 30)
local openBg = Instance.new("Frame")
openBg.Name = "DropdownBackground"
openBg.AnchorPoint = Vector2.new(1, 0.5)
openBg.Position = UDim2.new(1, 0, 0.5, 0)
openBg.Size = UDim2.new(1, 0, 1, 0)
openBg.BackgroundColor3 = Color3.fromRGB(39, 42, 52)
openBg.BorderSizePixel = 0
openBg.ZIndex = 25
openBg.Parent = dock
local openBgCorner = Instance.new("UICorner")
openBgCorner.CornerRadius = UDim.new(0, 12)
openBgCorner.Parent = openBg
local openBtn = Instance.new("TextButton")
openBtn.Name = "DropdownButton"
openBtn.Size = UDim2.new(1, 0, 1, 0)
openBtn.BackgroundTransparency = 1
openBtn.BorderSizePixel = 0
openBtn.AutoButtonColor = false
openBtn.Font = Enum.Font.GothamBold
openBtn.TextSize = 12
openBtn.TextColor3 = Color3.fromRGB(164, 169, 182)
openBtn.TextXAlignment = Enum.TextXAlignment.Right
openBtn.ZIndex = 27
openBtn.Parent = dock
local openPad = Instance.new("UIPadding")
openPad.PaddingLeft = UDim.new(0, 8)
openPad.PaddingRight = UDim.new(0, 30)
openPad.Parent = openBtn
local arrow = Instance.new("Frame")
arrow.Name = "Arrow"
arrow.BackgroundTransparency = 1
arrow.AnchorPoint = Vector2.new(1, 0.5)
arrow.Position = UDim2.new(1, -8, 0.5, 0)
arrow.Size = UDim2.new(0, 12, 0, 18)
arrow.ZIndex = 28
arrow.Parent = dock
local arrowLayout = Instance.new("UIListLayout")
arrowLayout.FillDirection = Enum.FillDirection.Vertical
arrowLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center
arrowLayout.VerticalAlignment = Enum.VerticalAlignment.Center
arrowLayout.Padding = UDim.new(0, 0)
arrowLayout.Parent = arrow
local upArrow = Instance.new("TextLabel")
upArrow.Name = "Up"
upArrow.BackgroundTransparency = 1
upArrow.Size = UDim2.new(1, 0, 0, 9)
upArrow.Font = Enum.Font.GothamBold
upArrow.TextSize = 9
upArrow.TextColor3 = Color3.fromRGB(104, 110, 124)
upArrow.Text = "^"
upArrow.ZIndex = 28
upArrow.Parent = arrow
local downArrow = Instance.new("TextLabel")
downArrow.Name = "Down"
downArrow.BackgroundTransparency = 1
downArrow.Size = UDim2.new(1, 0, 0, 9)
downArrow.Font = Enum.Font.GothamBold
downArrow.TextSize = 9
downArrow.TextColor3 = Color3.fromRGB(160, 166, 180)
downArrow.Text = "v"
downArrow.ZIndex = 28
downArrow.Parent = arrow
local menu = Instance.new("ScrollingFrame")
menu.Name = "Dropdown"
menu.AnchorPoint = Vector2.new(1, 0)
menu.Position = UDim2.new(1, -14, 0, baseHeight + 6)
menu.Size = UDim2.new(0, 168, 0, math.min(132, #names * 30 + 8))
menu.Visible = false
menu.BackgroundColor3 = Color3.fromRGB(43, 47, 58)
menu.BorderSizePixel = 0
menu.ScrollBarThickness = 3
menu.ScrollingDirection = Enum.ScrollingDirection.Y
menu.CanvasSize = UDim2.new(0, 0, 0, 0)
menu.AutomaticCanvasSize = Enum.AutomaticSize.Y
menu.ZIndex = 26
menu.Parent = fr
local menuCorner = Instance.new("UICorner")
menuCorner.CornerRadius = UDim.new(0, 10)
menuCorner.Parent = menu
local menuPad = Instance.new("UIPadding")
menuPad.PaddingTop = UDim.new(0, 4)
menuPad.PaddingBottom = UDim.new(0, 4)
menuPad.PaddingLeft = UDim.new(0, 12)
menuPad.PaddingRight = UDim.new(0, 12)
menuPad.Parent = menu
local menuLayout = Instance.new("UIListLayout")
menuLayout.Padding = UDim.new(0, 0)
menuLayout.SortOrder = Enum.SortOrder.LayoutOrder
menuLayout.Parent = menu
local dropdownEntry = {
menu = menu,
row = fr,
baseHeight = baseHeight,
}
table.insert(customDropdownMenus, dropdownEntry)
local selectedName
local optionButtons = {}
local hover = false
local dropdownOpen = false
local function getDropdownScale()
local sc = uiScaleState and uiScaleState.object
local factor = sc and tonumber(sc.Scale) or 1
if not factor or factor <= 0 then
factor = 1
end
return factor
end
local function syncExpandedHeight()
local s = fr.Size
local menuLogicalHeight = menu.Size.Y.Offset
local uiScaleFactor = getDropdownScale()
if menu.AbsoluteSize.Y > 0 then
menuLogicalHeight = math.max(menuLogicalHeight, math.floor((menu.AbsoluteSize.Y / uiScaleFactor) + 0.5))
end
local expandedHeight = baseHeight + menuLogicalHeight + 6
fr.Size = UDim2.new(s.X.Scale, s.X.Offset, 0, dropdownOpen and expandedHeight or baseHeight)
end
local function setExpanded(open)
dropdownOpen = open and true or false
menu.Visible = dropdownOpen
upArrow.TextColor3 = open and Color3.fromRGB(160, 166, 180) or Color3.fromRGB(104, 110, 124)
downArrow.TextColor3 = open and Color3.fromRGB(104, 110, 124) or Color3.fromRGB(160, 166, 180)
syncExpandedHeight()
openBg.BackgroundColor3 = open and Color3.fromRGB(48, 52, 64)
or (hover and Color3.fromRGB(45, 49, 60) or Color3.fromRGB(39, 42, 52))
end
dropdownEntry.collapse = function()
setExpanded(false)
end
local function refreshOptions()
for name, btn in optionButtons do
if btn and btn.Parent then
btn.TextColor3 = name == selectedName and Color3.fromRGB(255, 255, 255)
or Color3.fromRGB(245, 247, 252)
local check = btn:FindFirstChild("Check")
if check and check:IsA("TextLabel") then
check.Visible = name == selectedName
end
end
end
openBtn.Text = selectedName or "Select"
end
local function applySelection(name)
if not table.find(names, name) then
return
end
selectedName = name
pcall(function()
setSelectedName(name)
end)
if opts.persist and id then
saveSettingsEntry(id, { name = name })
end
refreshOptions()
end
for idx, name in names do
local option = Instance.new("TextButton")
option.Name = name
option.Size = UDim2.new(1, 0, 0, 30)
option.BackgroundTransparency = 1
option.BorderSizePixel = 0
option.AutoButtonColor = false
option.Font = Enum.Font.GothamMedium
option.TextSize = 12
option.TextColor3 = Color3.new(1, 1, 1)
option.TextXAlignment = Enum.TextXAlignment.Left
option.Text = name
option.LayoutOrder = idx
option.ZIndex = 27
option.Parent = menu
local optionPad = Instance.new("UIPadding")
optionPad.PaddingRight = UDim.new(0, 24)
optionPad.Parent = option
local divider = Instance.new("Frame")
divider.Name = "Divider"
divider.AnchorPoint = Vector2.new(0, 1)
divider.Position = UDim2.new(0, 0, 1, 0)
divider.Size = UDim2.new(1, 0, 0, idx < #names and 1 or 0)
divider.BackgroundColor3 = Color3.fromRGB(66, 96, 128)
divider.BorderSizePixel = 0
divider.ZIndex = 27
divider.Parent = option
local check = Instance.new("TextLabel")
check.Name = "Check"
check.BackgroundTransparency = 1
check.AnchorPoint = Vector2.new(1, 0.5)
check.Position = UDim2.new(1, 0, 0.5, 0)
check.Size = UDim2.new(0, 16, 0, 16)
check.Font = Enum.Font.GothamBold
check.TextSize = 15
check.TextColor3 = Color3.fromRGB(79, 164, 242)
check.Text = "✓"
check.Visible = false
check.ZIndex = 28
check.Parent = option
optionButtons[name] = option
option.MouseButton1Click:Connect(function()
closeCustomDropdowns(menu)
setExpanded(false)
applySelection(name)
end)
end
openBtn.MouseEnter:Connect(function()
hover = true
if not menu.Visible then
openBg.BackgroundColor3 = Color3.fromRGB(45, 49, 60)
end
end)
openBtn.MouseLeave:Connect(function()
hover = false
if not menu.Visible then
openBg.BackgroundColor3 = Color3.fromRGB(39, 42, 52)
end
end)
openBtn.MouseButton1Click:Connect(function()
local willOpen = not menu.Visible
closeCustomDropdowns(menu)
setExpanded(willOpen)
end)
menu:GetPropertyChangedSignal("AbsoluteSize"):Connect(function()
task.defer(syncExpandedHeight)
end)
menu:GetPropertyChangedSignal("Size"):Connect(function()
task.defer(syncExpandedHeight)
end)
if uiScaleState and uiScaleState.object and uiScaleState.object.GetPropertyChangedSignal then
uiScaleState.object:GetPropertyChangedSignal("Scale"):Connect(function()
task.defer(syncExpandedHeight)
end)
end
local initialName
if opts.persist and id then
local saved = settingsConfig[id]
if type(saved) == "table" and type(saved.name) == "string" then
initialName = saved.name
end
end
if type(getCurrentName) == "function" then
initialName = initialName or getCurrentName()
end
if not table.find(names, initialName) then
initialName = names[1]
end
setExpanded(false)
applySelection(initialName)
end
local function makeIconRgbToggle()
if not (settingsHolder and settingTemplate and iconBtn and iconStroke) then
return
end
local key = "IconRGB"
local frame = __dcm_registerCustom(settingTemplate:Clone())
frame.Parent = settingsHolder
frame.Visible = true
frame.LayoutOrder = -2
for _, d in frame:QueryDescendants("LocalScript") do
d:Destroy()
end
local tLabel = frame:FindFirstChild("Title", true)
local dLabel = frame:FindFirstChild("Desc", true)
if tLabel then
tLabel.Text = "RGB icon"
end
if dLabel then
dLabel.Text = "Rainbow outline on the Delta icon."
end
local btnFrame = frame:FindFirstChild("Button", true)
if not btnFrame then
return
end
local btnLabel = btnFrame:FindFirstChildWhichIsA("TextLabel")
if btnLabel then
btnLabel.Text = "Toggle"
end
local clickable = btnFrame:FindFirstChildWhichIsA("GuiButton") or btnFrame
local saved = settingsConfig[key]
local enabled = false
if type(saved) == "table" and saved.enabled ~= nil then
enabled = saved.enabled and true or false
end
local hue = 0
local function saveState()
if not (HS and type(writefile) == "function") then
return
end
settingsConfig[key] = { enabled = enabled }
writeJsonFile(settingsPath, settingsConfig)
end
local function setVisualToggle()
btnFrame.BackgroundColor3 = enabled and Color3.fromRGB(79, 164, 242) or Color3.fromRGB(30, 30, 30)
end
local function startLoop()
NAlib.disconnect("IconRGB_Loop")
NAlib.connect(
"IconRGB_Loop",
RS.Heartbeat:Connect(function(dt)
local spd = iconRgbSpeedValue and math.clamp(iconRgbSpeedValue.Value, 0.05, 2) or 0.2
hue = (hue + dt * spd) % 1
pcall(function()
iconStroke.Color = Color3.fromHSV(hue, 1, 1)
end)
end)
)
end
local function stopLoop()
NAlib.disconnect("IconRGB_Loop")
pcall(function()
if iconColorUseCustom and iconColorValue then
iconStroke.Color = iconColorValue.Value
else
iconStroke.Color = iconBaseColor or iconStroke.Color
end
end)
end
local function applyState()
setVisualToggle()
if enabled then
startLoop()
else
stopLoop()
end
saveState()
end
applyState()
local function toggleClick()
enabled = not enabled
applyState()
end
if clickable:IsA("GuiButton") then
clickable.MouseButton1Click:Connect(toggleClick)
else
clickable.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
toggleClick()
end
end)
end
end
local function makeIconVisibilityToggle()
if not (settingsHolder and settingTemplate and iconBtn) then
return
end
local key = "IconVisible"
local frame = __dcm_registerCustom(settingTemplate:Clone())
frame.Parent = settingsHolder
frame.Visible = true
frame.LayoutOrder = -2
for _, d in frame:QueryDescendants("LocalScript") do
d:Destroy()
end
local tLabel = frame:FindFirstChild("Title", true)
local dLabel = frame:FindFirstChild("Desc", true)
if tLabel then
tLabel.Text = "Icon visibility"
end
if dLabel then
dLabel.Text = "Makes the Delta icon invisible"
end
local btnFrame = frame:FindFirstChild("Button", true)
if not btnFrame then
return
end
local btnLabel = btnFrame:FindFirstChildWhichIsA("TextLabel")
if btnLabel then
btnLabel.Text = "Toggle"
end
local clickable = btnFrame:FindFirstChildWhichIsA("GuiButton") or btnFrame
local function saveState()
if not (HS and type(writefile) == "function") then
return
end
settingsConfig[key] = { enabled = iconVisible }
writeJsonFile(settingsPath, settingsConfig)
end
local function setVisual()
btnFrame.BackgroundColor3 = iconVisible and Color3.fromRGB(79, 164, 242) or Color3.fromRGB(30, 30, 30)
end
setVisual()
local function toggleClick()
iconVisible = not iconVisible
applyIconUserVisibility(false)
setVisual()
saveState()
end
if clickable:IsA("GuiButton") then
clickable.MouseButton1Click:Connect(toggleClick)
else
clickable.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
toggleClick()
end
end)
end
end
local function makeIconStrokeToggle()
if not (settingsHolder and settingTemplate and iconStroke) then
return
end
local key = "IconStrokeEnabled"
local frame = __dcm_registerCustom(settingTemplate:Clone())
frame.Parent = settingsHolder
frame.Visible = true
frame.LayoutOrder = -2
for _, d in frame:QueryDescendants("LocalScript") do
d:Destroy()
end
local tLabel = frame:FindFirstChild("Title", true)
local dLabel = frame:FindFirstChild("Desc", true)
if tLabel then
tLabel.Text = "Icon stroke"
end
if dLabel then
dLabel.Text = "Toggle the Delta icon outline"
end
local btnFrame = frame:FindFirstChild("Button", true)
if not btnFrame then
return
end
local btnLabel = btnFrame:FindFirstChildWhichIsA("TextLabel")
if btnLabel then
btnLabel.Text = "Toggle"
end
local clickable = btnFrame:FindFirstChildWhichIsA("GuiButton") or btnFrame
local function saveState()
saveSettingsEntry(key, { enabled = iconStrokeUserEnabled })
end
local function setVisual()
btnFrame.BackgroundColor3 = iconStrokeUserEnabled and Color3.fromRGB(79, 164, 242)
or Color3.fromRGB(30, 30, 30)
end
setVisual()
local function toggleClick()
iconStrokeUserEnabled = not iconStrokeUserEnabled
applyIconStrokeState()
setVisual()
saveState()
end
if clickable:IsA("GuiButton") then
clickable.MouseButton1Click:Connect(toggleClick)
else
clickable.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
toggleClick()
end
end)
end
end
local function makeIconPositionSaveToggle()
if not (settingsHolder and settingTemplate and iconBtn) then
return
end
local key = "IconPositionSave"
local frame = __dcm_registerCustom(settingTemplate:Clone())
frame.Parent = settingsHolder
frame.Visible = true
frame.LayoutOrder = -2
for _, d in frame:QueryDescendants("LocalScript") do
d:Destroy()
end
local tLabel = frame:FindFirstChild("Title", true)
local dLabel = frame:FindFirstChild("Desc", true)
if tLabel then
tLabel.Text = "Save icon position"
end
if dLabel then
dLabel.Text = "Load your dragged icon position on execute"
end
local btnFrame = frame:FindFirstChild("Button", true)
if not btnFrame then
return
end
local btnLabel = btnFrame:FindFirstChildWhichIsA("TextLabel")
if btnLabel then
btnLabel.Text = "Toggle"
end
local clickable = btnFrame:FindFirstChildWhichIsA("GuiButton") or btnFrame
local function saveState()
saveSettingsEntry(key, { enabled = iconPositionSaveEnabled })
if iconPositionSaveEnabled then
saveManagedIconPosition()
end
end
local function setVisual()
btnFrame.BackgroundColor3 = iconPositionSaveEnabled and Color3.fromRGB(79, 164, 242)
or Color3.fromRGB(30, 30, 30)
end
setVisual()
local function toggleClick()
iconPositionSaveEnabled = not iconPositionSaveEnabled
if iconPositionSaveEnabled then
applySavedManagedIconPosition()
end
setVisual()
saveState()
end
if clickable:IsA("GuiButton") then
clickable.MouseButton1Click:Connect(toggleClick)
else
clickable.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
toggleClick()
end
end)
end
end
local function makeTabNotifToggle()
if not (settingsHolder and settingTemplate) then
return
end
local key = "TabNotifications"
local frame = __dcm_registerCustom(settingTemplate:Clone())
frame.Parent = settingsHolder
frame.Visible = true
frame.LayoutOrder = -2
for _, d in frame:QueryDescendants("LocalScript") do
d:Destroy()
end
local tLabel = frame:FindFirstChild("Title", true)
local dLabel = frame:FindFirstChild("Desc", true)
if tLabel then
tLabel.Text = "Tab notifications"
end
if dLabel then
dLabel.Text = "Show info popups about saved tabs"
end
local btnFrame = frame:FindFirstChild("Button", true)
if not btnFrame then
return
end
local btnLabel = btnFrame:FindFirstChildWhichIsA("TextLabel")
if btnLabel then
btnLabel.Text = "Toggle"
end
local clickable = btnFrame:FindFirstChildWhichIsA("GuiButton") or btnFrame
local function saveState()
if not (HS and type(writefile) == "function") then
return
end
settingsConfig[key] = { enabled = tabNotifEnabled }
writeJsonFile(settingsPath, settingsConfig)
end
local function setVisual()
btnFrame.BackgroundColor3 = tabNotifEnabled and Color3.fromRGB(79, 164, 242) or Color3.fromRGB(30, 30, 30)
end
setVisual()
local function toggleClick()
tabNotifEnabled = not tabNotifEnabled
setVisual()
saveState()
end
if clickable:IsA("GuiButton") then
clickable.MouseButton1Click:Connect(toggleClick)
else
clickable.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
toggleClick()
end
end)
end
end
local function makeDestroyUIButton()
if not (settingsHolder and settingTemplate) then
return
end
local frame = __dcm_registerCustom(settingTemplate:Clone())
frame.Parent = settingsHolder
frame.Visible = true
frame.LayoutOrder = -2
for _, d in frame:QueryDescendants("LocalScript") do
d:Destroy()
end
local tLabel = frame:FindFirstChild("Title", true)
local dLabel = frame:FindFirstChild("Desc", true)
if tLabel then
tLabel.Text = "Destroy Delta UI"
tLabel.TextColor3 = Color3.fromRGB(255, 80, 80)
end
if dLabel then
dLabel.Text = "Deletes Delta's UI and icon until you rejoin."
dLabel.TextColor3 = Color3.fromRGB(255, 120, 120)
end
local btnFrame = frame:FindFirstChild("Button", true)
if not btnFrame then
return
end
local btnLabel = btnFrame:FindFirstChildWhichIsA("TextLabel")
if btnLabel then
btnLabel.Text = "KILL"
end
btnFrame.BackgroundColor3 = Color3.fromRGB(255, 80, 80)
local clickable = btnFrame:FindFirstChildWhichIsA("GuiButton") or btnFrame
local function click()
if iconGui and iconGui ~= mainGui then
pcall(function()
iconGui:Destroy()
end)
iconGui = nil
end
if mainGui then
pcall(function()
mainGui:Destroy()
end)
mainGui = nil
end
end
if clickable:IsA("GuiButton") then
clickable.MouseButton1Click:Connect(click)
else
clickable.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
click()
end
end)
end
end
local function makeIconEnableToggle()
if not (settingsHolder and settingTemplate and iconBtn) then
return
end
local key = "IconEnabled"
local frame = __dcm_registerCustom(settingTemplate:Clone())
frame.Parent = settingsHolder
frame.Visible = true
frame.LayoutOrder = -2
for _, d in frame:QueryDescendants("LocalScript") do
d:Destroy()
end
local tLabel = frame:FindFirstChild("Title", true)
local dLabel = frame:FindFirstChild("Desc", true)
if tLabel then
tLabel.Text = "Use custom icon"
end
if dLabel then
dLabel.Text = iconFsOk() and "Toggle between default and custom Delta icon"
or "Requires file system + getcustomasset support"
end
local btnFrame = frame:FindFirstChild("Button", true)
if not btnFrame then
return
end
local btnLabel = btnFrame:FindFirstChildWhichIsA("TextLabel")
if btnLabel then
btnLabel.Text = "Toggle"
end
local clickable = btnFrame:FindFirstChildWhichIsA("GuiButton") or btnFrame
local enabled = dIcons.enabled and true or false
local function setVisual()
btnFrame.BackgroundColor3 = enabled and Color3.fromRGB(79, 164, 242) or Color3.fromRGB(30, 30, 30)
end
setVisual()
local function toggleClick()
local target = not enabled
local ok, err = setIconEnabled(target)
if not ok then
notify({
Title = "Delta Icon",
Description = err or "Failed to toggle custom icon.",
Duration = 5,
})
return
end
enabled = target
setVisual()
end
if clickable:IsA("GuiButton") then
clickable.MouseButton1Click:Connect(toggleClick)
else
clickable.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
toggleClick()
end
end)
end
end
local function makeIconInputRow()
if not (settingsHolder and settingTemplate and iconBtn) then
return
end
local frame = __dcm_registerCustom(settingTemplate:Clone())
frame.Parent = settingsHolder
frame.Visible = true
frame.LayoutOrder = -2
for _, d in frame:QueryDescendants("LocalScript") do
d:Destroy()
end
local tLabel = frame:FindFirstChild("Title", true)
local dLabel = frame:FindFirstChild("Desc", true)
if tLabel then
tLabel.Text = "Icon source"
end
if dLabel then
dLabel.Text = "Asset id or image URL (GitHub/External supported)"
end
local oldBtn = frame:FindFirstChild("Button", true)
local pos
if oldBtn then
pos = oldBtn.Position
oldBtn:Destroy()
end
local basePos = pos or UDim2.new(1, -160, 0.5, 0)
local bx, bo = basePos.X.Scale, basePos.X.Offset
local by, byo = basePos.Y.Scale, basePos.Y.Offset
local box = Instance.new("TextBox")
box.Name = "IconInput"
box.Size = UDim2.new(0, 160, 0, 18)
box.AnchorPoint = Vector2.new(1, 0.5)
box.Position = UDim2.new(bx, bo, by, byo)
box.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
box.BorderSizePixel = 0
box.ClearTextOnFocus = true
box.TextXAlignment = Enum.TextXAlignment.Center
box.Font = Enum.Font.Gotham
box.TextSize = 12
box.TextColor3 = Color3.new(1, 1, 1)
box.Text = ""
box.PlaceholderText = "ID or image URL"
box.Parent = frame
local setBtn = Instance.new("TextButton")
setBtn.Name = "Apply"
setBtn.Size = UDim2.new(0, 50, 0, 18)
setBtn.AnchorPoint = Vector2.new(1, 0.5)
setBtn.Position = UDim2.new(bx, bo - 170, by, byo)
setBtn.BackgroundColor3 = Color3.fromRGB(79, 164, 242)
setBtn.BorderSizePixel = 0
setBtn.Font = Enum.Font.GothamBold
setBtn.TextSize = 11
setBtn.TextColor3 = Color3.new(1, 1, 1)
setBtn.Text = "SET"
setBtn.Parent = frame
local setCorner = Instance.new("UICorner")
setCorner.CornerRadius = UDim.new(0, 4)
setCorner.Parent = setBtn
local defBtn = Instance.new("TextButton")
defBtn.Name = "Default"
defBtn.Size = UDim2.new(0, 50, 0, 18)
defBtn.AnchorPoint = Vector2.new(1, 0.5)
defBtn.Position = UDim2.new(bx, bo - 230, by, byo)
defBtn.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
defBtn.BorderSizePixel = 0
defBtn.Font = Enum.Font.GothamBold
defBtn.TextSize = 11
defBtn.TextColor3 = Color3.new(1, 1, 1)
defBtn.Text = "DEF"
defBtn.Parent = frame
local defCorner = Instance.new("UICorner")
defCorner.CornerRadius = UDim.new(0, 4)
defCorner.Parent = defBtn
local function applyInput()
if not iconFsOk() then
notify({
Title = "Delta Icon",
Description = "Custom icons require file system + getcustomasset.",
Duration = 5,
})
return
end
local txt = trim(box.Text or "")
if txt == "" then
notify({
Title = "Delta Icon",
Description = "Enter an asset id or image URL.",
Duration = 4,
})
return
end
local ok, msg = setIconAsset(txt, { autoEnable = true })
if not ok then
notify({
Title = "Delta Icon",
Description = msg or "Failed to set custom icon.",
Duration = 5,
})
return
end
if updateIconStatusUI then
updateIconStatusUI()
end
box.Text = ""
notify({
Title = "Delta Icon",
Description = "Custom icon updated.",
Duration = 4,
})
end
local function resetDefault()
dIcons.enabled = false
dIcons.assetId = ""
dIcons.localPath = ""
applyIcon()
saveIconCfg()
if updateIconStatusUI then
updateIconStatusUI()
end
notify({
Title = "Delta Icon",
Description = "Reverted to default icon.",
Duration = 4,
})
end
setBtn.MouseButton1Click:Connect(applyInput)
defBtn.MouseButton1Click:Connect(resetDefault)
box.FocusLost:Connect(function(enter)
if enter then
applyInput()
end
end)
end
local function makeIconManagerRow()
if not (settingsHolder and settingTemplate) then
return
end
local frame = __dcm_registerCustom(settingTemplate:Clone())
frame.Parent = settingsHolder
frame.Visible = true
frame.LayoutOrder = -2
for _, d in frame:QueryDescendants("LocalScript") do
d:Destroy()
end
local tLabel = frame:FindFirstChild("Title", true)
local dLabel = frame:FindFirstChild("Desc", true)
if tLabel then
tLabel.Text = "Icon manager"
end
if dLabel then
dLabel.Text = iconFsOk() and formatIconStatus() or "File system/getcustomasset not supported."
end
local oldBtn = frame:FindFirstChild("Button", true)
local pos
if oldBtn then
pos = oldBtn.Position
oldBtn:Destroy()
end
local basePos = pos or UDim2.new(1, -160, 0.5, 0)
local bx, bo = basePos.X.Scale, basePos.X.Offset
local by, byo = basePos.Y.Scale, basePos.Y.Offset
local function mkMgrBtn(nm, w, xOff, bgColor, txt)
local b = Instance.new("TextButton")
b.Name = nm
b.Size = UDim2.new(0, w, 0, 18)
b.AnchorPoint = Vector2.new(1, 0.5)
b.Position = UDim2.new(bx, bo + xOff, by, byo)
b.BackgroundColor3 = bgColor
b.BorderSizePixel = 0
b.Font = Enum.Font.GothamBold
b.TextSize = 11
b.TextColor3 = Color3.new(1, 1, 1)
b.Text = txt
b.Parent = frame
local c = Instance.new("UICorner")
c.CornerRadius = UDim.new(0, 4)
c.Parent = b
return b
end
local gray = Color3.fromRGB(30, 30, 30)
local prevBtn = mkMgrBtn("Prev", 24, -210, gray, "<")
local nextBtn = mkMgrBtn("Next", 24, -180, gray, ">")
local delBtn = mkMgrBtn("Del", 32, -140, Color3.fromRGB(80, 40, 40), "DEL")
local clrBtn = mkMgrBtn("Clr", 36, -95, Color3.fromRGB(60, 30, 30), "CLR")
local statusLabel = Instance.new("TextLabel")
statusLabel.Name = "Status"
statusLabel.Size = UDim2.new(0, 60, 0, 18)
statusLabel.AnchorPoint = Vector2.new(1, 0.5)
statusLabel.Position = UDim2.new(bx, bo, by, byo)
statusLabel.BackgroundTransparency = 1
statusLabel.Font = Enum.Font.Gotham
statusLabel.TextSize = 11
statusLabel.TextColor3 = Color3.fromRGB(200, 200, 200)
statusLabel.TextXAlignment = Enum.TextXAlignment.Right
statusLabel.Text = "-/-"
statusLabel.Parent = frame
function updateIconStatusUI()
if not statusLabel then
return
end
local n = #dIcons.entries
local idx = dIcons.index
if dLabel then
dLabel.Text = iconFsOk() and formatIconStatus() or "File system/getcustomasset not supported."
end
if n <= 0 then
statusLabel.Text = "-/-"
else
if idx < 1 or idx > n then
idx = 1
end
statusLabel.Text = tostring(idx) .. "/" .. tostring(n)
end
end
updateIconStatusUI()
local function chkFs()
if iconFsOk() then
return true
end
notify({
Title = "Delta Icon",
Description = "Custom icon manager requires file system + getcustomasset.",
Duration = 5,
})
return false
end
prevBtn.MouseButton1Click:Connect(function()
if not chkFs() then
return
end
if #dIcons.entries == 0 then
notify({ Title = "Delta Icon", Description = "No custom icons to cycle.", Duration = 4 })
return
end
cycleIcon(-1)
end)
nextBtn.MouseButton1Click:Connect(function()
if not chkFs() then
return
end
if #dIcons.entries == 0 then
notify({ Title = "Delta Icon", Description = "No custom icons to cycle.", Duration = 4 })
return
end
cycleIcon(1)
end)
delBtn.MouseButton1Click:Connect(function()
if not chkFs() then
return
end
local list = dIcons.entries
local idx = dIcons.index
if #list == 0 or idx < 1 or idx > #list then
notify({ Title = "Delta Icon", Description = "No icon selected to delete.", Duration = 4 })
return
end
local e = list[idx]
if not e or not e.file then
return
end
removeIconEntry(e)
if updateIconStatusUI then
updateIconStatusUI()
end
end)
clrBtn.MouseButton1Click:Connect(function()
if not chkFs() then
return
end
if #dIcons.entries == 0 then
notify({ Title = "Delta Icon", Description = "No custom icons to clear.", Duration = 4 })
return
end
removeAllIcons()
if updateIconStatusUI then
updateIconStatusUI()
end
notify({ Title = "Delta Icon", Description = "Cleared all custom icons.", Duration = 4 })
end)
end
local sidebarGestureEnabled = false
local sidebarGestureVisible = true
local sidebarGestureWidth = 18
local sidebarGestureHeight = 120
local sidebarGestureFrame
local sidebarDragActive = false
local sidebarDragStartX = 0
local sidebarDragStartAlpha = 0
local sidebarDragAlpha = 0
local getCurrentSectionName
local sidebarCurrentSection = nil
local autoCloseOnLoad = true
local sectionsList = { "Executor", "Home", "Scripthub", "Settings", "Console", "Music" }
local gestureWidthValue = Instance.new("NumberValue")
gestureWidthValue.Name = "GestureWidthValue"
gestureWidthValue.Value = sidebarGestureWidth
local gestureHeightValue = Instance.new("NumberValue")
gestureHeightValue.Name = "GestureHeightValue"
gestureHeightValue.Value = sidebarGestureHeight
do
local cfg = settingsConfig.GestureWidth
if type(cfg) == "table" and type(cfg.value) == "number" then
gestureWidthValue.Value = math.clamp(cfg.value, 6, 80)
end
end
do
local cfg = settingsConfig.GestureHeight
if type(cfg) == "table" and type(cfg.value) == "number" then
gestureHeightValue.Value = math.clamp(cfg.value, 60, 400)
end
end
do
local cfg = settingsConfig.SidebarGesture
if type(cfg) == "table" and cfg.enabled ~= nil then
sidebarGestureEnabled = cfg.enabled and true or false
end
end
do
local cfg = settingsConfig.SidebarGestureVisible
if type(cfg) == "table" and cfg.enabled ~= nil then
sidebarGestureVisible = cfg.enabled and true or false
end
end
do
local cfg = settingsConfig.AutoCloseOnLoad
if type(cfg) == "table" and cfg.enabled ~= nil then
autoCloseOnLoad = cfg.enabled and true or false
end
end
local gestCol = Instance.new("Color3Value")
gestCol.Name = "GestureColorValue"
gestCol.Value = Color3.fromRGB(255, 255, 255)
gestCol.Changed:Connect(function()
if sidebarGestureFrame then
sidebarGestureFrame.BackgroundColor3 = gestCol.Value
end
end)
local function closeDeltaSidebar()
if sidebar then
setSidebarPosition(sidebarClosedPos)
normalizeSidebarGeometry()
end
if mainGui then
for _, n in sectionsList do
local fr = mainGui:FindFirstChild(n)
if fr and fr:IsA("GuiObject") then
fr.Visible = false
end
end
end
setIconForcedHidden(sidebarGestureEnabled)
end
local function openDeltaFromIcon()
if not sidebar then
return
end
local curSec = getCurrentSectionName()
if curSec then
sidebarCurrentSection = curSec
end
if not sidebarCurrentSection then
sidebarCurrentSection = sectionsList[1]
end
if TS and sidebar then
local tw = __lt.cm(
"TweenService",
"Create",
sidebar,
TweenInfo.new(0.2, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
{
Position = UDim2.new(sidebarOpenPos.X.Scale, sidebarOpenPos.X.Offset, 0.5, 0),
}
)
tw:Play()
else
setSidebarPosition(sidebarOpenPos)
end
normalizeSidebarGeometry()
setIconForcedHidden(true)
if mainGui and sidebarCurrentSection then
for _, n in sectionsList do
local fr = mainGui:FindFirstChild(n)
if fr and fr:IsA("GuiObject") then
fr.Visible = n == sidebarCurrentSection
end
end
end
end
bindManagedIconToggle = function()
NAlib.disconnect("ManagedIcon_Toggle")
if not (iconBtn and iconBtn:IsA("GuiButton")) then
return
end
NAlib.connect("ManagedIcon_Toggle", MouseButtonFix(iconBtn, function()
local override = rawget(__dcm_env, "__NewDeltaUIToggle")
if type(override) == "function" then
local ok, handled = pcall(override)
if ok and handled ~= false then
return
end
end
if not sidebar then
return
end
local isOpen = math.abs(sidebar.Position.X.Scale - sidebarOpenPos.X.Scale) <= 0.001
if isOpen then
closeDeltaSidebar()
else
openDeltaFromIcon()
end
end))
end
bindManagedIconToggle()
local function saveSidebarGesture()
if not (HS and type(writefile) == "function") then
return
end
settingsConfig.SidebarGesture = { enabled = sidebarGestureEnabled }
writeJsonFile(settingsPath, settingsConfig)
end
local function saveSidebarGestureVisible()
if not (HS and type(writefile) == "function") then
return
end
settingsConfig.SidebarGestureVisible = { enabled = sidebarGestureVisible }
writeJsonFile(settingsPath, settingsConfig)
end
local function applyGestureVisual()
if sidebarGestureFrame then
sidebarGestureFrame.BackgroundTransparency = sidebarGestureVisible and 0.4 or 1
end
end
local function applyGestureSize()
if not sidebarGestureFrame then
return
end
local h = math.clamp(gestureHeightValue and gestureHeightValue.Value or sidebarGestureHeight, 60, 400)
local w = math.clamp(gestureWidthValue and gestureWidthValue.Value or sidebarGestureWidth, 6, 80)
if UIS and UIS.TouchEnabled then
w = math.floor(w * 1.6)
end
sidebarGestureFrame.Size = UDim2.new(0, w, 0, h)
end
gestureWidthValue.Changed:Connect(function()
if sidebarGestureFrame then
applyGestureSize()
end
end)
gestureHeightValue.Changed:Connect(function()
if sidebarGestureFrame then
applyGestureSize()
end
end)
local function ensureSidebarGestureFrame()
if sidebarGestureFrame or not (sidebar and mainGui) then
return
end
local f = Instance.new("Frame")
sidebarGestureFrame = f
f.Name = "SidebarGestureZone"
f.BackgroundColor3 = gestCol.Value
f.BorderSizePixel = 0
f.AnchorPoint = Vector2.new(1, 0.5)
f.Position = UDim2.new(1, 0, 0.5, 0)
f.Size = UDim2.new(0, sidebarGestureWidth, 0, sidebarGestureHeight)
f.Active = false
f.Visible = false
f.Parent = mainGui
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 6)
corner.Parent = f
applyGestureSize()
applyGestureVisual()
end
local function makeSidebarGestureToggle()
if not (settingsHolder and settingTemplate and sidebar) then
return
end
local frame = __dcm_registerCustom(settingTemplate:Clone())
frame.Parent = settingsHolder
frame.Visible = true
frame.LayoutOrder = -2
for _, d in frame:QueryDescendants("LocalScript") do
d:Destroy()
end
local tLabel = frame:FindFirstChild("Title", true)
local dLabel = frame:FindFirstChild("Desc", true)
if tLabel then
tLabel.Text = "Sidebar gesture"
end
if dLabel then
dLabel.Text = "Drag from the right edge to open/close the sidebar"
end
local btnFrame = frame:FindFirstChild("Button", true)
if not btnFrame then
return
end
local btnLabel = btnFrame:FindFirstChildWhichIsA("TextLabel")
if btnLabel then
btnLabel.Text = "Toggle"
end
local clickable = btnFrame:FindFirstChildWhichIsA("GuiButton") or btnFrame
local function setVisual()
btnFrame.BackgroundColor3 = sidebarGestureEnabled and Color3.fromRGB(79, 164, 242)
or Color3.fromRGB(30, 30, 30)
end
setVisual()
local function toggleClick()
sidebarGestureEnabled = not sidebarGestureEnabled
setVisual()
saveSidebarGesture()
setIconForcedHidden(sidebarGestureEnabled)
task.defer(function()
if applySidebarGestureState then
applySidebarGestureState()
end
end)
end
if clickable:IsA("GuiButton") then
clickable.MouseButton1Click:Connect(toggleClick)
else
clickable.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
toggleClick()
end
end)
end
end
local function makeSidebarGestureBarVisibilityToggle()
if not (settingsHolder and settingTemplate) then
return
end
local frame = __dcm_registerCustom(settingTemplate:Clone())
frame.Parent = settingsHolder
frame.Visible = true
frame.LayoutOrder = -2
for _, d in frame:QueryDescendants("LocalScript") do
d:Destroy()
end
local tLabel = frame:FindFirstChild("Title", true)
local dLabel = frame:FindFirstChild("Desc", true)
if tLabel then
tLabel.Text = "Gesture bar visible"
end
if dLabel then
dLabel.Text = "Hide the sidebar gesture bar but keep it usable"
end
local btnFrame = frame:FindFirstChild("Button", true)
if not btnFrame then
return
end
local btnLabel = btnFrame:FindFirstChildWhichIsA("TextLabel")
if btnLabel then
btnLabel.Text = "Toggle"
end
local clickable = btnFrame:FindFirstChildWhichIsA("GuiButton") or btnFrame
local function setVisual()
btnFrame.BackgroundColor3 = sidebarGestureVisible and Color3.fromRGB(79, 164, 242)
or Color3.fromRGB(30, 30, 30)
end
setVisual()
applyGestureVisual()
local function toggleClick()
sidebarGestureVisible = not sidebarGestureVisible
setVisual()
applyGestureVisual()
saveSidebarGestureVisible()
end
if clickable:IsA("GuiButton") then
clickable.MouseButton1Click:Connect(toggleClick)
else
clickable.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
toggleClick()
end
end)
end
end
local function makeAutoCloseToggle()
if not (settingsHolder and settingTemplate and sidebar) then
return
end
local key = "AutoCloseOnLoad"
local frame = __dcm_registerCustom(settingTemplate:Clone())
frame.Parent = settingsHolder
frame.Visible = true
frame.LayoutOrder = -2
for _, d in frame:QueryDescendants("LocalScript") do
d:Destroy()
end
local tLabel = frame:FindFirstChild("Title", true)
local dLabel = frame:FindFirstChild("Desc", true)
if tLabel then
tLabel.Text = "Auto-close on load"
end
if dLabel then
dLabel.Text = "Close the Delta sidebar right after it loads"
end
local btnFrame = frame:FindFirstChild("Button", true)
if not btnFrame then
return
end
local btnLabel = btnFrame:FindFirstChildWhichIsA("TextLabel")
if btnLabel then
btnLabel.Text = "Toggle"
end
local clickable = btnFrame:FindFirstChildWhichIsA("GuiButton") or btnFrame
local function saveState()
if not (HS and type(writefile) == "function") then
return
end
settingsConfig[key] = { enabled = autoCloseOnLoad }
writeJsonFile(settingsPath, settingsConfig)
end
local function setVisual()
btnFrame.BackgroundColor3 = autoCloseOnLoad and Color3.fromRGB(79, 164, 242) or Color3.fromRGB(30, 30, 30)
end
setVisual()
local function toggleClick()
autoCloseOnLoad = not autoCloseOnLoad
setVisual()
saveState()
end
if clickable:IsA("GuiButton") then
clickable.MouseButton1Click:Connect(toggleClick)
else
clickable.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
toggleClick()
end
end)
end
end
function getCurrentSectionName()
if not mainGui then
return nil
end
local cur
for _, name in sectionsList do
local fr = mainGui:FindFirstChild(name)
if fr and fr:IsA("GuiObject") and fr.Visible then
cur = name
end
end
return cur
end
do
local iconApi = rawget(__dcm_env, "DeltaIcon")
if type(iconApi) == "table" then
iconApi.getCurrentSectionName = getCurrentSectionName
iconApi.setForcedHidden = setIconForcedHidden
iconApi.openClassic = openDeltaFromIcon
iconApi.closeClassic = closeDeltaSidebar
iconApi.setCurrentSection = function(name)
if table.find(sectionsList, name) then
sidebarCurrentSection = name
end
end
end
end
local function bindSidebarSectionMemory()
NAlib.disconnect("SidebarSectionMemory")
if not mainGui then
return
end
local current = getCurrentSectionName()
if current then
sidebarCurrentSection = current
end
for _, name in sectionsList do
local fr = mainGui:FindFirstChild(name)
if fr and fr:IsA("GuiObject") then
NAlib.connect(
"SidebarSectionMemory",
fr:GetPropertyChangedSignal("Visible"):Connect(function()
if fr.Visible then
sidebarCurrentSection = name
end
end)
)
end
end
end
bindSidebarSectionMemory()
function applySidebarGestureState()
if not sidebar then
sidebarGestureEnabled = false
saveSidebarGesture()
return
end
ensureSidebarGestureFrame()
if not sidebarGestureFrame then
sidebarGestureEnabled = false
saveSidebarGesture()
return
end
if toggleUIBtn and toggleUIBtn:IsA("ImageButton") then
pcall(function()
toggleUIBtn.Visible = not sidebarGestureEnabled
end)
end
NAlib.disconnect("SidebarGesture")
sidebarGestureFrame.Active = false
sidebarGestureFrame.Visible = false
if not sidebarGestureEnabled then
setIconForcedHidden(false)
saveSidebarGesture()
return
end
setIconForcedHidden(true)
sidebarGestureFrame.Active = true
sidebarGestureFrame.Visible = true
applyGestureVisual()
applyGestureSize()
local id = "SidebarGesture"
local function recalcGesturePosition()
if not (mainGui and sidebar and sidebarGestureFrame) then
return
end
local sgSize = mainGui.AbsoluteSize
if sgSize.X <= 0 or sgSize.Y <= 0 then
return
end
local sbPos = sidebar.AbsolutePosition
local sbSize = sidebar.AbsoluteSize
local px = sbPos.X - 8
sidebarGestureFrame.Position = UDim2.new(px / sgSize.X, 0, 0.5, 0)
end
local function getSidebarAlpha()
if not sidebar then
return 0
end
local sx = sidebar.Position.X.Scale
local denom = sidebarClosedPos.X.Scale - sidebarOpenPos.X.Scale
if denom == 0 then
return 0
end
return math.clamp((sidebarClosedPos.X.Scale - sx) / denom, 0, 1)
end
recalcGesturePosition()
NAlib.connect(id, (sidebar:GetPropertyChangedSignal("Position")):Connect(recalcGesturePosition))
if sidebar.GetPropertyChangedSignal then
NAlib.connect(id, (sidebar:GetPropertyChangedSignal("Size")):Connect(recalcGesturePosition))
end
if mainGui and mainGui.GetPropertyChangedSignal then
NAlib.connect(id, (mainGui:GetPropertyChangedSignal("AbsoluteSize")):Connect(recalcGesturePosition))
end
local function updateSidebarFromInput(input)
if not sidebar or not mainGui then
return
end
local dx = input.Position.X - sidebarDragStartX
local guiSize = mainGui.AbsoluteSize
local dist = guiSize.X * math.abs(sidebarClosedPos.X.Scale - sidebarOpenPos.X.Scale)
if dist <= 0 then
dist = 100
end
local alpha = math.clamp(sidebarDragStartAlpha - dx / dist, 0, 1)
sidebarDragAlpha = alpha
setSidebarPosition(
UDim2.new(
sidebarClosedPos.X.Scale + (sidebarOpenPos.X.Scale - sidebarClosedPos.X.Scale) * alpha,
0,
0.5,
0
)
)
end
NAlib.connect(
id,
sidebarGestureFrame.InputBegan:Connect(function(input)
if not sidebarGestureEnabled then
return
end
if
input.UserInputType ~= Enum.UserInputType.MouseButton1
and input.UserInputType ~= Enum.UserInputType.Touch
then
return
end
sidebarDragAlpha = getSidebarAlpha()
sidebarDragStartAlpha = sidebarDragAlpha
sidebarDragStartX = input.Position.X
sidebarDragActive = true
end)
)
NAlib.connect(
id,
UIS.InputChanged:Connect(function(input)
if not sidebarDragActive or not sidebarGestureEnabled then
return
end
if
input.UserInputType == Enum.UserInputType.MouseMovement
or input.UserInputType == Enum.UserInputType.Touch
then
updateSidebarFromInput(input)
end
end)
)
NAlib.connect(
id,
UIS.InputEnded:Connect(function(input)
if not sidebarDragActive or not sidebarGestureEnabled then
return
end
if
input.UserInputType ~= Enum.UserInputType.MouseButton1
and input.UserInputType ~= Enum.UserInputType.Touch
then
return
end
sidebarDragActive = false
local curSec = getCurrentSectionName()
if curSec then
sidebarCurrentSection = curSec
end
local targetPos = sidebarDragAlpha > 0.5 and sidebarOpenPos or sidebarClosedPos
if TS and sidebar then
local tw = __lt.cm(
"TweenService",
"Create",
sidebar,
TweenInfo.new(0.2, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
{
Position = UDim2.new(targetPos.X.Scale, targetPos.X.Offset, 0.5, 0),
}
)
tw:Play()
elseif sidebar then
setSidebarPosition(targetPos)
end
if targetPos == sidebarOpenPos then
if not sidebarCurrentSection then
sidebarCurrentSection = getCurrentSectionName()
end
setIconForcedHidden(true)
if mainGui and sidebarCurrentSection then
for _, n in sectionsList do
local fr = mainGui:FindFirstChild(n)
if fr and fr:IsA("GuiObject") then
fr.Visible = n == sidebarCurrentSection
end
end
end
else
if mainGui then
if curSec then
sidebarCurrentSection = curSec
end
for _, n in sectionsList do
local fr = mainGui:FindFirstChild(n)
if fr and fr:IsA("GuiObject") then
fr.Visible = false
end
end
end
setIconForcedHidden(sidebarGestureEnabled)
end
end)
)
saveSidebarGesture()
end
if toggleUIBtn and toggleUIBtn:IsA("GuiButton") then
NAlib.disconnect("ManagedToggleUI_ForcedHidden")
NAlib.connect(
"ManagedToggleUI_ForcedHidden",
toggleUIBtn.MouseButton1Click:Connect(function()
setIconForcedHidden(sidebarGestureEnabled)
end)
)
end
if activeColorValue then
makeColorSlider("ActiveColor", "Active Color", "Sidebar active button color", activeColorValue)
end
if inactiveColorValue then
makeColorSlider("InactiveColor", "Inactive Color", "Sidebar inactive button color", inactiveColorValue)
end
if iconColorValue then
makeColorSlider("IconColor", "Icon Color", "Custom color for the Delta icon", iconColorValue)
end
if uiScaleState.value then
makeSizeSlider(
"InterfaceScale",
"Interface size",
"Adjust Delta's interface size",
uiScaleState.value,
0.5,
1.65,
{
apply = applyInterfaceScale,
applyOnRelease = true,
}
)
end
if iconSizeValue then
makeSizeSlider("IconSize", "Icon Size", "Scale the Delta icon size", iconSizeValue, 0.5, 5)
end
makeEnumDropdown(
"IconShape",
"Icon Shape",
"Choose the shape of the Delta icon",
{ "Squircle", "Rounded", "Square", "Circle" },
function()
return iconShapeName
end,
function(name)
iconShapeName = name
applyIconShapeChoice()
end,
{ persist = true }
)
if iconRgbSpeedValue then
makeSizeSlider("IconRgbSpeed", "RGB Speed", "Speed of the RGB icon effect", iconRgbSpeedValue, 0.05, 2)
end
do
local lighting = game:GetService("Lighting")
local techItems = Enum.Technology:GetEnumItems()
makeEnumDropdown(
"LightingTechnology",
"Lighting Technology",
"Set Lighting.Technology from Delta settings",
techItems,
function()
return lighting and lighting.Technology and lighting.Technology.Name
or techItems[1] and techItems[1].Name
end,
function(name)
local enumItem = Enum.Technology[name]
if lighting and enumItem then
pcall(function()
lighting.Technology = enumItem
end)
end
end,
{ persist = false }
)
end
do
local selectedCameraType
local camItems = Enum.CameraType:GetEnumItems()
local function applyCameraType(name)
local enumItem = Enum.CameraType[name]
if not enumItem then
return
end
selectedCameraType = name
local cam = workspace.CurrentCamera
if cam then
pcall(function()
cam.CameraType = enumItem
end)
end
end
makeEnumDropdown(
"CameraType",
"Camera Type",
"Set CurrentCamera.CameraType from Delta settings",
camItems,
function()
local cam = workspace.CurrentCamera
return cam and cam.CameraType and cam.CameraType.Name or camItems[1] and camItems[1].Name
end,
applyCameraType,
{ persist = false }
)
NAlib.disconnect("CameraType_Reapply")
NAlib.connect(
"CameraType_Reapply",
workspace:GetPropertyChangedSignal("CurrentCamera"):Connect(function()
task.defer(function()
if selectedCameraType then
applyCameraType(selectedCameraType)
end
end)
end)
)
end
do
local soundService = game:GetService("SoundService")
local reverbItems = Enum.ReverbType:GetEnumItems()
makeEnumDropdown(
"SoundReverb",
"Sound Reverb",
"Set SoundService.AmbientReverb from Delta settings",
reverbItems,
function()
return soundService and soundService.AmbientReverb and soundService.AmbientReverb.Name
or reverbItems[1] and reverbItems[1].Name
end,
function(name)
local enumItem = Enum.ReverbType[name]
if soundService and enumItem then
pcall(function()
soundService.AmbientReverb = enumItem
end)
end
end,
{ persist = false }
)
end
if type(setfpscap) == "function" then
local fpsCapValue = Instance.new("NumberValue")
fpsCapValue.Name = "FpsCapValue"
local fpsSaved = settingsConfig.FpsCap
local fpsHasSaved = type(fpsSaved) == "table" and type(fpsSaved.value) == "number"
fpsCapValue.Value = fpsHasSaved and math.clamp(math.floor(fpsSaved.value + 0.5), 30, 999) or 60
local fpsCapTarget = fpsCapValue.Value
local function applyFpsCap(v)
local n = math.clamp(math.floor((tonumber(v) or 60) + 0.5), 30, 999)
if fpsCapValue.Value ~= n then
fpsCapValue.Value = n
end
fpsCapTarget = n
pcall(setfpscap, n)
end
NAlib.disconnect("FpsCap_Enforce")
local function reapplyFpsCap()
if fpsCapTarget then
pcall(setfpscap, fpsCapTarget)
end
end
if UIS and UIS.WindowFocused then
NAlib.connect("FpsCap_Reapply", UIS.WindowFocused:Connect(reapplyFpsCap))
end
makeSizeSlider("FpsCap", "FPS cap", "set your FPS cap to anything you like", fpsCapValue, 1, 999, {
integer = true,
apply = applyFpsCap,
})
if fpsHasSaved then
task.defer(function()
applyFpsCap(fpsCapValue.Value)
end)
end
end
if sidebarGrad1 and sidebarGrad2 and sidebarGradient then
makeColorSlider("SidebarGradient1", "Sidebar Gradient 1", "First sidebar gradient color", sidebarGrad1)
makeColorSlider("SidebarGradient2", "Sidebar Gradient 2", "Second sidebar gradient color", sidebarGrad2)
local function updateSidebarGradient()
sidebarGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, sidebarGrad1.Value),
ColorSequenceKeypoint.new(1, sidebarGrad2.Value),
})
end
updateSidebarGradient();
(sidebarGrad1:GetPropertyChangedSignal("Value")):Connect(updateSidebarGradient);
(sidebarGrad2:GetPropertyChangedSignal("Value")):Connect(updateSidebarGradient)
end
makeIconVisibilityToggle()
makeIconPositionSaveToggle()
makeIconStrokeToggle()
makeIconRgbToggle()
makeTabNotifToggle()
makeIconEnableToggle()
makeIconInputRow()
makeIconManagerRow()
makeColorSlider("GestureColor", "Gesture Color", "Color of the sidebar gesture bar", gestCol)
makeSidebarGestureToggle()
makeSidebarGestureBarVisibilityToggle()
if gestureWidthValue then
makeSizeSlider("GestureWidth", "Gesture width", "Width of the sidebar gesture area", gestureWidthValue, 6, 80)
end
if gestureHeightValue then
makeSizeSlider(
"GestureHeight",
"Gesture height",
"Height of the sidebar gesture area",
gestureHeightValue,
60,
400
)
end
makeAutoCloseToggle()
makeDestroyUIButton()
task.defer(function()
task.wait()
pcall(function()
capUi()
apRad()
apPan()
apStk()
fxSync()
end)
end)
applySidebarGestureState()
if autoCloseOnLoad and sidebar then
task.defer(function()
task.wait(1.5)
closeDeltaSidebar()
end)
end
local sidemenu = execFrame:FindFirstChild("Sidemenu", true)
if sidemenu then
local oldCard = sidemenu:FindFirstChild("Script", true)
if oldCard and oldCard:IsA("ImageLabel") then
local parent = oldCard.Parent
local newCard = oldCard:Clone()
__dcm_setTracked(oldCard, "Parent", nil)
newCard.Name = "LT_FeaturedScriptCard"
newCard.Parent = parent
local labs = {}
for _, d in newCard:QueryDescendants("TextLabel") do
table.insert(labs, d)
end
if #labs >= 3 then
table.sort(labs, function(a, b)
return a.AbsolutePosition.Y < b.AbsolutePosition.Y
end)
local bigHeader = labs[1]
local subTitle = labs[2]
local desc = labs[3]
if bigHeader then
bigHeader.Text = "Featured"
end
if subTitle then
subTitle.Text = "Nameless Admin"
end
if desc then
desc.Text =
"continuation of Nameless Admin with advanced features, fixed commands and lots of customization."
end
end
local clickable = nil
for _, d in newCard:QueryDescendants("Instance") do
if d:IsA("LocalScript") then
d:Destroy()
elseif d:IsA("TextButton") then
clickable = d
end
end
if not clickable then
clickable = newCard:FindFirstChildWhichIsA("GuiButton")
or newCard:FindFirstChildWhichIsA("GuiButton", true)
or newCard
end
local function runNA()
fixNet(mainGui)
local ok, er = runUrl(
"https://gitlab.com/ltseverydayyou/Nameless-Admin/-/raw/main/Source.lua",
"@NamelessAdminSource.lua"
)
if not ok then
toast("ScriptHub", tostring(er))
end
end
if clickable:IsA("GuiButton") then
clickable.MouseButton1Click:Connect(runNA)
else
clickable.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
runNA()
end
end)
end
end
end
local pingLabel
do
local nFrame = sidemenu and sidemenu:FindFirstChild("Network", true)
if nFrame then
local overlayNet = nFrame:FindFirstChild("Overlay", true)
local holderNet = overlayNet and overlayNet:FindFirstChild("Holder", true)
local infoNet = holderNet and holderNet:FindFirstChild("Information", true)
pingLabel = infoNet and infoNet:FindFirstChild("Ping")
end
end
if pingLabel and Stats and RS then
local net = Stats.Network
local item = net and net.ServerStatsItem and net.ServerStatsItem["Data Ping"]
if item then
pingLabel.RichText = true
local pingId = "DeltaCustom_Ping"
NAlib.disconnect(pingId)
local function updatePing()
local v = 0
pcall(function()
if item.GetValue then
v = item:GetValue()
elseif item.Value ~= nil then
v = item.Value
end
end)
pingLabel.Text = string.format('%d MS Ping', math.floor(tonumber(v) or 0))
end
updatePing()
local pingAccum = 0
NAlib.connect(
pingId,
RS.Heartbeat:Connect(function(dt)
pingAccum += dt
if pingAccum < 0.5 then
return
end
pingAccum = 0
updatePing()
end)
)
end
end
local tabs = overlay:FindFirstChild("Tabs", true)
local codeSf = overlay:FindFirstChild("Code", true)
if not tabs then
notify({ Title = "Delta Customization", Description = "Tabs frame not found.", Duration = 4 })
return
end
if not codeSf then
notify({ Title = "Delta Customization", Description = "Code frame not found.", Duration = 4 })
return
end
local hasFS = type(isfolder) == "function"
and type(makefolder) == "function"
and type(isfile) == "function"
and type(writefile) == "function"
and type(readfile) == "function"
and type(listfiles) == "function"
if not hasFS then
notify({
Title = "Delta Customization",
Description = "Your executor does not support saving tabs.",
Duration = 5,
})
return
end
local rootDir = "DeltaCustom"
local tabsDir = rootDir .. "/DeltaTabs"
if not isfolder(rootDir) then
pcall(makefolder, rootDir)
end
if not isfolder(tabsDir) then
pcall(makefolder, tabsDir)
end
local function parseIndex(nm)
return tonumber(nm:match("^script(%d+)%.lua$"))
end
local function isScriptName(nm)
return parseIndex(nm) ~= nil
end
local function getCodeBoxes()
local t = {}
for _, c in codeSf:QueryDescendants("TextBox") do
if isScriptName(c.Name) then table.insert(t, c)
end
end
table.sort(t, function(a, b)
return (parseIndex(a.Name) or 0) < (parseIndex(b.Name) or 0)
end)
return t
end
local function getSavedNames()
local list = {}
for _, p in listfiles(tabsDir) do
local nm = p:match("([^/\\]+)$")
if nm and isScriptName(nm) then
table.insert(list, nm)
end
end
table.sort(list, function(a, b)
return (parseIndex(a) or 0) < (parseIndex(b) or 0)
end)
return list
end
local saved = getSavedNames()
local boxes = getCodeBoxes()
if tabNotifEnabled then
if #saved > 0 then
local desc
if #saved > #boxes then
desc = "Saved tabs: "
.. tostring(#saved)
.. "\nCreate your tabs in Delta and the saved code will load automatically."
else
desc = "Saved tabs: "
.. tostring(#saved)
.. "\nYour saved code will load into matching tabs automatically."
end
notify({ Title = "Delta Customization", Description = desc, Duration = 8 })
else
notify({
Title = "Delta Customization",
Description = "No saved tabs yet. Anything you type will be saved automatically.",
Duration = 6,
})
end
end
local hooked = {}
local function hookBox(box)
if not box or hooked[box] then
return
end
hooked[box] = true
local ready = false
local function setupForName(nm)
if ready then
return
end
if not isScriptName(nm) then
return
end
ready = true
local path = tabsDir .. "/" .. nm
if isfile(path) then
local ok, data = pcall(readfile, path)
if ok and type(data) == "string" then
box.Text = data
end
else
pcall(writefile, path, box.Text or "")
end
local last = 0
(box:GetPropertyChangedSignal("Text")):Connect(function()
last = tick()
local id = last
task.delay(0.4, function()
if id ~= last then
return
end
local txt = box.Text
pcall(writefile, path, txt)
end)
end)
end
setupForName(box.Name);
(box:GetPropertyChangedSignal("Name")):Connect(function()
setupForName(box.Name)
end)
end
for _, b in boxes do
hookBox(b)
end
codeSf.DescendantAdded:Connect(function(obj)
if obj:IsA("TextBox") then
task.wait(0.05)
hookBox(obj)
end
end)
codeSf.DescendantRemoving:Connect(function(obj)
if not (obj:IsA("TextBox") and isScriptName(obj.Name) and type(delfile) == "function") then
return
end
local txt = ""
pcall(function()
txt = obj.Text
end)
if type(txt) ~= "string" or txt:match("^%s*$") then
local path = tabsDir .. "/" .. obj.Name
if isfile(path) then
pcall(delfile, path)
end
end
end)
end)
__lt.deltaPatchState = __lt.deltaPatchState or {}
__lt.deltaPatchState.visualEnv = __dcm_env
if type(__lt.deltaPatchState.visualEnv) == "table" and not __lt.deltaPatchState.visualEnv.__DeltaVisualPatchLoaded then
__lt.deltaPatchState.visualEnv.__DeltaVisualPatchLoaded = true
task.defer(function()
if (identifyexecutor and identifyexecutor() or ""):lower() ~= "delta" then
return
end
local function S(n)
local ok, s = pcall(function()
return __lt.cs(n, cloneref and cloneref or function(v)
return v
end)
end)
if ok then
return s
end
end
local HS = S("HttpService")
local TS = S("TweenService")
local CG = S("CoreGui")
local root = gethui and gethui() or CG
local function isGib(n)
if typeof(n) ~= "string" or n == "" then
return false
end
return not n:match("^[%w _%-]+$")
end
local function getMain()
for _, g in root:GetChildren() do
if g:IsA("ScreenGui") and isGib(g.Name) then
if
g:FindFirstChild("Executor", true)
and g:FindFirstChild("Scripthub", true)
and g:FindFirstChild("Sidebar", true)
then
return g
end
end
end
end
local mainGui = getMain()
if not mainGui then
return
end
do
local vp = workspace.CurrentCamera and workspace.CurrentCamera.ViewportSize or mainGui.AbsoluteSize
if UIS and UIS.TouchEnabled and (vp.X <= 1100 or vp.Y <= 820) then
local darkOverlay = mainGui:FindFirstChild("DarkOverlay")
if darkOverlay then
pcall(function()
darkOverlay.Visible = false
darkOverlay.Active = false
end)
end
return
end
end
local sectionsList = { "Executor", "Home", "Scripthub", "Settings", "Console", "Music" }
local settingsPath = "DeltaCustom/Settings.json"
local settingsConfig = {}
if HS and type(isfile) == "function" and type(readfile) == "function" and isfile(settingsPath) then
local ok, data = pcall(readfile, settingsPath)
if ok and data then
local ok2, dec = pcall(function()
return __lt.cm("HttpService", "JSONDecode", data)
end)
if ok2 and type(dec) == "table" then
settingsConfig = dec
end
end
end
local function saveCfg(k, t)
if not (HS and type(writefile) == "function") then
return
end
settingsConfig[k] = t
writeJsonFile(settingsPath, settingsConfig)
end
local darkOverlay = mainGui:FindFirstChild("DarkOverlay")
NAlib.disconnect("DarkOverlay_Hide")
local dimFr = darkOverlay
if not dimFr then
dimFr = Instance.new("Frame")
dimFr.Name = "DarkOverlay"
dimFr.BackgroundColor3 = Color3.new(0, 0, 0)
dimFr.BorderSizePixel = 0
dimFr.Position = UDim2.fromScale(0, 0)
dimFr.Size = UDim2.fromScale(1, 1)
dimFr.ZIndex = 1
dimFr.Visible = false
dimFr.Active = false
dimFr.Parent = mainGui
end
pcall(function()
dimFr.BackgroundColor3 = Color3.new(0, 0, 0)
dimFr.BorderSizePixel = 0
dimFr.Position = UDim2.fromScale(0, 0)
dimFr.Size = UDim2.fromScale(1, 1)
dimFr.ZIndex = 1
dimFr.Active = false
end)
local base = { cor = {}, pan = {}, str = {}, got = false }
local okNm = {
Sidebar = true,
Overlay = true,
Popup = true,
Searchbar = true,
Script = true,
Network = true,
Information = true,
RobloxConsole = true,
RConsole = true,
Source = true,
Title = true,
Executor = true,
Console = true,
Home = true,
Scripthub = true,
Settings = true,
Dropdown = true,
SettingDropdown = true,
SettingTextbox = true,
SettingSwitch = true,
SettingSwitchOn = true,
Button = true,
InputText = true,
LT_ScriptHub = true,
LT_Music = true,
Top = true,
Bottom = true,
List = true,
Card = true,
Card1 = true,
}
local skip = {
Knob = true,
Hue = true,
Sat = true,
Val = true,
Fill = true,
DarkOverlay = true,
SidebarGestureZone = true,
}
local function capUi()
if not mainGui then
return
end
for _, o in mainGui:QueryDescendants("Instance") do
if o:IsA("UICorner") then
local p = o.Parent
if p and p:IsA("GuiObject") and not skip[p.Name] then
local s = p.AbsoluteSize
if okNm[p.Name] or (s.X >= 44 and s.Y >= 18) then
if base.cor[o] == nil then
base.cor[o] = o.CornerRadius
end
end
end
elseif o:IsA("UIStroke") then
if base.str[o] == nil then
base.str[o] = o.Thickness
end
elseif
o:IsA("Frame")
or o:IsA("ImageLabel")
or o:IsA("TextBox")
or o:IsA("TextButton")
or o:IsA("ImageButton")
or o:IsA("ScrollingFrame")
then
if not skip[o.Name] then
local s = o.AbsoluteSize
if okNm[o.Name] or s.X >= 120 or s.Y >= 28 then
local pr = (o:IsA("ImageLabel") or o:IsA("ImageButton")) and "ImageTransparency"
or "BackgroundTransparency"
if base.pan[o] == nil then
base.pan[o] = { pr, o[pr] }
end
end
end
end
end
base.got = true
end
local radVal = Instance.new("NumberValue")
radVal.Value = type(settingsConfig.UiRound) == "table" and math.clamp(settingsConfig.UiRound.value or 0, 0, 18)
or 0
local panVal = Instance.new("NumberValue")
panVal.Value = type(settingsConfig.UiAlpha) == "table"
and math.clamp(settingsConfig.UiAlpha.value or 0, 0, 0.35)
or 0
local stkVal = Instance.new("NumberValue")
stkVal.Value = type(settingsConfig.UiStroke) == "table"
and math.clamp(settingsConfig.UiStroke.value or 1, 0, 2.5)
or 1
local dimVal = Instance.new("NumberValue")
dimVal.Value = type(settingsConfig.UiDim) == "table" and math.clamp(settingsConfig.UiDim.value or 0.28, 0, 0.65)
or 0.28
local dimDesiredVisible = false
local dimDesiredTransparency = 1
local dimGuardBusy = false
local function applyDimState(force)
if dimGuardBusy then
return
end
dimGuardBusy = true
pcall(function()
if force or dimFr.Visible ~= dimDesiredVisible then
dimFr.Visible = dimDesiredVisible
end
if force or math.abs(dimFr.BackgroundTransparency - dimDesiredTransparency) > 0.001 then
dimFr.BackgroundTransparency = dimDesiredTransparency
end
dimFr.Active = false
if force or dimFr.BackgroundColor3 ~= Color3.new(0, 0, 0) then
dimFr.BackgroundColor3 = Color3.new(0, 0, 0)
end
end)
dimGuardBusy = false
end
local function syncDimLoop()
NAlib.disconnect("DeltaCustom_DimGuard")
NAlib.connect(
"DeltaCustom_DimGuard",
dimFr:GetPropertyChangedSignal("Visible"):Connect(function()
if not dimGuardBusy and dimFr.Visible ~= dimDesiredVisible then
task.defer(applyDimState, false)
end
end)
)
NAlib.connect(
"DeltaCustom_DimGuard",
dimFr:GetPropertyChangedSignal("BackgroundTransparency"):Connect(function()
if
not dimGuardBusy
and math.abs(dimFr.BackgroundTransparency - dimDesiredTransparency) > 0.001
then
task.defer(applyDimState, false)
end
end)
)
end
local function apRad()
capUi()
local v = math.floor(math.clamp(radVal.Value, 0, 18) + 0.5)
for o, b in base.cor do
if o and o.Parent then
pcall(function()
o.CornerRadius = UDim.new(b.Scale, math.max(b.Offset, v))
end)
end
end
end
local function apPan()
capUi()
local a = math.clamp(panVal.Value, 0, 0.35)
for o, b in base.pan do
if o and o.Parent then
pcall(function()
o[b[1]] = math.clamp(b[2] + a, 0, 1)
end)
end
end
end
local function apStk()
capUi()
local m = math.clamp(stkVal.Value, 0, 2.5)
for o, b in base.str do
if o and o.Parent then
pcall(function()
o.Thickness = b * m
end)
end
end
end
local function uiOpen()
for _, n in sectionsList do
local fr = mainGui:FindFirstChild(n)
if fr and fr:IsA("GuiObject") and fr.Visible then
return true
end
end
return false
end
local function fxSync()
local on = uiOpen()
dimDesiredVisible = on and dimVal.Value > 0.01
dimDesiredTransparency = 1 - math.clamp(dimVal.Value, 0, 0.85)
applyDimState(true)
syncDimLoop()
end
capUi()
apRad()
apPan()
apStk()
fxSync()
radVal.Changed:Connect(function()
apRad()
saveCfg("UiRound", { value = math.clamp(radVal.Value, 0, 18) })
end)
panVal.Changed:Connect(function()
apPan()
saveCfg("UiAlpha", { value = math.clamp(panVal.Value, 0, 0.35) })
end)
stkVal.Changed:Connect(function()
apStk()
saveCfg("UiStroke", { value = math.clamp(stkVal.Value, 0, 2.5) })
end)
dimVal.Changed:Connect(function()
fxSync()
saveCfg("UiDim", { value = math.clamp(dimVal.Value, 0, 0.65) })
end)
for _, n in sectionsList do
local fr = mainGui:FindFirstChild(n)
if fr and fr.GetPropertyChangedSignal then
fr:GetPropertyChangedSignal("Visible"):Connect(function()
task.defer(fxSync)
end)
end
end
local settings = mainGui:FindFirstChild("Settings", true)
local holder = settings and settings:FindFirstChild("Holder")
local template
if holder then
for _, c in holder:GetChildren() do
if c:IsA("Frame") and c.Name == "Button" then
template = c
break
end
end
end
if holder and template then
local function mkDock(fr)
local d = Instance.new("Frame")
d.Name = "Dock"
d.BackgroundTransparency = 1
d.AnchorPoint = Vector2.new(1, 0.5)
d.Position = UDim2.new(1, -14, 0.5, 0)
d.Size = UDim2.new(0, 320, 0, 18)
d.Parent = fr
local l = Instance.new("UIListLayout")
l.FillDirection = Enum.FillDirection.Horizontal
l.HorizontalAlignment = Enum.HorizontalAlignment.Right
l.VerticalAlignment = Enum.VerticalAlignment.Center
l.Padding = UDim.new(0, 8)
l.Parent = d
return d
end
local function mkBox(par)
local b = Instance.new("TextBox")
b.Name = "ValueBox"
b.Size = UDim2.new(0, 70, 0, 18)
b.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
b.BorderSizePixel = 0
b.ClearTextOnFocus = false
b.TextXAlignment = Enum.TextXAlignment.Center
b.Font = Enum.Font.Gotham
b.TextSize = 12
b.TextColor3 = Color3.new(1, 1, 1)
b.Parent = par
return b
end
local function mkSl(par, w)
local s = Instance.new("Frame")
s.Name = "Slider"
s.BackgroundTransparency = 1
s.Size = UDim2.new(0, w or 150, 0, 18)
s.Parent = par
local bar = Instance.new("Frame")
bar.Name = "Bar"
bar.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
bar.BorderSizePixel = 0
bar.AnchorPoint = Vector2.new(0.5, 0.5)
bar.Position = UDim2.new(0.5, 0, 0.5, 0)
bar.Size = UDim2.new(1, 0, 0, 6)
bar.Parent = s
local bc = Instance.new("UICorner")
bc.CornerRadius = UDim.new(0, 3)
bc.Parent = bar
local fill = Instance.new("Frame")
fill.Name = "Fill"
fill.BorderSizePixel = 0
fill.AnchorPoint = Vector2.new(0, 0.5)
fill.Position = UDim2.new(0, 0, 0.5, 0)
fill.Size = UDim2.new(0, 0, 1, 0)
fill.Parent = bar
local fc = Instance.new("UICorner")
fc.CornerRadius = UDim.new(0, 3)
fc.Parent = fill
local kb = Instance.new("Frame")
kb.Name = "Knob"
kb.Size = UDim2.new(0, 12, 0, 12)
kb.AnchorPoint = Vector2.new(0.5, 0.5)
kb.BackgroundColor3 = Color3.new(1, 1, 1)
kb.BorderSizePixel = 0
kb.Parent = bar
local kc = Instance.new("UICorner")
kc.CornerRadius = UDim.new(1, 0)
kc.Parent = kb
return s, bar, fill, kb
end
local function makeSizeSlider(id, titleText, descText, numValue, minV, maxV)
local fr = __dcm_registerCustom(template:Clone())
fr.Parent = holder
fr.Visible = true
fr.LayoutOrder = -2
local tl = fr:FindFirstChild("Title", true)
local dl = fr:FindFirstChild("Desc", true)
if tl then
tl.Text = titleText
end
if dl then
dl.Text = descText
end
local ob = fr:FindFirstChild("Button", true)
if ob then
ob:Destroy()
end
local dock = mkDock(fr)
local vb = mkBox(dock)
local sl, bar, fill, kb = mkSl(dock, 150)
local function setVis(v)
v = math.clamp(v, minV, maxV)
local a = (v - minV) / (maxV - minV)
fill.Size = UDim2.new(a, 0, 1, 0)
kb.Position = UDim2.new(a, 0, 0.5, 0)
vb.Text = string.format("%.2f", v)
end
local function apply(v)
v = math.clamp(v, minV, maxV)
numValue.Value = v
setVis(v)
saveCfg(id, { value = v })
end
setVis(numValue.Value)
local drag = false
local function fromIn(input)
local rel = 0
pcall(function()
rel = (input.Position.X - bar.AbsolutePosition.X) / bar.AbsoluteSize.X
end)
rel = math.clamp(rel, 0, 1)
apply(minV + (maxV - minV) * rel)
end
bar.InputBegan:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
drag = true
fromIn(input)
end
end)
local ui = S("UserInputService")
if ui then
ui.InputChanged:Connect(function(input)
if
drag
and (
input.UserInputType == Enum.UserInputType.MouseMovement
or input.UserInputType == Enum.UserInputType.Touch
)
then
fromIn(input)
end
end)
ui.InputEnded:Connect(function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
drag = false
end
end)
end
vb.FocusLost:Connect(function()
local v = tonumber(vb.Text or "")
if v then
apply(v)
else
setVis(numValue.Value)
end
end)
local function updDock()
local w = math.clamp(math.floor(fr.AbsoluteSize.X * 0.46), 240, 380)
dock.Size = UDim2.new(0, w, 0, 18)
local sw = math.clamp(w - 78, 140, 280)
sl.Size = UDim2.new(0, sw, 0, 18)
end
updDock()
fr:GetPropertyChangedSignal("AbsoluteSize"):Connect(function()
task.defer(updDock)
end)
end
makeSizeSlider("UiRound", "UI roundness", "Adds extra roundness to panels and cards", radVal, 0, 18)
makeSizeSlider(
"UiAlpha",
"Panel transparency",
"Makes the heavy panels cleaner and less chunky",
panVal,
0,
0.35
)
makeSizeSlider("UiStroke", "Stroke scale", "Scales borders and outlines across Delta", stkVal, 0, 2.5)
makeSizeSlider("UiDim", "Open dim", "Darkens the game behind Delta while it is open", dimVal, 0, 0.65)
end
end)
end
end
do
local __lt = __lt
if (identifyexecutor and identifyexecutor() or ""):lower() ~= "delta" then
return
end
local env = __dcm_env
if type(env) ~= "table" then
return
end
if env.__DeltaHubMusicPatch and type(env.__DeltaHubMusicPatch.stop) == "function" then
pcall(env.__DeltaHubMusicPatch.stop)
end
local ref = cloneref and type(cloneref) == "function" and cloneref or function(v)
return v
end
local srv = setmetatable({}, {
__index = function(t, k)
local ok, v = pcall(function()
return __lt.cs(k, ref)
end)
if ok and v then
rawset(t, k, v)
return v
end
end,
})
local function S(n)
return srv[n]
end
local UIS = S("UserInputService")
local TS = S("TweenService")
local RS = S("RunService")
local SS = S("SoundService")
local HS = S("HttpService")
local CG = S("CoreGui")
local root = gethui and gethui() or CG
local rq = request or http_request or syn and syn.request
local st = {
con = {},
pg = {},
snd = nil,
muted = {},
gui = nil,
fn = {},
}
local function con(c)
if c then
st.con[#st.con + 1] = c
end
return c
end
local function disc()
for _, c in st.con do
pcall(function()
c:Disconnect()
end)
end
st.con = {}
end
local function stop()
disc()
if st.snd then
pcall(function()
st.snd:Destroy()
end)
st.snd = nil
end
if st.pg.music then
pcall(function()
st.pg.music:Destroy()
end)
end
if st.pg.musicButton then
pcall(function()
st.pg.musicButton:Destroy()
end)
st.pg.musicButton = nil
end
if st.pg.sh and st.pg.sh:FindFirstChild("LT_ScriptHub") then
pcall(function()
st.pg.sh.LT_ScriptHub:Destroy()
end)
end
for o, v in st.muted do
if o and o.Parent then
pcall(function()
o.Visible = v
end)
end
end
st.muted = {}
env.__DeltaHubMusicPatch = nil
end
env.__DeltaHubMusicPatch = {
stop = stop,
}
local function trim(s)
if type(s) ~= "string" then
return ""
end
return (s:gsub("^%s+", ""):gsub("%s+$", ""))
end
local function isg(s)
if typeof(s) ~= "string" or s == "" then
return false
end
return not s:match("^[%w _%-]+$")
end
local function getMain()
for _, g in root:GetChildren() do
if g:IsA("ScreenGui") and isg(g.Name) then
if
g:FindFirstChild("Executor", true)
and g:FindFirstChild("Scripthub", true)
and g:FindFirstChild("Sidebar", true)
then
return g
end
end
end
end
local gui = getMain()
if not gui then
return
end
st.gui = gui
local sb = gui:FindFirstChild("Sidebar", true)
local sh = gui:FindFirstChild("Scripthub")
local ex = gui:FindFirstChild("Executor")
local hm = gui:FindFirstChild("Home")
local se = gui:FindFirstChild("Settings")
local co = gui:FindFirstChild("Console")
if not (sb and sh) then
return
end
st.pg.sh = sh
local sec = {
"Executor",
"Home",
"Scripthub",
"Settings",
"Console",
"Music",
}
local musicState = {
openPos = UDim2.new(0.476246715, 0, 0.508232415, 0),
closedPos = UDim2.new(0.400000006, 0, 0.508232415, 0),
frame = nil,
button = nil,
tween = nil,
activeTab = nil,
icon = {
sheetUrl = "https://gitlab.com/ltseverydayyou/Nameless-Admin/-/raw/main/NAimages/sheet.png",
sheetAsset = nil,
rectOffset = Vector2.new(371, 806),
rectSize = Vector2.new(23, 33),
},
}
local syncTabColors
local function tweenMusic(toPos, show, hideAfter)
if not musicState.frame then
return
end
if musicState.tween then
pcall(function()
musicState.tween:Cancel()
end)
musicState.tween = nil
end
if show then
musicState.frame.Visible = true
end
if TS then
musicState.frame.Position = musicState.frame.Position
musicState.tween =
TS:Create(musicState.frame, TweenInfo.new(0.22, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
Position = toPos,
})
if hideAfter then
con(musicState.tween.Completed:Connect(function()
if musicState.frame then
musicState.frame.Visible = false
end
end))
end
musicState.tween:Play()
else
musicState.frame.Position = toPos
if hideAfter then
musicState.frame.Visible = false
end
end
end
local function openMusic()
if not musicState.frame then
return
end
musicState.activeTab = "Music"
for _, n in sec do
local p = gui:FindFirstChild(n)
if p and p:IsA("GuiObject") and p ~= musicState.frame then
p.Visible = false
end
end
musicState.frame.Position = musicState.closedPos
tweenMusic(musicState.openPos, true, false)
task.defer(function()
syncTabColors("Music")
end)
end
local function closeMusic(anim)
if not musicState.frame then
return
end
if not musicState.frame.Visible then
musicState.frame.Position = musicState.closedPos
return
end
if anim then
tweenMusic(musicState.closedPos, false, true)
else
musicState.frame.Position = musicState.closedPos
musicState.frame.Visible = false
end
end
local function hideAll(exn)
if exn == "Music" then
musicState.activeTab = "Music"
openMusic()
return
end
musicState.activeTab = exn
closeMusic(true)
for _, n in sec do
local p = gui:FindFirstChild(n)
if p and p:IsA("GuiObject") and n ~= "Music" then
p.Visible = n == exn
end
end
task.defer(function()
syncTabColors(exn)
end)
end
local function txtOf(o)
for _, d in o:QueryDescendants("Instance") do
if d:IsA("TextLabel") or d:IsA("TextButton") then
return d
end
end
end
local function gbtn(nm)
for _, d in sb:QueryDescendants("GuiButton") do
if d.Name == nm then return d
end
end
end
local sidebarRefs = {
home = gbtn("Home"),
scripthub = gbtn("Scripthub"),
settings = gbtn("Settings"),
executor = gbtn("Executor"),
console = gbtn("Console"),
toggle = gbtn("ToggleUI"),
activeColor = sb:FindFirstChild("ActiveColor"),
inactiveColor = sb:FindFirstChild("InactiveColor"),
}
local function imgOf(btn)
if not btn then
return nil
end
return btn:FindFirstChildWhichIsA("ImageLabel")
end
local function improveSidebarTouch(btn)
if not (btn and btn:IsA("GuiButton") and UIS and UIS.TouchEnabled) then
return btn
end
if btn:GetAttribute("LT_TouchSized") then
return btn
end
btn:SetAttribute("LT_TouchSized", true)
pcall(function()
btn.Size = UDim2.new(btn.Size.X.Scale, btn.Size.X.Offset + 8, btn.Size.Y.Scale, btn.Size.Y.Offset + 14)
end)
return btn
end
local offBg = sidebarRefs.scripthub and sidebarRefs.scripthub.BackgroundColor3 or Color3.fromRGB(41, 45, 58)
local offImg = imgOf(sidebarRefs.scripthub) and imgOf(sidebarRefs.scripthub).ImageColor3
or Color3.fromRGB(138, 145, 164)
local onImg = Color3.new(1, 1, 1)
improveSidebarTouch(sidebarRefs.home)
improveSidebarTouch(sidebarRefs.scripthub)
improveSidebarTouch(sidebarRefs.settings)
improveSidebarTouch(sidebarRefs.executor)
improveSidebarTouch(sidebarRefs.console)
improveSidebarTouch(sidebarRefs.toggle)
local function bgOn()
return sidebarRefs.activeColor and sidebarRefs.activeColor.Value or col.ac
end
local function bgOff()
return sidebarRefs.inactiveColor and sidebarRefs.inactiveColor.Value or offBg
end
local function applyBtnState(btn, on)
if not btn then
return
end
local targetBg = on and bgOn() or bgOff()
local targetImg = on and onImg or offImg
local img = imgOf(btn)
if TS then
pcall(function()
TS:Create(btn, TweenInfo.new(0.16, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
BackgroundColor3 = targetBg,
}):Play()
end)
if img then
pcall(function()
TS:Create(img, TweenInfo.new(0.16, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
ImageColor3 = targetImg,
}):Play()
end)
end
else
pcall(function()
btn.BackgroundColor3 = targetBg
end)
if img then
pcall(function()
img.ImageColor3 = targetImg
end)
end
end
end
local function visibleTab()
for _, n in sec do
local p = gui:FindFirstChild(n)
if p and p:IsA("GuiObject") and p.Visible then
return n
end
end
end
function syncTabColors(forceTab)
local curTab = forceTab or visibleTab()
local map = {
Home = sidebarRefs.home,
Executor = sidebarRefs.executor,
Scripthub = sidebarRefs.scripthub,
Settings = sidebarRefs.settings,
Console = sidebarRefs.console,
Music = musicState.button,
}
for n, b in map do
applyBtnState(b, curTab == n)
end
end
local function muteObj(d)
if not (d and d:IsA("GuiObject")) then
return
end
local keep = false
if d == sh then
keep = true
elseif d:FindFirstAncestor("LT_ScriptHub") then
keep = true
end
if keep then
return
end
if st.muted[d] == nil then
st.muted[d] = d.Visible
end
local master = rawget(__dcm_env, "__DeltaCustomizationMasterRuntime")
if type(master) == "table" and type(master.setTracked) == "function" then
master.setTracked(d, "Visible", false)
else
pcall(function()
d.Visible = false
end)
end
if d.GetPropertyChangedSignal then
con(d:GetPropertyChangedSignal("Visible"):Connect(function()
if d.Parent and not d:FindFirstAncestor("LT_ScriptHub") then
pcall(function()
d.Visible = false
end)
end
end))
end
end
local function muteSh()
for _, d in sh:QueryDescendants("Instance") do
muteObj(d)
end
end
st.fn.setupHubMusic = function()
local col = {
bg = Color3.fromRGB(20, 22, 26),
bg2 = Color3.fromRGB(30, 33, 40),
cd = Color3.fromRGB(26, 29, 36),
st = Color3.fromRGB(70, 75, 85),
ac = Color3.fromRGB(79, 164, 242),
tx = Color3.fromRGB(255, 255, 255),
td = Color3.fromRGB(186, 192, 205),
su = Color3.fromRGB(52, 211, 153),
wa = Color3.fromRGB(255, 179, 71),
er = Color3.fromRGB(244, 63, 94),
}
local function mk(class, props, kids)
local o = Instance.new(class)
for k, v in props or {} do
o[k] = v
end
for _, c in kids or {} do
c.Parent = o
end
return o
end
local function req(u)
local body
local status = 0
if type(rq) == "function" then
local ok, r = pcall(rq, {
Url = u,
Method = "GET",
Headers = {
["User-Agent"] = "Roblox/Http/1.1",
["Accept"] = "application/json",
},
})
if ok and r then
body = r.Body or r.body
status = r.StatusCode or r.Status or r.status_code or 0
end
end
if type(body) ~= "string" or body == "" then
local ok2, r2 = pcall(function()
return game:HttpGet(u)
end)
if ok2 and type(r2) == "string" and r2 ~= "" then
body = r2
status = 0
end
end
if type(body) ~= "string" or body == "" then
return nil, status
end
local ok3, dec = pcall(function()
return __lt.cm("HttpService", "JSONDecode", body)
end)
if ok3 then
return dec, status
end
return nil, status
end
local SCRIPTBLOX_BASE = "https://scriptblox.com"
local RSCRIPTS_BASE = "https://rscripts.net"
local ROSCRIPTS_BASE = "https://roscripts.io"
local HAXHELL_BASE = "https://haxhell.com"
local IMAGE_CACHE_DIR = "DeltaCustom/ScriptHubImages"
local MUSIC_CACHE_DIR = "DeltaCustom/DeltaMusic"
local MUSIC_CFG_PATH = MUSIC_CACHE_DIR .. "/_config.json"
local MUSIC_EXTS = {
mp3 = true,
ogg = true,
flac = true,
wav = true,
}
local musicCfg = {}
local function sanitizeFileName(str)
return tostring(str or ""):gsub("[^%w%._%-]", "_")
end
local function hashString(str)
local h = 0
for i = 1, #str do
h = (h * 31 + string.byte(str, i)) % 4294967296
end
return string.format("%08x", h)
end
local function clearImageCache()
if
type(isfolder) ~= "function"
or type(listfiles) ~= "function"
or type(isfile) ~= "function"
or type(delfile) ~= "function"
then
return false
end
local okExists, exists = pcall(isfolder, IMAGE_CACHE_DIR)
if not okExists or not exists then
return false
end
local okList, files = pcall(listfiles, IMAGE_CACHE_DIR)
if not okList or type(files) ~= "table" then
return false
end
for _, path in files do
if type(path) == "string" and path ~= "" then
pcall(delfile, path)
end
end
return true
end
local function ensureImageFolder()
if type(isfolder) ~= "function" or type(makefolder) ~= "function" then
return false
end
local ok, ex = pcall(isfolder, IMAGE_CACHE_DIR)
if ok and ex then
return true
end
return pcall(makefolder, IMAGE_CACHE_DIR) == true
end
local function ensureMusicFolder()
if type(isfolder) ~= "function" or type(makefolder) ~= "function" then
return false
end
local ok, ex = pcall(isfolder, MUSIC_CACHE_DIR)
if ok and ex then
return true
end
return pcall(makefolder, MUSIC_CACHE_DIR) == true
end
local function getAudioExt(path)
if type(path) ~= "string" then
return nil
end
local clean = path:match("([^?#]+)") or path
local ext = clean:match("%.([%w]+)$")
if not ext then
return nil
end
ext = ext:lower()
return MUSIC_EXTS[ext] and ext or nil
end
local function normalizeAudioUrl(url)
if type(url) ~= "string" then
return nil
end
local t = trim(url)
if t == "" then
return nil
end
t = t:gsub(" ", "%%20")
t = t:gsub(
"^https://github%.com/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$",
"https://raw.githubusercontent.com/%1/%2/%3/%4"
)
return t
end
local function deriveAudioFileName(url, ext)
local name = url:match("/([^/%?#]+)") or "track"
name = name:match("([^?#]+)") or name
local base = sanitizeFileName(name:gsub("%.[^%.]+$", ""))
base = base ~= "" and base or "track"
return string.format("%s_%s.%s", base, hashString(url), ext)
end
local function resolveMusicAsset(full)
if type(full) ~= "string" or full == "" or type(getcustomasset) ~= "function" or type(isfile) ~= "function" then
return nil
end
local okEx, ex = pcall(isfile, full)
if not (okEx and ex) then
return nil
end
local okAsset, asset = pcall(getcustomasset, full)
if okAsset and type(asset) == "string" and asset ~= "" then
return asset
end
return nil
end
local function loadMusicCfg()
if HS and type(isfile) == "function" and type(readfile) == "function" and isfile(MUSIC_CFG_PATH) then
local ok, data = pcall(readfile, MUSIC_CFG_PATH)
if ok and type(data) == "string" and data ~= "" then
local okDec, dec = pcall(function()
return __lt.cm("HttpService", "JSONDecode", data)
end)
if okDec and type(dec) == "table" then
musicCfg = dec
return
end
end
end
musicCfg = {}
end
local function saveMusicCfg()
if not (HS and type(writefile) == "function" and ensureMusicFolder()) then
return false
end
return writeJsonFile(MUSIC_CFG_PATH, musicCfg)
end
local function scanMusicFiles()
local list = {}
if type(listfiles) ~= "function" or not ensureMusicFolder() then
return list
end
local okList, files = pcall(listfiles, MUSIC_CACHE_DIR)
if not okList or type(files) ~= "table" then
return list
end
for _, path in files do
if type(path) == "string" then
local ext = getAudioExt(path)
if ext then
local name = path:match("([^/\\]+)$") or path
list[#list + 1] = {
path = path,
name = name,
asset = resolveMusicAsset(path),
}
end
end
end
table.sort(list, function(a, b)
return (a.name or ""):lower() < (b.name or ""):lower()
end)
return list
end
local function makeMusicFolderDropdown(par, y, z, onPick, onToggle)
local state = {
open = false,
menuHeight = 0,
}
local hoverBg = mk("Frame", {
Name = "LocalTrackHover",
BackgroundColor3 = Color3.fromRGB(41, 45, 56),
BackgroundTransparency = 1,
BorderSizePixel = 0,
Position = UDim2.new(0, 16, 0, y),
Size = UDim2.new(1, -32, 0, 32),
Parent = par,
ZIndex = z,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 10),
}),
})
local btn = mk("TextButton", {
Name = "LocalTrackButton",
BackgroundColor3 = col.bg,
BorderSizePixel = 0,
Position = UDim2.new(0, 16, 0, y),
Size = UDim2.new(1, -32, 0, 32),
Text = "",
AutoButtonColor = false,
Parent = par,
ZIndex = z + 1,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 10),
}),
mk("UIStroke", {
Color = col.st,
Transparency = 0.3,
}),
})
local value = mk("TextLabel", {
Name = "Value",
BackgroundTransparency = 1,
Position = UDim2.new(0, 12, 0, 0),
Size = UDim2.new(1, -38, 1, 0),
Text = "Pick local audio from DeltaMusic",
TextColor3 = col.tx,
Font = Enum.Font.GothamSemibold,
TextSize = 13,
TextTruncate = Enum.TextTruncate.AtEnd,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = btn,
ZIndex = z + 2,
})
local arrow = mk("TextLabel", {
Name = "Arrow",
BackgroundTransparency = 1,
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -12, 0.5, 0),
Size = UDim2.new(0, 18, 0, 18),
Text = "v",
TextColor3 = col.td,
Font = Enum.Font.GothamBold,
TextSize = 12,
Parent = btn,
ZIndex = z + 2,
})
local menu = mk("Frame", {
Name = "LocalTrackMenu",
BackgroundColor3 = Color3.fromRGB(37, 41, 52),
BorderSizePixel = 0,
Position = UDim2.new(0, 16, 0, y + 38),
Size = UDim2.new(1, -32, 0, 0),
Visible = false,
Parent = par,
ZIndex = z + 3,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 12),
}),
mk("UIStroke", {
Color = Color3.fromRGB(71, 79, 97),
Transparency = 0.22,
}),
})
local menuList = mk("ScrollingFrame", {
Name = "List",
BackgroundTransparency = 1,
BorderSizePixel = 0,
CanvasSize = UDim2.new(0, 0, 0, 0),
ElasticBehavior = Enum.ElasticBehavior.Never,
ScrollBarThickness = 3,
ScrollBarImageColor3 = col.st,
ScrollingDirection = Enum.ScrollingDirection.Y,
TopImage = "",
MidImage = "",
BottomImage = "",
Size = UDim2.new(1, 0, 1, 0),
Parent = menu,
ZIndex = z + 4,
}, {
mk("UIPadding", {
PaddingTop = UDim.new(0, 8),
PaddingBottom = UDim.new(0, 8),
PaddingLeft = UDim.new(0, 10),
PaddingRight = UDim.new(0, 10),
}),
mk("UIListLayout", {
Padding = UDim.new(0, 6),
SortOrder = Enum.SortOrder.LayoutOrder,
}),
})
local function setHover(on)
hoverBg.BackgroundTransparency = on and 0 or 1
end
local function setMenuOpen(open)
if state.open == open then
return
end
state.open = open
menu.Visible = open
arrow.Text = open and "^" or "v"
if TS then
pcall(function()
TS:Create(btn, TweenInfo.new(0.14, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
BackgroundColor3 = open and Color3.fromRGB(34, 38, 49) or col.bg,
}):Play()
end)
else
btn.BackgroundColor3 = open and Color3.fromRGB(34, 38, 49) or col.bg
end
if onToggle then
onToggle(open, state.menuHeight)
end
end
local function setValueText(text)
value.Text = trim(text or "") ~= "" and tostring(text) or "Pick local audio from DeltaMusic"
end
local function rebuild()
for _, child in menuList:GetChildren() do
if not child:IsA("UIListLayout") and not child:IsA("UIPadding") then
child:Destroy()
end
end
local items = scanMusicFiles()
if #items == 0 then
mk("TextLabel", {
Name = "Empty",
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 28),
Text = "No local audio files found",
TextColor3 = col.td,
Font = Enum.Font.Gotham,
TextSize = 12,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = menuList,
ZIndex = z + 5,
})
else
for i, item in items do
local row = mk("TextButton", {
Name = "Track_" .. i,
BackgroundColor3 = Color3.fromRGB(43, 47, 58),
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 0, 30),
Text = item.name or "",
TextColor3 = col.tx,
Font = Enum.Font.GothamSemibold,
TextSize = 12,
TextTruncate = Enum.TextTruncate.AtEnd,
TextXAlignment = Enum.TextXAlignment.Left,
AutoButtonColor = false,
Parent = menuList,
ZIndex = z + 5,
}, {
mk("UIPadding", {
PaddingLeft = UDim.new(0, 10),
PaddingRight = UDim.new(0, 10),
}),
mk("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
})
con(row.MouseEnter:Connect(function()
row.BackgroundColor3 = Color3.fromRGB(51, 56, 68)
end))
con(row.MouseLeave:Connect(function()
row.BackgroundColor3 = Color3.fromRGB(43, 47, 58)
end))
con(row.MouseButton1Click:Connect(function()
setValueText(item.name)
setMenuOpen(false)
if onPick then
onPick(item)
end
end))
end
end
local count = math.max(#items, 1)
local fullHeight = count * 30 + math.max(count - 1, 0) * 6 + 16
local visibleHeight = math.min(fullHeight, 172)
state.menuHeight = visibleHeight
menu.Size = UDim2.new(1, -32, 0, visibleHeight)
menuList.CanvasSize = UDim2.new(0, 0, 0, fullHeight)
if state.open and onToggle then
onToggle(true, state.menuHeight)
end
end
con(btn.MouseButton1Click:Connect(function()
if not state.open then
rebuild()
end
setMenuOpen(not state.open)
end))
con(btn.MouseEnter:Connect(function()
setHover(true)
end))
con(btn.MouseLeave:Connect(function()
setHover(false)
end))
return {
button = btn,
menu = menu,
rebuild = rebuild,
close = function()
setMenuOpen(false)
end,
setText = setValueText,
}
end
local function findLocalMusicEntry(query)
query = trim(query)
if query == "" then
return nil
end
local lower = query:lower()
for _, item in scanMusicFiles() do
local nm = (item.name or ""):lower()
local base = nm:gsub("%.[^%.]+$", "")
if lower == nm or lower == base then
return item
end
end
return nil
end
local httpGetBinary
local function downloadMusicAsset(url)
if
type(getcustomasset) ~= "function"
or type(writefile) ~= "function"
or type(isfile) ~= "function"
or not ensureMusicFolder()
then
return nil, "Custom music requires file support and getcustomasset."
end
local norm = normalizeAudioUrl(url)
local ext = getAudioExt(norm)
if not norm or not ext then
return nil, "Unsupported audio format. Use mp3, ogg, flac, or wav."
end
local full = MUSIC_CACHE_DIR .. "/" .. deriveAudioFileName(norm, ext)
local okEx, ex = pcall(isfile, full)
if not (okEx and ex) then
local data = httpGetBinary(norm)
if not (type(data) == "string" and data ~= "") then
return nil, "Failed to download audio."
end
local okW = pcall(writefile, full, data)
if not okW then
return nil, "Failed to save audio."
end
end
local asset = resolveMusicAsset(full)
if not asset then
return nil, "Failed to load audio asset."
end
return {
asset = asset,
name = full:match("([^/\\]+)$") or full,
path = full,
}, nil
end
ensureMusicFolder()
loadMusicCfg()
local function deriveImageFileName(url)
local name = url:match("/([^/%?#]+)") or "image"
name = name:match("([^?#]+)") or name
local base = sanitizeFileName(name:match("(.+)%.") or name)
return string.format("%s_%s.bin", base ~= "" and base or "image", hashString(url))
end
clearImageCache()
local function normalizeImageUrl(url, base)
if type(url) ~= "string" or url == "" then
return nil
end
local t = trim(url)
if t == "" then
return nil
end
if t:match("^rbxassetid://") or t:match("^rbxthumb://") then
return nil
end
if t:match("^https?://") then
return t
end
if t:sub(1, 2) == "//" then
return "https:" .. t
end
if t:sub(1, 1) == "/" then
return (base or "") .. t
end
return base and (base .. "/" .. t) or t
end
local function isMeaningfulImageUrl(url)
if type(url) ~= "string" or url == "" then
return false
end
return not url:lower():find("no%-script")
end
function httpGetBinary(url, headers)
if type(url) ~= "string" or url == "" then
return nil
end
local function tryRequest(hdr)
if type(rq) ~= "function" then
return nil
end
local h = {}
if type(hdr) == "table" then
for k, v in hdr do
h[k] = v
end
end
h["User-Agent"] = h["User-Agent"] or "Roblox/Http/1.1"
h["Accept"] = h["Accept"] or "*/*"
local ok, res = pcall(rq, {
Url = url,
Method = "GET",
Headers = h,
})
if ok and res then
local code = res.StatusCode or res.Status or res.status_code or 0
local body = res.Body or res.body
if (code == 0 or code >= 200 and code < 300) and type(body) == "string" and body ~= "" then
return body
end
end
return nil
end
local data = tryRequest(headers)
if type(data) == "string" and data ~= "" then
return data
end
local ok2, body2 = pcall(function()
return game:HttpGet(url)
end)
if ok2 and type(body2) == "string" and body2 ~= "" then
return body2
end
return tryRequest(nil)
end
local function downloadImageAsset(url)
if type(url) ~= "string" or url == "" then
return nil
end
if type(getcustomasset) ~= "function" or type(writefile) ~= "function" or type(isfile) ~= "function" then
return nil
end
if not ensureImageFolder() then
return nil
end
local full = IMAGE_CACHE_DIR .. "/" .. deriveImageFileName(url)
local okEx, ex = pcall(isfile, full)
if not (okEx and ex) then
local host = url:match("^https?://([^/]+)") or ""
local hdr
if host:find("rscripts%.net") then
hdr = { Referer = RSCRIPTS_BASE }
elseif host:find("robloxscripts%.com") then
hdr = { Referer = "https://robloxscripts.com" }
elseif host:find("haxhell%.com") then
hdr = { Referer = HAXHELL_BASE }
elseif host:find("rbxcdn%.com") then
hdr = { Referer = "https://www.roblox.com/" }
end
local data = httpGetBinary(url, hdr)
if not (type(data) == "string" and data ~= "") then
return nil
end
local okW = pcall(writefile, full, data)
if not okW then
return nil
end
end
local okA, asset = pcall(getcustomasset, full)
if okA and type(asset) == "string" and asset ~= "" then
return asset
end
return nil
end
local function resolveScriptBloxImage(d)
if not d then
return nil
end
local function pick(vals)
for _, v in vals do
local n = normalizeImageUrl(v, SCRIPTBLOX_BASE)
if n and isMeaningfulImageUrl(n) then
return n
end
end
end
return pick({
d.image,
d.imageUrl,
d.thumbnail,
d.coverImage,
d.icon,
d.game and d.game.imageUrl,
d.game and d.game.thumbnail,
d.game and d.game.image,
d.game and d.game.coverImage,
d.game and d.game.icon,
})
end
local function resolveRScriptsImage(d)
if not d then
return nil
end
local function pick(vals)
for _, v in vals do
local n = normalizeImageUrl(v, RSCRIPTS_BASE)
if n then
return n
end
end
end
return pick({
d.image,
d.imageUrl,
d.thumbnail,
d.cover,
d.banner,
d.img,
d.game and d.game.imgurl,
d.game and d.game.imageUrl,
d.game and d.game.image,
d.game and d.game.thumbnail,
d.game and d.game.cover,
d.game and d.game.banner,
d.game and d.game.gameLogo,
})
end
local function resolveRoScriptsImage(d)
if not d then
return nil
end
local url = normalizeImageUrl(d.image, ROSCRIPTS_BASE)
if url and isMeaningfulImageUrl(url) then
return url
end
local gameData = type(d.game) == "table" and d.game or nil
url = normalizeImageUrl(gameData and gameData.image, ROSCRIPTS_BASE)
if url and isMeaningfulImageUrl(url) then
return url
end
return nil
end
local function resolveHaxHellImage(d)
if not d then
return nil
end
local media = type(d.media) == "table" and d.media or {}
local gameData = type(d.game) == "table" and d.game or {}
local function pick(vals)
for _, v in vals do
local n = normalizeImageUrl(v, HAXHELL_BASE)
if n and isMeaningfulImageUrl(n) then
return n
end
end
end
return pick({
media.thumbnailUrl,
d.image,
d.imageUrl,
d.thumbnail,
gameData.thumbnailUrl,
gameData.iconUrl,
gameData.imageUrl,
gameData.image,
})
end
local function buildRobloxThumbnail(placeId)
local id = tostring(placeId or "")
if id == "" or id == "0" then
return nil
end
return "https://www.roblox.com/Thumbs/PlaceThumbnail.ashx?width=420&height=270&format=png&placeId=" .. id
end
local function toast(a, b)
if type(env.Notify) == "function" then
pcall(env.Notify, {
Title = a,
Description = b,
Duration = 4,
})
return
end
if type(env.nt) == "function" then
pcall(env.nt, {
Title = a,
Description = b,
Duration = 4,
})
end
end
local hub = sh:FindFirstChild("LT_ScriptHub")
if hub then
hub:Destroy()
end
muteSh()
hub = mk("Frame", {
Name = "LT_ScriptHub",
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
Visible = true,
ZIndex = 50,
Parent = sh,
}, {
mk("UIPadding", {
PaddingTop = UDim.new(0, 12),
PaddingBottom = UDim.new(0, 12),
PaddingLeft = UDim.new(0, 12),
PaddingRight = UDim.new(0, 12),
}),
})
local top = mk("Frame", {
Name = "Top",
BackgroundColor3 = col.bg2,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 0, 42),
Parent = hub,
ZIndex = 51,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 10),
}),
mk("UIStroke", {
Color = col.st,
Transparency = 0.35,
}),
})
local engb = mk("TextButton", {
Name = "Engine",
BackgroundColor3 = Color3.fromRGB(45, 49, 58),
BorderSizePixel = 0,
Size = UDim2.new(0, 168, 1, 0),
Text = "Engine: RScripts",
TextColor3 = col.tx,
Font = Enum.Font.GothamSemibold,
TextSize = 13,
Parent = top,
ZIndex = 52,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
mk("UIStroke", {
Color = col.st,
Transparency = 0.3,
}),
})
local fltb = mk("TextButton", {
Name = "Filter",
BackgroundColor3 = col.bg,
BorderSizePixel = 0,
Size = UDim2.new(0, 88, 1, 0),
Position = UDim2.new(1, -176, 0, 0),
Text = "All",
TextColor3 = col.tx,
Font = Enum.Font.GothamSemibold,
TextSize = 13,
Parent = top,
ZIndex = 52,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
mk("UIStroke", {
Color = col.st,
Transparency = 0.3,
}),
})
local gob = mk("TextButton", {
Name = "Go",
BackgroundColor3 = col.ac,
BorderSizePixel = 0,
Size = UDim2.new(0, 80, 1, 0),
Position = UDim2.new(1, -80, 0, 0),
Text = "Search",
TextColor3 = col.tx,
Font = Enum.Font.GothamBold,
TextSize = 13,
Parent = top,
ZIndex = 52,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
})
local sbox = mk("TextBox", {
Name = "Search",
BackgroundColor3 = col.bg,
BorderSizePixel = 0,
Size = UDim2.new(1, -352, 1, 0),
Position = UDim2.new(0, 176, 0, 0),
ClearTextOnFocus = false,
Text = "",
PlaceholderText = "Search for scripts (rscripts.net)",
TextColor3 = col.tx,
PlaceholderColor3 = col.td,
TextXAlignment = Enum.TextXAlignment.Left,
Font = Enum.Font.Gotham,
TextSize = 13,
Parent = top,
ZIndex = 52,
}, {
mk("UIPadding", {
PaddingLeft = UDim.new(0, 10),
PaddingRight = UDim.new(0, 10),
}),
mk("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
mk("UIStroke", {
Color = col.st,
Transparency = 0.3,
}),
})
local list = mk("ScrollingFrame", {
Name = "List",
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 1, -92),
Position = UDim2.new(0, 0, 0, 50),
CanvasSize = UDim2.new(0, 0, 0, 0),
AutomaticCanvasSize = Enum.AutomaticSize.Y,
ScrollBarThickness = 4,
Parent = hub,
ZIndex = 51,
}, {
mk("UIListLayout", {
Padding = UDim.new(0, 10),
SortOrder = Enum.SortOrder.LayoutOrder,
}),
})
local bot = mk("Frame", {
Name = "Bottom",
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 32),
Position = UDim2.new(0, 0, 1, -32),
Parent = hub,
ZIndex = 51,
})
local prev = mk("TextButton", {
BackgroundColor3 = col.bg,
BorderSizePixel = 0,
Size = UDim2.new(0, 72, 1, 0),
Text = "Prev",
TextColor3 = col.tx,
Font = Enum.Font.GothamSemibold,
TextSize = 12,
Parent = bot,
ZIndex = 52,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
mk("UIStroke", {
Color = col.st,
Transparency = 0.35,
}),
})
local nextb = mk("TextButton", {
BackgroundColor3 = col.bg,
BorderSizePixel = 0,
Size = UDim2.new(0, 72, 1, 0),
Position = UDim2.new(1, -72, 0, 0),
Text = "Next",
TextColor3 = col.tx,
Font = Enum.Font.GothamSemibold,
TextSize = 12,
Parent = bot,
ZIndex = 52,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
mk("UIStroke", {
Color = col.st,
Transparency = 0.35,
}),
})
local pgt = mk("TextLabel", {
BackgroundTransparency = 1,
Size = UDim2.new(1, -160, 1, 0),
Position = UDim2.new(0, 80, 0, 0),
Text = "Page 1 / 1",
TextColor3 = col.td,
Font = Enum.Font.Gotham,
TextSize = 12,
Parent = bot,
ZIndex = 52,
})
local eng = "RScripts"
local flt = "all"
local cur = 1
local maxp = 1
local q = ""
local tr = false
local busy = false
local data = {}
local function pass(d)
local v
if eng == "RScripts" then
v = d.keySystem
elseif eng == "HaxHell" then
local flags = type(d.flags) == "table" and d.flags or {}
v = flags.keySystem
else
v = d.key
end
if v == nil and type(d.accessType) == "string" then
v = d.accessType:lower() == "key"
end
local k = false
if type(v) == "boolean" then
k = v
elseif type(v) == "number" then
k = v ~= 0
elseif type(v) == "string" then
local s = v:lower()
if
s ~= ""
and s ~= "false"
and s ~= "0"
and s ~= "none"
and s ~= "n/a"
and not s:find("no key", 1, true)
and not s:find("keyless", 1, true)
then
k = true
end
elseif v ~= nil and v ~= false then
k = true
end
if flt == "all" then
return true
elseif flt == "keyless" then
return not k
else
return k
end
end
local function shClr()
for _, c in list:GetChildren() do
if c:IsA("GuiObject") then
c:Destroy()
end
end
end
local function shMsg(t, c3)
local lb = mk("TextLabel", {
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 40),
Text = t,
TextColor3 = c3 or col.td,
Font = Enum.Font.GothamSemibold,
TextSize = 14,
Parent = list,
})
return lb
end
local function mkb(par, tx, c3)
return mk("TextButton", {
BackgroundColor3 = c3,
BorderSizePixel = 0,
Size = UDim2.new(0, 88, 0, 28),
Text = tx,
TextColor3 = col.tx,
Font = Enum.Font.GothamSemibold,
TextSize = 12,
Parent = par,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 7),
}),
})
end
local function getRw(d)
if eng == "RScripts" then
return d.rawScript or d.scriptLink or d.raw or "", true
elseif eng == "RoScripts" then
local url = d.loadstring or d.rawUrl or ""
return url, type(url) == "string" and url:match("^https?://") ~= nil
elseif eng == "RobloxScripts" then
local source = d.script or ""
if source ~= "" then
return source, false
end
local url = d.rawScriptUrl or d.scriptLink or d.raw or ""
return url, url ~= ""
elseif eng == "HaxHell" then
local links = type(d.links) == "table" and d.links or {}
local sourceData = type(d.source) == "table" and d.source or {}
local source = links.raw or sourceData.rawUrl or sourceData.code or d.rawScriptUrl or d.script or ""
return source, type(source) == "string" and source:match("^https?://") ~= nil
end
return d.script or d.rawScript or d.scriptLink or d.raw or "", false
end
local function getTi(d)
return d.title or d.name or "Untitled Script"
end
local function getGa(d)
if eng == "RScripts" then
return d.game and d.game.title or "Unknown Game"
end
return d.game and d.game.name or "Unknown Game"
end
local function keyReq(d)
local v
if eng == "RScripts" then
v = d.keySystem
elseif eng == "HaxHell" then
local flags = type(d.flags) == "table" and d.flags or {}
v = flags.keySystem
else
v = d.key
end
if v == nil and type(d.accessType) == "string" then
v = d.accessType:lower() == "key"
end
local k = false
if type(v) == "boolean" then
k = v
elseif type(v) == "number" then
k = v ~= 0
elseif type(v) == "string" then
local s = v:lower()
if
s ~= ""
and s ~= "false"
and s ~= "0"
and s ~= "none"
and s ~= "n/a"
and not s:find("no key", 1, true)
and not s:find("keyless", 1, true)
then
k = true
end
elseif v ~= nil and v ~= false then
k = true
end
return k
end
local function getInfo(d)
local stats = type(d.stats) == "table" and d.stats or {}
local flags = type(d.flags) == "table" and d.flags or {}
local v = tostring(d.views or d.viewCount or stats.views or 0)
local l = tostring(d.likes or d.likeCount or stats.likes or 0)
local k = keyReq(d) and "Key" or "Keyless"
if eng == "RoScripts" then
if d.scriptType == "paid" then
k = "Paid"
end
elseif eng == "RobloxScripts" and type(d.accessType) == "string" then
local access = d.accessType:lower()
if access == "paid" then
k = "Paid"
elseif access == "free" then
k = "Free"
end
elseif eng == "HaxHell" and flags.isPaid == true then
k = "Paid"
end
local s = eng == "RobloxScripts" and "Published" or (d.isPatched == true or d.patched == true or flags.patched == true) and "Patched" or "Working"
local info = string.format("%s | Views %s | Likes %s | %s", k, v, l, s)
if eng == "RScripts" and d.discord and d.discord ~= "" then
info = info .. " | Discord"
elseif eng == "RobloxScripts" and d.author and d.author.verified == true then
info = info .. " | Verified"
elseif eng == "RoScripts" then
if d.verified == true or type(d.owner) == "table" and d.owner.verified == true then
info = info .. " | Verified"
end
if d.universal == true then
info = info .. " | Universal"
end
elseif eng == "HaxHell" then
local verified = flags.verified == true or type(d.author) == "table" and d.author.isScripterVerified == true
if verified then
info = info .. " | Verified"
end
if flags.mobileSupported == true then
info = info .. " | Mobile"
end
end
return info
end
local function mkRow()
return mk("Frame", {
Name = "Row",
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 124),
Parent = list,
ZIndex = 51,
}, {
mk("UIListLayout", {
FillDirection = Enum.FillDirection.Horizontal,
Padding = UDim.new(0, 10),
SortOrder = Enum.SortOrder.LayoutOrder,
}),
})
end
local function mkCard(par, i, d)
local rw, rwIsUrl = getRw(d)
local placeId
if eng == "ScriptBlox" then
placeId = d.game and d.game.gameId
elseif eng == "RScripts" then
placeId = d.game and (d.game.placeId or d.game.gameLink and d.game.gameLink:match("/games/(%d+)"))
elseif eng == "HaxHell" or eng == "RoScripts" then
placeId = d.game and d.game.placeId or d.placeId
end
placeId = tonumber(placeId)
local bgUrl
if eng == "ScriptBlox" then
bgUrl = resolveScriptBloxImage(d)
elseif eng == "RScripts" then
bgUrl = resolveRScriptsImage(d)
elseif eng == "RoScripts" then
bgUrl = resolveRoScriptsImage(d)
elseif eng == "HaxHell" then
bgUrl = resolveHaxHellImage(d)
else
local candidates = {
d.image,
d.imageUrl,
d.thumbnail,
d.game and d.game.iconUrl,
d.game and d.game.image,
}
for _, value in candidates do
local normalized = normalizeImageUrl(value, "https://robloxscripts.com")
if normalized and isMeaningfulImageUrl(normalized) then
bgUrl = normalized
break
end
end
end
if not bgUrl and placeId then
bgUrl = buildRobloxThumbnail(placeId)
end
local bgAsset = bgUrl and downloadImageAsset(bgUrl) or nil
local bgImg = bgAsset or bgUrl
local cd = mk("Frame", {
Name = "Card" .. tostring(i),
BackgroundColor3 = col.cd,
BorderSizePixel = 0,
Size = UDim2.new(0.333333343, -7, 1, 0),
LayoutOrder = i,
ClipsDescendants = true,
Parent = par,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 10),
}),
mk("UIStroke", {
Color = col.st,
Transparency = 0.35,
}),
})
if bgImg then
mk("ImageLabel", {
Name = "Cover",
BackgroundColor3 = Color3.fromRGB(12, 14, 22),
BackgroundTransparency = 0,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 1, 0),
Image = bgImg,
ImageTransparency = 0.1,
ScaleType = Enum.ScaleType.Crop,
Parent = cd,
ZIndex = 0,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 10),
}),
})
mk("Frame", {
BackgroundColor3 = Color3.new(0, 0, 0),
BackgroundTransparency = 0.35,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 1, 0),
Parent = cd,
ZIndex = 1,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 10),
}),
mk("UIGradient", {
Rotation = 90,
Transparency = NumberSequence.new({
NumberSequenceKeypoint.new(0, 0.08),
NumberSequenceKeypoint.new(1, 0.45),
}),
}),
})
end
mk("TextLabel", {
BackgroundTransparency = 1,
Size = UDim2.new(1, -16, 0, 20),
Position = UDim2.new(0, 8, 0, 8),
TextXAlignment = Enum.TextXAlignment.Left,
TextTruncate = Enum.TextTruncate.AtEnd,
Font = Enum.Font.GothamBold,
TextSize = 14,
TextColor3 = col.tx,
Text = getTi(d),
Parent = cd,
ZIndex = 2,
})
mk("TextLabel", {
BackgroundTransparency = 1,
Size = UDim2.new(1, -16, 0, 18),
Position = UDim2.new(0, 8, 0, 30),
TextXAlignment = Enum.TextXAlignment.Left,
TextTruncate = Enum.TextTruncate.AtEnd,
Font = Enum.Font.GothamSemibold,
TextSize = 12,
TextColor3 = col.ac,
Text = getGa(d),
Parent = cd,
ZIndex = 2,
})
mk("TextLabel", {
BackgroundTransparency = 1,
Size = UDim2.new(1, -16, 0, 30),
Position = UDim2.new(0, 8, 0, 50),
TextWrapped = true,
TextXAlignment = Enum.TextXAlignment.Left,
TextYAlignment = Enum.TextYAlignment.Top,
Font = Enum.Font.Gotham,
TextSize = 11,
TextColor3 = col.td,
Text = getInfo(d),
Parent = cd,
ZIndex = 2,
})
local row = mk("Frame", {
BackgroundTransparency = 1,
Size = UDim2.new(1, -16, 0, 28),
Position = UDim2.new(0, 8, 1, -36),
Parent = cd,
ZIndex = 2,
}, {
mk("UIListLayout", {
FillDirection = Enum.FillDirection.Horizontal,
Padding = UDim.new(0, 8),
}),
})
local run = mkb(row, "Run", col.su)
run.ZIndex = 3
local cp = setclipboard and mkb(row, "Copy", Color3.fromRGB(57, 63, 75)) or nil
if cp then
cp.ZIndex = 3
end
local extra = eng == "RScripts" and d.discord or eng == "RoScripts" and (d.marketplaceUrl or d.discordUrl)
local extraLabel = eng == "RoScripts" and d.marketplaceUrl and "Store" or "Discord"
local dc = type(extra) == "string" and extra ~= "" and setclipboard
and mkb(row, extraLabel, Color3.fromRGB(28, 116, 224)) or nil
if dc then
dc.ZIndex = 3
end
con(run.MouseButton1Click:Connect(function()
local ok, er = pcall(function()
local ld = __dcm_boot.getLoader()
if type(ld) ~= "function" then
error("loadstring unavailable")
end
local src = rw
if rwIsUrl then
local headers
if eng == "RScripts" then
headers = { Referer = RSCRIPTS_BASE }
elseif eng == "RobloxScripts" then
headers = { Referer = "https://robloxscripts.com" }
elseif eng == "HaxHell" then
headers = { Referer = HAXHELL_BASE }
end
local got, gotEr = httpTxt(rw, headers)
if type(got) ~= "string" or got == "" then
error(gotEr or "empty script source")
end
src = got
end
if type(src) ~= "string" or src == "" then
error("script source must be a string, got " .. tostring(typeof and typeof(src) or type(src)))
end
local fn, cer = ld(src, "@ScriptHubEntry")
if type(fn) ~= "function" then
error(cer or "compile failed")
end
if type(__dcm_boot.hostSetfenv) == "function" then
pcall(__dcm_boot.hostSetfenv, fn, __dcm_boot.runtimeEnv)
end
fn()
end)
if ok then
toast("ScriptHub", "Executed script.")
else
toast("ScriptHub", tostring(er))
end
end))
if cp then
con(cp.MouseButton1Click:Connect(function()
pcall(function()
local src = rw
if eng == "RoScripts" and type(d.loadstring) == "string" and d.loadstring ~= "" then
src = "loadstring(game:HttpGet(" .. string.format("%q", d.loadstring) .. "))()"
elseif rwIsUrl then
local headers
if eng == "RScripts" then
headers = { Referer = RSCRIPTS_BASE }
elseif eng == "RobloxScripts" then
headers = { Referer = "https://robloxscripts.com" }
elseif eng == "HaxHell" then
headers = { Referer = HAXHELL_BASE }
end
src = httpTxt(rw, headers)
end
if type(src) == "string" and src ~= "" then
setclipboard(src)
end
end)
cp.Text = "Copied"
task.delay(0.8, function()
if cp and cp.Parent then
cp.Text = "Copy"
end
end)
end))
end
if dc then
con(dc.MouseButton1Click:Connect(function()
pcall(function()
setclipboard(extra)
end)
dc.Text = "Copied"
task.delay(0.8, function()
if dc and dc.Parent then
dc.Text = extraLabel
end
end)
end))
end
end
local function ren()
shClr()
pgt.Text = string.format("Page %d / %d", cur, maxp)
if not data or #data == 0 then
shMsg("No scripts found", col.wa)
return
end
local n = 0
local row
local coln = 0
for _, d in data do
if pass(d) then
if not row or coln >= 3 then
row = mkRow()
coln = 0
end
n += 1
coln += 1
mkCard(row, n, d)
end
end
if n == 0 then
if flt == "keyless" then
shMsg("No keyless scripts found on this page", col.wa)
elseif flt == "key" then
shMsg("No key-required scripts found on this page", col.wa)
else
shMsg("No scripts found", col.wa)
end
end
end
local function setBusy(v)
busy = v and true or false
gob.Active = not busy
prev.Active = not busy
nextb.Active = not busy
gob.Text = busy and "Loading" or "Search"
end
local function fetch(q2, tr2, p2)
if busy then
return
end
clearImageCache()
q2 = trim(q2 or "")
tr2 = eng == "ScriptBlox" and tr2 == true or false
p2 = math.max(tonumber(p2) or 1, 1)
q = q2
tr = tr2
cur = p2
maxp = 1
data = {}
setBusy(true)
shClr()
shMsg("Loading...", col.td)
local requestQuery = q2
if eng == "RobloxScripts" and #requestQuery > 100 then
requestQuery = requestQuery:sub(1, 100)
elseif eng == "HaxHell" and requestQuery ~= "" and #requestQuery < 2 then
shClr()
shMsg("HaxHell search requires at least 2 characters", col.wa)
setBusy(false)
return
end
local enc = __lt.cm("HttpService", "UrlEncode", requestQuery)
local u
if eng == "RScripts" then
u = string.format("https://rscripts.net/api/v2/scripts?page=%d&orderBy=date&sort=desc", p2)
if requestQuery ~= "" then
u = u .. "&q=" .. enc
end
elseif eng == "RoScripts" then
if requestQuery == "" then
u = string.format("https://api.roscripts.io/v1/scripts?page=%d&max=20&sortBy=updatedAt&order=desc", p2)
else
u = string.format("https://api.roscripts.io/v1/scripts/search?q=%s&page=%d&max=20", enc, p2)
end
elseif eng == "RobloxScripts" then
p2 = math.min(p2, 200)
cur = p2
u = string.format("https://robloxscripts.com/api/v1/scripts?page=%d&limit=24&sort=newest", p2)
if requestQuery ~= "" then
u = u .. "&q=" .. enc
end
elseif eng == "HaxHell" then
if requestQuery == "" then
u = string.format("https://haxhell.com/api/v1/scripts?page=%d&limit=24&sort=latest", p2)
else
u = string.format("https://haxhell.com/api/v1/search/scripts?q=%s&page=%d&limit=24&sort=latest", enc, p2)
end
elseif tr2 then
u = string.format("https://scriptblox.com/api/script/fetch?page=%d", p2)
else
u = string.format("https://scriptblox.com/api/script/search?q=%s&page=%d", enc, p2)
end
local dec, status = req(u)
shClr()
if status == 429 then
shMsg("Rate limit reached. Try again shortly", col.wa)
setBusy(false)
return
elseif status == 503 then
shMsg("API temporarily unavailable", col.wa)
setBusy(false)
return
elseif status ~= 0 and (status < 200 or status >= 300) then
shMsg("Request failed (" .. tostring(status) .. ")", col.er)
setBusy(false)
return
elseif not dec then
shMsg("Request failed", col.er)
setBusy(false)
return
end
local arr
if eng == "RScripts" then
arr = dec.scripts
maxp = math.max(dec.info and dec.info.maxPages or 1, 1)
elseif eng == "RoScripts" then
local result = dec.result or {}
local meta = dec.meta or {}
arr = type(result.scripts) == "table" and result.scripts or {}
local pages = tonumber(result.totalPages or meta.totalPages)
maxp = math.max(math.floor(pages or 1), 1)
cur = tonumber(result.page or meta.page) or p2
elseif eng == "RobloxScripts" then
arr = dec.data
local pg = dec.pagination or {}
local total = tonumber(pg.total or pg.totalItems)
local limit = tonumber(pg.limit or pg.perPage) or 24
local pages = tonumber(pg.totalPages or pg.pages or pg.lastPage)
if not pages and total then
pages = math.ceil(total / math.max(limit, 1))
end
maxp = math.min(math.max(pages or 1, 1), 200)
cur = tonumber(pg.page or pg.currentPage) or p2
elseif eng == "HaxHell" then
arr = dec.data
local pg = dec.pagination or {}
local total = tonumber(pg.total or pg.totalItems)
local limit = tonumber(pg.limit or pg.perPage) or 24
local pages = tonumber(pg.totalPages or pg.pages or pg.lastPage)
if not pages and total then
pages = math.ceil(total / math.max(limit, 1))
end
cur = tonumber(pg.page or pg.currentPage) or p2
if not pages then
pages = pg.hasMore == true and (cur + 1) or cur
end
maxp = math.max(math.floor(pages or 1), 1)
else
local r = dec.result or {}
arr = r.scripts
maxp = math.max(r.totalPages or 1, 1)
end
data = arr or {}
if #data == 0 then
shMsg("No scripts found", col.wa)
pgt.Text = string.format("Page %d / %d", cur, maxp)
setBusy(false)
return
end
ren()
setBusy(false)
end
con(engb.MouseButton1Click:Connect(function()
if eng == "ScriptBlox" then
eng = "RScripts"
engb.BackgroundColor3 = Color3.fromRGB(45, 49, 58)
sbox.PlaceholderText = "Search for scripts (rscripts.net)"
elseif eng == "RScripts" then
eng = "RoScripts"
engb.BackgroundColor3 = Color3.fromRGB(45, 68, 62)
sbox.PlaceholderText = "Search for scripts (roscripts.io)"
elseif eng == "RoScripts" then
eng = "RobloxScripts"
engb.BackgroundColor3 = Color3.fromRGB(38, 52, 68)
sbox.PlaceholderText = "Search for scripts (robloxscripts.com)"
elseif eng == "RobloxScripts" then
eng = "HaxHell"
engb.BackgroundColor3 = Color3.fromRGB(58, 42, 74)
sbox.PlaceholderText = "Search for scripts (haxhell.com)"
else
eng = "ScriptBlox"
engb.BackgroundColor3 = col.bg
sbox.PlaceholderText = "Search for scripts (scriptblox.com)"
end
engb.Text = "Engine: " .. eng
toast("ScriptHub", "Switched to " .. eng)
data = {}
cur = 1
maxp = 1
pgt.Text = "Page 1 / 1"
shClr()
shMsg("Press Search to load scripts", col.td)
end))
con(fltb.MouseButton1Click:Connect(function()
if flt == "all" then
flt = "keyless"
fltb.Text = "Keyless"
elseif flt == "keyless" then
flt = "key"
fltb.Text = "Key"
else
flt = "all"
fltb.Text = "All"
end
ren()
end))
con(gob.MouseButton1Click:Connect(function()
local t = trim(sbox.Text)
if t ~= "" then
fetch(t, false, 1)
else
if eng == "ScriptBlox" then
fetch("", true, 1)
else
fetch("", false, 1)
end
end
end))
con(sbox.FocusLost:Connect(function(ent)
if ent then
local t = trim(sbox.Text)
if t ~= "" then
fetch(t, false, 1)
else
if eng == "ScriptBlox" then
fetch("", true, 1)
else
fetch("", false, 1)
end
end
end
end))
con(prev.MouseButton1Click:Connect(function()
if busy then
return
end
if cur > 1 then
fetch(q, tr, cur - 1)
end
end))
con(nextb.MouseButton1Click:Connect(function()
if busy then
return
end
if cur < maxp then
fetch(q, tr, cur + 1)
end
end))
shClr()
shMsg("Press Search to load scripts", col.td)
con(sh.DescendantAdded:Connect(function(d)
muteObj(d)
end))
local function buildMusicTab()
musicState.frame = gui:FindFirstChild("Music")
if musicState.frame then
pcall(function()
musicState.frame:Destroy()
end)
end
local tpl = sh or hm or se or ex or co
if tpl and tpl:IsA("GuiObject") then
musicState.frame = tpl:Clone()
musicState.frame.Name = "Music"
musicState.frame.Visible = false
musicState.frame.Parent = gui
pcall(function()
musicState.frame.AnchorPoint = Vector2.new(0.5, 0.5)
musicState.frame.Position = musicState.closedPos
musicState.frame.Size = sh.Size
musicState.frame.ZIndex = sh.ZIndex
end)
for _, d in musicState.frame:QueryDescendants("Instance") do
if d:IsA("LocalScript") then
d:Destroy()
elseif d:IsA("GuiObject") and d ~= musicState.frame then
pcall(function()
d.Visible = false
end)
end
end
else
musicState.frame = mk("Frame", {
Name = "Music",
BackgroundTransparency = 1,
AnchorPoint = Vector2.new(0.5, 0.5),
Position = musicState.closedPos,
Size = sh and sh.Size or UDim2.new(0.848344803, 0, 0.892481446, 0),
Visible = false,
Parent = gui,
ZIndex = sh and sh.ZIndex or 100,
})
end
st.pg.music = musicState.frame
local mr = mk("ScrollingFrame", {
Name = "LT_Music",
AutomaticCanvasSize = Enum.AutomaticSize.None,
BackgroundTransparency = 1,
BorderSizePixel = 0,
CanvasSize = UDim2.new(0, 0, 0, 590),
ElasticBehavior = Enum.ElasticBehavior.Never,
HorizontalScrollBarInset = Enum.ScrollBarInset.ScrollBar,
ScrollingDirection = Enum.ScrollingDirection.Y,
ScrollBarImageColor3 = col.st,
ScrollBarThickness = 4,
TopImage = "",
MidImage = "",
BottomImage = "",
VerticalScrollBarInset = Enum.ScrollBarInset.ScrollBar,
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.new(0.5, 0, 0.5, 0),
Size = UDim2.new(0.94, 0, 0.88, 0),
Visible = true,
ZIndex = 50,
Parent = musicState.frame,
})
local function mkPanel(name, pos, size, fill, stroke, z)
return mk("Frame", {
Name = name,
BackgroundColor3 = fill or col.bg2,
BorderSizePixel = 0,
Position = pos,
Size = size,
Parent = mr,
ZIndex = z or 51,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 12),
}),
mk("UIStroke", {
Color = stroke or col.st,
Transparency = 0.28,
}),
})
end
local function mkCtl(par, name, text, width, bg, strokeCol)
return mk("TextButton", {
Name = name,
BackgroundColor3 = bg,
BorderSizePixel = 0,
Size = UDim2.new(0, width, 0, 34),
Text = text,
TextColor3 = col.tx,
Font = Enum.Font.GothamBold,
TextSize = 13,
Parent = par,
ZIndex = 54,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 9),
}),
mk("UIStroke", {
Color = strokeCol or bg:Lerp(Color3.new(1, 1, 1), 0.12),
Transparency = 0.45,
}),
})
end
local function mkSlider(parent, y, titleText, accent, defaultScale)
local title = mk("TextLabel", {
BackgroundTransparency = 1,
Position = UDim2.new(0, 16, 0, y),
Size = UDim2.new(1, -32, 0, 16),
Text = titleText,
TextColor3 = col.td,
Font = Enum.Font.GothamSemibold,
TextSize = 12,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = parent,
ZIndex = 54,
})
local bar = mk("Frame", {
BackgroundColor3 = Color3.fromRGB(43, 47, 58),
BorderSizePixel = 0,
Position = UDim2.new(0, 16, 0, y + 24),
Size = UDim2.new(1, -32, 0, 10),
Parent = parent,
ZIndex = 54,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 999),
}),
})
local fill = mk("Frame", {
BackgroundColor3 = accent,
BorderSizePixel = 0,
Size = UDim2.new(defaultScale or 0, 0, 1, 0),
Parent = bar,
ZIndex = 55,
}, {
mk("UICorner", {
CornerRadius = UDim.new(0, 999),
}),
})
local knob = mk("Frame", {
BackgroundColor3 = Color3.fromRGB(245, 247, 250),
BorderSizePixel = 0,
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.new(defaultScale or 0, 0, 0.5, 0),
Size = UDim2.new(0, 14, 0, 14),
Parent = bar,
ZIndex = 56,
}, {
mk("UICorner", {
CornerRadius = UDim.new(1, 0),
}),
mk("UIStroke", {
Color = accent,
Transparency = 0.35,
}),
})
return title, bar, fill, knob
end
local hero = mkPanel(
"Hero",
UDim2.new(0, 0, 0, 0),
UDim2.new(1, 0, 0, 118),
Color3.fromRGB(18, 22, 31),
Color3.fromRGB(62, 72, 92),
51
)
hero.ClipsDescendants = true
local heroGrad = Instance.new("UIGradient")
heroGrad.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(15, 21, 31)),
ColorSequenceKeypoint.new(0.52, Color3.fromRGB(23, 29, 44)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(10, 14, 21)),
})
heroGrad.Rotation = 12
heroGrad.Parent = hero
mk("Frame", {
Name = "OrbA",
AnchorPoint = Vector2.new(1, 0),
Position = UDim2.new(1, -16, 0, -18),
Size = UDim2.new(0, 96, 0, 96),
BackgroundColor3 = Color3.fromRGB(79, 164, 242),
BackgroundTransparency = 0.8,
BorderSizePixel = 0,
Parent = hero,
ZIndex = 51,
}, {
mk("UICorner", { CornerRadius = UDim.new(1, 0) }),
})
mk("Frame", {
Name = "OrbB",
AnchorPoint = Vector2.new(0, 1),
Position = UDim2.new(0, -10, 1, 18),
Size = UDim2.new(0, 72, 0, 72),
BackgroundColor3 = Color3.fromRGB(52, 211, 153),
BackgroundTransparency = 0.86,
BorderSizePixel = 0,
Parent = hero,
ZIndex = 51,
}, {
mk("UICorner", { CornerRadius = UDim.new(1, 0) }),
})
local heroTag = mk("TextLabel", {
BackgroundColor3 = Color3.fromRGB(32, 45, 71),
BorderSizePixel = 0,
Position = UDim2.new(0, 16, 0, 14),
Size = UDim2.new(0, 118, 0, 20),
Text = "CUSTOM PLAYER",
TextColor3 = Color3.fromRGB(223, 238, 255),
Font = Enum.Font.GothamBold,
TextSize = 10,
Parent = hero,
ZIndex = 53,
}, {
mk("UICorner", { CornerRadius = UDim.new(0, 999) }),
})
local mt = mk("TextLabel", {
BackgroundTransparency = 1,
Position = UDim2.new(0, 16, 0, 47),
Size = UDim2.new(1, -146, 0, 28),
Text = "Music Studio",
TextColor3 = col.tx,
Font = Enum.Font.GothamBold,
TextSize = 24,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = hero,
ZIndex = 53,
})
local heroStatus = mk("TextLabel", {
Name = "HeroStatus",
AnchorPoint = Vector2.new(1, 0),
Position = UDim2.new(1, -16, 0, 14),
Size = UDim2.new(0, 108, 0, 24),
BackgroundColor3 = Color3.fromRGB(28, 32, 42),
BorderSizePixel = 0,
Text = "IDLE",
TextColor3 = Color3.fromRGB(199, 208, 221),
Font = Enum.Font.GothamBold,
TextSize = 11,
Parent = hero,
ZIndex = 53,
}, {
mk("UICorner", { CornerRadius = UDim.new(0, 999) }),
mk("UIStroke", {
Color = Color3.fromRGB(70, 75, 85),
Transparency = 0.35,
}),
})
local assetChip = mk("TextLabel", {
Name = "AssetChip",
AnchorPoint = Vector2.new(1, 0),
Position = UDim2.new(1, -16, 0, 46),
Size = UDim2.new(0, 126, 0, 20),
BackgroundColor3 = Color3.fromRGB(22, 26, 35),
BorderSizePixel = 0,
Text = "No asset",
TextColor3 = Color3.fromRGB(151, 160, 176),
Font = Enum.Font.GothamSemibold,
TextSize = 10,
TextTruncate = Enum.TextTruncate.AtEnd,
Parent = hero,
ZIndex = 53,
}, {
mk("UICorner", { CornerRadius = UDim.new(0, 999) }),
})
local inputBaseY = 132
local inputBaseHeight = 118
local controlBaseY = 264
local mixBaseY = 436
local canvasBaseHeight = 590
local inputCard =
mkPanel("InputCard", UDim2.new(0, 0, 0, inputBaseY), UDim2.new(1, 0, 0, inputBaseHeight), col.bg2, col.st, 51)
local inputTitle = mk("TextLabel", {
BackgroundTransparency = 1,
Position = UDim2.new(0, 16, 0, 10),
Size = UDim2.new(1, -32, 0, 14),
Text = "Load audio",
TextColor3 = col.tx,
Font = Enum.Font.GothamSemibold,
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = inputCard,
ZIndex = 53,
})
local mb = mk("TextBox", {
Name = "IdBox",
BackgroundColor3 = col.bg,
BorderSizePixel = 0,
Size = UDim2.new(1, -156, 0, 40),
Position = UDim2.new(0, 16, 0, 28),
ClearTextOnFocus = false,
Text = "",
PlaceholderText = "Asset id or direct audio URL",
TextColor3 = col.tx,
PlaceholderColor3 = col.td,
TextXAlignment = Enum.TextXAlignment.Left,
Font = Enum.Font.Gotham,
TextSize = 14,
Parent = inputCard,
ZIndex = 53,
}, {
mk("UIPadding", {
PaddingLeft = UDim.new(0, 12),
PaddingRight = UDim.new(0, 12),
}),
mk("UICorner", {
CornerRadius = UDim.new(0, 10),
}),
mk("UIStroke", {
Color = col.st,
Transparency = 0.28,
}),
})
local loadb = mkCtl(inputCard, "Load", "Load Track", 124, col.ac, Color3.fromRGB(116, 192, 255))
loadb.Position = UDim2.new(1, -140, 0, 28)
loadb.ZIndex = 53
local controlCard =
mkPanel("ControlCard", UDim2.new(0, 0, 0, controlBaseY), UDim2.new(1, 0, 0, 158), col.bg2, col.st, 51)
local controlLabel = mk("TextLabel", {
BackgroundTransparency = 1,
Position = UDim2.new(0, 16, 0, 12),
Size = UDim2.new(1, -156, 0, 14),
Text = "Playback",
TextColor3 = col.tx,
Font = Enum.Font.GothamSemibold,
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = controlCard,
ZIndex = 53,
})
local cycleb = mkCtl(
controlCard,
"Cycle",
"Cycle Off",
112,
Color3.fromRGB(45, 50, 61),
Color3.fromRGB(94, 105, 121)
)
cycleb.AnchorPoint = Vector2.new(1, 0)
cycleb.Position = UDim2.new(1, -16, 0, 10)
cycleb.ZIndex = 53
local now = mk("TextLabel", {
BackgroundTransparency = 1,
Position = UDim2.new(0, 16, 0, 32),
Size = UDim2.new(1, -152, 0, 24),
Text = "No track loaded",
TextColor3 = col.tx,
Font = Enum.Font.GothamBold,
TextSize = 16,
TextTruncate = Enum.TextTruncate.AtEnd,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = controlCard,
ZIndex = 53,
})
local stat = mk("TextLabel", {
BackgroundTransparency = 1,
Position = UDim2.new(0, 16, 0, 56),
Size = UDim2.new(1, -32, 0, 18),
Text = "Stopped",
TextColor3 = col.td,
Font = Enum.Font.Gotham,
TextSize = 12,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = controlCard,
ZIndex = 53,
})
local row = mk("Frame", {
BackgroundTransparency = 1,
Position = UDim2.new(0, 16, 0, 82),
Size = UDim2.new(1, -32, 0, 34),
Parent = controlCard,
ZIndex = 53,
}, {
mk("UIListLayout", {
FillDirection = Enum.FillDirection.Horizontal,
Padding = UDim.new(0, 8),
VerticalAlignment = Enum.VerticalAlignment.Center,
}),
})
local playb = mkCtl(row, "Play", "Play", 74, col.su, Color3.fromRGB(103, 233, 186))
local pauseSlot = mk("Frame", {
Name = "PauseSlot",
BackgroundTransparency = 1,
Size = UDim2.new(0, 82, 0, 34),
Parent = row,
ZIndex = 53,
})
local pauseb = mkCtl(
pauseSlot,
"Pause",
"Pause",
82,
Color3.fromRGB(57, 63, 75),
Color3.fromRGB(105, 115, 133)
)
pauseb.Position = UDim2.new(0, 0, 0, 0)
local resumeb = mkCtl(
pauseSlot,
"Resume",
"Resume",
82,
Color3.fromRGB(42, 68, 88),
Color3.fromRGB(96, 164, 216)
)
resumeb.Position = UDim2.new(0, 0, 0, 0)
local stopb = mkCtl(row, "Stop", "Stop", 74, Color3.fromRGB(80, 40, 40), Color3.fromRGB(132, 74, 74))
local loopb = mkCtl(row, "Loop", "Loop Off", 96, Color3.fromRGB(45, 50, 61), Color3.fromRGB(94, 105, 121))
resumeb.Visible = false
local progressInfo = mk("TextLabel", {
BackgroundTransparency = 1,
Position = UDim2.new(0, 16, 0, 124),
Size = UDim2.new(1, -32, 0, 14),
Text = "00:00 / 00:00",
TextColor3 = Color3.fromRGB(142, 151, 166),
Font = Enum.Font.GothamSemibold,
TextSize = 11,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = controlCard,
ZIndex = 53,
})
local pbar = mk("Frame", {
BackgroundColor3 = Color3.fromRGB(41, 45, 56),
BorderSizePixel = 0,
Position = UDim2.new(0, 16, 0, 142),
Size = UDim2.new(1, -32, 0, 8),
Parent = controlCard,
ZIndex = 54,
}, {
mk("UICorner", { CornerRadius = UDim.new(0, 999) }),
})
local pfill = mk("Frame", {
BackgroundColor3 = Color3.fromRGB(79, 164, 242),
BorderSizePixel = 0,
Size = UDim2.new(0, 0, 1, 0),
Parent = pbar,
ZIndex = 55,
}, {
mk("UICorner", { CornerRadius = UDim.new(0, 999) }),
})
local pkn = mk("Frame", {
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BorderSizePixel = 0,
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.new(0, 0, 0.5, 0),
Size = UDim2.new(0, 12, 0, 12),
Parent = pbar,
ZIndex = 56,
}, {
mk("UICorner", { CornerRadius = UDim.new(1, 0) }),
mk("UIStroke", {
Color = Color3.fromRGB(79, 164, 242),
Transparency = 0.35,
}),
})
local mixCard = mkPanel("MixCard", UDim2.new(0, 0, 0, mixBaseY), UDim2.new(1, 0, 0, 138), col.bg2, col.st, 51)
local mixTitle = mk("TextLabel", {
BackgroundTransparency = 1,
Position = UDim2.new(0, 16, 0, 12),
Size = UDim2.new(1, -32, 0, 14),
Text = "Mixer",
TextColor3 = col.tx,
Font = Enum.Font.GothamSemibold,
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = mixCard,
ZIndex = 53,
})
local vt, vbar, vfill, vkn = mkSlider(mixCard, 34, "Volume", col.ac, 0.5)
local spLabel, sbar, sfill, skn = mkSlider(mixCard, 84, "Playback speed", Color3.fromRGB(52, 211, 153), 0.333333)
local helper = mk("TextLabel", {
BackgroundTransparency = 1,
Position = UDim2.new(0, 16, 1, -18),
Size = UDim2.new(1, -32, 0, 14),
Text = "Seek tracks with the progress bar. Volume and speed apply live.",
TextColor3 = Color3.fromRGB(124, 132, 145),
Font = Enum.Font.Gotham,
TextSize = 11,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = mixCard,
ZIndex = 53,
})
local localPicker
local function relayoutMusic(extra)
extra = math.max(0, tonumber(extra) or 0)
inputCard.Size = UDim2.new(1, 0, 0, inputBaseHeight + extra)
controlCard.Position = UDim2.new(0, 0, 0, controlBaseY + extra)
mixCard.Position = UDim2.new(0, 0, 0, mixBaseY + extra)
mr.CanvasSize = UDim2.new(0, 0, 0, canvasBaseHeight + extra)
end
local function syncLocalPicker(raw)
if not localPicker then
return
end
local entry = raw and findLocalMusicEntry(raw) or nil
if entry and entry.name then
localPicker.setText(entry.name)
else
localPicker.setText("")
end
end
local savedVol = tonumber(musicCfg.volume)
if savedVol and savedVol >= 0 and savedVol <= 1 then
savedVol *= 10
end
local vl = math.clamp(savedVol or 1, 0, 10)
local spd = math.clamp(tonumber(musicCfg.playbackSpeed) or 1, 0.5, 2)
local mixSaveStamp = 0
local mixReady = false
local function queueMixSave()
if not mixReady then
return
end
mixSaveStamp += 1
local cur = mixSaveStamp
task.delay(0.15, function()
if cur ~= mixSaveStamp then
return
end
musicCfg.volume = vl
musicCfg.playbackSpeed = spd
saveMusicCfg()
end)
end
local function formatTime(sec)
sec = tonumber(sec) or 0
if sec < 0 or sec ~= sec or sec == math.huge then
sec = 0
end
local total = math.floor(sec + 0.5)
local m = math.floor(total / 60)
local s = total % 60
return string.format("%02d:%02d", m, s)
end
local function setStatusText(text, accent)
stat.Text = text
heroStatus.Text = string.upper(text)
if accent then
heroStatus.BackgroundColor3 = accent
heroStatus.TextColor3 = Color3.fromRGB(245, 247, 250)
else
heroStatus.BackgroundColor3 = Color3.fromRGB(28, 32, 42)
heroStatus.TextColor3 = Color3.fromRGB(199, 208, 221)
end
end
local function setProgress(alpha, pos, len)
alpha = math.clamp(alpha or 0, 0, 1)
pfill.Size = UDim2.new(alpha, 0, 1, 0)
pkn.Position = UDim2.new(alpha, 0, 0.5, 0)
progressInfo.Text = string.format("%s / %s", formatTime(pos or 0), formatTime(len or 0))
end
local function syncLoopButton()
local on = st.snd and st.snd.Looped
loopb.Text = on and "Loop On" or "Loop Off"
loopb.BackgroundColor3 = on and Color3.fromRGB(45, 93, 73) or Color3.fromRGB(45, 50, 61)
end
local function syncPauseButtons()
local paused = st.musicPaused and st.snd ~= nil
pauseb.Visible = not paused
resumeb.Visible = paused
end
local function syncCycleButton()
local mode = st.musicCycleMode
if mode == "order" then
cycleb.Text = "Cycle Order"
cycleb.BackgroundColor3 = Color3.fromRGB(45, 93, 73)
elseif mode == "random" then
cycleb.Text = "Cycle Random"
cycleb.BackgroundColor3 = Color3.fromRGB(52, 74, 112)
else
cycleb.Text = "Cycle Off"
cycleb.BackgroundColor3 = Color3.fromRGB(45, 50, 61)
end
end
local function getNextCycleTrack()
local mode = st.musicCycleMode
if mode ~= "order" and mode ~= "random" then
return nil
end
local items = scanMusicFiles()
if #items == 0 then
return nil
end
local currentRaw = trim(st.musicRaw or "")
if currentRaw == "" then
return nil
end
local currentLower = currentRaw:lower()
local currentIndex
for i, item in items do
local nm = (item.name or ""):lower()
local base = nm:gsub("%.[^%.]+$", "")
if currentLower == nm or currentLower == base then
currentIndex = i
break
end
end
if not currentIndex then
return nil
end
if mode == "random" then
if #items == 1 then
return items[1]
end
local idx = currentIndex
for _ = 1, 8 do
idx = math.random(1, #items)
if idx ~= currentIndex then
break
end
end
if idx == currentIndex then
idx = (currentIndex % #items) + 1
end
return items[idx]
end
return items[(currentIndex % #items) + 1]
end
local function apVol(v)
vl = math.clamp(v, 0, 10)
local alpha = vl / 10
vfill.Size = UDim2.new(alpha, 0, 1, 0)
vkn.Position = UDim2.new(alpha, 0, 0.5, 0)
vt.Text = string.format("Volume %.2f", vl)
if st.snd then
st.snd.Volume = vl
end
queueMixSave()
end
local function apSpeed(v)
spd = math.clamp(v, 0.5, 2)
local alpha = (spd - 0.5) / 1.5
sfill.Size = UDim2.new(alpha, 0, 1, 0)
skn.Position = UDim2.new(alpha, 0, 0.5, 0)
spLabel.Text = string.format("Playback speed %.2fx", spd)
if st.snd then
st.snd.PlaybackSpeed = spd
end
queueMixSave()
end
apVol(vl)
apSpeed(spd)
st.musicPaused = false
st.musicCycleMode = st.musicCycleMode or "off"
mixReady = true
setStatusText("Stopped")
setProgress(0, 0, 0)
relayoutMusic(0)
syncPauseButtons()
syncCycleButton()
local dragging = false
local speedDragging = false
local progressDragging = false
local function setBar(inp)
local x = (inp.Position.X - vbar.AbsolutePosition.X) / math.max(vbar.AbsoluteSize.X, 1)
apVol(math.clamp(x, 0, 1) * 10)
end
local function setSpeedBar(inp)
local x = (inp.Position.X - sbar.AbsolutePosition.X) / math.max(sbar.AbsoluteSize.X, 1)
apSpeed(0.5 + math.clamp(x, 0, 1) * 1.5)
end
local function setProgressBar(inp)
if not (st.snd and st.snd.TimeLength and st.snd.TimeLength > 0) then
return
end
local x = (inp.Position.X - pbar.AbsolutePosition.X) / math.max(pbar.AbsoluteSize.X, 1)
x = math.clamp(x, 0, 1)
local len = st.snd.TimeLength
local pos = len * x
pcall(function()
st.snd.TimePosition = pos
end)
setProgress(x, pos, len)
end
con(vbar.InputBegan:Connect(function(inp)
if inp.UserInputType == Enum.UserInputType.MouseButton1 or inp.UserInputType == Enum.UserInputType.Touch then
dragging = true
setBar(inp)
end
end))
con(sbar.InputBegan:Connect(function(inp)
if inp.UserInputType == Enum.UserInputType.MouseButton1 or inp.UserInputType == Enum.UserInputType.Touch then
speedDragging = true
setSpeedBar(inp)
end
end))
con(pbar.InputBegan:Connect(function(inp)
if inp.UserInputType == Enum.UserInputType.MouseButton1 or inp.UserInputType == Enum.UserInputType.Touch then
progressDragging = true
setProgressBar(inp)
end
end))
con(UIS.InputChanged:Connect(function(inp)
if
dragging
and (inp.UserInputType == Enum.UserInputType.MouseMovement or inp.UserInputType == Enum.UserInputType.Touch)
then
setBar(inp)
end
if
speedDragging
and (inp.UserInputType == Enum.UserInputType.MouseMovement or inp.UserInputType == Enum.UserInputType.Touch)
then
setSpeedBar(inp)
end
if
progressDragging
and (inp.UserInputType == Enum.UserInputType.MouseMovement or inp.UserInputType == Enum.UserInputType.Touch)
then
setProgressBar(inp)
end
end))
con(UIS.InputEnded:Connect(function(inp)
if inp.UserInputType == Enum.UserInputType.MouseButton1 or inp.UserInputType == Enum.UserInputType.Touch then
dragging = false
speedDragging = false
progressDragging = false
end
end))
if RS then
con(RS.Heartbeat:Connect(function()
local snd = st.snd
if not snd then
return
end
local len = snd.TimeLength or 0
local pos = snd.TimePosition or 0
local alpha = 0
if len > 0 then
alpha = math.clamp(pos / len, 0, 1)
end
if not progressDragging then
setProgress(alpha, pos, len)
end
end))
end
local function getId(t)
t = trim(t)
if t == "" then
return nil
end
local n = t:match("^rbxassetid://(%d+)$") or t:match("id=(%d+)") or t:match("^(%d+)$")
if n then
return "rbxassetid://" .. n, n
end
return nil
end
local function mkSnd(id, raw)
if st.snd then
pcall(function()
st.snd:Destroy()
end)
end
local s = Instance.new("Sound")
s.Name = "LT_MusicSound"
s.SoundId = id
s.Volume = vl
s.Looped = false
s.PlaybackSpeed = spd
s.Parent = gui
local function clearSoundGroup()
if not (s and s.Parent) then
return
end
pcall(function()
if s.SoundGroup ~= nil then
s.SoundGroup = nil
end
end)
end
clearSoundGroup()
st.snd = s
st.musicPaused = false
st.musicRaw = tostring(raw)
now.Text = tostring(raw)
assetChip.Text = tostring(raw)
setStatusText("Loaded", Color3.fromRGB(53, 83, 125))
setProgress(0, 0, 0)
syncLoopButton()
syncPauseButtons()
con(s.Loaded:Connect(function()
if st.snd ~= s then
return
end
st.musicPaused = false
setStatusText("Loaded", Color3.fromRGB(53, 83, 125))
setProgress(0, s.TimePosition or 0, s.TimeLength or 0)
syncPauseButtons()
end))
con(s.Ended:Connect(function()
if st.snd ~= s then
return
end
st.musicPaused = false
setStatusText("Ended", Color3.fromRGB(88, 64, 48))
syncPauseButtons()
local nextTrack = getNextCycleTrack()
if nextTrack and nextTrack.asset then
task.defer(function()
if st.snd ~= s then
return
end
mb.Text = nextTrack.name or ""
mkSnd(nextTrack.asset, nextTrack.name)
syncLocalPicker(nextTrack.name)
if st.snd then
pcall(function()
st.snd:Play()
end)
end
end)
end
end))
con(s.Played:Connect(function()
if st.snd ~= s then
return
end
st.musicPaused = false
setStatusText("Playing", Color3.fromRGB(52, 211, 153))
syncPauseButtons()
end))
con(s.Paused:Connect(function()
if st.snd ~= s then
return
end
st.musicPaused = true
setStatusText("Paused", Color3.fromRGB(92, 105, 123))
syncPauseButtons()
end))
con(s.Stopped:Connect(function()
if st.snd ~= s then
return
end
st.musicPaused = false
setStatusText("Stopped")
setProgress(0, 0, s.TimeLength or 0)
syncPauseButtons()
end))
con(s:GetPropertyChangedSignal("SoundGroup"):Connect(function()
task.defer(clearSoundGroup)
end))
end
local function resolveTrackInput(text)
local q = trim(text)
if q == "" then
return nil, nil, "Enter a valid asset id, filename, or audio URL."
end
local localEntry = findLocalMusicEntry(q)
if localEntry and localEntry.asset then
return localEntry.asset, localEntry.name
end
local sid, raw = getId(q)
if sid then
return sid, raw
end
if q:match("^https?://") or q:match("^www%.") then
local entry, err = downloadMusicAsset(q:match("^www%.") and ("https://" .. q) or q)
if not entry then
return nil, nil, err or "Failed to download audio."
end
return entry.asset, entry.name
end
if getAudioExt(q) then
return nil, nil, "Local track not found in DeltaCustom/DeltaMusic."
end
return nil, nil, "Enter a valid asset id, filename, or audio URL."
end
local loadCurrentTrack
localPicker = makeMusicFolderDropdown(inputCard, 74, 53, function(item)
mb.Text = item.name or ""
task.defer(function()
if loadCurrentTrack then
loadCurrentTrack()
end
end)
end, function(open, menuHeight)
relayoutMusic(open and (menuHeight + 10) or 0)
end)
function loadCurrentTrack()
if localPicker then
localPicker.close()
end
local sid, raw, err = resolveTrackInput(mb.Text)
if not sid then
toast("Music", err or "Enter a valid track.")
return false
end
mkSnd(sid, raw)
syncLocalPicker(raw)
toast("Music", "Loaded audio.")
return true
end
con(loadb.MouseButton1Click:Connect(loadCurrentTrack))
con(mb.FocusLost:Connect(function(enter)
if enter then
loadCurrentTrack()
end
end))
con(playb.MouseButton1Click:Connect(function()
if st.snd then
st.musicPaused = false
syncPauseButtons()
pcall(function()
st.snd:Play()
end)
end
end))
con(pauseb.MouseButton1Click:Connect(function()
if st.snd then
st.musicPaused = true
syncPauseButtons()
pcall(function()
st.snd:Pause()
end)
end
end))
con(resumeb.MouseButton1Click:Connect(function()
if st.snd then
st.musicPaused = false
syncPauseButtons()
local ok = pcall(function()
st.snd:Resume()
end)
if not ok then
pcall(function()
st.snd:Play()
end)
end
end
end))
con(stopb.MouseButton1Click:Connect(function()
if st.snd then
st.musicPaused = false
syncPauseButtons()
pcall(function()
st.snd:Stop()
end)
end
end))
con(loopb.MouseButton1Click:Connect(function()
if not st.snd then
return
end
st.snd.Looped = not st.snd.Looped
syncLoopButton()
end))
con(cycleb.MouseButton1Click:Connect(function()
local mode = st.musicCycleMode
if mode == "off" then
st.musicCycleMode = "order"
elseif mode == "order" then
st.musicCycleMode = "random"
else
st.musicCycleMode = "off"
end
syncCycleButton()
end))
end
buildMusicTab()
musicState.setupSidebar = function()
musicState.icon.sheetAsset = downloadImageAsset(musicState.icon.sheetUrl)
musicState.button = gbtn("Music")
if musicState.button then
pcall(function()
musicState.button:Destroy()
end)
end
musicState.sourceButton = sidebarRefs.console
or sidebarRefs.scripthub
or sidebarRefs.home
or sidebarRefs.settings
or sidebarRefs.executor
if musicState.sourceButton then
musicState.button = musicState.sourceButton:Clone()
musicState.button.Name = "Music"
musicState.button.Parent = musicState.sourceButton.Parent
st.pg.musicButton = musicState.button
musicState.textLabel = txtOf(musicState.button)
if musicState.textLabel then
musicState.textLabel.Text = "Music"
end
pcall(function()
if sidebarRefs.toggle and sidebarRefs.toggle:IsA("GuiButton") then
local to = sidebarRefs.toggle.LayoutOrder or 999
for _, d in sb:GetChildren() do
if d:IsA("GuiButton") and d ~= musicState.button and d.LayoutOrder and d.LayoutOrder >= to then
d.LayoutOrder += 1
end
end
musicState.button.LayoutOrder = to
else
local lo = 0
for _, d in sb:GetChildren() do
if d:IsA("GuiButton") and d ~= musicState.button then
lo = math.max(lo, d.LayoutOrder or 0)
end
end
musicState.button.LayoutOrder = lo + 1
end
end)
musicState.imageLabel = imgOf(musicState.button)
if musicState.imageLabel then
pcall(function()
if musicState.icon.sheetAsset then
musicState.imageLabel.Image = musicState.icon.sheetAsset
musicState.imageLabel.ImageRectOffset = musicState.icon.rectOffset
musicState.imageLabel.ImageRectSize = musicState.icon.rectSize
musicState.imageLabel.ScaleType = Enum.ScaleType.Fit
end
musicState.imageLabel.ImageColor3 = offImg
end)
end
pcall(function()
musicState.button.BackgroundColor3 = bgOff()
end)
end
musicState.placeButton = function()
if not (musicState.button and sidebarRefs.toggle and musicState.button.Parent == sidebarRefs.toggle.Parent) then
return
end
pcall(function()
if sidebarRefs.toggle:GetAttribute("LT_OrigPosXS") == nil then
sidebarRefs.toggle:SetAttribute("LT_OrigPosXS", sidebarRefs.toggle.Position.X.Scale)
sidebarRefs.toggle:SetAttribute("LT_OrigPosXO", sidebarRefs.toggle.Position.X.Offset)
sidebarRefs.toggle:SetAttribute("LT_OrigPosYS", sidebarRefs.toggle.Position.Y.Scale)
sidebarRefs.toggle:SetAttribute("LT_OrigPosYO", sidebarRefs.toggle.Position.Y.Offset)
sidebarRefs.toggle:SetAttribute("LT_OrigLay", sidebarRefs.toggle.LayoutOrder or 0)
end
local op = UDim2.new(
sidebarRefs.toggle:GetAttribute("LT_OrigPosXS") or sidebarRefs.toggle.Position.X.Scale,
sidebarRefs.toggle:GetAttribute("LT_OrigPosXO") or sidebarRefs.toggle.Position.X.Offset,
sidebarRefs.toggle:GetAttribute("LT_OrigPosYS") or sidebarRefs.toggle.Position.Y.Scale,
sidebarRefs.toggle:GetAttribute("LT_OrigPosYO") or sidebarRefs.toggle.Position.Y.Offset
)
sidebarRefs.toggle.Position = op
local togLo = sidebarRefs.toggle:GetAttribute("LT_OrigLay") or sidebarRefs.toggle.LayoutOrder or 0
sidebarRefs.toggle.LayoutOrder = togLo
local above
local ay = -math.huge
local ty = op.Y.Scale + op.Y.Offset / 100000
for _, d in sidebarRefs.toggle.Parent:GetChildren() do
if d:IsA("GuiButton") and d ~= sidebarRefs.toggle and d ~= musicState.button then
local py = d.Position.Y.Scale + d.Position.Y.Offset / 100000
if py < ty and py > ay then
ay = py
above = d
end
end
end
local gapS = 0.11
local gapO = 0
if above then
gapS = op.Y.Scale - above.Position.Y.Scale
gapO = op.Y.Offset - above.Position.Y.Offset
end
musicState.button.Position = op
musicState.button.LayoutOrder = togLo - 1
sidebarRefs.toggle.Position = UDim2.new(op.X.Scale, op.X.Offset, op.Y.Scale + gapS, op.Y.Offset + gapO)
sidebarRefs.toggle.LayoutOrder = togLo + 1
end)
end
musicState.placeButton()
musicState.bindHide = function(b, nm)
improveSidebarTouch(b)
if b and b:IsA("GuiButton") then
con(b.MouseButton1Click:Connect(function()
closeMusic(true)
task.defer(function()
syncTabColors(nm or b.Name)
end)
end))
end
end
musicState.bindHide(sidebarRefs.home, "Home")
musicState.bindHide(sidebarRefs.scripthub, "Scripthub")
musicState.bindHide(sidebarRefs.settings, "Settings")
musicState.bindHide(sidebarRefs.executor, "Executor")
musicState.bindHide(sidebarRefs.console, "Console")
improveSidebarTouch(musicState.button)
if musicState.button and musicState.button:IsA("GuiButton") then
con(musicState.button.MouseButton1Click:Connect(function()
openMusic()
task.defer(function()
syncTabColors("Music")
end)
end))
end
for _, n in sec do
local p = gui:FindFirstChild(n)
if p and p:IsA("GuiObject") and p.GetPropertyChangedSignal then
con(p:GetPropertyChangedSignal("Visible"):Connect(function()
task.defer(syncTabColors)
end))
end
end
if sidebarRefs.activeColor and sidebarRefs.activeColor.Changed then
con(sidebarRefs.activeColor.Changed:Connect(function()
task.defer(syncTabColors)
end))
end
if sidebarRefs.inactiveColor and sidebarRefs.inactiveColor.Changed then
con(sidebarRefs.inactiveColor.Changed:Connect(function()
task.defer(syncTabColors)
end))
end
task.defer(syncTabColors)
end
musicState.setupSidebar()
end
st.fn.setupHubMusic();
end
do
local previousThemeRuntime = rawget(__dcm_env, "__DeltaThemeRuntime")
if type(previousThemeRuntime) == "table" and type(previousThemeRuntime.stop) == "function" then
pcall(previousThemeRuntime.stop)
end
if (identifyexecutor and identifyexecutor() or ""):lower() == "delta" then
task.defer(function()
local themeRuntime = {
alive = true,
connections = {},
baseBackground = setmetatable({}, { __mode = "k" }),
baseText = setmetatable({}, { __mode = "k" }),
baseStroke = setmetatable({}, { __mode = "k" }),
baseImage = setmetatable({}, { __mode = "k" }),
}
__dcm_env.__DeltaThemeRuntime = themeRuntime
local function connectTheme(signal, callback)
if not signal then
return
end
local ok, connection = pcall(function()
return signal:Connect(callback)
end)
if ok and connection then
table.insert(themeRuntime.connections, connection)
end
end
local function getThemeRoot()
local service = cloneref and cloneref(game:GetService("CoreGui")) or game:GetService("CoreGui")
return gethui and gethui() or service
end
local function findMainGui()
local rootGui = getThemeRoot()
for _, gui in rootGui:GetChildren() do
if
gui:IsA("ScreenGui")
and gui:FindFirstChild("Executor")
and gui:FindFirstChild("Settings")
and gui:FindFirstChild("Sidebar")
then
return gui
end
end
end
local mainGui = findMainGui()
local attempts = 0
while themeRuntime.alive and not mainGui and attempts < 100 do
attempts += 1
task.wait(0.1)
mainGui = findMainGui()
end
if not (themeRuntime.alive and mainGui) then
return
end
local settingsPath = "DeltaCustom/Settings.json"
local function readThemeConfig()
if type(isfile) ~= "function" or type(readfile) ~= "function" or not isfile(settingsPath) then
return {}
end
local ok, raw = pcall(readfile, settingsPath)
if not ok or type(raw) ~= "string" or raw == "" then
return {}
end
local decodedOk, decoded = pcall(function()
return __lt.cm("HttpService", "JSONDecode", raw)
end)
return decodedOk and type(decoded) == "table" and decoded or {}
end
local function saveTheme(name)
local config = readThemeConfig()
config.DeltaTheme = { name = name }
writeJsonFile(settingsPath, config)
end
local function capture(object)
if not object then
return
end
if
object:IsA("Frame")
or object:IsA("ImageLabel")
or object:IsA("ImageButton")
or object:IsA("TextButton")
or object:IsA("TextBox")
or object:IsA("ScrollingFrame")
then
if themeRuntime.baseBackground[object] == nil then
themeRuntime.baseBackground[object] = object.BackgroundColor3
end
end
if object:IsA("TextLabel") or object:IsA("TextButton") or object:IsA("TextBox") then
if themeRuntime.baseText[object] == nil then
themeRuntime.baseText[object] = object.TextColor3
end
end
if object:IsA("UIStroke") and themeRuntime.baseStroke[object] == nil then
themeRuntime.baseStroke[object] = object.Color
end
if (object:IsA("ImageLabel") or object:IsA("ImageButton")) and themeRuntime.baseImage[object] == nil then
themeRuntime.baseImage[object] = object.ImageColor3
end
end
capture(mainGui)
for _, object in mainGui:GetDescendants() do
capture(object)
end
local palettes = {
Light = {
root = Color3.fromRGB(242, 244, 248),
panel = Color3.fromRGB(229, 232, 239),
card = Color3.fromRGB(216, 221, 230),
card2 = Color3.fromRGB(205, 211, 221),
text = Color3.fromRGB(27, 33, 44),
muted = Color3.fromRGB(91, 101, 118),
stroke = Color3.fromRGB(178, 188, 204),
icon = Color3.fromRGB(69, 79, 96),
accent = Color3.fromRGB(79, 164, 242),
},
Amoled = {
root = Color3.fromRGB(0, 0, 0),
panel = Color3.fromRGB(5, 5, 7),
card = Color3.fromRGB(10, 10, 13),
card2 = Color3.fromRGB(15, 15, 19),
text = Color3.fromRGB(244, 247, 250),
muted = Color3.fromRGB(143, 150, 162),
stroke = Color3.fromRGB(29, 30, 36),
icon = Color3.fromRGB(224, 229, 236),
accent = Color3.fromRGB(79, 164, 242),
},
}
local function isAccent(color)
local hue, saturation, value = Color3.toHSV(color)
return saturation >= 0.34 and value >= 0.28 and hue >= 0.48 and hue <= 0.72
end
local function isControlColorPart(object)
local current = object
while current and current ~= mainGui do
local name = current.Name
if
name == "Hue"
or name == "Sat"
or name == "Val"
or name == "Knob"
or name == "ColorSlider"
or name == "ColorValue"
then
return true
end
current = current.Parent
end
return false
end
local function backgroundRole(object, palette)
local name = string.lower(object.Name or "")
if name == "darkoverlay" then
return Color3.new(0, 0, 0)
end
if
name:find("overlay")
or name == "settings"
or name == "executor"
or name == "home"
or name == "scripthub"
or name == "console"
or name == "music"
then
return palette.root
end
if
name:find("button")
or name:find("tab")
or name:find("card")
or name:find("script")
or name:find("network")
or name:find("search")
or name:find("dropdown")
or name:find("setting")
then
return palette.card
end
if object:IsA("TextBox") or object:IsA("TextButton") or object:IsA("ImageButton") then
return palette.card2
end
return palette.panel
end
local function restoreObject(object)
local background = themeRuntime.baseBackground[object]
if background ~= nil and object.Parent then
pcall(function()
object.BackgroundColor3 = background
end)
end
local textColor = themeRuntime.baseText[object]
if textColor ~= nil and object.Parent then
pcall(function()
object.TextColor3 = textColor
end)
end
local strokeColor = themeRuntime.baseStroke[object]
if strokeColor ~= nil and object.Parent then
pcall(function()
object.Color = strokeColor
end)
end
local imageColor = themeRuntime.baseImage[object]
if imageColor ~= nil and object.Parent then
pcall(function()
object.ImageColor3 = imageColor
end)
end
end
local function applyObject(object, themeName)
if object:GetAttribute("LT_SyntaxOverlay") then
return
end
capture(object)
if themeName == "Default" then
restoreObject(object)
return
end
local palette = palettes[themeName]
if not palette or isControlColorPart(object) then
return
end
local background = themeRuntime.baseBackground[object]
if background ~= nil then
pcall(function()
object.BackgroundColor3 = isAccent(background) and background or backgroundRole(object, palette)
end)
end
local textColor = themeRuntime.baseText[object]
if textColor ~= nil then
local name = string.lower(object.Name or "")
pcall(function()
object.TextColor3 = isAccent(textColor) and textColor
or ((name == "desc" or name:find("description") or name:find("placeholder")) and palette.muted or palette.text)
end)
end
local strokeColor = themeRuntime.baseStroke[object]
if strokeColor ~= nil then
pcall(function()
object.Color = isAccent(strokeColor) and strokeColor or palette.stroke
end)
end
local imageColor = themeRuntime.baseImage[object]
if imageColor ~= nil then
local _, saturation = Color3.toHSV(imageColor)
local name = string.lower(object.Name or "")
if saturation <= 0.28 or name == "checked" or name:find("icon") or name == "imagebutton" then
pcall(function()
object.ImageColor3 = isAccent(imageColor) and imageColor or (name == "checked" and palette.accent or palette.icon)
end)
end
end
end
local function getThemeDropdown()
local executor = mainGui:FindFirstChild("Executor")
local image = executor and executor:FindFirstChild("Executor")
local overlay = image and image:FindFirstChild("Overlay")
local menu = overlay and overlay:FindFirstChild("Menu", true)
return menu and menu:FindFirstChild("Dropdown")
end
local themeMap = { Option1 = "Default", Option2 = "Light", Option3 = "Amoled" }
local function syncChecks(themeName)
local dropdown = getThemeDropdown()
for optionName, name in themeMap do
local option = dropdown and dropdown:FindFirstChild(optionName)
local checked = option and option:FindFirstChild("Checked", true)
if checked and checked:IsA("GuiObject") then
checked.Visible = name == themeName
end
end
end
local currentTheme = "Default"
local applying = false
local function applyTheme(themeName, persist)
if applying or not themeRuntime.alive then
return
end
themeName = themeName == "Light" and "Light" or themeName == "Amoled" and "Amoled" or "Default"
applying = true
currentTheme = themeName
applyObject(mainGui, themeName)
for _, object in mainGui:GetDescendants() do
applyObject(object, themeName)
end
syncChecks(themeName)
if persist then
saveTheme(themeName)
end
applying = false
end
themeRuntime.applyTheme = applyTheme
themeRuntime.stop = function()
if not themeRuntime.alive then
return
end
if currentTheme ~= "Default" then
applyTheme("Default", false)
end
themeRuntime.alive = false
for i = #themeRuntime.connections, 1, -1 do
pcall(function()
themeRuntime.connections[i]:Disconnect()
end)
end
table.clear(themeRuntime.connections)
if rawget(__dcm_env, "__DeltaThemeRuntime") == themeRuntime then
__dcm_env.__DeltaThemeRuntime = nil
end
end
local boundOptions = setmetatable({}, { __mode = "k" })
local function bindOption(option, themeName)
if not (option and option:IsA("GuiButton")) or boundOptions[option] then
return
end
boundOptions[option] = true
local locked = false
local function choose()
if locked then
return
end
locked = true
task.defer(applyTheme, themeName, true)
task.delay(0.12, function()
locked = false
end)
end
connectTheme(option.MouseButton1Click, choose)
connectTheme(option.Activated, choose)
connectTheme(option.TouchTap, choose)
end
local function bindThemeOptions()
local dropdown = getThemeDropdown()
if not dropdown then
return
end
for optionName, themeName in themeMap do
bindOption(dropdown:FindFirstChild(optionName), themeName)
end
end
bindThemeOptions()
connectTheme(mainGui.DescendantAdded, function(object)
task.defer(function()
if not (themeRuntime.alive and object and object.Parent) then
return
end
capture(object)
if object:IsA("GuiObject") or object:IsA("UIStroke") then
applyObject(object, currentTheme)
end
if object:IsA("GuiButton") and themeMap[object.Name] and object.Parent and object.Parent.Name == "Dropdown" then
bindOption(object, themeMap[object.Name])
end
end)
end)
local config = readThemeConfig()
local savedTheme = type(config.DeltaTheme) == "table" and config.DeltaTheme.name or nil
applyTheme(savedTheme, false)
end)
end
end
do
local previous = rawget(__dcm_env, "__DeltaCustomizationV2Runtime")
if type(previous) == "table" and type(previous.stop) == "function" then
pcall(previous.stop)
end
local runtime = {
alive = true,
version = "2.5.5",
connections = {},
instances = {},
originalButtons = setmetatable({}, { __mode = "k" }),
restorers = {},
}
__dcm_env.__DeltaCustomizationV2Runtime = runtime
__dcm_shared.__DeltaCustomizationV2Runtime = runtime
local function addConnection(connection)
if connection then
table.insert(runtime.connections, connection)
end
return connection
end
local function connect(signal, callback)
if not signal then
return nil
end
local ok, connection = pcall(function()
return signal:Connect(callback)
end)
if ok then
return addConnection(connection)
end
return nil
end
local function addRestorer(callback)
if type(callback) == "function" then
table.insert(runtime.restorers, callback)
end
end
local function track(instance)
if instance then
table.insert(runtime.instances, instance)
end
return instance
end
local function restoreOriginalButtons()
for button, wasVisible in runtime.originalButtons do
if button and button.Parent then
pcall(function()
local nativeVisible = button:GetAttribute("LT_NativeVisible")
button.Visible = typeof(nativeVisible) == "boolean" and nativeVisible or wasVisible
end)
end
end
table.clear(runtime.originalButtons)
end
runtime.stop = function()
if not runtime.alive then
return
end
runtime.alive = false
restoreOriginalButtons()
for i = #runtime.restorers, 1, -1 do
pcall(runtime.restorers[i])
end
table.clear(runtime.restorers)
for name in _naConns do
NAlib.disconnect(name)
end
for i = #runtime.connections, 1, -1 do
local connection = runtime.connections[i]
pcall(function()
connection:Disconnect()
end)
end
table.clear(runtime.connections)
for i = #runtime.instances, 1, -1 do
local instance = runtime.instances[i]
if instance and instance.Parent then
pcall(function()
instance:Destroy()
end)
end
end
table.clear(runtime.instances)
if rawget(__dcm_env, "__DeltaCustomizationV2Runtime") == runtime then
__dcm_env.__DeltaCustomizationV2Runtime = nil
end
if rawget(__dcm_shared, "__DeltaCustomizationV2Runtime") == runtime then
__dcm_shared.__DeltaCustomizationV2Runtime = nil
end
end
NAlib.disconnect("FpsCap_Enforce")
local function findMainGui()
local best
local bestScore = 0
for _, gui in root:GetChildren() do
if gui:IsA("ScreenGui") then
local score = 0
for _, name in { "Executor", "Sidebar", "Scripthub", "Settings", "Home", "Console" } do
if gui:FindFirstChild(name) then
score += (name == "Executor" or name == "Sidebar") and 4 or 2
elseif gui:FindFirstChild(name, true) then
score += 1
end
end
if score > bestScore then
best = gui
bestScore = score
end
end
end
if bestScore >= 10 then
return best
end
end
local v2Main = findMainGui()
local attempts = 0
while runtime.alive and not v2Main and attempts < 80 do
attempts += 1
task.wait(0.1)
v2Main = findMainGui()
end
if not (runtime.alive and v2Main) then
return
end
local executorRoot = v2Main:FindFirstChild("Executor") or v2Main:FindFirstChild("Executor", true)
local executorImage = executorRoot and executorRoot:FindFirstChild("Executor")
local executorOverlay = executorImage and executorImage:FindFirstChild("Overlay")
local tabsFrame = executorOverlay and executorOverlay:FindFirstChild("Tabs", true)
local codeFrame = executorOverlay and executorOverlay:FindFirstChild("Code", true)
local buttonsFrame = executorOverlay and executorOverlay:FindFirstChild("Buttons", true)
if not (executorOverlay and tabsFrame and codeFrame and buttonsFrame) then
return
end
for _, object in codeFrame:GetChildren() do
if object:GetAttribute("LT_SyntaxOverlay") or object.Name:match("^LT_Syntax_") then
object:Destroy()
elseif object:IsA("TextBox") and object.Name:match("^script%d+%.lua$") then
local originalTransparency = object:GetAttribute("LT_SyntaxOriginalTransparency")
local originalZ = object:GetAttribute("LT_SyntaxOriginalZIndex")
object.TextTransparency = typeof(originalTransparency) == "number" and originalTransparency or 0
object.ZIndex = typeof(originalZ) == "number" and originalZ or 1
object:SetAttribute("LT_SyntaxOriginalTransparency", nil)
object:SetAttribute("LT_SyntaxOriginalZIndex", nil)
end
end
local staleToolbar = buttonsFrame:FindFirstChild("LT_EditorToolbar")
if staleToolbar then
staleToolbar:Destroy()
end
for _, name in { "Execute", "Clear", "ExecuteClipboard" } do
local button = buttonsFrame:FindFirstChild(name)
if button and button:IsA("GuiObject") then
button:SetAttribute("LT_NativeVisible", true)
button.Visible = true
end
end
buttonsFrame.Visible = true
local function readCurrentConfig()
local config = {}
if
type(isfile) == "function"
and type(readfile) == "function"
and isfile(settingsPath)
then
local ok, raw = pcall(readfile, settingsPath)
if ok and type(raw) == "string" and raw ~= "" then
local decodedOk, decoded = pcall(function()
return __lt.cm("HttpService", "JSONDecode", raw)
end)
if decodedOk and type(decoded) == "table" then
config = decoded
end
end
end
return config
end
local function readBool(key, defaultValue)
local config = readCurrentConfig()
local value = config[key]
if type(value) == "table" and value.enabled ~= nil then
return value.enabled and true or false
end
return defaultValue
end
local function saveBool(key, enabled)
local config = readCurrentConfig()
config[key] = { enabled = enabled and true or false }
writeJsonFile(settingsPath, config)
end
local function readNumber(key, defaultValue, minimum, maximum)
local config = readCurrentConfig()
local value = config[key]
local number = type(value) == "table" and tonumber(value.value) or nil
return math.clamp(number or defaultValue, minimum, maximum)
end
local function saveNumber(key, value)
local config = readCurrentConfig()
config[key] = { value = value }
writeJsonFile(settingsPath, config)
end
do
local config = readCurrentConfig()
if config.UiBlur ~= nil or config.UiBlurSize ~= nil then
config.UiBlur = nil
config.UiBlurSize = nil
writeJsonFile(settingsPath, config)
end
end
local autoRestoreEnabled = readBool("AutoRestoreTabs", true)
local editorToolbarEnabled = readBool("EditorToolbar", true)
local editorStatusEnabled = readBool("EditorStatus", true)
local wideEditorEnabled = readBool("WideEditor", false)
local compactTabsEnabled = readBool("CompactTabs", false)
local editorWordWrapEnabled = readBool("EditorWordWrap", false)
local syntaxHighlightEnabled = readBool("EditorSyntaxHighlight", true)
local exploitSyntaxEnabled = readBool("ExploitSyntaxHighlight", true)
local editorFontSize = math.floor(readNumber("EditorFontSize", 14, 10, 24) + 0.5)
local toolbarButtons = {}
local toolbarLayout = buttonsFrame:FindFirstChildOfClass("UIListLayout")
local originalToolbarPadding = toolbarLayout and toolbarLayout.Padding or nil
local nativeButtonOriginals = setmetatable({}, { __mode = "k" })
local statusFrame
local statusLabel
local editorCanvas
local originalCodePosition = codeFrame.Position
local originalCodeSize = codeFrame.Size
local originalButtonsVisible = buttonsFrame.Visible
local statusUpdateQueued = false
local hookedBoxes = setmetatable({}, { __mode = "k" })
local sidebar = v2Main:FindFirstChild("Sidebar") or v2Main:FindFirstChild("Sidebar", true)
local sidebarLayout = sidebar and sidebar:FindFirstChildOfClass("UIListLayout")
local originalSidebarSortOrder = sidebarLayout and sidebarLayout.SortOrder or nil
local sidebarNames = { "Home", "Executor", "Scripthub", "Music", "Console", "Settings", "ToggleUI" }
local sidebarNameSet = {}
local sidebarOriginalOrders = setmetatable({}, { __mode = "k" })
for _, name in sidebarNames do
sidebarNameSet[name] = true
local button = sidebar and sidebar:FindFirstChild(name)
if button and button:IsA("GuiObject") then
sidebarOriginalOrders[button] = button.LayoutOrder
end
end
local function normalizeSidebarOrder(value)
local result = {}
local used = {}
if type(value) == "table" then
for _, name in value do
if sidebarNameSet[name] and not used[name] then
used[name] = true
table.insert(result, name)
end
end
end
local musicWasMissing = not used.Music
for _, name in sidebarNames do
if not used[name] then
used[name] = true
table.insert(result, name)
end
end
if musicWasMissing then
local musicIndex = table.find(result, "Music")
if musicIndex then
table.remove(result, musicIndex)
local hubIndex = table.find(result, "Scripthub") or math.min(3, #result)
table.insert(result, hubIndex + 1, "Music")
end
end
return result
end
local function readSidebarOrder()
local config = readCurrentConfig()
local saved = config.SidebarButtonOrder
if type(saved) == "table" and type(saved.order) == "table" then
saved = saved.order
end
return normalizeSidebarOrder(saved)
end
local sidebarOrder = readSidebarOrder()
local sidebarApplyingOrder = false
local function saveSidebarOrder()
local config = readCurrentConfig()
config.SidebarButtonOrder = { order = table.clone(sidebarOrder) }
writeJsonFile(settingsPath, config)
end
local function applySidebarOrder()
if sidebarApplyingOrder or not sidebar then
return
end
sidebarApplyingOrder = true
if sidebarLayout then
sidebarLayout.SortOrder = Enum.SortOrder.LayoutOrder
end
for index, name in sidebarOrder do
local button = sidebar:FindFirstChild(name)
if button and button:IsA("GuiObject") then
if sidebarOriginalOrders[button] == nil then
sidebarOriginalOrders[button] = button.LayoutOrder
end
button.LayoutOrder = index
end
end
sidebarApplyingOrder = false
end
local function moveSidebarButton(name, direction)
local index = table.find(sidebarOrder, name)
if not index then
return
end
local target = math.clamp(index + direction, 1, #sidebarOrder)
if target == index then
return
end
sidebarOrder[index], sidebarOrder[target] = sidebarOrder[target], sidebarOrder[index]
applySidebarOrder()
saveSidebarOrder()
end
local function getCodeBoxes()
local boxes = {}
for _, object in codeFrame:GetDescendants() do
if object:IsA("TextBox") and object.Name:match("^script%d+%.lua$") then
table.insert(boxes, object)
end
end
table.sort(boxes, function(a, b)
local ai = tonumber(a.Name:match("%d+")) or math.huge
local bi = tonumber(b.Name:match("%d+")) or math.huge
return ai < bi
end)
return boxes
end
local function getActiveCodeBox()
local focused = UIS and UIS:GetFocusedTextBox()
if focused and focused:IsDescendantOf(codeFrame) then
return focused
end
for _, box in getCodeBoxes() do
if box.Visible then
return box
end
end
return getCodeBoxes()[1]
end
runtime.clipboardCache = tostring(runtime.clipboardCache or "")
local function writeClipboard(value)
value = tostring(value or "")
runtime.clipboardCache = value
local writer = type(setclipboard) == "function" and setclipboard
or type(toclipboard) == "function" and toclipboard
or type(setrbxclipboard) == "function" and setrbxclipboard
if writer then
pcall(writer, value)
end
return writer ~= nil
end
local function readClipboard()
local reader = type(getclipboard) == "function" and getclipboard
or type(readclipboard) == "function" and readclipboard
if reader then
local ok, value = pcall(reader)
if ok and type(value) == "string" then
runtime.clipboardCache = value
return value, true
end
end
if runtime.clipboardCache ~= "" then
return runtime.clipboardCache, false
end
return nil, false
end
local function insertIntoActive(text)
local box = getActiveCodeBox()
if not box then
return false
end
text = tostring(text or "")
local current = box.Text or ""
local cursor = tonumber(box.CursorPosition) or -1
if cursor < 1 or cursor > #current + 1 then
cursor = #current + 1
end
box.Text = current:sub(1, cursor - 1) .. text .. current:sub(cursor)
local nextCursor = cursor + #text
task.defer(function()
if box and box.Parent then
pcall(function()
box:CaptureFocus()
box.CursorPosition = nextCursor
box.SelectionStart = nextCursor
end)
end
end)
return true
end
local function copyActiveCode()
local box = getActiveCodeBox()
if not box then
return
end
writeClipboard(box.Text or "")
notify({
Title = "Delta Customization",
Description = "Copied the active editor tab.",
Duration = 3,
})
end
local function pasteIntoActive()
local value = readClipboard()
if type(value) == "string" then
insertIntoActive(value)
return
end
notify({
Title = "Delta Customization",
Description = "Clipboard access is unavailable in this Delta build.",
Duration = 5,
})
end
local function executeSource(source, chunkName)
source = tostring(source or "")
if type(loadstring) ~= "function" then
notify({
Title = "Delta Customization",
Description = "Script execution is unavailable in this Delta build.",
Duration = 5,
})
return false
end
local compiled, compileError = loadstring(source, chunkName or "=Delta V2")
if not compiled then
notify({
Title = "Delta V2 compile error",
Description = tostring(compileError or "Unknown compile error"),
Duration = 7,
})
return false
end
task.spawn(function()
local ok, runtimeError = xpcall(compiled, function(message)
return tostring(message)
end)
if not ok then
notify({
Title = "Delta V2 runtime error",
Description = tostring(runtimeError or "Unknown runtime error"),
Duration = 7,
})
end
end)
return true
end
local function executeActiveCode()
local box = getActiveCodeBox()
if not box then
return false
end
return executeSource(box.Text or "", "=" .. tostring(box.Name))
end
local function clearActiveCode()
local box = getActiveCodeBox()
if not box then
return false
end
box.Text = ""
task.defer(function()
if box and box.Parent then
pcall(function()
box.CursorPosition = 1
box.SelectionStart = -1
end)
end
end)
return true
end
local function executeClipboardCode()
local value = readClipboard()
if type(value) ~= "string" then
notify({
Title = "Delta Customization",
Description = "Clipboard access is unavailable in this Delta build.",
Duration = 5,
})
return false
end
return executeSource(value, "=Delta V2 Clipboard")
end
local function activateOriginal(button)
if not button then
return false
end
if type(firesignal) == "function" then
if type(getconnections) == "function" then
for _, signalName in { "MouseButton1Click", "Activated" } do
local signal = button[signalName]
local ok, connections = pcall(getconnections, signal)
if ok and type(connections) == "table" and #connections > 0 then
local fired = pcall(firesignal, signal)
if fired then
return true
end
end
end
end
local ok = pcall(firesignal, button.MouseButton1Click)
if ok then
return true
end
end
return pcall(function()
button:Activate()
end)
end
local function removeScripts(instance)
for _, object in instance:GetDescendants() do
if object:IsA("LuaSourceContainer") then
object:Destroy()
end
end
end
local function setButtonTitle(button, text)
local title = button:FindFirstChild("Title", true) or button:FindFirstChildWhichIsA("TextLabel", true)
if title and title:IsA("TextLabel") then
title.Text = text
end
end
local function captureNativeButton(button)
if not (button and button:IsA("GuiObject")) or nativeButtonOriginals[button] then
return
end
local title = button:FindFirstChild("Title", true) or button:FindFirstChildWhichIsA("TextLabel", true)
nativeButtonOriginals[button] = {
Size = button.Size,
LayoutOrder = button.LayoutOrder,
Title = title,
Text = title and title.Text or nil,
TextScaled = title and title.TextScaled or nil,
TextSize = title and title.TextSize or nil,
TextTruncate = title and title.TextTruncate or nil,
}
end
local function restoreNativeButton(button)
local original = nativeButtonOriginals[button]
if not (original and button and button.Parent) then
return
end
button.Size = original.Size
button.LayoutOrder = original.LayoutOrder
button.Visible = true
local title = original.Title
if title and title.Parent then
title.Text = original.Text
title.TextScaled = original.TextScaled
title.TextSize = original.TextSize
title.TextTruncate = original.TextTruncate
end
end
local function styleNativeButton(button, text, width, order)
if not (button and button:IsA("GuiObject")) then
return
end
captureNativeButton(button)
button.Visible = true
button.Size = UDim2.new(width, 0, 0.7, 0)
button.LayoutOrder = order
setButtonTitle(button, text)
local title = button:FindFirstChild("Title", true) or button:FindFirstChildWhichIsA("TextLabel", true)
if title and title:IsA("TextLabel") then
title.TextScaled = false
title.TextSize = buttonsFrame.AbsoluteSize.X < 650 and 10 or 12
title.TextTruncate = Enum.TextTruncate.AtEnd
end
end
local function createToolbarButton(parent, template, name, text, order, callback)
local button = template:Clone()
button.Name = name
removeScripts(button)
button.Visible = true
button.Active = true
button.Interactable = true
button.Selectable = true
button.AnchorPoint = Vector2.new(0, 0.5)
button.Position = UDim2.new(0, 0, 0.5, 0)
button.Size = UDim2.new(1 / 6, -4, 1, -6)
button.LayoutOrder = order
button.ZIndex = parent.ZIndex + 1
button.Parent = parent
for _, object in button:GetDescendants() do
if object:IsA("GuiObject") then
object.ZIndex = button.ZIndex + 1
end
end
setButtonTitle(button, text)
local title = button:FindFirstChild("Title", true) or button:FindFirstChildWhichIsA("TextLabel", true)
if title and title:IsA("TextLabel") then
title.TextScaled = false
title.TextSize = buttonsFrame.AbsoluteSize.X < 650 and 10 or 12
title.TextTruncate = Enum.TextTruncate.AtEnd
end
track(button)
local locked = false
local function activate()
if locked or not runtime.alive then
return
end
locked = true
callback()
task.delay(0.1, function()
locked = false
end)
end
if button:IsA("GuiButton") then
connect(button.MouseButton1Click, activate)
connect(button.Activated, activate)
connect(button.TouchTap, activate)
else
connect(button.InputEnded, function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
activate()
end
end)
end
return button
end
local function clearToolbar()
for i = #toolbarButtons, 1, -1 do
local button = toolbarButtons[i]
if button and button.Parent then
button:Destroy()
end
toolbarButtons[i] = nil
end
for _, name in { "LT_Copy", "LT_Paste", "LT_NewLine" } do
local stale = buttonsFrame:FindFirstChild(name)
if stale then
stale:Destroy()
end
end
for _, name in { "Execute", "Clear", "ExecuteClipboard" } do
restoreNativeButton(buttonsFrame:FindFirstChild(name))
end
if toolbarLayout and originalToolbarPadding then
toolbarLayout.Padding = originalToolbarPadding
end
end
local function addToolbarButton(template, name, text, order, width, callback)
local button = createToolbarButton(buttonsFrame, template, name, text, order, callback)
button.AnchorPoint = Vector2.new(0, 0)
button.Size = UDim2.new(width, 0, 0.7, 0)
table.insert(toolbarButtons, button)
return button
end
local function buildToolbar()
clearToolbar()
for _, name in {
"CopyCode",
"LT_EditorToolbar",
"LT_Execute",
"LT_Clear",
"LT_ExecuteClipboard",
"LT_Copy",
"LT_Paste",
"LT_NewLine",
} do
local stale = buttonsFrame:FindFirstChild(name)
if stale then
stale:Destroy()
end
end
local executeButton = buttonsFrame:FindFirstChild("Execute")
local clearButton = buttonsFrame:FindFirstChild("Clear")
local clipboardButton = buttonsFrame:FindFirstChild("ExecuteClipboard")
for _, button in { executeButton, clearButton, clipboardButton } do
if button and button:IsA("GuiObject") then
button:SetAttribute("LT_NativeVisible", true)
button.Visible = true
end
end
if not editorToolbarEnabled then
return
end
local template = clipboardButton or executeButton or clearButton
if not (executeButton and clearButton and clipboardButton and template and template:IsA("GuiObject")) then
return
end
if toolbarLayout then
toolbarLayout.Padding = UDim.new(0, 4)
end
styleNativeButton(executeButton, "RUN", 0.14, 0)
styleNativeButton(clearButton, "CLEAR", 0.13, 1)
styleNativeButton(clipboardButton, "RUN CLIP", 0.20, 2)
addToolbarButton(template, "LT_Copy", "COPY", 3, 0.13, copyActiveCode)
addToolbarButton(template, "LT_Paste", "PASTE", 4, 0.13, pasteIntoActive)
addToolbarButton(template, "LT_NewLine", "ADD LINE", 5, 0.16, function()
insertIntoActive("\n")
end)
end
local function updateStatusPosition()
if not (statusFrame and statusFrame.Parent and codeFrame and codeFrame.Parent == executorOverlay) then
return
end
statusFrame.Position = UDim2.new(
codeFrame.Position.X.Scale + codeFrame.Size.X.Scale * (1 - codeFrame.AnchorPoint.X),
codeFrame.Position.X.Offset + codeFrame.Size.X.Offset * (1 - codeFrame.AnchorPoint.X) - 6,
codeFrame.Position.Y.Scale + codeFrame.Size.Y.Scale * (1 - codeFrame.AnchorPoint.Y),
codeFrame.Position.Y.Offset + codeFrame.Size.Y.Offset * (1 - codeFrame.AnchorPoint.Y) - 5
)
statusFrame.Size = UDim2.new(0, math.clamp(math.floor(codeFrame.AbsoluteSize.X * 0.58), 210, 360), 0, 22)
end
local function updateStatus()
statusUpdateQueued = false
if not (statusFrame and statusLabel) then
return
end
statusFrame.Visible = editorStatusEnabled
if not editorStatusEnabled then
return
end
local box = getActiveCodeBox()
if not box then
statusLabel.Text = "No active editor tab"
return
end
local text = box.Text or ""
local _, lineBreaks = text:gsub("\n", "\n")
local lines = lineBreaks + 1
statusLabel.Text = string.format("%s • %d lines • %d chars • autosave", box.Name, lines, #text)
end
local function queueStatusUpdate()
if statusUpdateQueued then
return
end
statusUpdateQueued = true
task.defer(updateStatus)
end
local saveTokens = setmetatable({}, { __mode = "k" })
local tabDirectory = "DeltaCustom/DeltaTabs"
editorCanvas = (function()
local TextService = game:GetService("TextService")
local hooked = setmetatable({}, { __mode = "k" })
local originals = setmetatable({}, { __mode = "k" })
local resizeTokens = setmetatable({}, { __mode = "k" })
local originalCanvasSize = codeFrame.CanvasSize
local originalAutomaticCanvasSize = codeFrame.AutomaticCanvasSize
local originalCanvasPosition = codeFrame.CanvasPosition
local function effectiveScale(object)
local scale = 1
local current = object
while current do
for _, child in current:GetChildren() do
if child:IsA("UIScale") then
scale *= child.Scale
end
end
current = current.Parent
end
return math.max(scale, 0.05)
end
local function remember(box)
if originals[box] == nil then
originals[box] = {
AutomaticSize = box.AutomaticSize,
Position = box.Position,
Size = box.Size,
}
end
end
local function resize(box)
if not (runtime.alive and box and box.Parent and box:IsA("TextBox")) then
return
end
remember(box)
local token = (resizeTokens[box] or 0) + 1
resizeTokens[box] = token
task.defer(function()
if not (runtime.alive and box.Parent and resizeTokens[box] == token) then
return
end
local scale = effectiveScale(codeFrame)
local windowWidth = math.max(140, math.floor(codeFrame.AbsoluteWindowSize.X / scale))
local windowHeight = math.max(100, math.floor(codeFrame.AbsoluteWindowSize.Y / scale))
local availableTextWidth = math.max(120, windowWidth - 20)
local text = box.Text ~= "" and box.Text or " "
local params = Instance.new("GetTextBoundsParams")
params.Text = text
params.Width = box.TextWrapped and availableTextWidth or 1000000
params.Font = box.FontFace
params.Size = box.TextSize
local ok, bounds = pcall(function()
return TextService:GetTextBoundsAsync(params)
end)
params:Destroy()
local _, lineBreaks = (box.Text or ""):gsub("\n", "\n")
local lineHeight = math.max(1, box.LineHeight) * box.TextSize
local minimumTextHeight = math.ceil((lineBreaks + 1) * lineHeight)
if not ok then
bounds = Vector2.new(availableTextWidth, minimumTextHeight)
end
if not (runtime.alive and box.Parent and resizeTokens[box] == token) then
return
end
local measuredWidth = math.ceil(bounds.X)
local measuredHeight = math.max(math.ceil(bounds.Y), minimumTextHeight)
local contentWidth = box.TextWrapped
and availableTextWidth
or math.max(availableTextWidth, measuredWidth + 28)
local contentHeight = math.max(windowHeight - 12, measuredHeight + math.ceil(lineHeight) + 28)
local canvasWidth = box.TextWrapped
and windowWidth
or math.max(windowWidth, 8 + contentWidth + 32)
local canvasHeight = math.max(windowHeight, 6 + contentHeight + 36)
box.AutomaticSize = Enum.AutomaticSize.None
box.Position = UDim2.fromOffset(8, 6)
box.Size = UDim2.fromOffset(contentWidth, contentHeight)
if box.Visible then
codeFrame.AutomaticCanvasSize = Enum.AutomaticSize.None
codeFrame.CanvasSize = UDim2.fromOffset(canvasWidth, canvasHeight)
local maximumX = math.max(0, canvasWidth - windowWidth)
local maximumY = math.max(0, canvasHeight - windowHeight)
codeFrame.CanvasPosition = Vector2.new(
math.clamp(codeFrame.CanvasPosition.X, 0, maximumX),
math.clamp(codeFrame.CanvasPosition.Y, 0, maximumY)
)
end
end)
end
local function hook(box)
if hooked[box] or not box:IsA("TextBox") or not box.Name:match("^script%d+%.lua$") then
return
end
hooked[box] = true
remember(box)
for _, property in { "Text", "Visible", "TextWrapped", "TextSize", "FontFace", "LineHeight" } do
connect(box:GetPropertyChangedSignal(property), function()
resize(box)
end)
end
resize(box)
end
local function resizeAll()
for _, box in getCodeBoxes() do
hook(box)
resize(box)
end
end
local function restore()
if codeFrame and codeFrame.Parent then
codeFrame.AutomaticCanvasSize = originalAutomaticCanvasSize
codeFrame.CanvasSize = originalCanvasSize
codeFrame.CanvasPosition = originalCanvasPosition
end
for box, values in originals do
if box and box.Parent then
box.AutomaticSize = values.AutomaticSize
box.Position = values.Position
box.Size = values.Size
end
end
end
connect(codeFrame:GetPropertyChangedSignal("AbsoluteSize"), resizeAll)
pcall(function()
connect(codeFrame:GetPropertyChangedSignal("AbsoluteWindowSize"), resizeAll)
end)
return { hook = hook, resize = resize, resizeAll = resizeAll, restore = restore }
end)()
local function applyToolbarLayout()
buttonsFrame.Visible = true
codeFrame.Position = originalCodePosition
codeFrame.Size = originalCodeSize
task.defer(updateStatusPosition)
task.delay(0.05, function()
if runtime.alive then
editorCanvas.resizeAll()
end
end)
end
addRestorer(function()
for button, layoutOrder in sidebarOriginalOrders do
if button and button.Parent then
button.LayoutOrder = layoutOrder
end
end
if sidebarLayout and originalSidebarSortOrder then
sidebarLayout.SortOrder = originalSidebarSortOrder
end
end)
if sidebar then
applySidebarOrder()
connect(sidebar.ChildAdded, function(object)
if sidebarNameSet[object.Name] and object:IsA("GuiObject") then
task.defer(applySidebarOrder)
end
end)
end
addRestorer(function()
if codeFrame and codeFrame.Parent then
codeFrame.Position = originalCodePosition
codeFrame.Size = originalCodeSize
end
if buttonsFrame and buttonsFrame.Parent then
for _, name in { "LT_Copy", "LT_Paste", "LT_NewLine" } do
local button = buttonsFrame:FindFirstChild(name)
if button then
button:Destroy()
end
end
for _, name in { "Execute", "Clear", "ExecuteClipboard" } do
restoreNativeButton(buttonsFrame:FindFirstChild(name))
end
if toolbarLayout and originalToolbarPadding then
toolbarLayout.Padding = originalToolbarPadding
end
buttonsFrame.Visible = originalButtonsVisible
end
end)
local syntaxHighlighter = (function()
local overlays = setmetatable({}, { __mode = "k" })
local updateTokens = setmetatable({}, { __mode = "k" })
local keywords = {
["and"] = true, ["break"] = true, ["continue"] = true, ["do"] = true,
["else"] = true, ["elseif"] = true, ["end"] = true, ["export"] = true,
["false"] = true, ["for"] = true, ["function"] = true, ["if"] = true,
["in"] = true, ["local"] = true, ["nil"] = true, ["not"] = true,
["or"] = true, ["repeat"] = true, ["return"] = true, ["then"] = true,
["true"] = true, ["type"] = true, ["until"] = true, ["while"] = true,
}
local builtins = {
assert = true, collectgarbage = true, error = true, getfenv = true, getmetatable = true,
ipairs = true, load = true, loadstring = true, next = true, pairs = true, pcall = true,
print = true, rawequal = true, rawget = true, rawlen = true, rawset = true, require = true,
select = true, setfenv = true, setmetatable = true, tonumber = true, tostring = true,
typeof = true, unpack = true, warn = true, xpcall = true,
bit32 = true, buffer = true, coroutine = true, debug = true, math = true, os = true,
string = true, table = true, task = true, utf8 = true, vector = true,
Axes = true, BrickColor = true, CFrame = true, Color3 = true, ColorSequence = true,
ColorSequenceKeypoint = true, DateTime = true, DockWidgetPluginGuiInfo = true,
Enum = true, Faces = true, Font = true, Instance = true, NumberRange = true,
NumberSequence = true, NumberSequenceKeypoint = true, OverlapParams = true,
PathWaypoint = true, PhysicalProperties = true, Random = true, Ray = true,
RaycastParams = true, Rect = true, Region3 = true, Region3int16 = true,
TweenInfo = true, UDim = true, UDim2 = true, Vector2 = true, Vector2int16 = true,
Vector3 = true, Vector3int16 = true,
any = true, boolean = true, never = true, number = true, string = true,
table = true, thread = true, unknown = true,
}
local globals = {
_G = true, game = true, plugin = true, script = true, shared = true, workspace = true,
}
local executorApis = {
appendfile = true, base64_decode = true, base64_encode = true, base64decode = true,
base64encode = true, checkcaller = true, checkclosure = true, cloneref = true,
clonefunction = true, compareinstances = true, crypt = true, decompile = true,
delfile = true, delfolder = true, dofile = true, Drawing = true, dumpstring = true,
fireclickdetector = true, fireproximityprompt = true, firesignal = true,
firetouchinterest = true, fluxus = true, getcallbackvalue = true, getcallingscript = true,
getclipboard = true, getconnections = true, getconstant = true, getconstants = true,
getcustomasset = true, getexecutorname = true, getfflag = true, getfflags = true,
getfpscap = true, getgc = true, getgenv = true, gethiddenproperties = true,
gethiddenproperty = true, gethui = true, getidentity = true, getinstances = true,
getloadedmodules = true, getnamecallmethod = true, getnilinstances = true,
getproto = true, getprotos = true, getrawmetatable = true, getreg = true,
getrenv = true, getrunningscripts = true, getscriptbytecode = true,
getscriptclosure = true, getscriptfromthread = true, getscriptfunction = true,
getscripts = true, getstack = true, getsynasset = true, getthreadidentity = true,
getupvalue = true, getupvalues = true, hookfunction = true, hookmetamethod = true,
http_request = true, identifyexecutor = true, is_c_closure = true, iscclosure = true,
isexecutorclosure = true, isfile = true, isfolder = true, iskrnlclosure = true,
islclosure = true, isourclosure = true, isreadonly = true, isscriptable = true,
listfiles = true, loadfile = true, lz4compress = true, lz4decompress = true,
make_readonly = true, make_writeable = true, makefolder = true, newcclosure = true,
protect_gui = true, queue_on_teleport = true, queueonteleport = true, readclipboard = true,
readfile = true, replaceclosure = true, request = true, saveinstance = true,
setclipboard = true, setconstant = true, setfflag = true, setfpscap = true,
sethiddenproperty = true, setidentity = true, setnamecallmethod = true,
setproto = true, setreadonly = true, setrbxclipboard = true, setscriptable = true,
setstack = true, setthreadidentity = true, setupvalue = true, syn = true,
toclipboard = true, unprotect_gui = true, WebSocket = true, websocket = true,
writeclipboard = true, writefile = true,
}
local function escape(value)
return tostring(value or ""):gsub("&", "&"):gsub("<", "<"):gsub(">", ">")
end
local function palette()
local background = codeFrame.BackgroundColor3
local light = background.R * 0.299 + background.G * 0.587 + background.B * 0.114 > 0.58
if light then
return {
text = Color3.fromRGB(25, 30, 42), keyword = "#AF00DB", builtin = "#267F99",
global = "#001080", func = "#795E26", string = "#A31515",
number = "#098658", comment = "#008000", executor = "#B44700",
}
end
return {
text = Color3.fromRGB(218, 222, 232), keyword = "#C586C0", builtin = "#4EC9B0",
global = "#9CDCFE", func = "#DCDCAA", string = "#CE9178",
number = "#B5CEA8", comment = "#6A9955", executor = "#FF9E64",
}
end
local function paint(value, color)
return '' .. escape(value) .. ""
end
local function longBracketAt(source, index)
local equals = source:sub(index):match("^%[(=*)%[")
if equals == nil then
return nil
end
local closing = "]" .. equals .. "]"
local finish = source:find(closing, index + #equals + 2, true)
return finish and finish + #closing - 1 or #source
end
local function tokenize(source)
local colors = palette()
local output = table.create(math.max(32, math.floor(#source / 6)))
local index = 1
local expectFunctionName = false
while index <= #source do
local char = source:sub(index, index)
local pair = source:sub(index, index + 1)
if pair == "--" then
local longFinish = longBracketAt(source, index + 2)
local finish = longFinish or ((source:find("\n", index + 2, true) or (#source + 1)) - 1)
output[#output + 1] = paint(source:sub(index, finish), colors.comment)
index = finish + 1
elseif char == "\"" or char == "'" then
local quote = char
local finish = index + 1
while finish <= #source do
local current = source:sub(finish, finish)
if current == "\\" then
finish += 2
elseif current == quote then
break
else
finish += 1
end
end
finish = math.min(finish, #source)
output[#output + 1] = paint(source:sub(index, finish), colors.string)
index = finish + 1
elseif char == "[" then
local finish = longBracketAt(source, index)
if finish then
output[#output + 1] = paint(source:sub(index, finish), colors.string)
index = finish + 1
else
output[#output + 1] = escape(char)
index += 1
end
elseif char:match("[%a_]") then
local finish = index
while finish < #source and source:sub(finish + 1, finish + 1):match("[%w_]") do
finish += 1
end
local word = source:sub(index, finish)
local color
if keywords[word] then
color = colors.keyword
expectFunctionName = word == "function"
elseif exploitSyntaxEnabled and executorApis[word] then
color = colors.executor
elseif builtins[word] then
color = colors.builtin
elseif globals[word] then
color = colors.global
else
local nextIndex = finish + 1
while nextIndex <= #source and source:sub(nextIndex, nextIndex):match("%s") do
nextIndex += 1
end
if expectFunctionName or source:sub(nextIndex, nextIndex) == "(" then
color = colors.func
end
expectFunctionName = false
end
output[#output + 1] = color and paint(word, color) or escape(word)
index = finish + 1
elseif char:match("%d") or (char == "." and source:sub(index + 1, index + 1):match("%d")) then
local rest = source:sub(index)
local number = rest:match("^0[xX][%da-fA-F_]+")
or rest:match("^0[bB][01_]+")
or rest:match("^%d[%d_]*%.?[%d_]*[eE][+-]?[%d_]+")
or rest:match("^%.%d[%d_]*[eE][+-]?[%d_]+")
or rest:match("^%d[%d_]*%.?[%d_]*")
or rest:match("^%.%d[%d_]*")
number = number ~= "" and number or char
output[#output + 1] = paint(number, colors.number)
index += #number
else
output[#output + 1] = escape(char)
index += 1
end
end
return table.concat(output), colors.text
end
local function sync(box)
local state = overlays[box]
if not state then
return
end
local label = state.label
if not (box.Parent and label.Parent) then
return
end
label.AnchorPoint = box.AnchorPoint
label.Position = box.Position
label.Size = box.Size
label.Rotation = box.Rotation
label.TextXAlignment = box.TextXAlignment
label.TextYAlignment = box.TextYAlignment
label.TextWrapped = box.TextWrapped
label.FontFace = box.FontFace
label.TextSize = box.TextSize
label.LineHeight = box.LineHeight
local showOverlay = syntaxHighlightEnabled and box.Visible and box.Text ~= ""
label.Visible = showOverlay
if showOverlay then
box.TextTransparency = 1
box.ZIndex = state.originalZ + 1
label.ZIndex = state.originalZ
else
box.TextTransparency = state.originalTransparency
box.ZIndex = state.originalZ
end
end
local function update(box)
local state = overlays[box]
if not state then
return
end
sync(box)
if not syntaxHighlightEnabled then
return
end
local richText, textColor = tokenize(box.Text or "")
state.label.TextColor3 = textColor
state.label.Text = richText
end
local function queue(box)
local token = (updateTokens[box] or 0) + 1
updateTokens[box] = token
task.delay(#(box.Text or "") > 60000 and 0.08 or 0.025, function()
if runtime.alive and box.Parent and updateTokens[box] == token then
update(box)
end
end)
end
local function hook(box)
if overlays[box] or not box:IsA("TextBox") or not box.Name:match("^script%d+%.lua$") then
return
end
local label = Instance.new("TextLabel")
label.Name = "LT_Syntax_" .. box.Name
label:SetAttribute("LT_SyntaxOverlay", true)
label.BackgroundTransparency = 1
label.BorderSizePixel = 0
label.RichText = true
label.TextScaled = false
label.TextTruncate = Enum.TextTruncate.None
label.Active = false
label.Interactable = false
label.Selectable = false
label.Parent = box.Parent
track(label)
local originalTransparency = box:GetAttribute("LT_SyntaxOriginalTransparency")
if typeof(originalTransparency) ~= "number" then
originalTransparency = box.TextTransparency < 1 and box.TextTransparency or 0
end
local originalZ = box:GetAttribute("LT_SyntaxOriginalZIndex")
if typeof(originalZ) ~= "number" then
originalZ = math.max(1, box.ZIndex)
end
box:SetAttribute("LT_SyntaxOriginalTransparency", originalTransparency)
box:SetAttribute("LT_SyntaxOriginalZIndex", originalZ)
overlays[box] = {
label = label,
originalTransparency = originalTransparency,
originalZ = originalZ,
}
for _, property in {
"Text", "Visible", "Position", "Size", "AnchorPoint", "Rotation", "TextWrapped",
"TextSize", "FontFace", "LineHeight", "TextXAlignment", "TextYAlignment",
} do
connect(box:GetPropertyChangedSignal(property), function()
queue(box)
end)
end
connect(box.Destroying, function()
local state = overlays[box]
if state and state.label and state.label.Parent then
state.label:Destroy()
end
overlays[box] = nil
end)
queue(box)
end
local function applyAll()
for _, box in getCodeBoxes() do
hook(box)
update(box)
end
end
local function restore()
for box, state in overlays do
if box and box.Parent then
box.TextTransparency = state.originalTransparency
box.ZIndex = state.originalZ
box:SetAttribute("LT_SyntaxOriginalTransparency", nil)
box:SetAttribute("LT_SyntaxOriginalZIndex", nil)
end
if state.label and state.label.Parent then
state.label:Destroy()
end
end
table.clear(overlays)
end
connect(codeFrame:GetPropertyChangedSignal("BackgroundColor3"), applyAll)
return { hook = hook, sync = queue, applyAll = applyAll, restore = restore }
end)()
local function hookCodeBox(box)
if
not (box and box:IsA("TextBox") and not hookedBoxes[box])
or not box.Name:match("^script%d+%.lua$")
then
return
end
hookedBoxes[box] = true
editorCanvas.hook(box)
syntaxHighlighter.hook(box)
local path = tabDirectory .. "/" .. box.Name
if type(isfile) == "function" and type(readfile) == "function" and isfile(path) then
local ok, data = pcall(readfile, path)
if ok and type(data) == "string" then
box.Text = data
end
elseif type(writefile) == "function" then
pcall(writefile, path, box.Text or "")
end
connect(box:GetPropertyChangedSignal("Text"), function()
queueStatusUpdate()
local token = (saveTokens[box] or 0) + 1
saveTokens[box] = token
task.delay(0.3, function()
if
runtime.alive
and box.Parent
and saveTokens[box] == token
and type(writefile) == "function"
then
pcall(writefile, tabDirectory .. "/" .. box.Name, box.Text or "")
end
end)
end)
connect(box:GetPropertyChangedSignal("Visible"), queueStatusUpdate)
connect(box:GetPropertyChangedSignal("Name"), queueStatusUpdate)
connect(box.Focused, queueStatusUpdate)
end
local function buildStatus()
if statusFrame and statusFrame.Parent then
statusFrame:Destroy()
end
statusFrame = Instance.new("Frame")
statusFrame.Name = "LT_EditorStatus"
statusFrame.AnchorPoint = Vector2.new(1, 1)
statusFrame.BackgroundColor3 = Color3.fromRGB(15, 17, 22)
statusFrame.BackgroundTransparency = 0.18
statusFrame.BorderSizePixel = 0
statusFrame.ZIndex = math.max(codeFrame.ZIndex + 50, 800)
statusFrame.Visible = editorStatusEnabled
statusFrame.Parent = executorOverlay
track(statusFrame)
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 7)
corner.Parent = statusFrame
track(corner)
local stroke = Instance.new("UIStroke")
stroke.Thickness = 1
stroke.Transparency = 0.45
stroke.Color = Color3.fromRGB(79, 164, 242)
stroke.Parent = statusFrame
track(stroke)
statusLabel = Instance.new("TextLabel")
statusLabel.Name = "Text"
statusLabel.BackgroundTransparency = 1
statusLabel.Size = UDim2.new(1, -12, 1, 0)
statusLabel.Position = UDim2.new(0, 6, 0, 0)
statusLabel.Font = Enum.Font.Gotham
statusLabel.TextSize = 11
statusLabel.TextColor3 = Color3.fromRGB(222, 228, 238)
statusLabel.TextXAlignment = Enum.TextXAlignment.Right
statusLabel.TextTruncate = Enum.TextTruncate.AtEnd
statusLabel.ZIndex = statusFrame.ZIndex + 1
statusLabel.Parent = statusFrame
track(statusLabel)
updateStatusPosition()
for _, box in getCodeBoxes() do
hookCodeBox(box)
end
queueStatusUpdate()
end
local normalizingTabs = false
local managedCloseBound = setmetatable({}, { __mode = "k" })
local managedCloseBusy = setmetatable({}, { __mode = "k" })
local normalizeTabSequence
local function getOrderedTabButtons()
local entries = {}
for ordinal, tab in tabsFrame:GetChildren() do
if tab:IsA("GuiButton") and tab.Name:match("^script%d+%.lua$") then
table.insert(entries, { tab = tab, ordinal = ordinal })
end
end
table.sort(entries, function(a, b)
local ao = a.tab.LayoutOrder
local bo = b.tab.LayoutOrder
if ao ~= bo then
return ao < bo
end
local ai = tonumber(a.tab.Name:match("%d+")) or math.huge
local bi = tonumber(b.tab.Name:match("%d+")) or math.huge
if ai ~= bi then
return ai < bi
end
return a.ordinal < b.ordinal
end)
local result = {}
for _, entry in entries do
table.insert(result, entry.tab)
end
return result
end
local function closeManagedTab(tab)
if not (runtime.alive and tab and tab.Parent) then
return
end
local tabs = getOrderedTabButtons()
if #tabs <= 1 then
return
end
local index = table.find(tabs, tab)
if not index then
return
end
local boxes = getCodeBoxes()
local box = boxes[index]
local wasVisible = box and box.Visible or false
if tab.Parent then
tab:Destroy()
end
if box and box.Parent then
box:Destroy()
end
task.defer(function()
if not runtime.alive then
return
end
normalizeTabSequence()
if wasVisible then
local remaining = getCodeBoxes()
local nextBox = remaining[math.min(index, #remaining)] or remaining[#remaining]
if nextBox then
for _, current in remaining do
current.Visible = current == nextBox
end
for _, currentTab in getOrderedTabButtons() do
currentTab.BackgroundTransparency = currentTab.Name == nextBox.Name and 0 or 1
end
end
end
queueStatusUpdate()
end)
end
local function bindManagedClose(tab)
if not (tab and tab:IsA("GuiButton")) or managedCloseBound[tab] then
return
end
local closeButton = tab:FindFirstChild("ImageButton")
if not (closeButton and closeButton:IsA("GuiButton")) then
return
end
managedCloseBound[tab] = true
local function activateClose()
if managedCloseBusy[tab] then
return
end
managedCloseBusy[tab] = true
closeManagedTab(tab)
task.delay(0.1, function()
managedCloseBusy[tab] = nil
end)
end
connect(closeButton.MouseButton1Click, activateClose)
connect(closeButton.Activated, activateClose)
end
local function normalizeSavedTabFiles()
local directory = tabDirectory
if
type(isfolder) ~= "function"
or type(listfiles) ~= "function"
or type(readfile) ~= "function"
or type(writefile) ~= "function"
or not isfolder(directory)
then
return
end
local ok, files = pcall(listfiles, directory)
if not ok or type(files) ~= "table" then
return
end
local saved = {}
for _, path in files do
local name = tostring(path):match("([^/\\]+)$")
local index = name and tonumber(name:match("^script(%d+)%.lua$"))
if index then
local readOk, text = pcall(readfile, path)
if readOk and type(text) == "string" then
table.insert(saved, { index = index, name = name, text = text })
end
end
end
table.sort(saved, function(a, b)
return a.index < b.index
end)
local keep = {}
for index, item in saved do
local name = "script" .. tostring(index) .. ".lua"
keep[name] = true
pcall(writefile, directory .. "/" .. name, item.text)
end
if type(delfile) == "function" and type(isfile) == "function" then
for _, item in saved do
if not keep[item.name] then
local path = directory .. "/" .. item.name
if isfile(path) then
pcall(delfile, path)
end
end
end
end
end
normalizeTabSequence = function()
if normalizingTabs or not runtime.alive then
return
end
normalizingTabs = true
local boxes = getCodeBoxes()
local tabs = getOrderedTabButtons()
local usedTabs = setmetatable({}, { __mode = "k" })
local entries = {}
local keep = {}
for index, box in boxes do
local oldName = box.Name
local newName = "script" .. tostring(index) .. ".lua"
keep[newName] = true
local tab
for _, candidate in tabs do
if not usedTabs[candidate] and candidate.Name == oldName then
tab = candidate
break
end
end
if not tab then
for _, candidate in tabs do
if not usedTabs[candidate] then
tab = candidate
break
end
end
end
if tab then
usedTabs[tab] = true
end
table.insert(entries, {
box = box,
tab = tab,
oldName = oldName,
newName = newName,
text = box.Text or "",
})
end
for _, tab in tabs do
if not usedTabs[tab] and tab.Parent then
tab:Destroy()
end
end
for index, entry in entries do
if entry.box.Parent then
entry.box.Name = entry.newName
end
local tab = entry.tab
if tab and tab.Parent then
tab.Name = entry.newName
tab.LayoutOrder = index
local title = tab:FindFirstChild("Title", true)
if title and title:IsA("TextLabel") then
title.Text = entry.newName
end
bindManagedClose(tab)
end
end
if type(writefile) == "function" then
for _, entry in entries do
pcall(writefile, tabDirectory .. "/" .. entry.newName, entry.text)
end
end
if type(delfile) == "function" and type(isfile) == "function" then
for _, entry in entries do
if entry.oldName ~= entry.newName and not keep[entry.oldName] then
local path = tabDirectory .. "/" .. entry.oldName
if isfile(path) then
pcall(delfile, path)
end
end
end
end
queueStatusUpdate()
normalizingTabs = false
end
local function savedTabNames()
normalizeSavedTabFiles()
local names = {}
local directory = "DeltaCustom/DeltaTabs"
if type(isfolder) ~= "function" or type(listfiles) ~= "function" or not isfolder(directory) then
return names
end
local ok, files = pcall(listfiles, directory)
if not ok or type(files) ~= "table" then
return names
end
for _, path in files do
local name = tostring(path):match("([^/\\]+)$")
if name and name:match("^script%d+%.lua$") then
table.insert(names, name)
end
end
table.sort(names, function(a, b)
return (tonumber(a:match("%d+")) or math.huge) < (tonumber(b:match("%d+")) or math.huge)
end)
return names
end
local function fireAddTab(addButton)
local before = #getCodeBoxes()
local fired = activateOriginal(addButton)
if not fired then
return false
end
local deadline = os.clock() + 0.5
repeat
task.wait()
until #getCodeBoxes() > before or os.clock() >= deadline
return #getCodeBoxes() > before
end
local function selectTabByName(name)
for _, box in getCodeBoxes() do
box.Visible = box.Name == name
end
for _, tab in tabsFrame:GetChildren() do
if tab:IsA("GuiButton") and tab.Name:match("^script%d+%.lua$") then
tab.BackgroundTransparency = tab.Name == name and 0 or 1
end
end
queueStatusUpdate()
end
local function nextAvailableTabName()
local used = {}
for _, box in getCodeBoxes() do
used[tonumber(box.Name:match("%d+"))] = true
end
local index = 1
while used[index] do
index += 1
end
return "script" .. tostring(index) .. ".lua"
end
local function createFallbackTab(name)
if tabsFrame:FindFirstChild(name) and codeFrame:FindFirstChild(name, true) then
return true
end
local sourceTab
for _, object in tabsFrame:GetChildren() do
if object:IsA("GuiButton") and object.Name:match("^script%d+%.lua$") then
sourceTab = object
break
end
end
local sourceBox = getCodeBoxes()[1]
if not (sourceTab and sourceBox) then
return false
end
local index = tonumber(name:match("%d+")) or (#getCodeBoxes() + 1)
local tab = sourceTab:Clone()
tab.Name = name
tab.LayoutOrder = index
tab.BackgroundTransparency = 1
removeScripts(tab)
local title = tab:FindFirstChild("Title", true)
if title and title:IsA("TextLabel") then
title.Text = name
end
tab.Parent = tabsFrame
track(tab)
local box = sourceBox:Clone()
box.Name = name
box.Text = ""
box.Visible = false
box.Parent = sourceBox.Parent
track(box)
connect(tab.MouseButton1Click, function()
selectTabByName(name)
end)
local closeButton = tab:FindFirstChild("ImageButton")
if closeButton and closeButton:IsA("GuiButton") then
connect(closeButton.MouseButton1Click, function()
if #getCodeBoxes() <= 1 then
return
end
local wasVisible = box.Visible
if type(delfile) == "function" and type(isfile) == "function" then
local path = tabDirectory .. "/" .. name
if isfile(path) then
pcall(delfile, path)
end
end
if tab.Parent then
tab:Destroy()
end
if box.Parent then
box:Destroy()
end
if wasVisible then
local remaining = getCodeBoxes()[1]
if remaining then
selectTabByName(remaining.Name)
end
end
queueStatusUpdate()
end)
end
return true
end
local restoringTabs = false
local function restoreSavedTabs(showResult)
if restoringTabs or not runtime.alive then
return
end
restoringTabs = true
normalizeTabSequence()
local saved = savedTabNames()
local addButton = tabsFrame:FindFirstChild("AddTab")
local before = #getCodeBoxes()
local target = 0
for _, name in saved do
target = math.max(target, tonumber(name:match("%d+")) or 0)
end
local attemptsMade = 0
while runtime.alive and #getCodeBoxes() < target and attemptsMade < math.max(target * 3, 8) do
attemptsMade += 1
local nextIndex = #getCodeBoxes() + 1
local created = addButton and fireAddTab(addButton) or false
if not created then
created = createFallbackTab("script" .. tostring(nextIndex) .. ".lua")
end
if not created then
break
end
task.wait(0.08)
end
local boxes = getCodeBoxes()
if type(isfile) == "function" and type(readfile) == "function" then
for _, box in boxes do
local path = "DeltaCustom/DeltaTabs/" .. box.Name
if isfile(path) then
local ok, text = pcall(readfile, path)
if ok and type(text) == "string" then
box.Text = text
end
end
hookCodeBox(box)
end
end
queueStatusUpdate()
if showResult then
local after = #boxes
local description
if #saved == 0 then
description = "No saved tabs were found."
elseif after >= target then
description = string.format("Restored %d saved tab%s.", #saved, #saved == 1 and "" or "s")
else
description = string.format("Restored %d of %d saved tabs.", math.max(after - before, 0), #saved)
end
notify({
Title = "Delta Customization",
Description = description,
Duration = 4,
})
end
restoringTabs = false
end
local function findSettingsTemplate()
local settings = v2Main:FindFirstChild("Settings") or v2Main:FindFirstChild("Settings", true)
local holder = settings and settings:FindFirstChild("Holder")
if not holder then
return nil, nil
end
local template
for _, child in holder:GetChildren() do
if child:IsA("Frame") and child.Name == "Button" then
template = child
break
end
end
return holder, template
end
local function createSettingRow(name, titleText, descText, buttonText, callback)
local holder, template = findSettingsTemplate()
if not (holder and template) then
return nil, nil
end
local existing = holder:FindFirstChild(name)
if existing then
existing:Destroy()
end
local row = template:Clone()
row.Name = name
row.Visible = true
row.LayoutOrder = -2
removeScripts(row)
local title = row:FindFirstChild("Title", true)
local desc = row:FindFirstChild("Desc", true)
if title and title:IsA("TextLabel") then
title.Text = titleText
end
if desc and desc:IsA("TextLabel") then
desc.Text = descText
end
local button = row:FindFirstChild("Button", true)
if button and button:IsA("GuiObject") then
setButtonTitle(button, buttonText)
if button:IsA("GuiButton") then
button.Active = true
button.Interactable = true
local locked = false
local function activate()
if locked or not runtime.alive then
return
end
locked = true
callback()
task.delay(0.1, function()
locked = false
end)
end
connect(button.MouseButton1Click, activate)
connect(button.Activated, activate)
connect(button.TouchTap, activate)
else
connect(button.InputEnded, function(input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
callback()
end
end)
end
end
row.Parent = holder
track(row)
return row, button
end
local sidebarSortMenu
local sidebarSortList
local refreshSidebarSortMenu
local function makeSortButton(parent, text, position, size, callback)
local button = Instance.new("TextButton")
button.BackgroundColor3 = Color3.fromRGB(31, 31, 36)
button.BorderSizePixel = 0
button.Position = position
button.Size = size
button.Font = Enum.Font.GothamMedium
button.Text = text
button.TextColor3 = Color3.new(1, 1, 1)
button.TextSize = 12
button.AutoButtonColor = true
button.ZIndex = 10003
button.Parent = parent
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 6)
corner.Parent = button
connect(button.Activated, callback)
return button
end
local function ensureSidebarSortMenu()
if sidebarSortMenu and sidebarSortMenu.Parent then
return sidebarSortMenu
end
local menu = Instance.new("Frame")
menu.Name = "LT_SidebarSortMenu"
menu.AnchorPoint = Vector2.new(0.5, 0.5)
menu.Position = UDim2.fromScale(0.5, 0.5)
menu.Size = UDim2.fromOffset(390, 520)
menu.BackgroundColor3 = Color3.fromRGB(18, 18, 22)
menu.BorderSizePixel = 0
menu.Visible = false
menu.ZIndex = 10000
menu.Parent = v2Main
track(menu)
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 12)
corner.Parent = menu
local stroke = Instance.new("UIStroke")
stroke.Color = Color3.fromRGB(72, 72, 82)
stroke.Thickness = 1
stroke.Parent = menu
local title = Instance.new("TextLabel")
title.BackgroundTransparency = 1
title.Position = UDim2.fromOffset(18, 12)
title.Size = UDim2.new(1, -76, 0, 30)
title.Font = Enum.Font.GothamBold
title.Text = "Sidebar button order"
title.TextColor3 = Color3.new(1, 1, 1)
title.TextSize = 17
title.TextXAlignment = Enum.TextXAlignment.Left
title.ZIndex = 10001
title.Parent = menu
local description = Instance.new("TextLabel")
description.BackgroundTransparency = 1
description.Position = UDim2.fromOffset(18, 44)
description.Size = UDim2.new(1, -36, 0, 34)
description.Font = Enum.Font.Gotham
description.Text = "Reorders Home, Executor, Scripthub, Music, Console, Settings, and the classic ToggleUI button."
description.TextColor3 = Color3.fromRGB(178, 178, 188)
description.TextSize = 12
description.TextWrapped = true
description.TextXAlignment = Enum.TextXAlignment.Left
description.TextYAlignment = Enum.TextYAlignment.Top
description.ZIndex = 10001
description.Parent = menu
makeSortButton(menu, "X", UDim2.new(1, -48, 0, 12), UDim2.fromOffset(34, 30), function()
menu.Visible = false
end)
local list = Instance.new("Frame")
list.Name = "List"
list.BackgroundTransparency = 1
list.Position = UDim2.fromOffset(16, 86)
list.Size = UDim2.new(1, -32, 1, -142)
list.ZIndex = 10001
list.Parent = menu
local layout = Instance.new("UIListLayout")
layout.Padding = UDim.new(0, 6)
layout.SortOrder = Enum.SortOrder.LayoutOrder
layout.Parent = list
makeSortButton(menu, "RESET", UDim2.new(0, 16, 1, -44), UDim2.new(1, -32, 0, 32), function()
sidebarOrder = table.clone(sidebarNames)
applySidebarOrder()
saveSidebarOrder()
if refreshSidebarSortMenu then
refreshSidebarSortMenu()
end
end)
sidebarSortMenu = menu
sidebarSortList = list
return menu
end
refreshSidebarSortMenu = function()
ensureSidebarSortMenu()
for _, child in sidebarSortList:GetChildren() do
if child:IsA("Frame") and child.Name:sub(1, 12) == "LT_OrderRow_" then
child:Destroy()
end
end
for index, name in sidebarOrder do
local row = Instance.new("Frame")
row.Name = "LT_OrderRow_" .. name
row.BackgroundColor3 = Color3.fromRGB(25, 25, 30)
row.BorderSizePixel = 0
row.Size = UDim2.new(1, 0, 0, 42)
row.LayoutOrder = index
row.ZIndex = 10002
row.Parent = sidebarSortList
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 8)
corner.Parent = row
local label = Instance.new("TextLabel")
label.BackgroundTransparency = 1
label.Position = UDim2.fromOffset(12, 0)
label.Size = UDim2.new(1, -126, 1, 0)
label.Font = Enum.Font.GothamMedium
label.Text = string.format("%d. %s", index, name)
label.TextColor3 = Color3.new(1, 1, 1)
label.TextSize = 13
label.TextXAlignment = Enum.TextXAlignment.Left
label.ZIndex = 10003
label.Parent = row
makeSortButton(row, "UP", UDim2.new(1, -108, 0.5, -14), UDim2.fromOffset(48, 28), function()
moveSidebarButton(name, -1)
refreshSidebarSortMenu()
end)
makeSortButton(row, "DOWN", UDim2.new(1, -56, 0.5, -14), UDim2.fromOffset(52, 28), function()
moveSidebarButton(name, 1)
refreshSidebarSortMenu()
end)
end
end
local function createToggleSetting(name, titleText, descText, initial, onChanged)
local enabled = initial
local row
local button
local function refresh()
if button and button.Parent then
local activeColor = Color3.fromRGB(79, 164, 242)
local sidebar = v2Main:FindFirstChild("Sidebar") or v2Main:FindFirstChild("Sidebar", true)
local activeValue = sidebar and sidebar:FindFirstChild("ActiveColor")
if activeValue and activeValue:IsA("Color3Value") then
activeColor = activeValue.Value
end
button.BackgroundColor3 = enabled and activeColor or Color3.fromRGB(30, 30, 30)
setButtonTitle(button, enabled and "ON" or "OFF")
end
end
row, button = createSettingRow(name, titleText, descText, "", function()
enabled = not enabled
refresh()
onChanged(enabled)
end)
refresh()
return row
end
local staleBlur = game:GetService("Lighting"):FindFirstChild("LT_DeltaBlur")
if staleBlur then
staleBlur:Destroy()
end
local oldSettings = v2Main:FindFirstChild("Settings") or v2Main:FindFirstChild("Settings", true)
local oldHolder = oldSettings and oldSettings:FindFirstChild("Holder")
if oldHolder then
for _, name in { "LT_BackgroundBlur", "LT_BlurStrength" } do
local row = oldHolder:FindFirstChild(name)
if row then
row:Destroy()
end
end
end
local editorSideMenu = executorRoot:FindFirstChild("Sidemenu")
local originalEditorSize = executorImage.Size
local originalEditorPosition = executorImage.Position
local originalEditorAnchor = executorImage.AnchorPoint
local originalSideVisible = editorSideMenu and editorSideMenu.Visible
local originalTabSizes = setmetatable({}, { __mode = "k" })
local originalEditorText = setmetatable({}, { __mode = "k" })
local function applyWideEditor()
if not (executorImage and executorImage.Parent) then
return
end
if wideEditorEnabled then
if editorSideMenu then
editorSideMenu.Visible = false
end
executorImage.AnchorPoint = Vector2.new(1, originalEditorAnchor.Y)
executorImage.Position = UDim2.new(1, 0, originalEditorPosition.Y.Scale, originalEditorPosition.Y.Offset)
executorImage.Size = UDim2.new(0.995, 0, originalEditorSize.Y.Scale, originalEditorSize.Y.Offset)
else
if editorSideMenu then
editorSideMenu.Visible = originalSideVisible
end
executorImage.AnchorPoint = originalEditorAnchor
executorImage.Position = originalEditorPosition
executorImage.Size = originalEditorSize
end
task.defer(updateStatusPosition)
task.defer(editorCanvas.resizeAll)
end
local function applyTabStyle(tab)
if not (tab and tab:IsA("ImageButton") and tab.Name:match("^script%d+%.lua$")) then
return
end
if originalTabSizes[tab] == nil then
originalTabSizes[tab] = tab.Size
end
if compactTabsEnabled then
tab.Size = UDim2.new(0, 126, originalTabSizes[tab].Y.Scale, originalTabSizes[tab].Y.Offset)
else
tab.Size = originalTabSizes[tab]
end
local title = tab:FindFirstChild("Title", true)
if title and title:IsA("TextLabel") then
title.TextSize = compactTabsEnabled and 11 or 14
end
end
local function applyCompactTabs()
for _, tab in tabsFrame:GetChildren() do
applyTabStyle(tab)
end
end
local function applyEditorStyle(box)
if not (box and box:IsA("TextBox") and box.Name:match("^script%d+%.lua$")) then
return
end
if originalEditorText[box] == nil then
originalEditorText[box] = { TextSize = box.TextSize, TextWrapped = box.TextWrapped }
end
box.TextSize = editorFontSize
box.TextWrapped = editorWordWrapEnabled
editorCanvas.resize(box)
syntaxHighlighter.sync(box)
end
local function applyEditorPreferences()
for _, box in getCodeBoxes() do
applyEditorStyle(box)
end
end
addRestorer(function()
if executorImage and executorImage.Parent then
executorImage.AnchorPoint = originalEditorAnchor
executorImage.Position = originalEditorPosition
executorImage.Size = originalEditorSize
end
if editorSideMenu and editorSideMenu.Parent then
editorSideMenu.Visible = originalSideVisible
end
for tab, size in originalTabSizes do
if tab and tab.Parent then
tab.Size = size
end
end
for box, values in originalEditorText do
if box and box.Parent then
box.TextSize = values.TextSize
box.TextWrapped = values.TextWrapped
end
end
syntaxHighlighter.restore()
editorCanvas.restore()
end)
connect(tabsFrame.ChildAdded, function(tab)
task.defer(applyTabStyle, tab)
end)
local function createCycleSetting(name, titleText, descText, values, getValue, setValue, formatValue)
local row
local button
local function refresh()
if button and button.Parent then
setButtonTitle(button, formatValue(getValue()))
end
end
row, button = createSettingRow(name, titleText, descText, "", function()
local current = getValue()
local index = table.find(values, current) or 0
local nextValue = values[(index % #values) + 1]
setValue(nextValue)
refresh()
end)
refresh()
return row
end
local newUi = {
enabled = readBool("NewDeltaUI", false),
open = true,
activePage = "Executor",
applying = false,
railCollapsed = false,
originals = setmetatable({}, { __mode = "k" }),
created = {},
connections = {},
tabConnections = {},
locks = {},
detached = {},
pageNames = { "Home", "Executor", "Scripthub", "Music", "Console", "Settings" },
pageButtons = {},
codeBound = setmetatable({}, { __mode = "k" }),
}
newUi.colors = {
panelTop = Color3.fromRGB(32, 48, 59),
panelMiddle = Color3.fromRGB(27, 38, 45),
panelBottom = Color3.fromRGB(22, 32, 38),
railTop = Color3.fromRGB(31, 46, 57),
railBottom = Color3.fromRGB(22, 33, 40),
stroke = Color3.fromRGB(67, 91, 108),
button = Color3.fromRGB(34, 48, 61),
buttonStroke = Color3.fromRGB(67, 91, 108),
active = Color3.fromRGB(0, 120, 255),
text = Color3.fromRGB(247, 249, 252),
muted = Color3.fromRGB(218, 225, 232),
}
newUi.pageSet = {}
for _, pageName in newUi.pageNames do
newUi.pageSet[pageName] = true
end
newUi.getIconApi = function()
local iconApi = rawget(__dcm_env, "DeltaIcon")
if type(iconApi) == "table" then
return iconApi
end
return nil
end
newUi.getCurrentSectionName = function()
local iconApi = newUi.getIconApi()
if iconApi and type(iconApi.getCurrentSectionName) == "function" then
local ok, pageName = pcall(iconApi.getCurrentSectionName)
if ok and type(pageName) == "string" and newUi.pageSet[pageName] then
return pageName
end
end
for _, pageName in newUi.pageNames do
local page = newUi.getPage and newUi.getPage(pageName)
if page and page.Visible then
return pageName
end
end
return nil
end
newUi.setIconHidden = function(hidden)
local iconApi = newUi.getIconApi()
if iconApi and type(iconApi.setForcedHidden) == "function" then
local ok = pcall(iconApi.setForcedHidden, hidden and true or false)
if ok then
return
end
end
if iconApi and type(iconApi.getButton) == "function" then
local ok, button = pcall(iconApi.getButton)
if ok and button and button:IsA("GuiObject") then
button.Visible = not hidden
end
end
end
newUi.setClassicOpen = function(open)
local iconApi = newUi.getIconApi()
local callback = iconApi and (open and iconApi.openClassic or iconApi.closeClassic)
if type(callback) == "function" then
local ok = pcall(callback)
if ok then
return
end
end
for _, pageName in newUi.pageNames do
local page = newUi.getPage and newUi.getPage(pageName)
if page then
page.Visible = open and pageName == newUi.activePage
end
end
newUi.setIconHidden(open)
end
newUi.capture = function(object, properties)
if not object then
return
end
local state = newUi.originals[object]
if not state then
state = {}
newUi.originals[object] = state
end
for _, property in properties do
if state[property] == nil then
local ok, value = pcall(function()
return object[property]
end)
if ok then
state[property] = { value = value }
end
end
end
end
newUi.connect = function(signal, callback)
local ok, connection = pcall(function()
return signal:Connect(callback)
end)
if ok and connection then
table.insert(newUi.connections, connection)
end
return connection
end
newUi.connectTab = function(signal, callback)
local ok, connection = pcall(function()
return signal:Connect(callback)
end)
if ok and connection then
table.insert(newUi.tabConnections, connection)
end
return connection
end
newUi.bindClick = function(button, callback)
if not (button and button:IsA("GuiButton") and type(callback) == "function") then
return nil
end
local locked = false
return newUi.connect(button.Activated, function()
if locked or not (newUi.enabled and newUi.applied) then
return
end
locked = true
callback()
task.delay(0.08, function()
locked = false
end)
end)
end
newUi.bindTabClick = function(button, callback)
if not (button and button:IsA("GuiButton") and type(callback) == "function") then
return nil
end
local locked = false
return newUi.connectTab(button.Activated, function()
if locked or not (newUi.enabled and newUi.applied) then
return
end
locked = true
callback()
task.delay(0.08, function()
locked = false
end)
end)
end
newUi.make = function(className, name, parent)
local object = Instance.new(className)
object.Name = name
object.Parent = parent
table.insert(newUi.created, object)
track(object)
return object
end
newUi.makeTransient = function(className, name, parent)
local object = Instance.new(className)
object.Name = name
object.Parent = parent
return object
end
newUi.ensureCorner = function(object, radius)
local corner = object:FindFirstChildOfClass("UICorner")
if corner then
newUi.capture(corner, { "CornerRadius" })
else
corner = newUi.make("UICorner", "LT_NewUICorner", object)
end
corner.CornerRadius = UDim.new(0, radius)
return corner
end
newUi.ensureStroke = function(object, color, transparency, thickness)
local stroke = object:FindFirstChildOfClass("UIStroke")
if stroke then
newUi.capture(stroke, { "Color", "Transparency", "Thickness", "Enabled" })
else
stroke = newUi.make("UIStroke", "LT_NewUIStroke", object)
end
stroke.Color = color
stroke.Transparency = transparency
stroke.Thickness = thickness
stroke.Enabled = true
return stroke
end
newUi.makeCorner = function(object, radius, transient)
local corner = transient and newUi.makeTransient("UICorner", "Corner", object)
or newUi.make("UICorner", "Corner", object)
corner.CornerRadius = UDim.new(0, radius)
return corner
end
newUi.makeStroke = function(object, color, transparency, thickness, transient)
local stroke = transient and newUi.makeTransient("UIStroke", "Stroke", object)
or newUi.make("UIStroke", "Stroke", object)
stroke.Color = color
stroke.Transparency = transparency
stroke.Thickness = thickness
return stroke
end
newUi.lock = function(object, property, resolver)
if not object then
return nil
end
newUi.capture(object, { property })
local state = {
object = object,
property = property,
resolver = resolver,
busy = false,
}
state.apply = function()
if state.busy or not (newUi.enabled and newUi.applied and object.Parent) then
return
end
local value = type(resolver) == "function" and resolver() or resolver
local ok, current = pcall(function()
return object[property]
end)
if ok and current ~= value then
state.busy = true
pcall(function()
object[property] = value
end)
state.busy = false
end
end
table.insert(newUi.locks, state)
newUi.connect(object:GetPropertyChangedSignal(property), function()
if not state.busy then
task.defer(state.apply)
end
end)
state.apply()
return state
end
newUi.applyLocks = function()
for _, state in newUi.locks do
state.apply()
end
end
newUi.getPage = function(pageName)
local page = v2Main:FindFirstChild(pageName)
if page and page:IsA("GuiObject") then
return page
end
return nil
end
newUi.getOrderedPages = function()
local result = {}
local used = {}
for _, pageName in sidebarOrder do
if newUi.pageSet[pageName] and newUi.getPage(pageName) and not used[pageName] then
used[pageName] = true
table.insert(result, pageName)
end
end
for _, pageName in newUi.pageNames do
if newUi.getPage(pageName) and not used[pageName] then
used[pageName] = true
table.insert(result, pageName)
end
end
return result
end
newUi.findImage = function(object)
if not object then
return nil
end
for _, descendant in object:GetDescendants() do
if
(descendant:IsA("ImageLabel") or descendant:IsA("ImageButton"))
and type(descendant.Image) == "string"
and descendant.Image ~= ""
then
return descendant
end
end
return nil
end
newUi.findSourceIcon = function(pageName)
local sourceButton = sidebar and sidebar:FindFirstChild(pageName)
return newUi.findImage(sourceButton)
end
newUi.copyIcon = function(source, parent, size, zIndex, transient)
local icon = transient and newUi.makeTransient("ImageLabel", "Icon", parent)
or newUi.make("ImageLabel", "Icon", parent)
icon.AnchorPoint = Vector2.new(0.5, 0.5)
icon.Position = UDim2.fromScale(0.5, 0.5)
icon.Size = UDim2.fromOffset(size, size)
icon.BackgroundTransparency = 1
icon.BorderSizePixel = 0
icon.ScaleType = Enum.ScaleType.Fit
icon.ImageColor3 = Color3.new(1, 1, 1)
icon.ImageTransparency = 0
icon.ZIndex = zIndex
if source then
pcall(function()
icon.Image = source.Image
end)
pcall(function()
icon.ImageRectOffset = source.ImageRectOffset
icon.ImageRectSize = source.ImageRectSize
end)
pcall(function()
icon.ResampleMode = source.ResampleMode
end)
end
local constraint = transient and newUi.makeTransient("UIAspectRatioConstraint", "Aspect", icon)
or newUi.make("UIAspectRatioConstraint", "Aspect", icon)
constraint.AspectRatio = 1
constraint.DominantAxis = Enum.DominantAxis.Height
return icon
end
newUi.makeXIcon = function(parent, size, color, zIndex, transient)
local holder = transient and newUi.makeTransient("Frame", "Icon", parent)
or newUi.make("Frame", "Icon", parent)
holder.AnchorPoint = Vector2.new(0.5, 0.5)
holder.Position = UDim2.fromScale(0.5, 0.5)
holder.Size = UDim2.fromOffset(size, size)
holder.BackgroundTransparency = 1
holder.ZIndex = zIndex
for index, rotation in { 45, -45 } do
local line = transient and newUi.makeTransient("Frame", "Line" .. index, holder)
or newUi.make("Frame", "Line" .. index, holder)
line.AnchorPoint = Vector2.new(0.5, 0.5)
line.Position = UDim2.fromScale(0.5, 0.5)
line.Size = UDim2.fromOffset(2, math.floor(size * 0.72))
line.BackgroundColor3 = color
line.BorderSizePixel = 0
line.Rotation = rotation
line.ZIndex = zIndex
if transient then
newUi.makeCorner(line, 1, true)
else
newUi.makeCorner(line, 1, false)
end
end
return holder
end
newUi.makeDocumentIcon = function(parent, size, color, zIndex, withPlus, transient)
local holder = transient and newUi.makeTransient("Frame", "DocumentIcon", parent)
or newUi.make("Frame", "DocumentIcon", parent)
holder.AnchorPoint = Vector2.new(0.5, 0.5)
holder.Position = UDim2.fromScale(0.5, 0.5)
holder.Size = UDim2.fromOffset(size, size)
holder.BackgroundTransparency = 1
holder.ZIndex = zIndex
local body = transient and newUi.makeTransient("Frame", "Document", holder)
or newUi.make("Frame", "Document", holder)
body.AnchorPoint = Vector2.new(0.5, 0.5)
body.Position = UDim2.fromScale(0.5, 0.48)
body.Size = UDim2.fromScale(0.58, 0.72)
body.BackgroundTransparency = 1
body.ZIndex = zIndex
newUi.makeCorner(body, math.max(2, math.floor(size * 0.08)), transient)
newUi.makeStroke(body, color, 0, math.max(1.5, size * 0.075), transient)
local fold = transient and newUi.makeTransient("Frame", "Fold", holder)
or newUi.make("Frame", "Fold", holder)
fold.AnchorPoint = Vector2.new(1, 0)
fold.Position = UDim2.fromScale(0.79, 0.18)
fold.Size = UDim2.fromScale(0.22, 0.22)
fold.BackgroundColor3 = newUi.colors.panelTop
fold.BorderSizePixel = 0
fold.Rotation = 45
fold.ZIndex = zIndex + 1
if withPlus then
local plusHolder = transient and newUi.makeTransient("Frame", "Plus", holder)
or newUi.make("Frame", "Plus", holder)
plusHolder.AnchorPoint = Vector2.new(0.5, 0.5)
plusHolder.Position = UDim2.fromScale(0.27, 0.75)
plusHolder.Size = UDim2.fromScale(0.42, 0.42)
plusHolder.BackgroundColor3 = newUi.colors.active
plusHolder.BorderSizePixel = 0
plusHolder.ZIndex = zIndex + 2
newUi.makeCorner(plusHolder, math.floor(size * 0.2), transient)
for index, value in { Vector2.new(0.58, 0.12), Vector2.new(0.12, 0.58) } do
local line = transient and newUi.makeTransient("Frame", "PlusLine" .. index, plusHolder)
or newUi.make("Frame", "PlusLine" .. index, plusHolder)
line.AnchorPoint = Vector2.new(0.5, 0.5)
line.Position = UDim2.fromScale(0.5, 0.5)
line.Size = UDim2.fromScale(value.X, value.Y)
line.BackgroundColor3 = Color3.new(1, 1, 1)
line.BorderSizePixel = 0
line.ZIndex = zIndex + 3
newUi.makeCorner(line, 1, transient)
end
end
return holder
end
newUi.makePlayIcon = function(parent, size, color, zIndex, transient, withRing)
local holder = transient and newUi.makeTransient("Frame", "PlayIcon", parent)
or newUi.make("Frame", "PlayIcon", parent)
holder.AnchorPoint = Vector2.new(0.5, 0.5)
holder.Position = UDim2.fromScale(0.5, 0.5)
holder.Size = UDim2.fromOffset(size, size)
holder.BackgroundTransparency = 1
holder.ZIndex = zIndex
if withRing then
local ring = transient and newUi.makeTransient("Frame", "Ring", holder)
or newUi.make("Frame", "Ring", holder)
ring.AnchorPoint = Vector2.new(0.5, 0.5)
ring.Position = UDim2.fromScale(0.5, 0.5)
ring.Size = UDim2.fromScale(0.9, 0.9)
ring.BackgroundTransparency = 1
ring.ZIndex = zIndex
newUi.makeCorner(ring, size, transient)
newUi.makeStroke(ring, color, 0, math.max(1.4, size * 0.075), transient)
end
local arrow = transient and newUi.makeTransient("TextLabel", "Arrow", holder)
or newUi.make("TextLabel", "Arrow", holder)
arrow.AnchorPoint = Vector2.new(0.5, 0.5)
arrow.Position = UDim2.fromScale(withRing and 0.53 or 0.5, 0.48)
arrow.Size = UDim2.fromScale(0.7, 0.8)
arrow.BackgroundTransparency = 1
arrow.Font = Enum.Font.GothamBold
arrow.Text = ">"
arrow.TextColor3 = color
arrow.TextSize = math.floor(size * (withRing and 0.58 or 0.72))
arrow.ZIndex = zIndex + 1
return holder
end
newUi.makeTrashIcon = function(parent, size, color, zIndex, transient)
local holder = transient and newUi.makeTransient("Frame", "TrashIcon", parent)
or newUi.make("Frame", "TrashIcon", parent)
holder.AnchorPoint = Vector2.new(0.5, 0.5)
holder.Position = UDim2.fromScale(0.5, 0.5)
holder.Size = UDim2.fromOffset(size, size)
holder.BackgroundTransparency = 1
holder.ZIndex = zIndex
local body = transient and newUi.makeTransient("Frame", "Body", holder)
or newUi.make("Frame", "Body", holder)
body.AnchorPoint = Vector2.new(0.5, 1)
body.Position = UDim2.fromScale(0.5, 0.92)
body.Size = UDim2.fromScale(0.58, 0.58)
body.BackgroundTransparency = 1
body.ZIndex = zIndex
newUi.makeCorner(body, math.max(2, math.floor(size * 0.08)), transient)
newUi.makeStroke(body, color, 0, math.max(1.4, size * 0.07), transient)
local lid = transient and newUi.makeTransient("Frame", "Lid", holder)
or newUi.make("Frame", "Lid", holder)
lid.AnchorPoint = Vector2.new(0.5, 0.5)
lid.Position = UDim2.fromScale(0.5, 0.27)
lid.Size = UDim2.fromScale(0.72, 0.08)
lid.BackgroundColor3 = color
lid.BorderSizePixel = 0
lid.ZIndex = zIndex + 1
newUi.makeCorner(lid, 2, transient)
local handle = transient and newUi.makeTransient("Frame", "Handle", holder)
or newUi.make("Frame", "Handle", holder)
handle.AnchorPoint = Vector2.new(0.5, 1)
handle.Position = UDim2.fromScale(0.5, 0.23)
handle.Size = UDim2.fromScale(0.28, 0.14)
handle.BackgroundTransparency = 1
handle.ZIndex = zIndex + 1
newUi.makeCorner(handle, 2, transient)
newUi.makeStroke(handle, color, 0, math.max(1.2, size * 0.06), transient)
for index, x in { 0.4, 0.6 } do
local line = transient and newUi.makeTransient("Frame", "Slot" .. index, body)
or newUi.make("Frame", "Slot" .. index, body)
line.AnchorPoint = Vector2.new(0.5, 0.5)
line.Position = UDim2.fromScale(x, 0.53)
line.Size = UDim2.fromScale(0.08, 0.55)
line.BackgroundColor3 = color
line.BorderSizePixel = 0
line.ZIndex = zIndex + 1
newUi.makeCorner(line, 1, transient)
end
return holder
end
newUi.makeClipboardIcon = function(parent, size, color, zIndex, transient, withPlay)
local holder = transient and newUi.makeTransient("Frame", "ClipboardIcon", parent)
or newUi.make("Frame", "ClipboardIcon", parent)
holder.AnchorPoint = Vector2.new(0.5, 0.5)
holder.Position = UDim2.fromScale(0.5, 0.5)
holder.Size = UDim2.fromOffset(size, size)
holder.BackgroundTransparency = 1
holder.ZIndex = zIndex
local body = transient and newUi.makeTransient("Frame", "Body", holder)
or newUi.make("Frame", "Body", holder)
body.AnchorPoint = Vector2.new(0.5, 0.5)
body.Position = UDim2.fromScale(withPlay and 0.46 or 0.5, 0.54)
body.Size = UDim2.fromScale(0.62, 0.72)
body.BackgroundTransparency = 1
body.ZIndex = zIndex
newUi.makeCorner(body, math.max(2, math.floor(size * 0.08)), transient)
newUi.makeStroke(body, color, 0, math.max(1.4, size * 0.07), transient)
local clip = transient and newUi.makeTransient("Frame", "Clip", holder)
or newUi.make("Frame", "Clip", holder)
clip.AnchorPoint = Vector2.new(0.5, 0.5)
clip.Position = UDim2.fromScale(withPlay and 0.46 or 0.5, 0.2)
clip.Size = UDim2.fromScale(0.34, 0.17)
clip.BackgroundColor3 = newUi.colors.button
clip.BorderSizePixel = 0
clip.ZIndex = zIndex + 1
newUi.makeCorner(clip, math.max(2, math.floor(size * 0.07)), transient)
newUi.makeStroke(clip, color, 0, math.max(1.2, size * 0.06), transient)
if withPlay then
local badge = transient and newUi.makeTransient("Frame", "PlayBadge", holder)
or newUi.make("Frame", "PlayBadge", holder)
badge.AnchorPoint = Vector2.new(0.5, 0.5)
badge.Position = UDim2.fromScale(0.76, 0.73)
badge.Size = UDim2.fromScale(0.48, 0.48)
badge.BackgroundColor3 = newUi.colors.active
badge.BorderSizePixel = 0
badge.ZIndex = zIndex + 2
newUi.makeCorner(badge, size, transient)
newUi.makePlayIcon(badge, math.floor(size * 0.34), Color3.new(1, 1, 1), zIndex + 3, transient, false)
end
return holder
end
newUi.makeMusicIcon = function(parent, size, color, zIndex, transient)
local holder = transient and newUi.makeTransient("Frame", "MusicIcon", parent)
or newUi.make("Frame", "MusicIcon", parent)
holder.AnchorPoint = Vector2.new(0.5, 0.5)
holder.Position = UDim2.fromScale(0.5, 0.5)
holder.Size = UDim2.fromOffset(size, size)
holder.BackgroundTransparency = 1
holder.ZIndex = zIndex
local stem = transient and newUi.makeTransient("Frame", "Stem", holder)
or newUi.make("Frame", "Stem", holder)
stem.AnchorPoint = Vector2.new(0.5, 0)
stem.Position = UDim2.fromScale(0.62, 0.13)
stem.Size = UDim2.fromScale(0.11, 0.58)
stem.BackgroundColor3 = color
stem.BorderSizePixel = 0
stem.ZIndex = zIndex
newUi.makeCorner(stem, 2, transient)
local beam = transient and newUi.makeTransient("Frame", "Beam", holder)
or newUi.make("Frame", "Beam", holder)
beam.AnchorPoint = Vector2.new(1, 0)
beam.Position = UDim2.fromScale(0.68, 0.13)
beam.Size = UDim2.fromScale(0.43, 0.1)
beam.BackgroundColor3 = color
beam.BorderSizePixel = 0
beam.Rotation = -8
beam.ZIndex = zIndex
newUi.makeCorner(beam, 2, transient)
local note = transient and newUi.makeTransient("Frame", "Note", holder)
or newUi.make("Frame", "Note", holder)
note.AnchorPoint = Vector2.new(0.5, 0.5)
note.Position = UDim2.fromScale(0.45, 0.75)
note.Size = UDim2.fromScale(0.36, 0.28)
note.BackgroundColor3 = color
note.BorderSizePixel = 0
note.Rotation = -12
note.ZIndex = zIndex
newUi.makeCorner(note, size, transient)
return holder
end
newUi.makeChevronIcon = function(parent, size, color, zIndex, transient)
local holder = transient and newUi.makeTransient("Frame", "ChevronIcon", parent)
or newUi.make("Frame", "ChevronIcon", parent)
holder.AnchorPoint = Vector2.new(0.5, 0.5)
holder.Position = UDim2.fromScale(0.5, 0.5)
holder.Size = UDim2.fromOffset(size, size)
holder.BackgroundTransparency = 1
holder.ZIndex = zIndex
for index = 1, 2 do
local line = transient and newUi.makeTransient("Frame", "Line" .. index, holder)
or newUi.make("Frame", "Line" .. index, holder)
line.AnchorPoint = Vector2.new(0.5, 0.5)
line.Size = UDim2.fromOffset(2, math.floor(size * 0.55))
line.BackgroundColor3 = color
line.BorderSizePixel = 0
line.ZIndex = zIndex
newUi.makeCorner(line, 1, transient)
end
return holder
end
newUi.setChevronDirection = function(holder, pointsRight)
if not holder then
return
end
local first = holder:FindFirstChild("Line1")
local second = holder:FindFirstChild("Line2")
if first then
first.Position = UDim2.fromScale(0.5, 0.37)
first.Rotation = pointsRight and -42 or 42
end
if second then
second.Position = UDim2.fromScale(0.5, 0.63)
second.Rotation = pointsRight and 42 or -42
end
end
newUi.makeCopyIcon = function(parent, size, color, zIndex, transient)
local holder = transient and newUi.makeTransient("Frame", "CopyIcon", parent)
or newUi.make("Frame", "CopyIcon", parent)
holder.AnchorPoint = Vector2.new(0.5, 0.5)
holder.Position = UDim2.fromScale(0.5, 0.5)
holder.Size = UDim2.fromOffset(size, size)
holder.BackgroundTransparency = 1
holder.ZIndex = zIndex
local back = transient and newUi.makeTransient("Frame", "Back", holder)
or newUi.make("Frame", "Back", holder)
back.AnchorPoint = Vector2.new(0.5, 0.5)
back.Position = UDim2.fromScale(0.62, 0.38)
back.Size = UDim2.fromScale(0.58, 0.64)
back.BackgroundColor3 = newUi.colors.button
back.BorderSizePixel = 0
back.ZIndex = zIndex
newUi.makeCorner(back, math.max(2, math.floor(size * 0.08)), transient)
newUi.makeStroke(back, color, 0, math.max(1.3, size * 0.065), transient)
local front = transient and newUi.makeTransient("Frame", "Front", holder)
or newUi.make("Frame", "Front", holder)
front.AnchorPoint = Vector2.new(0.5, 0.5)
front.Position = UDim2.fromScale(0.4, 0.62)
front.Size = UDim2.fromScale(0.58, 0.64)
front.BackgroundColor3 = newUi.colors.button
front.BorderSizePixel = 0
front.ZIndex = zIndex + 1
newUi.makeCorner(front, math.max(2, math.floor(size * 0.08)), transient)
newUi.makeStroke(front, color, 0, math.max(1.3, size * 0.065), transient)
return holder
end
newUi.makeActionIcon = function(kind, parent, size, color, zIndex, transient)
if kind == "Execute" then
return newUi.makePlayIcon(parent, size, color, zIndex, transient, true)
elseif kind == "Clear" then
return newUi.makeTrashIcon(parent, size, color, zIndex, transient)
elseif kind == "ExecuteClipboard" then
return newUi.makeClipboardIcon(parent, size, color, zIndex, transient, true)
elseif kind == "Copy" then
return newUi.makeCopyIcon(parent, size, color, zIndex, transient)
end
return newUi.makeClipboardIcon(parent, size, color, zIndex, transient, false)
end
newUi.createNavButton = function(pageName)
local button = newUi.make("ImageButton", "LT_NewUINav_" .. pageName, newUi.navBar)
button.Size = UDim2.fromOffset(64, 64)
button.BackgroundColor3 = newUi.colors.active
button.BackgroundTransparency = 1
button.BorderSizePixel = 0
button.AutoButtonColor = false
button.Image = ""
button.ZIndex = 12002
newUi.makeCorner(button, 32, false)
local source = newUi.findSourceIcon(pageName)
local icon
if source then
icon = newUi.copyIcon(source, button, 25, 12003, false)
else
if pageName == "Music" then
icon = newUi.makeMusicIcon(button, 27, Color3.new(1, 1, 1), 12003, false)
else
icon = newUi.make("TextLabel", "Icon", button)
icon.AnchorPoint = Vector2.new(0.5, 0.5)
icon.Position = UDim2.fromScale(0.5, 0.5)
icon.Size = UDim2.fromOffset(32, 32)
icon.BackgroundTransparency = 1
icon.Font = pageName == "Executor" and Enum.Font.Code or Enum.Font.GothamBold
icon.Text = pageName == "Executor" and ">_" or pageName:sub(1, 1)
icon.TextColor3 = Color3.new(1, 1, 1)
icon.TextSize = pageName == "Executor" and 18 or 20
icon.ZIndex = 12003
end
end
newUi.pageButtons[pageName] = {
button = button,
icon = icon,
}
newUi.bindClick(button, function()
newUi.showPage(pageName)
end)
return button
end
newUi.refreshOrder = function()
if not (newUi.navBar and newUi.navBar.Parent) then
return
end
local ordered = newUi.getOrderedPages()
for index, pageName in ordered do
local entry = newUi.pageButtons[pageName]
if entry and entry.button then
entry.button.LayoutOrder = index
end
end
local width = (#ordered * 64) + (math.max(#ordered - 1, 0) * 4) + 24
newUi.navBar.Size = UDim2.fromOffset(width, 80)
if newUi.closeButton then
newUi.closeButton.Position = UDim2.new(0.53, -(math.floor(width / 2) + 49), 0.015, 0)
end
end
newUi.refreshNav = function()
local visible = newUi.enabled and newUi.applied and newUi.open
if newUi.navBar then
newUi.navBar.Visible = visible
end
if newUi.closeButton then
newUi.closeButton.Visible = visible
end
if newUi.rail then
newUi.rail.Visible = visible and newUi.activePage == "Executor"
end
for pageName, entry in newUi.pageButtons do
local active = visible and newUi.activePage == pageName
entry.button.BackgroundTransparency = active and 0 or 1
if entry.icon:IsA("ImageLabel") then
entry.icon.ImageColor3 = Color3.new(1, 1, 1)
entry.icon.ImageTransparency = active and 0 or 0.1
elseif entry.icon:IsA("TextLabel") then
entry.icon.TextColor3 = Color3.new(1, 1, 1)
entry.icon.TextTransparency = active and 0 or 0.1
end
end
end
newUi.syncPages = function()
if not (newUi.enabled and newUi.applied) then
return
end
newUi.applying = true
for _, pageName in newUi.pageNames do
local page = newUi.getPage(pageName)
if page then
page.Visible = newUi.open and pageName == newUi.activePage
end
end
if sidebar and sidebar.Parent then
sidebar.Visible = false
end
newUi.applying = false
newUi.refreshNav()
newUi.setIconHidden(newUi.open)
end
newUi.showPage = function(pageName)
if not (newUi.enabled and newUi.applied and newUi.pageSet[pageName]) then
return
end
newUi.activePage = pageName
newUi.open = true
newUi.syncPages()
newUi.applyLocks()
if pageName == "Executor" then
newUi.rebuildTabs()
task.defer(editorCanvas.resizeAll)
task.defer(updateStatusPosition)
end
end
newUi.setOpen = function(open)
if not (newUi.enabled and newUi.applied) then
return
end
newUi.open = open and true or false
newUi.syncPages()
newUi.applyLocks()
end
newUi.updateLineNumbers = function()
if not (newUi.lineGutter and newUi.lineNumbers and newUi.enabled and newUi.applied) then
return
end
local box = getActiveCodeBox()
if not box then
newUi.lineNumbers.Text = ""
return
end
local text = box.Text or ""
local _, breaks = text:gsub("\n", "\n")
local count = math.min(breaks + 1, 5000)
local numbers = table.create(count)
for index = 1, count do
numbers[index] = tostring(index)
end
local lineHeight = math.max(1, box.LineHeight)
newUi.lineNumbers.Text = table.concat(numbers, "\n")
newUi.lineNumbers.TextSize = box.TextSize
newUi.lineNumbers.LineHeight = lineHeight
newUi.lineNumbers.Position = UDim2.fromOffset(0, 6 - codeFrame.CanvasPosition.Y)
newUi.lineNumbers.Size = UDim2.new(1, -4, 0, math.max(newUi.lineGutter.AbsoluteSize.Y, math.ceil(count * box.TextSize * lineHeight) + 20))
end
newUi.clearTabConnections = function()
for i = #newUi.tabConnections, 1, -1 do
pcall(function()
newUi.tabConnections[i]:Disconnect()
end)
end
table.clear(newUi.tabConnections)
end
newUi.updateTabCanvas = function()
if not (newUi.tabBar and newUi.tabLayout) then
return
end
newUi.tabBar.CanvasSize = UDim2.fromOffset(newUi.tabLayout.AbsoluteContentSize.X + 4, 0)
end
newUi.getNativeTabTitle = function(tab)
local title = tab and (tab:FindFirstChild("Title", true) or tab:FindFirstChildWhichIsA("TextLabel", true))
local value = title and title:IsA("TextLabel") and title.Text ~= "" and title.Text or tab and tab.Name or "New tab"
local index = tostring(value):match("^script(%d+)%.lua$")
if index then
return tonumber(index) == 1 and "New tab" or "New tab " .. index
end
return value
end
newUi.getNativeClose = function(tab)
if not tab then
return nil
end
for _, descendant in tab:GetDescendants() do
if descendant:IsA("GuiButton") then
return descendant
end
end
return nil
end
newUi.rebuildTabs = function()
if not (newUi.enabled and newUi.applied and newUi.tabBar and newUi.tabBar.Parent) then
return
end
newUi.clearTabConnections()
for _, child in newUi.tabBar:GetChildren() do
if child:GetAttribute("LT_CustomTab") then
child:Destroy()
end
end
local nativeTabs = {}
for _, tab in tabsFrame:GetChildren() do
if tab:IsA("GuiButton") and tab.Name:match("^script%d+%.lua$") then
table.insert(nativeTabs, tab)
end
end
table.sort(nativeTabs, function(a, b)
return (a.LayoutOrder ~= b.LayoutOrder and a.LayoutOrder < b.LayoutOrder)
or (a.LayoutOrder == b.LayoutOrder and a.Name < b.Name)
end)
for index, nativeTab in nativeTabs do
local box = codeFrame:FindFirstChild(nativeTab.Name, true)
local active = box and box:IsA("TextBox") and box.Visible
local button = newUi.makeTransient("ImageButton", nativeTab.Name, newUi.tabBar)
button:SetAttribute("LT_CustomTab", true)
button.Size = UDim2.fromOffset(184, 54)
button.LayoutOrder = index
button.BackgroundColor3 = active and newUi.colors.active or newUi.colors.button
button.BackgroundTransparency = active and 0 or 0.12
button.BorderSizePixel = 0
button.AutoButtonColor = false
button.Image = ""
button.ZIndex = 12010
newUi.makeCorner(button, 16, true)
if not active then
newUi.makeStroke(button, newUi.colors.buttonStroke, 0.5, 1, true)
end
local documentHolder = newUi.makeTransient("Frame", "DocumentHolder", button)
documentHolder.AnchorPoint = Vector2.new(0, 0.5)
documentHolder.Position = UDim2.new(0, 14, 0.5, 0)
documentHolder.Size = UDim2.fromOffset(24, 24)
documentHolder.BackgroundTransparency = 1
documentHolder.ZIndex = 12011
newUi.makeDocumentIcon(documentHolder, 22, Color3.new(1, 1, 1), 12012, true, true)
local title = newUi.makeTransient("TextLabel", "Title", button)
title.AnchorPoint = Vector2.new(0, 0.5)
title.Position = UDim2.new(0, 45, 0.5, 0)
title.Size = UDim2.new(1, -78, 1, 0)
title.BackgroundTransparency = 1
title.Font = Enum.Font.GothamMedium
title.Text = newUi.getNativeTabTitle(nativeTab)
title.TextColor3 = newUi.colors.text
title.TextSize = 15
title.TextXAlignment = Enum.TextXAlignment.Left
title.TextTruncate = Enum.TextTruncate.AtEnd
title.ZIndex = 12011
local close = newUi.makeTransient("ImageButton", "Close", button)
close.AnchorPoint = Vector2.new(1, 0.5)
close.Position = UDim2.new(1, -10, 0.5, 0)
close.Size = UDim2.fromOffset(30, 30)
close.BackgroundTransparency = 1
close.BorderSizePixel = 0
close.AutoButtonColor = false
close.Image = ""
close.ZIndex = 12012
newUi.makeXIcon(close, 15, Color3.fromRGB(214, 223, 231), 12013, true)
newUi.bindTabClick(button, function()
selectTabByName(nativeTab.Name)
task.defer(newUi.rebuildTabs)
task.defer(editorCanvas.resizeAll)
end)
newUi.bindTabClick(close, function()
local nativeClose = newUi.getNativeClose(nativeTab)
if nativeClose then
activateOriginal(nativeClose)
else
local nativeBox = codeFrame:FindFirstChild(nativeTab.Name, true)
if nativeBox then
nativeBox:Destroy()
end
nativeTab:Destroy()
end
task.delay(0.08, function()
local activeBox = getActiveCodeBox()
if not activeBox then
local first = tabsFrame:FindFirstChildWhichIsA("GuiButton")
if first and first.Name:match("^script%d+%.lua$") then
selectTabByName(first.Name)
end
end
newUi.rebuildTabs()
end)
end)
end
newUi.updateTabCanvas()
newUi.updateLineNumbers()
end
newUi.refreshTabs = newUi.rebuildTabs
newUi.bindCodeBox = function(box)
if not (box and box:IsA("TextBox") and box.Name:match("^script%d+%.lua$") and not newUi.codeBound[box]) then
return
end
newUi.codeBound[box] = true
newUi.connect(box:GetPropertyChangedSignal("Visible"), function()
task.defer(newUi.rebuildTabs)
end)
newUi.connect(box:GetPropertyChangedSignal("Name"), function()
task.defer(newUi.rebuildTabs)
end)
for _, property in { "Text", "TextSize", "LineHeight" } do
newUi.connect(box:GetPropertyChangedSignal(property), function()
task.defer(newUi.updateLineNumbers)
end)
end
end
newUi.createActionButton = function(name, text, position, size, iconKind, callback)
local button = newUi.make("ImageButton", name, newUi.toolbar)
button.AnchorPoint = Vector2.new(position.X.Scale == 1 and 1 or 0, 0)
button.Position = position
button.Size = size
button.BackgroundColor3 = newUi.colors.button
button.BackgroundTransparency = 0.08
button.BorderSizePixel = 0
button.AutoButtonColor = false
button.Image = ""
button.ZIndex = 12010
newUi.makeCorner(button, 14, false)
newUi.makeStroke(button, newUi.colors.buttonStroke, 0.2, 1.5, false)
local holder = newUi.make("Frame", "IconHolder", button)
holder.AnchorPoint = Vector2.new(0, 0.5)
holder.Position = UDim2.new(0, 14, 0.5, 0)
holder.Size = UDim2.fromOffset(24, 24)
holder.BackgroundTransparency = 1
holder.ZIndex = 12012
newUi.makeActionIcon(iconKind, holder, 22, newUi.colors.text, 12013, false)
local label = newUi.make("TextLabel", "Text", button)
label.Position = UDim2.new(0, 48, 0, 0)
label.Size = UDim2.new(1, -58, 1, 0)
label.BackgroundTransparency = 1
label.Font = Enum.Font.GothamMedium
label.Text = text
label.TextColor3 = newUi.colors.text
label.TextSize = 14
label.TextXAlignment = Enum.TextXAlignment.Left
label.TextTruncate = Enum.TextTruncate.None
label.ZIndex = 12012
newUi.bindClick(button, callback)
return button
end
newUi.applyRailState = function()
newUi.applyLocks()
if newUi.addButton then
newUi.addButton.Visible = not newUi.railCollapsed
end
if newUi.railTop then
newUi.railTop.Visible = not newUi.railCollapsed
end
newUi.setChevronDirection(newUi.railToggleIcon, newUi.railCollapsed)
end
newUi.buildShell = function()
newUi.capture(sidebar, { "Visible" })
if sidebar then
sidebar.Visible = false
newUi.lock(sidebar, "Visible", false)
end
newUi.navBar = newUi.make("Frame", "LT_NewUINavBar", v2Main)
newUi.navBar.AnchorPoint = Vector2.new(0.5, 0)
newUi.navBar.Position = UDim2.new(0.53, 0, 0.015, 0)
newUi.navBar.BackgroundColor3 = Color3.fromRGB(20, 34, 47)
newUi.navBar.BackgroundTransparency = 0.01
newUi.navBar.BorderSizePixel = 0
newUi.navBar.ZIndex = 12000
newUi.makeCorner(newUi.navBar, 40, false)
newUi.makeStroke(newUi.navBar, Color3.fromRGB(58, 79, 95), 0.15, 1.5, false)
local layout = newUi.make("UIListLayout", "Layout", newUi.navBar)
layout.FillDirection = Enum.FillDirection.Horizontal
layout.HorizontalAlignment = Enum.HorizontalAlignment.Center
layout.VerticalAlignment = Enum.VerticalAlignment.Center
layout.Padding = UDim.new(0, 4)
layout.SortOrder = Enum.SortOrder.LayoutOrder
for _, pageName in newUi.pageNames do
if newUi.getPage(pageName) then
newUi.createNavButton(pageName)
end
end
newUi.closeButton = newUi.make("ImageButton", "LT_NewUIClose", v2Main)
newUi.closeButton.AnchorPoint = Vector2.new(0.5, 0)
newUi.closeButton.Size = UDim2.fromOffset(80, 80)
newUi.closeButton.BackgroundColor3 = Color3.fromRGB(24, 40, 51)
newUi.closeButton.BackgroundTransparency = 0.01
newUi.closeButton.BorderSizePixel = 0
newUi.closeButton.AutoButtonColor = false
newUi.closeButton.Image = ""
newUi.closeButton.ZIndex = 12000
newUi.makeCorner(newUi.closeButton, 40, false)
newUi.makeStroke(newUi.closeButton, Color3.fromRGB(58, 79, 95), 0.15, 1.5, false)
newUi.makeXIcon(newUi.closeButton, 30, newUi.colors.text, 12002, false)
newUi.bindClick(newUi.closeButton, function()
newUi.setOpen(false)
end)
newUi.refreshOrder()
end
newUi.buildPages = function()
for _, pageName in newUi.pageNames do
local page = newUi.getPage(pageName)
if page then
newUi.capture(page, { "Visible", "Position", "Size", "AnchorPoint", "ClipsDescendants" })
newUi.lock(page, "AnchorPoint", Vector2.zero)
newUi.lock(page, "Position", UDim2.new(0.012, 0, 0.16, 0))
newUi.lock(page, "Size", UDim2.new(0.976, 0, 0.828, 0))
newUi.lock(page, "ClipsDescendants", false)
newUi.connect(page:GetPropertyChangedSignal("Visible"), function()
if not newUi.applying then
task.defer(newUi.syncPages)
end
end)
end
end
end
newUi.buildExecutor = function()
newUi.capture(editorSideMenu, { "Visible" })
if editorSideMenu then
newUi.lock(editorSideMenu, "Visible", false)
end
newUi.capture(executorImage, {
"Position",
"Size",
"AnchorPoint",
"BackgroundColor3",
"BackgroundTransparency",
"ImageTransparency",
"ClipsDescendants",
})
newUi.lock(executorImage, "AnchorPoint", Vector2.zero)
newUi.lock(executorImage, "Position", UDim2.fromScale(0, 0))
newUi.lock(executorImage, "Size", function()
return newUi.railCollapsed and UDim2.new(0.974, 0, 1, 0) or UDim2.new(0.948, 0, 1, 0)
end)
newUi.lock(executorImage, "BackgroundColor3", newUi.colors.panelTop)
newUi.lock(executorImage, "BackgroundTransparency", 0)
newUi.lock(executorImage, "ImageTransparency", 1)
newUi.lock(executorImage, "ClipsDescendants", true)
newUi.ensureCorner(executorImage, 20)
newUi.ensureStroke(executorImage, newUi.colors.stroke, 0.22, 1.5)
for _, child in executorImage:GetChildren() do
if child:IsA("UIGradient") then
newUi.capture(child, { "Enabled" })
child.Enabled = false
end
end
local panelGradient = newUi.make("UIGradient", "LT_NewUIPanelGradient", executorImage)
panelGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, newUi.colors.panelTop),
ColorSequenceKeypoint.new(0.5, newUi.colors.panelMiddle),
ColorSequenceKeypoint.new(1, newUi.colors.panelBottom),
})
panelGradient.Rotation = 90
newUi.capture(executorOverlay, { "BackgroundTransparency", "ImageTransparency" })
newUi.lock(executorOverlay, "BackgroundTransparency", 1)
newUi.lock(executorOverlay, "ImageTransparency", 1)
newUi.capture(tabsFrame, { "Visible" })
newUi.lock(tabsFrame, "Visible", false)
newUi.capture(buttonsFrame, { "Visible" })
buttonsFrame.Visible = false
if statusFrame then
newUi.capture(statusFrame, { "Visible" })
newUi.lock(statusFrame, "Visible", false)
end
local menu = executorOverlay:FindFirstChild("Menu")
if menu and menu:IsA("GuiObject") then
newUi.capture(menu, { "Visible" })
newUi.lock(menu, "Visible", false)
end
newUi.capture(codeFrame, {
"Position",
"Size",
"AnchorPoint",
"BackgroundColor3",
"BackgroundTransparency",
"BorderSizePixel",
"ScrollBarThickness",
"ScrollBarImageColor3",
"ScrollBarImageTransparency",
})
newUi.lock(codeFrame, "AnchorPoint", Vector2.zero)
newUi.lock(codeFrame, "Position", UDim2.new(0.035, 0, 0, 76))
newUi.lock(codeFrame, "Size", UDim2.new(0.945, 0, 1, -150))
newUi.lock(codeFrame, "BackgroundColor3", newUi.colors.panelMiddle)
newUi.lock(codeFrame, "BackgroundTransparency", 1)
newUi.lock(codeFrame, "BorderSizePixel", 0)
newUi.lock(codeFrame, "ScrollBarThickness", 3)
newUi.lock(codeFrame, "ScrollBarImageColor3", Color3.fromRGB(81, 101, 114))
newUi.lock(codeFrame, "ScrollBarImageTransparency", 0.35)
newUi.lineGutter = newUi.make("Frame", "LT_NewUILineGutter", executorOverlay)
newUi.lineGutter.Position = UDim2.new(0.008, 0, 0, 76)
newUi.lineGutter.Size = UDim2.new(0.025, 0, 1, -150)
newUi.lineGutter.BackgroundTransparency = 1
newUi.lineGutter.BorderSizePixel = 0
newUi.lineGutter.ClipsDescendants = true
newUi.lineGutter.ZIndex = 12008
newUi.lineNumbers = newUi.make("TextLabel", "Numbers", newUi.lineGutter)
newUi.lineNumbers.Position = UDim2.fromOffset(0, 6)
newUi.lineNumbers.Size = UDim2.new(1, -4, 1, 0)
newUi.lineNumbers.BackgroundTransparency = 1
newUi.lineNumbers.Font = Enum.Font.Code
newUi.lineNumbers.Text = ""
newUi.lineNumbers.TextColor3 = Color3.fromRGB(190, 201, 210)
newUi.lineNumbers.TextSize = editorFontSize
newUi.lineNumbers.TextXAlignment = Enum.TextXAlignment.Right
newUi.lineNumbers.TextYAlignment = Enum.TextYAlignment.Top
newUi.lineNumbers.ZIndex = 12009
newUi.connect(codeFrame:GetPropertyChangedSignal("CanvasPosition"), function()
newUi.updateLineNumbers()
end)
newUi.tabBar = newUi.make("ScrollingFrame", "LT_NewUITabs", executorOverlay)
newUi.tabBar.Position = UDim2.new(0.01, 0, 0, 14)
newUi.tabBar.Size = UDim2.new(1, -92, 0, 54)
newUi.tabBar.BackgroundTransparency = 1
newUi.tabBar.BorderSizePixel = 0
newUi.tabBar.ScrollBarThickness = 0
newUi.tabBar.ScrollingDirection = Enum.ScrollingDirection.X
newUi.tabBar.CanvasSize = UDim2.fromOffset(0, 0)
newUi.tabBar.ZIndex = 12009
newUi.tabLayout = newUi.make("UIListLayout", "Layout", newUi.tabBar)
newUi.tabLayout.FillDirection = Enum.FillDirection.Horizontal
newUi.tabLayout.HorizontalAlignment = Enum.HorizontalAlignment.Left
newUi.tabLayout.VerticalAlignment = Enum.VerticalAlignment.Center
newUi.tabLayout.Padding = UDim.new(0, 8)
newUi.tabLayout.SortOrder = Enum.SortOrder.LayoutOrder
newUi.connect(newUi.tabLayout:GetPropertyChangedSignal("AbsoluteContentSize"), newUi.updateTabCanvas)
newUi.addButton = newUi.make("ImageButton", "LT_NewUIAddTab", executorOverlay)
newUi.addButton.AnchorPoint = Vector2.new(1, 0)
newUi.addButton.Position = UDim2.new(1, -14, 0, 14)
newUi.addButton.Size = UDim2.fromOffset(54, 54)
newUi.addButton.BackgroundColor3 = newUi.colors.button
newUi.addButton.BackgroundTransparency = 0.04
newUi.addButton.BorderSizePixel = 0
newUi.addButton.AutoButtonColor = false
newUi.addButton.Image = ""
newUi.addButton.ZIndex = 12010
newUi.makeCorner(newUi.addButton, 18, false)
newUi.makeStroke(newUi.addButton, newUi.colors.buttonStroke, 0.35, 1, false)
newUi.makeDocumentIcon(newUi.addButton, 26, newUi.colors.text, 12012, true, false)
local nativeAdd = tabsFrame:FindFirstChild("AddTab")
newUi.bindClick(newUi.addButton, function()
task.spawn(function()
local created = nativeAdd and fireAddTab(nativeAdd)
if not created then
createFallbackTab(nextAvailableTabName())
end
task.delay(0.05, function()
for _, box in getCodeBoxes() do
newUi.bindCodeBox(box)
end
newUi.rebuildTabs()
editorCanvas.resizeAll()
end)
end)
end)
local divider = newUi.make("Frame", "LT_NewUIHeaderDivider", executorOverlay)
divider.Position = UDim2.new(0, 0, 0, 72)
divider.Size = UDim2.new(1, 0, 0, 2)
divider.BackgroundColor3 = Color3.fromRGB(42, 59, 70)
divider.BackgroundTransparency = 0.55
divider.BorderSizePixel = 0
divider.ZIndex = 12007
newUi.toolbar = newUi.make("Frame", "LT_NewUIToolbar", executorOverlay)
newUi.toolbar.AnchorPoint = Vector2.new(0, 1)
newUi.toolbar.Position = UDim2.new(0.01, 0, 1, -14)
newUi.toolbar.Size = UDim2.new(0.97, 0, 0, 54)
newUi.toolbar.BackgroundTransparency = 1
newUi.toolbar.BorderSizePixel = 0
newUi.toolbar.ZIndex = 12009
newUi.createActionButton(
"LT_NewUIExecute",
"Execute",
UDim2.fromOffset(0, 0),
UDim2.fromOffset(142, 54),
"Execute",
executeActiveCode
)
newUi.createActionButton(
"LT_NewUIClear",
"Clear",
UDim2.fromOffset(150, 0),
UDim2.fromOffset(124, 54),
"Clear",
function()
clearActiveCode()
task.defer(newUi.rebuildTabs)
task.defer(newUi.updateLineNumbers)
end
)
newUi.createActionButton(
"LT_NewUICopy",
"Copy",
UDim2.fromOffset(282, 0),
UDim2.fromOffset(124, 54),
"Copy",
copyActiveCode
)
newUi.createActionButton(
"LT_NewUIPaste",
"Paste",
UDim2.fromOffset(414, 0),
UDim2.fromOffset(124, 54),
"Paste",
pasteIntoActive
)
local nativeExecuteButton = buttonsFrame:FindFirstChild("Execute")
local nativeClearButton = buttonsFrame:FindFirstChild("Clear")
local nativeClipboardButton = buttonsFrame:FindFirstChild("ExecuteClipboard")
local nativeButtonsLayout = buttonsFrame:FindFirstChildOfClass("UIListLayout")
newUi.capture(buttonsFrame, {
"AnchorPoint",
"Position",
"Size",
"BackgroundTransparency",
"BorderSizePixel",
"ZIndex",
"Active",
})
newUi.lock(buttonsFrame, "Visible", true)
newUi.lock(buttonsFrame, "AnchorPoint", Vector2.new(1, 1))
newUi.lock(buttonsFrame, "Position", UDim2.new(0.98, 0, 1, -14))
newUi.lock(buttonsFrame, "Size", UDim2.fromOffset(210, 54))
newUi.lock(buttonsFrame, "BackgroundTransparency", 1)
newUi.lock(buttonsFrame, "BorderSizePixel", 0)
newUi.lock(buttonsFrame, "ZIndex", 12020)
newUi.lock(buttonsFrame, "Active", false)
if nativeButtonsLayout then
newUi.capture(nativeButtonsLayout, { "Parent" })
table.insert(newUi.detached, nativeButtonsLayout)
nativeButtonsLayout.Parent = nil
end
for _, nativeButton in { nativeExecuteButton, nativeClearButton } do
if nativeButton and nativeButton:IsA("GuiObject") then
newUi.lock(nativeButton, "Visible", false)
end
end
if nativeClipboardButton and nativeClipboardButton:IsA("GuiButton") then
newUi.capture(nativeClipboardButton, {
"AnchorPoint",
"Position",
"Size",
"Visible",
"Active",
"Interactable",
"AutoButtonColor",
"BackgroundColor3",
"BackgroundTransparency",
"BorderSizePixel",
"Image",
"ImageTransparency",
"ZIndex",
})
newUi.lock(nativeClipboardButton, "AnchorPoint", Vector2.zero)
newUi.lock(nativeClipboardButton, "Position", UDim2.fromScale(0, 0))
newUi.lock(nativeClipboardButton, "Size", UDim2.fromScale(1, 1))
newUi.lock(nativeClipboardButton, "Visible", true)
newUi.lock(nativeClipboardButton, "Active", true)
newUi.lock(nativeClipboardButton, "Interactable", true)
newUi.lock(nativeClipboardButton, "AutoButtonColor", false)
newUi.lock(nativeClipboardButton, "BackgroundColor3", newUi.colors.button)
newUi.lock(nativeClipboardButton, "BackgroundTransparency", 0.08)
newUi.lock(nativeClipboardButton, "BorderSizePixel", 0)
newUi.lock(nativeClipboardButton, "Image", "")
newUi.lock(nativeClipboardButton, "ImageTransparency", 1)
newUi.lock(nativeClipboardButton, "ZIndex", 12021)
for _, descendant in nativeClipboardButton:GetDescendants() do
if descendant:IsA("GuiObject") then
newUi.lock(descendant, "Visible", false)
elseif descendant:IsA("UIStroke") or descendant:IsA("UIGradient") then
newUi.capture(descendant, { "Enabled" })
descendant.Enabled = false
end
end
newUi.ensureCorner(nativeClipboardButton, 14)
newUi.makeStroke(nativeClipboardButton, newUi.colors.buttonStroke, 0.2, 1.5, false)
local nativeIconHolder = newUi.make("Frame", "LT_NewUIClipboardIconHolder", nativeClipboardButton)
nativeIconHolder.AnchorPoint = Vector2.new(0, 0.5)
nativeIconHolder.Position = UDim2.new(0, 14, 0.5, 0)
nativeIconHolder.Size = UDim2.fromOffset(24, 24)
nativeIconHolder.BackgroundTransparency = 1
nativeIconHolder.ZIndex = 12023
newUi.makeActionIcon(
"ExecuteClipboard",
nativeIconHolder,
22,
newUi.colors.text,
12024,
false
)
local nativeLabel = newUi.make("TextLabel", "LT_NewUIClipboardText", nativeClipboardButton)
nativeLabel.Position = UDim2.new(0, 48, 0, 0)
nativeLabel.Size = UDim2.new(1, -58, 1, 0)
nativeLabel.BackgroundTransparency = 1
nativeLabel.Font = Enum.Font.GothamMedium
nativeLabel.Text = "Execute clipboard"
nativeLabel.TextColor3 = newUi.colors.text
nativeLabel.TextSize = 14
nativeLabel.TextXAlignment = Enum.TextXAlignment.Left
nativeLabel.TextTruncate = Enum.TextTruncate.None
nativeLabel.ZIndex = 12023
else
newUi.createActionButton(
"LT_NewUIExecuteClipboard",
"Execute clipboard",
UDim2.new(1, 0, 0, 0),
UDim2.fromOffset(210, 54),
"ExecuteClipboard",
executeClipboardCode
)
end
newUi.rail = newUi.make("Frame", "LT_NewUIRail", executorRoot)
newUi.rail.BackgroundColor3 = newUi.colors.railTop
newUi.rail.BackgroundTransparency = 0
newUi.rail.BorderSizePixel = 0
newUi.rail.ZIndex = 11900
newUi.makeCorner(newUi.rail, 20, false)
newUi.makeStroke(newUi.rail, newUi.colors.stroke, 0.22, 1.5, false)
local railGradient = newUi.make("UIGradient", "Gradient", newUi.rail)
railGradient.Color = ColorSequence.new(newUi.colors.railTop, newUi.colors.railBottom)
railGradient.Rotation = 90
newUi.lock(newUi.rail, "Position", function()
return newUi.railCollapsed and UDim2.new(0.982, 0, 0, 0) or UDim2.new(0.956, 0, 0, 0)
end)
newUi.lock(newUi.rail, "Size", function()
return newUi.railCollapsed and UDim2.new(0.018, 0, 1, 0) or UDim2.new(0.044, 0, 1, 0)
end)
newUi.railTop = newUi.make("TextLabel", "LT_NewUIRailTerminal", newUi.rail)
newUi.railTop.AnchorPoint = Vector2.new(0.5, 0)
newUi.railTop.Position = UDim2.new(0.5, 0, 0, 15)
newUi.railTop.Size = UDim2.new(1, -12, 0, 48)
newUi.railTop.BackgroundTransparency = 1
newUi.railTop.Font = Enum.Font.Code
newUi.railTop.Text = ">_"
newUi.railTop.TextColor3 = newUi.colors.text
newUi.railTop.TextSize = 22
newUi.railTop.ZIndex = 11902
newUi.railToggle = newUi.make("TextButton", "LT_NewUIRailToggle", newUi.rail)
newUi.railToggle.AnchorPoint = Vector2.new(0.5, 0.5)
newUi.railToggle.Position = UDim2.fromScale(0.5, 0.5)
newUi.railToggle.Size = UDim2.new(1, 0, 0, 56)
newUi.railToggle.BackgroundTransparency = 1
newUi.railToggle.Text = ""
newUi.railToggle.ZIndex = 11902
newUi.railToggleIcon = newUi.makeChevronIcon(
newUi.railToggle,
20,
newUi.colors.muted,
11903,
false
)
newUi.bindClick(newUi.railToggle, function()
newUi.railCollapsed = not newUi.railCollapsed
newUi.applyRailState()
task.defer(editorCanvas.resizeAll)
end)
newUi.connect(tabsFrame.ChildAdded, function(object)
if object:IsA("GuiButton") then
task.delay(0.05, newUi.rebuildTabs)
end
end)
newUi.connect(tabsFrame.ChildRemoved, function()
task.defer(newUi.rebuildTabs)
end)
newUi.connect(codeFrame.DescendantAdded, function(object)
if object:IsA("TextBox") then
task.defer(newUi.bindCodeBox, object)
end
end)
for _, box in getCodeBoxes() do
newUi.bindCodeBox(box)
end
newUi.applyRailState()
newUi.rebuildTabs()
end
newUi.bindIcon = function()
__dcm_env.__NewDeltaUIToggle = function()
if newUi.enabled and newUi.applied then
newUi.setOpen(not newUi.open)
return true
end
return false
end
local iconApi = rawget(__dcm_env, "DeltaIcon")
if type(iconApi) == "table" and type(iconApi.rebindToggle) == "function" then
pcall(iconApi.rebindToggle)
end
end
newUi.enable = function()
if newUi.applied then
newUi.enabled = true
newUi.setOpen(newUi.open)
return
end
local visiblePage = newUi.getCurrentSectionName()
newUi.enabled = true
newUi.applied = true
newUi.open = visiblePage ~= nil
if visiblePage and newUi.pageSet[visiblePage] then
newUi.activePage = visiblePage
else
for _, pageName in newUi.pageNames do
local page = newUi.getPage(pageName)
if page and page.Visible then
newUi.activePage = pageName
newUi.open = true
break
end
end
end
NAlib.disconnect("Sidebar_NormalizeGeometry")
NAlib.disconnect("SidebarGesture")
NAlib.disconnect("ManagedIcon_Toggle")
local gesture = v2Main:FindFirstChild("SidebarGestureZone", true)
if gesture and gesture:IsA("GuiObject") then
newUi.capture(gesture, { "Visible", "Active" })
gesture.Visible = false
gesture.Active = false
end
newUi.buildShell()
newUi.buildPages()
newUi.buildExecutor()
newUi.bindIcon()
newUi.syncPages()
newUi.applyLocks()
newUi.refreshOrder()
newUi.refreshNav()
task.defer(editorCanvas.resizeAll)
task.defer(updateStatusPosition)
end
newUi.disable = function(fullUnload)
if not newUi.applied then
newUi.enabled = false
return
end
local wasOpen = newUi.open
local lastPage = newUi.activePage
newUi.enabled = false
newUi.applied = false
newUi.clearTabConnections()
for i = #newUi.connections, 1, -1 do
pcall(function()
newUi.connections[i]:Disconnect()
end)
end
table.clear(newUi.connections)
for i = #newUi.created, 1, -1 do
local object = newUi.created[i]
if object and object.Parent then
pcall(function()
object:Destroy()
end)
end
end
table.clear(newUi.created)
for object, state in newUi.originals do
if object then
local parentState = state.Parent
if parentState then
pcall(function()
object.Parent = parentState.value
end)
end
for property, wrapped in state do
if property ~= "Parent" then
pcall(function()
object[property] = wrapped.value
end)
end
end
end
end
table.clear(newUi.detached)
newUi.originals = setmetatable({}, { __mode = "k" })
newUi.pageButtons = {}
newUi.codeBound = setmetatable({}, { __mode = "k" })
newUi.locks = {}
newUi.navBar = nil
newUi.closeButton = nil
newUi.tabBar = nil
newUi.tabLayout = nil
newUi.lineGutter = nil
newUi.lineNumbers = nil
newUi.addButton = nil
newUi.toolbar = nil
newUi.rail = nil
newUi.railTop = nil
newUi.railToggle = nil
newUi.railToggleIcon = nil
__dcm_env.__NewDeltaUIToggle = nil
if not fullUnload then
if lastPage and newUi.pageSet[lastPage] then
local iconApi = newUi.getIconApi()
if iconApi and type(iconApi.setCurrentSection) == "function" then
pcall(iconApi.setCurrentSection, lastPage)
end
end
newUi.setClassicOpen(wasOpen)
local iconApi = rawget(__dcm_env, "DeltaIcon")
if type(iconApi) == "table" and type(iconApi.rebindToggle) == "function" then
task.defer(iconApi.rebindToggle)
end
task.defer(applySidebarOrder)
task.defer(applyWideEditor)
task.defer(applyCompactTabs)
task.defer(applyToolbarLayout)
task.defer(editorCanvas.resizeAll)
task.defer(updateStatusPosition)
end
end
local baseApplySidebarOrder = applySidebarOrder
applySidebarOrder = function()
baseApplySidebarOrder()
if newUi.enabled and newUi.applied then
newUi.refreshOrder()
end
end
addRestorer(function()
newUi.disable(true)
end)
local newUiSettingRow = createToggleSetting(
"LT_NewDeltaUI",
"Recreated new Delta UI (BETA)",
"BETA: Rebuilds Delta around the unreleased full-screen layout while retaining its native page and executor handlers",
newUi.enabled,
function(enabled)
saveBool("NewDeltaUI", enabled)
if enabled then
newUi.enable()
else
newUi.disable()
end
end
)
if newUiSettingRow then
local betaStroke = Instance.new("UIStroke")
betaStroke.Name = "LT_NewUIBetaStroke"
betaStroke.Color = Color3.fromRGB(0, 145, 255)
betaStroke.Transparency = 0.25
betaStroke.Thickness = 1.5
betaStroke.Parent = newUiSettingRow
local newBadge = Instance.new("TextLabel")
newBadge.Name = "LT_NewUIBadge"
newBadge.AnchorPoint = Vector2.new(1, 0)
newBadge.Position = UDim2.new(1, -92, 0, 8)
newBadge.Size = UDim2.fromOffset(54, 21)
newBadge.BackgroundColor3 = Color3.fromRGB(0, 120, 255)
newBadge.BorderSizePixel = 0
newBadge.Font = Enum.Font.GothamBold
newBadge.Text = "NEW!"
newBadge.TextColor3 = Color3.new(1, 1, 1)
newBadge.TextSize = 11
newBadge.ZIndex = newUiSettingRow.ZIndex + 4
newBadge.Parent = newUiSettingRow
local badgeCorner = Instance.new("UICorner")
badgeCorner.CornerRadius = UDim.new(0, 7)
badgeCorner.Parent = newBadge
end
createToggleSetting(
"LT_AutoRestoreTabs",
"Auto restore saved tabs",
"Creates missing Delta tabs and loads their saved code automatically",
autoRestoreEnabled,
function(enabled)
autoRestoreEnabled = enabled
saveBool("AutoRestoreTabs", enabled)
if enabled then
task.spawn(restoreSavedTabs, true)
end
end
)
createToggleSetting(
"LT_EditorToolbarSetting",
"Extended editor toolbar",
"Resizes Delta's native controls and adds Copy, Paste, and Add Line",
editorToolbarEnabled,
function(enabled)
editorToolbarEnabled = enabled
saveBool("EditorToolbar", enabled)
buildToolbar()
applyToolbarLayout()
end
)
createSettingRow(
"LT_SidebarButtonOrder",
"Sidebar button order",
"Reorders the classic sidebar and the recreated top navigation, including Music",
"SORT",
function()
local menu = ensureSidebarSortMenu()
refreshSidebarSortMenu()
menu.Visible = not menu.Visible
end
)
createToggleSetting(
"LT_EditorStatusSetting",
"Editor statistics",
"Shows the active tab, line count, character count and autosave state",
editorStatusEnabled,
function(enabled)
editorStatusEnabled = enabled
saveBool("EditorStatus", enabled)
queueStatusUpdate()
end
)
createSettingRow(
"LT_RestoreTabsNow",
"Restore saved tabs now",
"Rebuilds any missing tabs from DeltaCustom/DeltaTabs",
"RESTORE",
function()
task.spawn(restoreSavedTabs, true)
end
)
createToggleSetting(
"LT_WideEditor",
"Wide editor",
"Hides the executor side cards and gives the code editor more room",
wideEditorEnabled,
function(enabled)
wideEditorEnabled = enabled
saveBool("WideEditor", enabled)
applyWideEditor()
end
)
createToggleSetting(
"LT_CompactTabs",
"Compact editor tabs",
"Fits more script tabs across the executor tab bar",
compactTabsEnabled,
function(enabled)
compactTabsEnabled = enabled
saveBool("CompactTabs", enabled)
applyCompactTabs()
end
)
createToggleSetting(
"LT_SyntaxHighlight",
"Lua/Luau syntax highlighting",
"Highlights Luau keywords, strings, numbers, comments, globals and built-in APIs",
syntaxHighlightEnabled,
function(enabled)
syntaxHighlightEnabled = enabled
saveBool("EditorSyntaxHighlight", enabled)
syntaxHighlighter.applyAll()
end
)
createToggleSetting(
"LT_ExploitSyntaxHighlight",
"Executor API highlighting",
"Highlights common executor globals, filesystem, hook, debug and clipboard functions",
exploitSyntaxEnabled,
function(enabled)
exploitSyntaxEnabled = enabled
saveBool("ExploitSyntaxHighlight", enabled)
syntaxHighlighter.applyAll()
end
)
createToggleSetting(
"LT_EditorWordWrap",
"Editor word wrap",
"Wraps long code lines inside the editor viewport",
editorWordWrapEnabled,
function(enabled)
editorWordWrapEnabled = enabled
saveBool("EditorWordWrap", enabled)
applyEditorPreferences()
end
)
createSettingRow(
"LT_UnloadCustomization",
"Unload customization",
"Restores Delta's original interface and removes the active customization",
"UNLOAD",
function()
local master = rawget(__dcm_env, "__DeltaCustomizationMasterRuntime")
if type(master) == "table" and type(master.stop) == "function" then
task.defer(master.stop)
else
task.defer(runtime.stop)
end
end
)
createCycleSetting(
"LT_EditorFontSize",
"Editor font size",
"Cycles the code editor font size",
{ 10, 12, 14, 16, 18, 20, 22, 24 },
function()
return editorFontSize
end,
function(value)
editorFontSize = value
saveNumber("EditorFontSize", value)
applyEditorPreferences()
end,
function(value)
return tostring(value) .. " PX"
end
)
connect(codeFrame.DescendantAdded, function(object)
if object:IsA("TextBox") then
task.defer(function()
hookCodeBox(object)
applyEditorStyle(object)
queueStatusUpdate()
end)
task.delay(0.12, normalizeTabSequence)
end
end)
local addTabButton = tabsFrame:FindFirstChild("AddTab")
if addTabButton and addTabButton:IsA("GuiButton") then
connect(addTabButton.MouseButton1Click, function()
local before = #getCodeBoxes()
task.delay(0.18, function()
if runtime.alive and #getCodeBoxes() == before then
createFallbackTab(nextAvailableTabName())
end
end)
end)
end
connect(codeFrame.DescendantRemoving, function(object)
queueStatusUpdate()
task.delay(0.12, normalizeTabSequence)
if not object:IsA("TextBox") or not object.Name:match("^script%d+%.lua$") then
return
end
local name = object.Name
task.delay(0.3, function()
if
not runtime.alive
or not v2Main.Parent
or not tabsFrame.Parent
or not codeFrame.Parent
then
return
end
for _, box in getCodeBoxes() do
if box.Name == name then
return
end
end
if type(delfile) == "function" and type(isfile) == "function" then
local path = tabDirectory .. "/" .. name
if isfile(path) then
pcall(delfile, path)
end
end
end)
end)
connect(codeFrame:GetPropertyChangedSignal("Position"), updateStatusPosition)
connect(codeFrame:GetPropertyChangedSignal("Size"), updateStatusPosition)
connect(codeFrame:GetPropertyChangedSignal("AbsoluteSize"), updateStatusPosition)
connect(buttonsFrame.ChildAdded, function(object)
if not object:IsA("GuiButton") then
return
end
if object.Name == "Execute" or object.Name == "Clear" or object.Name == "ExecuteClipboard" then
object:SetAttribute("LT_NativeVisible", true)
runtime.originalButtons[object] = true
object.Visible = true
task.defer(function()
if runtime.alive and object.Parent == buttonsFrame then
buildToolbar()
end
end)
end
end)
task.wait(0.7)
if not runtime.alive then
return
end
normalizeTabSequence()
buildToolbar()
applyToolbarLayout()
buildStatus()
applyWideEditor()
applyCompactTabs()
applyEditorPreferences()
syntaxHighlighter.applyAll()
if newUi.enabled then
newUi.enable()
end
if autoRestoreEnabled then
task.spawn(restoreSavedTabs, false)
end
end