Created
April 25, 2026 22:45
-
-
Save depthso/94341c4783342942fcebd89ef3c3c244 to your computer and use it in GitHub Desktop.
SOURCE CODE FOR ARCEUS X V5 AS OF 04/25/26
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (function() return [[ | |
| /$$$$$$ /$$$$$$$ /$$$$$$ /$$$$$$$$ /$$ /$$ /$$$$$$ /$$ /$$ /$$ /$$ /$$$$$$$ | |
| /$$__ $$| $$__ $$ /$$__ $$| $$_____/| $$ | $$ /$$__ $$ | $$ / $$ | $$ | $$| $$____/ | |
| | $$ \ $$| $$ \ $$| $$ \__/| $$ | $$ | $$| $$ \__/ | $$/ $$/ | $$ | $$| $$ | |
| | $$$$$$$$| $$$$$$$/| $$ | $$$$$ | $$ | $$| $$$$$$ \ $$$$/ | $$ / $$/| $$$$$$$ | |
| | $$__ $$| $$__ $$| $$ | $$__/ | $$ | $$ \____ $$ >$$ $$ \ $$ $$/ |_____ $$ | |
| | $$ | $$| $$ \ $$| $$ $$| $$ | $$ | $$ /$$ \ $$ /$$/\ $$ \ $$$/ /$$ \ $$ | |
| | $$ | $$| $$ | $$| $$$$$$/| $$$$$$$$| $$$$$$/| $$$$$$/ | $$ \ $$ \ $/ | $$$$$$/ | |
| |__/ |__/|__/ |__/ \______/ |________/ \______/ \______/ |__/ |__/ \_/ \______/ | |
| - UI Designed & Built by blackmomo | |
| - Framework & Codebase by riky47 | |
| - Backend by tiahh | |
| Welcome, take a look at this non-skidded source. | |
| ]] end)() | |
| if not LPH_OBFUSCATED then -- Luraph integration | |
| local dummy = function(...) return ... end | |
| LPH_NO_VIRTUALIZE = LPH_NO_VIRTUALIZE or dummy | |
| LPH_NO_UPVALUES = LPH_NO_UPVALUES or dummy | |
| LPH_OBFUSCATED = LPH_OBFUSCATED or false | |
| LPH_JIT_MAX = LPH_JIT_MAX or dummy | |
| LPH_ENCFUNC = LPH_ENCFUNC or dummy | |
| LPH_ENCSTR = LPH_ENCSTR or dummy | |
| LPH_ENCNUM = LPH_ENCNUM or dummy | |
| LPH_CRASH = LPH_CRASH or dummy | |
| LPH_JIT = LPH_JIT or dummy | |
| end | |
| local framework, endpoints do | |
| endpoints = { | |
| arceus_neo = LPH_ENCSTR("https://raw.githubusercontent.com/SPDM-Team/Arceus-X-NEO-public/refs/heads/main"), | |
| xploit = LPH_ENCSTR("https://raw.githubusercontent.com/Riky47/Xploit-Framework/refs/heads/main"), | |
| scriptblox = LPH_ENCSTR("https://scriptblox.com"), | |
| api = LPH_ENCSTR("https://spdmteam.com/api"), | |
| rbxcdn = { | |
| tr = LPH_ENCSTR("https://tr.rbxcdn.com"), | |
| t1 = LPH_ENCSTR("https://t1.rbxcdn.com") | |
| } | |
| } | |
| endpoints.arceus_v = `{endpoints.arceus_neo}/axv5` | |
| pcall(function() loadstring(game:HttpGet(`{endpoints.arceus_neo}/init.lua`))() end) | |
| -- Include Arceus X adapter | |
| local axinclude, axerr = pcall(function() | |
| loadstring(game:HttpGet(`{endpoints.arceus_neo}/adapter.lua`))() | |
| end) | |
| -- Include framework | |
| local cloneref = cloneref or function(...) return ... end | |
| local run: RunService = cloneref(game:GetService("RunService")) | |
| if run:IsStudio() then | |
| if _G.Once then return end _G.Once = true | |
| framework = require(game:GetService("StarterGui"):WaitForChild("Wave"):WaitForChild("WaveFramework")) | |
| else | |
| framework = loadstring(arceus.WHWKIIIIWIIOSU(game:HttpGet(`https://raw.githubusercontent.com/SPDM-Team/Arceus-X-NEO-public/refs/heads/main/axv5/Xploit-Framework/index.lua`)))() | |
| end | |
| if not axinclude and not framework.protected:IsStudio() then | |
| return framework.console.error("Unable to load Arceus X Adapter: " .. axerr) | |
| end | |
| -- Adapter to SPDM file system | |
| local spdminclude, spdmerr = pcall(function() | |
| loadstring(framework.utils.http:Get(`{endpoints.xploit}/mods/spdm-fs.lua`))(framework) | |
| end) | |
| if not spdminclude and not framework.protected:IsStudio() then | |
| return framework.console.error("Unable to load SPDM file system adapter: " .. spdmerr) | |
| end | |
| end | |
| -- Configs | |
| local EXPLOIT_CONFIGS, OS_CONFIGS do | |
| OS_CONFIGS = { | |
| IS_IOS = (framework.env.arceus and framework.env.arceus.is_ios or function() | |
| return (not framework.protected:IsStudio()) and framework.protected:GetService("UserInputService"):GetPlatform() == Enum.Platform.IOS or false | |
| end)(), | |
| IS_VNG = (framework.env.arceus and framework.env.arceus.is_vng or function() | |
| return false | |
| end)(), | |
| DEVICE_INFO = framework.env.arceus and framework.env.arceus.WOWPALAKSZMNXBRU or function() | |
| return false | |
| end, | |
| HWID = (framework.env.gethwid)() | |
| } | |
| OS_CONFIGS.HIDE_PREFIX = OS_CONFIGS.IS_IOS and "" or "." | |
| EXPLOIT_CONFIGS = { | |
| EXPLOIT_FULLNAME = LPH_ENCSTR("Arceus X v5"), | |
| EXPLOIT_IDENTITY = LPH_ENCSTR("Arceus"), | |
| UI_VERSION = LPH_ENCSTR("1.0.0"), | |
| API_CRYPT = LPH_ENCSTR("SPDMTeam_1LPPWJfrnW8BSlsj24D54ghgkXakSd2bztZGJouYfITeRNNZhVFcShtIUlbLZSPJ"), | |
| FILES_KEY = LPH_ENCSTR("ARCEUS_W6dKPSt6TTzAdS4pYVG3IKu9iigp8Kb66bbu9E08Osw9wGUztD5ENIezDxp30Yz7"), | |
| CLOUD_SCRIPTS = OS_CONFIGS.HIDE_PREFIX.. LPH_ENCSTR("cloudscripts.ax"), | |
| SETTINGS_FILE = OS_CONFIGS.HIDE_PREFIX.. LPH_ENCSTR("settings.ax"), | |
| LICENSE_FILE = OS_CONFIGS.HIDE_PREFIX.. LPH_ENCSTR("license.ax"), | |
| VERSION_FILE = OS_CONFIGS.HIDE_PREFIX.. LPH_ENCSTR("version.ax"), | |
| PLUGINS_FILE = OS_CONFIGS.HIDE_PREFIX.. LPH_ENCSTR("plugins.ax"), | |
| TABS_FILE = LPH_ENCSTR("Tabs.json"), | |
| AUTH_FETCH_DELAY = 5, | |
| SETTINGS = { | |
| Popups_Confirmation = true, | |
| Popups_Toast = true, | |
| Colors_Primary = Color3.fromRGB(219, 0, 0):ToHex(), | |
| Colors_Secondary = Color3.fromRGB(0, 0, 0):ToHex(), | |
| Colors_Text_Primary = Color3.fromRGB(255, 255, 255):ToHex(), | |
| Colors_Text_Secondary = Color3.fromRGB(100, 100, 100):ToHex(), | |
| FontSizes_Editor = 16, | |
| TextboxWrapper = false, | |
| Anim_Quality = "High", | |
| Country_Code = "EN", | |
| UI_WindowState = 1, | |
| User_AI_OpenAI = "", | |
| User_Intro = true, | |
| User_EMail = "", | |
| Setting_Fps = 60, | |
| Settings_Afk = false, | |
| Fonts_HeadingItalic = Font.new("rbxasset://fonts/families/Montserrat.json", Enum.FontWeight.Medium, Enum.FontStyle.Italic), | |
| Fonts_Description = Font.new("rbxasset://fonts/families/Montserrat.json", Enum.FontWeight.Light, Enum.FontStyle.Normal), -- Descrizioni secondarie o testi leggeri | |
| Fonts_Editor = Font.new("rbxasset://fonts/families/Inconsolata.json", Enum.FontWeight.Regular, Enum.FontStyle.Normal), | |
| Fonts_Black = Font.new("rbxasset://fonts/families/Montserrat.json", Enum.FontWeight.ExtraBold, Enum.FontStyle.Normal), -- Titoli principali | |
| Fonts_Heading = Font.new("rbxasset://fonts/families/Montserrat.json", Enum.FontWeight.Medium, Enum.FontStyle.Normal), -- Sottotitoli o intestazioni | |
| Fonts_Body = Font.new("rbxasset://fonts/families/Montserrat.json", Enum.FontWeight.SemiBold, Enum.FontStyle.Normal), -- Testo principale | |
| Fonts_Caption = Font.new("rbxasset://fonts/families/Montserrat.json", Enum.FontWeight.Thin, Enum.FontStyle.Italic), -- Annotazioni, piccole etichette | |
| Fonts_Title = Font.new("rbxasset://fonts/families/Montserrat.json", Enum.FontWeight.Bold, Enum.FontStyle.Normal) -- Titoli principali | |
| } | |
| } | |
| framework.protected:ProtectTable(OS_CONFIGS) | |
| framework.protected:ProtectTable(EXPLOIT_CONFIGS) | |
| end | |
| local ARCEUS_FOLDERS do | |
| ARCEUS_FOLDERS = framework.protected:GCProtect({ | |
| AUTOEXECUTE = framework.storage:CreateDirectory(LPH_ENCSTR("autoexecute"), LPH_ENCSTR("Autoexec")), | |
| SCRIPT_HUB = framework.storage:CreateDirectory(LPH_ENCSTR("scripthub"), LPH_ENCSTR("Script Hub")), | |
| WORKSPACE = framework.storage:CreateDirectory(LPH_ENCSTR("workspace"), LPH_ENCSTR("Workspace")),--OS_CONFIGS.IS_IOS and "" or LPH_ENCSTR("Workspace")), | |
| CONFIGS = framework.storage:CreateDirectory(LPH_ENCSTR("configs"), LPH_ENCSTR("Configs")) | |
| }) | |
| -- Sub directories | |
| ARCEUS_FOLDERS.CACHE = ARCEUS_FOLDERS.WORKSPACE:AddSubDirectory(LPH_ENCSTR("cache"), OS_CONFIGS.HIDE_PREFIX.. LPH_ENCSTR("AxCache")) -- Hidden folders should not show pictures in gallery | |
| ARCEUS_FOLDERS.TABS = ARCEUS_FOLDERS.SCRIPT_HUB:AddSubDirectory(LPH_ENCSTR("tabs"), LPH_ENCSTR("Tabs")) | |
| ARCEUS_FOLDERS.RAW = ARCEUS_FOLDERS.CONFIGS:AddSubDirectory(LPH_ENCSTR("raw"), LPH_ENCSTR("Raw")) | |
| -- block folders in workspace | |
| local blocked = framework.protected:GCProtect({ "axcache" }) | |
| local lower, match, err = framework.protected:GetFunction(framework.utils.strings.lower), | |
| framework.protected:GetFunction(framework.utils.strings.match), framework.protected:GetFunction(error) | |
| local writefile = framework.env.getgenv().writefile or function() end | |
| framework.protected:GCProtect(writefile) -- protects the original | |
| writefile = framework.protected:GetFunction(writefile) | |
| local wf = function(path: string, ...) | |
| local low = lower(path) | |
| for _, folder in blocked do | |
| if match(low, "^" ..folder) | |
| or match(low, "^/" ..folder) | |
| or match(low, "^\\" ..folder) | |
| then return err(LPH_ENCSTR("Attempt to write in a restricted folder")) end | |
| end | |
| writefile(path, ...) | |
| end | |
| framework.env.getgenv().writefile = wf | |
| -- clear cache | |
| for _, file in ipairs(ARCEUS_FOLDERS.CACHE:ListFiles()) do | |
| framework.storage.deleteFile(nil, file) | |
| end | |
| framework.protected:ProtectTable(ARCEUS_FOLDERS) | |
| end | |
| -- Configure | |
| framework.enums:AddEnum("TabUpdate", "Name", "Source", "Removed", "Selected", "Unselected") | |
| framework.enums:AddEnum("WindowState", "Base", "Large", "Full") | |
| framework.enums:AddEnum("AnimQuality", "Low", "Medium", "High") | |
| framework.enums:AddEnum("CountryCode", "EN","IT","VI","PT","ID","RU","DE","ES","FR","ZH","JA","AR","HI","TH") | |
| framework.enums:AddEnum("ScriptBloxSort", "None", "CreatedAt", "UpdatedAt", "Views", "LikeCount", "DislikeCount") | |
| framework.enums:AddEnum("ScriptBloxVerify", "None", "Verified", "Unverified") | |
| framework.enums:AddEnum("ScriptBloxType", "None", "Universal", "Specific") | |
| framework.enums:AddEnum("ScriptBloxPatch", "None", "Patched", "Unpatched") | |
| framework.enums:AddEnum("ScriptBloxSearch", "None", "Default", "Strict") | |
| framework.enums:AddEnum("ScriptBloxAuth", "None", "Key", "Keyless") | |
| framework.enums:AddEnum("ScriptBloxOrder", "None", "Asc", "Desc") | |
| framework.enums:AddEnum("ScriptBloxMode", "None", "Free", "Paid") | |
| framework.console:SetTitle(EXPLOIT_CONFIGS.EXPLOIT_FULLNAME) | |
| framework.protected:UseUndetectedContent(not framework.protected:IsStudio()) | |
| framework.settings:SetDirectory(ARCEUS_FOLDERS.CONFIGS) | |
| framework.settings:SetFileName(EXPLOIT_CONFIGS.SETTINGS_FILE) | |
| framework.settings:SetFileKey(EXPLOIT_CONFIGS.FILES_KEY) | |
| framework.settings:SetDefault(EXPLOIT_CONFIGS.SETTINGS) | |
| task.spawn(LPH_NO_VIRTUALIZE(function() -- SaveInstances | |
| if true or framework.protected:IsStudio() then return end -- disabled | |
| local httpService = framework.protected:GetService("HttpService") | |
| local jsonDecode = framework.env.clonefunction(httpService.JSONDecode); | |
| local getScriptBytecode = framework.env.getscriptbytecode; | |
| local isA = framework.env.clonefunction(workspace.IsA); | |
| local data = { | |
| compatiblity = { | |
| binaryStrings = select(1, pcall(framework.env.gethiddenproperty or function() return game.CauseMeAnError; end, workspace.Terrain, "MaterialColors")) == true, | |
| sharedStrings = select(1, pcall(framework.env.gethiddenproperty or function() return game.CauseMeAnError; end, Instance.new("Model"), "ModelMeshData")) == true | |
| }, | |
| xml = { | |
| cframeComponents = { "X", "Y", "Z", "R00", "R01", "R02", "R10", "R11", "R12", "R20", "R21", "R22" }, | |
| customPhysicsComponents = { "Density", "Friction", "Elasticity", "FrictionWeight", "ElasticityWeight" }; | |
| overwrites = { | |
| EnumItem = "token", | |
| Rect = "Rect2D" | |
| }, | |
| pattern = "[&<>\"'\0]", | |
| escapes = { | |
| ["<"] = "<", | |
| [">"] = ">", | |
| ["\""] = """, | |
| ["'"] = "'", | |
| ["&"] = "&", | |
| ["\0"] = "" | |
| } | |
| }, | |
| classes = { | |
| overwrites = { | |
| Enum = "EnumItem", | |
| Class = "Ref" | |
| }, | |
| folders = { | |
| [""] = true, | |
| ["Player"] = true, | |
| ["PlayerGui"] = true, | |
| ["PlayerScripts"] = true | |
| } | |
| } | |
| }; | |
| --[[ Base Functions ]]-- | |
| local function shallowMerge(priority: {string: any}, backup: {string: any}): {string: any} | |
| if type(backup) == "table" then | |
| for i, v in priority do | |
| local backupValue = backup[i]; | |
| if type(v) == type(backupValue) then | |
| priority[i] = backupValue; | |
| end | |
| end | |
| end | |
| return priority; | |
| end | |
| local function newHandler(modifier: (number) -> (string)): {string: any} | |
| return setmetatable({ | |
| count = 0, | |
| cache = {} | |
| }, { | |
| __index = function(t, k) | |
| if t.cache[k] == nil then | |
| t.count += 1; | |
| t.cache[k] = modifier(t.count); | |
| end | |
| return t.cache[k]; | |
| end | |
| }); | |
| end | |
| --[[ Instance Checks ]]-- | |
| local function isService(className: string): boolean | |
| return data.api[className] and data.api[className].isService; | |
| end | |
| local function isViableDecompileScript(scriptInstance: BaseScript): boolean | |
| if scriptInstance:IsA("ModuleScript") then | |
| return true; | |
| elseif scriptInstance:IsA("LocalScript") and (scriptInstance.RunContext == Enum.RunContext.Client or scriptInstance.RunContext == Enum.RunContext.Legacy) then | |
| return true; | |
| elseif scriptInstance:IsA("Script") and scriptInstance.RunContext == Enum.RunContext.Client then | |
| return true; | |
| end | |
| return false; | |
| end | |
| local function getProperty(object: Instance, name: string, value: {string: any}): (boolean, any) | |
| local success, grabbedValue; | |
| if value.isHidden then | |
| if value.valueType == "BinaryString" and data.compatiblity.binaryStrings == false then | |
| return false; | |
| elseif value.valueType == "SharedString" and data.compatiblity.sharedStrings == false then | |
| return false; | |
| end | |
| success, grabbedValue = pcall(framework.env.gethiddenproperty, object, name); | |
| else | |
| success, grabbedValue = pcall(function() | |
| return object[name]; | |
| end); | |
| end | |
| return success, grabbedValue; | |
| end | |
| --[[ Conversion ]]-- | |
| local function convertToBitValue(...: {any}): number | |
| local value = 0; | |
| for i, v in {...} do | |
| if v then | |
| value += 2 ^ (i - 1); | |
| end | |
| end | |
| return value; | |
| end | |
| local function sanitiseStringValue(value: string): string | |
| return string.gsub(value, data.xml.pattern, data.xml.escapes); | |
| end | |
| local function sanitiseNumberValue(value: number, denominations: number): string | |
| if value == 0 or value % 1 == 0 then | |
| return value; | |
| elseif value == math.huge then | |
| return "INF"; | |
| elseif value == -math.huge then | |
| return "-INF"; | |
| elseif value ~= value then | |
| return "NAN"; | |
| elseif denominations == nil then | |
| return value; | |
| end | |
| return string.format("%." .. denominations .. "g", value); | |
| end | |
| --[[ Api ]]-- | |
| local function getClassFromApi(api: {string: any}, class: string): {string: any} | |
| for _, v in api.Classes do | |
| if v.Name == class then | |
| return v; | |
| end | |
| end | |
| end | |
| local function pullApi(): {string: any} | |
| local latestVersion = nil; | |
| local versionArray = string.split(game:HttpGet("https://setup.rbxcdn.com/DeployHistory.txt", true), "\n"); | |
| for i = #versionArray, 1, -1 do | |
| local versionData = string.split(versionArray[i], " "); | |
| if versionData[2] == "Studio64" then | |
| latestVersion = versionData[3]; | |
| break; | |
| end | |
| end | |
| return httpService:JSONDecode(game:HttpGet("http://setup.roblox.com/" .. latestVersion .. "-Full-API-Dump.json", true)); | |
| end | |
| local function generatePropertyData(api: {string: any}, class: {string: any}): {string: any} | |
| local currentClass = class; | |
| local changes = 0; | |
| local properties = {}; | |
| while currentClass and currentClass.Name ~= "<<<ROOT>>>" do | |
| for _, v in currentClass.Members do | |
| if v.MemberType == "Property" and v.Name ~= "Parent" and v.Serialization.CanLoad and v.Serialization.CanSave then | |
| properties[v.Name] = { | |
| valueType = data.classes.overwrites[v.ValueType.Category] or v.ValueType.Name, | |
| isHidden = v.Tags and table.find(v.Tags, "NotScriptable") | |
| }; | |
| end | |
| end | |
| currentClass = getClassFromApi(api, currentClass.Superclass); | |
| changes += 1; | |
| end | |
| return properties; | |
| end | |
| local function generateClassData(api: {string: any}): {string: any} | |
| local generatedClassData = {}; | |
| for _, v in api.Classes do | |
| local classData = { | |
| properties = generatePropertyData(api, v), | |
| defaults = {}, | |
| isService = v.Tags and table.find(v.Tags, "Service") | |
| }; | |
| local success, instance = pcall(Instance.new, v.Name); | |
| if success then | |
| for i2, v2 in classData.properties do | |
| local success2, value = getProperty(instance, i2, v2); | |
| if success2 then | |
| classData.defaults[i2] = value; | |
| end | |
| end | |
| end | |
| generatedClassData[v.Name] = classData; | |
| end | |
| return generatedClassData; | |
| end | |
| --[[ Saveinstance Module ]]-- | |
| local saveinstanceModule = {}; | |
| saveinstanceModule.__index = saveinstanceModule; | |
| function saveinstanceModule.new(options: {string: any}): {string: any} | |
| local metatable = setmetatable({ | |
| database = { "<roblox xmlns:xmime=\"http://www.w3.org/2005/05/xmlmime\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://www.roblox.com/roblox.xsd\" version=\"4\">" }, | |
| options = options, | |
| instances = 0, | |
| exclusions = { | |
| game:GetService("CoreGui"), | |
| game:GetService("CorePackages"), | |
| game:GetService("StarterPlayer").StarterPlayerScripts:FindFirstChild("PlayerModule"), | |
| game:GetService("StarterPlayer").StarterPlayerScripts:FindFirstChild("PlayerScriptsLoader"), | |
| game:GetService("StarterPlayer").StarterPlayerScripts:FindFirstChild("RbxCharacterSounds") | |
| }, | |
| decompiled = {}, | |
| refHandler = newHandler(function(count) | |
| return "RBX" .. count; | |
| end), | |
| sharedStringHandler = newHandler(function(count) | |
| return framework.utils.crypt.base64.encode(tostring(count + 1e15)); | |
| end) | |
| }, saveinstanceModule); | |
| for i, v in metatable.exclusions do | |
| if isViableDecompileScript(v) then | |
| metatable.exclusions[i] = framework.env.getscripthash(v); | |
| end | |
| end | |
| return metatable; | |
| end | |
| function saveinstanceModule:IsExcludedItem(object: Instance): boolean | |
| local isScript = isViableDecompileScript(object); | |
| for _, v in self.exclusions do | |
| if v == object then | |
| return true; | |
| elseif isScript and type(v) == "string" then | |
| local s, r = pcall(framework.env.getscripthash, object); | |
| if s and r == v then | |
| return true; | |
| end | |
| end | |
| end | |
| if object:IsA("Player") then | |
| return true; | |
| end | |
| return false; | |
| end | |
| function saveinstanceModule:CreateBaseDirectory(name: string): Folder | |
| local folder = Instance.new("Folder"); | |
| folder.Name = name; | |
| task.defer(function() | |
| folder:Destroy(); | |
| end); | |
| return folder; | |
| end | |
| function saveinstanceModule:GetProperty(object: Instance, name: string, value: {string: any}): (boolean, any) | |
| if name == "Source" and self.decompiled[object] then | |
| return true, self.decompiled[object]; | |
| end | |
| return getProperty(object, name, value); | |
| end | |
| function saveinstanceModule:ParseProperty(value: any, valueType: string, bypassSanitising: boolean): string | |
| if valueType == "Axes" then | |
| return string.format("<axes>%d</axes>", convertToBitValue(value.X, value.Y, value.Z)); | |
| elseif valueType == "BinaryString" then | |
| return value == "" and "" or self:ParseProperty(framework.utils.crypt.base64.encode(value), "ProtectedString"); | |
| elseif valueType == "bool" then | |
| return value and "true" or "false"; | |
| elseif valueType == "BrickColor" then | |
| return value.Number; | |
| elseif valueType == "CFrame" or valueType == "CoordinateFrame" then | |
| local ret = ""; | |
| for _, v in data.xml.cframeComponents do | |
| ret ..= string.format("<%s>%%g</%s>", v, v); | |
| end | |
| return string.format(ret, value:GetComponents()); | |
| elseif valueType == "Color3" then | |
| return string.format("<R>%g</R><G>%g</G><B>%g</B>", value.R, value.G, value.B); | |
| elseif valueType == "Color3uint8" then | |
| return 0xFF000000 + (math.floor(value.R * 255) * 0x10000) + (math.floor(value.G * 255) * 0x100) + math.floor(value.B * 255) | |
| elseif valueType == "ColorSequence" then | |
| local ret = {}; | |
| for _, v in value.Keypoints do | |
| ret[#ret + 1] = string.format("%g %g %g %g 0", v.Time, v.Value.R, v.Value.G, v.Value.B); | |
| end | |
| return table.concat(ret, " "); | |
| elseif valueType == "Content" or valueType == "ContentId" then | |
| if value == "" then | |
| return "<null></null>"; | |
| end | |
| return string.format("<url>%s</url>", sanitiseStringValue(value)); | |
| elseif valueType == "DateTime" then | |
| return value.UnixTimestampMillis; | |
| elseif valueType == "double" then | |
| return sanitiseNumberValue(value, 16); | |
| elseif valueType == "EnumItem" then | |
| return value.Value; | |
| elseif valueType == "Faces" then | |
| return string.format("<faces>%d</faces>", convertToBitValue(value.Right, value.Top, value.Back, value.Left, value.Bottom, value.Front)); | |
| elseif valueType == "float" then | |
| return sanitiseNumberValue(value, 8); | |
| elseif valueType == "Font" then | |
| return string.format("<Family>%s</Family><Weight>%s</Weight><Style>%s</Style>", self:ParseProperty(value.Family, "Content"), value.Weight.Value, value.Style.Name); | |
| elseif valueType == "int" or valueType == "int64" then | |
| return sanitiseNumberValue(value); | |
| elseif valueType == "NumberRange" then | |
| return string.format("%g %g", value.Min, value.Max); | |
| elseif valueType == "NumberSequence" then | |
| local ret = {}; | |
| for _, v in value.Keypoints do | |
| ret[#ret + 1] = string.format("%g %g %g", v.Time, v.Value, v.Envelope); | |
| end | |
| return table.concat(ret, " "); | |
| elseif valueType == "PhysicalProperties" then | |
| local ret = string.format("<CustomPhysics>%s</CustomPhysics>", value and "true" or "false"); | |
| if value then | |
| for _, v in data.xml.customPhysicsComponents do | |
| ret ..= string.format("<%s>%g</%s>", v, value[v], v); | |
| end | |
| end | |
| return ret; | |
| elseif valueType == "ProtectedString" then | |
| return string.format("<![CDATA[%s]]>", bypassSanitising and value or sanitiseStringValue(value)); | |
| elseif valueType == "Ray" then | |
| return string.format("<origin>%s</origin><direction>%s</direction>", self:ParseProperty(value.Origin, "Vector3"), self:ParseProperty(value.Direction, "Vector3")); | |
| elseif valueType == "Rect" then | |
| return string.format("<min>%s</min><max>%s</max>", self:ParseProperty(value.Min, "Vector2"), self:ParseProperty(value.Max, "Vector2")); | |
| elseif valueType == "Ref" then | |
| return value and self.refHandler[value] or "null"; | |
| elseif valueType == "SharedString" then | |
| return self.sharedStringHandler[framework.utils.crypt.base64.encode(value)]; | |
| elseif valueType == "string" then | |
| return sanitiseStringValue(value); | |
| elseif valueType == "UDim" then | |
| return string.format("<S>%g</S><O>%d</O>", value.Scale, value.Offset); | |
| elseif valueType == "UDim2" then | |
| return string.format("<XS>%g</XS><XO>%d</XO><YS>%g</YS><YO>%d</YO>", value.X.Scale, value.X.Offset, value.Y.Scale, value.Y.Offset); | |
| elseif valueType == "UniqueId" then | |
| return false; | |
| elseif valueType == "Vector2" or valueType == "Vector2int16" then | |
| return string.format("<X>%g</X><Y>%g</Y>", value.X, value.Y); | |
| elseif valueType == "Vector3" or valueType == "Vector3int16" then | |
| return string.format("<X>%g</X><Y>%g</Y><Z>%g</Z>", value.X, value.Y, value.Z); | |
| end | |
| -- print("Unaccounted for type found:", valueType); | |
| return ""; | |
| end | |
| function saveinstanceModule:GetPropertyXml(propertyName: string, value: any, valueType: string): string | |
| local xmlValue = self:ParseProperty(value, valueType, propertyName == "Source"); | |
| local newTag = data.xml.overwrites[valueType] or valueType; | |
| local xmlString = string.format("<%s name=\"%s\">%s</%s>", newTag, propertyName, xmlValue or "", newTag); | |
| if xmlValue then | |
| return xmlString; | |
| end | |
| return "<!-- " .. xmlString .. " -->"; | |
| end | |
| function saveinstanceModule:ParseObject(object: Instance, altChildren: {number: Instance} | nil): nil | |
| if self:IsExcludedItem(object) then | |
| return; | |
| end | |
| local className = data.classes.folders[object.ClassName] and "Folder" or object.ClassName; | |
| table.insert(self.database, string.format("<Item class=\"%s\" referent=\"%s\">", className, self.refHandler[object])); | |
| local objectData = data.api[className]; | |
| if objectData then | |
| table.insert(self.database, "<Properties>"); | |
| for i, v in objectData.properties do | |
| local success, grabbedValue = self:GetProperty(object, i, v); | |
| if success and (self.options.excludeDefaults == false or grabbedValue ~= objectData.defaults[i]) then | |
| if typeof(grabbedValue) ~= "Content" then | |
| table.insert(self.database, self:GetPropertyXml(i, grabbedValue, v.valueType)); | |
| end | |
| end | |
| end | |
| table.insert(self.database, "</Properties>"); | |
| self.instances += 1; | |
| else | |
| -- print("Unaccounted for className found:", object:GetFullName()); | |
| end | |
| for _, v in altChildren or object:GetChildren() do | |
| self:ParseObject(v); | |
| end | |
| table.insert(self.database, "</Item>"); | |
| end | |
| function saveinstanceModule:AppendSharedStrings() | |
| if self.sharedStringHandler.count > 0 then | |
| table.insert(self.database, "<SharedStrings>"); | |
| for i, v in self.sharedStringHandler.cache do | |
| table.insert(self.database, string.format("<SharedString md5=\"%s\">%s</SharedString>", v, i)); | |
| end | |
| table.insert(self.database, "</SharedStrings>"); | |
| end | |
| end | |
| function saveinstanceModule:CollectScripts(inst: Instance | {number: Instance}, cache: {number: Instance} | nil): {number: Instance} | |
| local store = cache or {}; | |
| for i, v in typeof(inst) == "table" and inst or inst:GetChildren() do | |
| if not self:IsExcludedItem(v) then | |
| if isViableDecompileScript(v) then | |
| store[#store + 1] = v; | |
| end | |
| self:CollectScripts(v, store); | |
| end | |
| end | |
| return store; | |
| end | |
| function saveinstanceModule:Decompile() | |
| local scripts = self:CollectScripts(game); | |
| if self.options.includeNil then | |
| self:CollectScripts(framework.env.getnilinstances(), scripts); | |
| end | |
| framework.console.info("Collected Scripts! Decompiling.."); | |
| for i, v in framework.env.decompile(scripts, "debug") do | |
| self.decompiled[scripts[i]] = v; | |
| end | |
| end | |
| function saveinstanceModule:Save(): nil | |
| local tick1 = tick(); | |
| if data.api == nil then | |
| framework.console.info("Grabbing API.."); | |
| data.api = generateClassData(pullApi()); | |
| end | |
| if self.options.excludeScripts then | |
| framework.console.info("Grabbed API! Parsing map.."); | |
| else | |
| framework.console.info("Grabbed API! Collecting scripts.."); | |
| self:Decompile(); | |
| framework.console.info("Decompiled! Parsing map.."); | |
| end | |
| local tick2 = tick(); | |
| local gameChildren = {}; | |
| for _, v in game:GetChildren() do | |
| if isService(v.ClassName) then | |
| self:ParseObject(v); | |
| else | |
| table.insert(gameChildren, v); | |
| end | |
| end | |
| if self.options.includeNil then | |
| local nilInstances = framework.env.getnilinstances(); -- This happens first so it doesn't put itself in the folder | |
| self:ParseObject(self:CreateBaseDirectory("Nil Instances"), nilInstances); | |
| end | |
| if #gameChildren > 0 then | |
| self:ParseObject(self:CreateBaseDirectory("Game Instances"), gameChildren); | |
| end | |
| self:AppendSharedStrings(); | |
| table.insert(self.database, "</roblox>"); | |
| local tick3 = tick(); | |
| ARCEUS_FOLDERS.WORKSPACE:WriteFile(self.options.fileName .. ".rbxlx", table.concat(self.database, "")); | |
| local endTick = tick(); | |
| framework.console.print([[Saveinstance finished! | |
| Time taken (api grab): ]] .. tostring(math.floor((tick2 - tick1) * 1000)) .. [[ms | |
| Time taken (computing): ]] .. tostring(math.floor((tick3 - tick2) * 1000)) .. [[ms | |
| Time taken (average per instance): ]] .. tostring(math.floor(((tick3 - tick2) / self.instances) * 1000)) .. [[ms | |
| Time taken (write): ]] .. tostring(math.floor((endTick - tick3) * 1000)) .. [[ms | |
| Time taken (total): ]] .. tostring(math.floor((endTick - tick1) * 1000)) .. [[ms]]); | |
| end | |
| --[[ Environment ]]-- | |
| framework.env.getgenv().saveinstance = function(options: {string: any} | nil) | |
| framework.console.info("'Saveinstance' is now initiated..") | |
| saveinstanceModule.new(shallowMerge({ | |
| fileName = tostring(game.PlaceId), | |
| includeNil = true, | |
| excludeScripts = false, | |
| excludeDefaults = true | |
| }, options)):Save(); | |
| end; | |
| end)) | |
| -- Create dependencies | |
| do -- gui | |
| local this, utils = {}, {} | |
| this.utils = utils | |
| if not LPH_OBFUSCATED then -- Luraph integration | |
| local dummy = function(...) return ... end | |
| LPH_NO_VIRTUALIZE = LPH_NO_VIRTUALIZE or dummy | |
| LPH_NO_UPVALUES = LPH_NO_UPVALUES or dummy | |
| LPH_OBFUSCATED = LPH_OBFUSCATED or false | |
| LPH_JIT_MAX = LPH_JIT_MAX or dummy | |
| LPH_ENCFUNC = LPH_ENCFUNC or dummy | |
| LPH_ENCSTR = LPH_ENCSTR or dummy | |
| LPH_ENCNUM = LPH_ENCNUM or dummy | |
| LPH_CRASH = LPH_CRASH or dummy | |
| LPH_JIT = LPH_JIT or dummy | |
| end | |
| function utils:CreateDummy(parent: Instance?) | |
| return self.ui:AddInstance("Frame", { | |
| Size = UDim2.fromScale(1, 1), | |
| Visible = false, | |
| Parent = parent | |
| }) | |
| end | |
| function utils:GetStartCoords(): Vector2 | |
| local obj = self:CreateDummy() | |
| local coords = obj.instance.AbsolutePosition | |
| obj:Remove() | |
| return coords | |
| end | |
| function utils:GetScreenRatio(parent: Instance?): number | |
| local obj = self:CreateDummy(parent) | |
| local viewportSize = obj.instance.AbsoluteSize | |
| obj:Remove() | |
| local width, height = viewportSize.X, viewportSize.Y | |
| return self.player_gui.CurrentScreenOrientation == Enum.ScreenOrientation.Portrait | |
| and height / width or width / height | |
| end | |
| function utils:GetSafeScreenRatio(): number | |
| local ui = self.framework.interface.new() | |
| ui.instance.ScreenInsets = Enum.ScreenInsets.CoreUISafeInsets | |
| ui.instance.IgnoreGuiInset = true | |
| local ratio = self:GetScreenRatio(ui) | |
| ui:Remove() | |
| return ratio | |
| end | |
| function utils:GetPadding(): number | |
| return (utils.player_gui.CurrentScreenOrientation == Enum.ScreenOrientation.Portrait and | |
| self.ui.instance.AbsoluteSize.X or self.ui.instance.AbsoluteSize.Y) *12 /1080 | |
| end | |
| function utils:GetAnimationResolution(quality: string) | |
| quality = quality or utils.framework.settings:GetDefaultSetting("Anim_Quality") | |
| quality = utils.framework.enums.AnimQuality[quality] | |
| return ({Vector2.new(32, 32), Vector2.new(64, 64), Vector2.new(128, 128)})[quality] | |
| end | |
| function utils:GetAnimationDensity(quality: string, duration: string) | |
| quality = quality or utils.framework.settings:GetDefaultSetting("Anim_Quality") | |
| quality = utils.framework.enums.AnimQuality[quality] | |
| duration = duration or 1 | |
| return ({24 *duration, 32 *duration, 64 *duration})[quality] | |
| end | |
| function utils:AddAnimation(id: string, options: {any}, frameGen: (idx: number, frames: number) -> buffer, priority: number, ...: any) | |
| local quality = utils.framework.settings:GetDefaultSetting("Anim_Quality") | |
| local res = options.Resolution | |
| options.Resolution = res or self:GetAnimationResolution(quality) | |
| options.Density = options.Density or self:GetAnimationDensity(quality, options.Duration) | |
| local raws = utils.framework.storage:GetDirectory("raw") | |
| local content = options.raw | |
| if not content and not raws:IsFile(id) and not utils.framework.protected:IsStudio() then | |
| local res = utils.framework.dependencies.exploit:DownloadFile(`/raw/{id}`) | |
| if res then raws:WriteFile(id, res) | |
| content = res | |
| end | |
| end | |
| local anim = utils.framework.animator.fromRaw(id, options, content or raws:ReadFile(id), frameGen) | |
| anim.RenderOnLoad = options.RenderOnLoad | |
| anim.Duration = options.Duration | |
| anim.FixedResolution = res | |
| for _, tag in ipairs(options.Tags or {}) do | |
| utils.animsTags[tag] = utils.animsTags[tag] or {} | |
| utils.framework.utils.tables.insert(utils.animsTags[tag], anim) | |
| end | |
| function anim:Save() | |
| if not anim.Loaded then return end | |
| raws:WriteFile(id, anim:GetRaw()) | |
| end | |
| if utils.framework.protected:IsStudio() then | |
| local fps = anim:GetMaxFPS(); | |
| (fps < 24 and utils.framework.console.warn or utils.framework.console.print | |
| )(`Animation '{id}' running at max: {fps} FPS`) | |
| end | |
| utils.framework.utils.tables.insert(utils.anims, anim) | |
| return anim | |
| end | |
| function utils:GetAnimation(id: string) | |
| return utils.framework.renderer:GetBinding(id) | |
| end | |
| function utils:GetAnimationByTag(tag: string) | |
| return utils.animsTags[tag] or {} | |
| end | |
| function utils:Translate(texts: {string}) | |
| local value = utils.framework.enums.CountryCode[utils.framework.settings:GetSetting("Country_Code")] | |
| or utils.framework.enums.CountryCode[utils.framework.settings:GetDefaultSetting("Country_Code")] | |
| return texts[value] | |
| end | |
| function utils:Setup(framework, ui) | |
| utils.framework = framework | |
| utils.ui = ui | |
| --utils.color_properties = framework.protected:GCProtect({"BackgroundColor3", "TextColor3", "BorderColor3", "ImageColor3", "GroupColor3", "TextStrokeColor3", "ScrollBarImageColor3", "PlaceholderColor3", "VideoColor3", "SurfaceColor3", "HoverBackgroundColor3", "SelectedTabTextColor3"}) | |
| utils.anims = framework.protected:GCProtect({}) | |
| utils.animsTags = framework.protected:GCProtect({}) | |
| utils.player_gui = framework.protected:GetService("Players") | |
| .LocalPlayer:WaitForChild("PlayerGui") | |
| -- load settings | |
| local arceus_layout, cache = {}, framework.protected:GCProtect({}) | |
| framework.env.getgenv().arceus_layout = arceus_layout | |
| framework.settings.OnSettingChanged:Connect(framework.protected:GCProtect(LPH_JIT_MAX(function(setting: string, value: any, default: any) | |
| if utils.framework.utils.strings.sub(setting, 1, 5) == "User_" then | |
| return -- Prevents data from being set in arceus_layout | |
| elseif utils.framework.utils.strings.sub(setting, 1, 7) == "Colors_" then | |
| local succ, err = pcall(Color3.fromHex, value) | |
| value = succ and err or Color3.fromHex(default) | |
| for _, inst in ipairs(utils.ui:GetByTag(setting)) do | |
| local props = inst[setting] | |
| if not props then continue end | |
| if typeof(props) == "function" then | |
| props(value) | |
| continue | |
| end | |
| for _, prop in ipairs(props) do | |
| inst.instance[prop] = value | |
| end | |
| end | |
| elseif utils.framework.utils.strings.sub(setting, 1, 10) == "FontSizes_" then | |
| value = tonumber(value) or default | |
| for _, inst in ipairs(utils.ui:GetByTag(setting)) do | |
| inst.instance.TextSize = value | |
| end | |
| elseif utils.framework.utils.strings.sub(setting, 1, 6) == "Fonts_" then | |
| local font = default | |
| if typeof(value) == "string" then | |
| font = framework.utils.strings.fromFormatted(value) | |
| end | |
| for _, inst in ipairs(utils.ui:GetByTag(setting)) do | |
| inst.instance.FontFace = font | |
| end | |
| elseif utils.framework.utils.strings.sub(setting, 1, 14) == "UI_WindowState" then | |
| value = framework.utils.maths.clamp(value, framework.enums.WindowState.Base, framework.enums.WindowState.Full) | |
| for _, inst in ipairs(utils.ui:GetByTag(setting)) do | |
| local props = inst[setting] | |
| if not props then continue end | |
| for prop, values in pairs(props) do | |
| cache[inst] = cache[inst] or {} | |
| cache[inst][prop] = cache[inst][prop] or inst.instance[prop] | |
| inst.instance[prop] = values[value] or cache[inst][prop] | |
| end | |
| end | |
| elseif setting == "Country_Code" then | |
| value = utils.framework.enums.CountryCode[value] | |
| or utils.framework.enums.CountryCode[default] | |
| for _, inst in ipairs(utils.ui:GetByTag(setting)) do | |
| local onCC = inst[`On_{setting}`] | |
| if onCC then onCC(value) end | |
| local translations = inst[setting] | |
| if translations and (translations[value] or translations[1]) then | |
| inst.instance.Text = translations[value] or translations[1] | |
| end | |
| translations = inst[`{setting}_Placeholder`] | |
| if not translations or not (translations[value] or translations[1]) then continue end | |
| inst.instance.PlaceholderText = translations[value] or translations[1] | |
| end | |
| end | |
| arceus_layout[setting] = value | |
| end))) | |
| function utils:EndSetup() | |
| ui.OnInstanceAdded:Connect(framework.protected:GCProtect(LPH_JIT_MAX(function(inst) | |
| for _, tag in ipairs(inst:GetTags()) do | |
| local default = framework.settings:GetDefaultSetting(tag) | |
| local value = framework.settings:GetSetting(tag) | |
| if not value and not default then continue end | |
| if utils.framework.utils.strings.sub(tag, 1, 7) == "Colors_" then | |
| local props = inst[tag] | |
| if not props then continue end | |
| local succ, err = pcall(Color3.fromHex, value) | |
| value = succ and err or Color3.fromHex(default) | |
| if typeof(props) == "function" then | |
| props(value) | |
| continue | |
| end | |
| for _, prop in ipairs(props) do | |
| inst.instance[prop] = value | |
| end | |
| elseif utils.framework.utils.strings.sub(tag, 1, 10) == "FontSizes_" then | |
| value = tonumber(value) or default | |
| inst.instance.TextSize = value | |
| elseif utils.framework.utils.strings.sub(tag, 1, 6) == "Fonts_" then | |
| local font = default | |
| if typeof(value) == "string" then | |
| font = framework.utils.strings.fromFormatted(value) | |
| end | |
| inst.instance.FontFace = font | |
| elseif utils.framework.utils.strings.sub(tag, 1, 14) == "UI_WindowState" then | |
| local props = inst[tag] | |
| if not props then continue end | |
| value = framework.utils.maths.clamp(value, framework.enums.WindowState.Base, framework.enums.WindowState.Full) | |
| for prop, values in pairs(props) do | |
| cache[inst] = cache[inst] or {} | |
| cache[inst][prop] = cache[inst][prop] or inst.instance[prop] | |
| inst.instance[prop] = values[value] or cache[inst][prop] | |
| end | |
| elseif tag == "Country_Code" then | |
| local translations = inst[tag] | |
| value = utils.framework.enums.CountryCode[value] | |
| or utils.framework.enums.CountryCode[default] | |
| if translations and (translations[value] or translations[1]) then | |
| inst.instance.Text = translations[value] or translations[1] | |
| end | |
| translations = inst[`{tag}_Placeholder`] | |
| if not translations or not (translations[value] or translations[1]) then continue end | |
| inst.instance.PlaceholderText = translations[value] or translations[1] | |
| end | |
| end | |
| end))) | |
| local playerGui = framework.protected:GetService("Players").LocalPlayer:WaitForChild("PlayerGui") | |
| local debounce = false | |
| playerGui:GetPropertyChangedSignal("CurrentScreenOrientation"):Connect(framework.protected:GCProtect(function() | |
| ui:Get("MainFrame").instance.Position = UDim2.fromScale(.5, .5) | |
| ui.nextSize(framework.enums.WindowState.Base) | |
| --[[ if debounce then return end | |
| debounce = true | |
| local rotation = playerGui.CurrentScreenOrientation ~= Enum.ScreenOrientation.Portrait and 0 or -90 | |
| for _, child in ipairs(ui.instance:GetChildren()) do | |
| if child:IsA("GuiObject") then child.Rotation = rotation end | |
| end | |
| debounce = false ]] | |
| end)) | |
| end | |
| framework.settings:GetSettingChangedSignal(LPH_ENCSTR("User_EMail")):Connect(framework.protected:GCProtect(function(value: string) | |
| local emailBox = ui:Get(LPH_ENCSTR("EmailBox")) | |
| if not emailBox then return end | |
| emailBox.instance.Text = tostring(value) | |
| end)) | |
| framework.settings:GetSettingChangedSignal("Anim_Quality"):Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(value: string) | |
| if not utils.animsInitialized then return end | |
| for _, anim in ipairs(utils.anims) do | |
| local value = anim.FixedResolution or value | |
| anim:Generate(utils:GetAnimationResolution(value), utils:GetAnimationDensity(value, anim.Duration)) | |
| anim:Save() | |
| if anim.RenderOnLoad then anim:Render() end | |
| end | |
| end))) | |
| ui.OnInstanceAdded:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(inst) | |
| if inst.instance:IsA("GuiButton") then | |
| inst.instance.MouseButton1Down:Connect(function() | |
| utils:Vibrate(Enum.HapticEffectType.UIClick) | |
| end) | |
| end | |
| end))) | |
| local uis = framework.protected:GetService("UserInputService") | |
| local run = framework.protected:GetService("RunService") | |
| local fakeFocus = false | |
| uis.TextBoxFocused:Connect(LPH_NO_VIRTUALIZE(function(tb: TextBox) | |
| local custom = ui:Get(tb) | |
| if custom and custom:HasTags("No_Focus") then return end | |
| local overall = framework.settings:GetSetting("TextboxWrapper") | |
| if tb:IsDescendantOf(overall and ui.instance.Parent or ui.instance) and not tb.MultiLine then -- "blacklist" | |
| if fakeFocus then | |
| fakeFocus = false | |
| return | |
| end | |
| local editable = tb.TextEditable | |
| run.Heartbeat:Wait() | |
| local toast = utils:ShowToast("InputToast", { | |
| PlaceholderText = {"Text here...","Testo qui...","Văn bản ở đây...","Texto aqui...","Teks di sini...","Текст здесь...","Text hier...","Texto aquí...","Texte ici...","文本在此...","ここにテキスト...","النص هنا...","यहाँ पाठ...","ข้อความที่นี่..."}, | |
| Style = utils.currentPage.id == "Page_ArceusIntelligence" and "ai" or "info", | |
| Callback = function(txt: string) | |
| if editable then | |
| fakeFocus = true | |
| run.Heartbeat:Wait() | |
| tb:CaptureFocus() | |
| tb.Text = framework.utils.strings.sub(txt, 1, 199999) | |
| run.Heartbeat:Wait() | |
| tb:ReleaseFocus() | |
| end | |
| end | |
| }) | |
| toast.instance.ZIndex = 999 | |
| local customTb = toast.tb.instance | |
| local txt = tb.Text | |
| customTb.TextEditable = editable | |
| customTb.Text = txt | |
| customTb.CursorPosition = framework.utils.strings.len(txt) +1 | |
| end | |
| end)) | |
| local haptic: HapticEffect = ui:AddInstance("HapticEffect", {}).instance | |
| function utils:Vibrate(type: Enum.HapticEffectType, duration: number?) | |
| duration = tonumber(duration) | |
| haptic.Type = type or Enum.HapticEffectType.UINotification | |
| haptic.Looped = duration and true or false | |
| pcall(haptic.Play, haptic) | |
| if duration then | |
| task.wait(duration) | |
| pcall(haptic.Stop, haptic) | |
| end | |
| end | |
| end | |
| function utils:EditorMode(enabled: boolean, offset: number) | |
| local TweenService = game:GetService("TweenService") | |
| local main = utils.ui:Get("MainFrame").instance | |
| local newState, targetPos | |
| if enabled then | |
| utils.prevSate = utils.ui.windowState | |
| utils.prevPos = main.Position | |
| newState = utils.framework.enums.WindowState.Base | |
| -- targetPos = UDim2.fromScale(.5, offset) -- disabled after roblox keyboard updates | |
| else | |
| newState = utils.prevSate or utils.ui.windowState | |
| targetPos = utils.prevPos or main.Position | |
| end | |
| utils.ui.nextSize(newState) | |
| local tweenInfo = TweenInfo.new(.35, Enum.EasingStyle.Sine, Enum.EasingDirection.Out) | |
| local tw = TweenService:Create(main, tweenInfo, { Position = targetPos }) | |
| tw:Play() | |
| utils:AnimateCascade(utils.ui:Get("Page_Executor").instance, { | |
| TweenInfo = TweenInfo.new(.5, Enum.EasingStyle.Back, Enum.EasingDirection.Out), | |
| DelayBetween = .01, | |
| SkipTransparency = true, | |
| Direction = "BottomToTop" and enabled or "TopToBottom" | |
| }) | |
| end | |
| function utils:GetTweenInfos(delay: number, duration: number, style: Enum.EasingStyle, direction: Enum.EasingDirection, rep: number, inv: boolean) | |
| return TweenInfo.new(duration or .25, style or Enum.EasingStyle.Quad, direction or Enum.EasingDirection.Out, rep or 0, inv or false, delay or 0) | |
| end | |
| function utils:ClosePopup() | |
| local pop = utils.lastPopup | |
| if pop then pop:Remove() | |
| utils.lastPopup = nil | |
| return true | |
| end | |
| end | |
| function utils:ShowPopup(class: string, ...: any) | |
| self:ClosePopup() | |
| utils.lastPopup = utils.ui:AddComponent(class, ...) | |
| utils:Vibrate(Enum.HapticEffectType.UINotification) | |
| end | |
| function utils:ShowToast(class: string, props: {any}, ...) | |
| local main = utils.ui:Get("MainFrame") | |
| main:Tween(utils:GetTweenInfos(), { GroupTransparency = .9 }) | |
| local toast, once | |
| props.Close = function(...: any) | |
| if once then return end | |
| once = true | |
| toast:Remove() | |
| main:Tween(utils:GetTweenInfos(), { GroupTransparency = 0 }) | |
| if props.Callback then props.Callback(...) end | |
| end | |
| toast = utils.ui:AddComponent(class, props, ...) | |
| if utils.ui:Get(`{class}_{props.Id}`) then | |
| utils.AnimateCascade(utils.ui:Get(`{class}_{props.Id}`).instance,{ | |
| DelayBetween = .5, | |
| TweenInfo = TweenInfo.new(5, Enum.EasingStyle.Back, Enum.EasingDirection.Out), | |
| }) | |
| end | |
| utils:Vibrate(Enum.HapticEffectType.UINotification) | |
| return toast | |
| end | |
| utils.AnimateCascade = LPH_NO_VIRTUALIZE(function(self, frameParam, opts) | |
| if not utils.ui.Loaded then return end | |
| local TweenService = utils.framework.protected:GetService("TweenService") | |
| opts = opts or {} | |
| local rawOffset = opts.StartOffset or opts.AnimateSelf and UDim2.new(0, 0, .015, 0) or UDim2.new(0, 0, .15, 0) | |
| local tweenInfo = opts.TweenInfo or TweenInfo.new(.6, Enum.EasingStyle.Back, Enum.EasingDirection.Out) | |
| local delayBetween = opts.DelayBetween or .0075 | |
| local globalLimit = opts.Limit | |
| local excludeNames = {} | |
| if opts.ExcludeNames then | |
| for _, name in ipairs(opts.ExcludeNames) do | |
| excludeNames[name] = true | |
| end | |
| end | |
| local scaleDirection = opts.ScaleDirection or "In" | |
| local scaleCascade = (opts.ScaleCascade == true) | |
| local startScaleOffset | |
| if type(opts.StartScaleOffset) == "number" then | |
| startScaleOffset = utils.framework.utils.maths.clamp(opts.StartScaleOffset, 0, utils.framework.utils.maths.huge) | |
| else | |
| startScaleOffset = (scaleDirection == "In") and .9 or 1.05 | |
| end | |
| local skipTransparency = (opts.SkipTransparency == true) | |
| local animateSelf = (opts.AnimateSelf == true) | |
| local limitMap = opts.LimitMap or {} | |
| local startOffset | |
| if animateSelf then | |
| local vp = workspace.CurrentCamera.ViewportSize | |
| local offsetX = rawOffset.X.Scale * vp.X + rawOffset.X.Offset | |
| local offsetY = rawOffset.Y.Scale * vp.Y + rawOffset.Y.Offset | |
| startOffset = UDim2.new(0, utils.framework.utils.maths.floor(offsetX + .5), 0, utils.framework.utils.maths.floor(offsetY + .5)) | |
| else | |
| startOffset = rawOffset | |
| end | |
| local root = utils.framework.utils.instances.getRobloxInstance(frameParam) | |
| if not root then return end | |
| local activeTweens = {} | |
| utils._cascadeOriginals = utils._cascadeOriginals or {} | |
| local objs = {} | |
| local collect; collect = function(parent) | |
| for _, child in ipairs(parent:GetChildren()) do | |
| if child:IsA("GuiObject") and child.Visible then | |
| local inst = utils.ui:Get(child) | |
| if not inst or excludeNames[inst.id] then continue end | |
| utils.framework.utils.tables.insert(objs, child) | |
| collect(child) | |
| end | |
| end | |
| end | |
| collect(root) | |
| if animateSelf then | |
| utils.framework.utils.tables.insert(objs, 1, root) | |
| end | |
| for _, child in ipairs(objs) do | |
| if not utils._cascadeOriginals[child] then | |
| local hasText, textVal = pcall(function() return child.TextTransparency end) | |
| local hasImage, imageVal = pcall(function() return child.ImageTransparency end) | |
| utils._cascadeOriginals[child] = { | |
| BackgroundTransparency = child.BackgroundTransparency, | |
| ImageTransparency = hasImage and imageVal or nil, | |
| TextTransparency = hasText and textVal or nil, | |
| Position = child.Position, | |
| Size = child.Size | |
| } | |
| end | |
| end | |
| for _, child in ipairs(objs) do | |
| local orig = utils._cascadeOriginals[child] | |
| if not skipTransparency then | |
| local t0 = (type(opts.StartTransparency) == "number") | |
| and utils.framework.utils.maths.clamp(opts.StartTransparency, 0, 1) or 1 | |
| child.BackgroundTransparency = t0 | |
| if orig.TextTransparency then | |
| child.TextTransparency = t0 | |
| end | |
| if orig.ImageTransparency then | |
| child.ImageTransparency = t0 | |
| end | |
| end | |
| if scaleCascade then | |
| local osz = orig.Size | |
| local sStart = UDim2.new( | |
| osz.X.Scale * startScaleOffset, | |
| osz.X.Offset * startScaleOffset, | |
| osz.Y.Scale * startScaleOffset, | |
| osz.Y.Offset * startScaleOffset | |
| ) | |
| local tweenerIn = TweenService:Create(child, | |
| TweenInfo.new(.15, Enum.EasingStyle.Linear, Enum.EasingDirection.Out), { Size = sStart }) | |
| tweenerIn:Play() | |
| table.insert(activeTweens, tweenerIn) | |
| else | |
| local startPos = orig.Position + startOffset | |
| local tweenerIn = TweenService:Create(child, | |
| TweenInfo.new(.15, Enum.EasingStyle.Linear, Enum.EasingDirection.Out), { Position = startPos }) | |
| tweenerIn:Play() | |
| table.insert(activeTweens, tweenerIn) | |
| end | |
| end | |
| task.spawn(function() | |
| task.wait(.15) | |
| local parentCounts = {} | |
| for i, child in ipairs(objs) do | |
| local orig = utils._cascadeOriginals[child] | |
| local parent = child.Parent | |
| if not parent then continue end | |
| parentCounts[parent] = (parentCounts[parent] or 0) + 1 | |
| local perLim = limitMap[parent] | |
| local count = parentCounts[parent] | |
| local useIt | |
| if perLim then | |
| useIt = (count <= perLim) | |
| else | |
| useIt = (not globalLimit) or (i <= globalLimit) | |
| end | |
| if useIt then | |
| task.spawn(function() | |
| task.wait((i - 1) * delayBetween) | |
| local goal = {} | |
| if scaleCascade then | |
| goal.Size = orig.Size | |
| else | |
| goal.Position = orig.Position | |
| end | |
| if not skipTransparency then | |
| goal.BackgroundTransparency = orig.BackgroundTransparency | |
| if orig.TextTransparency then | |
| goal.TextTransparency = orig.TextTransparency | |
| end | |
| if orig.ImageTransparency then | |
| goal.ImageTransparency = orig.ImageTransparency | |
| end | |
| end | |
| local tweenerOut = TweenService:Create(child, tweenInfo, goal) | |
| tweenerOut:Play() | |
| utils.framework.utils.tables.insert(activeTweens, tweenerOut) | |
| end) | |
| else | |
| if scaleCascade then | |
| child.Size = orig.Size | |
| else | |
| child.Position = orig.Position | |
| end | |
| if not skipTransparency then | |
| child.BackgroundTransparency = orig.BackgroundTransparency | |
| if orig.TextTransparency then | |
| child.TextTransparency = orig.TextTransparency | |
| end | |
| if orig.ImageTransparency then | |
| child.ImageTransparency = orig.ImageTransparency | |
| end | |
| end | |
| end | |
| end | |
| task.wait((#objs * delayBetween) + tweenInfo.Time) | |
| for _, t in ipairs(activeTweens) do | |
| pcall(function() t:Cancel() end) | |
| end | |
| end) | |
| end) | |
| utils.AddSlimeEffect = LPH_NO_VIRTUALIZE(function(self, frameWrapper: {any}, targetWrappers: {any}, options: {any}) | |
| local UserInputService: UserInputService = utils.framework.protected:GetService("UserInputService") | |
| local TweenService: TweenService = utils.framework.protected:GetService("TweenService") | |
| local RunService: RunService = utils.framework.protected:GetService("RunService") | |
| local opts = { | |
| returnTweenInfo = TweenInfo.new(.6, Enum.EasingStyle.Back, Enum.EasingDirection.Out), | |
| referenceSize = Vector2.new(1920, 1080), | |
| movementFactor = .15, | |
| cascadeDelay = .0075, | |
| antialias = true | |
| } | |
| if options then | |
| for k, v in pairs(options) do opts[k] = v end | |
| end | |
| local frame = utils.framework.utils.instances.getRobloxInstance(frameWrapper) | |
| frame.Active = true | |
| local originalFrameAbsPos = frame.AbsolutePosition | |
| local all = targetWrappers.All or {} | |
| local originalPositions = {} | |
| local targets = {} | |
| targetWrappers.All = nil | |
| for page, wrappers in pairs(targetWrappers) do | |
| targets[page.Content] = {} | |
| for _, w in ipairs(wrappers) do | |
| local gui = utils.framework.utils.instances.getRobloxInstance(w) | |
| if gui and gui:IsA("GuiObject") then | |
| utils.framework.utils.tables.insert(targets[page.Content], gui) | |
| originalPositions[gui] = gui.Position | |
| end | |
| end | |
| for _, w in ipairs(all) do | |
| local gui = utils.framework.utils.instances.getRobloxInstance(w) | |
| if gui and gui:IsA("GuiObject") then | |
| utils.framework.utils.tables.insert(targets[page.Content], gui) | |
| originalPositions[gui] = gui.Position | |
| end | |
| end | |
| end | |
| local getScaleFactors = utils.framework.protected:GCProtect(function() | |
| local vp = workspace.CurrentCamera.ViewportSize | |
| return opts.referenceSize.X / vp.X, opts.referenceSize.Y / vp.Y | |
| end) | |
| local prevFrameAbsPos = frame.AbsolutePosition | |
| local isDragging = false | |
| local activeTweens = {} | |
| local reset = utils.framework.protected:GCProtect(function() | |
| isDragging = false | |
| RunService.Heartbeat:Wait() | |
| for i, gui in ipairs(targets[utils.currentPage] or {}) do | |
| task.spawn(function() | |
| task.wait((i - 1) * opts.cascadeDelay) | |
| local tw = TweenService:Create(gui, opts.returnTweenInfo, { | |
| Position = originalPositions[gui] | |
| }) | |
| utils.framework.utils.tables.insert(activeTweens, tw) | |
| tw:Play() | |
| end) | |
| end | |
| end) | |
| frame.InputBegan:Connect(utils.framework.protected:GCProtect(function(input) | |
| if not isDragging and (input.UserInputType == Enum.UserInputType.MouseButton1 or | |
| input.UserInputType == Enum.UserInputType.Touch) then | |
| isDragging = true | |
| if #activeTweens > 0 then | |
| for _, tw in ipairs(activeTweens) do | |
| pcall(function() tw:Cancel() end) | |
| end | |
| activeTweens = {} | |
| end | |
| originalFrameAbsPos = frame.AbsolutePosition | |
| prevFrameAbsPos = originalFrameAbsPos | |
| input.Changed:Once(function() | |
| if input.UserInputState == Enum.UserInputState.End then | |
| reset() | |
| end | |
| end) | |
| end | |
| end)) | |
| frame.InputEnded:Connect(reset) | |
| UserInputService.InputEnded:Connect(utils.framework.protected:GCProtect(function(input) | |
| if isDragging then reset() end | |
| end)) | |
| RunService.RenderStepped:Connect(utils.framework.protected:GCProtect(function() | |
| if not isDragging then return end | |
| local currAbsPos = frame.AbsolutePosition | |
| local vp = workspace.CurrentCamera.ViewportSize | |
| local scaleX, scaleY = opts.referenceSize.X /vp.X, opts.referenceSize.Y /vp.Y | |
| local invX = -(currAbsPos.X -originalFrameAbsPos.X) *opts.movementFactor *scaleX | |
| local invY = -(currAbsPos.Y -originalFrameAbsPos.Y) *opts.movementFactor *scaleY | |
| for _, gui in ipairs(targets[utils.currentPage]) do | |
| local orig = originalPositions[gui] | |
| if opts.antialias then | |
| gui.Position = UDim2.new( | |
| orig.X.Scale, orig.X.Offset + invX, | |
| orig.Y.Scale, orig.Y.Offset + invY | |
| ) | |
| else | |
| gui.Position = orig + UDim2.new(0, invX, 0, invY) | |
| end | |
| end | |
| end)) | |
| end) | |
| ------------------------------------------------------------ | |
| function this:LoadAnimations() | |
| for _, anim in ipairs(utils.anims) do | |
| if not anim.Loaded then | |
| anim:Generate() | |
| anim:Save() | |
| task.wait() | |
| end | |
| if anim.RenderOnLoad then | |
| anim:Render() | |
| end | |
| end | |
| utils.animsInitialized = true | |
| end | |
| function this:Draw(framework) -- Enables roblox studio suggestions | |
| if false then framework = require("../../Wave/WaveFramework") end | |
| local ui, tweens, padding do | |
| ui = framework.interface.new() | |
| ui.instance.ZIndexBehavior = Enum.ZIndexBehavior.Sibling | |
| ui.instance.ScreenInsets = Enum.ScreenInsets.None | |
| utils:Setup(framework, ui) | |
| padding = utils:GetPadding() | |
| tweens = { | |
| glow = utils:GetTweenInfos(0, 4, Enum.EasingStyle.Exponential, Enum.EasingDirection.InOut, -1, true), | |
| delaied_fast_windows = utils:GetTweenInfos(.25, .25, Enum.EasingStyle.Quart), | |
| fast_windows = utils:GetTweenInfos(0, .15, Enum.EasingStyle.Quart), | |
| windows = utils:GetTweenInfos(0, .5, Enum.EasingStyle.Quart), | |
| slow_default = utils:GetTweenInfos(0, .5), | |
| default = utils:GetTweenInfos() | |
| } | |
| framework.protected:ProtectTable(tweens) | |
| ui.windowState = framework.enums.WindowState.Base | |
| local playerGui = framework.protected:GetService("Players").LocalPlayer:WaitForChild("PlayerGui") | |
| local sizes = framework.protected:GCProtect({ UDim2.fromScale(.5, .5), UDim2.fromScale(.75, .75), UDim2.fromScale(1, 1) }) | |
| ui.currentSize = framework.protected:GCProtect(function() | |
| return sizes[ui.windowState] | |
| end) | |
| local prevPos | |
| ui.nextSize = framework.protected:GCProtect(LPH_JIT_MAX(function(size: number?) | |
| utils:AnimateCascade(ui:Get("MaximizeButton").instance, { | |
| AnimateSelf = true, | |
| ScaleCascade = true, | |
| ScaleDirection = "In", | |
| SkipTransparency = true | |
| }) | |
| local prevState = ui.windowState | |
| ui.windowState = size or ui.windowState + 1 | |
| if ui.windowState > framework.enums.WindowState.Full then | |
| ui.windowState = framework.enums.WindowState.Base | |
| end | |
| local newSize = (ui.windowState == framework.enums.WindowState.Full) and "Full" or "Other" | |
| local prevSize = (prevState == framework.enums.WindowState.Full) and "Full" or "Other" | |
| local portrait = playerGui.CurrentScreenOrientation == Enum.ScreenOrientation.Portrait | |
| local isFull = ui.windowState == framework.enums.WindowState.Full and not portrait | |
| local main = ui:Get("MainFrame") | |
| if ui.Loaded then framework.settings:SetSetting("UI_WindowState", ui.windowState) end | |
| ui:Get("MainCorner").instance.CornerRadius = UDim.new(isFull and 0 or .075, 0) | |
| ui:Get("SafeRatio"):SetParent(isFull and ui:Get("InnerMain") or {}) | |
| ui:Get("Ratio169"):SetParent(isFull and {} or main) | |
| main:SetDraggable(not isFull) | |
| main:Tween(tweens.slow_default, { | |
| Position = isFull and UDim2.fromScale(.5, .5) or main.Position, | |
| GroupTransparency = .75, | |
| Size = ui.currentSize() | |
| }) | |
| utils:AnimateCascade(utils.currentPage, { | |
| ExcludeNames = { "MagicNicknameContainer", "BarFilter", "GridFilter", "ScriptsBar", "CloudBestScriptsBar", "BestScriptsBar", "AIPlayerBackgroundOverlay", "Slider_Gravity_Bar", "Slider_Jump_Bar", "Slider_Speed_Bar" }, | |
| ScaleDirection = prevSize == "Full" and newSize ~= "Full" and "In" or "Out", | |
| SkipTransparency = true, | |
| ScaleCascade = true | |
| }) | |
| main:Tween(tweens.delaied_fast_windows, { | |
| GroupTransparency = 0 | |
| }) | |
| end)) | |
| local open = true | |
| local lastPos, lastSize | |
| ui.close = framework.protected:GCProtect(LPH_JIT_MAX(function() | |
| utils:AnimateCascade(ui:Get("CloseButton").instance, { | |
| AnimateSelf = true, | |
| ScaleCascade = true, | |
| ScaleDirection = "In", | |
| SkipTransparency = true | |
| }) | |
| if not open or utils:ClosePopup() then return end | |
| local main, ficon = ui:Get("MainFrame"), ui:Get("FloatingIcon") | |
| lastPos = main.instance.Position | |
| main:Tween(tweens.windows, { | |
| Size = UDim2.fromScale(0, 0), | |
| }) | |
| main:Tween(tweens.slow_default, { | |
| Position = UDim2.fromScale(.5, 1), | |
| GroupTransparency = 1, | |
| Visible = false | |
| }) | |
| for _, anim in ipairs(utils:GetAnimationByTag("MainFrame")) do anim:Pause() end | |
| ficon.instance.Visible = true | |
| ficon:Tween(tweens.windows, { | |
| ImageTransparency = 0, | |
| Size = lastSize | |
| }).Completed:Wait() | |
| utils:AnimateCascade(ficon, { | |
| AnimateSelf = true, | |
| SkipTransparency = true, | |
| ScaleCascade = true, | |
| ScaleDirection = "Out" | |
| }) | |
| open = false | |
| end)) | |
| ui.open = framework.protected:GCProtect(LPH_JIT_MAX(function() | |
| if open then return end | |
| local main, ficon = ui:Get("MainFrame"), ui:Get("FloatingIcon") | |
| utils:AnimateCascade(ficon.instance, { | |
| SkipTransparency = true | |
| }) | |
| lastSize = ficon.instance.Size | |
| ficon:Tween(tweens.windows, { | |
| Size = UDim2.fromScale(0, 0), | |
| ImageTransparency = 1, | |
| Visible = false | |
| }) | |
| main.instance.Visible = true | |
| main:Tween(tweens.windows, { | |
| Size = ui.currentSize(), | |
| }) | |
| utils:AnimateCascade(utils.currentPage, { | |
| EnterTweenInfo = TweenInfo.new(.15, Enum.EasingStyle.Linear, Enum.EasingDirection.Out), | |
| TweenInfo = TweenInfo.new(.4, Enum.EasingStyle.Back, Enum.EasingDirection.Out), | |
| ExcludeNames = { "BarFilter", "GridFilter", "CloudBestScriptsBar", "BestScriptsBar", "AIPlayerBackgroundOverlay", "Slider_Gravity_Bar", "Slider_Jump_Bar", "Slider_Speed_Bar" }, | |
| SkipTransparency = true, | |
| ScaleDirection = "In", | |
| DelayBetween = .005, | |
| ScaleCascade = true, | |
| Limit = nil | |
| }) | |
| for _, anim in ipairs(utils:GetAnimationByTag("MainFrame")) do anim:Render() end | |
| main:Tween(tweens.slow_default, { | |
| GroupTransparency = 0, | |
| Position = lastPos, | |
| }).Completed:Wait() | |
| open = true | |
| end)) | |
| local skip | |
| local setLog = framework.protected:GCProtect(function(text: string) | |
| local log = ui:Get("ShadeText") | |
| if log and log.instance then | |
| log.instance.Text = text | |
| end | |
| end) | |
| ui.getLoading = framework.protected:GCProtect(function() | |
| local back = ui:Get("Background") | |
| local phase = 1 | |
| local exitBtn = framework.utils.inputs.buttons.holdable(back) | |
| local loading, phases = {}, { | |
| function() | |
| if back and back.instance then | |
| back:Tween(TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), { | |
| BackgroundTransparency = .4 | |
| }) | |
| end | |
| local id = "BackgroundOverlay" | |
| local anim = utils:GetAnimation(id) | |
| if anim then anim:Render() end | |
| local obj = ui:Get(id) | |
| if obj and obj.instance then | |
| obj:Tween(TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 1.5), { | |
| ImageTransparency = 0 | |
| }) | |
| end | |
| local tween = TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 5) | |
| for _, id in ipairs({"BottomShadeLeft", "BottomShadeRight"}) do | |
| local obj = ui:Get(id) | |
| if not obj or not obj.instance then continue end | |
| obj:Tween(tween, { BackgroundTransparency = 0 }) | |
| end | |
| task.wait(6) | |
| end, | |
| function() setLog("Launching…") | |
| local tween = TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0) | |
| for _, id in ipairs({"ShadeTitle", "ShadeText"}) do | |
| local obj = ui:Get(id) | |
| if not obj or not obj.instance then continue end | |
| obj:Tween(tween, { TextTransparency = 0 }) | |
| end | |
| task.wait(2) | |
| end, | |
| function() setLog("Loaded") | |
| local tween = TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0) | |
| local id = "BackgroundOverlay" | |
| if back and back.instance then | |
| back:Tween(tween, { BackgroundTransparency = 1, Visible = false }) | |
| end | |
| local b = ui:Get(id) | |
| if b and b.instance then | |
| b:Tween(tween, { ImageTransparency = 1, Visible = false }) | |
| end | |
| for _, id in ipairs({"ShadeTitle", "ShadeText"}) do | |
| local obj = ui:Get(id) | |
| if not obj or not obj.instance then continue end | |
| obj:Tween(tween, { TextTransparency = 1, Visible = false }) | |
| end | |
| for _, id in ipairs({"BottomShadeLeft", "BottomShadeRight"}) do | |
| local obj = ui:Get(id) | |
| if not obj or not obj.instance then continue end | |
| obj:Tween(tween, { BackgroundTransparency = 1, Visible = false }) | |
| end | |
| task.delay(1.1, function() | |
| if exitBtn then exitBtn:Remove() end | |
| local anim = utils:GetAnimation(id) | |
| if anim then anim:Unbind() end | |
| end) | |
| end, | |
| function() | |
| local id = "StartingScreen" | |
| local page = ui:Get(id) | |
| local screen = ui:Get(id) | |
| if page and page.instance then | |
| page.instance.Visible = true | |
| end | |
| local anim = utils:GetAnimation(id) | |
| if anim then anim:Render() end | |
| if back and back.instance then | |
| back:Tween(TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false), { | |
| BackgroundTransparency = .4 | |
| }) | |
| end | |
| --screen:Tween(TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false), { | |
| -- ImageTransparency = 0 | |
| --}) | |
| if screen and screen.instance then | |
| screen:Tween(TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false,2), { | |
| ImageTransparency = .15 | |
| }) | |
| end | |
| --task.wait(1) | |
| if page and page.instance then | |
| utils:AnimateCascade(page, { | |
| DelayBetween = .5, | |
| TweenInfo = TweenInfo.new(3, Enum.EasingStyle.Back, Enum.EasingDirection.Out), | |
| }) | |
| end | |
| end, | |
| function(callback: () -> any) | |
| --[[local action | |
| task.delay(10, function() | |
| if action then return end | |
| action = true | |
| callback() | |
| end)]] | |
| for i=10, 1, -1 do | |
| --print("Check in:", i) | |
| task.wait(1) | |
| end | |
| local btn = ui:Get("StartButton") | |
| btn.instance.MouseButton1Click:Wait() | |
| --[[if action then return end | |
| action = true]] | |
| callback() | |
| end, | |
| function() | |
| local id = "StartingScreen" | |
| local page = ui:Get(id) | |
| --task.wait(8) | |
| --page.instance.Visible = true | |
| local anim = utils:GetAnimation(id) | |
| if anim then anim:Unbind() end | |
| if page and page.instance then | |
| page.instance.Visible = false | |
| page:Remove() | |
| end | |
| if back and back.instance then | |
| back:Remove() | |
| end | |
| task.delay(1.1, ui.close) | |
| end | |
| } | |
| local function doPhase(n: number, callback: () -> any) | |
| local action = phases[n] | |
| if not action then return end | |
| phase = n +1 | |
| action(callback) | |
| end | |
| function loading:Skip(n: number, callback: () -> any) | |
| doPhase(n or #phases, callback) | |
| return self | |
| end | |
| function loading:Advance(n: number, callback: () -> any) | |
| if skip then return self end | |
| doPhase(phase, callback) | |
| if n and n > 1 then self:Advance(n -1, callback) end | |
| return self | |
| end | |
| exitBtn.OnLongPress:Connect(function(clickTime: number) | |
| setLog("Skipping…") | |
| exitBtn:Remove() | |
| exitBtn = nil | |
| skip = true | |
| loading:Skip(3) | |
| end) | |
| return loading | |
| end) | |
| end | |
| -- Components | |
| ui:CreateComponent("ButtonToast").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: {any}) | |
| local glowStyle, colorStyle, gradientStyle = { | |
| info = "rbxassetid://128601429542160", | |
| error = "rbxassetid://105234289135931", | |
| success = "rbxassetid://89752107107901", | |
| confirm = "rbxassetid://128601429542160" | |
| }, { | |
| info = Color3.fromHex("#006AFF"), | |
| error = Color3.fromHex("#F00"), | |
| success = Color3.fromHex("#0F0"), | |
| confirm = Color3.fromHex("#006AFF") | |
| }, { | |
| info = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#449EF8")), | |
| ColorSequenceKeypoint.new(.33, Color3.fromHex("#73A5F4")), | |
| ColorSequenceKeypoint.new(.66, Color3.fromHex("#3894FF")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#2A87FF")) | |
| }), | |
| error = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#FA3232")), | |
| ColorSequenceKeypoint.new(.33, Color3.fromHex("#F47373")), | |
| ColorSequenceKeypoint.new(.66, Color3.fromHex("#FF3838")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#FF2929")) | |
| }), | |
| success = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#17FD4D")), | |
| ColorSequenceKeypoint.new(.33, Color3.fromHex("#73F591")), | |
| ColorSequenceKeypoint.new(.66, Color3.fromHex("#38FF67")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#1DFF52")) | |
| }), | |
| confirm = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#449EF8")), | |
| ColorSequenceKeypoint.new(.33, Color3.fromHex("#73A5F4")), | |
| ColorSequenceKeypoint.new(.66, Color3.fromHex("#3894FF")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#2A87FF")) | |
| }), | |
| } | |
| local glowButton = ui:AddInstance("ImageLabel", { | |
| Image = glowStyle[props.Style] or glowStyle.info, -- glowing toast button | |
| BackgroundTransparency = 1, | |
| ZIndex = 10 | |
| }) | |
| local additionalTitle = ui:AddInstance("TextLabel", { | |
| Visible = props.AdditionalTitle and true or false, | |
| TextXAlignment = Enum.TextXAlignment.Center, | |
| AutomaticSize = Enum.AutomaticSize.Y, | |
| Position = UDim2.fromScale(.5, .1), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| Size = UDim2.fromScale(.7, .35), | |
| BackgroundTransparency = 1, | |
| TextSize = padding * 10, | |
| TextWrapped = true, | |
| Text = "", | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Title"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| Country_Code = props.AdditionalTitle | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(0, padding), | |
| PaddingTop = UDim.new(0, padding) | |
| }), ui:AddInstance("UIGradient", { | |
| Color = gradientStyle[props.Style] or gradientStyle.info, | |
| Rotation = 210 | |
| })) | |
| local additionalText = ui:AddInstance("TextLabel", { | |
| Visible = props.AdditionalText and true or false, | |
| TextXAlignment = Enum.TextXAlignment.Center, | |
| AutomaticSize = Enum.AutomaticSize.Y, | |
| Position = UDim2.fromScale(.5, .325), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| Size = UDim2.fromScale(.7, .2), | |
| BackgroundTransparency = 1, | |
| TextSize = padding * 6, | |
| TextWrapped = true, | |
| Text = "", | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Title"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| Country_Code = props.AdditionalText | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(0, padding), | |
| PaddingTop = UDim.new(0, padding) | |
| })) | |
| local button = ui:AddInstance("TextButton", { | |
| BackgroundColor3 = Color3.fromHex("#FFF"), | |
| AutomaticSize = Enum.AutomaticSize.XY, | |
| Position = UDim2.fromScale(.5, .6), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| BackgroundTransparency = .8, | |
| ZIndex = 9, | |
| Text = "", | |
| MouseButton1Click = function() | |
| props.Close(true) | |
| end | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingRight = UDim.new(0, padding *3.5), | |
| PaddingBottom = UDim.new(0, padding *2), | |
| PaddingLeft = UDim.new(0, padding *3.5), | |
| PaddingTop = UDim.new(0, padding *2) | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(0, padding *5) | |
| }), ui:AddInstance("UIListLayout", { | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| VerticalAlignment = Enum.VerticalAlignment.Center, | |
| FillDirection = Enum.FillDirection.Vertical, | |
| HorizontalFlex = Enum.UIFlexAlignment.Fill, | |
| VerticalFlex = Enum.UIFlexAlignment.Fill, | |
| SortOrder = Enum.SortOrder.LayoutOrder | |
| }), ui:AddInstance("Frame", { | |
| AutomaticSize = Enum.AutomaticSize.XY, | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| BackgroundTransparency = 1 | |
| }), ui:AddInstance("TextLabel", { | |
| AutomaticSize = Enum.AutomaticSize.XY, | |
| Position = UDim2.fromScale(.5,.5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| BackgroundTransparency = 1, | |
| TextSize = padding * 4, | |
| TextWrapped = true, | |
| Text = "", | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Title"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| Country_Code = props.Style == "confirm" and | |
| {"Confirm","Conferma","Xác nhận","Confirmar","Konfirmasi","Подтвердить","Bestätigen","Confirmar","Confirmer","确认","確認","تأكيد","पुष्टि करें","ยืนยัน"}or {"Ok"} | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(0, padding), | |
| PaddingTop = UDim.new(0, padding) | |
| }))) | |
| local main = ui:AddInstance("TextButton", { | |
| Id = `ButtonToast_{props.Id}` or "ButtonToast_", | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| MouseButton1Click = props.Close, | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = .25, | |
| AutoButtonColor = false, | |
| ZIndex = 1499, | |
| Text = "" | |
| }, ui:AddInstance("ImageLabel", { | |
| Id = "ToastGlow", | |
| ImageColor3 = colorStyle[props.Style] or colorStyle.info, | |
| Position = UDim2.fromScale(0, 0), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1 | |
| }, additionalTitle, additionalText, glowButton, button)) | |
| local function update() | |
| local size, pos = button.instance.AbsoluteSize, button.instance.AbsolutePosition | |
| glowButton.instance.Size = UDim2.fromOffset(size.X *2, size.Y *4) | |
| local siz = glowButton.instance.AbsoluteSize | |
| glowButton.instance.Position = UDim2.fromOffset(pos.X -(siz.X -size.X)/2, pos.Y -(siz.Y -size.Y) /3) --+size.Y /1.75) -- Image is not centered | |
| end | |
| update() | |
| glowButton:Tween(TweenInfo.new( | |
| 1.5, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut, -1, true), { | |
| ImageTransparency = .5 | |
| }) | |
| button.instance:GetPropertyChangedSignal("AbsoluteSize"):Connect(update) | |
| button.instance:GetPropertyChangedSignal("AbsolutePosition"):Connect(update) | |
| return main | |
| end))) | |
| ui:CreateComponent("InputToast").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: {any}) | |
| local glowStyle, colorStyle, gradientStyle = { | |
| info = "rbxassetid://128601429542160", | |
| error = "rbxassetid://105234289135931", | |
| success = "rbxassetid://89752107107901", | |
| ai = "rbxassetid://93050869167661" | |
| }, { | |
| info = Color3.fromHex("#006AFF"), | |
| error = Color3.fromHex("#F00"), | |
| success = Color3.fromHex("#0F0"), | |
| ai = Color3.fromHex("#FA54A8") | |
| }, { | |
| info = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#449EF8")), | |
| ColorSequenceKeypoint.new(.33, Color3.fromHex("#73A5F4")), | |
| ColorSequenceKeypoint.new(.66, Color3.fromHex("#3894FF")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#2A87FF")) | |
| }), | |
| error = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#FA3232")), | |
| ColorSequenceKeypoint.new(.33, Color3.fromHex("#F47373")), | |
| ColorSequenceKeypoint.new(.66, Color3.fromHex("#FF3838")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#FF2929")) | |
| }), | |
| success = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#17FD4D")), | |
| ColorSequenceKeypoint.new(.33, Color3.fromHex("#73F591")), | |
| ColorSequenceKeypoint.new(.66, Color3.fromHex("#38FF67")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#1DFF52")) | |
| }), | |
| ai = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#FF0000")), | |
| ColorSequenceKeypoint.new(.4, Color3.fromHex("#FF3869")), | |
| ColorSequenceKeypoint.new(.7, Color3.fromHex("#F473EC")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#15A6FE")) | |
| }) | |
| } | |
| local glowButton = ui:AddInstance("ImageLabel", { | |
| Image = glowStyle[props.Style] or glowStyle.info, -- glowing toast button | |
| BackgroundTransparency = 1, | |
| ZIndex = 10 | |
| }) | |
| local additionalText = ui:AddInstance("TextLabel", { | |
| Visible = props.AdditionalText and true or false, | |
| TextXAlignment = Enum.TextXAlignment.Center, | |
| AutomaticSize = Enum.AutomaticSize.Y, | |
| Position = UDim2.fromScale(.5, .1), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| Size = UDim2.fromScale(.8, .2), | |
| BackgroundTransparency = 1, | |
| TextSize = padding * 6, | |
| TextWrapped = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Title"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| Country_Code = props.AdditionalText | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(0, padding), | |
| PaddingTop = UDim.new(0, padding) | |
| }), ui:AddInstance("UIGradient", { | |
| Color = gradientStyle[props.Style] or gradientStyle.info, | |
| Rotation = 210 | |
| })) | |
| local box = ui:AddInstance("TextBox", { | |
| PlaceholderText = "Insert text here...", | |
| TextTruncate = Enum.TextTruncate.AtEnd, | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| ClearTextOnFocus = false, | |
| TextSize = padding * 4, | |
| Text = "", | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Title", "No_Focus"}, | |
| Country_Code_Placeholder = props.PlaceholderText, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }) | |
| local textbox = ui:AddInstance("Frame", { | |
| BackgroundColor3 = Color3.fromHex("#FFF"), | |
| AutomaticSize = Enum.AutomaticSize.Y, | |
| Position = UDim2.fromScale(.5, .25), | |
| Size = UDim2.fromScale(.85, .115), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| BackgroundTransparency = .8, | |
| ZIndex = 9 | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(0, padding *2), | |
| PaddingRight = UDim.new(0, padding *3.5), | |
| PaddingLeft = UDim.new(0, padding *2), | |
| PaddingTop = UDim.new(0, padding *2) | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(0, padding *5) | |
| }), box) | |
| local main = ui:AddInstance("Frame", { | |
| Id = `Toast_{props.Id}`, | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Size = UDim2.fromScale(1, 1), | |
| ZIndex = 1499 | |
| }, ui:AddInstance("UIGradient", { | |
| Rotation = 90, | |
| Transparency = NumberSequence.new({ | |
| NumberSequenceKeypoint.new(0, .25), | |
| NumberSequenceKeypoint.new(1, 1) | |
| }) | |
| }), ui:AddInstance("ImageLabel", { | |
| Id = "ToastGlow", | |
| ImageColor3 = colorStyle[props.Style] or colorStyle.info, | |
| Position = UDim2.fromScale(0, 0), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1 | |
| }, additionalText, glowButton, textbox)) | |
| local function update() | |
| local size, pos = textbox.instance.AbsoluteSize, textbox.instance.AbsolutePosition | |
| local aiMultiplier = props.Style == "ai" and 1.4 or 1 | |
| glowButton.instance.Size = UDim2.fromOffset(size.X *1.4 * aiMultiplier, size.Y *4) | |
| local siz = glowButton.instance.AbsoluteSize | |
| glowButton.instance.Position = UDim2.fromOffset(pos.X -(siz.X -size.X)/2, pos.Y -(siz.Y -size.Y)/3) -- Image is not centered | |
| -- glowButton.instance.Position = UDim2.fromOffset(pos.X -(siz.X -size.X)/2, pos.Y -(siz.Y -size.Y)/2 +size.Y /1.75) | |
| end | |
| update() | |
| glowButton:Tween(TweenInfo.new( | |
| 1.5, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut, -1, true), { | |
| ImageTransparency = .5 | |
| }) | |
| textbox.instance:GetPropertyChangedSignal("AbsoluteSize"):Connect(update) | |
| textbox.instance:GetPropertyChangedSignal("AbsolutePosition"):Connect(update) | |
| box.instance:CaptureFocus() | |
| box.instance.FocusLost:Once(function() props.Close(box.instance.Text) end) | |
| main.tb = box | |
| return main | |
| end))) | |
| ui:CreateComponent("Toast").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: {any}) | |
| local glowStyle, iconStyle, colorStyle = { | |
| info = "rbxassetid://128601429542160", | |
| error = "rbxassetid://105234289135931", | |
| success = "rbxassetid://89752107107901" | |
| }, { | |
| info = "rbxassetid://102895040094534", | |
| error = "rbxassetid://137768773239157", | |
| success = "rbxassetid://99252037962470" | |
| }, { | |
| success = Color3.fromHex("#0F0"), | |
| info = Color3.fromHex("#006AFF"), | |
| error = Color3.fromHex("#F00") | |
| } | |
| local glowButton = ui:AddInstance("ImageLabel", { | |
| Image = glowStyle[props.Style] or glowStyle.info, -- glowing toast button | |
| BackgroundTransparency = 1, | |
| ZIndex = 10 | |
| }) | |
| local button = ui:AddInstance("TextButton", { | |
| BackgroundColor3 = Color3.fromHex("#FFF"), | |
| AutomaticSize = Enum.AutomaticSize.XY, | |
| Position = UDim2.fromScale(.5, .1), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| BackgroundTransparency = .8, | |
| ZIndex = 9, | |
| Text = "", | |
| MouseButton1Click = props.Close | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingRight = UDim.new(0, padding *3.5), | |
| PaddingBottom = UDim.new(0, padding *2), | |
| PaddingLeft = UDim.new(0, padding *2), | |
| PaddingTop = UDim.new(0, padding *2) | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(0, padding *5) | |
| }), ui:AddInstance("UIListLayout", { | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| VerticalAlignment = Enum.VerticalAlignment.Center, | |
| FillDirection = Enum.FillDirection.Vertical, | |
| HorizontalFlex = Enum.UIFlexAlignment.Fill, | |
| VerticalFlex = Enum.UIFlexAlignment.Fill, | |
| SortOrder = Enum.SortOrder.LayoutOrder | |
| }), ui:AddInstance("Frame", { | |
| AutomaticSize = Enum.AutomaticSize.XY, | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIListLayout", { | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| VerticalAlignment = Enum.VerticalAlignment.Center, | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| HorizontalFlex = Enum.UIFlexAlignment.Fill, | |
| VerticalFlex = Enum.UIFlexAlignment.Fill, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| Padding = UDim.new(0, padding*1.5) | |
| }), ui:AddInstance("ImageLabel", { | |
| Image = iconStyle[props.Style] or iconStyle.info, -- icon | |
| AutomaticSize = Enum.AutomaticSize.XY, | |
| Position = UDim2.fromScale(0, .5), | |
| AnchorPoint = Vector2.new(0, .5), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddInstance("TextLabel", { | |
| AutomaticSize = Enum.AutomaticSize.XY, | |
| AnchorPoint = Vector2.new(1, .5), | |
| BackgroundTransparency = 1, | |
| TextSize = padding * 4, | |
| TextWrapped = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Title"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| Country_Code = props.Text | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(0, padding), | |
| PaddingTop = UDim.new(0, padding) | |
| })))) | |
| local main = ui:AddInstance("Frame", { | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| ZIndex = 499 | |
| }, ui:AddInstance("UIGradient", { | |
| Rotation = 90, | |
| Transparency = NumberSequence.new({ | |
| NumberSequenceKeypoint.new(0, .25), | |
| NumberSequenceKeypoint.new(1, 1) | |
| }) | |
| }), ui:AddInstance("ImageLabel", { | |
| Id = "ToastGlow", | |
| ImageColor3 = colorStyle[props.Style] or colorStyle.info, | |
| Position = UDim2.fromScale(0, 0), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| }, glowButton, button)) | |
| local function update() | |
| local size, pos = button.instance.AbsoluteSize, button.instance.AbsolutePosition | |
| glowButton.instance.Size = UDim2.fromOffset(size.X *1.6, size.Y *4) | |
| local siz = glowButton.instance.AbsoluteSize | |
| glowButton.instance.Position = UDim2.fromOffset(pos.X -(siz.X -size.X) /2, pos.Y -(siz.Y -size.Y) /3) --+size.Y /1.75) -- Image is not centered | |
| end | |
| update() | |
| glowButton:Tween(TweenInfo.new( | |
| 1.5, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut, -1, true), { | |
| ImageTransparency = .5 | |
| }) | |
| button.instance:GetPropertyChangedSignal("AbsoluteSize"):Connect(update) | |
| button.instance:GetPropertyChangedSignal("AbsolutePosition"):Connect(update) | |
| return main | |
| end))) | |
| ui:CreateComponent("Shade").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: {any}) | |
| return ui:AddInstance("Frame", { | |
| Id = props.Id or nil, | |
| BorderSizePixel = 0, | |
| BackgroundTransparency = 1, | |
| Size = props.Size or UDim2.fromScale(0, 0), | |
| Position = props.Position or UDim2.fromScale(0, 0) | |
| }, ui:AddInstance("UIGradient", { | |
| Id = props.Id and framework.utils.strings.format("%s_Gradient", props.Id) or nil, | |
| Rotation = props.Rotation or 0, | |
| Color = props.Color or ColorSequence.new(Color3.fromRGB(255, 0, 0)), | |
| Transparency = props.Transparency or NumberSequence.new({ | |
| NumberSequenceKeypoint.new(0, 1, 0), | |
| NumberSequenceKeypoint.new(.75, 1, 0), | |
| NumberSequenceKeypoint.new(1, .6, 0) | |
| }) | |
| })) | |
| end))) | |
| ui:CreateComponent("SideBtn").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: {any}) | |
| return ui:AddInstance("ImageButton", { | |
| Id = props.Id, | |
| MouseButton1Click = props.OnClick, | |
| Position = props.Position or UDim2.fromScale(.5, .05), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| Size = UDim2.fromScale(.8, .08), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false | |
| }, ui:AddInstance("ImageLabel", { | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.85, .85), | |
| ScaleType = Enum.ScaleType.Fit, | |
| BackgroundTransparency = 1, | |
| Image = props.Image | |
| }), ui:AddInstance("UIAspectRatioConstraint")) | |
| end))) | |
| ui:CreateComponent("ScriptTab").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: boolean) | |
| local tbx = ui:AddInstance("TextBox", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.05, .5), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.9, .5), | |
| BackgroundTransparency = 1, | |
| ClearTextOnFocus = false, | |
| Text = props.Title, | |
| TextScaled = true, | |
| Visible = false, | |
| Tags = {"Colors_Text_Primary", "Fonts_Title"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }) | |
| local lbl = ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.05, .5), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.75, .5), | |
| BackgroundTransparency = 1, | |
| Text = props.Title, | |
| TextScaled = true, | |
| Tags = {"Colors_Text_Primary", "Fonts_Title"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }) | |
| local btn | |
| btn = ui:AddInstance("ImageButton", { | |
| Image = "rbxassetid://103207032755758", | |
| Position = UDim2.fromScale(.95, .5), | |
| AnchorPoint = Vector2.new(1, .5), | |
| Size = UDim2.fromScale(.5, .5), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| MouseButton1Click = function() | |
| local tabs = framework.dependencies.editortabs | |
| local tab = tabs:GetSelection() | |
| if not tab then return end | |
| btn.instance.Visible = false | |
| lbl.instance.Visible = false | |
| tbx.instance.Visible = true | |
| tbx.instance.TextEditable = true | |
| tbx.instance:CaptureFocus() | |
| tbx.instance.FocusLost:Wait() | |
| tbx.instance.FocusLost:Wait() -- due to text handler | |
| tbx.instance.TextEditable = false | |
| tab:SetName(tbx.instance.Text) | |
| btn.instance.Visible = true | |
| lbl.instance.Visible = true | |
| tbx.instance.Visible = false | |
| end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })) | |
| local selected = false | |
| local comp; | |
| comp = ui:AddInstance("ImageButton", { | |
| Position = UDim2.fromScale(.5, .0), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| LayoutOrder = props.LayoutOrder, | |
| Size = UDim2.fromScale(1, .2), | |
| BackgroundTransparency = .5, | |
| AutoButtonColor = false, | |
| Parent = props.Parent, | |
| Colors_Primary = framework.protected:GCProtect(function(color) | |
| if not selected then return end | |
| comp.instance.BackgroundColor3 = color | |
| end), | |
| Tags = {"Colors_Primary"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.3, 0) | |
| }), tbx, lbl, btn) | |
| function comp:Select() | |
| selected = true | |
| local succ, err = pcall(Color3.fromHex, framework.settings:GetSetting("Colors_Primary")) | |
| comp:Tween(tweens.default, { BackgroundColor3 = succ and err or Color3.fromHex(framework.settings:GetDefaultSetting("Colors_Primary")) }) | |
| end | |
| function comp:Unselect() | |
| selected = false | |
| local succ, err = pcall(Color3.fromHex, framework.settings:GetSetting("Colors_Secondary")) | |
| comp:Tween(tweens.default, { BackgroundColor3 = succ and err or Color3.fromHex(framework.settings:GetDefaultSetting("Colors_Secondary")) }) | |
| end | |
| comp:Unselect() | |
| return comp | |
| end))) | |
| do | |
| local prevbtn | |
| ui:CreateComponent("CategoryButton").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: any) | |
| local bgColor = props.BackgroundColor3 or Color3.fromHex("#F00") | |
| local txt = ui:AddInstance("TextLabel", { | |
| TextYAlignment = Enum.TextYAlignment.Center, | |
| TextXAlignment = Enum.TextXAlignment.Right, | |
| Position = UDim2.fromScale(.875, .5), | |
| AnchorPoint = Vector2.new(1, .5), | |
| Size = UDim2.fromScale(.45, .55), | |
| BackgroundTransparency = 1, | |
| TextColor3 = bgColor, | |
| TextScaled = true, | |
| Visible = false, | |
| Text = "", | |
| Tags = {"Fonts_Heading", "Country_Code"}, | |
| Country_Code = props.Title | |
| }) | |
| local ratio = ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }) | |
| local comp | |
| comp = ui:AddInstance("TextButton", { | |
| Id = `CategoryBtn_{props.Title[1]}`, | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| BackgroundColor3 = bgColor, | |
| Text = "", | |
| MouseButton1Click = function() comp:Select() end, | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.4, 0) | |
| }), txt, ui:AddInstance("ImageLabel", { | |
| Image = props.Image or "rbxassetid://135906354399656", | |
| Position = UDim2.fromScale(.125, .5), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.55, .55), | |
| BackgroundTransparency = 1, | |
| ImageColor3 = bgColor | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ratio) | |
| function comp:Select() | |
| if prevbtn then prevbtn:Unselect() end | |
| prevbtn = comp | |
| local callback = props.Callback | |
| if callback then callback() end | |
| comp:Tween(tweens.default, { BackgroundTransparency = .7 }) | |
| ratio:Tween(tweens.default, { AspectRatio = 2.5 }) | |
| --txt.instance.Text = utils:Translate(props.Title) | |
| ui:Get("CategoryTitle").instance.Text = utils:Translate(props.LongTitle or props.Title) | |
| txt.instance.Visible = true | |
| end | |
| function comp:Unselect() | |
| comp:Tween(tweens.default, { BackgroundTransparency = 1 }) | |
| ratio:Tween(tweens.default, { AspectRatio = 1 }) | |
| txt.instance.Visible = false | |
| --txt.instance.Text = "" | |
| end | |
| if props.Selected then comp:Select() end | |
| return comp | |
| end))) | |
| end | |
| ui:CreateComponent("MovingText").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: {any}) | |
| local glowGradient = ui:AddInstance("UIGradient", { | |
| Offset = Vector2.new(-1, 0), | |
| Rotation = 0, | |
| Transparency = NumberSequence.new({ | |
| NumberSequenceKeypoint.new(0, 0), | |
| NumberSequenceKeypoint.new(.25, 1), | |
| NumberSequenceKeypoint.new(.5, 0), | |
| NumberSequenceKeypoint.new(.75, .5), | |
| NumberSequenceKeypoint.new(1, 0), | |
| }) | |
| }) | |
| local label = ui:AddInstance("TextLabel", { | |
| TextColor3 = Color3.fromRGB(255, 255, 255), | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| TextYAlignment = Enum.TextYAlignment.Top, | |
| Position = UDim2.new(0, 0, 0, 0), | |
| AnchorPoint = Vector2.new(0, 0), | |
| Size = UDim2.new(1, 0, 1, 0), | |
| BackgroundTransparency = 1, | |
| Text = props.Text or "", | |
| TextTransparency = 0, | |
| TextSize = 25, | |
| Tags = {"Fonts_Black"} | |
| }, glowGradient) | |
| props.Text = nil | |
| -- create container and enable clipping | |
| local comp = ui:AddInstance("Frame", props, label) | |
| comp.instance.ClipsDescendants = true | |
| task.spawn(function() | |
| local TextService = framework.protected:GetService("TextService") | |
| local scrollRunning = false | |
| local scrollTweenThread | |
| local function startScrollLoop(fullWidth, containerWidth) | |
| -- cancel previous loop | |
| if scrollTweenThread then | |
| scrollRunning = false | |
| task.cancel(scrollTweenThread) | |
| scrollTweenThread = nil | |
| end | |
| -- if text fits, reset to original mid-Y | |
| if fullWidth <= containerWidth * 1.05 then | |
| label.instance.Position = UDim2.new(0, 0, 0, 0) | |
| return | |
| end | |
| local distance = fullWidth - containerWidth | |
| local tinfo = utils:GetTweenInfos(0, distance/35, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut) | |
| local pauseTime = 2.5 | |
| scrollRunning = true | |
| scrollTweenThread = task.spawn(pcall, function() | |
| while scrollRunning and label.instance do | |
| -- slide left, keep mid-Y | |
| label:Tween(tinfo, { | |
| Position = UDim2.new(0, -distance, 0, 0) | |
| }).Completed:Wait() | |
| task.wait(pauseTime) | |
| -- slide back, keep mid-Y | |
| label:Tween(tinfo, { | |
| Position = UDim2.new(0, 0, 0, 0) | |
| }).Completed:Wait() | |
| task.wait(pauseTime) | |
| end | |
| end) | |
| end | |
| local updateSize = framework.protected:GCProtect(function() | |
| if not label.instance or not comp.instance then return end | |
| -- match text size to frame height | |
| label.instance.TextSize = comp.instance.AbsoluteSize.Y | |
| local textSize = TextService:GetTextSize( | |
| label.instance.Text, | |
| label.instance.TextSize, | |
| Enum.Font.MontserratBlack, | |
| Vector2.new(math.huge, comp.instance.AbsoluteSize.Y) | |
| ) | |
| local fullWidth = textSize.X | |
| -- reset label | |
| label.instance.Position = UDim2.fromScale(0, 0) | |
| label.instance.Size = UDim2.new(1, 0, 1, 0) | |
| startScrollLoop(fullWidth, comp.instance.AbsoluteSize.X) | |
| end) | |
| -- animate initial glow offset | |
| glowGradient:Tween(tweens.glow, { Offset = Vector2.new(1, 0) }) | |
| -- re-run on resize | |
| comp.instance:GetPropertyChangedSignal("AbsoluteSize"):Connect(updateSize) | |
| -- initial sizing + scroll start | |
| task.wait(.5) | |
| updateSize() | |
| end) | |
| return comp | |
| end))) | |
| ui:CreateComponent("ScriptObj").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: {any}) | |
| local comp, holdable | |
| local fav = ui:AddInstance("ImageButton", { | |
| Id = `ScriptObj_FavsButton_{props.Title}`, | |
| Visible = not (props.NoFav or props.IsFolder), | |
| ImageColor3 = Color3.fromHex("#FDC41B"), | |
| Image = "rbxassetid://80350699155696", | |
| Position = UDim2.fromScale(.95, .1), | |
| AnchorPoint = Vector2.new(1, 0), | |
| Size = UDim2.fromScale(.1, .2), | |
| BackgroundTransparency = 1, | |
| MouseButton1Click = function() | |
| local btn = ui:Get(`ScriptObj_FavsButton_{props.Title}`) | |
| if btn and btn.instance then | |
| utils:AnimateCascade(btn.instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| end | |
| if props.OnFavourite then comp:SetFavourite(props.OnFavourite()) end | |
| end, | |
| OnRemoved = function() | |
| if holdable then | |
| holdable:Remove() | |
| holdable = nil | |
| end | |
| end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })) | |
| local del = ui:AddInstance("ImageButton", { | |
| Id = `ScriptObj_DelButton_{props.Title}`, | |
| Image = "rbxassetid://80286816747552", | |
| Position = UDim2.fromScale(.05, .1), | |
| AnchorPoint = Vector2.new(0, 0), | |
| Size = UDim2.fromScale(.1, .2), | |
| BackgroundTransparency = 1, | |
| Visible = not not props.OnDelete, | |
| MouseButton1Click = function() | |
| utils:AnimateCascade(ui:Get(`ScriptObj_DelButton_{props.Title}`).instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| if props.OnDelete then props.OnDelete() end | |
| end, | |
| OnRemoved = function() | |
| if holdable then | |
| holdable:Remove() | |
| holdable = nil | |
| end | |
| end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })) | |
| local function getRandomAIColor() | |
| local aiColors = { | |
| {255, 0, 0}, | |
| {255, 56, 105}, | |
| {244, 115, 236}, | |
| {21, 166, 254}, | |
| {255, 56, 105} | |
| } | |
| local color = aiColors[math.random(1, #aiColors)] | |
| return Color3.fromRGB(color[1], color[2], color[3]) | |
| end | |
| local image = props.Image | |
| if props.IsFolder then | |
| image = framework.protected:ProtectAsset("rbxassetid://99211126565176") | |
| else | |
| image = props.IsLocal and framework.protected:ProtectAsset("rbxassetid://87562736891746") | |
| or framework.protected:ProtectAsset("rbxassetid://71177623238811") | |
| end | |
| comp = ui:AddInstance("ImageButton", { | |
| Id = `ScriptObj_MainButton_{props.Title}`, | |
| Size = UDim2.fromScale(1, 1), | |
| AutoButtonColor = false, | |
| Parent = props.Parent, | |
| ImageColor3 = props.Image and Color3.fromHex("#FFF") or getRandomAIColor(), | |
| Image = image | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.2, 0) | |
| }), fav, del, ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.5, .8), | |
| AnchorPoint = Vector2.new(.5, 1), | |
| Size = UDim2.fromScale(.9, .2), | |
| Text = props.Title or "Script", | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Colors_Text_Primary", "Fonts_Body"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }, ui:AddInstance("TextLabel", { | |
| TextColor3 = Color3.fromRGB(175, 175, 175), | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(0, 1), | |
| Text = props.Description or "", | |
| Size = UDim2.fromScale(1, .6), | |
| BackgroundTransparency = 1, | |
| TextScaled = true | |
| })), ui:AddInstance("UIGradient", { | |
| Color = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#404040")), | |
| ColorSequenceKeypoint.new(0.5, Color3.fromHex("#FFF")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#404040")) | |
| }), | |
| Rotation = 90 | |
| })) | |
| if props.Slug then comp:AddTags(props.Slug) end | |
| comp.favourite = fav | |
| if props.OnClick then | |
| holdable = framework.utils.inputs.buttons.holdable(comp) | |
| holdable.OnShortPress:Connect(function(elapsed) | |
| if elapsed < .2 and props.OnClick then | |
| if ui:Get(`ScriptObj_MainButton_{props.Title}`) then | |
| utils:AnimateCascade(ui:Get(`ScriptObj_MainButton_{props.Title}`).instance, { | |
| AnimateSelf = true, | |
| ScaleCascade = true, | |
| ScaleDirection = "Out", | |
| SkipTransparency = true | |
| }) | |
| end | |
| props.OnClick() | |
| end | |
| end) | |
| end | |
| function comp:SetFavourite(status: boolean, dontUpdate: boolean) | |
| for _, v in ipairs(ui:GetByTag(props.Slug)) do | |
| v.favourite.instance.Image = status and framework.protected:ProtectAsset("rbxassetid://137934368112423") or "rbxassetid://80350699155696" | |
| end | |
| local scriptsgrid = ui:Get("ScriptsGrid") | |
| if not dontUpdate and not scriptsgrid.lastQuery then | |
| framework.dependencies.cloudscripts:FetchFavourites("grid") | |
| end | |
| end | |
| comp:SetFavourite(props.IsFavourite, true) | |
| return comp | |
| end))) | |
| ui:CreateComponent("ExtensionObj").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: {any}) | |
| local del = props.OnDelete and ui:AddInstance("ImageButton", { | |
| Image = "rbxassetid://80286816747552", | |
| Position = UDim2.fromScale(.95, .05), | |
| MouseButton1Click = props.OnDelete, | |
| AnchorPoint = Vector2.new(1, 0), | |
| Size = UDim2.fromScale(.25, .25), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })) | |
| return ui:AddInstance("ImageButton", { | |
| MouseButton1Click = props.OnClick, | |
| Size = UDim2.fromScale(1, 1), | |
| AutoButtonColor = false, | |
| Parent = props.Parent, | |
| Image = props.Image | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectType = Enum.AspectType.ScaleWithParentSize, | |
| DominantAxis = Enum.DominantAxis.Width, | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.2, 0) | |
| }), ui:AddInstance("TextLabel", { | |
| Position = UDim2.fromScale(.5, 1.05), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| Size = UDim2.fromScale(.9, .2), | |
| Text = props.Title or "Extension", | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Colors_Text_Primary", "Fonts_Body"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("UIGradient", { | |
| Color = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 255, 255)), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#404040")) | |
| }), | |
| Rotation = -45 | |
| }), del) | |
| end))) | |
| ui:CreateComponent("ContentBar").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: {any}) | |
| local layout = ui:AddInstance("UIPageLayout", { | |
| Id = "ScriptsLayout", | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| VerticalAlignment = Enum.VerticalAlignment.Center, | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| EasingDirection = Enum.EasingDirection.Out, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| EasingStyle = Enum.EasingStyle.Linear, | |
| ScrollWheelInputEnabled = false, | |
| GamepadInputEnabled = false, | |
| TouchInputEnabled = false, | |
| --Circular = true, | |
| TweenTime = .25 | |
| }) | |
| local comp = ui:AddInstance("Frame", { | |
| Id = props.Id, | |
| AnchorPoint = props.AnchorPoint, | |
| BackgroundTransparency = 1, | |
| Position = props.Position, | |
| Size = props.Size | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| DominantAxis = Enum.DominantAxis.Height, | |
| AspectRatio = 1.78 | |
| }), layout) | |
| local tweenService = framework.protected:GetService("TweenService") | |
| local scripts, idx, current = {}, -1, nil | |
| local setSize = framework.protected:GCProtect(function(time: number, scrOffset: number, ySize: number, xPos: number, ZIndex: number) | |
| local scr = scripts[idx +scrOffset] | |
| if not scr then return end | |
| local inner = scr:GetObject() | |
| local tween = utils:GetTweenInfos(0, time) | |
| local color, transp = 255/3*ZIndex, ZIndex == 3 and 0 or 1 -1/3*ZIndex | |
| for _, lbl in ipairs(inner.instance:GetDescendants()) do | |
| if not lbl:IsA("TextLabel") then continue end | |
| tweenService:Create(lbl, tween, { TextTransparency = transp }):Play() | |
| end | |
| inner.instance.ImageColor3 = Color3.fromRGB(color, color, color) | |
| scr.instance.instance.ZIndex = ZIndex | |
| scr.instance:Tween(tween, { Size = UDim2.fromScale(1, ySize) }) | |
| inner:Tween(tween, { Position = UDim2.fromScale(xPos, 0) }) | |
| end) | |
| local slideIndex = framework.protected:GCProtect(function(increment: number) | |
| local lenght = #scripts -1 | |
| local idx = idx | |
| local bound | |
| if idx +increment >= lenght then | |
| bound = 1 | |
| idx = lenght | |
| elseif idx +increment <= 0 then | |
| bound = -1 | |
| idx = 0 | |
| else | |
| idx += increment | |
| end | |
| if bound and props.OnBound then props.OnBound(bound) end -- on bound reached | |
| return idx | |
| end) | |
| local updateList = framework.protected:GCProtect(function(timeMult) | |
| if idx +3 < #scripts then | |
| if idx == -1 then idx = slideIndex(2) end | |
| elseif #scripts > 4 and props.OnLoad then task.spawn(props.OnLoad) end -- load more content | |
| idx = framework.utils.maths.max(idx, 0) | |
| timeMult = timeMult or 1 | |
| timeMult = .25 *timeMult | |
| layout.instance.TweenTime = timeMult | |
| layout.instance:JumpToIndex(idx) | |
| local scr = scripts[idx +1] | |
| current = scr | |
| if current and props.OnSelected then task.spawn(props.OnSelected, scr) end -- on content selected | |
| setSize(timeMult, 1, 1, 0, 3) | |
| setSize(timeMult, 0, .8, .35, 2) | |
| setSize(timeMult, -1, .6, 1, 1) | |
| setSize(timeMult, -2, .4, 0, 1) | |
| setSize(timeMult, 2, .8, -.35, 2) | |
| setSize(timeMult, 3, .6, -1, 1) | |
| setSize(timeMult, 4, .4, 0, 1) | |
| end) | |
| function comp:AddScript(props: {any}) | |
| local scr = {} | |
| local inner | |
| inner = ui:AddComponent("ScriptObj", { | |
| OnFavourite = props.OnFavourite, | |
| Description = props.Description, | |
| IsFavourite = props.IsFavourite, | |
| OnDelete = props.OnDelete, | |
| IsFolder = props.IsFolder, | |
| IsLocal = props.IsLocal, | |
| Title = props.Title, | |
| Image = props.Image, | |
| NoFav = props.NoFav, | |
| Slug = props.Slug, | |
| OnClick = function() | |
| if scr == current then | |
| if props.Callback then props.Callback() end | |
| return | |
| end | |
| local diff = framework.utils.tables.find(scripts, scr) | |
| -(framework.utils.tables.find(scripts, current) or 0) | |
| idx = slideIndex(diff) | |
| updateList(framework.utils.maths.abs(diff)) | |
| end | |
| }) | |
| local inst = ui:AddInstance("Frame", { | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| LayoutOrder = #scripts, | |
| Parent = comp | |
| }, inner) | |
| scr.instance = inst | |
| function scr:Remove() | |
| local found = framework.utils.tables.find(scripts, scr) | |
| if found then framework.utils.tables.remove(scripts, found) end | |
| inst:Remove() | |
| end | |
| function scr:GetObject() | |
| return inner | |
| end | |
| framework.utils.tables.insert(scripts, scr) | |
| return scr | |
| end | |
| function comp:UpdateList() | |
| updateList() | |
| return self | |
| end | |
| function comp:Move(increment: number) | |
| idx = slideIndex(increment) | |
| updateList() | |
| return self | |
| end | |
| function comp:GetScripts() | |
| return framework.utils.tables.listCopy(scripts) | |
| end | |
| function comp:ClearScripts() | |
| local scrs = self:GetScripts() | |
| current = nil | |
| scripts = {} | |
| idx = -1 | |
| for _, scr in ipairs(scrs) do scr:Remove() end | |
| return self | |
| end | |
| return comp | |
| end))) | |
| ui:CreateComponent("FilterSelector").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: {any}) | |
| local comp = ui:AddInstance("ScrollingFrame", { | |
| Id = props.Id, | |
| ScrollingDirection = Enum.ScrollingDirection.X, | |
| AutomaticCanvasSize = Enum.AutomaticSize.X, | |
| CanvasSize = UDim2.fromScale(0, 0), | |
| AnchorPoint = props.AnchorPoint, | |
| ScrollBarThickness = padding, | |
| BackgroundTransparency = 1, | |
| Position = props.Position, | |
| BorderSizePixel = 0, | |
| Size = props.Size, | |
| ZIndex = 1 | |
| }, ui:AddInstance("UIListLayout", { | |
| VerticalAlignment = Enum.VerticalAlignment.Center, | |
| HorizontalAlignment = props.HorizontalAlignment, | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| Padding = UDim.new(0, padding) | |
| })) | |
| local current = props.Filters[1] | |
| for _, filter in ipairs(props.Filters) do | |
| local img = ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://71605317317599", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| ScaleType = Enum.ScaleType.Fit, | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| ImageTransparency = 1, | |
| Colors_Primary = {"ImageColor3"}, | |
| Tags = {"Colors_Primary"} | |
| }) | |
| local lbl = ui:AddInstance("TextLabel", { | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(1, .5), | |
| BackgroundTransparency = 1, | |
| Text = filter.Title[1], | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Body"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| Country_Code = filter.Title | |
| }) | |
| ui:AddInstance("TextButton", { | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| Parent = comp, | |
| Text = "", | |
| MouseButton1Click = function() | |
| if current then current:Unselect() end | |
| current = filter | |
| filter:Select() | |
| end | |
| }, img, lbl, ui:AddInstance("UIAspectRatioConstraint", { | |
| DominantAxis = Enum.DominantAxis.Height, | |
| AspectRatio = 2 | |
| })) | |
| function filter:Select() | |
| img:Tween(tweens.default, { ImageTransparency = 0 }) | |
| if filter.Callback then filter.Callback(lbl.instance.Text) end | |
| end | |
| function filter:Unselect() | |
| img:Tween(tweens.default, { ImageTransparency = 1 }) | |
| end | |
| end | |
| function comp:Refresh() | |
| if not ui.Loaded then return end | |
| if current then task.spawn(current.Select, current) end | |
| end | |
| --task.defer(comp.Refresh, comp) | |
| return comp | |
| end))) | |
| ui:CreateComponent("HistorySelector").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: {any}) | |
| local padding = props.Padding or 8 | |
| -- Container principale | |
| local comp = ui:AddInstance("ScrollingFrame", { | |
| Id = props.Id, | |
| ScrollingDirection = Enum.ScrollingDirection.X, | |
| AutomaticCanvasSize = Enum.AutomaticSize.X, | |
| CanvasSize = UDim2.fromScale(0, 0), | |
| AnchorPoint = props.AnchorPoint, | |
| ScrollBarThickness = padding, | |
| BackgroundTransparency = 1, | |
| Position = props.Position, | |
| Visible = props.Visible, | |
| BorderSizePixel = 0, | |
| Size = props.Size, | |
| ZIndex = 1 | |
| }, ui:AddInstance("UIListLayout", { | |
| HorizontalAlignment = props.HorizontalAlignment or Enum.HorizontalAlignment.Left, | |
| VerticalAlignment = Enum.VerticalAlignment.Center, | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| Padding = UDim.new(0, padding) | |
| })) | |
| local current = {} | |
| function comp:SetPath(path: {any}) | |
| for _, v in ipairs(current) do v:Remove() end | |
| framework.utils.tables.clear(current) | |
| for i, segment in ipairs(path) do | |
| if i > 1 then | |
| framework.utils.tables.insert(current, ui:AddInstance("TextLabel", { | |
| AutomaticSize = Enum.AutomaticSize.X, | |
| Size = UDim2.fromScale(0, 1), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| LayoutOrder = i *2, | |
| Parent = comp, | |
| Text = "›", | |
| Tags = {"Colors_Text_Primary", "Fonts_Body"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| })) | |
| end | |
| local isLast = (i == #path) | |
| framework.utils.tables.insert(current, ui:AddInstance("TextButton", { | |
| Size = UDim2.fromScale(0, isLast and 1 or .65), | |
| TextTransparency = isLast and 0 or .5, | |
| AutomaticSize = Enum.AutomaticSize.X, | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| Text = segment.name, | |
| LayoutOrder = i *2 +1, | |
| TextScaled = true, | |
| Parent = comp, | |
| Tags = {"Colors_Text_Primary", isLast and "Fonts_Body" or "Fonts_HeadingItalic"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| MouseButton1Click = function() segment:Browse() end | |
| })) | |
| end | |
| end | |
| return comp | |
| end))) | |
| ui:CreateComponent("CloudScriptInfo").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(scr: {any}, props: {any}) | |
| if not scr.features then | |
| local res = framework.dependencies.cloudscripts:FetchDetails(scr.slug) | |
| if res then | |
| scr.updatedAt = res.updatedAt | |
| scr.features = res.features | |
| scr.script = res.script | |
| end | |
| end | |
| if not scr.script then | |
| task.spawn(function() | |
| local res = framework.dependencies.cloudscripts:FetchDetails(scr.slug) | |
| scr.script = res and res.script or "" | |
| end) | |
| end | |
| local innerImg = ui:AddInstance("ImageLabel", { | |
| Image = scr.Image or "rbxassetid://71177623238811", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.6, .6), | |
| BackgroundTransparency = 1, | |
| BorderSizePixel = 0 | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.25, 0) | |
| }), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectType = Enum.AspectType.ScaleWithParentSize, | |
| DominantAxis = Enum.DominantAxis.Width, | |
| AspectRatio = 16/9 | |
| })) | |
| local img = ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://99756586318026", --71177623238811", | |
| ImageColor3 = Color3.fromHex("#F00"), | |
| Position = UDim2.fromScale(-.1, 0), | |
| Size = UDim2.fromScale(.6, .75), | |
| BackgroundTransparency = 1, | |
| BorderSizePixel = 0 | |
| }, innerImg) | |
| local comp | |
| local fav = ui:AddInstance("ImageButton", { | |
| Image = scr.isFavourite and "rbxassetid://137934368112423" or "rbxassetid://80350699155696", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.75, .75), | |
| BackgroundTransparency = 1, | |
| ImageColor3 = Color3.fromHex("#FDC41B"), | |
| MouseButton1Click = function() comp:SetFavourite(scr.setFavourite()) end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| })) | |
| comp = ui:AddInstance("ImageButton", { | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Image = scr.Image or "rbxassetid://71177623238811", | |
| ImageColor3 = Color3.fromHex("#202020"), | |
| Position = UDim2.fromScale(0, 0), | |
| Parent = ui:Get("MainFrame"), | |
| Size = UDim2.fromScale(1, 1), | |
| AutoButtonColor = false, | |
| ZIndex = 499, | |
| }, ui:AddInstance("Frame", { | |
| BackgroundColor3 = Color3.fromHex("#FFF"), | |
| Position = UDim2.fromScale(0, 0), | |
| BackgroundTransparency = .5, | |
| Size = UDim2.fromScale(1, 1) | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingTop = UDim.new(.075, 0), | |
| PaddingBottom = UDim.new(.075, 0), | |
| PaddingLeft = UDim.new(.05, 0), | |
| PaddingRight = UDim.new(.05, 0) | |
| }), ui:AddInstance("UIGradient", { | |
| Rotation = -90, | |
| Color = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#000")), | |
| ColorSequenceKeypoint.new(.175, Color3.fromHex("#000")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#707070")) | |
| }), | |
| Transparency = NumberSequence.new({ | |
| NumberSequenceKeypoint.new(0, 0), | |
| NumberSequenceKeypoint.new(1, .35) | |
| }) | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Text = scr.title or "Cloud Script", | |
| Position = UDim2.fromScale(0, .0), | |
| AnchorPoint = Vector2.new(0, 0), | |
| Size = UDim2.fromScale(.98, .1), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Colors_Text_Primary", "Fonts_Title"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), img, ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(0, .65), | |
| Size = UDim2.fromScale(.2, .1), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Description"}, | |
| Country_Code = {"Creation date:","Data di creazione:","Ngày tạo:","Data de criação:","Tanggal pembuatan:","Дата создания:","Erstellungsdatum:","Fecha de creación:","Date de création :","创建日期:","作成日:","تاريخ الإنشاء:","निर्माण तिथि:","วันที่สร้าง:"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.2, .7), | |
| Text = scr.createdAt and framework.utils.datetimes.unixToDAgo(framework.utils.datetimes.isoToUnix(scr.createdAt)) or "N/A", | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.2, .07), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Colors_Text_Primary", "Fonts_HeadingItalic"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(0, .73), | |
| Size = UDim2.fromScale(.2, .1), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Visible = props.updatedAt and true or false, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Description"}, | |
| Country_Code = {"Update date:","Data di aggiornamento:","Ngày cập nhật:","Data de atualização:","Tanggal pembaruan:","Дата обновления:","Aktualisierungsdatum:","Fecha de actualización:","Date de mise à jour :","更新日期:","更新日:","تاريخ التحديث:","अपडेट की तिथि:","วันที่อัปเดต:"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.2, .78), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Text = scr.updatedAt and framework.utils.datetimes.unixToDAgo(framework.utils.datetimes.isoToUnix(scr.updatedAt)) or "N/A", | |
| Size = UDim2.fromScale(.2, .07), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Visible = props.updatedAt and true or false, | |
| Tags = {"Colors_Text_Primary", "Fonts_HeadingItalic"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://71545944975150", | |
| Position = UDim2.fromScale(0, 1), | |
| AnchorPoint = Vector2.new(0, 1), | |
| Size = UDim2.fromScale(.05, .15), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Text = scr.game or "Game name N/A", | |
| Position = UDim2.fromScale(.065, 1), | |
| AnchorPoint = Vector2.new(0, 1), | |
| Size = UDim2.fromScale(.3, .1), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| TextTransparency = .2, | |
| Tags = {"Colors_Text_Primary", "Fonts_Body"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("Frame", { | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Position = UDim2.fromScale(1, .12), | |
| AnchorPoint = Vector2.new(1, 0), | |
| Size = UDim2.fromScale(.5, .65), | |
| BackgroundTransparency = .5, | |
| ZIndex = 1, | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(0, padding*2), | |
| PaddingRight = UDim.new(0, padding*2), | |
| PaddingLeft = UDim.new(0, padding*2), | |
| PaddingTop = UDim.new(0, padding*2) | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Size = UDim2.fromScale(1, .075), | |
| Position = UDim2.fromScale(0, 0), | |
| AnchorPoint = Vector2.new(0, 0), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Fonts_Heading", "Colors_Text_Primary"}, | |
| Country_Code = {"DESCRIPTION","DESCRIZIONE","MÔ TẢ","DESCRIÇÃO","DESKRIPSI","ОПИСАНИЕ","BESCHREIBUNG","DESCRIPCIÓN","DESCRIPTION","描述","説明","الوصف","विवरण","รายละเอียด"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { -- NO DESCR PROVIDED | |
| Text = scr.features or "No description.", --"This highly optimized script leverages Roblox's experimental parallel execution framework to dynamically reshape in-game terrain using real-time quantum noise functions. By integrating asynchronous spatial threading with localized biome-awake AI prediction models, the script ensures seamless environmental transitions across all client-server instances. Includes built-in redundancy bypass for legacy terrain annchors", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| TextYAlignment = Enum.TextYAlignment.Top, | |
| Position = UDim2.fromScale(0, .075), | |
| AnchorPoint = Vector2.new(0, 0), | |
| Size = UDim2.fromScale(1, .9), | |
| BackgroundTransparency = 1, | |
| TextWrapped = true, | |
| TextSize = padding*1.5, | |
| Tags = {"Fonts_Heading", "Colors_Text_Primary"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.075, 0) | |
| })), ui:AddInstance("ImageLabel", { | |
| Id = "Popup_ExecuteButtonShadow", | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Image = "rbxassetid://111537386489097", | |
| Position = UDim2.fromScale(1.06, 1.1075), | |
| Size = UDim2.fromScale(.35, .35), | |
| AnchorPoint = Vector2.new(1,1), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.117 | |
| }), ui:AddInstance("ImageButton", { | |
| Image = "rbxassetid://100628992603432", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.3, .3), | |
| BackgroundTransparency = 1, | |
| MouseButton1Click = function() | |
| utils:AnimateCascade(ui:Get("Popup_ExecuteButtonShadow").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| if scr.verified then | |
| return framework.execution:Execute(scr.script) | |
| end | |
| utils:ShowToast("ButtonToast", { | |
| AdditionalText = {"Script not verified, execute?","Script non verificato, eseguire?","Tập lệnh chưa được xác minh, thực thi?","Script não verificado, executar?","Skrip belum diverifikasi, jalankan?","Скрипт не проверен, выполнить?","Skript nicht verifiziert, ausführen?","Script no verificado, ¿ejecutar?","Script non vérifié, exécuter ?","脚本未验证,执行?","スクリプトが未検証です、実行しますか?","البرنامج النصي غير مُتحقق منه، هل تريد التنفيذ؟","स्क्रिप्ट सत्यापित नहीं है, चलाएँ?","สคริปต์ไม่ได้รับการยืนยัน ต้องการเรียกใช้หรือไม่?"}, | |
| Style = "confirm", | |
| Callback = function(res: boolean) | |
| if not res then return end | |
| framework.execution:Execute(scr.script) | |
| end | |
| }) | |
| end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }))), ui:AddInstance("ImageLabel", { -- COPY BUTTON | |
| Id = "Popup_CopyButtonShadow", | |
| BackgroundColor3 = Color3.fromHex("#F00"), | |
| Image = "rbxassetid://96112258106990", | |
| Position = UDim2.fromScale(.885, 1), | |
| Size = UDim2.fromScale(.112, .133), | |
| AnchorPoint = Vector2.new(1,1), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.125 | |
| }), ui:AddInstance("ImageButton", { | |
| Image = "rbxassetid://104350786247520", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.75, .75), | |
| BackgroundTransparency = 1, | |
| MouseButton1Click = function() | |
| utils:AnimateCascade(ui:Get("Popup_CopyButtonShadow").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| framework.utils.clipboard:Set(scr.script) | |
| end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }))), ui:AddInstance("ImageLabel", { -- OPEN EDITOR BUTTON | |
| Id = "Popup_OpenEditorButtonShadow", | |
| BackgroundColor3 = Color3.fromHex("#F00"), | |
| Image = "rbxassetid://96112258106990", | |
| Position = UDim2.fromScale(.78, 1), | |
| Size = UDim2.fromScale(.112, .133), | |
| AnchorPoint = Vector2.new(1,1), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.125 | |
| }), ui:AddInstance("ImageButton", { | |
| Image = "rbxassetid://100582884942929", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.75, .75), | |
| BackgroundTransparency = 1, | |
| MouseButton1Click = function() | |
| utils:AnimateCascade(ui:Get("Popup_OpenEditorButtonShadow").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local editor = framework.utils.inputs.editors:Get("Main_Editor") | |
| editor:AddTab(scr.title, scr.script) | |
| utils:ClosePopup() | |
| for _, page in ipairs(utils.pages) do | |
| if page.Name == "Executor" then | |
| ui.showPage(`Page_{page.Name}`, page.Indicator) | |
| break | |
| end | |
| end | |
| end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }))), ui:AddInstance("ImageLabel", { -- FAVS BUTTON | |
| Image = "rbxassetid://96112258106990", | |
| Position = UDim2.fromScale(.675, 1), | |
| Size = UDim2.fromScale(.112, .133), | |
| AnchorPoint = Vector2.new(1,1), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.125 | |
| }), fav))) | |
| scr.loadImage(comp.instance, true) | |
| scr.loadImage(innerImg.instance, true) | |
| function comp:SetFavourite(status: boolean) | |
| fav.instance.Image = status and framework.protected:ProtectAsset("rbxassetid://137934368112423") or "rbxassetid://80350699155696" | |
| if props.component then props.component:SetFavourite(status) end | |
| end | |
| return comp | |
| end))) | |
| ui:CreateComponent("LocalScriptInfo").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(file: {any}, props: {any}) | |
| local src, content = file:Read() | |
| content = content or {} | |
| src = src or "" | |
| local comp | |
| local fav = ui:AddInstance("ImageButton", { | |
| Image = file:GetProperty("favourite") and "rbxassetid://137934368112423" or "rbxassetid://80350699155696", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.75, .75), | |
| BackgroundTransparency = 1, | |
| ImageColor3 = Color3.fromHex("#FDC41B"), | |
| MouseButton1Click = function() | |
| local status = not (file:GetProperty("favourite") and true or false) | |
| file:SetProperty({ favourite = status }) | |
| comp:SetFavourite(status) | |
| framework.dependencies.editortabs:GetSaved("tabs") | |
| end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| })) | |
| local autoexec | |
| local updateAutoexec = function() | |
| autoexec.instance.ImageColor3 = (not not file:GetProperty("autoexecute")) and Color3.fromRGB(255, 0, 0) or Color3.fromRGB(85, 170, 0) | |
| end | |
| local refreshTabs = function() | |
| local tabs = framework.dependencies.editortabs | |
| if utils.tabsMode == "files" then return end | |
| for _, tab in ipairs(tabs:GetTabs()) do | |
| local state = tab:GetProperty(utils.tabsMode) and true or false | |
| tab:GetData().instance.instance.Visible = state | |
| tabs:GetSavedByProperties({ | |
| [utils.tabsMode] = {true} | |
| }, "tabs") | |
| end | |
| end | |
| autoexec = ui:AddInstance("ImageButton", { | |
| Image = "rbxassetid://115061506034125", | |
| Position = UDim2.fromScale(.675, .685), | |
| Size = UDim2.fromScale(.05, .1), | |
| BackgroundTransparency = 1, | |
| MouseButton1Click = function() | |
| local status = not (file:GetProperty("autoexecute") and true or false) | |
| file:SetProperty({ autoexecute = status }) | |
| autoexec.instance.ImageColor3 = status and Color3.fromRGB(255, 0, 0) or Color3.fromRGB(85, 170, 0) | |
| refreshTabs() | |
| end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })) | |
| comp = ui:AddInstance("ImageButton", { | |
| Image = props.Image or "rbxassetid://71177623238811", | |
| ImageColor3 = Color3.fromHex("#202020"), | |
| Position = UDim2.fromScale(0, 0), | |
| Parent = ui:Get("MainFrame"), | |
| Size = UDim2.fromScale(1, 1), | |
| AutoButtonColor = false, | |
| ZIndex = 499 | |
| }, ui:AddInstance("Frame", { | |
| BackgroundColor3 = Color3.fromHex("#fff"), | |
| Position = UDim2.fromScale(0, 0), | |
| BackgroundTransparency = .5, | |
| Size = UDim2.fromScale(1, 1) | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(.075, 0), | |
| PaddingRight = UDim.new(.05, 0), | |
| PaddingLeft = UDim.new(.05, 0), | |
| PaddingTop = UDim.new(.075, 0) | |
| }), ui:AddInstance("UIGradient", { | |
| Rotation = -90, | |
| Color = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#000")), | |
| ColorSequenceKeypoint.new(.175, Color3.fromHex("#000")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#707070")) | |
| }), | |
| Transparency = NumberSequence.new({ | |
| NumberSequenceKeypoint.new(0, 0), | |
| NumberSequenceKeypoint.new(1, .35) | |
| }) | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Text = file.name or "Local Script", | |
| Position = UDim2.fromScale(0, .0), | |
| AnchorPoint = Vector2.new(0, 0), | |
| Size = UDim2.fromScale(.98, .1), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Colors_Text_Primary", "Fonts_Title"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.675, .15), | |
| Size = UDim2.fromScale(.3, .075), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Description"}, | |
| Country_Code = {"Creation date:","Data di creazione:","Ngày tạo:","Data de criação:","Tanggal pembuatan:","Дата создания:","Erstellungsdatum:","Fecha de creación:","Date de création :","创建日期:","作成日:","تاريخ الإنشاء:","निर्माण तिथि:","วันที่สร้าง:"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| Text = framework.utils.datetimes.unixToDAgo(content.creation or os.time()), | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.675, .25), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.2, .07), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Colors_Text_Primary", "Fonts_HeadingItalic"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.675, .32), | |
| Size = UDim2.fromScale(.3, .075), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Description"}, | |
| Country_Code = {"Last viewed:","Ultima visualizzazione:","Lần cuối xem:","Última visualização:","Terakhir dilihat:","Последний просмотр:","Zuletzt angesehen:","Última visualización:","Dernière consultation :","上次查看:","最終閲覧:","آخر مشاهدة:","अंतिम बार देखा गया:","การเข้าชมล่าสุด:"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| Text = framework.utils.datetimes.unixToDAgo(content.viewed or os.time()), | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.675, .42), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.2, .07), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Colors_Text_Primary", "Fonts_HeadingItalic"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), autoexec, ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.725, .7), | |
| Size = UDim2.fromScale(.3, .05), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Heading"}, | |
| Country_Code = {"Auto-Execute","Auto-Esecuzione","Tự động thực thi","Auto-executar","Eksekusi Otomatis","Автовыполнение","Automatische Ausführung","Ejecución automática","Exécution automatique","自动执行","自動実行","التنفيذ التلقائي","स्वचालित निष्पादन","เรียกใช้โดยอัตโนมัติ"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("Frame", { | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Position = UDim2.fromScale(0, .12), | |
| Size = UDim2.fromScale(.65, .65), | |
| AnchorPoint = Vector2.new(0, 0), | |
| BackgroundTransparency = .5, | |
| ZIndex = 1, | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(0, padding*2), | |
| PaddingRight = UDim.new(0, padding*2), | |
| PaddingLeft = UDim.new(0, padding*2), | |
| PaddingTop = UDim.new(0, padding*2) | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(0, 0), | |
| Size = UDim2.fromScale(1, .075), | |
| AnchorPoint = Vector2.new(0, 0), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Text = "CONTENT", | |
| Tags = {"Country_Code", "Fonts_Heading", "Colors_Text_Primary"}, | |
| Country_Code = {"CONTENT","CONTENUTO","Nội dung","Conteúdo","Konten","Контент","Inhalt","Contenido","Contenu","内容","コンテンツ","المحتوى","सामग्री","เนื้อหา"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddComponent("CodeEditor", { | |
| Position = UDim2.fromScale(0, .1), | |
| AnchorPoint = Vector2.new(0, 0), | |
| Size = UDim2.fromScale(1, .7), | |
| Text = src, | |
| Focused = framework.protected:GCProtect(function() | |
| utils:EditorMode(true, .175) | |
| --framework.utils.inputs.editors:Get("Main_Editor"):ToggleHighlighter(false) | |
| end), | |
| FocusLost = framework.protected:GCProtect(function() | |
| utils:EditorMode(false) | |
| --local editor = framework.utils.inputs.editors:Get("Main_Editor") | |
| --local tabs = framework.dependencies.editortabs | |
| --local tab = tabs:GetSelection() | |
| --if not tab then return end | |
| --tab:SetSource(editor:GetText()) | |
| --editor:ToggleHighlighter(true) | |
| end) | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.075, 0) | |
| })), ui:AddInstance("ImageLabel", { -- EXECUTE BUTTON | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Position = UDim2.fromScale(1.06, 1.1075), | |
| Image = "rbxassetid://111537386489097", | |
| Size = UDim2.fromScale(.35, .35), | |
| AnchorPoint = Vector2.new(1,1), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.1170212766 | |
| }), ui:AddInstance("ImageButton", { | |
| Image = "rbxassetid://100628992603432", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.3, .3), | |
| BackgroundTransparency = 1, | |
| MouseButton1Click = function() framework.execution:Execute(src) end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }))), ui:AddInstance("ImageLabel", { -- COPY BUTTON | |
| BackgroundColor3 = Color3.fromHex("#F00"), | |
| Image = "rbxassetid://96112258106990", | |
| Position = UDim2.fromScale(.885, 1), | |
| Size = UDim2.fromScale(.112, .133), | |
| AnchorPoint = Vector2.new(1,1), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99, | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.125 | |
| }), ui:AddInstance("ImageButton", { | |
| Image = "rbxassetid://104350786247520", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.75, .75), | |
| BackgroundTransparency = 1, | |
| MouseButton1Click = function() framework.utils.clipboard:Set(src) end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }))), ui:AddInstance("ImageLabel", { -- OPEN EDITOR BUTTON | |
| BackgroundColor3 = Color3.fromHex("#F00"), | |
| Image = "rbxassetid://96112258106990", | |
| Position = UDim2.fromScale(.78, 1), | |
| Size = UDim2.fromScale(.112, .133), | |
| AnchorPoint = Vector2.new(1,1), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99, | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.125 | |
| }), ui:AddInstance("ImageButton", { | |
| Image = "rbxassetid://100582884942929", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.75, .75), | |
| BackgroundTransparency = 1, | |
| MouseButton1Click = function() | |
| local editor = framework.utils.inputs.editors:Get("Main_Editor") | |
| editor:AddTab(file.name, src) | |
| utils:ClosePopup() | |
| for _, page in ipairs(utils.pages) do | |
| if page.Name == "Executor" then | |
| ui.showPage(`Page_{page.Name}`, page.Indicator) | |
| break | |
| end | |
| end | |
| end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }))), ui:AddInstance("ImageLabel", { -- FAVS BUTTON | |
| Image = "rbxassetid://96112258106990", | |
| Position = UDim2.fromScale(.675, 1), | |
| Size = UDim2.fromScale(.112, .133), | |
| AnchorPoint = Vector2.new(1,1), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.125 | |
| }), fav), ui:AddInstance("ImageLabel", { -- DELETE SCRIPT BUTTON | |
| Image = "rbxassetid://96112258106990", | |
| Position = UDim2.fromScale(0, 1), | |
| Size = UDim2.fromScale(.112, .133), | |
| AnchorPoint = Vector2.new(0,1), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.125 | |
| }), ui:AddInstance("ImageButton", { | |
| Image = "rbxassetid://80286816747552", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.75, .75), | |
| BackgroundTransparency = 1, | |
| MouseButton1Click = function() | |
| utils:ShowToast("ButtonToast", { | |
| AdditionalText = {`Delete {file.name}?`,`Eliminare {file.name}?`,`Xóa {file.name}?`,`Excluir {file.name}?`,`Hapus {file.name}?`,`Удалить {file.name}?`,`{file.name} löschen?`,`¿Eliminar {file.name}?`,`Supprimer {file.name}?`,`删除 {file.name}?`,`{file.name} を削除しますか?`,`هل تريد حذف {file.name}؟`,`{file.name} हटाएँ?`,`ลบ {file.name}?`}, | |
| AdditionalTitle = {"Delete file","Eliminare file","Xóa tệp","Excluir arquivo","Hapus file","Удалить файл","Datei löschen","¿Eliminar archivo?","Supprimer le fichier","删除文件","ファイルを削除","حذف الملف","फ़ाइल हटाएँ","ลบไฟล์"}, | |
| Style = "confirm", | |
| Callback = function(res: boolean) | |
| if not res then return end | |
| file:Delete() | |
| framework.dependencies.scripthub:Browse(nil, true, "scripthub") | |
| framework.dependencies.editortabs:GetSaved("tabs") | |
| utils:ClosePopup() | |
| end | |
| }) | |
| end | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }))))) | |
| function comp:SetFavourite(status: boolean) | |
| fav.instance.Image = status and framework.protected:ProtectAsset("rbxassetid://137934368112423") or "rbxassetid://80350699155696" | |
| if props.component then props.component:SetFavourite(status) end | |
| refreshTabs() | |
| end | |
| updateAutoexec() | |
| return comp | |
| end))) | |
| ui:CreateComponent("CodeEditor").OnCreating:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(props: {any}) | |
| local sizes = ui:AddInstance("UISizeConstraint", { | |
| MaxSize = Vector2.new(math.huge, math.huge), | |
| MinSize = Vector2.zero | |
| }) | |
| local lines = ui:AddInstance("TextLabel", { | |
| FontFace = Font.new("rbxasset://fonts/families/Inconsolata.json", Enum.FontWeight.Regular, Enum.FontStyle.Normal), | |
| TextXAlignment = Enum.TextXAlignment.Right, | |
| TextYAlignment = Enum.TextYAlignment.Top, | |
| AutomaticSize = Enum.AutomaticSize.Y, | |
| Position = UDim2.fromScale(.025, 0), | |
| Size = UDim2.fromScale(.05, 0), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .45, | |
| Text = "", | |
| Tags = {"FontSizes_Editor", "Colors_Text_Primary", "Fonts_Editor"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }, sizes) | |
| local textbox = ui:AddInstance("TextBox", { | |
| Id = props.Id, | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| TextYAlignment = Enum.TextYAlignment.Top, | |
| AutomaticSize = Enum.AutomaticSize.XY, | |
| Size = UDim2.fromScale(1, 1), | |
| FocusLost = props.FocusLost, | |
| BackgroundTransparency = 1, | |
| ClearTextOnFocus = false, | |
| Focused = props.Focused, | |
| MultiLine = true, | |
| Tags = {"FontSizes_Editor", "Colors_Text_Primary", "Fonts_Editor"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }) | |
| local scrollx = ui:AddInstance("ScrollingFrame", { | |
| ScrollingDirection = Enum.ScrollingDirection.X, | |
| AutomaticCanvasSize = Enum.AutomaticSize.X, | |
| AutomaticSize = Enum.AutomaticSize.Y, | |
| CanvasSize = UDim2.fromScale(0, 0), | |
| Position = UDim2.fromScale(.1, 0), | |
| ScrollBarThickness = padding, | |
| Size = UDim2.fromScale(.9, .7), | |
| BackgroundTransparency = 1, | |
| BorderSizePixel = 0, | |
| Colors_Primary = {"ScrollBarImageColor3"}, | |
| Tags = {"Colors_Primary"} | |
| }, textbox, ui:AddInstance("Frame", { | |
| Size = UDim2.fromOffset(padding * 10, padding*10), | |
| Position = UDim2.fromScale(0, 1), | |
| BackgroundTransparency = 1, | |
| Tags = {"UI_WindowState"}, | |
| UI_WindowState = { | |
| Size = {false, UDim2.fromOffset(padding * 12.5, padding*12.5), UDim2.fromOffset(padding * 15, padding*15)} | |
| } | |
| })) | |
| local overlay = ui:AddInstance("Frame", { | |
| BackgroundColor3 = Color3.fromRGB(0, 0, 0), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = .5, | |
| Visible = false, | |
| ZIndex = 2 | |
| }, ui:AddInstance("Frame", { | |
| BackgroundColor3 = Color3.fromRGB(138, 138, 138), | |
| Position = UDim2.fromScale(.5, .1), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| Size = UDim2.fromScale(.5, .1) | |
| }, ui:AddInstance("TextLabel", { | |
| Position = UDim2.fromScale(.5, .1), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| Size = UDim2.fromScale(.9, .75), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Country_Code = {"Text too long to be edited, read only.","Testo troppo lungo per essere modificato, solo lettura.","Văn bản quá dài để chỉnh sửa, chỉ đọc.","Texto muito longo para ser editado, somente leitura.","Teks terlalu panjang untuk diedit, hanya baca.","Текст слишком длинный для редактирования, только для чтения.","Text zu lang zum Bearbeiten, nur Lesezugriff.","Texto demasiado largo para editar, solo lectura.","Texte trop long pour être modifié, lecture seule.","文本过长无法编辑,仅可读取。","テキストが長すぎて編集できません。読み取り専用です。","النص طويل جدًا ولا يمكن تحريره، للقراءة فقط.","पाठ संपादन के लिए बहुत लंबा है, केवल पढ़ने के लिए।","ข้อความยาวเกินไป ไม่สามารถแก้ไขได้ อ่านอย่างเดียว"}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Editor"} | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| }))) | |
| local editor = framework.utils.inputs.editors.new(props.Id) | |
| local scrolly = ui:AddInstance("ScrollingFrame", { | |
| ScrollingDirection = Enum.ScrollingDirection.Y, | |
| AutomaticCanvasSize = Enum.AutomaticSize.Y, | |
| CanvasSize = UDim2.fromScale(0, 0), | |
| AnchorPoint = props.AnchorPoint, | |
| ScrollBarThickness = padding, | |
| BackgroundTransparency = 1, | |
| Position = props.Position, | |
| BorderSizePixel = 0, | |
| Size = props.Size, | |
| ZIndex = 1, | |
| Colors_Primary = {"ScrollBarImageColor3"}, | |
| Tags = {"Colors_Primary"}, | |
| OnRemoved = function() editor:Remove() end | |
| }, lines, scrollx, overlay) | |
| local highlightmaxchars = 10000 | |
| local constraint = sizes.instance | |
| local updateLines = framework.protected:GCProtect(function() | |
| local y = scrollx.instance.AbsoluteSize.Y | |
| constraint.MinSize = Vector2.zero -- Prevent roblox from being too smart | |
| constraint.MaxSize = Vector2.new(math.huge, math.huge) | |
| constraint.MaxSize = Vector2.new(math.huge, y) | |
| y = framework.utils.maths.clamp(y, constraint.MaxSize.Y, math.huge) | |
| constraint.MinSize = Vector2.new(0, y) | |
| end) | |
| updateLines() | |
| scrollx.instance:GetPropertyChangedSignal("AbsoluteSize"):Connect(updateLines) | |
| textbox.instance:GetPropertyChangedSignal("TextEditable"):Connect(function() | |
| overlay.instance.Visible = not textbox.instance.TextEditable | |
| end) | |
| editor:ConnectHighlighter(textbox, highlightmaxchars) | |
| editor:SetHighlighterColors(ui.highColors) | |
| editor:ConnectLinesCounter(lines) | |
| editor:SetText(props.Text or "") | |
| return scrolly | |
| end))) | |
| ui:CreateComponent("SettingToggle").OnCreating:Connect(framework.protected:GCProtect(function(props: {any}) | |
| local state, toggle, knob = false, nil, nil | |
| local function updateColor(color) | |
| if state then | |
| return toggle:Tween(tweens.default, { | |
| BackgroundColor3 = color, | |
| BackgroundTransparency = 0 | |
| }) | |
| end | |
| toggle:Tween(tweens.default, { | |
| BackgroundColor3 = Color3.fromHex("#555"), | |
| BackgroundTransparency = 0 | |
| }) | |
| end | |
| local function update(enabled: boolean?) | |
| state = enabled | |
| local goalPos = enabled and UDim2.fromScale(.8, .5) or UDim2.fromScale(.2, .5) | |
| knob:Tween(tweens.default, { Position = goalPos }) | |
| local succ, err = pcall(Color3.fromHex, framework.settings:GetSetting("Colors_Primary")) | |
| updateColor(succ and err or Color3.fromHex(framework.settings:GetDefaultSetting("Colors_Primary"))) | |
| end | |
| knob = ui:AddInstance("Frame", { | |
| Position = UDim2.fromScale(.8, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.65, .8), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIAspectRatioConstraint"), ui:AddInstance("Frame", { | |
| BackgroundColor3 = Color3.fromHex("#fff"), | |
| Size = UDim2.fromScale(1, 1) | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| }), ui:AddInstance("UIAspectRatioConstraint"))) | |
| toggle = ui:AddInstance("ImageButton", { | |
| Position = UDim2.fromScale(.875, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.15, .5), | |
| Tags = {"Colors_Primary"}, | |
| Colors_Primary = updateColor, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| state = not state | |
| update(state) | |
| props.Callback(state) | |
| end) | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| }), knob) | |
| local comp = ui:AddInstance("Frame", { | |
| Id = props.Id or ("Setting_" .. (props.Title:gsub("%s+", ""))), | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| ZIndex = -(props.LayoutOrder or 0), | |
| LayoutOrder = props.LayoutOrder, | |
| Size = UDim2.fromScale(.9, .2), | |
| BackgroundTransparency = .7, | |
| Position = props.Position | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(0.25, 0) | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| TextYAlignment = Enum.TextYAlignment.Bottom, | |
| Position = UDim2.fromScale(.025, .1), | |
| TextColor3 = Color3.fromHex("#fff"), | |
| Size = UDim2.fromScale(.6, .4), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Fonts_Heading"}, | |
| Country_Code = props.Title | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| TextYAlignment = Enum.TextYAlignment.Top, | |
| Position = UDim2.fromScale(.025, .85), | |
| TextColor3 = Color3.fromHex("#fff"), | |
| AnchorPoint = Vector2.new(0, 1), | |
| Size = UDim2.fromScale(.6, .3), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Fonts_Description"}, | |
| Country_Code = props.Description | |
| }), toggle) | |
| knob.instance:GetPropertyChangedSignal("Position"):Connect(function() | |
| update(state) | |
| end) | |
| task.defer(function() | |
| update(props.Enabled()) | |
| end) | |
| return comp | |
| end)) | |
| ui:CreateComponent("SettingDropdown").OnCreating:Connect(framework.protected:GCProtect(function(props: {any}) | |
| local btn, list, content, listLayout | |
| local lastText = props.Options[1].Name | |
| btn = ui:AddInstance("TextButton", { | |
| Text = utils:Translate(lastText), | |
| Position = UDim2.fromScale(.975, .5), | |
| AnchorPoint = Vector2.new(1, .5), | |
| Size = UDim2.fromScale(.25, .5), | |
| BackgroundTransparency = .85, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Fonts_Body","Colors_Text_Primary","Colors_Primary"}, | |
| Colors_Primary = {"BackgroundColor3"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| On_Country_Code = framework.protected:GCProtect(function() | |
| btn.instance.Text = utils:Translate(lastText) | |
| end), | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| list.instance.Visible = not list.instance.Visible | |
| end) | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.35, 0) | |
| }), ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(0, padding), | |
| PaddingRight = UDim.new(0, padding), | |
| PaddingLeft = UDim.new(0, padding), | |
| PaddingTop = UDim.new(0, padding) | |
| })) | |
| -- frame scrollabile | |
| list = ui:AddInstance("ScrollingFrame", { | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Position = UDim2.fromScale(.975, 1.05), | |
| CanvasSize = UDim2.new(0, 0, 0, 0), | |
| Size = UDim2.fromScale(.25, 2.5), -- altezza massima visibile (2.5 ~ 40% schermo) | |
| AnchorPoint = Vector2.new(1,0), | |
| BackgroundTransparency = .15, | |
| ClipsDescendants = true, | |
| ScrollBarThickness = 4, | |
| BorderSizePixel = 0, | |
| Visible = false, | |
| ZIndex = 10, | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.15, 0) | |
| }), ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(0.05, 0), | |
| PaddingRight = UDim.new(0.05, 0), | |
| PaddingLeft = UDim.new(0.05, 0), | |
| PaddingTop = UDim.new(0.05, 0) | |
| })) | |
| -- contenitore autosize | |
| content = ui:AddInstance("Frame", { | |
| Size = UDim2.fromScale(1, 0), | |
| AutomaticSize = Enum.AutomaticSize.Y, | |
| BackgroundTransparency = 1, | |
| Parent = list.instance | |
| }, ui:AddInstance("UIListLayout", { | |
| FillDirection = Enum.FillDirection.Vertical, | |
| Padding = UDim.new(0, 10), -- padding maggiore per touch | |
| SortOrder = Enum.SortOrder.LayoutOrder | |
| })) | |
| listLayout = content.instance:FindFirstChildOfClass("UIListLayout") | |
| -- opzioni | |
| for _, option in ipairs(props.Options) do | |
| ui:AddInstance("TextButton", { | |
| Parent = content.instance, | |
| Size = UDim2.new(1, 0, 0, 30), -- altezza fissa in pixel | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| TextWrapped = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary","Fonts_Body"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| Country_Code = option.Name, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| btn.instance.Text = utils:Translate(option.Name) | |
| lastText = option.Name | |
| list.instance.Visible = false | |
| props.Callback(option.Value) | |
| end) | |
| }) | |
| end | |
| -- aggiorna canvas size in base al contenitore | |
| listLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function() | |
| list.instance.CanvasSize = UDim2.new(0, 0, 0, listLayout.AbsoluteContentSize.Y + 50) | |
| end) | |
| if props.SelectedValue then | |
| task.defer(function() | |
| local val = props.SelectedValue() | |
| for _, option in ipairs(props.Options) do | |
| if val == option.Value then | |
| lastText = option.Name | |
| btn.instance.Text = utils:Translate(option.Name) | |
| break | |
| end | |
| end | |
| end) | |
| end | |
| local comp = ui:AddInstance("Frame", { | |
| Id = props.Id or `Setting_{props.Title:gsub("%s+", "")}`, | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| ZIndex = -(props.LayoutOrder or 0), | |
| LayoutOrder = props.LayoutOrder, | |
| Size = UDim2.fromScale(.9, .2), | |
| BackgroundTransparency = .7, | |
| Position = props.Position | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(0.25, 0) | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| TextYAlignment = Enum.TextYAlignment.Bottom, | |
| Position = UDim2.fromScale(.025, .1), | |
| TextColor3 = Color3.fromHex("#fff"), | |
| Size = UDim2.fromScale(.6, .4), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Fonts_Heading"}, | |
| Country_Code = props.Title | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| TextYAlignment = Enum.TextYAlignment.Top, | |
| Position = UDim2.fromScale(.025, .85), | |
| TextColor3 = Color3.fromHex("#fff"), | |
| AnchorPoint = Vector2.new(0, 1), | |
| Size = UDim2.fromScale(.6, .3), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Fonts_Description"}, | |
| Country_Code = props.Description | |
| }), btn, list) | |
| return comp | |
| end)) | |
| ui:CreateComponent("SettingNumeric").OnCreating:Connect(framework.protected:GCProtect(function(props: {any}) | |
| props.Increment = props.Increment or 1 | |
| props.Min = props.Min or -math.huge | |
| props.Max = props.Max or math.huge | |
| props.Value = props.Value or 0 | |
| local value = ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Center, | |
| TextYAlignment = Enum.TextYAlignment.Center, | |
| Size = UDim2.fromScale(.35, 1), | |
| Text = tostring(props.Value), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| LayoutOrder = 2, | |
| Tags = {"Fonts_Body","Colors_Text_Primary"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }) | |
| local function setNum(num: number) | |
| num = framework.utils.maths.clamp(num, props.Min, props.Max) | |
| if props.Value ~= num then | |
| props.Value = num | |
| value.instance.Text = tostring(num) | |
| props.Callback(num) | |
| end | |
| end | |
| local process | |
| local stop = framework.protected:GCProtect(function() | |
| if process then task.cancel(process) end | |
| end) | |
| local down = ui:AddInstance("TextButton", { | |
| Size = UDim2.fromScale(.25, 1), | |
| BackgroundTransparency = .2, | |
| TextScaled = true, | |
| LayoutOrder = 1, | |
| Text = "−", | |
| MouseButton1Up = stop, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| setNum(props.Value - props.Increment) | |
| end), | |
| Tags = {"Fonts_Body","Colors_Text_Primary","Colors_Primary"}, | |
| Colors_Primary = {"BackgroundColor3"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| })) | |
| local up = ui:AddInstance("TextButton", { | |
| Size = UDim2.fromScale(.25, 1), | |
| BackgroundTransparency = .2, | |
| TextScaled = true, | |
| LayoutOrder = 3, | |
| Text = "+", | |
| MouseButton1Up = stop, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| setNum(props.Value + props.Increment) | |
| end), | |
| Tags = {"Fonts_Body","Colors_Text_Primary","Colors_Primary"}, | |
| Colors_Primary = {"BackgroundColor3"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| })) | |
| local comp = ui:AddInstance("Frame", { | |
| Id = props.Id or ("Setting_" .. (props.Title:gsub("%s+", ""))), | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| ZIndex = -(props.LayoutOrder or 0), | |
| LayoutOrder = props.LayoutOrder, | |
| Size = UDim2.fromScale(.9, .2), | |
| BackgroundTransparency = .7, | |
| Position = props.Position | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(0.25, 0) | |
| }), ui:AddInstance("TextLabel", { | |
| TextYAlignment = Enum.TextYAlignment.Bottom, | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.025, .1), | |
| TextColor3 = Color3.fromHex("#fff"), | |
| Size = UDim2.fromScale(.6, .4), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Fonts_Heading"}, | |
| Country_Code = props.Title | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| TextYAlignment = Enum.TextYAlignment.Top, | |
| Position = UDim2.fromScale(.025, .85), | |
| TextColor3 = Color3.fromHex("#fff"), | |
| AnchorPoint = Vector2.new(0, 1), | |
| Size = UDim2.fromScale(.6, .3), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Fonts_Description"}, | |
| Country_Code = props.Description | |
| }), ui:AddInstance("Frame", { | |
| AnchorPoint = Vector2.new(1, .5), | |
| Position = UDim2.fromScale(.975, .5), | |
| Size = UDim2.fromScale(.38, .55), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIListLayout", { | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| VerticalAlignment = Enum.VerticalAlignment.Center, | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| Padding = UDim.new(0, 6) | |
| }), down, value, up)) | |
| -- press & hold | |
| local hup = framework.utils.inputs.buttons.holdable(up) | |
| hup.OnShortPress:Connect(framework.protected:GCProtect(function() | |
| setNum(props.Value + props.Increment) | |
| end)) | |
| --[[hup.OnLongPress:Connect(framework.protected:GCProtect(function() | |
| local tim = .5 | |
| process = task.spawn(function() | |
| while true do | |
| setNum(props.Value + props.Increment) | |
| task.wait(tim) | |
| tim = math.max(.1, tim - .1) | |
| end | |
| end) | |
| end))]] | |
| local hdown = framework.utils.inputs.buttons.holdable(down) | |
| hdown.OnShortPress:Connect(framework.protected:GCProtect(function() | |
| setNum(props.Value - props.Increment) | |
| end)) | |
| --[[hdown.OnLongPress:Connect(framework.protected:GCProtect(function() | |
| local tim = .5 | |
| process = task.spawn(function() | |
| while true do | |
| setNum(props.Value - props.Increment) | |
| task.wait(tim) | |
| tim = math.max(.1, tim - .1) | |
| end | |
| end) | |
| end))]] | |
| task.defer(function() | |
| setNum(props.StartValue()) | |
| end) | |
| return comp | |
| end)) | |
| local pages do | |
| local user = framework.protected:GetService("Players").LocalPlayer | |
| local displayName, aiName = user.DisplayName, "Arcy" | |
| pages = { | |
| { Name = "Home", Icon = "rbxassetid://16548334799", | |
| Content = ui:AddInstance("Frame", {Id = "Home"}, | |
| ui:AddInstance("ImageLabel", { | |
| Id = "ProfilePanelBackground", | |
| Position = UDim2.fromScale(.03, .15), | |
| Size = UDim2.fromScale(.375, .2), | |
| BackgroundTransparency = 1, | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.28, 0) | |
| }), ui:AddInstance("ImageLabel", { | |
| Id = "UserPFP", | |
| AnchorPoint = Vector2.new(0, .5), | |
| Position = UDim2.fromScale(.05, .5), | |
| Size = UDim2.fromScale(.3, .725), | |
| BackgroundTransparency = 1, | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.35, 0) | |
| }), ui:AddInstance("ImageLabel", { | |
| Id = "PFPOverlay", | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| Colors_Primary = {"ImageColor3"}, | |
| Tags = {"Colors_Primary"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.35, 0) | |
| })), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.3035, .2), | |
| Size = UDim2.fromScale(.6, .2), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Country_Code = {"Welcome","Benvenuto","Chào mừng","Bem-vindo","Selamat datang","Добро пожаловать","Willkommen","Bienvenido","Bienvenue","欢迎","ようこそ","مرحبًا","स्वागत","ยินดีต้อนรับ"}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Description"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddComponent("MovingText", { | |
| Id = "MagicNicknameContainer", | |
| Position = UDim2.fromScale(.3035, .45), | |
| Size = UDim2.fromScale(.625, .35), | |
| BackgroundTransparency = 1, | |
| ClipsDescendants = true, | |
| Text = displayName | |
| })), ui:AddInstance("ImageButton", { | |
| Id = "HomeTipBackground", | |
| AnchorPoint = Vector2.new(1, 0), | |
| Position = UDim2.fromScale(.58, .15), | |
| Size = UDim2.fromScale(.16, .2), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| framework.dependencies.plugins:Open("AXS_Hub", ui:Get("ExtensionContent")) | |
| for _, page in ipairs(utils.pages) do | |
| if page.Name == "Extensions" then | |
| ui.showPage(`Page_{page.Name}`, page.Indicator) | |
| break | |
| end | |
| end | |
| end) | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.28, 0) | |
| }), ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://125983090347378", | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Position = UDim2.fromScale(.5, .35), | |
| Size = UDim2.fromScale(.75,.75), | |
| ScaleType = Enum.ScaleType.Fit, | |
| BackgroundTransparency = 1 | |
| }), ui:AddInstance("TextLabel", { | |
| Text = "Arceus Hub", | |
| BackgroundTransparency = 1, | |
| Position = UDim2.fromScale(.5, .75), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.8, .2), | |
| TextScaled = true, | |
| Tags = {"Fonts_Body", "Colors_Text_Primary"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| })), ui:AddInstance("ImageLabel", { | |
| Id = "BestScriptsPanelBackground", | |
| Position = UDim2.fromScale(.03, .37), | |
| Size = UDim2.fromScale(.55, .36), | |
| BackgroundTransparency = 1, | |
| ClipsDescendants = true, | |
| Colors_Secondary = {"BackgroundColor3"}, | |
| Tags = {"Colors_Secondary"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.15, 0) | |
| }), ui:AddInstance("TextLabel", { | |
| Position = UDim2.fromScale(.05, .05), | |
| Size = UDim2.fromScale(.9, .1), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Body"}, | |
| Country_Code = {"Best Scripts","Migliori Scripts","Các kịch bản tốt nhất","Melhores scripts","Skrip terbaik","Лучшие скрипты","Beste Skripte","Mejores scripts","Meilleurs scripts","最佳脚本","最高のスクリプト","أفضل البرامج النصية","सर्वश्रेष्ठ स्क्रिप्ट","สคริปต์ที่ดีที่สุด"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddComponent("ContentBar", { | |
| Id = "BestScriptsBar", | |
| Position = UDim2.fromScale(.5, .575), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(1, .725) | |
| })), ui:AddInstance("Frame", { | |
| Id = "AIPanelBackground", | |
| Position = UDim2.fromScale(.03, .75), | |
| Size = UDim2.fromScale(.55, .2), | |
| BackgroundTransparency = .5, | |
| BackgroundColor3 = Color3.fromRGB(255, 255, 255), | |
| ClipsDescendants = true, | |
| Tags = {"Colors_Secondary"} | |
| }, ui:AddInstance("UIGradient", { | |
| Id = "AIPanelGradient", | |
| Rotation = 10, | |
| Color = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(.0, Color3.fromHex("#15A6FE")), | |
| ColorSequenceKeypoint.new(.33, Color3.fromHex("#F473EC")), | |
| ColorSequenceKeypoint.new(.66, Color3.fromHex("#FF3869")), | |
| ColorSequenceKeypoint.new(1.0, Color3.fromHex("#FF3869")) | |
| }) | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.3, 0) | |
| }), ui: AddInstance("ImageButton", { | |
| Id = "AIPanelBackgroundOverlay", | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| ZIndex = 30, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| for _, page in ipairs(utils.pages) do | |
| if page.Name == "ArceusIntelligence" then | |
| ui.showPage(`Page_{page.Name}`, page.Indicator) | |
| break | |
| end | |
| end | |
| end) | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.3, 0) | |
| }), ui:AddInstance("TextLabel", { | |
| AnchorPoint = Vector2.new(1, 0), | |
| TextXAlignment = Enum.TextXAlignment.Right, | |
| Position = UDim2.fromScale(.95, .1), | |
| Size = UDim2.fromScale(.35, .15), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Country_Code = {"Arceus Intelligence"}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Caption"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| }), ui:AddInstance("TextLabel", { | |
| AnchorPoint = Vector2.new(0, 1), | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.3, .425), | |
| Size = UDim2.fromScale(.2, .15), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Country_Code = {"Let's talk","Parliamo","Hãy nói chuyện","Vamos conversar","Mari bicara","Давай поговорим","Lass uns reden","Hablemos","Parlons","让我们谈谈","話しましょう","هيا نتحدث","चलिए बात करते हैं","มาคุยกันเถอะ"}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Body"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| AnchorPoint = Vector2.new(0, .5), | |
| Position = UDim2.fromScale(.3 , .55), | |
| Size = UDim2.fromScale(.8, .275), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Country_Code = {`Hello! I'm {aiName}!`,`Ciao! Sono {aiName}!`,`Xin chào! Tôi là {aiName}!`,`Olá! Eu sou {aiName}!`,`Halo! Saya {aiName}!`,`Привет! Я {aiName}!`,`Hallo! Ich bin {aiName}!`,`Hola! Soy {aiName}!`,`Bonjour! Je suis {aiName}!`,`你好!我是 {aiName}!`,`こんにちは!私は {aiName} です!`,`مرحبًا! أنا {aiName}!`,`नमस्ते! मैं {aiName} हूँ!`,`สวัสดี! ฉันคือ {aiName}!`}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Description"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| }), ui: AddInstance("ImageLabel", { | |
| Id = "AIIcon", | |
| Position = UDim2.fromScale(.05 , .5), | |
| Size = UDim2.fromScale(.85, .85), | |
| AnchorPoint = Vector2.new(0, .5), | |
| BackgroundTransparency = 1, | |
| Tags = {"Colors_Text_Primary"} | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui: AddInstance("ImageLabel", { | |
| Image = "rbxassetid://102982068367172", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.4, .4), | |
| ScaleType = Enum.ScaleType.Fit, | |
| BackgroundTransparency = 1, | |
| ImageTransparency = .2, | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }))))), ui:AddInstance("ImageLabel", { | |
| Id = "SlidersContainerBackground", | |
| Position = UDim2.fromScale(.97, .95), | |
| Size = UDim2.fromScale(.36 , .8), | |
| AnchorPoint = Vector2.new(1, 1), | |
| BackgroundTransparency = 1, | |
| Tags = {"Colors_Secondary"}, | |
| Colors_Secondary = {"BackgroundColor3"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.11, 0) | |
| }), ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(.065, 0), | |
| PaddingTop = UDim.new(.065, 0), | |
| PaddingRight = UDim.new(.1, 0), | |
| PaddingLeft = UDim.new(.1, 0), | |
| }), ui:AddInstance("UIListLayout", { | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| HorizontalFlex = Enum.UIFlexAlignment.Fill, | |
| VerticalFlex = Enum.UIFlexAlignment.Fill, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| Padding = UDim.new(.05, 0) | |
| }), framework.protected:GCProtect(function() | |
| local cache = {} | |
| local getHumanoid = framework.protected:GCProtect(function(char) | |
| local succ, hum: Humanoid = pcall(char.WaitForChild, char, "Humanoid") | |
| if not succ then return end | |
| return hum | |
| end) | |
| local frames, sliders = {}, { | |
| { | |
| Icon = "rbxassetid://15054333892", | |
| Label = {"Gravity","Gravità","Trọng lực","Gravidade","Gravitasi","Гравитация","Schwerkraft","Gravedad","Gravité","重力","重力","الجاذبية","गुरुत्वाकर्षण","แรงโน้มถ่วง"}, | |
| Id = "Gravity", | |
| Def = 196.2, Min = .001, Max = 250, Ena = false, | |
| Set = framework.protected:GCProtect(function(value: number) | |
| framework.protected:GetService("Workspace").Gravity = value | |
| end) | |
| }, | |
| { | |
| Icon = "rbxassetid://15054332032", | |
| Label = {"Jump","Salto","Nhảy","Pular","Lompat","Прыжок","Sprung","Salto","Saut","跳跃","ジャンプ","قفزة","कूद","กระโดด"}, | |
| Id = "Jump", | |
| Def = 7.2, Min = 0, Max = 250, Ena = false, | |
| Set = framework.protected:GCProtect(function(value: number) | |
| cache.jump = cache.jump or {} | |
| local ccon, jcon = | |
| cache.jump.ccon, cache.jump.jcon | |
| if ccon then ccon:Disconnect() end | |
| if jcon then jcon:Disconnect() end | |
| local plr: Player = framework.protected:GetService("Players").LocalPlayer | |
| local char = plr.Character | |
| if char then | |
| local hum = getHumanoid(char) | |
| if hum then | |
| hum.UseJumpPower = false | |
| hum.JumpHeight = value | |
| end | |
| end | |
| cache.jump.ccon = plr.CharacterAdded:Connect(function(char) | |
| local hum = getHumanoid(char) | |
| if not hum then return end | |
| hum.UseJumpPower = false | |
| hum.JumpHeight = value | |
| cache.jump.jcon = hum:GetPropertyChangedSignal("JumpHeight"):Connect(function() | |
| hum.UseJumpPower = false | |
| hum.JumpHeight = value | |
| end) | |
| end) | |
| end) | |
| }, | |
| { | |
| Icon = "rbxassetid://15054335513", | |
| Label = {"Speed","Velocità","Tốc độ","Velocidade","Kecepatan","Скорость","Geschwindigkeit","Velocidad","Vitesse","速度","速度","السرعة","गति","ความเร็ว"}, | |
| Id = "Speed", | |
| Def = 16, Min = 0, Max = 500, Ena = false, | |
| Set = framework.protected:GCProtect(function(value: number) | |
| cache.speed = cache.speed or {} | |
| local ccon, scon = | |
| cache.speed.ccon, cache.speed.scon | |
| if ccon then ccon:Disconnect() end | |
| if scon then scon:Disconnect() end | |
| local plr: Player = framework.protected:GetService("Players").LocalPlayer | |
| local char = plr.Character | |
| if char then | |
| local hum = getHumanoid(char) | |
| if hum then hum.WalkSpeed = value end | |
| end | |
| cache.speed.ccon = plr.CharacterAdded:Connect(function(char) | |
| local hum = getHumanoid(char) | |
| if not hum then return end | |
| hum.WalkSpeed = value | |
| cache.speed.jcon = hum:GetPropertyChangedSignal("WalkSpeed"):Connect(function() | |
| hum.WalkSpeed = value | |
| end) | |
| end) | |
| end) | |
| } | |
| } | |
| for i, slider in ipairs(sliders) do | |
| local img = ui:AddInstance("ImageLabel", { | |
| Id = `Slider_{slider.Label[1]}`, | |
| Image = "rbxassetid://97199452213620", --"rbxassetid://113076933640634", | |
| ImageColor3 = Color3.fromHex("#F00"), | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| ZIndex = 2, | |
| Colors_Primary = {"ImageColor3"}, | |
| Tags = {"Colors_Primary"} | |
| }) | |
| local img2 = ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://71605317317599", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(4, 4), | |
| BackgroundTransparency = 1 | |
| }) | |
| local bar = ui:AddInstance("TextButton", { | |
| Id = `Slider_{slider.Label[1]}_Bar`, | |
| BackgroundColor3 = Color3.fromRGB(255, 0, 0), | |
| Position = UDim2.fromScale(.5, 1), | |
| AnchorPoint = Vector2.new(.5, 1), | |
| Size = UDim2.fromScale(1, 1), | |
| --BackgroundTransparency = 1, -- Bar edit | |
| AutoButtonColor = false, | |
| LayoutOrder = 1, | |
| Text = "", | |
| Colors_Primary = {"BackgroundColor3"}, | |
| Tags = {"Colors_Primary"} | |
| }) | |
| local lbl = ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Center, | |
| Position = UDim2.fromScale(.5, .05), | |
| Size = UDim2.fromScale(.75, .085), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Text = "75%", | |
| ZIndex = 5, | |
| Tags = {"Colors_Text_Primary", "Fonts_Title"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }) | |
| local setValue = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(percent: number) | |
| slider.Set(framework.utils.maths.clamp(slider.Min +percent *(slider.Max -slider.Min), slider.Min, slider.Max)) | |
| utils:Vibrate(Enum.HapticEffectType.UIClick) | |
| end)) | |
| local btn, sld, status | |
| local updateColor = framework.protected:GCProtect(function(color) | |
| local props = { ImageColor3 = status and | |
| color or Color3.fromRGB( | |
| framework.utils.maths.max(color.R *255*2/5, 0), | |
| framework.utils.maths.max(color.G *255*2/5, 0), | |
| framework.utils.maths.max(color.B *255*2/5, 0) | |
| ) | |
| } | |
| --img:Tween(tweens.default, props) | |
| img2:Tween(tweens.default, props) | |
| props.BackgroundColor3 = props.ImageColor3 | |
| props.ImageColor3 = nil | |
| bar:Tween(tweens.default, props) | |
| end) | |
| local setEnabled = framework.protected:GCProtect(function(ignore: boolean) | |
| status = slider.Ena | |
| slider.Ena = not slider.Ena | |
| if status then sld:Enable() else sld:Disable() end | |
| if not (ignore == true) then | |
| if status then | |
| setValue(sld.percentage) | |
| else | |
| slider.Set(slider.Def) | |
| end | |
| end | |
| local succ, err = pcall(Color3.fromHex, framework.settings:GetSetting("Colors_Primary")) | |
| local color: Color3 = succ and err or Color3.fromHex(framework.settings:GetDefaultSetting("Colors_Primary")) | |
| updateColor(color) | |
| utils:AnimateCascade(ui:Get(`SliderToggle_{slider.Label[1]}`).instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| end) | |
| local setLabel = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(percent: number) | |
| lbl.instance.Text = `{framework.utils.maths.round(percent*100)}%` | |
| --[[local anim = utils:GetAnimation(`Slider_{slider.Label[1]}`) | |
| if not anim then return end | |
| local total = anim:GetFrameCount() | |
| local idx = framework.utils.maths.ceil(percent * (total -1)) | |
| anim:SetFrame(idx)]] | |
| utils:Vibrate(Enum.HapticEffectType.UIHover) | |
| end)) | |
| btn = ui:AddInstance("TextButton", { | |
| Id = `SliderToggle_{slider.Label[1]}`, | |
| Size = UDim2.fromScale(.3, .1), | |
| Position = UDim2.fromScale(.3, 1.05), | |
| BackgroundTransparency = 1, | |
| LayoutOrder = 2, | |
| ZIndex = 1, | |
| Text = "", | |
| MouseButton1Click = setEnabled, | |
| Colors_Primary = updateColor, | |
| Tags = {"Colors_Primary"}, | |
| }, img2, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| }), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })) | |
| framework.utils.tables.insert(frames, ui:AddInstance("Frame", { | |
| Size = UDim2.fromScale(.17, .6), | |
| BackgroundTransparency = 1, | |
| ClipsDescendants = true, -- Bar edit | |
| LayoutOrder = i | |
| }, ui:AddInstance("UIListLayout", { | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| VerticalAlignment = Enum.VerticalAlignment.Center, | |
| VerticalFlex = Enum.UIFlexAlignment.SpaceBetween, | |
| FillDirection = Enum.FillDirection.Vertical, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| Padding = UDim.new(.045, 0) | |
| }), ui:AddInstance("CanvasGroup", { | |
| --Image = "rbxassetid://97199452213620", | |
| Id = slider.Id .. "Container", | |
| Size = UDim2.fromScale(1, .7), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.35, 0) | |
| }), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = .2713 | |
| }), img, bar, lbl, ui:AddInstance("ImageLabel", { | |
| Size = UDim2.fromScale(.65, .25), | |
| Position = UDim2.fromScale(.5, .825), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| BackgroundTransparency = 1, | |
| Image = slider.Icon | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }))), btn, ui:AddInstance("TextLabel", { | |
| Size = UDim2.fromScale(1, .065), | |
| BackgroundTransparency = 1, | |
| Text = slider.Label[1], | |
| TextScaled = true, | |
| LayoutOrder = 3, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Heading"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| Country_Code = slider.Label | |
| }))) | |
| local start = framework.utils.maths.clamp((slider.Def -slider.Min)/(slider.Max -slider.Min), 0, 1) | |
| sld = framework.utils.inputs.sliders.vertical({bar}, start, slider.Id) | |
| setEnabled(true) | |
| setLabel(start) | |
| sld.OnPercentageUpdated:Connect(setLabel) | |
| sld.OnPercentageChanged:Connect(setValue) | |
| framework.animator.OnAnimationLoaded:Connect(function(anim: {any}) | |
| if framework.utils.strings.sub(anim.id, 1, 7) == "Slider_" then | |
| --setLabel(sld.percentage) | |
| end | |
| end) | |
| end | |
| return frames | |
| end))) | |
| }, | |
| { Name = "Executor", Icon = "rbxassetid://133382010896956", | |
| Content = ui:AddInstance("Frame", {Id = "Executor"}, | |
| ui:AddInstance("Frame", { | |
| Id = "Editor", | |
| Position = UDim2.fromScale(.03, .95), | |
| AnchorPoint = Vector2.new(0, 1), | |
| Size = UDim2.fromScale(.65, .8), | |
| BackgroundTransparency = .2, | |
| Tags = {"Colors_Secondary", "UI_WindowState"}, | |
| Colors_Secondary = {"BackgroundColor3"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.05, 0) | |
| }), ui:AddInstance("Frame", { | |
| Size = UDim2.new(1, -padding, .35, 0), | |
| Position = UDim2.fromScale(0, 1), | |
| AnchorPoint = Vector2.new(0, 1), | |
| BackgroundTransparency = 0, | |
| ZIndex = 95, | |
| Tags = {"Colors_Secondary", "UI_WindowState"}, | |
| Colors_Secondary = {"BackgroundColor3"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.15, 0) | |
| }), ui:AddInstance("UIGradient", { | |
| Rotation = -90, -- verticale: dall'alto in basso | |
| Transparency = NumberSequence.new({ | |
| NumberSequenceKeypoint.new(0, 0), | |
| NumberSequenceKeypoint.new(.65, .1), | |
| NumberSequenceKeypoint.new(1, 1) | |
| }) | |
| })), ui:AddInstance("Frame", { | |
| Position = UDim2.fromScale(.92, .1), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.112, .112), | |
| BackgroundTransparency = 0, | |
| ZIndex = 95, | |
| Tags = {"Colors_Secondary", "UI_WindowState"}, | |
| Colors_Secondary = {"BackgroundColor3"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| }), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddComponent("CodeEditor", { | |
| Id = "Main_Editor", | |
| Position = UDim2.fromScale(0, .5), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(1, .925), | |
| Focused = framework.protected:GCProtect(function() | |
| utils:EditorMode(true, .175) | |
| framework.utils.inputs.editors:Get("Main_Editor"):ToggleHighlighter(false) | |
| end), | |
| FocusLost = framework.protected:GCProtect(function() | |
| utils:EditorMode(false) | |
| local editor = framework.utils.inputs.editors:Get("Main_Editor") | |
| local tabs = framework.dependencies.editortabs | |
| local tab = tabs:GetSelection() | |
| if not tab then return end | |
| tab:SetSource(editor:GetText()) | |
| editor:ToggleHighlighter(true) | |
| end) | |
| }), ui:AddInstance("ImageLabel", { -- EDITOR AI BUTTON | |
| Id = "EditorAIButtonShadow", | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Image = "rbxassetid://112235731951114", | |
| Position = UDim2.fromScale(.1, .87), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.8, .8), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("ImageButton", { | |
| Id = "EditorAIButton", | |
| Image = "rbxassetid://91074694855691", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.3, .3), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| MouseButton1Click = framework.protected:GCProtect(function() -- alura | |
| if utils.axintDebounce then return end | |
| utils.axintDebounce = true | |
| local background = ui:Get("BackgroundGlow") | |
| utils:ShowToast("InputToast", { | |
| PlaceholderText = {"Walkspeed script...","Script per correre...","Kịch bản tốc độ chạy...","Script de velocidade de caminhada...","Skrip kecepatan berjalan...","Скрипт скорости ходьбы...","Gehgeschwindigkeits-Skript...","Script de velocidad de caminata...","Script de vitesse de marche...","行走速度脚本...","歩行速度スクリプト...","سكريبت سرعة المشي...","चलने की गति स्क्रिप्ट...","สคริปต์ความเร็วในการเดิน..."}, | |
| AdditionalText = {"Instant code with Arcy","Scripta con Arcy","Mã tức thì với Arcy","Código instantâneo com Arcy","Kode instan dengan Arcy","Мгновенный код с Arcy","Sofortiger Code mit Arcy","Código instantáneo con Arcy","Code instantané avec Arcy","Arcy 的即时代码","Arcy でインスタントコード","كود فوري مع Arcy","Arcy के साथ त्वरित कोड","รหัสทันทีด้วย Arcy"}, | |
| Style = "ai", | |
| Callback = function(txt: string) | |
| if framework.utils.strings.gsub(txt, "%s", "") == "" then | |
| utils.axintDebounce = false | |
| return | |
| end | |
| local editor = framework.utils.inputs.editors:Get("Main_Editor") | |
| local tab = editor:AddTab("AI Script", "-- Arcy is reasoning...") | |
| local axint = framework.dependencies.axintelligence | |
| local res = axint:Chat(txt) | |
| local src = "" | |
| if res then | |
| if framework.utils.strings.gsub(res.texts[1], "%s", "") ~= "" then | |
| background:Tween(tweens.default, { | |
| ImageColor3 = Color3.fromHex("#707070") | |
| }) | |
| task.delay(3, function() | |
| background:Tween(tweens.slow_default, { | |
| ImageColor3 = Color3.fromHex("#000"), | |
| }) | |
| end) | |
| src ..= [=[--[[ | |
| ]=] ..res.texts[1].. [=[ | |
| ]] | |
| ]=] | |
| end | |
| if #res.codes > 0 then | |
| src ..= [[-- Generated by Arcy, Arceus Intelligence. | |
| ]] | |
| src ..= res.codes[1] | |
| else | |
| src ..= "-- Arcy didn't generate any code..." | |
| end | |
| end | |
| tab:SetSource(src) | |
| utils.axintDebounce = false | |
| end | |
| }) | |
| end) | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }))), ui:AddInstance("ImageLabel", { -- EDITOR EXECUTE BUTTON | |
| Id = "EditorSSExecuteButtonShadow", | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Image = "rbxassetid://111537386489097", | |
| Position = UDim2.fromScale(.9, .725), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.25, .25), | |
| BackgroundTransparency = 1, | |
| Visible = false, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.117 | |
| }), ui:AddInstance("ImageButton", { | |
| Id = "EditorSSExecuteButton", | |
| Image = "rbxassetid://123607114821398", | |
| ImageColor3 = Color3.fromHex("#58B2FF"), | |
| Size = UDim2.fromScale(.225, .225), | |
| Position = UDim2.fromScale(.505, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("EditorSSExecuteButtonShadow").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local tabs = framework.dependencies.editortabs | |
| local tab = tabs:GetSelection() | |
| local src = tab and tab:GetSource() | |
| if not src or src == "" then return end | |
| local name = tab:GetName() | |
| utils:ShowToast("ButtonToast", { | |
| AdditionalText = {`Execute {name} at Server-Side?`,`Esegui {name} sul lato server?`,`Thực thi {name} ở phía máy chủ?`,`Executar {name} no lado do servidor?`,`Eksekusi {name} di sisi server?`,`Выполнить {name} на стороне сервера?`,`{name} auf der Serverseite ausführen?`,`¿Ejecutar {name} en el lado del servidor?`,`Exécuter {name} côté serveur ?`,`在服务器端执行 {name}?`,`サーバー側で {name} を実行しますか?`,`تنفيذ {name} على جانب الخادم؟`,`सर्वर-पक्ष पर {name} निष्पादित करें?`,`ดำเนินการ {name} ที่ฝั่งเซิร์ฟเวอร์หรือไม่?`}, | |
| AdditionalTitle = {"Execute","Esegui","Thực thi","Executar","Eksekusi","Выполнить","Ausführen","Ejecutar","Exécuter","执行","実行","تنفيذ","निष्पादित करें","ดำเนินการ"}, | |
| Style = "confirm", | |
| Callback = function(res: boolean) | |
| if not res then return end | |
| framework.dependencies.serverside:Execute(src) | |
| end | |
| }) | |
| end) | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }))), ui:AddInstance("ImageLabel", { -- EDITOR EXECUTE BUTTON | |
| Id = "EditorExecuteButtonShadow", | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Image = "rbxassetid://111537386489097", | |
| Position = UDim2.fromScale(.9, .87), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.35, .35), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.117 | |
| }), ui:AddInstance("ImageButton", { | |
| Id = "EditorExecuteButton", | |
| Image = "rbxassetid://100628992603432", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.3, .3), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("EditorExecuteButtonShadow").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local tabs = framework.dependencies.editortabs | |
| local tab = tabs:GetSelection() | |
| local src = tab and tab:GetSource() | |
| if not src or src == "" then | |
| -- POPUP EXECUTE CLIPBOARD | |
| return utils:ShowToast("ButtonToast", { | |
| AdditionalText = {"Execute clipboard?","Eseguire appunto?","Thực thi khay nhớ tạm?","Executar área de transferência?","Jalankan clipboard?","Выполнить буфер обмена?","Zwischenablage ausführen?","¿Ejecutar portapapeles?","Exécuter le presse-papiers?","执行剪贴板?","クリップボードを実行しますか?","تنفيذ الحافظة؟","क्लिपबोर्ड निष्पादित करें?","เรียกใช้คลิปบอร์ด?"}, | |
| AdditionalTitle = {"Execute","Esegui","Thực thi","Executar","Eksekusi","Выполнить","Ausführen","Ejecutar","Exécuter","执行","実行","تنفيذ","निष्पादित करें","ดำเนินการ"}, | |
| Style = "confirm", | |
| Callback = function(res: boolean) | |
| if not res then return end | |
| framework.execution:Execute(framework.utils.clipboard:Get()) | |
| end | |
| }) | |
| end | |
| local name = tab:GetName() | |
| utils:ShowToast("ButtonToast", { | |
| AdditionalText = {`Execute {name}?`,`Eseguire {name}?`,`Thực thi {name}?`,`Executar {name}?`,`Jalankan {name}?`,`Выполнить {name}?`,`Ausführen {name}?`,`¿Ejecutar {name}?`,`Exécuter {name}?`,`执行{name}?`,`{name}を実行しますか?`,`تنفيذ {name}؟`,`{name} निष्पादित करें?`,`ดำเนินการ {name}?`}, | |
| AdditionalTitle = {"Execute","Esegui","Thực thi","Executar","Eksekusi","Выполнить","Ausführen","Ejecutar","Exécuter","执行","実行","تنفيذ","निष्पादित करें","ดำเนินการ"}, | |
| Style = "confirm", | |
| Callback = function(res: boolean) | |
| if not res then return end | |
| framework.execution:Execute(src) | |
| end | |
| }) | |
| end) | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }))), ui:AddInstance("ImageLabel", { -- EDITOR PASTE BUTTON | |
| Id = "EditorPasteButtonShadow", | |
| BackgroundColor3 = Color3.fromHex("#F00"), | |
| Position = UDim2.fromScale(.815, .87), | |
| Image = "rbxassetid://96112258106990", | |
| Size = UDim2.fromScale(.112, .112), | |
| AnchorPoint = Vector2.new(1, .5), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.125 | |
| }), ui:AddInstance("ImageButton", { | |
| Id = "EditorPasteButton", | |
| Image = "rbxassetid://105828625810947", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.7, .7), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("EditorPasteButtonShadow").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local tabs = framework.dependencies.editortabs | |
| local tab = tabs:GetSelection() | |
| if not tab then return end -- shouldnt happen | |
| tab:SetSource(framework.utils.clipboard:Get()) | |
| end) | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }))), ui:AddInstance("ImageLabel", { -- EDITOR COPY BUTTON | |
| Id = "EditorCopyButtonShadow", | |
| BackgroundColor3 = Color3.fromHex("#F00"), | |
| Position = UDim2.fromScale(.7, .87), | |
| Image = "rbxassetid://96112258106990", | |
| Size = UDim2.fromScale(.112, .112), | |
| AnchorPoint = Vector2.new(1, .5), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.125 | |
| }), ui:AddInstance("ImageButton", { | |
| Id = "EditorCopyButton", | |
| Image = "rbxassetid://104350786247520", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.7, .7), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("EditorCopyButtonShadow").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local tabs = framework.dependencies.editortabs | |
| local tab = tabs:GetSelection() | |
| if not tab then return end | |
| framework.utils.clipboard:Set(tab:GetSource()) | |
| end) | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }))), ui:AddInstance("ImageLabel", { -- EDITOR CLEAR BUTTON | |
| Id = "EditorClearButtonShadow", | |
| BackgroundColor3 = Color3.fromHex("#F00"), | |
| Position = UDim2.fromScale(.585, .87), | |
| Image = "rbxassetid://96112258106990", | |
| Size = UDim2.fromScale(.112, .112), | |
| AnchorPoint = Vector2.new(1, .5), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1.125 | |
| }), ui:AddInstance("ImageButton", { | |
| Id = "EditorClearButton", | |
| Image = "rbxassetid://140071393343502", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.7, .7), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("EditorClearButtonShadow").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local tabs = framework.dependencies.editortabs | |
| local tab = tabs:GetSelection() | |
| if not tab then return end | |
| local name = tab:GetName() | |
| utils:ShowToast("ButtonToast", { | |
| AdditionalText = {`Clear {name}?`,`Cancellare {name}?`,`Xóa {name}?`,`Limpar {name}?`,`Bersihkan {name}?`,`Очистить {name}?`,`{name} löschen?`,`Borrar {name}?`,`Effacer {name}?`,`清除{name}?`,`{name}をクリアしますか?`,`مسح {name}?`,`{name} साफ़ करें?`,`ล้าง {name}?`}, | |
| AdditionalTitle = {"Clear editor","Pulire editor","Xóa trình soạn thảo","Limpar editor","Bersihkan editor","Очистить редактор","Editor löschen","Limpiar editor","Effacer l'éditeur","清除编辑器","エディタをクリア","مسح المحرر","संपादक साफ़ करें","ล้างตัวแก้ไข"}, | |
| Style = "confirm", | |
| Callback = function(res: boolean) | |
| if not res then return end | |
| tab:SetSource("") | |
| end | |
| }) | |
| end) | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }))), ui:AddInstance("ImageLabel", { -- EDITOR SAVE & INFO BUTTON | |
| Id = "EditorSaveButtonShadow", | |
| Image = "rbxassetid://119555396926142", | |
| BackgroundColor3 = Color3.fromHex("#F00"), | |
| Position = UDim2.fromScale(.92, .1), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.25, .25), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("ImageButton", { | |
| Id = "EditorSaveButton", | |
| Image = "rbxassetid://80105268646831", | |
| Position = UDim2.fromScale(.5, .5), | |
| Size = UDim2.fromScale(.275, .275), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("EditorSaveButtonShadow").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local tabs = framework.dependencies.editortabs | |
| local tab = tabs:GetSelection() | |
| if not tab then return end | |
| if tab:GetData().isFile then | |
| return utils:ShowPopup("LocalScriptInfo", tab:GetFile(), {}) | |
| end | |
| tab:ToFile() | |
| tabs:GetSaved("tabs") -- Call to scripthub browse | |
| end) | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| }))), ui:AddInstance("ImageLabel", { -- EDITOR CONSOLE BUTTON | |
| Id = "EditorConsoleButtonShadow", | |
| Image = "rbxassetid://119555396926142", | |
| BackgroundColor3 = Color3.fromHex("#F00"), | |
| Position = UDim2.fromScale(.92, .25), | |
| ImageColor3 = Color3.fromHex("#0F0"), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.25, .25), | |
| BackgroundTransparency = 1, | |
| ZIndex = 99, | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("ImageButton", { | |
| Id = "EditorConsoleButton", | |
| Image = "rbxassetid://116356073714133", | |
| Position = UDim2.fromScale(.5, .5), | |
| Size = UDim2.fromScale(.275, .275), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("EditorConsoleButtonShadow").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local stgui = framework.protected:GetService("StarterGui") | |
| stgui:SetCore("DevConsoleVisible", not stgui:GetCore("DevConsoleVisible")) | |
| end) | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| })))), ui:AddInstance("Frame", { -- EDITOR SIDEBAR | |
| Id = "EditorSideBar", | |
| Position = UDim2.fromScale(.97, .95), | |
| AnchorPoint = Vector2.new(1, 1), | |
| Size = UDim2.fromScale(.27, .8), | |
| BackgroundTransparency = .3, | |
| Tags = {"Colors_Secondary", "UI_WindowState"}, | |
| Colors_Secondary = {"BackgroundColor3"}, | |
| }, ui:AddInstance("TextLabel", { | |
| Id = "CategoryTitle", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.075,.03), | |
| Size = UDim2.fromScale(.85, .08), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Country_Code = {"Files","File","Tệp tin","Arquivos","Berkas","Файлы","Dateien","Archivos","Fichiers","文件","ファイル","ملفات","फ़ाइलें","ไฟล์"}, | |
| Tags = {"Colors_Text_Primary", "Fonts_Title", "Country_Code"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextBox", { | |
| Id = "TabsSearchBox", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| BackgroundColor3 = Color3.fromHex("FFF"), | |
| Position = UDim2.fromScale(.5, .125), | |
| Size = UDim2.fromScale(.85, .085), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| BackgroundTransparency = .8, | |
| ClearTextOnFocus = false, | |
| TextScaled = true, | |
| Text = "", | |
| Country_Code_Placeholder = {"Search scripts...", "Cerca script...", "Tìm kiếm kịch bản...", "Pesquisar scripts...", "Cari skrip...", "Поиск сценариев...", "Skripte suchen...", "Buscar scripts...", "Rechercher des scripts...", "搜索脚本...", "スクリプトを検索...", "البحث عن السكربتات...", "स्क्रिप्ट खोजें...", "ค้นหาสคริปต์..."}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Body"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| FocusLost = framework.protected:GCProtect(function() | |
| local tabs = framework.dependencies.editortabs | |
| local query = ui:Get("TabsSearchBox").instance.Text | |
| local valid = framework.utils.strings.gsub(query, "[%s]+", "") ~= "" | |
| for _, tab in ipairs(tabs:GetTabs()) do | |
| local instance = tab:GetData().instance | |
| local name = tab:GetName() | |
| instance.instance.Visible = (not valid) or | |
| (framework.utils.strings.find(name, query) and true or false) | |
| end | |
| if valid then | |
| return tabs:SearchSaved(query, "tabs") -- Call to scriphub search | |
| end | |
| return tabs:GetSaved("tabs") -- Call to scripthub browse | |
| end) | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(.25,0), | |
| PaddingRight = UDim.new(.05, 0), | |
| PaddingLeft = UDim.new(.075, 0), | |
| PaddingTop = UDim.new(.25,0) | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.35, 0) | |
| })), ui:AddInstance("TextButton", { | |
| Id = "NewFileButton", | |
| BackgroundColor3 = Color3.fromHex("FFF"), | |
| Position = UDim2.fromScale(.075, .23), | |
| Size = UDim2.fromScale(.225,.225), | |
| BackgroundTransparency = .9, | |
| Text = "", | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("NewFileButton").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local editor = framework.utils.inputs.editors:Get("Main_Editor") | |
| local cont = nil | |
| if utils.tabsMode ~= "files" then | |
| cont = { [utils.tabsMode] = true } | |
| end | |
| editor:AddTab(nil, "", cont) | |
| end) | |
| }, ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://112476312219988", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.6, .6), | |
| BackgroundTransparency = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.25, 0) | |
| }), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddInstance("TextButton", { | |
| Id = "FavouriteButton", | |
| BackgroundColor3 = Color3.fromHex("FFF"), | |
| Position = UDim2.fromScale(.5, .23), | |
| Size = UDim2.fromScale(.225, .225), | |
| AnchorPoint = Vector2.new(.5,0), | |
| BackgroundTransparency = .9, | |
| Text = "", | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("FavouriteButton").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local tabs = framework.dependencies.editortabs | |
| local tab = tabs:GetSelection() | |
| if not tab then return end | |
| local status = not (tab:GetProperty("favourite") or false) | |
| tab:SetProperty("favourite", status) | |
| ui:Get("FavouriteButtonImage").instance.Image = status | |
| and framework.protected:ProtectAsset("rbxassetid://137934368112423") or "rbxassetid://80350699155696" | |
| end) | |
| }, ui:AddInstance("ImageLabel", { | |
| Id = "FavouriteButtonImage", | |
| Image = "rbxassetid://80350699155696", | |
| ImageColor3 = Color3.fromHex("#FDC41B"), | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.6, .6), | |
| BackgroundTransparency = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.25, 0) | |
| }), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddInstance("TextButton", { | |
| Id = "DeleteFileButton", | |
| BackgroundColor3 = Color3.fromHex("FFF"), | |
| Position = UDim2.fromScale(.925, .23), | |
| Size = UDim2.fromScale(.225, .225), | |
| AnchorPoint = Vector2.new(1, 0), | |
| BackgroundTransparency = .9, | |
| Text = "", | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("DeleteFileButton").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| utils:ShowToast("ButtonToast", { | |
| AdditionalText = {"Delete selected tab?","Eliminare scheda selezionata?","Xóa tab được chọn?","Excluir guia selecionada?","Hapus tab terpilih?","Удалить выбранную вкладку?","Ausgewählte Registerkarte löschen?","¿Eliminar pestaña seleccionada?","Supprimer l'onglet sélectionné ?","删除所选选项卡?","選択したタブを削除しますか?","حذف علامة التبويب المحددة؟","चयनित टैब हटाएं?","ลบแท็บที่เลือก?"}, | |
| AdditionalTitle = {"Delete","Elimina","Xóa","Excluir","Hapus","Удалить","Löschen","Eliminar","Supprimer","删除","削除","حذف","हटाएं","ลบ"}, | |
| Style = "confirm", | |
| Callback = function(res: boolean) | |
| if not res then return end | |
| local tabs = framework.dependencies.editortabs | |
| local tab = tabs:GetSelection() | |
| if tab then tab:Delete(true) end | |
| end | |
| }) | |
| end) | |
| }, ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://80286816747552", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.6, .6), | |
| BackgroundTransparency = 1 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.25, 0) | |
| }), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddInstance("ScrollingFrame", { | |
| Id = "TabsList", | |
| ScrollingDirection = Enum.ScrollingDirection.Y, | |
| AutomaticCanvasSize = Enum.AutomaticSize.Y, | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Position = UDim2.fromScale(.5, .375), | |
| CanvasSize = UDim2.fromScale(0, 0), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| Size = UDim2.fromScale(.85, .45), | |
| BackgroundTransparency = 1, | |
| ScrollBarThickness = 0 | |
| }, ui:AddInstance("UIListLayout", { | |
| Id = "TabsLayout", | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| VerticalAlignment = Enum.VerticalAlignment.Top, | |
| FillDirection = Enum.FillDirection.Vertical, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| Padding = UDim.new(.025, 0) | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.1, 0) | |
| })), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.1, 0) | |
| }), ui:AddInstance("Frame", { | |
| Id = "CategoryButtons", | |
| Position = UDim2.fromScale(.5, .955), | |
| AnchorPoint = Vector2.new(.5, 1), | |
| Size = UDim2.fromScale(.85, .1), | |
| BackgroundTransparency = 1, | |
| ClipsDescendants = true | |
| }, ui:AddInstance("UIListLayout", { | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| HorizontalFlex = Enum.UIFlexAlignment.SpaceBetween, | |
| VerticalAlignment = Enum.VerticalAlignment.Center, | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| Padding = UDim.new(0, 0) | |
| }), ui:AddComponent("CategoryButton", { | |
| LongTitle = {"Files","Files","Tệp tin","Arquivos","Berkas","Файлы","Dateien","Archivos","Fichiers","文件","ファイル","ملفات","फ़ाइलें","ไฟล์"}, | |
| Title = {"Files","Files","Tệp","Arq","Ber","Фай","Dat","Arc","Fic","文","ファ","ملف","फ़ा","ไฟ"}, | |
| BackgroundColor3 = Color3.fromHex("#58B2FF"), | |
| Image = "rbxassetid://93716878735644", | |
| Selected = true, | |
| Callback = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("CategoryBtn_Files").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local tabs = framework.dependencies.editortabs | |
| utils.tabsMode = "files" | |
| for _, tab in ipairs(tabs:GetTabs()) do | |
| tab:GetData().instance.instance.Visible = true | |
| end | |
| framework.dependencies.editortabs:GetSaved("tabs") | |
| end) | |
| }), ui:AddComponent("CategoryButton", { | |
| LongTitle = {"Favourites","Preferiti","Yêu thích","Favoritos","Favorit","Избранное","Favoriten","Favoritos","Favoris","收藏夹","お気に入り","المفضلة","पसंदीदा","รายการโปรด"}, | |
| Title = {"Favs","Prefs","Yêu","Fav","Fav","Изб","Fav","Fav","Fav","喜好","おき","مفض","पस","โปร"}, | |
| BackgroundColor3 = Color3.fromHex("#FDC41B"), | |
| Image = "rbxassetid://80350699155696", | |
| LayoutOrder = 1, | |
| Callback = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("CategoryBtn_Favs").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local tabs = framework.dependencies.editortabs | |
| utils.tabsMode = "favourite" | |
| for _, tab in ipairs(tabs:GetTabs()) do | |
| local state = tab:GetProperty("favourite") and true or false | |
| tab:GetData().instance.instance.Visible = state | |
| end | |
| framework.dependencies.editortabs:GetSavedByProperties({ | |
| favourite = {true} | |
| }, "tabs") | |
| end) | |
| }), ui:AddComponent("CategoryButton", { | |
| LongTitle = {"Auto-Execute","Auto-Esecuzione","Tự động thực thi","Auto-executar","Eksekusi Otomatis","Автовыполнение","Automatische Ausführung","Ejecución automática","Exécution automatique","自动执行","自動実行","التنفيذ التلقائي","स्वचालित निष्पादन","เรียกใช้โดยอัตโนมัติ"}, | |
| Title = {"Auto","Auto","Tự","Aut","Oto","Авт","Auto","Auto","Auto","自","自","تلق","स्व","อัต"}, | |
| BackgroundColor3 = Color3.fromHex("#1EC997"), | |
| Image = "rbxassetid://100628992603432", | |
| LayoutOrder = 2, | |
| Callback = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("CategoryBtn_Auto").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| local tabs = framework.dependencies.editortabs | |
| utils.tabsMode = "autoexecute" | |
| for _, tab in ipairs(tabs:GetTabs()) do | |
| local state = tab:GetProperty("autoexecute") and true or false | |
| tab:GetData().instance.instance.Visible = state | |
| end | |
| framework.dependencies.editortabs:GetSavedByProperties({ | |
| autoexecute = {true} | |
| }, "tabs") | |
| end) | |
| })))) | |
| }, | |
| { Name = "ScriptHub", Icon = "rbxassetid://137348934767807", | |
| Content = ui:AddInstance("Frame", {Id = "ScriptHub"}, | |
| ui:AddInstance("Frame", { | |
| Id = "ScriptsSwitch", | |
| Position = UDim2.fromScale(.08, .065), | |
| Size = UDim2.fromScale(.22, .085), | |
| AnchorPoint = Vector2.new(0, .5), | |
| BackgroundTransparency = .85 | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0), | |
| }), ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(.05, 0), | |
| PaddingRight = UDim.new(.1, 0), | |
| PaddingLeft = UDim.new(.1, 0), | |
| PaddingTop = UDim.new(.05, 0) | |
| }), | |
| ui:AddInstance("TextButton", { | |
| Id = "ScriptsSwitchButton", | |
| Size = UDim2.fromScale(1,1), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Country_Code = {"CloudScripts ☁️","ScriptsCloud ☁️","Kịch bản đám mây ☁️","ScriptsNaNuvem ☁️","Skrip Awan ☁️","Облачные скрипты ☁️","Cloud-Skripte ☁️","ScriptsEnLaNube ☁️","ScriptsCloud ☁️","云端脚本 ☁️","クラウドスクリプト ☁️","السكربتات السحابية ☁️","क्लाउड स्क्रिप्ट्स ☁️","สคริปต์คลาวด์ ☁️"}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Body"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| local searchbox = ui:Get("CloudSearchBox") | |
| if searchbox.loading then return end | |
| local dropdown = ui:Get("ScriptsSwitchDropdown") | |
| dropdown.instance.Visible = not dropdown.instance.Visible | |
| end) | |
| }, ui:AddInstance("UICorner", { CornerRadius = UDim.new(.5,0) })), | |
| ui:AddInstance("Frame", { | |
| Id = "ScriptsSwitchDropdown", | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Position = UDim2.fromScale(0,1), | |
| BackgroundTransparency = 0.2, | |
| Size = UDim2.fromScale(1,3), | |
| Visible = false | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.15,0) | |
| }), ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(.05,0), | |
| PaddingRight = UDim.new(.05,0), | |
| PaddingLeft = UDim.new(.05,0), | |
| PaddingTop = UDim.new(.05,0) | |
| }), ui:AddInstance("UIListLayout", { | |
| FillDirection = Enum.FillDirection.Vertical, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| Padding = UDim.new(0,4) | |
| }), | |
| -- CloudScripts ☁️ | |
| ui:AddInstance("TextButton", { | |
| Id = "OptionCloudScripts", | |
| Size = UDim2.fromScale(1, .33), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| LayoutOrder = 1, | |
| ZIndex = 11, | |
| Tags = {"Country_Code", "Colors_Text_Primary","Fonts_Body"}, | |
| Country_Code = {"CloudScripts ☁️","ScriptsCloud ☁️","Kịch bản đám mây ☁️","ScriptsNaNuvem ☁️","Skrip Awan ☁️","Облачные скрипты ☁️","Cloud-Skripte ☁️","ScriptsEnLaNube ☁️","ScriptsCloud ☁️","云端脚本 ☁️","クラウドスクリプト ☁️","السكربتات السحابية ☁️","क्लाउड स्क्रिप्ट्स ☁️","สคริปต์คลาวด์ ☁️"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| local searchbox = ui:Get("CloudSearchBox") | |
| if searchbox.loading then return end | |
| ui:Get("ScriptsSwitchButton").instance.Text = utils:Translate({"CloudScripts ☁️","ScriptsCloud ☁️","Kịch bản đám mây ☁️","ScriptsNaNuvem ☁️","Skrip Awan ☁️","Облачные скрипты ☁️","Cloud-Skripte ☁️","ScriptsEnLaNube ☁️","ScriptsCloud ☁️","云端脚本 ☁️","クラウドスクリプト ☁️","السكربتات السحابية ☁️","क्लाउड स्क्रिप्ट्स ☁️","สคริปต์คลาวด์ ☁️"}) | |
| ui:Get("ScriptsSwitchDropdown").instance.Visible = false | |
| local headerText, gridSubtitle = ui:Get("ScriptHubHeader"), ui:Get("GridSubtitle") | |
| local barFilter, gridFilter = ui:Get("BarFilter"), ui:Get("GridFilter") | |
| local scriptBloxText, scriptBloxLogo = ui:Get("PoweredByText"), ui:Get("ScriptBloxLogo") | |
| local newScript, newFolder = ui:Get("NewScriptButton"), ui:Get("NewFolderButton") | |
| local backPath, nextPath, pathBar = ui:Get("BackPathButton"), ui:Get("NextPathButton"), ui:Get("PathBar") | |
| local scriptsgrid, scriptslist = ui:Get("ScriptsGrid"), ui:Get("CloudBestScriptsBar") | |
| headerText.instance.Text = utils:Translate({"Best Scripts","Migliori Scripts","Các kịch bản tốt nhất","Melhores scripts","Skrip Terbaik","Лучшие скрипты","Beste Skripte","Mejores scripts","Meilleurs scripts","最佳脚本","最高のスクリプト","أفضل السكربتات","सर्वश्रेष्ठ स्क्रिप्ट्स","สคริปต์ที่ดีที่สุด"}) | |
| searchbox.mode = "cloudscripts" | |
| gridSubtitle.instance.Text = utils:Translate({"Explore categories","Esplora categorie","Khám phá các danh mục","Explorar categorias","Jelajahi kategori","Исследуйте категории","Kategorien erkunden","Explorar categorías","Explorer les catégories","浏览类别","カテゴリを探す","استكشف الفئات","श्रेणियों का अन्वेषण करें","สำรวจหมวดหมู่"}) | |
| scriptBloxLogo.instance.Image = framework.protected:ProtectAsset("rbxassetid://96600063364054") | |
| scriptBloxText.instance.TextColor3 = Color3.fromHex("#8C7DFF") | |
| searchbox.instance.Visible = true | |
| --gridText.instance.Visible = true | |
| barFilter.instance.Visible = true | |
| gridFilter.instance.Visible = true | |
| scriptBloxText.instance.Visible = true | |
| scriptBloxLogo.instance.Visible = true | |
| newScript.instance.Visible = false | |
| newFolder.instance.Visible = false | |
| backPath.instance.Visible = false | |
| nextPath.instance.Visible = false | |
| pathBar.instance.Visible = false | |
| local cloudscripts = framework.dependencies.cloudscripts | |
| local query = scriptsgrid.lastQuery | |
| ui:Get("CloudBestScriptsBar"):ClearScripts() | |
| for _, v in ipairs(ui:Get("ScriptsGrid").instance:GetChildren()) do | |
| if not v:IsA("UIGridLayout") then v:Destroy() end | |
| end | |
| if query then query:Refresh() else cloudscripts:FetchFavourites("grid") end | |
| query = scriptslist.lastQuery | |
| if query then query:Refresh() else cloudscripts:FetchTrending("topbar") end | |
| end) | |
| }), | |
| -- ServerSide 🌐 | |
| ui:AddInstance("TextButton", { | |
| Id = "OptionServerSide", | |
| Size = UDim2.fromScale(1, .33), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| LayoutOrder = 2, | |
| ZIndex = 11, | |
| Tags = {"Country_Code", "Colors_Text_Primary","Fonts_Body"}, | |
| Country_Code = {"Server Side 🌐","Lato Server 🌐","Phía máy chủ 🌐","Lado do Servidor 🌐","Sisi Server 🌐","Серверная сторона 🌐","Serverseitig 🌐","Lado del Servidor 🌐","Côté Serveur 🌐","服务器端 🌐","サーバー側 🌐","جانب الخادم 🌐","सर्वर साइड 🌐","ฝั่งเซิร์ฟเวอร์ 🌐"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| local searchbox = ui:Get("CloudSearchBox") | |
| if searchbox.loading then return end | |
| ui:Get("ScriptsSwitchButton").instance.Text = utils:Translate({"Server Side 🌐","Lato Server 🌐","Phía máy chủ 🌐","Lado do Servidor 🌐","Sisi Server 🌐","Серверная сторона 🌐","Serverseitig 🌐","Lado del Servidor 🌐","Côté Serveur 🌐","服务器端 🌐","サーバー側 🌐","جانب الخادم 🌐","सर्वर साइड 🌐","ฝั่งเซิร์ฟเวอร์ 🌐"}) | |
| ui:Get("ScriptsSwitchDropdown").instance.Visible = false | |
| local headerText, gridSubtitle = ui:Get("ScriptHubHeader"), ui:Get("GridSubtitle") | |
| local scriptBloxText, scriptBloxLogo = ui:Get("PoweredByText"), ui:Get("ScriptBloxLogo") | |
| local newScript, newFolder = ui:Get("NewScriptButton"), ui:Get("NewFolderButton") | |
| local barFilter, gridFilter = ui:Get("BarFilter"), ui:Get("GridFilter") | |
| local backPath, nextPath, pathBar = ui:Get("BackPathButton"), ui:Get("NextPathButton"), ui:Get("PathBar") | |
| headerText.instance.Text = utils:Translate({"Server Side","Lato Server","Phía máy chủ","Lado do Servidor","Sisi Server","Серверная сторона","Serverseitig","Lado del Servidor","Côté Serveur","服务器端","サーバー側","جانب الخادم","सर्वर साइड","ฝั่งเซิร์ฟเวอร์"}) | |
| searchbox.mode = "serverside" | |
| gridSubtitle.instance.Text = utils:Translate({"Explore serversided games","Esplora i giochi lato server","Khám phá các trò chơi phía máy chủ","Explore jogos do lado do servidor","Jelajahi game sisi server","Исследуйте серверные игры","Erkunde serverseitige Spiele","Explora juegos del lado del servidor","Explorez les jeux côté serveur","探索服务器端游戏","サーバー側のゲームを探す","استكشف الألعاب الجانبية للخادم","सर्वर साइड गेम्स का अन्वेषण करें","สำรวจเกมฝั่งเซิร์ฟเวอร์"}) | |
| scriptBloxLogo.instance.Image = framework.protected:ProtectAsset("rbxassetid://96326191043043") | |
| scriptBloxText.instance.TextColor3 = Color3.fromRGB(220,220,220) | |
| scriptBloxText.instance.Visible = true | |
| scriptBloxLogo.instance.Visible = true | |
| gridFilter.instance.Visible = false | |
| searchbox.instance.Visible = false | |
| newScript.instance.Visible = false | |
| newFolder.instance.Visible = false | |
| barFilter.instance.Visible = false | |
| backPath.instance.Visible = false | |
| nextPath.instance.Visible = false | |
| pathBar.instance.Visible = false | |
| framework.dependencies.serverside:GetGames(1) | |
| end) | |
| }), | |
| -- LocalScripts 📂 | |
| ui:AddInstance("TextButton", { | |
| Id = "OptionLocalScripts", | |
| Size = UDim2.fromScale(1, .33), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| LayoutOrder = 3, | |
| ZIndex = 11, | |
| Tags = {"Country_Code", "Colors_Text_Primary","Fonts_Body"}, | |
| Country_Code = {"LocalScripts 📂","ScriptLocali 📂","Kịch bản cục bộ 📂","ScriptsLocais 📂","Skrip Lokal 📂","Локальные скрипты 📂","Lokale Skripte 📂","ScriptsLocales 📂","ScriptsLocaux 📂","本地脚本 📂","ローカルスクリプト 📂","السكربتات المحلية 📂","स्थानीय स्क्रिप्ट्स 📂","สคริปต์ท้องถิ่น 📂"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| local searchbox = ui:Get("CloudSearchBox") | |
| if searchbox.loading then return end | |
| ui:Get("ScriptsSwitchButton").instance.Text = utils:Translate({"LocalScripts 📂","ScriptLocali 📂","Kịch bản cục bộ 📂","ScriptsLocais 📂","Skrip Lokal 📂","Локальные скрипты 📂","Lokale Skripte 📂","ScriptsLocales 📂","ScriptsLocaux 📂","本地脚本 📂","ローカルスクリプト 📂","السكربتات المحلية 📂","स्थानीय स्क्रिप्ट्स 📂","สคริปต์ท้องถิ่น 📂"}) | |
| ui:Get("ScriptsSwitchDropdown").instance.Visible = false | |
| local headerText, gridSubtitle = ui:Get("ScriptHubHeader"), ui:Get("GridSubtitle") | |
| local barFilter, gridFilter = ui:Get("BarFilter"), ui:Get("GridFilter") | |
| local scriptBloxText, scriptBloxLogo = ui:Get("PoweredByText"), ui:Get("ScriptBloxLogo") | |
| local newScript, newFolder = ui:Get("NewScriptButton"), ui:Get("NewFolderButton") | |
| local backPath, nextPath, pathBar = ui:Get("BackPathButton"), ui:Get("NextPathButton"), ui:Get("PathBar") | |
| headerText.instance.Text = utils:Translate({"Favourite Scripts","Script Preferiti","Các kịch bản yêu thích","Scripts favoritos","Skrip Favorit","Любимые скрипты","Lieblingsskripte","Scripts favoritos","Scripts favoris","最喜欢的脚本","お気に入りのスクリプト","السكربتات المفضلة","पसंदीदा स्क्रिप्ट्स","สคริปต์ที่ชื่นชอบ"}) | |
| searchbox.mode = "scripthub" | |
| gridSubtitle.instance.Text = utils:Translate({"Explore your saved scripts","Esplora i tuoi script salvati","Khám phá các kịch bản đã lưu của bạn","Explore seus scripts salvos","Jelajahi skrip yang Anda simpan","Исследуйте свои сохраненные скрипты","Erkunde deine gespeicherten Skripte","Explora tus scripts guardados","Explorez vos scripts enregistrés","浏览您保存的脚本","保存したスクリプトを探す","استكشف السكربتات المحفوظة الخاصة بك","अपने सहेजे गए स्क्रिप्ट्स का अन्वेषण करें","สำรวจสคริปต์ที่คุณบันทึกไว้"}) | |
| barFilter.instance.Visible = false | |
| gridFilter.instance.Visible = false | |
| scriptBloxText.instance.Visible = false | |
| scriptBloxLogo.instance.Visible = false | |
| newScript.instance.Visible = true | |
| newFolder.instance.Visible = true | |
| backPath.instance.Visible = true | |
| nextPath.instance.Visible = true | |
| pathBar.instance.Visible = true | |
| framework.dependencies.scripthub:Browse(nil, true, "scripthub") | |
| end) | |
| }))), ui:AddInstance("ScrollingFrame", { | |
| Id = "ScriptHubScroll", | |
| ScrollingDirection = Enum.ScrollingDirection.Y, | |
| AutomaticCanvasSize = Enum.AutomaticSize.Y, | |
| Position = UDim2.fromScale(0, .14), | |
| CanvasSize = UDim2.fromScale(0, 1.2), | |
| Size = UDim2.fromScale(1, .835), | |
| ScrollBarThickness = padding/3, | |
| BackgroundTransparency = 1, | |
| ClipsDescendants = true, | |
| BorderSizePixel = 0, | |
| ZIndex = -1, | |
| Colors_Primary = {"ScrollBarImageColor3"}, | |
| Tags = {"Colors_Primary"} | |
| }, | |
| --ui:AddInstance("UIListLayout", { | |
| -- Id = "ScriptHubLayout", | |
| -- HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| -- VerticalAlignment = Enum.VerticalAlignment.Top, | |
| -- FillDirection = Enum.FillDirection.Vertical, | |
| -- SortOrder = Enum.SortOrder.LayoutOrder, | |
| -- Padding = UDim.new(0, 0) | |
| -- }), | |
| ui:AddInstance("Frame", { | |
| AutomaticSize = Enum.AutomaticSize.Y, | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIPadding",{ | |
| PaddingBottom = UDim.new(.15, 0), | |
| PaddingRight = UDim.new(.03, 0), | |
| PaddingLeft = UDim.new(.03, 0), | |
| PaddingTop = UDim.new(0, 0) | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "ScriptHubHeader", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(0, .05), | |
| Size = UDim2.fromScale(.3, .08), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Black"}, | |
| Country_Code = {"Best Scripts","Migliori Scripts","Các kịch bản tốt nhất","Melhores scripts","Skrip Terbaik","Лучшие скрипты","Beste Skripte","Mejores scripts","Meilleurs scripts","最佳脚本","最高のスクリプト","أفضل السكربتات","सर्वश्रेष्ठ स्क्रिप्ट्स","สคริปต์ที่ดีที่สุด"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(0, 0), | |
| Size = UDim2.fromScale(.3, .045), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Description"}, | |
| Country_Code = {"Let's explore","Esploriamo","Hãy khám phá","Vamos explorar","Mari jelajahi","Давайте исследовать","Lass uns erkunden","Vamos explorar","Explorons","让我们探索","探検しましょう","دعونا نستكشف","चलो अन्वेषण करें","มาสำรวจกัน"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddComponent("FilterSelector", { | |
| Id = "BarFilter", | |
| HorizontalAlignment = Enum.HorizontalAlignment.Left, | |
| Position = UDim2.fromScale(0, .15), | |
| Size = UDim2.fromScale(.5, .1), | |
| Filters = { | |
| { | |
| Title = {"Popular","Popolari","Phổ biến","Populares","Populer","Популярные","Beliebt","Populares","Populaire","流行","人気","شائع","लोकप्रिय","ที่นิยม"}, | |
| Callback = framework.protected:GCProtect(function() | |
| local scriptslist, searchbox = ui:Get("CloudBestScriptsBar"), ui:Get("CloudSearchBox") | |
| local cloudscripts = framework.dependencies.cloudscripts | |
| searchbox.mode = "cloudscripts" | |
| local query = cloudscripts.newQuery(searchbox.instance.Text, { | |
| verify = framework.enums.ScriptBloxVerify.Verified, | |
| patch = framework.enums.ScriptBloxPatch.Unpatched, | |
| search = framework.enums.ScriptBloxSearch.None, | |
| sortBy = framework.enums.ScriptBloxSort.Views, | |
| order = framework.enums.ScriptBloxOrder.Desc, | |
| type = framework.enums.ScriptBloxType.None, | |
| auth = framework.enums.ScriptBloxAuth.None, | |
| mode = framework.enums.ScriptBloxMode.Free | |
| }, "topbar") | |
| scriptslist.lastQuery = query | |
| query:Fetch() | |
| end) | |
| }, | |
| { | |
| Title = {"Newest","Nuovi","Mới nhất","Mais recentes","Terbaru","Новейшие","Neueste","Más recientes","Plus récents","最新","最新","الأحدث","नवीनतम","ใหม่ล่าสุด"}, | |
| Callback = framework.protected:GCProtect(function() | |
| local scriptslist, searchbox = ui:Get("CloudBestScriptsBar"), ui:Get("CloudSearchBox") | |
| local cloudscripts = framework.dependencies.cloudscripts | |
| searchbox.mode = "cloudscripts" | |
| local query = cloudscripts.newQuery(searchbox.instance.Text, { | |
| verify = framework.enums.ScriptBloxVerify.Verified, | |
| patch = framework.enums.ScriptBloxPatch.Unpatched, | |
| sortBy = framework.enums.ScriptBloxSort.CreatedAt, | |
| search = framework.enums.ScriptBloxSearch.None, | |
| order = framework.enums.ScriptBloxOrder.Desc, | |
| type = framework.enums.ScriptBloxType.None, | |
| auth = framework.enums.ScriptBloxAuth.None, | |
| mode = framework.enums.ScriptBloxMode.Free | |
| }, "topbar") | |
| scriptslist.lastQuery = query | |
| query:Fetch() | |
| end) | |
| }, | |
| { | |
| Title = {"Trending","Evidenza","Xu hướng","Tendências","Sedang Tren","Популярное","Trend","Tendencias","Tendance","流行","トレンド","شائع","रुझान","แนวโน้ม"}, | |
| Callback = framework.protected:GCProtect(function() | |
| local scriptslist, searchbox = ui:Get("CloudBestScriptsBar"), ui:Get("CloudSearchBox") | |
| local cloudscripts = framework.dependencies.cloudscripts | |
| searchbox.mode = "cloudscripts" | |
| scriptslist.lastQuery = nil | |
| cloudscripts:FetchTrending("topbar") | |
| end) | |
| } | |
| } | |
| }), ui:AddInstance("ImageLabel", { | |
| Id = "ScriptBloxLogo", | |
| Image = "rbxassetid://96600063364054", | |
| Position = UDim2.fromScale(1, 0), | |
| Size = UDim2.fromScale(.15, .15), | |
| AnchorPoint = Vector2.new(1, 0), | |
| ScaleType = Enum.ScaleType.Fit, | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 2.098 | |
| })), ui:AddInstance("TextLabel", { | |
| Id = "PoweredByText", | |
| TextYAlignment = Enum.TextYAlignment.Center, | |
| TextXAlignment = Enum.TextXAlignment.Right, | |
| TextColor3 = Color3.fromHex("#8C7DFF"), | |
| Position = UDim2.fromScale(.85, .075), | |
| AnchorPoint = Vector2.new(1, .5), | |
| Size = UDim2.fromScale(.13, .1), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Country_Code = {"Powered by:", "Fornito da:", "Cung cấp bởi:", "Desenvolvido por:", "Didukung oleh:", "Работает на:", "Bereitgestellt von:", "Desarrollado por:", "Propulsé par:", "提供支持:", "提供:", "بدعم من:", "के द्वारा संचालित:", "ขับเคลื่อนโดย:"}, | |
| Tags = {"Country_Code", "Fonts_Heading"} | |
| }), ui:AddInstance("Frame", | |
| { | |
| AutomaticSize = Enum.AutomaticSize.X, | |
| Position = UDim2.fromScale(1, .025), | |
| Size = UDim2.fromScale(0.5, .11), | |
| AnchorPoint = Vector2.new(1, 0), | |
| BackgroundTransparency = 1, | |
| }, ui:AddInstance("UIListLayout", { | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| VerticalAlignment = Enum.VerticalAlignment.Center, | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| HorizontalFlex = Enum.UIFlexAlignment.SpaceEvenly, | |
| VerticalFlex = Enum.UIFlexAlignment.Fill | |
| }), ui:AddInstance("TextButton", { | |
| Id = "NewScriptButton", | |
| BackgroundColor3 = Color3.fromHex("#2B5780"), | |
| AutomaticSize = Enum.AutomaticSize.X, | |
| Position = UDim2.fromScale(1, .025), | |
| Size = UDim2.fromScale(0, .11), | |
| AnchorPoint = Vector2.new(1, 0), | |
| BackgroundTransparency = .5, | |
| Visible = false, | |
| Text = "", | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("NewScriptButton").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| utils:ShowToast("InputToast", { | |
| PlaceholderText = {"Script name","Nome script","Tên kịch bản","Nome do script","Nama skrip","Имя скрипта","Skriptname","Nombre del script","Nom du script","脚本名称","スクリプト名","اسم البرنامج النصي","स्क्रिप्ट का नाम","ชื่อสคริปต์"}, | |
| AdditionalText = {"Create script","Creazione script","Tạo kịch bản","Criar script","Buat skrip","Создать сценарий","Skript erstellen","Crear script","Créer un script","创建脚本","スクリプトを作成","إنشاء نص","स्क्रिप्ट बनाएं","สร้างสคริปต์"}, | |
| Callback = function(res: any) | |
| res = framework.utils.strings.gsub(res or "", ".lua", "") | |
| res = framework.utils.strings.gsub(res or "", "[./]", "") | |
| if res == "" then return end | |
| local scripthub = framework.dependencies.scripthub | |
| scripthub:NewFile(res, "", nil, nil, nil, nil, true) | |
| scripthub:Browse(nil, true, "scripthub") | |
| end | |
| }) | |
| end) | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingLeft = UDim.new(.075, 0) | |
| }), ui:AddInstance("UIListLayout", { | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| VerticalAlignment = Enum.VerticalAlignment.Center, | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| HorizontalFlex = Enum.UIFlexAlignment.SpaceEvenly | |
| }), ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://112476312219988", | |
| Position = UDim2.fromScale(.1, .5), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.6, .6), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddInstance("TextLabel", { | |
| Position = UDim2.fromScale(.625, .5), | |
| AutomaticSize = Enum.AutomaticSize.X, | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(0, .55), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Body"}, | |
| Country_Code = {"New script", "Nuovo script", "Kịch bản mới", "Novo script", "Skrip baru", "Новый сценарий", "Neues Skript", "Nuevo script", "Nouveau script", "新脚本", "新しいスクリプト", "نص جديد", "नया स्क्रिप्ट", "สคริปต์ใหม่"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.35, 0) | |
| })), ui:AddInstance("TextButton", { | |
| Id = "NewFolderButton", | |
| BackgroundColor3 = Color3.fromHex("#FDC41B"), | |
| Position = UDim2.fromScale(.71, .025), | |
| AutomaticSize = Enum.AutomaticSize.X, | |
| Size = UDim2.fromScale(0, .11), | |
| AnchorPoint = Vector2.new(1, 0), | |
| BackgroundTransparency = .6, | |
| Visible = false, | |
| Text = "", | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:AnimateCascade(ui:Get("NewFolderButton").instance, { | |
| AnimateSelf = true, | |
| SkipTransparency = true | |
| }) | |
| utils:ShowToast("InputToast", { | |
| PlaceholderText = {"Folder name","Nome cartella","Tên thư mục","Nome da pasta","Nama folder","Имя папки","Ordnername","Nombre de carpeta","Nom du dossier","文件夹名称","フォルダー名","اسم المجلد","फ़ोल्डर का नाम","ชื่อโฟลเดอร์"}, | |
| AdditionalText = {"Create Folder","Creazione Cartella","Tạo thư mục","Criar pasta","Buat folder","Создать папку","Ordner erstellen","Crear carpeta","Créer un dossier","创建文件夹","フォルダーを作成","إنشاء مجلد","फ़ोल्डर बनाएँ","สร้างโฟลเดอร์"}, | |
| Callback = function(res: any) | |
| res = framework.utils.strings.gsub(res or "", "[./]", "") | |
| if res == "" then return end | |
| local scripthub = framework.dependencies.scripthub | |
| scripthub:NewFolder(res, nil, true) | |
| scripthub:Browse(nil, true, "scripthub") | |
| end | |
| }) | |
| end) | |
| }, ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://112476312219988", | |
| Position = UDim2.fromScale(.1, .5), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.6, .6), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddInstance("TextLabel", { | |
| Position = UDim2.fromScale(.625, .5), | |
| AutomaticSize = Enum.AutomaticSize.X, | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(0, .55), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Body"}, | |
| Country_Code = {"New folder","Nuova cartella","Thư mục mới","Nova pasta","Folder baru","Новая папка","Neuer Ordner","Nueva carpeta","Nouveau dossier","新建文件夹","新しいフォルダー","مجلد جديد","नया फ़ोल्डर","โฟลเดอร์ใหม่"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.35, 0) | |
| }), ui:AddInstance("UIPadding", { | |
| PaddingLeft = UDim.new(.075, 0) | |
| }), ui:AddInstance("UIListLayout", { | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| VerticalAlignment = Enum.VerticalAlignment.Center, | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| HorizontalFlex = Enum.UIFlexAlignment.SpaceEvenly | |
| }))), ui:AddInstance("TextBox", { | |
| Id = "CloudSearchBox", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(1, .175), | |
| Size = UDim2.fromScale(.25, .095), | |
| AnchorPoint = Vector2.new(1, 0), | |
| BackgroundTransparency = .5, | |
| ClearTextOnFocus = false, | |
| TextScaled = true, | |
| Text = "", | |
| FocusLost = framework.protected:GCProtect(function() | |
| local searchbox = ui:Get("CloudSearchBox") | |
| local keywords = searchbox.instance.Text | |
| if utils.cloudKeyword == keywords then return end | |
| utils.cloudKeyword = keywords | |
| --searchbox.mode = "scripthub" | |
| if searchbox.mode == "scripthub" then | |
| local scripthub = framework.dependencies.scripthub | |
| return scripthub:Search(keywords, nil, "scripthub") | |
| end | |
| local scriptsgrid, scriptslist = ui:Get("ScriptsGrid"), ui:Get("CloudBestScriptsBar") | |
| local cloudscripts = framework.dependencies.cloudscripts | |
| local query = scriptsgrid.lastQuery | |
| if query then | |
| query = cloudscripts.newQuery(keywords, query:GetFilters(), "grid") | |
| scriptsgrid.lastQuery = query | |
| query:Fetch() | |
| end | |
| query = scriptslist.lastQuery | |
| if query then | |
| query = cloudscripts.newQuery(keywords, query:GetFilters(), "topbar") | |
| scriptslist.lastQuery = query | |
| query:Fetch() | |
| end | |
| end), | |
| Tags = {"Country_Code", "Colors_Secondary", "Colors_Text_Primary", "Fonts_Heading"}, | |
| Country_Code_Placeholder = {"Search...", "Cerca...", "Tìm kiếm...", "Pesquisar...", "Cari...", "Поиск...", "Suchen...", "Buscar...", "Rechercher...", "搜索...", "検索...", "بحث...", "खोजें...", "ค้นหา..."}, | |
| Colors_Secondary = {"BackgroundColor3"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }), ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(.25,0), | |
| PaddingRight = UDim.new(.05, 0), | |
| PaddingLeft = UDim.new(.075, 0), | |
| PaddingTop = UDim.new(.25, 0) | |
| })), ui:AddComponent("ContentBar", { | |
| Id = "CloudBestScriptsBar", | |
| Position = UDim2.fromScale(.5, .3), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| Size = UDim2.fromScale(.85, .5), | |
| OnLoad = framework.protected:GCProtect(function() | |
| local searchbox = ui:Get("CloudSearchBox") | |
| if searchbox.mode == "scripthub" or searchbox.loading then return end | |
| local scriptslist = ui:Get("CloudBestScriptsBar") | |
| local query = scriptslist.lastQuery | |
| if query then query:Fetch() end | |
| end) | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "GridFilterText", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(0, .9), | |
| Size = UDim2.fromScale(.3, .08), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Colors_Text_Primary", "Fonts_Black"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "GridSubtitle", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(0, .85), | |
| Size = UDim2.fromScale(.3, .045), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Description"}, | |
| Country_Code = {"Explore categories","Esplora categorie","Khám phá danh mục","Explorar categorias","Jelajahi kategori","Изучить категории","Kategorien erkunden","Explorar categorías","Explorer les catégories","探索类别","カテゴリを探索","استكشاف الفئات","श्रेणियों का अन्वेषण करें","สำรวจหมวดหมู่"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddComponent("FilterSelector", { | |
| Id = "GridFilter", | |
| HorizontalAlignment = Enum.HorizontalAlignment.Right, | |
| Position = UDim2.fromScale(1, .89), | |
| AnchorPoint = Vector2.new(1, 0), | |
| Size = UDim2.fromScale(.5, .1), | |
| Filters = { | |
| { | |
| Title = {"All","Tutti","Tất cả","Todos","Semua","Все","Alle","Todos","Tous","全部","すべて","الكل","सभी","ทั้งหมด"}, | |
| Callback = framework.protected:GCProtect(function(filter: string) | |
| local scriptsgrid, searchbox = ui:Get("ScriptsGrid"), ui:Get("CloudSearchBox") | |
| local cloudscripts = framework.dependencies.cloudscripts | |
| ui:Get("GridFilterText").instance.Text = filter | |
| searchbox.mode = "cloudscripts" | |
| local query = cloudscripts.newQuery(searchbox.instance.Text, { | |
| patch = framework.enums.ScriptBloxPatch.Unpatched, | |
| search = framework.enums.ScriptBloxSearch.None, | |
| verify = framework.enums.ScriptBloxVerify.None, | |
| sortBy = framework.enums.ScriptBloxSort.Views, | |
| order = framework.enums.ScriptBloxOrder.None, | |
| type = framework.enums.ScriptBloxType.None, | |
| auth = framework.enums.ScriptBloxAuth.None, | |
| mode = framework.enums.ScriptBloxMode.None | |
| }, "grid") | |
| scriptsgrid.lastQuery = query | |
| query:Fetch() | |
| end) | |
| }, | |
| { | |
| Title = {"Verified","Verificati","Đã xác minh","Verificado","Terverifikasi","Проверено","Verifiziert","Verificado","Vérifié","已验证","確認済み","تم التحقق","सत्यापित","ได้รับการยืนยัน"}, | |
| Callback = framework.protected:GCProtect(function(filter: string) | |
| local scriptsgrid, searchbox = ui:Get("ScriptsGrid"), ui:Get("CloudSearchBox") | |
| local cloudscripts = framework.dependencies.cloudscripts | |
| ui:Get("GridFilterText").instance.Text = filter | |
| searchbox.mode = "cloudscripts" | |
| local query = cloudscripts.newQuery(searchbox.instance.Text, { | |
| verify = framework.enums.ScriptBloxVerify.Verified, | |
| patch = framework.enums.ScriptBloxPatch.Unpatched, | |
| search = framework.enums.ScriptBloxSearch.None, | |
| sortBy = framework.enums.ScriptBloxSort.Views, | |
| order = framework.enums.ScriptBloxOrder.None, | |
| type = framework.enums.ScriptBloxType.None, | |
| auth = framework.enums.ScriptBloxAuth.None, | |
| mode = framework.enums.ScriptBloxMode.None | |
| }, "grid") | |
| scriptsgrid.lastQuery = query | |
| query:Fetch() | |
| end) | |
| }, | |
| { | |
| Title = {"Suggested","Consigliati","Được đề xuất","Sugeridos","Disarankan","Рекомендуемые","Vorgeschlagen","Sugeridos","Suggérés","推荐","おすすめ","مقترح","अनुशंसित","แนะนำ"}, | |
| Callback = framework.protected:GCProtect(function(filter: string) | |
| local scriptsgrid, searchbox = ui:Get("ScriptsGrid"), ui:Get("CloudSearchBox") | |
| local cloudscripts = framework.dependencies.cloudscripts | |
| ui:Get("GridFilterText").instance.Text = filter | |
| searchbox.mode = "cloudscripts" | |
| local query = cloudscripts.newQuery(searchbox.instance.Text, { | |
| verify = framework.enums.ScriptBloxVerify.Verified, | |
| patch = framework.enums.ScriptBloxPatch.Unpatched, | |
| search = framework.enums.ScriptBloxSearch.None, | |
| type = framework.enums.ScriptBloxType.Specific, | |
| sortBy = framework.enums.ScriptBloxSort.Views, | |
| order = framework.enums.ScriptBloxOrder.None, | |
| auth = framework.enums.ScriptBloxAuth.None, | |
| mode = framework.enums.ScriptBloxMode.None | |
| }, "grid") | |
| scriptsgrid.lastQuery = query | |
| query:Fetch() | |
| end) | |
| }, | |
| { | |
| Title = {"Favourites","Preferiti","Yêu thích","Favoritos","Favorit","Избранное","Favoriten","Favoritos","Favoris","收藏夹","お気に入り","المفضلة","पसंदीदा","รายการโปรด"}, | |
| Callback = framework.protected:GCProtect(function(filter: string) | |
| local scriptsgrid, searchbox = ui:Get("ScriptsGrid"), ui:Get("CloudSearchBox") | |
| local cloudscripts = framework.dependencies.cloudscripts | |
| ui:Get("GridFilterText").instance.Text = filter | |
| searchbox.mode = "cloudscripts" | |
| scriptsgrid.lastQuery = nil | |
| cloudscripts:FetchFavourites("grid") | |
| end) | |
| } | |
| } | |
| }), ui:AddInstance("TextButton", { | |
| Id = "BackPathButton", | |
| Position = UDim2.fromScale(0, .9), | |
| Size = UDim2.fromScale(.065, .1), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Visible = false, | |
| Text = "‹", | |
| Tags = {"Colors_Text_Primary", "Fonts_Title"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| framework.dependencies.scripthub:BrowsePrevious("scripthub") | |
| end) | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1, | |
| })), ui:AddInstance("TextButton", { | |
| Id = "NextPathButton", | |
| Position = UDim2.fromScale(.05, .9), | |
| Size = UDim2.fromScale(.065, .1), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Visible = false, | |
| Text = "›", | |
| Tags = {"Colors_Text_Primary", "Fonts_Title"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| framework.dependencies.scripthub:BrowseNext("scripthub") | |
| end) | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1, | |
| })), ui:AddComponent("HistorySelector", { | |
| Id = "PathBar", | |
| Position = UDim2.fromScale(1, .89), | |
| Size = UDim2.fromScale(.8, .115), | |
| AnchorPoint = Vector2.new(1, 0), | |
| Visible = false, | |
| Padding = 6 | |
| })), ui:AddInstance("Frame", { | |
| Id = "ScriptsGrid", | |
| Position = UDim2.fromScale(0, .88), | |
| AutomaticSize = Enum.AutomaticSize.Y, | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| ClipsDescendants = false, | |
| LayoutOrder = 1 | |
| }, ui:AddInstance("UIGridLayout", { | |
| Id = "ScriptsGridLayout", | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| CellPadding = UDim2.fromOffset(padding*3, padding*3), -- UDim2.fromScale(.02, 0), | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| CellSize = UDim2.fromScale(.3, 0) -- .3 | |
| })))) | |
| }, | |
| { Name = "ArceusIntelligence", Icon = "rbxassetid://95922875106065", | |
| Content = ui:AddInstance("Frame", {}, | |
| ui:AddInstance("ImageLabel", { | |
| Id = "AITipsPanelBackground", | |
| Position = UDim2.fromScale(.03, .15), | |
| Size = UDim2.fromScale(.55, .58), | |
| BackgroundTransparency = 1, | |
| Colors_Secondary = {"BackgroundColor3"}, | |
| Tags = {"Colors_Secondary"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.1, 0) | |
| }), ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://105134483657581", -- AI Shadow | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Position = UDim2.fromScale(.5, .5), | |
| Size = UDim2.fromScale(1.35,1.4), | |
| BackgroundTransparency = 1, | |
| ZIndex = -1 | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Right, | |
| TextYAlignment = Enum.TextYAlignment.Top, | |
| Position = UDim2.fromScale(.95, .035), | |
| Size = UDim2.fromScale(.45, .055), | |
| AnchorPoint = Vector2.new(1, 0), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| ZIndex = 3, | |
| Country_Code = {"Arceus Intelligence"}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Caption"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "AITipsSubtitle", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.05, .09), | |
| Size = UDim2.fromScale(.9, .065), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Heading"}, | |
| Country_Code = {"ARCY TIPS","SUGGERIMENTI ARCY","MẸO ARCY","DICAS ARCY","TIP ARCY","СОВЕТЫ ARCY","ARCY-TIPPS","CONSEJOS ARCY","ASTUCES ARCY","ARCY 提示","ARCY のヒント","نصائح ARCY","ARCY युक्तियाँ","เคล็ดลับ ARCY"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "AITipsTitle", | |
| Position = UDim2.fromScale(.05, .165), | |
| Size = UDim2.fromScale(.9, .09), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Body"}, | |
| Country_Code = {"Change your language","Cambia lingua","Thay đổi ngôn ngữ","Mudar seu idioma","Ubah bahasa Anda","Изменить язык","Sprache ändern","Cambiar idioma","Changer de langue","更改语言","言語を変更する","غير لغتك","अपनी भाषा बदलें","เปลี่ยนภาษาของคุณ"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "AITipsText", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.05, .275), | |
| Size = UDim2.fromScale(.9, .4), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .35, | |
| TextScaled = true, | |
| Country_Code = {"Arceus Intelligence allows you to translate your interface instantly using AI, ensuring a seamless experience in any language! 🌍✨","Arceus Intelligence ti permette di tradurre immediatamente la tua interfaccia utilizzando l'IA, garantendo un'esperienza fluida in qualsiasi lingua! 🌍✨","Arceus Intelligence cho phép bạn dịch giao diện ngay lập tức bằng AI, đảm bảo trải nghiệm mượt mà trong bất kỳ ngôn ngữ nào! 🌍✨","O Arceus Intelligence permite que você traduza sua interface instantaneamente usando IA, garantindo uma experiência perfeita em qualquer idioma! 🌍✨","Arceus Intelligence memungkinkan Anda menerjemahkan antarmuka secara instan menggunakan AI, memastikan pengalaman yang mulus dalam bahasa apa pun! 🌍✨","Arceus Intelligence позволяет мгновенно переводить интерфейс с помощью ИИ, обеспечивая бесшовный опыт на любом языке! 🌍✨","Arceus Intelligence ermöglicht es Ihnen, Ihre Oberfläche mit KI sofort zu übersetzen und so ein nahtloses Erlebnis in jeder Sprache zu gewährleisten! 🌍✨","Arceus Intelligence te permite traducir tu interfaz al instante usando IA, ¡asegurando una experiencia fluida en cualquier idioma! 🌍✨","Arceus Intelligence vous permet de traduire instantanément votre interface grâce à l'IA, garantissant une expérience fluide dans n'importe quelle langue ! 🌍✨","Arceus Intelligence 让您能够使用 AI 即时翻译界面,确保在任何语言下都能获得无缝体验!🌍✨","Arceus Intelligence を使えば、AI でインターフェースを瞬時に翻訳でき、どの言語でもシームレスな体験が可能になります!🌍✨","تتيح لك Arceus Intelligence ترجمة واجهتك على الفور باستخدام الذكاء الاصطناعي، مما يضمن تجربة سلسة بأي لغة! 🌍✨","Arceus Intelligence आपको AI का उपयोग करके तुरंत आपका इंटरफ़ेस अनुवादित करने की अनुमति देता है, किसी भी भाषा में सहज अनुभव सुनिश्चित करता है! 🌍✨","Arceus Intelligence ช่วยให้คุณแปลอินเทอร์เฟซของคุณได้ทันทีด้วย AI เพื่อให้แน่ใจว่าคุณจะได้รับประสบการณ์ที่ราบรื่นในทุกภาษา! 🌍✨"}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Description"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("ScrollingFrame", { | |
| Id = "LanguagePicker", | |
| ScrollingDirection = Enum.ScrollingDirection.Y, | |
| AutomaticCanvasSize = Enum.AutomaticSize.Y, | |
| BackgroundColor3 = Color3.fromHex("#000"), | |
| Position = UDim2.fromScale(.05, .275), | |
| CanvasSize = UDim2.fromScale(0, 1), | |
| ScrollBarThickness = padding/3, | |
| Size = UDim2.fromScale(.9, .4), | |
| BackgroundTransparency = 1, | |
| ClipsDescendants = true, | |
| BorderSizePixel = 0, | |
| Visible = false, | |
| ZIndex = 10 | |
| }, ui:AddInstance("UIGridLayout", { | |
| CellPadding = UDim2.new(0, padding, 0, padding * 1.5), | |
| HorizontalAlignment = Enum.HorizontalAlignment.Left, | |
| VerticalAlignment = Enum.VerticalAlignment.Top, | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| CellSize = UDim2.new(.475, 0, .3, 0), | |
| FillDirectionMaxCells = 2 | |
| }), framework.protected:GCProtect(function() | |
| local langs = { | |
| { Code = "EN", Gradient = { "#00247D", "#FFFFFF", "#CF142B" }, Label = { | |
| "English","Inglese","Tiếng Anh","Inglês","Inggris","Английский", | |
| "Englisch","Inglés","Anglais","英语","英語","الإنجليزية", | |
| "अंग्रेज़ी","อังกฤษ" | |
| } }, | |
| { Code = "IT", Gradient = { "#008C45", "#F4F5F0", "#CD212A" }, Label = { | |
| "Italian","Italiano","Tiếng Ý","Italiano","Bahasa Italia", | |
| "Итальянский","Italienisch","Italiano","Italien","意大利语", | |
| "イタリア語","الإيطالية","इतालवी","ภาษาอิตาลี" | |
| } }, | |
| { Code = "VI", Gradient = { "#DA251D", "#FFCD00", "#DA251D" }, Label = { | |
| "Vietnamese","Vietnamita","Tiếng Việt","Vietnamita","Bahasa Vietnam", | |
| "Вьетнамский","Vietnamesisch","Vietnamita","Vietnamien","越南语", | |
| "ベトナム語","الفيتنامية","वियतनामी","ภาษาเวียดนาม" | |
| } }, | |
| { Code = "PT", Gradient = { "#006600", "#FF0000", "#FFCC00" }, Label = { | |
| "Portuguese","Portoghese","Tiếng Bồ Đào Nha","Português","Bahasa Portugis", | |
| "Португальский","Portugiesisch","Portugués","Portugais","葡萄牙语", | |
| "ポルトガル語","البرتغالية","पुर्तगाली","ภาษาโปรตุเกส" | |
| } }, | |
| { Code = "ID", Gradient = { "#FF0000", "#FFFFFF", "#FF0000" }, Label = { | |
| "Indonesian","Indonesiano","Tiếng Indonesia","Indonésio","Bahasa Indonesia", | |
| "Индонезийский","Indonesisch","Indonesio","Indonésien","印度尼西亚语", | |
| "インドネシア語","الإندونيسية","इंडोनेशियाई","ภาษาอินโดนีเซีย" | |
| } }, | |
| { Code = "RU", Gradient = { "#FFFFFF", "#0033A0", "#D52B1E" }, Label = { | |
| "Russian","Russo","Tiếng Nga","Russo","Bahasa Rusia","Русский", | |
| "Russisch","Ruso","Russe","俄语","ロシア語","الروسية","रूसी","ภาษารัสเซีย" | |
| } }, | |
| { Code = "DE", Gradient = { "#000000", "#DD0000", "#FFCE00" }, Label = { | |
| "German","Tedesco","Tiếng Đức","Alemão","Bahasa Jerman","Немецкий", | |
| "Deutsch","Alemán","Allemand","德语","ドイツ語","الألمانية","जर्मन","ภาษาเยอรมัน" | |
| } }, | |
| { Code = "ES", Gradient = { "#AA151B", "#F1BF00", "#AA151B" }, Label = { | |
| "Spanish","Spagnolo","Tiếng Tây Ban Nha","Espanhol","Bahasa Spanyol", | |
| "Испанский","Spanisch","Español","Espagnol","西班牙语","スペイン語","الإسبانية", | |
| "स्पेनिश","ภาษาสเปน" | |
| } }, | |
| { Code = "FR", Gradient = { "#0055A4", "#FFFFFF", "#EF4135" }, Label = { | |
| "French","Francese","Tiếng Pháp","Francês","Bahasa Prancis","Французский", | |
| "Französisch","Francés","Français","法语","フランス語","الفرنسية","फ्रांसीसी","ภาษาฝรั่งเศส" | |
| } }, | |
| { Code = "ZH", Gradient = { "#DE2910", "#FFDE00", "#DE2910" }, Label = { | |
| "Chinese","Cinese","Tiếng Trung","Chinês","Bahasa Mandarin","Китайский", | |
| "Chinesisch","Chino","Chinois","中文","中国語","الصينية","चीनी","ภาษาจีน" | |
| } }, | |
| { Code = "JA", Gradient = { "#FFFFFF", "#BC002D", "#FFFFFF" }, Label = { | |
| "Japanese","Giapponese","Tiếng Nhật","Japonês","Bahasa Jepang","Японский", | |
| "Japanisch","Japonés","Japonais","日语","日本語","اليابانية","जापानी","ภาษาญี่ปุ่น" | |
| } }, | |
| { Code = "AR", Gradient = { "#007A3D", "#FFFFFF", "#CE1126" }, Label = { | |
| "Arabic","Arabo","Tiếng Ả Rập","Árabe","Bahasa Arab","Арабский", | |
| "Arabisch","Árabe","Arabe","阿拉伯语","アラビア語","العربية","अरबी","ภาษาอาหรับ" | |
| } }, | |
| { Code = "HI", Gradient = { "#FF9933", "#FFFFFF", "#138808" }, Label = { | |
| "Hindi","Hindi","Tiếng Hin-đi","Hindi","Bahasa Hindi","Хинди", | |
| "Hindi","Hindi","Hindi","印地语","ヒンディー語","الهندية","हिन्दी","ภาษาฮินดี" | |
| } }, | |
| { Code = "TH", Gradient = { "#A51931", "#FFFFFF", "#2D2A4A" }, Label = { | |
| "Thai","Thailandese","Tiếng Thái","Tailandês","Bahasa Thailand","Тайский", | |
| "Thailändisch","Tailandés","Thaï","泰语","タイ語","التايلاندية","थाई","ไทย" | |
| } }, | |
| } | |
| local btns = {} | |
| for _, info in ipairs(langs) do | |
| local gradientColors = info.Gradient or { "#AAAAAA", "#888888", "#666666" } | |
| framework.utils.tables.insert(btns, ui:AddInstance("TextButton", { | |
| Id = `LangBtn_{info.Code}`, | |
| Size = UDim2.fromScale(.4, .07), | |
| BackgroundTransparency = .5, | |
| Country_Code = info.Label, | |
| TextTransparency = .1, | |
| Text = info.Label[1], | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Black"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| local aiBtn = ui:Get("AITipsButton") | |
| aiBtn.CountryCode = info.Code | |
| aiBtn.instance.Text = utils:Translate({`Translate to {info.Code}`,`Traduci in {info.Code}`,`Dịch sang {info.Code}`,`Traduzir para {info.Code}`,`Terjemahkan ke {info.Code}`,`Перевести на {info.Code}`,`Ins {info.Code} übersetzen`,`Traducir a {info.Code}`,`Traduire en {info.Code}`,`翻译为 {info.Code}`,`{info.Code} に翻訳する`,`ترجمة إلى {info.Code}`,`{info.Code} में अनुवाद करें`,`แปลเป็น {info.Code}`}) | |
| aiBtn.instance.BackgroundColor3 = Color3.fromHex("#FFF") | |
| aiBtn.instance.TextTransparency = 0 | |
| aiBtn.instance.Active = true | |
| end) | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingTop = UDim.new(.2, 0), | |
| PaddingBottom = UDim.new(.2, 0) | |
| }), ui:AddInstance("UIGradient", { | |
| Rotation = 30, | |
| Color = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex(gradientColors[1])), | |
| ColorSequenceKeypoint.new(.5, Color3.fromHex(gradientColors[2])), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex(gradientColors[3])), | |
| }) | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.4, 0) | |
| }))) | |
| end | |
| return btns | |
| end)), ui:AddInstance("TextButton", { | |
| Id = "AITipsButton", | |
| Position = UDim2.fromScale(.5, .9), | |
| TextColor3 = Color3.fromHex("#FFF"), | |
| AnchorPoint = Vector2.new(.5, 1), | |
| Size = UDim2.fromScale(.9, .15), | |
| BackgroundTransparency = .75, | |
| TextTransparency = .1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Black"}, | |
| Country_Code = {"Translate","Traduci","Dịch","Traduzir","Terjemahkan","Перевести","Übersetzen","Traducir","Traduire","翻译","翻訳する","ترجم","अनुवाद करें","แปล"}, | |
| -- Colors_Text_Primary = {"TextColor3"} | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| local languagePicker = ui:Get("LanguagePicker").instance | |
| local aiBtn, aiText = ui:Get("AITipsButton"), ui:Get("AITipsText") | |
| if aiBtn.selectable and aiBtn.instance.Active then | |
| utils:ShowToast("ButtonToast", { | |
| AdditionalText = {"Translate?","Tradurre?","Dịch?","Traduzir?","Terjemahkan?","Перевести?","Übersetzen?","Traducir?","Traduire?","翻译?","翻訳する?","ترجم؟","अनुवाद करें?","แปล?"}, | |
| Style = "confirm", | |
| Callback = function(res: boolean) | |
| if not res then return end | |
| framework.settings:SetSetting("Country_Code", aiBtn.CountryCode) | |
| aiText:Tween(tweens.default, { | |
| TextTransparency = 0 | |
| }) | |
| aiBtn.instance.Text = utils:Translate({"Translate","Traduci","Dịch","Traduzir","Terjemahkan","Перевести","Übersetzen","Traducir","Traduire","翻译","翻訳する","ترجم","अनुवाद करें","แปล"}) | |
| -- Refresh static translations | |
| local isScripthub = ui:Get("CloudSearchBox").mode == "scripthub" | |
| ui:Get("ScriptsSwitchButton").instance.Text = isScripthub | |
| and utils:Translate({"LocalScripts 📂","Script locali 📂","Kịch bản cục bộ 📂","Scripts locais 📂","Skrip Lokal 📂","Локальные скрипты 📂","Lokale Skripte 📂","Scripts locales 📂","Scripts locaux 📂","本地脚本 📂","ローカルスクリプト 📂","السكريبتات المحلية 📂","स्थानीय स्क्रिप्ट 📂","สคริปต์ภายในเครื่อง 📂"}) | |
| or utils:Translate({"CloudScripts ☁️","ScriptCloud ☁️","Kịch bản đám mây ☁️","Scripts na nuvem ☁️","Skrip Awan ☁️","Облачные скрипты ☁️","CloudSkripte ☁️","Scripts en la nube ☁️","Scripts Cloud ☁️","云脚本 ☁️","クラウドスクリプト ☁️","سكريبتات السحابة ☁️","क्लाउडस्क्रिप्ट्स ☁️","สคริปต์คลาวด์ ☁️"}) | |
| framework.dependencies.scripthub:Browse(nil, true, "scripthub") | |
| --framework.dependencies.editortabs:GetSaved("tabs") | |
| if not isScripthub then | |
| ui:Get("GridFilter"):Refresh() | |
| --ui:Get("BarFilter"):Refresh() | |
| end | |
| aiText.instance.Visible = true | |
| languagePicker.Visible = false | |
| aiBtn.selectable = false | |
| end | |
| }) | |
| return | |
| else | |
| utils:AnimateCascade(aiBtn, { | |
| SkipTransparency = true, | |
| ScaleDirection = "In", | |
| ScaleCascade = true, | |
| AnimateSelf = true | |
| }) | |
| end | |
| aiText:Tween(tweens.default, { | |
| TextTransparency = 1 | |
| }) | |
| task.delay(1, function() | |
| aiText.instance.Visible = false | |
| end) | |
| aiBtn.instance.Text = utils:Translate({"Select a language","Seleziona la lingua","Chọn ngôn ngữ","Selecione um idioma","Pilih bahasa","Выберите язык","Sprache auswählen","Selecciona un idioma","Sélectionnez une langue","选择语言","言語を選択","اختر لغة","एक भाषा चुनें","เลือกภาษา"}) | |
| languagePicker.Visible = true | |
| aiBtn.selectable = true | |
| aiBtn.instance.BackgroundColor3 = Color3.fromHex("#000") | |
| aiBtn.instance.TextTransparency = .5 | |
| utils:AnimateCascade(languagePicker) | |
| aiBtn.instance.Active = false | |
| end) | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(.2, 0), | |
| PaddingTop = UDim.new(.2, 0) | |
| }), ui:AddInstance("UIGradient", { | |
| Rotation = 30, | |
| Color = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#FF0000")), | |
| ColorSequenceKeypoint.new(.4, Color3.fromHex("#FF3869")), | |
| ColorSequenceKeypoint.new(.7, Color3.fromHex("#F473EC")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#15A6FE")) | |
| }) | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new (.4,0) | |
| }))), ui:AddInstance("Frame", { | |
| Id = "AIPanelBackground2", | |
| BackgroundColor3 = Color3.fromRGB(255, 255, 255), | |
| Position = UDim2.fromScale(.03, .75), | |
| Size = UDim2.fromScale(.55, .2), | |
| BackgroundTransparency = .375, | |
| ClipsDescendants = true, | |
| Tags = {"Colors_Secondary"} | |
| }, ui:AddInstance("UIGradient", { | |
| Rotation = 10, | |
| Color = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#FF0000")), | |
| ColorSequenceKeypoint.new(.4, Color3.fromHex("#FF3869")), | |
| ColorSequenceKeypoint.new(.70, Color3.fromHex("#F473EC")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#15A6FE")) | |
| }) | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.3, 0) | |
| }), ui: AddInstance("ImageButton", { | |
| Id = "AIPlayerBackgroundOverlay", | |
| ImageColor3 = Color3.fromHex("#000"), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| ZIndex = 30, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:ShowToast("InputToast", { | |
| PlaceholderText = {"Play music","Ascolta musica","Phát nhạc","Ouvir música","Putar musik","Воспроизвести музыку","Musik abspielen","Reproducir música","Écouter de la musique","播放音乐","音楽を再生","تشغيل الموسيقى","संगीत चलाएँ","เล่นเพลง"}, | |
| AdditionalText = {"Song id...", "Id musica...", "Id bài hát...", "Id da música...", "Id lagu...", "Id песни...", "Song-ID...", "Id de canción...", "Id de la chanson...", "歌曲ID...", "曲ID...", "معرف الأغنية...", "गीत आईडी...", "รหัสเพลง..."}, | |
| Callback = function(res: any) | |
| if res == "" then return end | |
| local trackplayer = framework.dependencies.track | |
| local data = trackplayer:Play(res) | |
| if not data then return end | |
| ui:Get("PlayIcon").instance.Image = trackplayer:IsPaused() and | |
| framework.protected:ProtectAsset("rbxassetid://131442639815262") or framework.protected:ProtectAsset("rbxassetid://74770554858723") | |
| ui:Get("TrackArtist").instance.Text = data.Creator.Name | |
| ui:Get("TrackTitle").instance.Text = data.Name | |
| end | |
| }) | |
| end) | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.3, 0) | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Right, | |
| Position = UDim2.fromScale(.95, .1), | |
| Size = UDim2.fromScale(.35, .15), | |
| AnchorPoint = Vector2.new(1, 0), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Country_Code = {"Arceus Intelligence"}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Caption"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "TrackArtist", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.3, .425), | |
| AnchorPoint = Vector2.new(0, 1), | |
| Size = UDim2.fromScale(.6, .15), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| Country_Code = {"Click to change song...","Clicca per cambiare canzone...","Nhấp để thay đổi bài hát...","Clique para mudar a música...","Klik untuk mengubah lagu...","Нажмите, чтобы сменить песню...","Klicken Sie, um das Lied zu wechseln...","Haz clic para cambiar la canción...","Cliquez pour changer de chanson...","点击更改歌曲...","曲を変更するにはクリックしてください...","انقر لتغيير الأغنية...","गाना बदलने के लिए क्लिक करें...","คลิกเพื่อเปลี่ยนเพลง..."}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Heading"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| TextScaled = true | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "TrackTitle", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Text = "Arceus X Theme", | |
| Position = UDim2.fromScale(.3 , .55), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.65, .275), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Colors_Text_Primary", "Fonts_Heading"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui: AddInstance("ImageButton", { | |
| Id = "AIIcon2", | |
| Position = UDim2.fromScale(.05 , .5), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.85, .85), | |
| BackgroundTransparency = 1, | |
| Tags = {"Colors_Text_Primary"}, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| local trackplayer = framework.dependencies.track | |
| trackplayer:Toggle(ui:Get("SoundTrack")) | |
| ui:Get("PlayIcon").instance.Image = trackplayer:IsPaused() and | |
| framework.protected:ProtectAsset("rbxassetid://131442639815262") or framework.protected:ProtectAsset("rbxassetid://74770554858723") | |
| end) | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui: AddInstance("ImageLabel", { | |
| Id = "PlayIcon", | |
| Image = "rbxassetid://131442639815262", -- Pause = 74770554858723 | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.4, .4), | |
| ScaleType = Enum.ScaleType.Fit, | |
| BackgroundTransparency = 1, | |
| ImageTransparency = .2, | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }))), ui:AddInstance("Frame", { -- AI SONG PLAYER | |
| Position = UDim2.fromScale(.99, .85), | |
| Size = UDim2.fromScale(.685, .025), | |
| AnchorPoint = Vector2.new(1, 0), | |
| BackgroundTransparency = .8 | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| }), ui:AddInstance("ImageButton", { | |
| Id = "TrackSlider", | |
| Position = UDim2.fromScale(0, .5), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.7, 1.75), | |
| AutoButtonColor = false, | |
| BorderSizePixel = 0, | |
| Colors_Primary = {"BackgroundColor3"}, | |
| Tags = {"Colors_Primary"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| })), ui:AddInstance("TextLabel", { | |
| Id = "TrackTime", | |
| TextYAlignment = Enum.TextYAlignment.Bottom, | |
| TextXAlignment = Enum.TextXAlignment.Right, | |
| Position = UDim2.fromScale(1, 0), | |
| AnchorPoint = Vector2.new(1, 1), | |
| Size = UDim2.fromScale(1, 7), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .25, | |
| Text = "1:30 / 3:15", | |
| TextScaled = true, | |
| Tags = {"Colors_Text_Primary", "Fonts_Editor"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| })))), ui:AddInstance("Frame", { -- AI CHAT PANEL | |
| Id = "AIChatPanelBackground", | |
| Position = UDim2.fromScale(.97, .95), | |
| Size = UDim2.fromScale(.36 , .8), | |
| AnchorPoint = Vector2.new(1, 1), | |
| BackgroundTransparency = 1, | |
| Colors_Secondary = {"BackgroundColor3"}, | |
| Tags = {"Colors_Secondary"} | |
| }, ui:AddInstance("ImageLabel", { | |
| Id = "ZoomedImage", | |
| Image = "rbxassetid://89942914228029", | |
| Position = UDim2.fromScale(.5, .5), | |
| Size = UDim2.fromScale(1.4, 1.4), -- immagine ingrandita | |
| AnchorPoint = Vector2.new(.5, .5), | |
| BackgroundTransparency = 1, | |
| ZIndex = -1 | |
| }), ui:AddInstance("ImageLabel", { | |
| Id = "AIChatPanelBackgroundOverlay", | |
| Image = "rbxassetid://112235731951114", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| ImageTransparency = .35 | |
| }, ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Right, | |
| Position = UDim2.fromScale(1.025, -.025), | |
| TextYAlignment = Enum.TextYAlignment.Top, | |
| Size = UDim2.fromScale(.55, .075), | |
| AnchorPoint = Vector2.new(1, 0), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Caption"}, | |
| Country_Code = {"Arceus Intelligence"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "AIResponseTitle", | |
| Position = UDim2.fromScale(.5, .1), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| Size = UDim2.fromScale(.5, .05), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Country_Code = {`Hello! I'm {aiName}!`,`Ciao! Sono {aiName}!`,`Xin chào! Tôi là {aiName}!`,`Olá! Eu sou {aiName}!`,`Halo! Saya {aiName}!`,`Привет! Я {aiName}!`,`Hallo! Ich bin {aiName}!`,`Hola! Soy {aiName}!`,`Bonjour! Je suis {aiName}!`,`你好!我是 {aiName}!`,`こんにちは!私は {aiName} です!`,`مرحبًا! أنا {aiName}!`,`नमस्ते! मैं {aiName} हूँ!`,`สวัสดี! ฉันคือ {aiName}!`}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Heading"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("ScrollingFrame", { | |
| AutomaticCanvasSize = Enum.AutomaticSize.Y, | |
| Position = UDim2.fromScale(0.5, .17), | |
| Size = UDim2.fromScale(.985, .675), | |
| AnchorPoint = Vector2.new(.5,0), | |
| CanvasSize = UDim2.fromScale(0,0), | |
| ScrollBarThickness = padding/3, | |
| BackgroundTransparency = 1, | |
| BorderSizePixel = 0, | |
| }, ui:AddInstance("TextLabel", { | |
| Id = "AIResponse", | |
| TextYAlignment = Enum.TextYAlignment.Top, | |
| AutomaticSize = Enum.AutomaticSize.XY, | |
| Position = UDim2.fromScale(.5, 0), | |
| AnchorPoint = Vector2.new(.5,0), | |
| Size = UDim2.fromScale(.8, 0), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .45, | |
| TextSize = padding * 2, | |
| TextWrap = true, | |
| RichText = true, | |
| LineHeight = .9, | |
| Country_Code = {"What can I do for\nyou today?","Cosa posso fare per te oggi?","Bạn cần tôi làm gì hôm nay?","O que posso fazer por você hoje?","Apa yang bisa saya lakukan untuk Anda hari ini?","Что я могу сделать для вас сегодня?","Was kann ich heute für dich tun?","¿Qué puedo hacer por ti hoy?","Que puis-je faire pour vous aujourd'hui?","我今天能为您做些什么?","今日何をお手伝いできますか?","ماذا يمكنني أن أفعل من أجلك اليوم؟","मैं आज आपके लिए क्या कर सकता हूँ?","วันนี้ฉันจะช่วยอะไรคุณได้บ้าง?"}, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Black", "UI_WindowState"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| UI_WindowState = { | |
| TextSize = { padding * 2, padding * 2.5, padding * 3 } | |
| } | |
| }, ui:AddInstance("UIGradient", { | |
| Rotation = 210, | |
| Color = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.fromHex("#FF2E56")), | |
| ColorSequenceKeypoint.new(.23, Color3.fromHex("#FF3869")), | |
| ColorSequenceKeypoint.new(.66, Color3.fromHex("#F473EC")), | |
| ColorSequenceKeypoint.new(1, Color3.fromHex("#7390F6")) | |
| }) | |
| }))), ui:AddInstance("TextBox", { | |
| Id = "AIBox", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| TextColor3 = Color3.fromHex("#FFF"), | |
| Position = UDim2.fromScale(.5, .875), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| Size = UDim2.fromScale(.9, .1), | |
| BackgroundTransparency = .85, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Text = "", | |
| Country_Code_Placeholder = {"Teach me how to...", "Insegnami come fare...", "Dạy tôi cách...", "Ensine-me como...", "Ajari saya cara...", "Научи меня, как...", "Lehre mich, wie man...", "Enséñame cómo...", "Apprends-moi comment...", "教我如何...", "どうやって...するか教えて...", "علمني كيف...", "मुझे सिखाओ कैसे...", "สอนฉันวิธี..."}, | |
| Tags = {"Country_Code"}, | |
| FocusLost = framework.protected:GCProtect(function() | |
| if utils.axintDebounce then return end | |
| utils.axintDebounce = true | |
| local input, output = ui:Get("AIBox").instance, ui:Get("AIResponse").instance | |
| local background = ui:Get("BackgroundGlow") | |
| local axint = framework.dependencies.axintelligence | |
| local outmsg = output.Text | |
| output.Text = utils:Translate({"Reasoning...","Ragionamento...","Đang suy luận...","Raciocínio...","Penalaran...","Рассуждение...","Überlegung...","Razonando...","Raisonnement...","推理...","推論中...","التفكير...","तर्क कर रहा है...","กำลังให้เหตุผล..."}) | |
| local prompt = input.Text | |
| input.Text = "" | |
| local res = axint:Chat(prompt) | |
| if res then | |
| local msg = framework.utils.strings.gsub(res.texts[1], "%s", "") | |
| if msg == "" then | |
| outmsg = "Arceus Intelligence is not available, please try again later" | |
| else | |
| outmsg = res.texts[1] | |
| background:Tween(tweens.default, { | |
| ImageColor3 = Color3.fromHex("#707070") | |
| }) | |
| task.delay(3, function() | |
| background:Tween(tweens.slow_default, { | |
| ImageColor3 = Color3.fromHex("#000"), | |
| }) | |
| end) | |
| end | |
| if #res.codes > 0 then | |
| utils:ShowToast("ButtonToast", { | |
| AdditionalText = {`{framework.utils.strings.sub(res.codes[1], 1, 50)}`}, | |
| AdditionalTitle = {"Allow arcy to execute?","Permettere ad arcy di eseguire?","Cho phép Arcy thực thi?","Permitir que o Arcy execute?","Izinkan Arcy untuk mengeksekusi?","Разрешить Arcy выполнять?","Arcy ausführen lassen?","¿Permitir que Arcy ejecute?","Autoriser Arcy à exécuter ?","允许 Arcy 执行?","Arcy に実行を許可しますか?","السماح لـ Arcy بالتنفيذ؟","क्या Arcy को निष्पादन की अनुमति दें?","อนุญาตให้ Arcy ดำเนินการหรือไม่?"}, | |
| Style = "confirm", | |
| Callback = function(yes: boolean) | |
| if not yes then return end | |
| framework.execution:Execute(res.codes[1]) | |
| end | |
| }) | |
| end | |
| end | |
| utils:AnimateCascade(output, { | |
| AnimateSelf = true, | |
| ScaleCascade = true, | |
| ScaleDirection = "In" | |
| }) | |
| output.Text = outmsg | |
| utils.axintDebounce = false | |
| end) | |
| }, ui:AddInstance("UIPadding", { | |
| PaddingRight = UDim.new(.05, 0), | |
| PaddingLeft = UDim.new(.2, 0), | |
| PaddingBottom = UDim.new(.3, 0), | |
| PaddingTop = UDim.new(.3, 0) | |
| }), ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://135762677969700", -- AI Icon | |
| Position = UDim2.fromScale(-.05,.5), | |
| AnchorPoint = Vector2.new(1,.5), | |
| Size = UDim2.fromScale(.15,1.5), | |
| ScaleType = Enum.ScaleType.Fit, | |
| BackgroundTransparency = 1 | |
| }), ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://93050869167661", -- Shadow Glow | |
| Size = UDim2.fromScale(2,6.4), -- Without padding --> Size = UDim2.fromScale(1.75,4), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Position = UDim2.fromScale(.4,.5), | |
| BackgroundTransparency = 1, | |
| ImageTransparency = .25 | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| })), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.11, 0) | |
| }), ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(.065, 0), | |
| PaddingTop = UDim.new(.065, 0), | |
| PaddingRight = UDim.new(.1, 0), | |
| PaddingLeft = UDim.new(.1, 0) | |
| })))) | |
| }, | |
| { Name = "Extensions", Icon = "rbxassetid://136247171547858", | |
| Content = ui:AddInstance("Frame", {Id = "Extensions"}, | |
| ui:AddInstance("TextButton", { | |
| Id = "ExtensionBackButton", | |
| BackgroundColor3 = Color3.fromHex("#FF0000"), | |
| Position = UDim2.fromScale(.08, .03), | |
| Size = UDim2.fromScale(.115, .06), | |
| AnchorPoint = Vector2.new(0,0), | |
| BackgroundTransparency = .45, | |
| Visible = false, | |
| Text = "", | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| local backButton, detachButton = ui:Get("ExtensionBackButton"), ui:Get("ExtensionDetachButton") | |
| local page, content = ui:Get("ExtensionPage"), ui:Get("ExtensionContent") | |
| backButton.instance.Visible = false | |
| detachButton.instance.Visible = false | |
| content.instance.Visible = false | |
| page.instance.Visible = true | |
| end) | |
| }, ui:AddInstance("TextLabel", {Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(1, .65), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Title"}, | |
| Country_Code = {"‹ Back","‹ Indietro","‹ Quay lại","‹ Voltar","‹ Kembali","‹ Назад","‹ Zurück","‹ Atrás","‹ Retour","‹ 返回","‹ 戻る","‹ عودة","‹ वापस","‹ ย้อนกลับ"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.35, 0) | |
| })), ui:AddInstance("TextButton", { | |
| Id = "ExtensionDetachButton", | |
| BackgroundColor3 = Color3.fromHex("#58B2FF"), | |
| Position = UDim2.fromScale(.225, .03), | |
| Size = UDim2.fromScale(.135, .06), | |
| AnchorPoint = Vector2.new(0, 0), | |
| BackgroundTransparency = .5, | |
| Visible = false, | |
| Text = "", | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| local plugins = framework.dependencies.plugins | |
| local last = plugins:GetLastOpened() | |
| if last then last:Detach() end | |
| end) | |
| }, ui:AddInstance("TextLabel", { | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(1, .65), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Title"}, | |
| Country_Code = {" 🔗 Detach"," 🔗 Stacca"," 🔗 Tháo"," 🔗 Desanexar"," 🔗 Lepas"," 🔗 Отсоединить"," 🔗 Lösen"," 🔗 Desacoplar"," 🔗 Détacher"," 🔗 分离"," 🔗 分離"," 🔗 فصل"," 🔗 अलग करें"," 🔗 ถอด"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.35, 0) | |
| })), | |
| ui:AddInstance("ScrollingFrame", { | |
| Id = "ExtensionPage", | |
| ScrollingDirection = Enum.ScrollingDirection.Y, | |
| AutomaticCanvasSize = Enum.AutomaticSize.Y, | |
| BackgroundColor3 = Color3.fromHex("#FFF"), | |
| Position = UDim2.fromScale(0, .14), | |
| Size = UDim2.fromScale(1, .835), | |
| ScrollBarThickness = padding/3, | |
| BackgroundTransparency = 1, | |
| ClipsDescendants = true, | |
| BorderSizePixel = 0, | |
| Colors_Primary = {"ScrollBarImageColor3"}, | |
| Tags = {"Colors_Primary"} | |
| }, ui:AddInstance("UIPadding",{ | |
| PaddingLeft = UDim.new(.03, 0) | |
| }), ui:AddInstance("Frame", { | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(0, .05), | |
| Size = UDim2.fromScale(.3, .08), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Black"}, | |
| Country_Code = {"Extensions","Estensioni","Tiện ích mở rộng","Extensões","Ekstensi","Расширения","Erweiterungen","Extensiones","Extensions","扩展","拡張機能","الإضافات","एक्सटेंशन","ส่วนขยาย"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(0, 0), | |
| Size = UDim2.fromScale(.3, .045), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Description"}, | |
| Country_Code = {"Discover","Scopri le","Khám phá","Descobrir","Temukan","Обнаружить","Entdecken","Descubrir","Découvrir","发现","発見","اكتشف","खोजें","ค้นพบ"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextButton", { | |
| BackgroundColor3 = Color3.fromHex("#2B5780"), | |
| Position = UDim2.fromScale(.95, .05), | |
| Size = UDim2.fromScale(.15, .09), | |
| AnchorPoint = Vector2.new(1, 0), | |
| BackgroundTransparency = .5, | |
| Text = "", | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| utils:ShowToast("InputToast", { | |
| PlaceholderText = {"Extension url","Url dell'estensione","URL tiện ích mở rộng","URL de extensão","URL ekstensi","URL расширения","Erweiterungs-URL","URL de extensión","URL de l'extension","扩展 URL","拡張機能のURL","رابط الإضافة","एक्सटेंशन URL","URL ส่วนขยาย"}, | |
| AdditionalText = {"Install extension","Installa estensione","Cài đặt tiện ích mở rộng","Instalar extensão","Pasang ekstensi","Установить расширение","Erweiterung installieren","Instalar extensión","Installer l'extension","安装扩展","拡張機能をインストール","تثبيت الإضافة","एक्सटेंशन इंस्टॉल करें","ติดตั้งส่วนขยาย"}, | |
| Callback = function(res: any) | |
| if not res then return end | |
| framework.dependencies.plugins:Install(res) | |
| end | |
| }) | |
| end) | |
| }, ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://112476312219988", | |
| Position = UDim2.fromScale(.1, .5), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.6, .6), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddInstance("TextLabel", { | |
| Position = UDim2.fromScale(.625, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(1, .55), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Body"}, | |
| Country_Code = {"Install","Installa","Cài đặt","Instalar","Pasang","Установить","Installieren","Instalar","Installer","安装","インストール","تثبيت","इंस्टॉल","ติดตั้ง"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.35, 0) | |
| })) --[[,ui:AddInstance("TextBox", { | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| BackgroundColor3 = Color3.fromHex("000"), | |
| Position = UDim2.fromScale(1, .175), | |
| Size = UDim2.fromScale(.25, .095), | |
| AnchorPoint = Vector2.new(1, 0), | |
| PlaceholderText = "Search...", | |
| BackgroundTransparency = .5, | |
| TextScaled = true, | |
| Text = "", | |
| Tags = {"Colors_Text_Primary", "Fonts_Heading"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }), ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(.25,0), | |
| PaddingRight = UDim.new(.05, 0), | |
| PaddingLeft = UDim.new(.075, 0), | |
| PaddingTop = UDim.new(.25,0) | |
| })),--]]), ui:AddInstance("Frame", { | |
| Id = "ExtensionHome", | |
| AutomaticSize = Enum.AutomaticSize.Y, | |
| Position = UDim2.fromScale(0, .175), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| ClipsDescendants = false | |
| }, ui:AddInstance("UIGridLayout", { | |
| HorizontalAlignment = Enum.HorizontalAlignment.Center, | |
| VerticalAlignment = Enum.VerticalAlignment.Top, | |
| FillDirection = Enum.FillDirection.Horizontal, | |
| CellPadding = UDim2.fromScale(.05, .075), | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| CellSize = UDim2.fromScale(.15, 0) | |
| }))), ui:AddInstance("Frame", { | |
| Id = "ExtensionContent", | |
| --AutomaticSize = Enum.AutomaticSize.Y, | |
| Position = UDim2.fromScale(0, .175), | |
| Size = UDim2.fromScale(1, .8), | |
| BackgroundTransparency = 1, | |
| Visible = false | |
| })) | |
| }, | |
| { Name = "Settings", Icon = "rbxassetid://102545631972477", | |
| Content = ui:AddInstance("Frame", {Id = "Settings"}, | |
| ui:AddInstance("ScrollingFrame", { | |
| Id = "SettingsPage", | |
| ScrollingDirection = Enum.ScrollingDirection.Y, | |
| AutomaticCanvasSize = Enum.AutomaticSize.Y, | |
| BackgroundColor3 = Color3.fromHex("#FFF"), | |
| Position = UDim2.fromScale(0, .14), | |
| Size = UDim2.fromScale(1, .835), | |
| ScrollBarThickness = padding/3, | |
| BackgroundTransparency = 1, | |
| ClipsDescendants = true, | |
| BorderSizePixel = 0, | |
| Colors_Primary = {"ScrollBarImageColor3"}, | |
| Tags = {"Colors_Primary"} | |
| }, ui:AddInstance("UIPadding",{ | |
| PaddingLeft = UDim.new(.03, 0), | |
| PaddingTop = UDim.new(.02, 0), | |
| PaddingRight = UDim.new(.03, 0), | |
| PaddingBottom = UDim.new(.02, 0) | |
| }), ui:AddInstance("Frame", { | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("TextLabel", { | |
| Id = "SettingsTitle", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(0, .05), | |
| Size = UDim2.fromScale(.3, .08), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Black"}, | |
| Country_Code = {"Settings","Impostazioni","Cài đặt","Configuración","Pengaturan","Настройки","Einstellungen","Configurações","Paramètres","设置","設定","الإعدادات","सेटिंग्स","การตั้งค่า"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "SettingsSubtitle", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(0, 0), | |
| Size = UDim2.fromScale(.3, .045), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Colors_Text_Primary", "Fonts_Description"}, | |
| Country_Code = {"Configure","Configura","Định cấu hình","Configurar","Konfigurasi","Настроить","Konfigurieren","Configurar","Configurer","配置","構成","تكوين","कॉन्फ़िगर","กำหนดค่า"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| })), ui:AddInstance("Frame", { | |
| Id = "SettingsHome", | |
| -- niente auto-layout: gestiamo noi lo stacking in scale | |
| AutomaticSize = Enum.AutomaticSize.None, | |
| Position = UDim2.fromScale(0, .175), | |
| -- altezza in scale calcolata per contenere tutti i blocchi | |
| -- BLOCK_H = 0.14, GAP = 0.03, N = 6 => totalScale = N*BLOCK_H + (N-1)*GAP = 0.99 | |
| Size = UDim2.fromScale(1, 0.99), | |
| BackgroundTransparency = 1, | |
| ClipsDescendants = false | |
| }, framework.protected:GCProtect(function() | |
| -- configurazione spacing in SCALE | |
| local LEFT = 0.0 -- 5% margine sinistro | |
| local WIDTH = 0.90 -- 90% larghezza | |
| local BLOCK_H = 0.14 -- altezza di ogni setting (in scale) | |
| local GAP = 0.09 -- spazio verticale tra setting (in scale) | |
| local function y(i) | |
| return (i-1) * (BLOCK_H + GAP) | |
| end | |
| return { | |
| -- Colori | |
| ui:AddComponent("SettingDropdown", { | |
| Id = "Setting_PrimaryColor", | |
| Description = {"Choose the primary color theme","Scegli il tema colore principale","Chọn chủ đề màu chính","Elige el tema de color principal","Pilih tema warna utama","Выберите основную цветовую тему","Wählen Sie das Hauptfarbthema","Escolha o tema de cor primário","Choisissez le thème de couleur principal","选择主要颜色主题","主要なカラーテーマを選択","اختر نظام الألوان الأساسي","प्राथमिक रंग थीम चुनें","เลือกธีมสีหลัก"}, | |
| Title = {"Primary Color","Colore primario","Màu chính","Color primario","Warna utama","Основной цвет","Primärfarbe","Cor primária","Couleur principale","主色","プライマリカラー","اللون الأساسي","प्राथमिक रंग","สีหลัก"}, | |
| Position = UDim2.fromScale(LEFT, y(1)), | |
| Size = UDim2.fromScale(WIDTH, BLOCK_H), | |
| LayoutOrder = 1, | |
| Options = { | |
| { Name = {"Red","Rosso","Đỏ","Rojo","Merah","Красный","Rot","Vermelho","Rouge","红色","赤","أحمر","लाल","สีแดง"}, Value = framework.settings:GetDefaultSetting("Colors_Primary") }, | |
| { Name = {"Blue","Blu","Xanh dương","Azul","Biru","Синий","Blau","Azul","Bleu","蓝色","青","أزرق","नीला","สีน้ำเงิน"}, Value = Color3.fromRGB(59, 130, 246):ToHex() }, -- #3B82F6 | |
| { Name = {"Green","Verde","Xanh lá","Verde","Hijau","Зелёный","Grün","Verde","Vert","绿色","緑","أخضر","हरा","สีเขียว"}, Value = Color3.fromRGB(34, 197, 94):ToHex() }, -- #22C55E | |
| { Name = {"Purple","Viola","Tím","Púrpura","Ungu","Фиолетовый","Lila","Roxo","Violet","紫色","紫","أرجواني","बैंगनी","สีม่วง"}, Value = Color3.fromRGB(139, 92, 246):ToHex() }, -- #8B5CF6 | |
| { Name = {"Orange","Arancione","Cam","Naranja","Oranye","Оранжевый","Orange","Laranja","Orange","橙色","オレンジ","برتقالي","नारंगी","สีส้ม"}, Value = Color3.fromRGB(249, 115, 22):ToHex() }, -- #F97316 | |
| { Name = {"Amber","Ambra","Hổ phách","Ámbar","Amber","Янтарный","Bernstein","Âmbar","Ambre","琥珀色","琥珀","كهرماني","अंबर","สีเหลืองอำพัน"}, Value = Color3.fromRGB(245, 158, 11):ToHex() }, -- #F59E0B | |
| { Name = {"Teal","Verde petrolio","Xanh lục lam","Verde azulado","Hijau kebiruan","Бирюзовый","Türkisblau","Verde-azulado","Sarcelle","蓝绿色","ティール","أزرق مخضر","हरित-नीला","สีน้ำเงินเขียว"}, Value = Color3.fromRGB(20, 184, 166):ToHex() }, -- #14B8A6 | |
| { Name = {"Cyan","Ciano","Xanh cyan","Cian","Sian","Голубой","Cyan","Ciano","Cyan","青色","シアン","سماوي","हरिनील","สีฟ้า"}, Value = Color3.fromRGB(6, 182, 212):ToHex() }, -- #06B6D4 | |
| { Name = {"Pink","Rosa","Hồng","Rosa","Merah muda","Розовый","Rosa","Rosa","Rose","粉红色","ピンク","وردي","गुलाबी","สีชมพู"}, Value = Color3.fromRGB(236, 72, 153):ToHex() }, -- #EC4899 | |
| { Name = {"Indigo","Indaco","Chàm","Índigo","Nila","Индиго","Indigo","Índigo","Indigo","靛蓝色","インディゴ","نيلي","जामुनी","สีคราม"}, Value = Color3.fromRGB(99, 102, 241):ToHex() }, -- #6366F1 | |
| { Name = {"Lime","Lime","Xanh lá chanh","Lima","Hijau limau","Лаймовый","Limette","Limão","Citron vert","酸橙色","ライム","ليموني","हल्का हरा","สีมะนาว"}, Value = Color3.fromRGB(132, 204, 22):ToHex() }, -- #84CC16 | |
| }, | |
| SelectedValue = function() | |
| return framework.settings:GetSetting("Colors_Primary") | |
| end, | |
| Callback = framework.protected:GCProtect(function(value: string) | |
| framework.settings:SetSetting("Colors_Primary", value) | |
| end) | |
| }), | |
| --[[ | |
| ui:AddComponent("SettingDropdown", { | |
| Id = "Setting_SecondaryColor", | |
| Description = {"Choose the secondary color theme"}, | |
| Title = {"Secondary Color"}, | |
| Position = UDim2.fromScale(LEFT, y(2)), | |
| Size = UDim2.fromScale(WIDTH, BLOCK_H), | |
| LayoutOrder = 2, | |
| Options = { | |
| { Name = "Blue", Value = Color3.fromRGB(0, 128, 255):ToHex() }, | |
| { Name = "Orange", Value = Color3.fromRGB(255, 128, 0):ToHex() } | |
| }, | |
| Callback = framework.protected:GCProtect(function(value: string) | |
| framework.settings:SetSetting("Colors_Secondary", value) | |
| end) | |
| }), | |
| -- Interfaccia | |
| ui:AddComponent("SettingToggle", { | |
| Id = "Setting_Translate", | |
| Description = {"Enable automatic translations (AI Page)"}, | |
| Title = {"Translate"}, | |
| Enabled = false, | |
| Position = UDim2.fromScale(LEFT, y(3)), | |
| Size = UDim2.fromScale(WIDTH, BLOCK_H), | |
| LayoutOrder = 3, | |
| Callback = framework.protected:GCProtect(function(state: boolean) | |
| print("Translate setting:", state) | |
| end) | |
| }),]] | |
| ui:AddComponent("SettingDropdown", { | |
| Id = "Setting_FPSCap", | |
| Description = {"Choose the maximum FPS limit","Scegli il limite massimo di FPS","Chọn giới hạn FPS tối đa","Elige el límite máximo de FPS","Pilih batas FPS maksimum","Выберите максимальный предел FPS","Wählen Sie das maximale FPS-Limit","Escolha o limite máximo de FPS","Choisissez la limite maximale de FPS","选择最大FPS限制","最大FPS制限を選択","اختر الحد الأقصى لمعدل الإطارات في الثانية","अधिकतम FPS सीमा चुनें","เลือกขีดจำกัด FPS สูงสุด"}, | |
| Title = {"FPS Cap","Limite FPS","Giới hạn FPS","Límite de FPS","Batas FPS","Ограничение FPS","FPS-Limit","Limite de FPS","Limite de FPS","FPS上限","FPS制限","الحد الأقصى لمعدل الإطارات","FPS सीमा","จำกัด FPS"}, | |
| Position = UDim2.fromScale(LEFT, y(2)), | |
| Size = UDim2.fromScale(WIDTH, BLOCK_H), | |
| LayoutOrder = 2, | |
| Options = { | |
| { Name = {"30 Fps","30 FPS","30 FPS","30 FPS","30 FPS","30 кадров/с","30 FPS","30 FPS","30 FPS","30帧每秒","30 FPS","30 إطار/ث","30 एफपीएस","30 เฟรมต่อวินาที"}, Value = 30 }, | |
| { Name = {"60 Fps","60 FPS","60 FPS","60 FPS","60 FPS","60 кадров/с","60 FPS","60 FPS","60 FPS","60帧每秒","60 FPS","60 إطار/ث","60 एफपीएस","60 เฟรมต่อวินาที"}, Value = 60 }, | |
| { Name = {"120 Fps","120 FPS","120 FPS","120 FPS","120 FPS","120 кадров/с","120 FPS","120 FPS","120 FPS","120帧每秒","120 FPS","120 إطار/ث","120 एफपीएस","120 เฟรมต่อวินาที"}, Value = 120 }, | |
| { Name = {"144 Fps","144 FPS","144 FPS","144 FPS","144 FPS","144 кадров/с","144 FPS","144 FPS","144 FPS","144帧每秒","144 FPS","144 إطار/ث","144 एफपीएस","144 เฟรมต่อวินาที"}, Value = 144 }, | |
| { Name = {"240 Fps","240 FPS","240 FPS","240 FPS","240 FPS","240 кадров/с","240 FPS","240 FPS","240 FPS","240帧每秒","240 FPS","240 إطار/ث","240 एफपीएस","240 เฟรมต่อวินาที"}, Value = 240 }, | |
| { Name = {"Unlimited","Illimitato","Không giới hạn","Ilimitado","Tidak terbatas","Неограниченный","Unbegrenzt","Ilimitado","Illimité","无限","無制限","غير محدود","असीमित","ไม่จำกัด"}, Value = 1000 } | |
| }, | |
| SelectedValue = function() | |
| return framework.settings:GetSetting("Setting_Fps") | |
| end, | |
| Callback = framework.protected:GCProtect(function(value: string) | |
| framework.settings:SetSetting("Setting_Fps", value) | |
| framework.env.setfpscap(value) | |
| end) | |
| }), | |
| ui:AddComponent("SettingNumeric", { | |
| Id = "Setting_EditorTextSize", | |
| Description = {"Set the size of the editor text","Imposta la dimensione del testo dell'editor","Đặt kích thước văn bản của trình soạn thảo","Establecer el tamaño del texto del editor","Atur ukuran teks editor","Установите размер текста редактора","Stellen Sie die Schriftgröße des Editors ein","Defina o tamanho do texto do editor","Définir la taille du texte de l’éditeur","设置编辑器文本大小","エディタのテキストサイズを設定","حدد حجم نص المحرر","संपादक पाठ का आकार सेट करें","ตั้งค่าขนาดข้อความของตัวแก้ไข"}, | |
| Title = {"Editor Text Size","Dimensione testo editor","Kích thước văn bản trình soạn thảo","Tamaño de texto del editor","Ukuran teks editor","Размер текста редактора","Editor-Textgröße","Tamanho do texto do editor","Taille du texte de l’éditeur","编辑器文本大小","エディタのテキストサイズ","حجم نص المحرر","संपादक टेक्स्ट आकार","ขนาดข้อความของตัวแก้ไข"}, | |
| StartValue = function() | |
| return framework.settings:GetSetting("FontSizes_Editor") or framework.settings:GetDefaultSetting("FontSizes_Editor") | |
| end, | |
| Increment = 1, Max = 32, Min = 8, | |
| Position = UDim2.fromScale(LEFT, y(3)), | |
| Size = UDim2.fromScale(WIDTH, BLOCK_H), | |
| LayoutOrder = 3, | |
| Callback = framework.protected:GCProtect(function(value: number) | |
| framework.settings:SetSetting("FontSizes_Editor", value) | |
| end) | |
| }), | |
| -- Generali | |
| ui:AddComponent("SettingToggle", { | |
| Id = "Setting_DisableIntro", | |
| Description = {"Skip the intro when starting","Salta l'introduzione all'avvio","Bỏ qua phần giới thiệu khi khởi động","Saltar la introducción al iniciar","Lewati intro saat memulai","Пропустить вступление при запуске","Intro beim Start überspringen","Pular a introdução ao iniciar","Passer l’introduction au démarrage","启动时跳过介绍","起動時にイントロをスキップ","تخطي المقدمة عند بدء التشغيل","स्टार्ट करते समय इंट्रो छोड़ें","ข้ามอินโทรเมื่อเริ่มต้น"}, | |
| Title = {"Disable Intro","Disattiva introduzione","Tắt phần giới thiệu","Desactivar introducción","Nonaktifkan intro","Отключить вступление","Intro deaktivieren","Desativar introdução","Désactiver l’introduction","禁用介绍","イントロを無効にする","تعطيل المقدمة","इंट्रो अक्षम करें","ปิดการใช้อินโทร"}, | |
| Enabled = function() | |
| return not framework.settings:GetSetting("User_Intro") | |
| end, | |
| Position = UDim2.fromScale(LEFT, y(4)), | |
| Size = UDim2.fromScale(WIDTH, BLOCK_H), | |
| LayoutOrder = 4, | |
| Callback = framework.protected:GCProtect(function(state: boolean) | |
| framework.settings:SetSetting("User_Intro", not state) | |
| end) | |
| }), | |
| -- Interfaccia | |
| --[[ui:AddComponent("SettingToggle", { | |
| Id = "Setting_Animations", | |
| Description = {"Enable or disable interface animations","Abilita o disabilita le animazioni dell'interfaccia","Bật hoặc tắt hoạt ảnh giao diện","Habilitar o deshabilitar las animaciones de la interfaz","Aktifkan atau nonaktifkan animasi antarmuka","Включить или отключить анимации интерфейса","Aktivieren oder deaktivieren Sie die Schnittstellenanimationen","Ativar ou desativar animações da interface","Activer ou désactiver les animations de l'interface","启用或禁用界面动画","インターフェースアニメーションを有効または無効にする","تمكين أو تعطيل الرسوم المتحركة للواجهة","इंटरफ़ेस एनिमेशन सक्षम या अक्षम करें","เปิดหรือปิดการทำงานของแอนิเมชันอินเทอร์เฟซ"}, | |
| Title = {"Animations","Animazioni","Hoạt ảnh","Animaciones","Animasi","Анимации","Animationen","Animações","Animations","动画","アニメーション","الرسوم المتحركة","एनिमेशन","แอนิเมชัน"}, | |
| Enabled = true, | |
| Position = UDim2.fromScale(LEFT, y(5)), | |
| Size = UDim2.fromScale(WIDTH, BLOCK_H), | |
| LayoutOrder = 5, | |
| Callback = framework.protected:GCProtect(function(state: boolean) | |
| print("Animations setting:", state) | |
| end) | |
| }),]] | |
| -- Generali | |
| ui:AddComponent("SettingToggle", { | |
| Id = "Setting_Afk", | |
| Description = {"Bypass being kicked for AFK","Aggira l'espulsione per AFK","Vượt qua việc bị đá vì AFK","Evitar ser expulsado por AFK","Lewati tendangan karena AFK","Обойти кик за AFK","Kick wegen AFK umgehen","Evitar ser expulso por AFK","Contourner l’expulsion pour AFK","绕过因AFK被踢出","AFKによるキックを回避","تجاوز الطرد بسبب AFK","AFK होने पर किक से बचें","ข้ามการถูกเตะเพราะ AFK"}, | |
| Title = {"Anti AFK","Anti AFK","Chống AFK","Anti AFK","Anti AFK","Анти AFK","Anti-AFK","Anti AFK","Anti AFK","防AFK","アンチAFK","مضاد AFK","एंटी AFK","ป้องกัน AFK"}, | |
| Enabled = function() | |
| return framework.settings:GetSetting("Settings_Afk") | |
| end, | |
| Position = UDim2.fromScale(LEFT, y(5)), | |
| Size = UDim2.fromScale(WIDTH, BLOCK_H), | |
| LayoutOrder = 5, | |
| Callback = framework.protected:GCProtect(function(state: boolean) | |
| framework.settings:SetSetting("Settings_Afk", state) | |
| if framework.env.WHWKIWIOSU then | |
| framework.env.WHWKIWIOSU(state) | |
| elseif state then | |
| framework.dependencies.shared.antiAfk() | |
| end | |
| end) | |
| }), | |
| ui:AddComponent("SettingDropdown", { | |
| Id = "Setting_Links", | |
| Description = {"Choose where to go","Scegli dove andare","Chọn nơi để đi","Elige adónde ir","Pilih ke mana harus pergi","Выберите, куда перейти","Wählen Sie, wohin Sie gehen möchten","Escolha para onde ir","Choisissez où aller","选择要去的地方","行き先を選んでください","اختر مكان الانتقال","कहाँ जाना है चुनें","เลือกว่าจะไปที่ไหน"}, | |
| Title = {"Links","Collegamenti","Liên kết","Enlaces","Tautan","Ссылки","Links","Links","Liens","链接","リンク","الروابط","लिंक","ลิงก์"}, | |
| Position = UDim2.fromScale(LEFT, y(6)), | |
| Size = UDim2.fromScale(WIDTH, BLOCK_H), | |
| LayoutOrder = 6, | |
| Options = { | |
| { Name = {"Website","Sito web","Trang web","Sitio web","Situs web","Веб-сайт","Webseite","Website","Site web","网站","ウェブサイト","موقع إلكتروني","वेबसाइट","เว็บไซต์"}, Value = "https://spdmteam.com" }, | |
| { Name = {"Shop","Negozio","Cửa hàng","Tienda","Toko","Магазин","Geschäft","Loja","Magasin","商店","ショップ","متجر","दुकान","ร้านค้า"}, Value = "https://shop.spdmteam.com" }, | |
| { Name = {"Discord","Discord","Discord","Discord","Discord","Дискорд","Discord","Discord","Discord","Discord","ディスコード","ديسكورد","डिस्कॉर्ड","ดิสคอร์ด"}, Value = "https://discord.spdmteam.com" } | |
| }, | |
| Callback = framework.protected:GCProtect(function(value: string) | |
| framework.utils.http:OpenUrl(value) | |
| end) | |
| }), | |
| --[[ui:AddComponent("SettingToggle", { | |
| Id = "Setting_ConfirmationPopup", | |
| Description = {"Ask for confirmation before actions","Chiedi conferma prima delle azioni","Hỏi xác nhận trước khi thực hiện hành động","Pedir confirmación antes de las acciones","Minta konfirmasi sebelum melakukan tindakan","Спросить подтверждение перед действиями","Vor Aktionen um Bestätigung bitten","Pedir confirmação antes das ações","Demander une confirmation avant les actions","操作前请求确认","操作の前に確認を求める","اطلب التأكيد قبل الإجراءات","क्रियाओं से पहले पुष्टि माँगें","ขอการยืนยันก่อนดำเนินการ"}, | |
| Title = {"Confirmation Popup","Finestra di conferma","Cửa sổ xác nhận","Ventana de confirmación","Popup konfirmasi","Всплывающее окно подтверждения","Bestätigungs-Popup","Popup de confirmação","Fenêtre de confirmation","确认弹窗","確認ポップアップ","نافذة تأكيد منبثقة","पुष्टिकरण पॉपअप","หน้าต่างยืนยัน"}, | |
| Enabled = not not framework.settings:GetSetting("Popups_Confirmation"), | |
| Position = UDim2.fromScale(LEFT, y(4)), | |
| Size = UDim2.fromScale(WIDTH, BLOCK_H), | |
| LayoutOrder = 4, | |
| Callback = framework.protected:GCProtect(function(state: boolean) | |
| framework.settings:SetSetting("Popups_Confirmation", state) | |
| end) | |
| }),]] | |
| } | |
| end)))) | |
| } | |
| } | |
| ui.navbarOffset = .25 | |
| utils.pages = framework.protected:ProtectTable(pages) | |
| end | |
| local showPage do | |
| local lastPage | |
| showPage = framework.protected:GCProtect(function(id: string, posy: number) | |
| local nextPage = ui:Get(id) | |
| if utils.currentPage == nextPage then return end | |
| for _, page in ipairs(pages) do | |
| local content = page.Content.instance | |
| content.Visible = lastPage == content or nextPage.instance == content | |
| end | |
| lastPage = nextPage.instance | |
| ui:Get("MainPages").instance:JumpTo(nextPage.instance) | |
| local indicator = ui:Get("Indicator") | |
| indicator:Tween(tweens.default, { | |
| Position = UDim2.fromScale(.05, posy) | |
| }) | |
| utils.currentPage = nextPage | |
| if id == "Page_ScriptHub" and not ui.CloudLoaded then | |
| ui.CloudLoaded = true | |
| ui:Get("GridFilter"):Refresh() | |
| ui:Get("BarFilter"):Refresh() | |
| end | |
| utils:AnimateCascade(nextPage, { | |
| ExcludeNames = { "BarFilter", "GridFilter", "CloudBestScriptsBar", "AIPlayerBackgroundOverlay", "CategoryBtn_Files", "CategoryBtn_Auto", "CategoryBtn_Favs"}--, BestScriptsBar, MagicNicknameContainer", Slider_Gravity_Bar", "Slider_Jump_Bar", "Slider_Speed_Bar" | |
| }) | |
| end) | |
| ui.showPage = showPage | |
| end | |
| local showNavbar do | |
| local size1, size2 | |
| showNavbar = framework.protected:GCProtect(function(visible: boolean?) | |
| local content, sidebar, btn = ui:Get("ContentFrame"), ui:Get("Sidebar"), ui:Get("SideNavButton") | |
| local vis = visible == true or not sidebar.instance.Visible | |
| if vis then sidebar.instance.Visible = true end | |
| if not size1 then | |
| size1 = -sidebar.instance.Size.X.Scale | |
| size2 = content.instance.Size.X.Scale +size1 | |
| size1 = UDim2.fromScale(size1, 0) | |
| size2 = UDim2.fromScale(size2, 1) | |
| end | |
| utils:AnimateCascade(btn.instance, { | |
| SkipTransparency = true | |
| }) | |
| sidebar:Tween(tweens.default, { Position = vis and UDim2.fromScale(0, 0) or size1, Visible = vis }) | |
| content:Tween(tweens.default, { Size = vis and size2 or UDim2.fromScale(1, 1) }) | |
| btn:Tween(tweens.default, { Rotation = vis and 180 or 0 }) | |
| if vis then | |
| utils:AnimateCascade(sidebar, { | |
| ExcludeNames = {"Indicator"} | |
| }) | |
| end | |
| end) | |
| ui.showNavbar = showNavbar | |
| end | |
| -- UI Here | |
| ui:AddInstance("ImageLabel", { | |
| Id = "StartingScreen", | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| ImageTransparency = 1, | |
| ZIndex = 500, | |
| Visible = false | |
| }, ui:AddInstance("ImageLabel", { | |
| Id = "UserPFP2", | |
| AnchorPoint = Vector2.new(0, .5), | |
| Position = UDim2.fromScale(.0775, .2), | |
| Size = UDim2.fromScale(.05, .05), | |
| BackgroundTransparency = .5 | |
| }, ui:AddInstance("ImageLabel", { | |
| Id = "PFPOverlay2", | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| })), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| }), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddComponent("MovingText", { | |
| Id = "StartingNickname", | |
| Position = UDim2.fromScale(.115, .2), | |
| AnchorPoint = Vector2.new(0, .5), | |
| Size = UDim2.fromScale(.3, .0375), | |
| BackgroundTransparency = 1, | |
| ClipsDescendants = true, | |
| Text = framework.protected:GetService("Players").LocalPlayer.displayName | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "StartingWelcome", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.125, .3), | |
| Size = UDim2.fromScale(.1, .065), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .5, | |
| TextScaled = true, | |
| Tags = {"Country_Code", "Fonts_Heading", "Colors_Text_Primary"}, | |
| Country_Code = {"Welcome to","Benvenuto ad","Chào mừng đến","Bem-vindo a","Selamat datang di","Добро пожаловать в","Willkommen bei","Bienvenido a","Bienvenue à","欢迎来到","へようこそ","مرحبًا بك في","में आपका स्वागत है","ยินดีต้อนรับสู่"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "StartingTitle", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.125, .35), | |
| Size = UDim2.fromScale(.26, .085), | |
| BackgroundTransparency = 1, | |
| Text = "Arceus X v5", | |
| TextScaled = true, | |
| Tags = {"Fonts_Title", "Colors_Text_Primary"}, | |
| Colors_Text_Primary = {"TextColor3"}, | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "StartingText", | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| Position = UDim2.fromScale(.125, .45), | |
| Size = UDim2.fromScale(.35, .215), | |
| BackgroundTransparency = 1, | |
| TextTransparency = .25, | |
| TextScaled = true, | |
| Country_Code = {"Explore new possibilities,\ntake control, and unlock the\npower to dominate.","Esplora nuove possibilità,\nottieni il controllo, sblocca il\npotere per dominare.","Khám phá những khả năng mới,\nkiểm soát và mở khóa\nsức mạnh để thống trị.","Explore novas possibilidades,\nassuma o controle e desbloqueie\no poder de dominar.","Jelajahi kemungkinan baru,\nambil kendali dan buka\nkekuatan untuk mendominasi.","Исследуйте новые возможности,\nвозьмите контроль и разблокируйте\nсилу, чтобы доминировать.","Erkunde neue Möglichkeiten,\nübernimm die Kontrolle und schalte\ndie Macht zur Beherrschung frei.","Explora nuevas posibilidades,\ntoma el control y desbloquea\nel poder para dominar.","Explorez de nouvelles possibilités,\nprenez le contrôle et débloquez\nle pouvoir de dominer.","探索新的可能性,\n掌握控制权,\n并解锁主宰的力量。","新たな可能性を探り、\nコントロールを手に入れ、\n支配する力を解き放つ。","استكشف إمكانيات جديدة،\nتولى السيطرة وافتح\nقوة الهيمنة.","नई संभावनाओं का अन्वेषण करें,\nनियंत्रण सँभालें और शक्ति को\nप्रभुत्व के लिए मुक्त करें।","สำรวจความเป็นไปได้ใหม่ๆ,\nควบคุมและปลดล็อก\nพลังเพื่อครอบงำ"}, | |
| Tags = {"Country_Code", "Fonts_Description", "Colors_Text_Primary"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("TextBox", { | |
| Id = LPH_ENCSTR("EmailBox"), | |
| PlaceholderColor3 = Color3.fromHex("#808080"), | |
| TextXAlignment = Enum.TextXAlignment.Left, | |
| BackgroundColor3 = Color3.fromHex("#FFF"), | |
| TextTruncate = Enum.TextTruncate.AtEnd, | |
| Position = UDim2.fromScale(.125, .675), | |
| AutomaticSize = Enum.AutomaticSize.Y, | |
| Size = UDim2.fromScale(.35, .075), | |
| BackgroundTransparency = .5, | |
| PlaceholderText = "Email", | |
| TextSize = padding * 3.5, | |
| TextWrapped = false, | |
| Text = "", | |
| FocusLost = framework.protected:GCProtect(function() | |
| local email = ui:Get(LPH_ENCSTR("EmailBox")).instance.Text | |
| if framework.utils.strings.match(email, LPH_ENCSTR("^[%w_%+%.%-]+@[%w%-%.]+%.%a%a+$")) then | |
| framework.settings:SetSetting(LPH_ENCSTR("User_EMail"), email) | |
| end | |
| end), | |
| Tags = {"Colors_Text_Primary", "Fonts_Editor", "No_Focus"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.35, 0) | |
| }), ui:AddInstance("UIPadding", { | |
| PaddingBottom = UDim.new(0, padding), | |
| PaddingRight = UDim.new(0, padding*2), | |
| PaddingLeft = UDim.new(0, padding*2), | |
| PaddingTop = UDim.new(0, padding) | |
| })), ui:AddInstance("ImageButton", { | |
| Id = "StartButton", | |
| Image = "rbxassetid://87886886705009", | |
| Position = UDim2.fromScale(.09, .75), | |
| Size = UDim2.fromScale(.25, .3), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("TextLabel", { | |
| TextColor3 = Color3.fromHex("#FFF"), | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(1, .15), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Country_Code = {"START","AVVIA","BẮT ĐẦU","INICIAR","MULAI","НАЧАТЬ","STARTEN","INICIAR","DÉMARRER","开始","開始","ابدأ","प्रारंभ","เริ่ม"}, | |
| Tags = {"Country_Code", "Fonts_Title", "Colors_Text_Primary"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 2.35 | |
| })), ui:AddInstance("ImageButton", { | |
| Id = "SubscribeButton", | |
| Image = "rbxassetid://87886886705009", | |
| Position = UDim2.fromScale(.29, .75), | |
| Size = UDim2.fromScale(.25, .3), | |
| ImageColor3 = Color3.new(0,0,0), | |
| BackgroundTransparency = 1, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| framework.utils.http:OpenUrl("https://spdmteam.com/resellers") | |
| end) | |
| }, ui:AddInstance("TextLabel", { | |
| TextColor3 = Color3.fromHex("#FFF"), | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(1, .15), | |
| BackgroundTransparency = 1, | |
| TextScaled = true, | |
| Country_Code = {"SUBSCRIBE","ISCRIVITI","ĐĂNG KÝ","INSCREVER-SE","BERLANGGAN","ПОДПИСАТЬСЯ","ABONNIEREN","SUSCRIBIRSE","S'ABONNER","订阅","購読","اشترك","सदस्यता लें","สมัครสมาชิก"}, | |
| Tags = {"Country_Code", "Fonts_Title", "Colors_Text_Primary"}, | |
| Colors_Text_Primary = {"TextColor3"} | |
| }), ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(.5, 0) | |
| }), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 2.35 | |
| })), ui:AddInstance("ImageLabel", { | |
| Id = "StartingLogo", | |
| Image = "rbxassetid://81343346318525", | |
| Position = UDim2.fromScale(.5, 1), | |
| AnchorPoint = Vector2.new(0, .65), | |
| Size = UDim2.fromScale(.55, 1.5), | |
| ScaleType = Enum.ScaleType.Fit, | |
| BackgroundTransparency = 1 | |
| })) | |
| ui:AddInstance("ImageButton", { | |
| Id = "Background", | |
| BackgroundColor3 = Color3.fromRGB(0, 0, 0), | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| }, ui:AddInstance("ImageLabel", { | |
| Id = "BackgroundOverlay", | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Position = UDim2.fromScale(.5, .5), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| ImageTransparency = 1, | |
| }, ui:AddComponent("Shade", { | |
| Id = "BottomShadeLeft", | |
| Size = UDim2.fromScale(.5, .5), | |
| Position = UDim2.fromScale(0, .5), | |
| Rotation = 80, | |
| Transparency = NumberSequence.new({ | |
| NumberSequenceKeypoint.new(0, 1, 0), | |
| NumberSequenceKeypoint.new(.2, 1, 0), | |
| NumberSequenceKeypoint.new(1, .35, 0) | |
| }) | |
| }), ui:AddComponent("Shade", { | |
| Id = "BottomShadeRight", | |
| Size = UDim2.fromScale(.5, .5), | |
| Position = UDim2.fromScale(.5, .5), | |
| Rotation = 100, | |
| Transparency = NumberSequence.new({ | |
| NumberSequenceKeypoint.new(0, 1, 0), | |
| NumberSequenceKeypoint.new(.2, 1, 0), | |
| NumberSequenceKeypoint.new(1, .35, 0) | |
| }) | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "ShadeTitle", | |
| FontFace = Font.new("rbxasset://fonts/families/Ubuntu.json", Enum.FontWeight.Bold, Enum.FontStyle.Normal), | |
| TextColor3 = Color3.fromRGB(255, 255, 255), | |
| Position = UDim2.fromScale(.5, .85), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.25, .075), | |
| BackgroundTransparency = 1, | |
| TextTransparency = 1, | |
| TextScaled = true, | |
| Text = "Arceus X" | |
| }), ui:AddInstance("TextLabel", { | |
| Id = "ShadeText", | |
| FontFace = Font.new("rbxasset://fonts/families/Ubuntu.json", Enum.FontWeight.Regular, Enum.FontStyle.Normal), | |
| TextColor3 = Color3.fromRGB(220, 220, 220), | |
| Position = UDim2.fromScale(.5, .915), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.25, .035), | |
| BackgroundTransparency = 1, | |
| TextTransparency = 1, | |
| TextScaled = true, | |
| RichText = true, | |
| Text = "" | |
| }))) | |
| ui:AddInstance("CanvasGroup", { | |
| Id = "MainFrame", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.5, .5), | |
| BackgroundTransparency = 1, | |
| Visible = false | |
| }, ui:AddInstance("ImageLabel", { | |
| Id = "BackgroundGlow", | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| ImageColor3 = Color3.fromHex("#000") | |
| }, ui:AddInstance("ImageLabel", { | |
| Id = "AnimatedWallpaper", | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1, | |
| })), ui:AddInstance("ImageButton", { -- CLOSE BUTTON | |
| Id = "CloseButton", | |
| ImageColor3 = Color3.fromHex("#F00"), | |
| ZIndex = 500, | |
| Position = UDim2.fromScale(.9625, .065), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.125, .125), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| MouseButton1Click = ui.close, | |
| --MouseButton1Click = ui.nextSize | |
| Colors_Primary = {"ImageColor3"}, | |
| Tags = {"Colors_Primary"} | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddInstance("ImageButton", { -- MAXIMIZE BUTTON | |
| Id = "MaximizeButton", | |
| ImageColor3 = Color3.fromHex("#58B2FF"), | |
| ZIndex = 500, | |
| Position = UDim2.fromScale(.91, .065), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.125, .125), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| MouseButton1Click = ui.nextSize | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddInstance("TextButton", { | |
| Id = "SideNavButton", | |
| Position = UDim2.fromScale(.0375, .065), | |
| Size = UDim2.fromScale(.125, .11), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| MouseButton1Click = showNavbar, | |
| BackgroundTransparency = 1, | |
| Rotation = 180, | |
| ZIndex = 100, | |
| Text = "", | |
| Tags = {"UI_WindowState"} | |
| }, ui:AddInstance("ImageLabel", { | |
| Image = "rbxassetid://92411285882466", | |
| Position = UDim2.fromScale(.5,.5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| Size = UDim2.fromScale(.45,.45), | |
| BackgroundTransparency = 1, | |
| Colors_Primary = {"ImageColor3"}, | |
| Tags = {"Colors_Primary"} | |
| }), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| })), ui:AddInstance("Frame", { | |
| BackgroundColor3 = Color3.fromHex("#FFFFFF"), | |
| Size = UDim2.new(.075, 0, 1, 0), | |
| BackgroundTransparency = 0 | |
| }, ui:AddInstance("UIGradient", { | |
| Rotation = 0, | |
| Color = ColorSequence.new({ | |
| ColorSequenceKeypoint.new(0, Color3.new()), | |
| ColorSequenceKeypoint.new(1, Color3.new()) | |
| }), | |
| Transparency = NumberSequence.new({ | |
| NumberSequenceKeypoint.new(0, .5), | |
| NumberSequenceKeypoint.new(1, 1) | |
| }) | |
| })), ui:AddInstance("Frame", { | |
| Id = "InnerMain", | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = utils:GetSafeScreenRatio(), | |
| Id = "SafeRatio" | |
| }), ui:AddInstance("ImageLabel", { | |
| Id = "MainLogo", | |
| Position = UDim2.fromScale(.5, .03), | |
| AnchorPoint = Vector2.new(.5, 0), | |
| Size = UDim2.fromScale(.3, .08), | |
| BackgroundTransparency = 1, | |
| ScaleType = Enum.ScaleType.Fit, | |
| Image = "rbxassetid://102982068367172" | |
| }), ui:AddInstance("Frame", { | |
| Id = "Sidebar", | |
| BackgroundColor3 = Color3.fromHex("#FFFFFF"), | |
| Size = UDim2.new(.075, 0, 1, 0), | |
| BackgroundTransparency = 1 | |
| }, framework.protected:GCProtect(function() | |
| local btns = {} | |
| for i, page in ipairs(pages) do | |
| local idx = ui.navbarOffset +(i-1)/8.1 | |
| page.Indicator = idx | |
| local pos = UDim2.fromScale(.5, idx) | |
| local btn = ui:AddComponent("SideBtn", { | |
| Id = `SideBtn_{page.Name}`, | |
| Image = page.Icon, | |
| LayoutOrder = i, | |
| Position = pos, | |
| OnClick = framework.protected:GCProtect(function() | |
| showPage(`Page_{page.Name}`, idx) | |
| utils:AnimateCascade(ui:Get(`SideBtn_{page.Name}`).instance, { | |
| SkipTransparency = true | |
| }) | |
| end) | |
| }) | |
| page.Internal = btn | |
| framework.utils.tables.insert(btns, btn) | |
| end | |
| return btns | |
| end), ui:AddInstance("ImageLabel", { | |
| Id = "Indicator", | |
| Position = UDim2.fromScale(.05, 0), | |
| AnchorPoint = Vector2.new(.5,.25), | |
| Size = UDim2.fromScale(1, 1), | |
| Image = "rbxassetid://71605317317599", | |
| BackgroundTransparency = 1, | |
| Colors_Primary = {"ImageColor3"}, | |
| Tags = {"Colors_Primary"} | |
| }, ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }))), ui:AddInstance("Frame", { | |
| Id = "ContentFrame", | |
| Position = UDim2.fromScale(1, 0), | |
| AnchorPoint = Vector2.new(1, 0), | |
| Size = UDim2.fromScale(1, 1), | |
| BackgroundTransparency = 1 | |
| }, ui:AddInstance("UIPageLayout", { | |
| Id = "MainPages", | |
| FillDirection = Enum.FillDirection.Vertical, | |
| EasingDirection = Enum.EasingDirection.Out, | |
| SortOrder = Enum.SortOrder.LayoutOrder, | |
| EasingStyle = Enum.EasingStyle.Linear, | |
| TweenTime = tweens.default.Time, | |
| ScrollWheelInputEnabled = false, | |
| GamepadInputEnabled = false, | |
| TouchInputEnabled = false, | |
| Circular = false, | |
| }), framework.protected:GCProtect(function() | |
| local contents = {} | |
| for i, page in ipairs(pages) do | |
| local frame = page.Content | |
| frame:SetId(`Page_{page.Name}`) | |
| frame.instance.LayoutOrder = i | |
| frame.instance.BackgroundTransparency = 1 | |
| frame.instance.Size = UDim2.fromScale(1, 1) | |
| framework.utils.tables.insert(contents, frame) | |
| end | |
| return contents | |
| end))), ui:AddInstance("UIAspectRatioConstraint", { | |
| Id = "Ratio169", | |
| AspectRatio = 1.777 | |
| }), ui:AddInstance("UICorner", { | |
| Id = "MainCorner", | |
| CornerRadius = UDim.new(.075, 0) | |
| })):SetDraggable(true) | |
| --------------------------------------------------- | |
| utils:AddSlimeEffect(ui:Get("MainFrame"), { | |
| All = { | |
| ui:Get("SideBtn_ArceusIntelligence"), | |
| ui:Get("SideBtn_Extensions"), | |
| ui:Get("SideBtn_ScriptHub"), | |
| ui:Get("SideBtn_Executor"), | |
| ui:Get("SideBtn_Settings"), | |
| ui:Get("MaximizeButton"), | |
| ui:Get("SideBtn_Home"), | |
| ui:Get("CloseButton"), | |
| ui:Get("MainLogo") | |
| -- ui:Get("SideNavButton"), | |
| -- ui:Get("Indicator"), | |
| }, | |
| [pages[1]] = { | |
| ui:Get("BestScriptsPanelBackground"), | |
| ui:Get("SlidersContainerBackground"), | |
| ui:Get("ProfilePanelBackground"), | |
| ui:Get("HomeTipBackground"), | |
| ui:Get("AIPanelBackground") | |
| }, | |
| [pages[2]] = { | |
| ui:Get("EditorSSExecuteButtonShadow"), | |
| ui:Get("EditorConsoleButtonShadow"), | |
| ui:Get("EditorExecuteButtonShadow"), | |
| ui:Get("EditorPasteButtonShadow"), | |
| ui:Get("EditorClearButtonShadow"), | |
| ui:Get("EditorCopyButtonShadow"), | |
| ui:Get("EditorSaveButtonShadow"), | |
| ui:Get("EditorAIButtonShadow"), | |
| ui:Get("DeleteFileButton"), | |
| ui:Get("FavouriteButton"), | |
| ui:Get("CategoryButtons"), | |
| ui:Get("EditorAIButton"), | |
| ui:Get("TabsSearchBox"), | |
| ui:Get("NewFileButton"), | |
| ui:Get("CategoryTitle"), | |
| ui:Get("EditorSideBar"), | |
| ui:Get("TabsList"), | |
| ui:Get("Editor") | |
| }, | |
| [pages[3]] = { | |
| ui:Get("ScriptHubScroll"), | |
| ui:Get("NewScriptButton"), | |
| ui:Get("NewFolderButton"), | |
| ui:Get("CloudSearchBox"), | |
| ui:Get("ScriptsSwitch") | |
| }, | |
| [pages[4]] = { | |
| ui:Get("AITipsPanelBackground"), | |
| ui:Get("AIChatPanelBackground"), | |
| ui:Get("AIPanelBackground2"), | |
| ui:Get("AIResponseTitle"), | |
| ui:Get("AITipsSubtitle"), | |
| ui:Get("AITipsButton"), | |
| ui:Get("AITipsTitle"), | |
| ui:Get("TrackArtist"), | |
| ui:Get("TrackSlider"), | |
| ui:Get("AITipsText"), | |
| ui:Get("AIResponse"), | |
| ui:Get("TrackTitle"), | |
| ui:Get("TrackTime"), | |
| ui:Get("AIIcon2"), | |
| ui:Get("AIBox") | |
| }, | |
| [pages[5]] = { | |
| ui:Get("ExtensionDetachButton"), | |
| ui:Get("ExtensionBackButton"), | |
| ui:Get("ExtensionContent"), | |
| ui:Get("ExtensionPage"), | |
| ui:Get("ExtensionHome") | |
| }, | |
| [pages[6]] = { | |
| ui:Get("SettingsTitle"), | |
| ui:Get("SettingsSubtitle"), | |
| ui:Get("Setting_PrimaryColor"), | |
| --ui:Get("Setting_SecondaryColor"), | |
| --ui:Get("Setting_Translate"), | |
| ui:Get("Setting_EditorTextSize"), | |
| ui:Get("Setting_DisableIntro"), | |
| ui:Get("Setting_Afk"), | |
| --ui:Get("Setting_ConfirmationPopup"), | |
| ui:Get("Setting_FPSCap"), | |
| ui:Get("Setting_Links") | |
| } | |
| }) | |
| task.spawn(function() | |
| local Players = framework.protected:GetService("Players") | |
| local img1, img2 = ui:Get("UserPFP"), ui:Get("UserPFP2") | |
| local player = Players.LocalPlayer | |
| local userId = player.UserId | |
| local thumbType = Enum.ThumbnailType.AvatarBust | |
| local thumbSize = Enum.ThumbnailSize.Size420x420 | |
| local success, content, isReady = pcall(function() | |
| return Players:GetUserThumbnailAsync(userId, thumbType, thumbSize) | |
| end) | |
| if success and isReady then | |
| img1.instance.Image = content | |
| if not img2 or not img2.instance then | |
| return | |
| end | |
| img2.instance.Image = content | |
| end | |
| end) | |
| do -- Floating icon | |
| local btns = framework.protected:GCProtect({}) | |
| local debounce = false | |
| local ficon | |
| ficon = ui:AddInstance("ImageButton", { | |
| Id = "FloatingIcon", | |
| Position = UDim2.fromScale(.75, .75), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Size = UDim2.fromScale(.25, .25), | |
| BackgroundTransparency = 1, | |
| AutoButtonColor = false, | |
| Visible = false | |
| }, framework.protected:GCProtect(function() | |
| for i, page in ipairs(pages) do | |
| local id = `Page_{page.Name}` | |
| local image = ui:AddInstance("ImageLabel", { | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5, .5), | |
| ScaleType = Enum.ScaleType.Fit, | |
| Size = UDim2.fromScale(.3, .3), | |
| BackgroundTransparency = 1, | |
| Image = page.Icon | |
| }) | |
| local btn = ui:AddInstance("ImageButton", { | |
| Id = `SubIcon_{page.Name}`, | |
| BackgroundTransparency = 1, | |
| ImageTransparency = .5, | |
| AnchorPoint = Vector2.new(.5, .5), | |
| Position = UDim2.fromScale(.5, .5), | |
| Size = UDim2.fromScale(.65, .65), | |
| AutoButtonColor = false, | |
| LayoutOrder = i, | |
| Visible = false, | |
| ZIndex = i, | |
| MouseButton1Click = framework.protected:GCProtect(function() | |
| if debounce then return end | |
| ficon.toggle(false); | |
| ui.open(); showPage(id, page.Indicator) | |
| end) | |
| }, image, ui:AddInstance("UICorner", { | |
| CornerRadius = UDim.new(1, 0) | |
| }), ui:AddInstance("UIAspectRatioConstraint")) | |
| --btn.ImageLabel = image | |
| page.External = btn | |
| framework.utils.tables.insert(btns, btn) | |
| end | |
| return btns | |
| end), ui:AddInstance("UIAspectRatioConstraint", { | |
| AspectRatio = 1 | |
| }), ui:AddInstance("ImageLabel", { | |
| Id = "FloatingIconLogo", | |
| Image = "rbxassetid://102982068367172", | |
| Size = UDim2.fromScale(.3,.3), | |
| Position = UDim2.fromScale(.5, .5), | |
| AnchorPoint = Vector2.new(.5,.5), | |
| ScaleType = Enum.ScaleType.Fit, | |
| ImageTransparency = .25, | |
| BackgroundTransparency = 1 | |
| })):SetDraggable(true) | |
| -- Animation | |
| local elapsed, animDuration, spinSpeed = 0, .5, 5 | |
| local lastState = false | |
| local animation | |
| local compute = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(i: number, t: number) | |
| local additional_angle = framework.utils.maths.lerp(0, 1, t) | |
| local angle = (i *(2 *framework.utils.maths.pi /#btns)) +framework.utils.maths.pi -(additional_angle *spinSpeed %360) | |
| local floatingIconRadius = ficon.instance.Size.X.Scale /2 | |
| local subIconRadius = btns[1].instance.Size.X.Scale /2 | |
| local distance = framework.utils.maths.lerp(0, floatingIconRadius +3 *subIconRadius/2, t) | |
| local xScale = .5 +framework.utils.maths.cos(angle) *distance | |
| local yScale = .5 +framework.utils.maths.sin(angle) *distance | |
| return UDim2.fromScale(xScale, yScale) | |
| end)) | |
| animation = framework.renderer:BindToRenderer(ficon.id, nil, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(delta: number) | |
| elapsed += delta | |
| if elapsed > animDuration then | |
| animation:Pause() | |
| elapsed = 0 | |
| if not lastState then | |
| for _, icon in ipairs(btns) do | |
| icon.instance.Visible = false | |
| end | |
| end | |
| debounce = false | |
| return | |
| end | |
| local t = elapsed /animDuration | |
| local subIconTransparency, imageTransparency | |
| if lastState then | |
| subIconTransparency = framework.utils.maths.lerp(1, .5, framework.utils.maths.outExpo(t)) | |
| imageTransparency = 1 -framework.utils.maths.outExpo(t) | |
| else | |
| subIconTransparency = framework.utils.maths.lerp(.5, 1, framework.utils.maths.outExpo(t)) | |
| imageTransparency = framework.utils.maths.outExpo(t) | |
| end | |
| if not lastState then | |
| t = 1-t | |
| end | |
| for i, icon in ipairs(btns) do | |
| icon.instance.Position = compute(i, t) | |
| --icon.ImageLabel.instance.ImageTransparency = imageTransparency | |
| --icon.instance.BackgroundTransparency = subIconTransparency | |
| end | |
| end))) | |
| -- Interaction | |
| ficon.toggle = framework.protected:GCProtect(function(status: boolean) | |
| if debounce then return end | |
| debounce = true | |
| if status ~= nil then | |
| lastState = status | |
| else | |
| lastState = not lastState | |
| end | |
| if lastState then | |
| for _, icon in ipairs(btns) do | |
| icon.instance.Visible = true | |
| end | |
| end | |
| animation:Render() | |
| if lastState then | |
| utils:AnimateCascade(ficon, { | |
| ScaleCascade = true, | |
| ScaleDirection = "In", | |
| EnterTweenInfo = TweenInfo.new(.1, Enum.EasingStyle.Linear, Enum.EasingDirection.Out), | |
| TweenInfo = TweenInfo.new(.4, Enum.EasingStyle.Back, Enum.EasingDirection.Out), | |
| SkipTransparency = true, | |
| DelayBetween = .005 | |
| }) | |
| else | |
| utils:AnimateCascade(ficon, { | |
| ScaleCascade = true, | |
| ScaleDirection = "Out", | |
| EnterTweenInfo = TweenInfo.new(.1, Enum.EasingStyle.Linear, Enum.EasingDirection.Out), | |
| TweenInfo = TweenInfo.new(.25, Enum.EasingStyle.Back, Enum.EasingDirection.In), | |
| SkipTransparency = true, | |
| DelayBetween = .005 | |
| }) | |
| end | |
| end) | |
| local holdable = framework.utils.inputs.buttons.holdable(ficon, false) | |
| holdable.OnShortPress:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(elapsed) | |
| if debounce then return end | |
| ficon.toggle(false) | |
| ui.open() | |
| end))) | |
| holdable.OnLongPress:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(clickTime: number) | |
| if clickTime > 1 then return end | |
| ficon.toggle() | |
| for _, icon in ipairs(btns) do icon.Visible = false end | |
| end))) | |
| -- Init | |
| local page = pages[1] | |
| utils.currentPage = page | |
| showPage(`Page_{page.Name}`, page.Indicator) | |
| showNavbar(true) | |
| end | |
| do -- Cloud Scripts | |
| local scriptsgrid, scriptslist, searchbox = ui:Get("ScriptsGrid"), ui:Get("CloudBestScriptsBar"), ui:Get("CloudSearchBox") | |
| local RunService: RunService = framework.protected:GetService("RunService") | |
| local cloudscripts = framework.dependencies.cloudscripts | |
| local deb1, deb2 = false, false | |
| cloudscripts.OnFetched:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(results: {any}, refreshed: boolean, scope: string) | |
| if scope ~= "topbar" or searchbox.mode ~= "cloudscripts" or deb1 then return end | |
| searchbox.loading = true | |
| deb1 = true | |
| if refreshed then | |
| scriptslist:ClearScripts() | |
| if #results < 1 then | |
| scriptslist:AddScript({ | |
| Description = utils:Translate({"No scripts found","Nessuno script trovato","Không tìm thấy kịch bản","Nenhum script encontrado","Tidak ada skrip yang ditemukan","Скрипты не найдены","Keine Skripte gefunden","No se encontraron scripts","Aucun script trouvé","未找到脚本","スクリプトが見つかりません","لم يتم العثور على سكربتات","कोई स्क्रिप्ट नहीं मिली","ไม่พบสคริปต์"}), | |
| Title = utils:Translate({"No results","Nessun risultato","Không có kết quả","Sem resultados","Tidak ada hasil","Нет результатов","Keine Ergebnisse","Sin resultados","Aucun résultat","无结果","結果がありません","لا توجد نتائج","कोई परिणाम नहीं","ไม่พบผลลัพธ์"}), | |
| NoFav = true | |
| }) | |
| scriptslist:UpdateList() --:Move(1) | |
| searchbox.loading = false | |
| deb1 = false | |
| return | |
| end | |
| end | |
| for _, info in ipairs(results) do | |
| local img | |
| img = scriptslist:AddScript({ | |
| OnFavourite = info.setFavourite, | |
| IsFavourite = info.isFavourite, | |
| Description = info.game, | |
| Title = info.title, | |
| Slug = info.slug, | |
| Image = info.image, | |
| Callback = function() | |
| utils:ShowPopup("CloudScriptInfo", info, { | |
| component = img | |
| }) | |
| end | |
| }):GetObject() | |
| info.loadImage(img.instance, true) | |
| RunService.Stepped:Wait() | |
| end | |
| scriptslist:UpdateList() | |
| searchbox.loading = false | |
| deb1 = false | |
| end))) | |
| cloudscripts.OnFetched:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(results: {any}, refreshed: boolean, scope: string) | |
| if scope ~= "grid" or searchbox.mode ~= "cloudscripts" or deb2 then return end | |
| searchbox.loading = true | |
| deb2 = true | |
| if refreshed then | |
| for _, v in ipairs(scriptsgrid.instance:GetChildren()) do | |
| if not v:IsA("UIGridLayout") then v:Destroy() end | |
| end | |
| if #results < 1 then | |
| ui:AddComponent("ScriptObj", { | |
| Description = utils:Translate({"No scripts found","Nessuno script trovato","Không tìm thấy kịch bản","Nenhum script encontrado","Tidak ada skrip yang ditemukan","Скрипты не найдены","Keine Skripte gefunden","No se encontraron scripts","Aucun script trouvé","未找到脚本","スクリプトが見つかりません","لم يتم العثور على سكربتات","कोई स्क्रिप्ट नहीं मिली","ไม่พบสคริปต์"}), | |
| Title = utils:Translate({"No results","Nessun risultato","Không có kết quả","Sem resultados","Tidak ada hasil","Нет результатов","Keine Ergebnisse","Sin resultados","Aucun résultat","无结果","結果がありません","لا توجد نتائج","कोई परिणाम नहीं","ไม่พบผลลัพธ์"}), | |
| Parent = scriptsgrid, | |
| NoFav = true | |
| }) | |
| searchbox.loading = false | |
| deb2 = false | |
| return | |
| end | |
| end | |
| for i, info in ipairs(results) do | |
| local comp | |
| comp = ui:AddComponent("ScriptObj", { | |
| OnFavourite = info.setFavourite, | |
| IsFavourite = info.isFavourite, | |
| Description = info.game, | |
| Parent = scriptsgrid, | |
| Image = info.image, | |
| Title = info.title, | |
| Slug = info.slug, | |
| LayoutOrder = i, | |
| OnClick = function() | |
| utils:ShowPopup("CloudScriptInfo", info, { | |
| component = comp | |
| }) | |
| end | |
| }) | |
| info.loadImage(comp.instance, true) | |
| RunService.Stepped:Wait() | |
| end | |
| searchbox.loading = false | |
| deb2 = false | |
| end))) | |
| -- Grid cell size | |
| local scriptslayout = ui:Get("ScriptsGridLayout").instance | |
| local updateCells = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function() | |
| local x = scriptsgrid.instance.AbsoluteSize.X /3 -padding *3 | |
| scriptslayout.CellSize = UDim2.fromOffset(x, 9 *x /16) | |
| end)) | |
| updateCells() | |
| scriptsgrid.instance:GetPropertyChangedSignal("AbsoluteSize"):Connect(updateCells) | |
| -- Load more | |
| local scripthubscroll: ScrollingFrame = ui:Get("ScriptHubScroll").instance | |
| scripthubscroll:GetPropertyChangedSignal("CanvasPosition"):Connect(LPH_NO_VIRTUALIZE(function() | |
| if framework.utils.maths.floor(scripthubscroll.AbsoluteCanvasSize.Y -scripthubscroll.CanvasPosition.Y) | |
| == framework.utils.maths.floor(scripthubscroll.AbsoluteSize.Y) | |
| then | |
| if searchbox.mode == "serverside" then | |
| return framework.dependencies.serverside:GetGames() | |
| elseif scriptsgrid.lastQuery then | |
| scriptsgrid.lastQuery:Fetch() | |
| end | |
| end | |
| end)) | |
| end | |
| do -- Script Hub | |
| local scriptsgrid, scriptslist, searchbox = ui:Get("ScriptsGrid"), ui:Get("CloudBestScriptsBar"), ui:Get("CloudSearchBox") | |
| local scripthub = framework.dependencies.scripthub | |
| local clearScripts = framework.protected:GCProtect(function() | |
| scriptslist:ClearScripts() | |
| for _, v in ipairs(scriptsgrid.instance:GetChildren()) do | |
| if not v:IsA("UIGridLayout") then v:Destroy() end | |
| end | |
| end) | |
| local noResults = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(results) | |
| if #results < 1 then | |
| scriptslist:AddScript({ | |
| Description = utils:Translate({"No files found","Nessun file trovato","Không tìm thấy tệp nào","Nenhum arquivo encontrado","Tidak ada file yang ditemukan","Файлы не найдены","Keine Dateien gefunden","No se encontraron archivos","Aucun fichier trouvé","未找到文件","ファイルが見つかりません","لم يتم العثور على ملفات","कोई फ़ाइलें नहीं मिलीं","ไม่พบไฟล์"}), | |
| Title = utils:Translate({"No results","Nessun risultato","Không có kết quả","Sem resultados","Tidak ada hasil","Нет результатов","Keine Ergebnisse","Sin resultados","Aucun résultat","无结果","結果がありません","لا توجد نتائج","कोई परिणाम नहीं","ไม่พบผลลัพธ์"}), | |
| IsLocal = true, | |
| NoFav = true | |
| }) | |
| ui:AddComponent("ScriptObj", { | |
| Description = utils:Translate({"No files found","Nessun file trovato","Không tìm thấy tệp nào","Nenhum arquivo encontrado","Tidak ada file yang ditemukan","Файлы не найдены","Keine Dateien gefunden","No se encontraron archivos","Aucun fichier trouvé","未找到文件","ファイルが見つかりません","لم يتم العثور على ملفات","कोई फ़ाइलें नहीं मिलीं","ไม่พบไฟล์"}), | |
| Title = utils:Translate({"No results","Nessun risultato","Không có kết quả","Sem resultados","Tidak ada hasil","Нет результатов","Keine Ergebnisse","Sin resultados","Aucun résultat","无结果","結果がありません","لا توجد نتائج","कोई परिणाम नहीं","ไม่พบผลลัพธ์"}), | |
| Parent = scriptsgrid, | |
| IsLocal = true, | |
| NoFav = true | |
| }) | |
| scriptslist:UpdateList() --:Move(1) | |
| return true | |
| end | |
| end)) | |
| local runService = framework.protected:GetService("RunService") | |
| local loadScripts = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(results) | |
| for i, info in ipairs(results) do | |
| local popup = {} | |
| local props = { | |
| IsFavourite = info:GetProperty("favourite"), | |
| Description = info.path, | |
| Parent = scriptsgrid, | |
| Title = info.name, | |
| Slug = info.path, | |
| LayoutOrder = i, | |
| IsLocal = true, | |
| OnClick = function() | |
| utils:ShowPopup("LocalScriptInfo", info, popup) | |
| end, | |
| OnDelete = function() | |
| info:Delete() | |
| popup.component:Remove() | |
| end, | |
| OnFavourite = function() | |
| local status = not (info:GetProperty("favourite") and true or false) | |
| info:SetProperty({ favourite = status }) | |
| runService.Heartbeat:Wait() | |
| framework.dependencies.scripthub:Browse(nil, true, "scripthub") | |
| return status | |
| end | |
| } | |
| props.Callback = props.OnClick | |
| popup.component = ui:AddComponent("ScriptObj", props) | |
| local _, content = info:Read() | |
| content = content or {} | |
| if info:GetProperty("favourite") | |
| or framework.utils.tables.find(content.games or {}, game.GameId) | |
| or framework.utils.tables.find(content.places or {}, game.PlaceId) | |
| then | |
| scriptslist:AddScript(props) | |
| end | |
| end | |
| scriptslist:UpdateList() | |
| end)) | |
| local loadFolders = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(results) | |
| for i, info in ipairs(results) do | |
| ui:AddComponent("ScriptObj", { | |
| LayoutOrder = -100000 +i, | |
| Description = info.path, | |
| Parent = scriptsgrid, | |
| IsFavourite = true, | |
| Title = info.name, | |
| IsFolder = true, | |
| IsLocal = true, | |
| NoFav = true, | |
| OnClick = function() | |
| info:Open() | |
| end | |
| }) | |
| end | |
| end)) | |
| scripthub.OnQueried:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(results: {any}, scope: string) | |
| if (scope ~= "scripthub" and scope ~= "any") or searchbox.mode ~= "scripthub" then return end | |
| clearScripts() | |
| if noResults(results) then return end | |
| loadScripts(results) | |
| end))) | |
| scripthub.OnBrowsed:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(results: {any}, directories: {any}, scope: string) | |
| if (scope ~= "scripthub" and scope ~= "any") or searchbox.mode ~= "scripthub" then return end | |
| ui:Get("PathBar"):SetPath(directories) | |
| clearScripts() | |
| loadFolders(results.folders) | |
| if noResults(results.files) then return end | |
| loadScripts(results.files) | |
| end))) | |
| end | |
| do -- ServerSide games | |
| local serverside = framework.dependencies.serverside | |
| local scriptsgrid, scriptslist = ui:Get("ScriptsGrid"), ui:Get("CloudBestScriptsBar") | |
| local searchbox = ui:Get("CloudSearchBox") | |
| local clearScripts = framework.protected:GCProtect(function() | |
| scriptslist:ClearScripts() | |
| for _, v in ipairs(scriptsgrid.instance:GetChildren()) do | |
| if not v:IsA("UIGridLayout") then v:Destroy() end | |
| end | |
| end) | |
| local loadMore = framework.protected:GCProtect(function() | |
| if searchbox.mode ~= "serverside" then return end | |
| serverside:GetGames() | |
| end) | |
| serverside.OnMessage:Connect(framework.protected:GCProtect(function(msg, arg2, ...: any) | |
| if msg == "Connected" then | |
| ui:Get("EditorSSExecuteButtonShadow").instance.Visible = true | |
| return | |
| elseif msg == "CodeError" then | |
| return utils:ShowToast("ButtonToast", { | |
| AdditionalText = {tostring(arg2)}, | |
| AdditionalTitle = {"SS Script Error"} | |
| }) | |
| end | |
| end)) | |
| serverside.OnFetched:Connect(framework.protected:GCProtect(function(games: {any}, more: boolean) | |
| if searchbox.mode ~= "serverside" then return end | |
| searchbox.loading = true | |
| if not more then | |
| clearScripts() | |
| end | |
| if #games < 1 and not more then | |
| scriptslist:AddScript({ | |
| Description = utils:Translate({"No games found","Nessun gioco trovato","Không tìm thấy trò chơi","Nenhum jogo encontrado","Tidak ada game yang ditemukan","Игры не найдены","Keine Spiele gefunden","No se encontraron juegos","Aucun jeu trouvé","未找到游戏","ゲームが見つかりません","لم يتم العثور على ألعاب","कोई गेम नहीं मिला","ไม่พบเกม"}), | |
| Title = utils:Translate({"No results","Nessun risultato","Không có kết quả","Sem resultados","Tidak ada hasil","Нет результатов","Keine Ergebnisse","Sin resultados","Aucun résultat","无结果","結果がありません","لا توجد نتائج","कोई परिणाम नहीं","ไม่พบผลลัพธ์"}), | |
| IsLocal = true, | |
| NoFav = true | |
| }) | |
| ui:AddComponent("ScriptObj", { | |
| Description = utils:Translate({"No games found","Nessun gioco trovato","Không tìm thấy trò chơi","Nenhum jogo encontrado","Tidak ada game yang ditemukan","Игры не найдены","Keine Spiele gefunden","No se encontraron juegos","Aucun jeu trouvé","未找到游戏","ゲームが見つかりません","لم يتم العثور على ألعاب","कोई गेम नहीं मिला","ไม่พบเกม"}), | |
| Title = utils:Translate({"No results","Nessun risultato","Không có kết quả","Sem resultados","Tidak ada hasil","Нет результатов","Keine Ergebnisse","Sin resultados","Aucun résultat","无结果","結果がありません","لا توجد نتائج","कोई परिणाम नहीं","ไม่พบผลลัพธ์"}), | |
| Parent = scriptsgrid, | |
| IsLocal = true, | |
| NoFav = true | |
| }) | |
| scriptslist:UpdateList() | |
| searchbox.loading = false | |
| return | |
| end | |
| for i, info in ipairs(games) do | |
| local props = { | |
| Description = "Server-Sided Game", | |
| Title = `{info.plrs} 👤 Plrs`, | |
| Parent = scriptsgrid, | |
| OnLoad = loadMore, | |
| LayoutOrder = i, | |
| NoFav = true, | |
| OnClick = function() | |
| utils:ShowToast("ButtonToast", { | |
| AdditionalText = {"Confirm to join the game","Conferma per entrare nel gioco","Xác nhận để tham gia trò chơi","Confirmar para entrar no jogo","Konfirmasi untuk bergabung dalam permainan","Подтвердите, чтобы присоединиться к игре","Bestätigen, um dem Spiel beizutreten","Confirmar para unirse al juego","Confirmer pour rejoindre le jeu","确认加入游戏","ゲームに参加することを確認","تأكيد الانضمام إلى اللعبة","खेल में शामिल होने की पुष्टि करें","ยืนยันการเข้าร่วมเกม"}, | |
| Style = "confirm", | |
| Callback = function(res: boolean) | |
| if not res then return end | |
| serverside:TeleportTo(info.id) | |
| end | |
| }) | |
| end | |
| } | |
| props.Callback = props.OnClick | |
| local img = scriptslist:AddScript(props):GetObject() | |
| info.loadImage(img.instance, true) | |
| img = ui:AddComponent("ScriptObj", props) | |
| info.loadImage(img.instance, true) | |
| end | |
| scriptslist:UpdateList() | |
| searchbox.loading = false | |
| end)) | |
| end | |
| do -- Best Scripts | |
| local cloudscripts = framework.dependencies.cloudscripts | |
| local bestscripts = ui:Get("BestScriptsBar") | |
| local query = cloudscripts.newQuery(game.GameId, { | |
| verify = framework.enums.ScriptBloxVerify.Verified, | |
| patch = framework.enums.ScriptBloxPatch.Unpatched, | |
| search = framework.enums.ScriptBloxSearch.None, | |
| type = framework.enums.ScriptBloxType.Specific, | |
| sortBy = framework.enums.ScriptBloxSort.Views, | |
| order = framework.enums.ScriptBloxOrder.Desc, | |
| auth = framework.enums.ScriptBloxAuth.None, | |
| mode = framework.enums.ScriptBloxMode.Free | |
| }) | |
| task.defer(LPH_NO_VIRTUALIZE(function() | |
| repeat task.wait() until ui.Loaded | |
| local scripts = query:Fetch() | |
| if #scripts < 3 then | |
| scripts = cloudscripts:FetchTrending() | |
| if #scripts < 3 then | |
| bestscripts:AddScript({ | |
| Description = utils:Translate({"Try again later.","Riprova più tardi.","Thử lại sau.","Tente novamente mais tarde.","Coba lagi nanti.","Попробуйте позже.","Versuchen Sie es später noch einmal.","Inténtalo de nuevo más tarde.","Réessayez plus tard.","稍后再试。","後でもう一度お試しください。","حاول مرة أخرى لاحقًا.","बाद में पुन: प्रयास करें।","ลองใหม่ภายหลัง"}), | |
| Title = utils:Translate({"No results","Nessun risultato","Không có kết quả","Sem resultados","Tidak ada hasil","Нет результатов","Keine Ergebnisse","Sin resultados","Aucun résultat","无结果","結果がありません","لا توجد نتائج","कोई परिणाम नहीं","ไม่พบผลลัพธ์"}), | |
| NoFav = true, | |
| Callback = function() | |
| -- Popup, "No results were found, try again later." | |
| end | |
| }) | |
| return bestscripts:UpdateList() | |
| end | |
| end | |
| for _, info in ipairs(scripts) do | |
| local img | |
| img = bestscripts:AddScript({ | |
| OnFavourite = info.setFavourite, | |
| IsFavourite = info.isFavourite, | |
| Description = info.game, | |
| Title = info.title, | |
| Slug = info.slug, | |
| Image = info.image, | |
| Callback = function() | |
| utils:ShowPopup("CloudScriptInfo", info, { | |
| component = img | |
| }) | |
| end | |
| }):GetObject() | |
| info.loadImage(img.instance, true) | |
| end | |
| bestscripts:UpdateList() | |
| end)) | |
| end | |
| do -- Plugins | |
| local grid, page, content = ui:Get("ExtensionHome"), ui:Get("ExtensionPage"), ui:Get("ExtensionContent") | |
| local backButton, detachButton = ui:Get("ExtensionBackButton"), ui:Get("ExtensionDetachButton") | |
| local plugins = framework.dependencies.plugins | |
| --local parent = ui:Get("Plugins").instance | |
| plugins.OnPluginAtached:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(plug: {any}) | |
| backButton.instance.Visible = true | |
| detachButton.instance.Visible = true | |
| content.instance.Visible = true | |
| page.instance.Visible = false | |
| end))) | |
| plugins.OnPluginDetached:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(plug: {any}) | |
| backButton.instance.Visible = false | |
| detachButton.instance.Visible = false | |
| content.instance.Visible = false | |
| page.instance.Visible = true | |
| end))) | |
| plugins.OnPluginAdded:Connect(framework.protected:GCProtect(function(data: {any}) | |
| local title = data.title or "Extension" | |
| local component | |
| component = ui:AddComponent("ExtensionObj", { | |
| Image = data.icon or "", | |
| Parent = grid, | |
| Title = title, | |
| OnClick = function() | |
| plugins:Open(data.id, content) | |
| end, | |
| OnDelete = data.url and function() | |
| utils:ShowToast("ButtonToast", { | |
| AdditionalText = {`Uninstall {title}?`,`Disinstallare {title}?`,`Gỡ cài đặt {title}?`,`Desinstalar {title}?`,`Copot pemasangan {title}?`,`Удалить {title}?`,`Deinstalliere {title}?`,`¿Desinstalar {title}?`,`Désinstaller {title}?`,`卸载 {title}?`,`{title} をアンインストールしますか?`,`إلغاء تثبيت {title}؟`,`{title} अनइंस्टॉल करें?`,`ถอนการติดตั้ง {title}?`}, | |
| AdditionalTitle = {"Uninstall","Disinstalla","Gỡ cài đặt","Desinstalar","Copot pemasangan","Удалить","Deinstallieren","Desinstalar","Désinstaller","卸载","アンインストール","إلغاء التثبيت","अनइंस्टॉल","ถอนการติดตั้ง"}, | |
| Style = "confirm", | |
| Callback = function(res: boolean) | |
| if not res then return end | |
| plugins:Remove(data.id) | |
| component:Remove() | |
| end | |
| }) | |
| end | |
| }) | |
| end)) | |
| plugins.OnPluginLoaded:Connect(framework.protected:GCProtect(function(plug: {any}, id: string, ...: any) | |
| local infos = plugins:Setup(id, plug) | |
| plug:SetEnabled(false) | |
| infos:Attach(content) | |
| plug.OnClosed:Connect(framework.protected:GCProtect(function() | |
| infos:Attach(content) | |
| end)) | |
| plug.hide(true) | |
| --task.defer(plug.SetEnabled, plug, false) | |
| end)) | |
| end | |
| do -- Editor | |
| local editor = framework.utils.inputs.editors:Get("Main_Editor") | |
| local scripthub = framework.dependencies.scripthub | |
| local tabs = framework.dependencies.editortabs | |
| local UIS = framework.protected:GetService("UserInputService") | |
| local savedtabsoffset = 10000 -- slots for unsaved tabs | |
| local maxnamelength = 15 | |
| local background = ui:Get("BackgroundGlow") | |
| framework.execution.OnExecuted:Connect(framework.protected:GCProtect(function() | |
| background:Tween(tweens.default, { | |
| ImageColor3 = Color3.fromHex("#707070") | |
| }) | |
| task.delay(3, function() | |
| background:Tween(tweens.slow_default, { | |
| ImageColor3 = Color3.fromHex("#000"), | |
| }) | |
| end) | |
| end)) | |
| do -- Editor Saved Tabs | |
| local savedtabs = framework.protected:GCProtect({}) | |
| local formatName = framework.protected:GCProtect(function(name: string, unsaved: boolean?) | |
| if #name > maxnamelength then | |
| name = `{framework.utils.strings.sub(name, 1, maxnamelength)}..` | |
| end | |
| name ..= unsaved and " *" or "" | |
| return name | |
| end) | |
| local list, layout = ui:Get("TabsList"), ui:Get("TabsLayout") | |
| layout.instance:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(framework.protected:GCProtect(function() | |
| list.instance.CanvasSize = UDim2.fromOffset(0, layout.instance.AbsoluteContentSize.Y) | |
| end)) | |
| local leastOne = framework.protected:GCProtect(function() | |
| local res = #tabs:GetTabs() < 1 | |
| if res then editor:AddTab() end | |
| return res | |
| end) | |
| local addtab = framework.protected:GCProtect(function(idx: number, name: string, saved: boolean, src: string, meta: {any}?) | |
| local component = ui:AddComponent("ScriptTab", { | |
| LayoutOrder = idx, | |
| Parent = list, | |
| Title = name | |
| }) | |
| local textlbl = component.instance:FindFirstChildWhichIsA("TextLabel") | |
| local textbox = component.instance:FindFirstChildWhichIsA("TextBox") | |
| local tab, updated | |
| local actions = { | |
| [framework.enums.TabUpdate.Unselected] = function() | |
| local tb = UIS:GetFocusedTextBox() | |
| if tb then tb.FocusLost:Wait() end | |
| component:Unselect() | |
| end, | |
| [framework.enums.TabUpdate.Selected] = function() | |
| updated(framework.enums.TabUpdate.Source) | |
| component:Select() | |
| local data = tab:GetData() -- metti gli id delle immagini qui sure dw | |
| ui:Get("EditorSaveButton").instance.Image = data.isFile and framework.protected:ProtectAsset("rbxassetid://102895040094534") or framework.protected:ProtectAsset("rbxassetid://80105268646831") | |
| ui:Get("FavouriteButtonImage").instance.Image = tab:GetProperty("favourite") | |
| and framework.protected:ProtectAsset("rbxassetid://137934368112423") or "rbxassetid://80350699155696" | |
| end, | |
| [framework.enums.TabUpdate.Removed] = function() | |
| local found = framework.utils.tables.find(savedtabs, tab) | |
| if found then framework.utils.tables.remove(savedtabs, found) end | |
| component:Remove() | |
| leastOne() | |
| end, | |
| [framework.enums.TabUpdate.Source] = function() | |
| if tabs:GetSelection() == tab then | |
| editor:SetText(tab:GetSource()) | |
| end | |
| end, | |
| [framework.enums.TabUpdate.Name] = function() | |
| local name = tab:GetName() | |
| textlbl.Text = formatName(name, not tab:GetData().isFile) | |
| textbox.Text = name | |
| end | |
| } | |
| updated = function(updateType: number, ...) | |
| local action = actions[updateType] | |
| if action then action(...) end | |
| end | |
| tab = tabs:AddTab(name, src, component, updated, saved, meta) | |
| tab:GetData().instance = component | |
| updated(framework.enums.TabUpdate.Name) | |
| if saved then framework.utils.tables.insert(savedtabs, tab) end | |
| return tab | |
| end) | |
| local loadsaved = framework.protected:GCProtect(LPH_JIT_MAX(function(res: {any}) | |
| for _, tab in ipairs(framework.utils.tables.listCopy(savedtabs)) do tab:Remove() end | |
| for i, file in ipairs(res) do addtab(savedtabsoffset +i, file.name, true, file:Read()) end | |
| end)) | |
| function editor:AddTab(name: string?, src: string?, content: {any}?) | |
| local tab = addtab(#tabs:GetTabs() +1, name, false, src or "", content) | |
| tab:Select() | |
| return tab | |
| end | |
| tabs:LoadTabs(framework.protected:GCProtect(function(idx: number, name: string, source: string) | |
| return addtab(idx, name, false, source) | |
| end)) | |
| -- For saved tab files | |
| scripthub.OnQueried:Connect(framework.protected:GCProtect(function(res: {any}, scope: string) | |
| if scope ~= "tabs" and scope ~= "any" then return end | |
| loadsaved(res) | |
| end)) | |
| scripthub.OnBrowsed:Connect(framework.protected:GCProtect(function(res: {any}, dirs: {any}, scope: string) | |
| if scope ~= "tabs" and scope ~= "any" then return end | |
| loadsaved(res.files) | |
| end)) | |
| tabs:GetSaved("tabs") | |
| if not leastOne() then | |
| local all = tabs:GetTabs() | |
| all[#all]:Select() | |
| end | |
| end | |
| do -- Highlighter colors update | |
| --[[ | |
| ui.highColors = { -- vscode | |
| local_property = Color3.fromRGB(86, 156, 214), -- keywords: #569CD6 | |
| function_color = Color3.fromRGB(220, 220, 170), -- functions: #DCDCAA | |
| local_color = Color3.fromRGB(220, 220, 170), -- same as functions | |
| self_color = Color3.fromRGB(86, 156, 214), -- keywords variant | |
| self_call = Color3.fromRGB(86, 156, 214), -- same | |
| operator = Color3.fromRGB(214, 157, 133), -- operators | |
| comment = Color3.fromRGB(106, 153, 85), -- comments: #6A9955 | |
| boolean = Color3.fromRGB(214, 157, 133), -- booleans | |
| numbers = Color3.fromRGB(181, 206, 168), -- numbers: #B5CEA8 | |
| call = Color3.fromRGB(86, 156, 214), -- calls: same as keywords | |
| rbx = Color3.fromRGB(86, 156, 214), -- "rbx" library calls | |
| lua = Color3.fromRGB(78, 201, 176), -- maybe types: #4EC9B0 | |
| str = Color3.fromRGB(206, 145, 120), -- strings: #CE9178 | |
| null = Color3.fromRGB(79, 79, 79) -- literals | |
| }]] | |
| ui.highColors = { | |
| local_property = Color3.fromRGB(255, 98, 138), -- rosa/rosso AI (proprietà locali, parole chiave) | |
| function_color = Color3.fromRGB(255, 198, 91), -- oro caldo per funzioni | |
| local_color = Color3.fromRGB(223, 141, 255), -- lavanda neon (variabili locali) | |
| self_color = Color3.fromRGB(255, 105, 180), -- rosa shocking (self) | |
| self_call = Color3.fromRGB(255, 120, 150), -- rosso AI soft per :call | |
| operator = Color3.fromRGB(255, 92, 92), -- rosso vivo Arceus per simboli `=`, `+`, ecc. | |
| comment = Color3.fromRGB(149, 157, 185), -- grigio violaceo AI-style per commenti | |
| boolean = Color3.fromRGB(255, 128, 64), -- arancio vibrante per `true` / `false` | |
| numbers = Color3.fromRGB(122, 255, 180), -- verde acqua (contrasto neon leggibile) | |
| call = Color3.fromRGB(120, 185, 255), -- azzurro brillante per chiamate funzione | |
| rbx = Color3.fromRGB(185, 130, 255), -- viola Arceus/Roblox | |
| lua = Color3.fromRGB(140, 255, 230), -- turchese AI (per `Instance`, tipi, ecc.) | |
| str = Color3.fromRGB(255, 105, 140), -- rosa caldo per stringhe `"text"` | |
| null = Color3.fromRGB(90, 90, 90) -- grigio neutro scuro per `nil` | |
| } | |
| framework.settings:GetSettingChangedSignal("Colors_Primary"):Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(value: string, default: string) | |
| local succ, err = pcall(Color3.fromHex, value) | |
| value = succ and err or Color3.fromHex(default) | |
| -- set | |
| editor:SetHighlighterColors(ui.highColors) | |
| end))) | |
| end | |
| end | |
| do -- track player | |
| local trackplayer = framework.dependencies.track | |
| local timing = ui:Get("TrackTime").instance | |
| local audio = ui:AddInstance("Sound", { | |
| Id = "SoundTrack" | |
| }) | |
| trackplayer:Connect(audio) | |
| local slider = framework.utils.inputs.sliders.horizontal({ui:Get("TrackSlider")}, 0) | |
| slider.OnPercentageChanged:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(percent: number) | |
| trackplayer:SetTime(trackplayer:GetLenght() *percent) | |
| end))) | |
| trackplayer.OnTimeUpdated:Connect(framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function() | |
| local text, percent = trackplayer:GetTiming() | |
| slider:SetPercentage(percent, true) | |
| timing.Text = text | |
| end))) | |
| task.spawn(function() | |
| trackplayer:Play(102518604969857) | |
| trackplayer:Stop() | |
| end) | |
| end | |
| framework.utils.http.OnUrlOpened:Connect(framework.protected:GCProtect(function(url) | |
| framework.utils.clipboard:Set(url) | |
| utils:ShowToast("ButtonToast", { | |
| AdditionalText = {"Link copied to clipboard","Link copiato negli appunti","Liên kết đã sao chép vào khay nhớ tạm","Link copiado para a área de transferência","Tautan disalin ke clipboard","Ссылка скопирована в буфер обмена","Link in die Zwischenablage kopiert","Enlace copiado al portapapeles","Lien copié dans le presse-papiers","链接已复制到剪贴板","リンクがクリップボードにコピーされました","تم نسخ الرابط إلى الحافظة","लिंक क्लिपबोर्ड में कॉपी किया गया","ลิงก์ถูกคัดลอกไปยังคลิปบอร์ด"}, | |
| AdditionalTitle = {"Link copied","Link copiato","Liên kết đã sao chép","Enlace copiado","Tautan disalin","Ссылка скопирована","Link kopiert","Link copiado","Lien copié","链接已复制","リンクをコピーしました","تم نسخ الرابط","लिंक कॉपी किया गया","คัดลอกลิงก์แล้ว"} | |
| }) | |
| end)) | |
| --------------------------------------------------- | |
| local animator = framework.animator | |
| local aiColors = { | |
| {255, 0, 0}, | |
| {255, 56, 105}, | |
| {244, 115, 236}, | |
| {21, 166, 254}, | |
| {255, 56, 105}, | |
| {255, 0, 0}, | |
| } | |
| local getScaleFactor = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(resolution) | |
| return framework.utils.maths.min(resolution.X, resolution.Y) /utils:GetAnimationResolution("High").X | |
| end)) | |
| local smoothstep = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(edge0, edge1, x) | |
| local t = framework.utils.maths.clamp((x -edge0) /(edge1 -edge0), 0, 1) | |
| return t *t *(3 -2 *t) | |
| end)) | |
| local function sdRounded(px, py, L, T, R, B, cr) | |
| local dx = math.max(L+cr - px, 0, px - (R-cr)) | |
| local dy = math.max(T+cr - py, 0, py - (B-cr)) | |
| local outd = math.sqrt(dx*dx + dy*dy) - cr | |
| if dx==0 and dy==0 then | |
| return -math.min(px - L, R - px, py - T, B - py) | |
| end | |
| return outd | |
| end | |
| local getPaletteColor = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(p) | |
| local n = #aiColors | |
| local seg = p *n | |
| local i1 = framework.utils.maths.floor(seg) %n | |
| local i2 = (i1 +1) %n | |
| local frac = seg -framework.utils.maths.floor(seg) | |
| local c1 = aiColors[i1 +1] | |
| local c2 = aiColors[i2 +1] | |
| local r = c1[1] * (1 -frac) +c2[1] *frac | |
| local g = c1[2] * (1 -frac) +c2[2] *frac | |
| local b = c1[3] * (1 -frac) +c2[3] *frac | |
| return r, g, b | |
| end)) | |
| local sdfRoundedRect = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(px, py, w, h, cornerRadius) | |
| local cx = (px +.5) -w/2 | |
| local cy = (py +.5) -h/2 | |
| local rx = w/2 - cornerRadius | |
| local ry = h/2 - cornerRadius | |
| if rx < 0 then rx = 0 end | |
| if ry < 0 then ry = 0 end | |
| local dx = framework.utils.maths.abs(cx) -rx | |
| local dy = framework.utils.maths.abs(cy) -ry | |
| local outsideDist = framework.utils.maths.sqrt(framework.utils.maths.max(dx, 0)^2 + framework.utils.maths.max(dy, 0)^2) | |
| local insideDist = framework.utils.maths.min(framework.utils.maths.max(dx, dy), 0) | |
| return outsideDist + insideDist - cornerRadius | |
| end)) | |
| -- TOAST BACKGROUND GLOW ANIMATION (COMMENTED) | |
| do | |
| -- local image = ui:Get("ToastGlow") | |
| -- -- Parametri di personalizzazione (in unità per la risoluzione base, ad es. 128) | |
| -- local settings = { | |
| -- CornerRadiusRatio = .035, -- Percentuale del lato più corto | |
| -- InnerGlowRadius = 150, -- In "pixel base" (a 128) | |
| -- GlowSoftnessExponent = 30, | |
| -- GlowExtraAlpha = 10, | |
| -- GlowColor = { r = 255, g = 255, b = 255 }, | |
| -- BackgroundAlpha = .15*255, | |
| -- UseMultiColorGlow = false, | |
| -- SwirlSpeed = 1, | |
| -- GlowPulseAmplitude = .5, | |
| -- GlowPulseFrequency = .5, | |
| -- LeftGlowBoost = 1, -- Moltiplicatore per il glow a sinistra (1 = nessun boost) | |
| -- } | |
| -- -- Aggiungiamo l'animazione tramite il framework | |
| -- utils:AddAnimation(image.id, { | |
| -- Outputs = { image.instance }, | |
| -- Duration = 2.5, | |
| -- Resolution = Vector2.new(128, 72), | |
| -- RenderOnLoad = true, | |
| -- }, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, resolution, frameIndex, totalFrames) | |
| -- local w, h = resolution.X, resolution.Y | |
| -- local TWO_PI = framework.utils.maths.pi *2 | |
| -- local t = (frameIndex / totalFrames) *TWO_PI | |
| -- local scaleFactor = getScaleFactor(resolution) | |
| -- local effectiveCornerRadius = framework.utils.maths.min(w, h) * settings.CornerRadiusRatio | |
| -- animator.computePixels(resolution, function(idx, x, y) | |
| -- -- Calcola la distanza dal bordo del rettangolo arrotondato | |
| -- local shapeDist = sdfRoundedRect(x, y, w, h, effectiveCornerRadius) | |
| -- local d = framework.utils.maths.abs(shapeDist) | |
| -- -- Applica la scala ai parametri in pixel | |
| -- local scaledInnerGlow = settings.InnerGlowRadius * scaleFactor | |
| -- -- Se il pixel è nella metà sinistra, applica un boost (sempre scalato) | |
| -- local effectiveInnerGlowRadius = scaledInnerGlow | |
| -- if x < (w / 2) and settings.LeftGlowBoost>0 then | |
| -- local leftMultiplier = 1 + (settings.LeftGlowBoost - 1) * (1 - (x / (w / 2))) | |
| -- effectiveInnerGlowRadius = scaledInnerGlow * leftMultiplier | |
| -- end | |
| -- -- Calcola il fattore di glow in modo adattivo | |
| -- local factor = 0 | |
| -- if d < effectiveInnerGlowRadius then | |
| -- factor = 1 - (d / effectiveInnerGlowRadius) | |
| -- end | |
| -- local baseFade = factor ^ settings.GlowSoftnessExponent | |
| -- local pulse = 1 + settings.GlowPulseAmplitude * framework.utils.maths.sin(settings.GlowPulseFrequency * t) | |
| -- local finalFade = framework.utils.maths.clamp(baseFade * pulse, 0, 1) | |
| -- local r, g, b | |
| -- if settings.UseMultiColorGlow then | |
| -- local cx = (x + .5) - (w / 2) | |
| -- local cy = (y + .5) - (h / 2) | |
| -- local angle = framework.utils.maths.atan2(cy, cx) | |
| -- local swirl = (angle / TWO_PI) + (settings.SwirlSpeed * t / TWO_PI) | |
| -- swirl = swirl - framework.utils.maths.floor(swirl) | |
| -- local rr, gg, bb = getPaletteColor(swirl) | |
| -- r = rr * finalFade | |
| -- g = gg * finalFade | |
| -- b = bb * finalFade | |
| -- else | |
| -- r = settings.GlowColor.r * finalFade | |
| -- g = settings.GlowColor.g * finalFade | |
| -- b = settings.GlowColor.b * finalFade | |
| -- end | |
| -- local baseAlpha = settings.BackgroundAlpha | |
| -- local glowAlpha = finalFade * settings.GlowExtraAlpha | |
| -- local alpha = framework.utils.maths.clamp(baseAlpha + glowAlpha, 0, 255) | |
| -- writePixel(idx, framework.utils.maths.floor(r + .5), framework.utils.maths.floor(g + .5), | |
| -- framework.utils.maths.floor(b + .5), framework.utils.maths.floor(alpha + .5)) | |
| -- end) | |
| -- end))) | |
| end | |
| -- UI STARTING SCREEN BACKGROUND ANIMATION (COM) | |
| do | |
| local image = ui:Get("StartingScreen") | |
| -- Parametri di personalizzazione (in unità per la risoluzione base, ad es. 128) | |
| local settings = { | |
| CornerRadiusRatio = .035, -- Percentuale del lato più corto | |
| InnerGlowRadius = 3555, -- In "pixel base" (a 128) | |
| GlowSoftnessExponent = 150, | |
| GlowExtraAlpha = 20, | |
| GlowColor = { r = 255, g = 0, b = 0 }, | |
| BackgroundAlpha = .75*255, | |
| UseMultiColorGlow = true, | |
| SwirlSpeed = 1, | |
| GlowPulseAmplitude = .5, | |
| GlowPulseFrequency = .5, | |
| LeftGlowBoost = 5, -- Moltiplicatore per il glow a sinistra (1 = nessun boost) | |
| } | |
| -- Aggiungiamo l'animazione tramite il framework | |
| utils:AddAnimation(image.id, { | |
| Outputs = { image.instance }, | |
| Duration = 4, | |
| Resolution = Vector2.new(128, 72), | |
| RenderOnLoad = true | |
| }, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, resolution, frameIndex, totalFrames) | |
| local w, h = resolution.X, resolution.Y | |
| local TWO_PI = framework.utils.maths.pi *2 | |
| local t = (frameIndex / totalFrames) *TWO_PI | |
| local scaleFactor = getScaleFactor(resolution) | |
| local effectiveCornerRadius = framework.utils.maths.min(w, h) * settings.CornerRadiusRatio | |
| animator.computePixels(resolution, function(idx, x, y) | |
| -- Calcola la distanza dal bordo del rettangolo arrotondato | |
| local shapeDist = sdfRoundedRect(x, y, w, h, effectiveCornerRadius) | |
| local d = framework.utils.maths.abs(shapeDist) | |
| -- Applica la scala ai parametri in pixel | |
| local scaledInnerGlow = settings.InnerGlowRadius * scaleFactor | |
| -- Se il pixel è nella metà sinistra, applica un boost (sempre scalato) | |
| local effectiveInnerGlowRadius = scaledInnerGlow | |
| if x < (w / 2) and settings.LeftGlowBoost>0 then | |
| local leftMultiplier = 1 + (settings.LeftGlowBoost - 1) * (1 - (x / (w / 2))) | |
| effectiveInnerGlowRadius = scaledInnerGlow * leftMultiplier | |
| end | |
| -- Calcola il fattore di glow in modo adattivo | |
| local factor = 0 | |
| if d < effectiveInnerGlowRadius then | |
| factor = 1 - (d / effectiveInnerGlowRadius) | |
| end | |
| local baseFade = factor ^ settings.GlowSoftnessExponent | |
| local pulse = 1 + settings.GlowPulseAmplitude * framework.utils.maths.sin(settings.GlowPulseFrequency * t) | |
| local finalFade = framework.utils.maths.clamp(baseFade * pulse, 0, 1) | |
| local r, g, b | |
| if settings.UseMultiColorGlow then | |
| local cx = (x + .5) - (w / 2) | |
| local cy = (y + .5) - (h / 2) | |
| local angle = framework.utils.maths.atan2(cy, cx) | |
| local swirl = (angle / TWO_PI) + (settings.SwirlSpeed * t / TWO_PI) | |
| swirl = swirl - framework.utils.maths.floor(swirl) | |
| local rr, gg, bb = getPaletteColor(swirl) | |
| r = rr * finalFade | |
| g = gg * finalFade | |
| b = bb * finalFade | |
| else | |
| r = settings.GlowColor.r * finalFade | |
| g = settings.GlowColor.g * finalFade | |
| b = settings.GlowColor.b * finalFade | |
| end | |
| local baseAlpha = settings.BackgroundAlpha | |
| local glowAlpha = finalFade * settings.GlowExtraAlpha | |
| local alpha = framework.utils.maths.clamp(baseAlpha + glowAlpha, 0, 255) | |
| writePixel(idx, framework.utils.maths.floor(r + .5), framework.utils.maths.floor(g + .5), | |
| framework.utils.maths.floor(b + .5), framework.utils.maths.floor(alpha + .5)) | |
| end) | |
| end))) | |
| end | |
| -- INIT BACKGROUND ANIMATION | |
| if not framework.protected:IsStudio() then | |
| local image = ui:Get("BackgroundOverlay") | |
| -- Parametri di personalizzazione (in unità per la risoluzione base, ad es. 128) | |
| local settings = { | |
| CornerRadiusRatio = .035, -- Percentuale del lato più corto | |
| InnerGlowRadius = 255, -- In "pixel base" (a 128) | |
| GlowSoftnessExponent = 30, | |
| GlowExtraAlpha = 33, | |
| GlowColor = { r = 255, g = 0, b = 0 }, | |
| BackgroundAlpha = .5*255, | |
| UseMultiColorGlow = true, | |
| SwirlSpeed = 1, | |
| GlowPulseAmplitude = .5, | |
| GlowPulseFrequency = 1, | |
| LeftGlowBoost = 1, -- Moltiplicatore per il glow a sinistra (1 = nessun boost) | |
| } | |
| -- Aggiungiamo l'animazione tramite il framework | |
| utils:AddAnimation(image.id, { | |
| Outputs = { image.instance }, | |
| Duration = 2.5, | |
| Resolution = Vector2.new(128, 72), | |
| --RenderOnLoad = true, | |
| }, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, resolution, frameIndex, totalFrames) | |
| local w, h = resolution.X, resolution.Y | |
| local TWO_PI = framework.utils.maths.pi *2 | |
| local t = (frameIndex / totalFrames) *TWO_PI | |
| local scaleFactor = getScaleFactor(resolution) | |
| local effectiveCornerRadius = framework.utils.maths.min(w, h) * settings.CornerRadiusRatio | |
| animator.computePixels(resolution, function(idx, x, y) | |
| -- Calcola la distanza dal bordo del rettangolo arrotondato | |
| local shapeDist = sdfRoundedRect(x, y, w, h, effectiveCornerRadius) | |
| local d = framework.utils.maths.abs(shapeDist) | |
| -- Applica la scala ai parametri in pixel | |
| local scaledInnerGlow = settings.InnerGlowRadius * scaleFactor | |
| -- Se il pixel è nella metà sinistra, applica un boost (sempre scalato) | |
| local effectiveInnerGlowRadius = scaledInnerGlow | |
| if x < (w / 2) and settings.LeftGlowBoost>0 then | |
| local leftMultiplier = 1 + (settings.LeftGlowBoost - 1) * (1 - (x / (w / 2))) | |
| effectiveInnerGlowRadius = scaledInnerGlow * leftMultiplier | |
| end | |
| -- Calcola il fattore di glow in modo adattivo | |
| local factor = 0 | |
| if d < effectiveInnerGlowRadius then | |
| factor = 1 - (d / effectiveInnerGlowRadius) | |
| end | |
| local baseFade = factor ^ settings.GlowSoftnessExponent | |
| local pulse = 1 + settings.GlowPulseAmplitude * framework.utils.maths.sin(settings.GlowPulseFrequency * t) | |
| local finalFade = framework.utils.maths.clamp(baseFade * pulse, 0, 1) | |
| local r, g, b | |
| if settings.UseMultiColorGlow then | |
| local cx = (x + .5) - (w / 2) | |
| local cy = (y + .5) - (h / 2) | |
| local angle = framework.utils.maths.atan2(cy, cx) | |
| local swirl = (angle / TWO_PI) + (settings.SwirlSpeed * t / TWO_PI) | |
| swirl = swirl - framework.utils.maths.floor(swirl) | |
| local rr, gg, bb = getPaletteColor(swirl) | |
| r = rr * finalFade | |
| g = gg * finalFade | |
| b = bb * finalFade | |
| else | |
| r = settings.GlowColor.r * finalFade | |
| g = settings.GlowColor.g * finalFade | |
| b = settings.GlowColor.b * finalFade | |
| end | |
| local baseAlpha = settings.BackgroundAlpha | |
| local glowAlpha = finalFade * settings.GlowExtraAlpha | |
| local alpha = framework.utils.maths.clamp(baseAlpha + glowAlpha, 0, 255) | |
| writePixel(idx, framework.utils.maths.floor(r + .5), framework.utils.maths.floor(g + .5), | |
| framework.utils.maths.floor(b + .5), framework.utils.maths.floor(alpha + .5)) | |
| end) | |
| end))) | |
| end | |
| -- UI BACKGROUND ANIMATION | |
| do | |
| local image = ui:Get("BackgroundGlow") | |
| -- Parametri di personalizzazione (in unità per la risoluzione base, ad es. 128) | |
| local settings = { | |
| CornerRadiusRatio = .1, -- Percentuale del lato più corto | |
| InnerGlowRadius = 255, -- In "pixel base" (a 128) | |
| GlowSoftnessExponent = 30, | |
| GlowExtraAlpha = 33, | |
| GlowColor = { r = 255, g = 255, b = 255 }, | |
| BackgroundAlpha = .75*255, | |
| UseMultiColorGlow = true, | |
| SwirlSpeed = 1, | |
| GlowPulseAmplitude = .5, | |
| GlowPulseFrequency = 1, | |
| LeftGlowBoost = 1, -- Moltiplicatore per il glow a sinistra (1 = nessun boost) | |
| } | |
| -- Aggiungiamo l'animazione tramite il framework | |
| utils:AddAnimation(image.id, { | |
| Outputs = { image.instance }, | |
| Duration = 2.5, | |
| Resolution = Vector2.new(128, 72), | |
| --RenderOnLoad = true, | |
| Tags = {"MainFrame"} | |
| }, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, resolution, frameIndex, totalFrames) | |
| local w, h = resolution.X, resolution.Y | |
| local TWO_PI = framework.utils.maths.pi *2 | |
| local t = (frameIndex / totalFrames) *TWO_PI | |
| local scaleFactor = getScaleFactor(resolution) | |
| local effectiveCornerRadius = framework.utils.maths.min(w, h) * settings.CornerRadiusRatio | |
| animator.computePixels(resolution, function(idx, x, y) | |
| -- Calcola la distanza dal bordo del rettangolo arrotondato | |
| local shapeDist = sdfRoundedRect(x, y, w, h, effectiveCornerRadius) | |
| local d = framework.utils.maths.abs(shapeDist) | |
| -- Applica la scala ai parametri in pixel | |
| local scaledInnerGlow = settings.InnerGlowRadius * scaleFactor | |
| -- Se il pixel è nella metà sinistra, applica un boost (sempre scalato) | |
| local effectiveInnerGlowRadius = scaledInnerGlow | |
| if x < (w / 2) and settings.LeftGlowBoost>0 then | |
| local leftMultiplier = 1 + (settings.LeftGlowBoost - 1) * (1 - (x / (w / 2))) | |
| effectiveInnerGlowRadius = scaledInnerGlow * leftMultiplier | |
| end | |
| -- Calcola il fattore di glow in modo adattivo | |
| local factor = 0 | |
| if d < effectiveInnerGlowRadius then | |
| factor = 1 - (d / effectiveInnerGlowRadius) | |
| end | |
| local baseFade = factor ^ settings.GlowSoftnessExponent | |
| local pulse = 1 + settings.GlowPulseAmplitude * framework.utils.maths.sin(settings.GlowPulseFrequency * t) | |
| local finalFade = framework.utils.maths.clamp(baseFade * pulse, 0, 1) | |
| local r, g, b | |
| if settings.UseMultiColorGlow then | |
| local cx = (x + .5) - (w / 2) | |
| local cy = (y + .5) - (h / 2) | |
| local angle = framework.utils.maths.atan2(cy, cx) | |
| local swirl = (angle / TWO_PI) + (settings.SwirlSpeed * t / TWO_PI) | |
| swirl = swirl - framework.utils.maths.floor(swirl) | |
| local rr, gg, bb = getPaletteColor(swirl) | |
| r = rr * finalFade | |
| g = gg * finalFade | |
| b = bb * finalFade | |
| else | |
| r = settings.GlowColor.r * finalFade | |
| g = settings.GlowColor.g * finalFade | |
| b = settings.GlowColor.b * finalFade | |
| end | |
| local baseAlpha = settings.BackgroundAlpha | |
| local glowAlpha = finalFade * settings.GlowExtraAlpha | |
| local alpha = framework.utils.maths.clamp(baseAlpha + glowAlpha, 0, 255) | |
| writePixel(idx, framework.utils.maths.floor(r + .5), framework.utils.maths.floor(g + .5), | |
| framework.utils.maths.floor(b + .5), framework.utils.maths.floor(alpha + .5)) | |
| end) | |
| end))) | |
| end | |
| if framework.protected:IsStudio() then | |
| local image = ui:Get("AnimatedWallpaper") | |
| -- Single-color mode: una sola tonalità per un look ultra-clean | |
| local color = {0, 0, 0} -- puoi cambiare qui il colore [R,G,B] | |
| -- Loop e noise | |
| local durationSeconds = 14 | |
| local noiseScale = 1.5 | |
| local offsetScale = 1.2 | |
| local alphaMax = 90 | |
| local gamma = 1.0 | |
| -- Funzione smoothstep | |
| local function smoothstep(x) | |
| return x*x*(3 - 2*x) | |
| end | |
| utils:AddAnimation(image.id, { | |
| Outputs = { image.instance }, | |
| Duration = durationSeconds, | |
| Tags = { "MainFrame" }, | |
| Resolution = Vector2.new(128, 72) | |
| }, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, res, frameIndex, totalFrames) | |
| local w, h = res.X, res.Y | |
| local tNorm = (frameIndex % totalFrames) / totalFrames | |
| local angle = 2 * math.pi * tNorm | |
| local ox = math.cos(angle) * offsetScale | |
| local oy = math.sin(angle) * offsetScale | |
| -- 2×2 antialiasing offsets | |
| local offs = {0.25, 0.75} | |
| animator.computePixels(res, function(idx, x, y) | |
| if idx < 0 or idx+3 >= w*h*4 then return end | |
| -- media di 4 campioni per pixel (supersampling) | |
| local acc = 0 | |
| for _, sx in ipairs(offs) do | |
| for _, sy in ipairs(offs) do | |
| local nx = (x + sx) / w * noiseScale + ox | |
| local ny = (y + sy) / h * noiseScale + oy | |
| acc = acc + ((math.noise(nx, ny, 0) * 0.5) + 0.5) | |
| end | |
| end | |
| local v = acc * 0.25 -- valore medio [0,1] | |
| -- gamma + smoothstep per un contrasto molto dolce | |
| local s = smoothstep(v^gamma) | |
| -- alpha e colore | |
| local a = math.floor(s * alphaMax + 0.5) | |
| if a == 0 then return end -- risparmio calcolo | |
| local r = math.floor(color[1] * 255 + 0.5) | |
| local g = math.floor(color[2] * 255 + 0.5) | |
| local b = math.floor(color[3] * 255 + 0.5) | |
| writePixel(idx, r, g, b, a) | |
| end) | |
| end))) | |
| end | |
| -- SLIDERS CONTAINER, PROFILE PANEL AND BEST SCRIPTS PANEL ANIMATION | |
| do | |
| local image, image2, image3, image4, image5, image6 = ui:Get("SlidersContainerBackground"), ui:Get("ProfilePanelBackground"), ui:Get("HomeTipBackground"), ui:Get("BestScriptsPanelBackground"), ui:Get("AITipsPanelBackground"), ui:Get("AIChatPanelBackgroundOverlay") | |
| -- Parametri di personalizzazione (in unità per la risoluzione base, ad es. 128) | |
| local settings = { | |
| CornerRadiusRatio = .11, -- Percentuale del lato più corto | |
| InnerGlowRadius = 255, -- In "pixel base" (a 128) | |
| GlowSoftnessExponent = 30, | |
| GlowExtraAlpha = 50, | |
| GlowColor = { r = 0, g = 0, b = 0 }, | |
| BackgroundAlpha = .45*255, | |
| UseMultiColorGlow = false, | |
| SwirlSpeed = 1, | |
| GlowPulseAmplitude = .2, | |
| GlowPulseFrequency = 1, | |
| LeftGlowBoost = 1, -- Moltiplicatore per il glow a sinistra (1 = nessun boost) | |
| } | |
| -- Aggiungiamo l'animazione tramite il framework | |
| utils:AddAnimation(image.id, { | |
| Outputs = { image.instance, image2.instance, image3.instance, image4.instance, image5.instance, image6.instance }, | |
| Duration = 2.5, | |
| --RenderOnLoad = true, | |
| Tags = {"MainFrame"} | |
| }, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, resolution, frameIndex, totalFrames) | |
| local w, h = resolution.X, resolution.Y | |
| local TWO_PI = framework.utils.maths.pi *2 | |
| local t = (frameIndex / totalFrames) *TWO_PI | |
| local scaleFactor = getScaleFactor(resolution) | |
| local effectiveCornerRadius = framework.utils.maths.min(w, h) * settings.CornerRadiusRatio | |
| animator.computePixels(resolution, function(idx, x, y) | |
| -- Calcola la distanza dal bordo del rettangolo arrotondato | |
| local shapeDist = sdfRoundedRect(x, y, w, h, effectiveCornerRadius) | |
| local d = framework.utils.maths.abs(shapeDist) | |
| -- Applica la scala ai parametri in pixel | |
| local scaledInnerGlow = settings.InnerGlowRadius * scaleFactor | |
| -- Se il pixel è nella metà sinistra, applica un boost (sempre scalato) | |
| local effectiveInnerGlowRadius = scaledInnerGlow | |
| if x < (w / 2) and settings.LeftGlowBoost>0 then | |
| local leftMultiplier = 1 + (settings.LeftGlowBoost - 1) * (1 - (x / (w / 2))) | |
| effectiveInnerGlowRadius = scaledInnerGlow * leftMultiplier | |
| end | |
| -- Calcola il fattore di glow in modo adattivo | |
| local factor = 0 | |
| if d < effectiveInnerGlowRadius then | |
| factor = 1 - (d / effectiveInnerGlowRadius) | |
| end | |
| local baseFade = factor ^ settings.GlowSoftnessExponent | |
| local pulse = 1 + settings.GlowPulseAmplitude * framework.utils.maths.sin(settings.GlowPulseFrequency * t) | |
| local finalFade = framework.utils.maths.clamp(baseFade * pulse, 0, 1) | |
| local r, g, b | |
| if settings.UseMultiColorGlow then | |
| local cx = (x + .5) - (w / 2) | |
| local cy = (y + .5) - (h / 2) | |
| local angle = framework.utils.maths.atan2(cy, cx) | |
| local swirl = (angle / TWO_PI) + (settings.SwirlSpeed * t / TWO_PI) | |
| swirl = swirl - framework.utils.maths.floor(swirl) | |
| local rr, gg, bb = getPaletteColor(swirl) | |
| r = rr * finalFade | |
| g = gg * finalFade | |
| b = bb * finalFade | |
| else | |
| r = settings.GlowColor.r * finalFade | |
| g = settings.GlowColor.g * finalFade | |
| b = settings.GlowColor.b * finalFade | |
| end | |
| local baseAlpha = settings.BackgroundAlpha | |
| local glowAlpha = finalFade * settings.GlowExtraAlpha | |
| local alpha = framework.utils.maths.clamp(baseAlpha + glowAlpha, 0, 255) | |
| writePixel(idx, framework.utils.maths.floor(r + .5), framework.utils.maths.floor(g + .5), | |
| framework.utils.maths.floor(b + .5), framework.utils.maths.floor(alpha + .5)) | |
| end) | |
| end))) | |
| end | |
| --[[ ANIMAZIONE SLIDER VERTICALE CON PULSING GLOW, PADDING SEPARATO & DROP/INNER SHADOW (0→100%) | |
| do | |
| local animator = framework.animator | |
| local image, image2, image3 = ui:Get("Slider_Gravity"), ui:Get("Slider_Jump"), ui:Get("Slider_Speed") | |
| local settings = { | |
| -- colore e smussatura | |
| baseColor = {1, 1, 1}, | |
| cornerRadius = .7, | |
| paddingLeftPx = 8.5, | |
| paddingRightPx = 9.5, | |
| paddingTopPx = 15.5, | |
| paddingBottomPx = 16.5, | |
| shadowOffsetPx = { x = 0, y = 0 }, | |
| shadowRadiusPx = 8, | |
| shadowColor = {1, 1, 1}, | |
| shadowOpacity = .4, | |
| glowFrequency = 0, | |
| glowIntensity = .5, | |
| innerShadowRadiusPx = 12.5, | |
| innerShadowColor = {0, 0, 0}, | |
| innerShadowOpacity = .35, | |
| bodyAlpha = 255, | |
| } | |
| local resW, resH = 54, 169 | |
| -- helper per hit-test su rounded rect | |
| local pointInRounded = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(px, py, L, T, R, B, cr) | |
| if px >= L+cr and px <= R-cr and py >= T and py <= B then return true end | |
| if py >= T+cr and py <= B-cr and px >= L and px <= R then return true end | |
| local corners = {{x=L+cr,y=T+cr},{x=R-cr,y=T+cr},{x=L+cr,y=B-cr},{x=R-cr,y=B-cr}} | |
| for _,c in ipairs(corners) do | |
| local dx, dy = px-c.x, py-c.y | |
| if dx*dx+dy*dy <= cr*cr then return true end | |
| end | |
| return false | |
| end)) | |
| local frameGen = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, resolution, frameIndex, totalFrames) | |
| local w, h = resolution.X, resolution.Y | |
| local tNorm = (frameIndex-1)/(totalFrames-1) | |
| -- container bounds e raggio | |
| local L, R = settings.paddingLeftPx, w - settings.paddingRightPx | |
| local T0, B0 = settings.paddingTopPx, h - settings.paddingBottomPx | |
| local effCr = settings.cornerRadius * framework.utils.maths.min(R-L, B0-T0) * .5 | |
| -- fill height | |
| local fillTop = B0 - tNorm * (B0 - T0) | |
| local regionH = B0 - fillTop | |
| -- parametri glow/shadow | |
| local shOffX, shOffY = settings.shadowOffsetPx.x, settings.shadowOffsetPx.y | |
| local shR = settings.shadowRadiusPx | |
| local scR,scG,scB = settings.shadowColor[1]*255, settings.shadowColor[2]*255, settings.shadowColor[3]*255 | |
| local glow = (framework.utils.maths.sin(2 *framework.utils.maths.pi *settings.glowFrequency *tNorm)+1)*.5 *settings.glowIntensity | |
| local baseShadowOp = settings.shadowOpacity | |
| -- parametri inner shadow | |
| local inR = settings.innerShadowRadiusPx | |
| local iscR,iscG,iscB = settings.innerShadowColor[1]*255, settings.innerShadowColor[2]*255, settings.innerShadowColor[3]*255 | |
| animator.computePixels(resolution, function(idx, px, py) | |
| local Rf, Gf, Bf, Af = 0,0,0,0 | |
| -- DROP SHADOW + GLOW: bordo del container ma visibile solo nella regione di fill | |
| if regionH > 0 and py >= fillTop - settings.shadowRadiusPx then | |
| local shOpEff = baseShadowOp + glow | |
| -- distance to container rounded rect edge | |
| local dx, dy = 0, 0 | |
| local offL = L + effCr + shOffX | |
| local offR = R - effCr + shOffX | |
| local offT = T0 + effCr + shOffY | |
| local offB = B0 - effCr + shOffY | |
| if px < offL then dx = offL - px elseif px > offR then dx = px - offR end | |
| if py < offT then dy = offT - py elseif py > offB then dy = py - offB end | |
| local dRect = (dx>0 and dy>0) and framework.utils.maths.sqrt(dx*dx+dy*dy) or framework.utils.maths.max(dx,dy) | |
| local distToContainer = dRect - effCr | |
| if distToContainer > 0 and distToContainer < shR then | |
| -- clipping all'esterno del container extended by shadowRadius | |
| if pointInRounded(px,py, L-shR, T0-shR, R+shR, B0+shR, effCr+shR) then | |
| local alpha = shOpEff * (1 - distToContainer/shR) | |
| Rf = Rf + scR * alpha; Gf = Gf + scG * alpha; Bf = Bf + scB * alpha | |
| Af = framework.utils.maths.max(Af, framework.utils.maths.floor(alpha*255)) | |
| end | |
| end | |
| end | |
| -- FILL principale (solo se c’è realmente fill) | |
| if regionH > 0 and py >= fillTop - settings.shadowRadiusPx and pointInRounded(px,py, L, T0, R, B0, effCr) then | |
| local dC = sdRounded(px, py, L, T0, R, B0, effCr) | |
| -- cov=1 per tutti i pixel interiori, fade su ~1px al bordo | |
| local covF = smoothstep(1*.5, -1*.5, dC) | |
| if covF > 0 then | |
| Rf = settings.baseColor[1]*255 | |
| Gf = settings.baseColor[2]*255 | |
| Bf = settings.baseColor[3]*255 | |
| Af = framework.utils.maths.max(Af, framework.utils.maths.floor(settings.bodyAlpha * covF + .5)) | |
| end | |
| end | |
| -- INNER SHADOW sul fill | |
| if regionH > 0 and py >= fillTop - settings.shadowRadiusPx and pointInRounded(px,py, L, T0, R, B0, effCr) then | |
| local dmin = framework.utils.maths.min(px-L, R-px, py-fillTop, B0-py) | |
| local dC2 = sdRounded(px, py, L, fillTop, R, B0, effCr) | |
| if dC2 > -inR and dmin < inR then | |
| local distInside = -framework.utils.maths.min(dC2, 0) | |
| local alpha = settings.innerShadowOpacity * (1 - distInside/inR) | |
| Rf = Rf*(1 - alpha) + iscR*alpha | |
| Gf = Gf*(1 - alpha) + iscG*alpha | |
| Bf = Bf*(1 - alpha) + iscB*alpha | |
| Af = framework.utils.maths.max(Af, framework.utils.maths.floor(alpha*255)) | |
| end | |
| end | |
| writePixel(idx, | |
| framework.utils.maths.clamp(framework.utils.maths.floor(Rf+.5),0,255), | |
| framework.utils.maths.clamp(framework.utils.maths.floor(Gf+.5),0,255), | |
| framework.utils.maths.clamp(framework.utils.maths.floor(Bf+.5),0,255), | |
| framework.utils.maths.clamp(framework.utils.maths.floor(Af+.5),0,255)) | |
| end) | |
| end)) | |
| local a = utils:AddAnimation(image.id, { | |
| Resolution = Vector2.new(resW, resH), | |
| Outputs = {image.instance}, | |
| Duration = 2.5 | |
| }, frameGen)--:Generate() | |
| utils:AddAnimation(image2.id, { | |
| Resolution = Vector2.new(resW, resH), | |
| Outputs = {image2.instance}, | |
| Duration = 2.5, | |
| }, frameGen) | |
| utils:AddAnimation(image3.id, { | |
| Resolution = Vector2.new(resW, resH), | |
| Outputs = {image3.instance}, | |
| Duration = 2.5 | |
| }, frameGen) | |
| end]] | |
| -- PROFILE OVERLAY ANIMATION | |
| do | |
| local animator = framework.animator | |
| local image, image2= ui:Get("PFPOverlay"), ui:Get("PFPOverlay2") | |
| -- Parametri di personalizzazione (unità base per una risoluzione di riferimento 128×128) | |
| local settings = { | |
| -- Impostazioni per l'inner glow (rosso) | |
| GlowColor = { r = 255, g = 255, b = 255 }, | |
| BackgroundAlpha = 0, -- nessun background solido | |
| GlowExtraAlpha = 100, | |
| GlowSoftnessExponent = 5, | |
| InnerGlowRadius = 150, -- valore base in pixel (per risoluzione base 128) | |
| Margin = 0, | |
| -- Corner radius personalizzati (in pixel base; verranno scalati) | |
| CornerRadius = { | |
| topLeft = 50, | |
| topRight = 50, | |
| bottomRight = 50, | |
| bottomLeft = 50, | |
| }, | |
| -- Parametri di pulsazione | |
| GlowPulseAmplitude = .3, | |
| GlowPulseFrequency = 1, | |
| } | |
| -- SDF per un rettangolo con corner radii differenti | |
| local sdfRoundedRectMulti = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(px, py, w, h, radii) | |
| local cx = px - w/2 | |
| local cy = py - h/2 | |
| local r = 0 | |
| if cx < 0 and cy < 0 then | |
| r = radii.topLeft | |
| elseif cx >= 0 and cy < 0 then | |
| r = radii.topRight | |
| elseif cx >= 0 and cy >= 0 then | |
| r = radii.bottomRight | |
| else | |
| r = radii.bottomLeft | |
| end | |
| local qx = framework.utils.maths.abs(cx) - (w/2 - r) | |
| local qy = framework.utils.maths.abs(cy) - (h/2 - r) | |
| local outside = framework.utils.maths.sqrt(framework.utils.maths.max(qx, 0)^2 + framework.utils.maths.max(qy, 0)^2) | |
| local inside = framework.utils.maths.min(framework.utils.maths.max(qx, qy), 0) | |
| return outside + inside - r | |
| end)) | |
| -- Helper: distanza da un punto a un segmento (con proiezione clamped) | |
| local segmentDistance = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(p, v1, v2) | |
| local vx = v2.x - v1.x | |
| local vy = v2.y - v1.y | |
| local wx = p.x - v1.x | |
| local wy = p.y - v1.y | |
| local dot = vx * wx + vy * wy | |
| local lenSq = vx * vx + vy * vy | |
| local t = framework.utils.maths.clamp(dot / lenSq, 0, 1) | |
| local proj = { x = v1.x + t * vx, y = v1.y + t * vy } | |
| local dx = p.x - proj.x | |
| local dy = p.y - proj.y | |
| return framework.utils.maths.sqrt(dx * dx + dy * dy) | |
| end)) | |
| -- Registra l'animazione per il SideNavButton | |
| utils:AddAnimation(image.id, { | |
| Outputs = { image.instance, image2.instance }, | |
| Duration = 2.5, | |
| --RenderOnLoad = true, | |
| Tags = {"MainFrame"} | |
| }, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, resolution, frameIndex, totalFrames) | |
| local w, h = resolution.X, resolution.Y | |
| local TWO_PI = framework.utils.maths.pi * 2 | |
| local t = (frameIndex / totalFrames) * TWO_PI | |
| local scaleFactor = getScaleFactor(resolution) | |
| local inset = (settings.Margin or .05) * framework.utils.maths.min(w, h) | |
| local containerX = inset | |
| local containerY = inset | |
| local containerW = w -2 *inset | |
| local containerH = h -2 *inset | |
| local scaledRadii = { | |
| topLeft = settings.CornerRadius.topLeft *scaleFactor, | |
| topRight = settings.CornerRadius.topRight *scaleFactor, | |
| bottomRight = settings.CornerRadius.bottomRight *scaleFactor, | |
| bottomLeft = settings.CornerRadius.bottomLeft *scaleFactor, | |
| } | |
| local scaledInnerGlow = settings.InnerGlowRadius *scaleFactor | |
| local centerX = containerX +containerW /2 | |
| local centerY = containerY +containerH /2 | |
| -- Funzione per calcolare il fade del background (inner glow) nel container | |
| local function getBackgroundFade(x, y) | |
| local px = x + .5 - containerX | |
| local py = y + .5 - containerY | |
| local sdf = sdfRoundedRectMulti(px, py, containerW, containerH, scaledRadii) | |
| local d = framework.utils.maths.abs(sdf) | |
| local f = 0 | |
| if d < scaledInnerGlow then | |
| f = 1 - (d / scaledInnerGlow) | |
| end | |
| local baseFade = f ^ settings.GlowSoftnessExponent | |
| local pulse = 1 + settings.GlowPulseAmplitude * framework.utils.maths.sin(settings.GlowPulseFrequency * t) | |
| return framework.utils.maths.clamp(baseFade * pulse, 0, 1) | |
| end | |
| animator.computePixels(resolution, function(idx, x, y) | |
| local fade = getBackgroundFade(x, y) | |
| local r_bg = (settings.GlowColor.r or 0) / 255 * fade | |
| local g_bg = (settings.GlowColor.g or 0) / 255 * fade | |
| local b_bg = (settings.GlowColor.b or 0) / 255 * fade | |
| local alpha_bg = framework.utils.maths.clamp(settings.BackgroundAlpha + fade * settings.GlowExtraAlpha, 0, 255) | |
| local finalR, finalG, finalB, finalA = r_bg, g_bg, b_bg, alpha_bg | |
| writePixel(idx, | |
| framework.utils.maths.clamp(framework.utils.maths.floor(finalR * 255 + .5), 0, 255), | |
| framework.utils.maths.clamp(framework.utils.maths.floor(finalG * 255 + .5), 0, 255), | |
| framework.utils.maths.clamp(framework.utils.maths.floor(finalB * 255 + .5), 0, 255), | |
| finalA) | |
| end) | |
| end))) | |
| end | |
| -- AI PANEL ANIMATION | |
| do | |
| local image = ui:Get("AIPanelBackgroundOverlay") | |
| -- Parametri di personalizzazione (in unità per la risoluzione base, ad es. 128) | |
| local settings = { | |
| CornerRadiusRatio = .3, -- Percentuale del lato più corto | |
| InnerGlowRadius = 255, -- In "pixel base" (a 128) | |
| GlowSoftnessExponent = 20, | |
| GlowExtraAlpha = 50, | |
| GlowColor = { r = 255, g = 0, b = 0 }, | |
| BackgroundAlpha = .35*255, | |
| UseMultiColorGlow = true, | |
| SwirlSpeed = 1, | |
| GlowPulseAmplitude = .2, | |
| GlowPulseFrequency = 1, | |
| LeftGlowBoost = 1, -- Moltiplicatore per il glow a sinistra (1 = nessun boost) | |
| } | |
| -- Aggiungiamo l'animazione tramite il framework | |
| utils:AddAnimation(image.id, { | |
| Outputs = { image.instance }, | |
| Duration = 4, | |
| Resolution = Vector2.new(128, 28), | |
| --RenderOnLoad = true, | |
| Tags = {"MainFrame"} | |
| }, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, resolution, frameIndex, totalFrames) | |
| local w, h = resolution.X, resolution.Y | |
| local TWO_PI = framework.utils.maths.pi *2 | |
| local t = (frameIndex / totalFrames) *TWO_PI | |
| local scaleFactor = getScaleFactor(resolution) | |
| local effectiveCornerRadius = framework.utils.maths.min(w, h) * settings.CornerRadiusRatio | |
| animator.computePixels(resolution, function(idx, x, y) | |
| -- Calcola la distanza dal bordo del rettangolo arrotondato | |
| local shapeDist = sdfRoundedRect(x, y, w, h, effectiveCornerRadius) | |
| local d = framework.utils.maths.abs(shapeDist) | |
| -- Applica la scala ai parametri in pixel | |
| local scaledInnerGlow = settings.InnerGlowRadius * scaleFactor | |
| -- Se il pixel è nella metà sinistra, applica un boost (sempre scalato) | |
| local effectiveInnerGlowRadius = scaledInnerGlow | |
| if x < (w / 2) and settings.LeftGlowBoost>0 then | |
| local leftMultiplier = 1 + (settings.LeftGlowBoost - 1) * (1 - (x / (w / 2))) | |
| effectiveInnerGlowRadius = scaledInnerGlow * leftMultiplier | |
| end | |
| -- Calcola il fattore di glow in modo adattivo | |
| local factor = 0 | |
| if d < effectiveInnerGlowRadius then | |
| factor = 1 - (d / effectiveInnerGlowRadius) | |
| end | |
| local baseFade = factor ^ settings.GlowSoftnessExponent | |
| local pulse = 1 + settings.GlowPulseAmplitude * framework.utils.maths.sin(settings.GlowPulseFrequency * t) | |
| local finalFade = framework.utils.maths.clamp(baseFade * pulse, 0, 1) | |
| local r, g, b | |
| if settings.UseMultiColorGlow then | |
| local cx = (x + .5) - (w / 2) | |
| local cy = (y + .5) - (h / 2) | |
| local angle = framework.utils.maths.atan2(cy, cx) | |
| local swirl = (angle / TWO_PI) + (settings.SwirlSpeed * t / TWO_PI) | |
| swirl = swirl - framework.utils.maths.floor(swirl) | |
| local rr, gg, bb = getPaletteColor(swirl) | |
| r = rr * finalFade | |
| g = gg * finalFade | |
| b = bb * finalFade | |
| else | |
| r = settings.GlowColor.r * finalFade | |
| g = settings.GlowColor.g * finalFade | |
| b = settings.GlowColor.b * finalFade | |
| end | |
| local baseAlpha = settings.BackgroundAlpha | |
| local glowAlpha = finalFade * settings.GlowExtraAlpha | |
| local alpha = framework.utils.maths.clamp(baseAlpha + glowAlpha, 0, 255) | |
| writePixel(idx, framework.utils.maths.floor(r + .5), framework.utils.maths.floor(g + .5), | |
| framework.utils.maths.floor(b + .5), framework.utils.maths.floor(alpha + .5)) | |
| end) | |
| end))) | |
| end | |
| -- AI PLAYER ANIMATION | |
| do | |
| local image = ui:Get("AIPlayerBackgroundOverlay") | |
| -- Parametri di personalizzazione (in unità per la risoluzione base, ad es. 128) | |
| local settings = { | |
| CornerRadiusRatio = .155, -- Percentuale del lato più corto | |
| InnerGlowRadius = 255, -- In "pixel base" (a 128) | |
| GlowSoftnessExponent = 30, | |
| GlowExtraAlpha = 50, | |
| GlowColor = { r = 255, g = 255, b = 255 }, | |
| BackgroundAlpha = .45*255, | |
| UseMultiColorGlow = false, | |
| SwirlSpeed = 1, | |
| GlowPulseAmplitude = .5, | |
| GlowPulseFrequency = 1, | |
| LeftGlowBoost = 1, -- Moltiplicatore per il glow a sinistra (1 = nessun boost) | |
| } | |
| -- Aggiungiamo l'animazione tramite il framework | |
| utils:AddAnimation(image.id, { | |
| Outputs = { image.instance }, | |
| Duration = 2.5, | |
| --RenderOnLoad = true, | |
| Tags = {"MainFrame"} | |
| }, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, resolution, frameIndex, totalFrames) | |
| local w, h = resolution.X, resolution.Y | |
| local TWO_PI = framework.utils.maths.pi *2 | |
| local t = (frameIndex / totalFrames) *TWO_PI | |
| local scaleFactor = getScaleFactor(resolution) | |
| local effectiveCornerRadius = framework.utils.maths.min(w, h) * settings.CornerRadiusRatio | |
| animator.computePixels(resolution, function(idx, x, y) | |
| -- Calcola la distanza dal bordo del rettangolo arrotondato | |
| local shapeDist = sdfRoundedRect(x, y, w, h, effectiveCornerRadius) | |
| local d = framework.utils.maths.abs(shapeDist) | |
| -- Applica la scala ai parametri in pixel | |
| local scaledInnerGlow = settings.InnerGlowRadius * scaleFactor | |
| -- Se il pixel è nella metà sinistra, applica un boost (sempre scalato) | |
| local effectiveInnerGlowRadius = scaledInnerGlow | |
| if x < (w / 2) and settings.LeftGlowBoost>0 then | |
| local leftMultiplier = 1 + (settings.LeftGlowBoost - 1) * (1 - (x / (w / 2))) | |
| effectiveInnerGlowRadius = scaledInnerGlow * leftMultiplier | |
| end | |
| -- Calcola il fattore di glow in modo adattivo | |
| local factor = 0 | |
| if d < effectiveInnerGlowRadius then | |
| factor = 1 - (d / effectiveInnerGlowRadius) | |
| end | |
| local baseFade = factor ^ settings.GlowSoftnessExponent | |
| local pulse = 1 + settings.GlowPulseAmplitude * framework.utils.maths.sin(settings.GlowPulseFrequency * t) | |
| local finalFade = framework.utils.maths.clamp(baseFade * pulse, 0, 1) | |
| local r, g, b | |
| if settings.UseMultiColorGlow then | |
| local cx = (x + .5) - (w / 2) | |
| local cy = (y + .5) - (h / 2) | |
| local angle = framework.utils.maths.atan2(cy, cx) | |
| local swirl = (angle / TWO_PI) + (settings.SwirlSpeed * t / TWO_PI) | |
| swirl = swirl - framework.utils.maths.floor(swirl) | |
| local rr, gg, bb = getPaletteColor(swirl) | |
| r = rr * finalFade | |
| g = gg * finalFade | |
| b = bb * finalFade | |
| else | |
| r = settings.GlowColor.r * finalFade | |
| g = settings.GlowColor.g * finalFade | |
| b = settings.GlowColor.b * finalFade | |
| end | |
| local baseAlpha = settings.BackgroundAlpha | |
| local glowAlpha = finalFade * settings.GlowExtraAlpha | |
| local alpha = framework.utils.maths.clamp(baseAlpha + glowAlpha, 0, 255) | |
| writePixel(idx, framework.utils.maths.floor(r + .5), framework.utils.maths.floor(g + .5), | |
| framework.utils.maths.floor(b + .5), framework.utils.maths.floor(alpha + .5)) | |
| end) | |
| end))) | |
| end | |
| -- ANIMAZIONE AIIcon CON GLOW GRADUALE E SMOOTH LOOP | |
| do | |
| local animator = framework.animator | |
| local image, image2 = ui:Get("AIIcon"), ui:Get("AIIcon2") | |
| local aiColors = { | |
| {1, 0, 0}, | |
| {1, 0.22,0.41}, | |
| {0.96,0.45,0.93}, | |
| {0.08,0.65,1}, | |
| {1, 0.22,0.41}, | |
| } | |
| local settings = { | |
| coordScale = 1.3, | |
| colorMode = "freeform", | |
| freeformColors = { | |
| {x=-.6,y=-.3,color={1,0,0}}, | |
| {x= .6,y=-.2,color={1,0.22,0.41}}, | |
| {x=-.4,y=.6, color={0.96,0.45,0.93}}, | |
| {x= .4,y=.7, color={0.08,0.65,1}}, | |
| }, | |
| -- pulsazioni e rotazioni cicliche | |
| colorPulse = 2, -- 2 pulsazioni in 2.5s | |
| colorRotationSpeed = 1, -- 1 rotazione in 2.5s | |
| waveBase = .9, | |
| waveRange = .02, | |
| freq1 = 2, | |
| freq2 = 1, | |
| freq3 = 3, | |
| glowRange = .35, | |
| secondaryGlowFactor = 1, | |
| glowMaxAlpha = .5, | |
| bodyMaxAlpha = 200, | |
| innerShadowWidth = .5, | |
| blurSigma = .7, | |
| } | |
| local AA = 1 / settings.coordScale | |
| local function fract(x) return x - math.floor(x) end | |
| local function clamp(x,a,b) return x<a and a or (x>b and b or x) end | |
| local function smoothstep(e0,e1,x) | |
| local t = clamp((x-e0)/(e1-e0),0,1) | |
| return t*t*(3-2*t) | |
| end | |
| -- colore freeform con rotazione e blur | |
| local getFreeformColor = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(tNorm, nx, ny) | |
| local tAngle = tNorm * 2*math.pi | |
| local ang = tAngle * settings.colorRotationSpeed | |
| local cosA, sinA = framework.utils.maths.cos(ang), framework.utils.maths.sin(ang) | |
| local sumW,sumR,sumG,sumB=0,0,0,0 | |
| for _, a in ipairs(settings.freeformColors) do | |
| local ax = a.x * cosA - a.y * sinA | |
| local ay = a.x * sinA + a.y * cosA | |
| local dx, dy = nx-ax, ny-ay | |
| local wght = math.exp(-(dx*dx+dy*dy)/(2*settings.blurSigma^2)) | |
| sumW = sumW + wght | |
| sumR = sumR + a.color[1]*wght | |
| sumG = sumG + a.color[2]*wght | |
| sumB = sumB + a.color[3]*wght | |
| end | |
| local r,g,b = sumR/sumW, sumG/sumW, sumB/sumW | |
| -- leggera pulsazione di saturazione | |
| local pulse = 0.5 + 0.5*framework.utils.maths.sin(tAngle*settings.colorPulse/2) -- due volte più lenta | |
| local mix = 0.8 + 0.2*pulse | |
| return clamp(r*mix,0,1), clamp(g*mix,0,1), clamp(b*mix,0,1) | |
| end)) | |
| utils:AddAnimation(image.id .. "_SmoothGlowAI", { | |
| Outputs = { image.instance, image2.instance }, | |
| RenderOnLoad = true, | |
| Duration = 2.5, | |
| Tags = {"MainFrame"}, | |
| }, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, resolution, frameIndex, totalFrames) | |
| local w,h = resolution.X, resolution.Y | |
| local tNorm = (frameIndex-1)/totalFrames | |
| local tAngle = tNorm * 2*math.pi | |
| animator.computePixels(resolution, function(idx, px, py) | |
| local nx = (((px+.5)/w)*2-1)*settings.coordScale | |
| local ny = (((py+.5)/h)*2-1)*settings.coordScale | |
| local dist = framework.utils.maths.sqrt(nx^2+ny^2) | |
| local angD = framework.utils.maths.atan2(ny,nx) | |
| -- raggio ondulato | |
| local waveR = settings.waveBase | |
| + settings.waveRange*.5 * framework.utils.maths.sin(tAngle*settings.freq1 + angD*3) | |
| + settings.waveRange*.3 * framework.utils.maths.sin(tAngle*settings.freq2 - angD*2) | |
| + settings.waveRange*.2 * framework.utils.maths.sin(tAngle*settings.freq3 + angD*5) | |
| waveR = framework.utils.maths.clamp(waveR, .1, 1.1) | |
| local R,G,B,A = 0,0,0,0 | |
| if dist < waveR + settings.glowRange then | |
| -- colore | |
| R,G,B = getFreeformColor(tNorm, nx, ny) | |
| if dist < waveR then | |
| -- corpo pieno | |
| A = settings.bodyMaxAlpha | |
| else | |
| -- **pulsazione glow graduale**: uso una sin modulata per rendere il fade dolce | |
| local glowFrac = (dist - waveR) / settings.glowRange | |
| local baseAlpha = (1 - glowFrac) * settings.glowMaxAlpha | |
| local pulseGlow = 0.5 + 0.5 * framework.utils.maths.sin(tAngle * 0.5) -- mezza velocità | |
| local alphaF = baseAlpha * pulseGlow | |
| A = framework.utils.maths.floor(alphaF * 255 + 0.5) | |
| end | |
| end | |
| writePixel(idx, | |
| framework.utils.maths.clamp(math.floor(R*255+.5),0,255), | |
| framework.utils.maths.clamp(math.floor(G*255+.5),0,255), | |
| framework.utils.maths.clamp(math.floor(B*255+.5),0,255), | |
| A | |
| ) | |
| end) | |
| end))) | |
| end | |
| -- CLOSE/MAXIMIZE BUTTON ORB LOOP INFINITO E SMOOTH | |
| do | |
| local animator = framework.animator | |
| local image, image2 = ui:Get("CloseButton"), ui:Get("MaximizeButton") | |
| local settings = { | |
| coordScale = 2, | |
| baseColor = {1, 1, 1}, | |
| waveBase = .9, | |
| waveRange = .035, | |
| -- Frequenze in cicli interi per un loop seamless | |
| freq1 = 2, -- 2 oscillazioni complete | |
| freq2 = 1, -- 1 oscillazione completa | |
| freq3 = 4, -- 4 oscillazioni complete | |
| glowRange = .4, | |
| glowMaxAlpha = .5, | |
| bodyMaxAlpha = 200, | |
| } | |
| local AA = 1 / settings.coordScale | |
| local function sdCircle(nx, ny, r) | |
| return math.sqrt(nx*nx + ny*ny) - r | |
| end | |
| local function smoothstep(e0, e1, x) | |
| local t = math.clamp((x - e0) / (e1 - e0), 0, 1) | |
| return t * t * (3 - 2*t) | |
| end | |
| utils:AddAnimation(image.id .. "_LoopOrb", { | |
| Outputs = { image.instance, image2.instance }, | |
| RenderOnLoad = true, | |
| Duration = 2.5, | |
| }, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, resolution, frameIndex, totalFrames) | |
| local w, h = resolution.X, resolution.Y | |
| -- tNorm ∈ [0,1), tAngle ∈ [0,2π) | |
| local tNorm = (frameIndex - 1) / totalFrames | |
| local tAngle = tNorm * (2 * math.pi) | |
| animator.computePixels(resolution, function(idx, px, py) | |
| -- coords normalize [-1,1] | |
| local nx = (((px + .5) / w) * 2 - 1) * settings.coordScale | |
| local ny = (((py + .5) / h) * 2 - 1) * settings.coordScale | |
| -- dynamic radius with integer-cycle sine | |
| local angle = framework.utils.maths.atan2(ny, nx) | |
| local waveR = settings.waveBase | |
| + settings.waveRange * .5 * framework.utils.maths.sin(tAngle * settings.freq1 + angle * 3) | |
| + settings.waveRange * .3 * framework.utils.maths.sin(tAngle * settings.freq2 - angle * 2) | |
| + settings.waveRange * .2 * framework.utils.maths.sin(tAngle * settings.freq3 + angle * 5) | |
| waveR = framework.utils.maths.clamp(waveR, .1, 1.1) | |
| local d = sdCircle(nx, ny, waveR) | |
| -- colore fisso bianco | |
| local r, g, b = settings.baseColor[1], settings.baseColor[2], settings.baseColor[3] | |
| -- body coverage | |
| local covBody = smoothstep(AA * .5, -AA * .5, d) | |
| local alphaBody = covBody * (settings.bodyMaxAlpha / 255) | |
| -- glow coverage & pulsazione | |
| local covGlow = 0 | |
| if d > 0 and d < settings.glowRange then | |
| covGlow = smoothstep(settings.glowRange + AA * .5, -AA * .5, d) | |
| end | |
| local pulseGlow = .5 + .5 * framework.utils.maths.sin(tAngle * 1) -- 1 ciclo | |
| local alphaGlow = covGlow * settings.glowMaxAlpha * (.7 + .3 * pulseGlow) | |
| -- alpha finale = max(body, glow) | |
| local a = math.floor(framework.utils.maths.clamp( | |
| math.max(alphaBody, alphaGlow) * 255, 0, 255) + .5) | |
| writePixel(idx, | |
| framework.utils.maths.clamp(math.floor(r*255 + .5), 0, 255), | |
| framework.utils.maths.clamp(math.floor(g*255 + .5), 0, 255), | |
| framework.utils.maths.clamp(math.floor(b*255 + .5), 0, 255), | |
| a | |
| ) | |
| end) | |
| end))) | |
| end | |
| -- ORB CONTRASTATO E LOOP INFINITO SEAMLESS | |
| if not framework.protected:IsStudio() then | |
| local animator = framework.animator | |
| local image, image2, image3, image4, image5, image6 = | |
| ui:Get("FloatingIcon"), | |
| ui:Get("SubIcon_Home"), | |
| ui:Get("SubIcon_Executor"), | |
| ui:Get("SubIcon_ScriptHub"), | |
| ui:Get("SubIcon_ArceusIntelligence"), | |
| ui:Get("SubIcon_Extensions") | |
| -- Palette AI normalizzata | |
| local aiColors = { | |
| {1, 0, 0}, | |
| {1, 0.22, 0.41}, | |
| {0.96, 0.45, 0.93}, | |
| {0.08, 0.65, 1}, | |
| {1, 0.22, 0.41}, | |
| } | |
| local settings = { | |
| coordScale = 1.0, | |
| -- adesso ogni oscillazione è 1 ciclo completo in 1 loop | |
| ringCount = 3, | |
| ringWidth = {0.03, 0.045, 0.06}, | |
| ringSpeed = {1, 2, 3 }, -- interi | |
| ringWaveAmp = {0.03, 0.04, 0.05 }, | |
| ringWaveFreq = {2, 3, 4 }, -- interi | |
| glowRange = 0.35, | |
| glowAlphaMax = 0.65, | |
| bodyAlphaMax = 255, | |
| particleCount = 80, | |
| particleSpeed = 0.8, | |
| particleSize = 0.01, | |
| shadowWidth = 0.15, | |
| vignetteAmp = 0.6, | |
| } | |
| local AA = 1 / settings.coordScale | |
| local function fract(x) return x - math.floor(x) end | |
| local function clamp(x,a,b) return x<a and a or (x>b and b or x) end | |
| local function smoothstep(e0,e1,x) | |
| local t = clamp((x-e0)/(e1-e0),0,1) | |
| return t*t*(3-2*t) | |
| end | |
| local function hsv2rgb(h,s,v) | |
| local i = math.floor(h*6); local f = h*6 - i | |
| local p, q, t = v*(1-s), v*(1-s*f), v*(1-s*(1-f)) | |
| i = i % 6 | |
| if i==0 then return v,t,p | |
| elseif i==1 then return q,v,p | |
| elseif i==2 then return p,v,t | |
| elseif i==3 then return p,q,v | |
| elseif i==4 then return t,p,v | |
| else return v,p,q end | |
| end | |
| utils:AddAnimation(image.id .. "_SeamlessOrb", { | |
| Outputs = { | |
| image.instance, | |
| image2.instance, | |
| image3.instance, | |
| image4.instance, | |
| image5.instance, | |
| image6.instance | |
| }, | |
| RenderOnLoad = true, | |
| Duration = 5.0, -- rimane 5s, ma tutto è sincronizzato | |
| }, framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function(writePixel, resolution, frameIndex, totalFrames) | |
| local w, h = resolution.X, resolution.Y | |
| -- tNorm [0,1), tAngle [0,2π) | |
| local tNorm = (frameIndex-1) / totalFrames | |
| local tAngle = tNorm * (2 * math.pi) | |
| -- particelle frame-specifiche | |
| local particles = {} | |
| for i=1,settings.particleCount do | |
| local a = math.random() * 2 * math.pi | |
| local s = settings.particleSpeed * (0.5 + math.random() * 0.5) | |
| particles[i] = { vx = math.cos(a)*s, vy = math.sin(a)*s, life = math.random() } | |
| end | |
| animator.computePixels(resolution, function(idx, px, py) | |
| local ux = (px + .5)/w*2 - 1 | |
| local uy = (py + .5)/h*2 - 1 | |
| local nx, ny = ux * settings.coordScale, uy * settings.coordScale | |
| local r = math.sqrt(nx*nx + ny*ny) | |
| local angle = math.atan2(ny, nx) | |
| -- colore orb | |
| -- mf varia da 0→1→0 in un ciclo esatto | |
| local mf = 0.5 + 0.5 * math.sin(tAngle * 1) -- 1 ciclo | |
| local ci = math.floor(mf * (#aiColors-1)) + 1 | |
| local c0, c1 = aiColors[ci], aiColors[ci+1] or aiColors[1] | |
| local lerp = fract(mf * (#aiColors-1)) | |
| local br = c0[1] + (c1[1]-c0[1])*lerp | |
| local bg = c0[2] + (c1[2]-c0[2])*lerp | |
| local bb = c0[3] + (c1[3]-c0[3])*lerp | |
| -- pulsazione: 1 ciclo perfetto in tNorm | |
| local pulse = 1 + 0.1 * math.sin(tAngle * 1) | |
| -- corpo | |
| local bodyCov = smoothstep(settings.ringWidth[1]*pulse, | |
| settings.ringWidth[1]*pulse - AA, r) | |
| local aBody = bodyCov * (settings.bodyAlphaMax/255) | |
| -- glow | |
| local glowCov = 0 | |
| if r > settings.ringWidth[#settings.ringWidth]*pulse | |
| and r < settings.ringWidth[#settings.ringWidth]*pulse + settings.glowRange then | |
| glowCov = smoothstep( | |
| settings.ringWidth[#settings.ringWidth]*pulse + settings.glowRange, | |
| settings.ringWidth[#settings.ringWidth]*pulse, | |
| r | |
| ) | |
| end | |
| local aGlow = glowCov * settings.glowAlphaMax | |
| -- anelli fluidi: ognuno completa N cicli in tNorm | |
| local aRings = 0 | |
| for i=1,settings.ringCount do | |
| local w0 = settings.ringWidth[i]*pulse | |
| local phase = tAngle * settings.ringSpeed[i] | |
| local waveR = w0 + settings.ringWaveAmp[i] * | |
| math.sin( phase + r * settings.ringWaveFreq[i] ) | |
| local cov = smoothstep(waveR + AA, waveR - AA, r) | |
| aRings = math.max(aRings, cov) | |
| end | |
| -- particelle | |
| local aPart = 0 | |
| for _,p in ipairs(particles) do | |
| local pxn = p.vx * p.life * pulse | |
| local pyn = p.vy * p.life * pulse | |
| local dist = math.sqrt((nx-pxn)^2 + (ny-pyn)^2) | |
| if dist < settings.particleSize then | |
| aPart = math.max(aPart, (1-p.life)*p.life*5) | |
| end | |
| end | |
| -- ombra interna | |
| local shadow = smoothstep(settings.shadowWidth + AA, | |
| settings.shadowWidth - AA, r) | |
| local vign = 1 - smoothstep(0.7,1.0,r) * settings.vignetteAmp | |
| -- composizione finale | |
| local alpha = math.max(aBody, aGlow, aRings, aPart) | |
| local cr = br * vign * (1 - shadow*0.5) | |
| local cg = bg * vign * (1 - shadow*0.5) | |
| local cb = bb * vign * (1 - shadow*0.5) | |
| local a = math.floor(clamp(alpha * 255,0,255)+0.5) | |
| writePixel(idx, | |
| clamp(math.floor(cr*255+.5),0,255), | |
| clamp(math.floor(cg*255+.5),0,255), | |
| clamp(math.floor(cb*255+.5),0,255), | |
| a | |
| ) | |
| end) | |
| end))) | |
| end | |
| utils:EndSetup() | |
| ui.nextSize(framework.enums.WindowState.Base) | |
| ui.Loaded = true | |
| return ui | |
| end | |
| framework.dependencies:Add("gui", framework.protected:ProtectTable(this)) | |
| end | |
| do -- arceus intelligence | |
| local axintelligence, customCmds = {}, framework.protected:GCProtect({}) | |
| local arcyTable = framework.protected:GCProtect({}) | |
| local lastPrompt, gameInfos = "", "; The following are information about the current game's place the user is playing:" | |
| ..`- Place Id: {game.PlaceId}, use this to determinate the place's id` | |
| ..`- Game Id: {game.GameId}, use this to determinate the game's id` | |
| task.spawn(function() | |
| local market = framework.protected:GetService("MarketplaceService") | |
| local succ, err = pcall(market.GetProductInfo, market, game.PlaceId) | |
| if not succ or not err then return end | |
| gameInfos ..= (`- Place name: {err.Name}, use this to determinate the place name if required` | |
| ..`- Place creator: {err.Creator.Name}, use this to determinate the place creator's name if required`) | |
| end); | |
| (framework.env.getgenv() or {}).arcy = arcyTable | |
| local processMessage = framework.protected:GCProtect(LPH_JIT(function(msg: string) | |
| msg = framework.utils.strings.split(msg, "```") | |
| local data = { codes = {}, texts = {} } | |
| for i=1, #msg, 2 do | |
| framework.utils.tables.insert(data.texts, msg[i]) | |
| end | |
| for i=2, #msg, 2 do | |
| local mess = msg[i] | |
| if framework.utils.strings.sub(mess, 1, 4):lower() == "luau" then | |
| mess = framework.utils.strings.sub(mess, 5) | |
| elseif framework.utils.strings.sub(mess, 1, 3):lower() == "lua" then | |
| mess = framework.utils.strings.sub(mess, 4) | |
| end | |
| framework.utils.tables.insert(data.codes, mess) | |
| end | |
| return data | |
| end)) | |
| function axintelligence:Chat(prompt: string) | |
| if prompt == lastPrompt or framework.utils.strings.gsub(prompt, "%s", "") == "" then return end | |
| local exploit = framework.dependencies.exploit | |
| local name, ver = framework.env.identifyexecutor() | |
| local player = framework.protected:GetService("Players").LocalPlayer | |
| local sysInfo = "The following are information about the app the user have installed on their device, use these only if needed:" | |
| ..`- Operating System: {exploit:IsIos() and "iOS" or (`Android{exploit:IsVng() and " VNG" or ""}`)}` | |
| ..`- App Version: {ver} - App Identity: {name};` | |
| ..`The following are information about the user, use these only if needed:` | |
| ..`- Device hwid/User identificator: {exploit:GetHwid()}` | |
| ..`- User Name: {player.DisplayName}, use this when refeering to him` | |
| ..`- User Username: {player.Name}, use this when needed in scripts;` | |
| .."You can use the following custom functions accessible from the env within the 'arcy' table:" | |
| for name, values in pairs(customCmds) do | |
| sysInfo ..= `arcy.{values.format}: {values.desc}` | |
| end | |
| sysInfo ..= gameInfos | |
| local token = framework.settings:GetSetting("User_AI_OpenAI") | |
| if token ~= "" then | |
| return processMessage("Response from OpenAI") | |
| end | |
| local req = framework.utils.http:Request(`{endpoints.api}/chat`, "POST", { | |
| [LPH_ENCSTR("Content-Type")] = LPH_ENCSTR("application/json") | |
| }, { | |
| email = framework.protected:IsStudio() and LPH_ENCSTR("arceusxhelp@gmail.com") or framework.settings:GetSetting(LPH_ENCSTR("User_EMail")), | |
| hwid = framework.protected:IsStudio() and LPH_ENCSTR("4cd6f60cb195d6d9") or framework.dependencies.exploit:GetHwid(), | |
| syskey = sysInfo, | |
| key = prompt | |
| }) | |
| local fail = "Arceus Intelligence is not available, please try again later." | |
| if not req then return processMessage(fail) end | |
| local json = framework.utils.http.json.decode(req.Body) | |
| if not json.success then return processMessage(fail) end | |
| return processMessage(json.message or fail) | |
| end | |
| function axintelligence:AddCustomFunction(name: string, desc: string, format: string, funct: (any) -> ()) | |
| arcyTable[name] = framework.env.newcclosure(framework.env.GCProtectedFunction(funct)) | |
| customCmds[name] = { | |
| format = format, | |
| desc = desc | |
| } | |
| end | |
| framework.dependencies:Add("axintelligence", framework.protected:ProtectTable(axintelligence)) | |
| end | |
| do -- track player | |
| local marketplace = framework.protected:GetService("MarketplaceService") | |
| local track, cache = {}, framework.utils.caches.newCache() | |
| local timeUpdate = framework.signals.newEvent() | |
| local sound, conn, deb, playing, paused | |
| track.OnTimeUpdated = timeUpdate | |
| function track:Connect(track: Sound) | |
| sound = framework.utils.instances.getRobloxInstance(track) | |
| end | |
| track.Play = LPH_JIT(function(self, url: string?) | |
| if deb then return end | |
| paused = false | |
| deb = true | |
| self:Stop() | |
| local content = framework.protected:ProtectAsset(`rbxassetid://{url}`) | |
| local data = cache:Get(url) | |
| if not url then | |
| content = sound.SoundId | |
| local id = framework.utils.strings.gsub(content, "rbxassetid://", "") | |
| data = { IsPublicDomain = not not tonumber(id) } | |
| elseif tonumber(url) then | |
| if not data then | |
| local succ, err = pcall(marketplace.GetProductInfo, marketplace, url) | |
| if not succ or not err then deb = false return end | |
| cache:Push(url, err) | |
| data = err | |
| end | |
| else | |
| -- temp disabled | |
| if true then deb = false return end | |
| local name = framework.utils.strings.split("?v=") | |
| if #name < 2 then deb = false return end | |
| name = framework.protected:ProtectAsset(`{name[#name]}.mp3`) | |
| if not ARCEUS_FOLDERS.CACHE:IsFile(name) then | |
| -- download | |
| local info = { | |
| Creator = { Name = "IDK" }, | |
| IsPublicDomain = true, | |
| Name = "IDK" | |
| } | |
| ARCEUS_FOLDERS.CACHE:WriteFile(name, "raw") | |
| cache:Push(url, info) | |
| data = info | |
| end | |
| local succ, asset = pcall(framework.env.getcustomasset, name) | |
| content = succ and asset or content | |
| end | |
| if not data.IsPublicDomain then deb = false return end | |
| sound.SoundId = content | |
| sound.Looped = true | |
| if not sound.IsLoaded then sound.Loaded:Wait() end | |
| playing = true | |
| conn = task.spawn(LPH_NO_VIRTUALIZE(function() | |
| while playing do | |
| if not sound.Looped and sound.TimePosition >= sound.TimeLength then break end | |
| timeUpdate:Fire(sound.TimePosition) | |
| task.wait(1) | |
| end | |
| end)) | |
| sound:Play() | |
| deb = false | |
| return data | |
| end) | |
| function track:GetTiming() | |
| return `{framework.utils.datetimes.secondsToMS(sound.TimePosition)} / {framework.utils.datetimes.secondsToMS(sound.TimeLength)}`, sound.TimePosition/sound.TimeLength | |
| end | |
| function track:GetLenght() | |
| return sound.TimeLength | |
| end | |
| function track:SetTime(seconds: number) | |
| sound.TimePosition = framework.utils.maths.clamp(seconds, 0, sound.TimeLength) | |
| timeUpdate:Fire(sound.TimePosition) | |
| end | |
| function track:Toggle() | |
| if not playing then return self:Play() end | |
| if paused then | |
| sound:Resume() | |
| paused = false | |
| return true | |
| end | |
| paused = true | |
| sound:Pause() | |
| return false | |
| end | |
| function track:Stop() | |
| playing = false | |
| if conn then task.cancel(conn) conn = nil end | |
| sound:Stop() | |
| end | |
| function track:IsPaused() | |
| return paused | |
| end | |
| framework.dependencies:Add("track", framework.protected:ProtectTable(track)) | |
| end | |
| do -- plugins | |
| local plugins = framework.protected:IsStudio() and require(script.Parent.Parent:WaitForChild("Arceus Plugins"):WaitForChild("Loader")) or | |
| loadstring(framework.utils.http:Get(`{endpoints.arceus_neo}/plugin-loader`))(framework) | |
| local added, atached, detached = framework.signals.newEvent(), framework.signals.newEvent(), framework.signals.newEvent() | |
| local infos = framework.protected:GCProtect({}) | |
| local getPlugin = framework.protected:GCProtect(function(id: string) | |
| for i, info in ipairs(infos) do | |
| if info.id == id then return info, i end | |
| end | |
| return false, 0 | |
| end) | |
| plugins.OnPluginAdded = added | |
| plugins.OnPluginAtached = atached | |
| plugins.OnPluginDetached = detached | |
| function plugins:Setup(id: string, plug: {any}) | |
| local info = getPlugin(id) | |
| if not info then return false end | |
| info.instance = plug | |
| function info:Detach() | |
| plug.attach() | |
| plug.show(true) | |
| --plug:SetEnabled(true) | |
| detached:Fire(plug) | |
| end | |
| function info:Attach(parent: {any}) | |
| plug:SetEnabled(false) | |
| plug.detach(parent) | |
| atached:Fire(plug) | |
| end | |
| return info | |
| end | |
| local last | |
| function plugins:Open(id: string, parent: {any}) | |
| local info = getPlugin(id) | |
| if not info then return false end | |
| last = id | |
| if not info.thread then | |
| local succ, thread = pcall(task.spawn, plugins.Load, plugins, info.source, info.id) | |
| if not succ then return framework.console.warn(`Error while loading '{info.title}' plugin: {thread}`) end | |
| info.thread = thread | |
| elseif info.instance then | |
| info:Attach(parent) | |
| end | |
| end | |
| function plugins:GetLastOpened() | |
| return last and self:Get(last) or nil | |
| end | |
| local loaded = 0 | |
| function plugins:Add(info: {string}) | |
| if info.id and getPlugin(info.id) then return end | |
| local data = { | |
| source = info.source or "error('Missing plugin source')", | |
| title = info.title or "Unknown", | |
| id = info.id or `Plugin_{loaded}`, | |
| icon = info.icon, | |
| url = info.url | |
| } | |
| loaded += 1 | |
| table.insert(infos, data) | |
| added:Fire(data) | |
| end | |
| function plugins:Remove(id: string) | |
| local info, idx = getPlugin(id) | |
| if not info then return false end | |
| if last == id then last = nil end | |
| table.remove(infos, idx) | |
| if info.url then | |
| local plugs = self:GetSaved() | |
| local found = framework.utils.tables.find(plugs, info.url) | |
| if found then framework.utils.tables.remove(plugs, found) end | |
| self:Save(plugs) | |
| end | |
| if info.thread then task.cancel(info.thread) end | |
| if info.instance then | |
| info.instance.attach() | |
| info.instance:Remove() | |
| end | |
| end | |
| function plugins:GetSaved() | |
| return ARCEUS_FOLDERS.CONFIGS:ReadJsonFile(EXPLOIT_CONFIGS.PLUGINS_FILE, EXPLOIT_CONFIGS.FILES_KEY) or {} | |
| end | |
| function plugins:Install(url: string) | |
| if framework.utils.strings.gsub(url, "%s", "") == "" then return end | |
| local res = framework.utils.http:Request(url, "GET") | |
| if not res then return end | |
| local json = framework.utils.http.json.decode(res.Body) | |
| if not json then return end | |
| local plugs = self:GetSaved() | |
| framework.utils.tables.insert(plugs, url) | |
| self:Save(plugs) | |
| json.url = url | |
| self:Add(json) | |
| end | |
| function plugins:Save(data: {any}) | |
| ARCEUS_FOLDERS.CONFIGS:WriteJsonFile(EXPLOIT_CONFIGS.PLUGINS_FILE, data, EXPLOIT_CONFIGS.FILES_KEY) | |
| end | |
| function plugins:Get(id: string) | |
| return getPlugin(id) | |
| end | |
| framework.dependencies:Add("plugins", framework.protected:ProtectTable(plugins)) | |
| end | |
| do -- exploit | |
| local exploit = {} | |
| local urlAttemp = framework.signals.newEvent() | |
| exploit.OnUrlAttemp = urlAttemp | |
| function exploit:IsIos() | |
| return OS_CONFIGS.IS_IOS | |
| end | |
| function exploit:IsVng() | |
| return OS_CONFIGS.IS_VNG | |
| end | |
| function exploit:GetHwid() | |
| return OS_CONFIGS.HWID | |
| end | |
| function exploit:GetDeviceInfo(stat: string) | |
| return OS_CONFIGS.DEVICE_INFO(stat, LPH_ENCSTR("asjhidaheruiwepwasjdhs")) | |
| end | |
| function exploit:LoadUrl(url: string, retries: number?, del: number?, ...) | |
| local res, c = nil, 0 | |
| retries = retries or 3 | |
| del = del or 2 | |
| repeat | |
| if res ~= nil then | |
| c += 1 | |
| if retries > 0 and c > retries then break end | |
| task.wait(del) | |
| end | |
| urlAttemp:Fire(url, c) | |
| res = framework.utils.http:Request(url, ...) | |
| until res | |
| urlAttemp:Fire(url, c, res.Body) | |
| return res.Body | |
| end | |
| function exploit:DecryptData(data: string) | |
| return framework.utils.crypt.bytes(framework.utils.crypt.base64.decode(data), EXPLOIT_CONFIGS.FILES_KEY) | |
| end | |
| function exploit:EncryptData(data: string) | |
| return framework.utils.crypt.base64.encode(framework.utils.crypt.bytes(data, EXPLOIT_CONFIGS.FILES_KEY)) | |
| end | |
| function exploit:DownloadFile(path: string) | |
| local res = framework.utils.http:Request(`{endpoints.arceus_v}{path}`) | |
| return res and res.Body or false | |
| end | |
| exploit.GetMetadata = function(self, data: {any}|string, source: string?) | |
| data = data or {} | |
| if typeof(data) == "string" then | |
| local firstLine, restOfScript = framework.utils.strings.match(data, "^(.-)\n(.*)$") | |
| if not firstLine then return false, data end | |
| local metadata = framework.utils.strings.match(firstLine, "^%-%-@ArceusMetadata:(.*)$") | |
| if not metadata then return false, data end | |
| return framework.utils.http.json.decode(exploit:DecryptData(metadata)), restOfScript | |
| else | |
| local plrs = framework.protected:GetService("Players") | |
| local tim = os.time() | |
| local current = { | |
| email = framework.settings:GetSetting(LPH_ENCSTR("User_EMail")), | |
| userId = plrs.LocalPlayer.UserId, | |
| hwid = exploit:GetHwid() | |
| } | |
| data.creation = data.creation or tim | |
| data.author = data.author or current | |
| data.editor = current | |
| data.viewed = tim | |
| local json = framework.utils.http.json.encode(data) | |
| if not json then return false, source end | |
| return `--@ArceusMetadata:{exploit:EncryptData(json)}\n{source or ""}` | |
| end | |
| end | |
| exploit.Migrate = LPH_JIT(function(self) | |
| -- Migrate auto-executed files | |
| for _, file in ipairs(ARCEUS_FOLDERS.AUTOEXECUTE:ListFiles()) do | |
| local src = framework.storage.readFile(nil, file) | |
| if not src then continue end | |
| local data, source = self:GetMetadata(src) | |
| if data and data.migrated then continue end | |
| local name = framework.utils.strings.split(file, "/") | |
| name = name[#name] | |
| local meta = self:GetMetadata({ | |
| autoexecute = true, | |
| migrated = true | |
| }, source) | |
| --ARCEUS_FOLDERS.AUTOEXECUTE:WriteFile(name, meta) | |
| ARCEUS_FOLDERS.SCRIPT_HUB:WriteFile(name, meta) | |
| end | |
| do -- Migrate tabs | |
| local old_tabs = ARCEUS_FOLDERS.CONFIGS:ReadJsonFile("tabs.ax", "AXExecutor") | |
| local tabs = framework.dependencies.editortabs | |
| if old_tabs then | |
| local new_tabs = tabs:ReadTabs() | |
| for _, tab in ipairs(old_tabs) do | |
| if tab.migrated then continue end | |
| tab.migrated = true | |
| framework.utils.tables.insert(new_tabs, { | |
| src = tab.Source, | |
| name = tab.Name | |
| }) | |
| end | |
| ARCEUS_FOLDERS.CONFIGS:WriteJsonFile("tabs.ax", old_tabs, "AXExecutor") | |
| tabs:WriteTabs(new_tabs) | |
| end | |
| end | |
| end) | |
| framework.dependencies:Add("exploit", framework.protected:ProtectTable(exploit)) | |
| end | |
| do -- scripts hub | |
| local hub = {} | |
| local history, historyIdx = framework.protected:GCProtect({}), 0 | |
| local browsed = framework.signals.newEvent() | |
| local queried = framework.signals.newEvent() | |
| local sortFiles = framework.protected:GCProtect(function(files: {any}) | |
| local now = os.time() | |
| framework.utils.tables.sort(files, LPH_NO_VIRTUALIZE(function(a, b) | |
| local _, metaA, _, metaB = a:Read(), b:Read() | |
| if metaA and metaA.edited and metaB and metaB.edited then | |
| metaA, metaB = metaA.edited, metaB.edited | |
| else | |
| metaA, metaB = a.name, b.name | |
| end | |
| return metaA < metaB | |
| end)) | |
| return files | |
| end) | |
| local duplicated | |
| duplicated = framework.protected:GCProtect(LPH_JIT_MAX(function(directory: string, name: string, extension: string, overwrite: boolean?, counter: number) | |
| counter = counter or 0 | |
| local path = `{directory}/{name}{(counter > 0 and ` ({counter})` or "")}.{extension}` | |
| if not overwrite and ARCEUS_FOLDERS.SCRIPT_HUB:IsFile(path) then | |
| return duplicated(directory, name, extension, false, counter +1) | |
| end | |
| return path | |
| end)) | |
| local connectFile = framework.protected:GCProtect(function(info: {any}) | |
| local ext = framework.utils.strings.split(info.name, ".") | |
| info.extension = framework.utils.strings.lower(ext[#ext]) | |
| info.name = ext[framework.utils.maths.clamp(#ext -1, 1, #ext)] | |
| function info:Read() | |
| local source, content | |
| if self:IsLua() then | |
| local src = framework.storage.readFile(nil, self.path) | |
| content, source = framework.dependencies.exploit:GetMetadata(src or "") | |
| elseif self:IsJson() then | |
| source = framework.storage.readJsonFile(nil, self.path) | |
| end | |
| return source, content | |
| end | |
| function info:Write(source: string, content: {any}?) | |
| if self:IsLua() then | |
| if not content then _, content = self:Read() end | |
| source = framework.dependencies.exploit:GetMetadata(content, source) | |
| framework.storage.writeFile(nil, self.path, source) | |
| elseif self:IsJson() then | |
| framework.storage.writeJsonFile(nil, self.path, source) | |
| end | |
| end | |
| function info:SetProperty(props: {any}) | |
| if not self:IsLua() then return end | |
| local source, content = self:Read() | |
| content = content or {} | |
| for prop, value in pairs(props) do | |
| content[prop] = value | |
| end | |
| self:Write(source, content) | |
| end | |
| function info:GetProperty(prop: string) | |
| if not self:IsLua() then return end | |
| local _, content = self:Read() | |
| return (content or {})[prop] | |
| end | |
| function info:Delete() framework.storage.deleteFile(nil, self.path) end | |
| function info:Rename(name: string, extension: string?) | |
| extension = extension and framework.utils.strings.lower(extension) or "lua" | |
| name = framework.utils.strings.gsub(name, "[./]", "") | |
| if name == self.name then return false end | |
| local path = framework.utils.strings.gsub(self.path, self.name, "") | |
| path = duplicated(path, name, extension) | |
| local content = framework.storage.readFile(nil, self.path) | |
| if not content then return false end | |
| framework.storage.writeFile(nil, path, content) | |
| framework.storage.deleteFile(nil, self.path) | |
| self.extension = extension | |
| self.name = name | |
| self.path = path | |
| return true | |
| end | |
| function info:IsLua() | |
| return self.extension == "lua" or self.extension == "luau" | |
| end | |
| function info:IsJson() | |
| return self.extension == "json" | |
| end | |
| return info | |
| end) | |
| local clone | |
| clone = framework.protected:GCProtect(LPH_JIT_MAX(function(path: string, dest: string) | |
| for _, file in ipairs(framework.storage.listFiles(nil, path)) do | |
| local content = framework.storage.readFile(nil, file) | |
| local last = framework.utils.strings.split(file, "/") | |
| local dest = `{dest}/{last[#last]}` | |
| if not content then -- is folder | |
| framework.storage.makeFolder(nil, dest) | |
| clone(file, dest) | |
| continue | |
| end | |
| framework.storage.writeFile(nil, dest, content) | |
| end | |
| end)) | |
| local deeprecursion | |
| deeprecursion = framework.protected:GCProtect(LPH_JIT_MAX(function(path: string, data: {any}, indent: {any}, action: (filePath: string, fileName: string) -> boolean) | |
| for _, file in ipairs(framework.storage.listFiles(nil, path)) do | |
| local last = framework.utils.strings.split(file, "/") | |
| last = last[#last] | |
| if framework.storage.isFolder(nil, file) then | |
| local indent = framework.utils.tables.deepCopy(indent) | |
| framework.utils.tables.insert(indent, last) | |
| deeprecursion(file, data, indent, action) | |
| continue | |
| end | |
| if action(path, last) then | |
| framework.utils.tables.insert(data, connectFile({ | |
| indent = indent, | |
| path = file, | |
| name = last | |
| })) | |
| end | |
| end | |
| sortFiles(data) | |
| return data | |
| end)) | |
| hub.OnBrowsed = browsed | |
| hub.OnQueried = queried | |
| function hub:SetHistory(path: string, overwrite: boolean?) | |
| if overwrite then | |
| for i=historyIdx +1, #history, 1 do | |
| framework.utils.tables.remove(history, i) | |
| end | |
| end | |
| framework.utils.tables.insert(history, path) | |
| historyIdx = #history | |
| end | |
| function hub:LastBrowsed() | |
| return history[historyIdx] or "" | |
| end | |
| function hub:BrowsePrevious(...: any) | |
| local path = history[historyIdx -1] | |
| if path then | |
| historyIdx -= 1 | |
| return self:Browse(path, true, ...) | |
| end | |
| end | |
| function hub:BrowseNext(...: any) | |
| local path = history[historyIdx +1] | |
| if path then | |
| historyIdx += 1 | |
| return self:Browse(path, true, ...) | |
| end | |
| end | |
| hub:SetHistory(ARCEUS_FOLDERS.SCRIPT_HUB.path) | |
| function hub:Browse(path: string, dontHistory: boolean?, ...: any) | |
| local data = { folders = {}, files = {} } | |
| path = path or self:LastBrowsed() | |
| local extra = {...} | |
| path = framework.utils.strings.gsub(path, `{ARCEUS_FOLDERS.SCRIPT_HUB.path}`, "") | |
| path = framework.utils.strings.sub(path, 1, 1) == "/" and framework.utils.strings.sub(path, 2) or path | |
| path = framework.utils.strings.sub(path, 1, 1) == "/" and framework.utils.strings.sub(path, 2) or path | |
| if not dontHistory then self:SetHistory(path, true) end | |
| for _, file in ipairs(ARCEUS_FOLDERS.SCRIPT_HUB:ListFiles(path)) do | |
| file = framework.utils.strings.gsub(file, "//", "/") | |
| local name = framework.utils.strings.split(file, "/") | |
| name = name[#name] | |
| local info = { path = file, name = name } | |
| local isfile = framework.storage.isFile(nil, file) | |
| if isfile then | |
| framework.utils.tables.insert(data.files, connectFile(info)) | |
| continue | |
| end | |
| function info:Delete() framework.storage.deleteFolder(nil, self.path) end | |
| function info:Open() | |
| return hub:Browse(self.path, false, framework.utils.tables.unpack(extra)) | |
| end | |
| function info:Rename(name: string) | |
| if name == self.name then return false end | |
| local path = framework.utils.strings.gsub(self.path, self.name, "") | |
| name = framework.utils.strings.gsub(name, "[./]", "") | |
| path = duplicated(path, name, "") | |
| framework.storage.makeFolder(nil, path) | |
| clone(self.path, path) | |
| framework.storage.deleteFolder(nil, self.path) | |
| self.name = name | |
| self.path = path | |
| return true | |
| end | |
| framework.utils.tables.insert(data.folders, info) | |
| end | |
| local basePath = ARCEUS_FOLDERS.SCRIPT_HUB.path | |
| local fullPath = `{basePath}/{path}` | |
| --fullPath = framework.protected:GCProtect(fullPath, "//", "/") | |
| local directories, splittedDirectory = {}, framework.utils.strings.split(fullPath, "/") | |
| for i, directory in ipairs(splittedDirectory) do | |
| local info = { name = directory } | |
| local path = basePath | |
| for j=2, i, 1 do | |
| path ..= `/{splittedDirectory[j]}` | |
| end | |
| info.path = path | |
| function info:Browse() | |
| hub:Browse(self.path, false, framework.utils.tables.unpack(extra)) | |
| end | |
| framework.utils.tables.insert(directories, info) | |
| end | |
| sortFiles(data.files) | |
| framework.utils.tables.sort(data.folders, function(a, b) | |
| return a.name < b.name | |
| end) | |
| browsed:Fire(data, directories, ...) | |
| return data, directories | |
| end | |
| function hub:Search(query: string, path: string?, ...: any) | |
| if not query or query == "" then return self:Browse(path, false, ...) end | |
| path = path or self:LastBrowsed() | |
| local res = deeprecursion(path, {}, {}, function(path: string, name: string) | |
| return not not framework.utils.strings.find(framework.utils.strings.lower(name), query) | |
| end) | |
| queried:Fire(res, ...) | |
| return res | |
| end | |
| --props = { prop = {true, false}, prop = {"str"} } | |
| function hub:FindByProperties(props: {string}, path: string?, ...: any) | |
| path = path or self:LastBrowsed() | |
| local res = deeprecursion(path, {}, {}, function(path: string, name: string) | |
| local content = ARCEUS_FOLDERS.TABS:ReadFile(name) | |
| if not content then return false end | |
| local meta = framework.dependencies.exploit:GetMetadata(content) | |
| if not meta then return false end | |
| for prop, values in pairs(props) do | |
| if meta[prop] == nil then return false end | |
| local found = false | |
| for _, value in ipairs(values) do | |
| if meta[prop] == value then found = true end | |
| end | |
| if not found then return false end | |
| end return true | |
| end) | |
| queried:Fire(res, ...) | |
| return res | |
| end | |
| function hub:NewFile(name: string, source: string, extension: string?, content: {any}?, path: string?, overwrite: boolean?, browse: boolean?) | |
| path = path and framework.utils.strings.gsub(path, `/{ARCEUS_FOLDERS.SCRIPT_HUB.path}`, "") | |
| local directory = path or self:LastBrowsed() | |
| name = framework.utils.strings.gsub(name, "[./]", "") | |
| extension = extension and framework.utils.strings.lower(extension) or "lua" | |
| path = duplicated(directory, name, extension, overwrite) | |
| if extension == "lua" or extension == "luau" then | |
| source = framework.dependencies.exploit:GetMetadata(content, source) | |
| ARCEUS_FOLDERS.SCRIPT_HUB:WriteFile(path, source) | |
| elseif extension == "json" then | |
| ARCEUS_FOLDERS.SCRIPT_HUB:WriteJsonFile(path, source) | |
| end | |
| return self:Browse(directory, not browse and true or false) | |
| end | |
| function hub:NewFolder(name: string, path: string?, browse: boolean?) | |
| local directory = path or self:LastBrowsed() | |
| path = `{directory}/{name}` | |
| local res = ARCEUS_FOLDERS.SCRIPT_HUB:MakeFolder(path) | |
| if res and browse then return self:Browse(directory) end | |
| return res | |
| end | |
| function hub:GetFile(path: string, name: string) | |
| if not ARCEUS_FOLDERS.SCRIPT_HUB:IsFile(`{path}/{name}`) then return end | |
| return connectFile({ path = `{ARCEUS_FOLDERS.SCRIPT_HUB.path}/{path}/{name}`, name = name }) | |
| end | |
| framework.dependencies:Add("scripthub", framework.protected:ProtectTable(hub)) | |
| end | |
| do -- editor tabs | |
| local editortabs, tabsData = {}, framework.protected:GCProtect({}) | |
| local scripthub = framework.dependencies.scripthub | |
| local exploit = framework.dependencies.exploit | |
| local tabs = framework.utils.inputs.tabs.new() | |
| local saveTabs = framework.protected:GCProtect(function(data: {any}?) | |
| local tabs = {} | |
| for _, tab in ipairs(data or tabsData) do | |
| framework.utils.tables.insert(tabs, { | |
| meta = exploit:GetMetadata(tab.meta, "-- Editor"), | |
| name = tab.name, | |
| src = tab.src | |
| }) | |
| end | |
| ARCEUS_FOLDERS.CONFIGS:WriteJsonFile(EXPLOIT_CONFIGS.TABS_FILE, tabs) | |
| end) | |
| local getFreeName = framework.protected:GCProtect(function() | |
| local found, idx = true, 0 | |
| local name | |
| while found do | |
| idx += 1 | |
| found = false | |
| name = `Script n.{idx}` | |
| for _, tab in ipairs(tabsData) do | |
| if tab.name == name then | |
| found = true | |
| break | |
| end | |
| end | |
| end | |
| return name | |
| end) | |
| local formatTab = framework.protected:GCProtect(function(data: {any}) | |
| data.name = data.name or getFreeName() | |
| data.src = data.src or "" | |
| return data | |
| end) | |
| tabs.OnTabRemoved:Connect(framework.protected:GCProtect(function(tab: {any}) | |
| local data = tab:GetData() | |
| local found = 1 | |
| if not data.isFile then | |
| found = framework.utils.tables.find(tabsData, data) | |
| if found then framework.utils.tables.remove(tabsData, found) end | |
| saveTabs() | |
| end | |
| tab:Update(framework.enums.TabUpdate.Removed) | |
| data.updated = nil -- prevent events propagation | |
| local newTab = tabsData[found] or tabsData[found -1] | |
| if newTab then newTab.tab:Select() end | |
| end)) | |
| local currentTab | |
| tabs.OnTabSelected:Connect(framework.protected:GCProtect(function(tab: {any}, previous: {any}) | |
| currentTab = tab | |
| if previous then local data = previous:GetData() | |
| previous:Update(framework.enums.TabUpdate.Unselected) | |
| end | |
| local data = tab:GetData() | |
| tab:Update(framework.enums.TabUpdate.Selected) | |
| end)) | |
| function editortabs:AddTab(name: string, source: string, button: GuiButton, updatedCallback: () -> (), isSaved: boolean?, metadata: {any}?) | |
| local data = formatTab({ | |
| updated = updatedCallback, | |
| isFile = isSaved, | |
| meta = metadata, | |
| src = source, | |
| name = name | |
| }) | |
| if not isSaved then | |
| framework.utils.tables.insert(tabsData, data) | |
| end | |
| local tab = tabs:Add(button, data) | |
| function tab:SetName(name: string) | |
| if not name or name == "" or name == data.name then return end | |
| if data.isFile then self:Delete(false) end | |
| data.name = name | |
| formatTab(data) | |
| if data.isFile then return self:ToFile(true) end | |
| self:Update(framework.enums.TabUpdate.Name) | |
| saveTabs() | |
| end | |
| function tab:Update(type: number) | |
| if data.updated then data.updated(type) end | |
| end | |
| function tab:GetName() | |
| return data.name | |
| end | |
| function tab:SetSource(src: string) | |
| data.src = tostring(src) | |
| self:Update(framework.enums.TabUpdate.Source) | |
| if data.isFile then return self:ToFile(true) end | |
| saveTabs() | |
| end | |
| function tab:GetSource() | |
| return data.src | |
| end | |
| function tab:SetProperty(prop: string, value: any) | |
| data.meta = data.meta or {} | |
| data.meta[prop] = value | |
| if data.isFile then return self:ToFile(true) end | |
| saveTabs() | |
| end | |
| function tab:GetProperty(prop: string) | |
| data.meta = data.meta or {} | |
| return data.meta[prop] | |
| end | |
| function tab:GetProperties() | |
| return data.meta | |
| end | |
| function tab:ToFile(overwrite: boolean?) | |
| if scripthub:NewFile(data.name, data.src, "lua", data.meta, ARCEUS_FOLDERS.TABS.lastPath, overwrite) then | |
| if not overwrite then return self:Delete(true) end | |
| self:Update(framework.enums.TabUpdate.Name) | |
| data.isFile = true | |
| end | |
| end | |
| function tab:GetFile() | |
| return scripthub:GetFile(ARCEUS_FOLDERS.TABS.lastPath, `{data.name}.lua`) | |
| end | |
| function tab:Delete(remove: boolean) | |
| if self:GetData().isFile then | |
| ARCEUS_FOLDERS.TABS:DeleteFile(`{data.name}.lua`) | |
| end | |
| if remove then self:Remove() end | |
| end | |
| data.tab = tab | |
| return tab | |
| end | |
| function editortabs:GetSelection() | |
| return currentTab | |
| end | |
| function editortabs:GetTabs() | |
| local tabs = {} | |
| for _, tab in ipairs(tabsData) do | |
| framework.utils.tables.insert(tabs, tab.tab) | |
| end | |
| return tabs | |
| end | |
| function editortabs:SearchSaved(query: string, ...: any) | |
| return scripthub:Search(query, ARCEUS_FOLDERS.TABS.path, ...) | |
| end | |
| function editortabs:GetSavedByProperties(props: {string}, ...) | |
| return scripthub:FindByProperties(props, ARCEUS_FOLDERS.TABS.path, ...) | |
| end | |
| function editortabs:GetSaved(...: any) | |
| return scripthub:Browse(ARCEUS_FOLDERS.TABS.lastPath, true, ...) | |
| end | |
| function editortabs:ReadTabs() | |
| return ARCEUS_FOLDERS.CONFIGS:ReadJsonFile(EXPLOIT_CONFIGS.TABS_FILE) or {} | |
| end | |
| function editortabs:WriteTabs(data: {any}) | |
| return saveTabs(data) | |
| end | |
| function editortabs:LoadTabs(callback: (idx: number, name: string, source: string) -> tab) | |
| for i, tab in ipairs(self:ReadTabs()) do | |
| local obj = callback(i, tab.name, tab.src) | |
| tab.meta = type(tab.meta) == "string" and tab.meta or "" | |
| obj:GetData().meta = exploit:GetMetadata(tab.meta or "") | |
| end | |
| end | |
| framework.dependencies:Add("editortabs", framework.protected:ProtectTable(editortabs)) | |
| end | |
| do -- cloudscripts | |
| local favourites = ARCEUS_FOLDERS.CONFIGS:ReadJsonFile(EXPLOIT_CONFIGS.CLOUD_SCRIPTS, EXPLOIT_CONFIGS.FILES_KEY) or {} | |
| local cloudscripts, configs = {}, { | |
| propsWhitelist = {"title", "verified", "isUniversal", "isPatched", "script", "key", "views", "createdAt", "slug", "features"} | |
| } | |
| local fetchCache, detailsCache = framework.utils.caches.newCache(100), framework.utils.caches.newCache(100) | |
| local favCache, imgCache = framework.utils.caches.newCache(), framework.utils.caches.newCache(100) | |
| local marketplace = framework.protected:GetService("MarketplaceService") | |
| local onFetched = framework.signals.newEvent() | |
| local maxResults | |
| local getimageinfo = framework.protected:GCProtect(function(url: string) | |
| local split = framework.utils.strings.split(url, "/") | |
| local last = framework.utils.strings.sub(url, -4) | |
| if framework.utils.strings.sub(url, 1, framework.utils.strings.len(endpoints.rbxcdn.tr)) == endpoints.rbxcdn.tr and framework.utils.strings.find(url, "/Png") then | |
| return url, `{split[4]}.png` | |
| elseif framework.utils.strings.sub(url, 1, 15) == "/images/script/" and last == ".png" then | |
| return `{endpoints.scriptblox}{url}`, split[4] | |
| end | |
| end) | |
| local loadimage = framework.protected:GCProtect(function(url: string, name: string, gameId: number, img: ImageLabel) | |
| if (not url or framework.protected:IsStudio()) and gameId then | |
| local cached = imgCache:Get(gameId) | |
| if not cached then | |
| local success, result = pcall(marketplace.GetProductInfo, marketplace, gameId) | |
| if not success or not result.IconImageAssetId then return end | |
| cached = result.IconImageAssetId | |
| imgCache:Push(cached) | |
| end | |
| img.Image = framework.protected:ProtectAsset("rbxassetid://" ..cached) | |
| img.ImageColor3 = Color3.fromRGB(255, 255, 255) | |
| return | |
| end | |
| if not ARCEUS_FOLDERS.CACHE:IsFile(name) then | |
| local data = framework.utils.http:Get(url) | |
| if not data then return end | |
| ARCEUS_FOLDERS.CACHE:WriteFile(name, data) | |
| end | |
| --img.Image = framework.env.getcustomasset(framework.protected:ProtectAsset(`/{ARCEUS_FOLDERS.CACHE.lastPath}/{name}`)) | |
| local succ, asset = pcall(framework.env.getcustomasset, `{ARCEUS_FOLDERS.CACHE.lastPath}/{name}`) | |
| img.ImageColor3 = Color3.fromRGB(255, 255, 255) | |
| img.Image = succ and asset or img.Image | |
| end) | |
| local getimage = framework.protected:GCProtect(function(scriptImg: string, gameImg: string, universal: boolean) | |
| local url, name = getimageinfo(scriptImg) | |
| if not url and not universal then | |
| url, name = getimageinfo(gameImg) | |
| end | |
| return url, name | |
| end) | |
| local saveFavourites = framework.protected:GCProtect(function() | |
| ARCEUS_FOLDERS.CONFIGS:WriteJsonFile(EXPLOIT_CONFIGS.CLOUD_SCRIPTS, favourites, EXPLOIT_CONFIGS.FILES_KEY) | |
| end) | |
| local formatScript = framework.protected:GCProtect(LPH_JIT_MAX(function(scr: {any}) | |
| local info = {} -- truncating arguments | |
| info.slug = scr.slug | |
| info.game = scr.game.name | |
| info.gameId = scr.game.gameId | |
| for _, prop in ipairs(configs.propsWhitelist) do | |
| info[prop] = scr[prop] | |
| end | |
| local url, name = getimage(scr.image, scr.game.imageUrl, scr.isUniversal) | |
| info.imageUrl, info.imageName = url, name | |
| info.loadImage = function(img: ImageLabel, sync: boolean?) | |
| if sync then return loadimage(url, name, scr.game.gameId, img) end | |
| task.spawn(loadimage, url, name, scr.game.gameId, img) | |
| end | |
| info.isFavourite = not not favourites[scr.slug] | |
| info.setFavourite = function() | |
| favourites[scr.slug] = (not favourites[scr.slug]) and os.time() or nil | |
| info.isFavourite = not not favourites[scr.slug] | |
| saveFavourites() | |
| return info.isFavourite | |
| end | |
| return info | |
| end)) | |
| local fetch | |
| fetch = framework.protected:GCProtect(function(url: string, debounce: {boolean}, c: number) | |
| local cached = fetchCache:Get(url) | |
| if cached then return cached end | |
| if debounce[1] then return end | |
| debounce[1] = true | |
| local res = framework.utils.http:Request(url, "GET", { | |
| ["Content-Type"] = "application/json" | |
| }); | |
| if not res then | |
| if (c or 0) < 3 then task.wait(1) | |
| debounce[1] = false | |
| return fetch(url, debounce, c and c +1 or 1) | |
| end | |
| return | |
| end | |
| local info = framework.utils.http.json.decode(res.Body) | |
| if not info then return end | |
| info = info.result | |
| local data = {} -- These values can be nil | |
| data.maxPages = info.totalPages | |
| data.nextPage = info.nextPage | |
| local scripts = {} | |
| data.scripts = scripts | |
| for _, scr in ipairs(info.scripts) do | |
| framework.utils.tables.insert(scripts, formatScript(scr)) | |
| end | |
| fetchCache:Push(url, data) | |
| debounce[1] = false | |
| return data | |
| end) | |
| local getFilters = framework.protected:GCProtect(function(filters: {boolean}, isFetching: boolean) | |
| local setts = framework.settings:GetSetting("ScriptBlox") | |
| local output = "" | |
| local param, enum = filters.mode, framework.enums.ScriptBloxMode | |
| if param ~= nil and param ~= enum.None then | |
| output ..= `&mode={param == enum.Free and "free" or "paid"}` | |
| end | |
| param, enum = filters.verify, framework.enums.ScriptBloxVerify | |
| if param ~= nil and param ~= enum.None then | |
| output ..= `&verified={param == enum.Verified and 1 or 0}` | |
| end | |
| param, enum = filters.type, framework.enums.ScriptBloxType | |
| if param ~= nil and param ~= enum.None then | |
| output ..= `&universal={param == enum.Universal and 1 or 0}` | |
| end | |
| param, enum = filters.auth, framework.enums.ScriptBloxAuth | |
| if param ~= nil and param ~= enum.None then | |
| output ..= `&key={param == enum.Key and 1 or 0}` | |
| end | |
| param, enum = filters.patch, framework.enums.ScriptBloxPatch | |
| if param ~= nil and param ~= enum.None then | |
| output ..= `&patched={param == enum.Patched and 1 or 0}` | |
| end | |
| param, enum = filters.search, framework.enums.ScriptBloxSearch | |
| if not isFetching and param ~= nil and param ~= enum.None then -- Using search endpoint | |
| output ..= `&strict={param == enum.Strict and true or false}` | |
| end | |
| local sorting | |
| param, enum = filters.sortBy, framework.enums.ScriptBloxSort | |
| if param ~= nil and param ~= enum.None then | |
| local map = { | |
| [enum.DislikeCount] = "dislikeCount", | |
| [enum.CreatedAt] = "createdAt", | |
| [enum.UpdatedAt] = "updatedAt", | |
| [enum.LikeCount] = "likeCount", | |
| [enum.Views] = "views" | |
| } | |
| output ..= `&sortBy={map[param]}` | |
| sorting = true | |
| end | |
| param, enum = filters.order, framework.enums.ScriptBloxOrder | |
| if sorting and param ~= nil and param ~= enum.None then | |
| output ..= `&order={param == enum.Asc and "asc" or "desc"}` | |
| end | |
| return output | |
| end) | |
| cloudscripts.OnFetched = onFetched | |
| cloudscripts.LoadImage = loadimage | |
| function cloudscripts.newQuery(query: string?, filters: {boolean}, ...: any) | |
| query = query or "" | |
| query = framework.utils.http:UrlEncode(query) | |
| local fetching = query == "" | |
| local extra = {...} | |
| local baseUrl = `{endpoints.scriptblox}/api/script/{(fetching and "fetch?" or `search?q={query}&`)}` | |
| local query, data, debounce = {}, {}, {} | |
| function query:Fetch(page: number?) | |
| local page = page or data.nextPage or data.maxPages or 1 | |
| local url = `{baseUrl}page={page}` -- &max= | |
| if maxResults then url ..= `&max={maxResults}` end | |
| url ..= getFilters(filters, fetching) | |
| data = fetch(url, debounce) or {} | |
| local scripts = data.scripts or {} | |
| onFetched:Fire(scripts, page == 1, framework.utils.tables.unpack(extra)) | |
| return scripts | |
| end | |
| function query:Refresh() -- current page | |
| local data = self:Fetch(data.nextPage and data.nextPage -1 or data.maxPages) or {} | |
| local scripts = data.scripts or {} | |
| onFetched:Fire(scripts, true, framework.utils.tables.unpack(extra)) | |
| return scripts | |
| end | |
| function query:GetFilters() | |
| return filters | |
| end | |
| return query | |
| end | |
| function cloudscripts:FetchTrending(...: any) | |
| local data = fetch(`{endpoints.scriptblox}/api/script/trending`, {}) or {} | |
| local scripts = data.scripts or {} | |
| onFetched:Fire(scripts, true, ...) | |
| return scripts | |
| end | |
| function cloudscripts:FetchDetails(slug: string, c: number) | |
| local cached = detailsCache:Get(slug) | |
| if cached then return cached end | |
| local res = framework.utils.http:Request(`{endpoints.scriptblox}/api/script/{slug}`, "GET", { | |
| ["Content-Type"] = "application/json" | |
| }); | |
| if not res and (c or 0) < 3 then task.wait(1) | |
| return self:FetchDetails(slug, c and c +1 or 1) | |
| end | |
| local info = framework.utils.http.json.decode(res.Body) | |
| if not info then return end | |
| local data = formatScript(info.script) | |
| detailsCache:Push(slug, data) | |
| return data | |
| end | |
| function cloudscripts:FetchFavourites(...: any) | |
| local manager = framework.utils.threading.newTaskManager() | |
| local scripts = {} | |
| for slug, tim in pairs(favourites) do | |
| manager:AddTasks(function() | |
| local scr = {} | |
| scr.time = tim | |
| local data = favCache:Get(slug) | |
| if not data then | |
| data = self:FetchDetails(slug) | |
| if not data then return end | |
| favCache:Push(slug, data) | |
| end | |
| framework.utils.tables.concatenate(scr, data) | |
| framework.utils.tables.insert(scripts, scr) | |
| end) | |
| end | |
| manager:RunTasksAsync() | |
| framework.utils.tables.sort(scripts, function(a: {any}, b: {any}) | |
| return a.time < b.time | |
| end) | |
| onFetched:Fire(scripts, true, ...) | |
| return scripts | |
| end | |
| function cloudscripts:SetMaxResults(max: number?) | |
| maxResults = tonumber(max) -- you can unset by passing empty | |
| end | |
| framework.protected:ProtectTable(configs) | |
| framework.dependencies:Add("cloudscripts", framework.protected:ProtectTable(cloudscripts)) | |
| end | |
| do -- scripts hanlder | |
| local shandler, scripts = {}, framework.protected:GCProtect({}) | |
| local scriptAdded, gcount = framework.signals.newEvent(), 0 | |
| local sui = framework.interface.new() | |
| sui.instance.ZIndexBehavior = Enum.ZIndexBehavior.Sibling | |
| sui.instance.ScreenInsets = Enum.ScreenInsets.None | |
| shandler.OnScriptAdded = scriptAdded | |
| local props = framework.protected:GCProtect({ | |
| GuiObject = "BackgroundTransparency", | |
| ImageButton = "ImageTransparency", | |
| ImageLabel = "ImageTransparency", | |
| TextButton = "TextTransparency", | |
| TextLabel = "TextTransparency" | |
| }) | |
| local setOpacity = framework.protected:GCProtect(function(scr: {any}, obj: GuiObject, value: number) | |
| local cache = scr.caches.opacity | |
| cache = cache:Push(obj, {}, true) | |
| for type, prop in pairs(props) do | |
| if not obj:IsA(type) then continue end | |
| cache[type] = cache[type] or obj[prop] | |
| obj[prop] = cache[type] +value *(1 -cache[type]) | |
| end | |
| end) | |
| local guiAdded = framework.protected:GCProtect(function(gui: ScreenGui) | |
| if not gui:IsA("ScreenGui") then return end | |
| gcount += 1 | |
| local scr = { | |
| caches = { | |
| children = framework.utils.caches.newCache(), | |
| opacity = framework.utils.caches.newCache() | |
| }, | |
| id = `Gui_{gcount}`, | |
| instance = gui, | |
| order = gcount, | |
| opacity = 0, | |
| scale = 1 | |
| } | |
| function scr:ToChildren(action: (child: {any}) -> ()) | |
| for _, child in ipairs(self:GetChildren()) do | |
| if not child.instance:IsA("GuiObject") then continue end | |
| action(child) | |
| end | |
| end | |
| function scr:Scale(value: number) | |
| scr.scale = value | |
| self:ToChildren(function(child) | |
| child:Scale(value) | |
| end) | |
| end | |
| function scr:Transparency(value: number) | |
| scr.opacity = value | |
| self:ToChildren(function(child) | |
| child:Transparency(value) | |
| end) | |
| end | |
| function scr:Draggable(enabled: number) | |
| self:ToChildren(function(child) | |
| child:Draggable(enabled) | |
| end) | |
| end | |
| function scr:IsDraggable() | |
| local draggable = false | |
| self:ToChildren(function(child) | |
| if child:IsDraggable() then | |
| draggable = true | |
| end | |
| end) | |
| return draggable | |
| end | |
| function scr:Windowed(enabled: number) | |
| self:ToChildren(function(child) | |
| child:Windowed(enabled) | |
| end) | |
| end | |
| function scr:IsWindowed() | |
| local windowed = false | |
| self:ToChildren(function(child) | |
| if child:IsWindowed() then | |
| windowed = true | |
| end | |
| end) | |
| return windowed | |
| end | |
| function scr:GetChildren() | |
| local children = {} | |
| for _, obj in ipairs(gui:GetChildren()) do | |
| if not obj:IsA("GuiObject") then continue end | |
| local ccache = scr.caches.children | |
| local order = ccache:GetSize() +1 | |
| local child = ccache:Push(obj, { | |
| interface = { id = `Gui_{scr.id}` }, | |
| id = `Obj_{order}`, | |
| instance = obj, | |
| order = order, | |
| draggable = false, | |
| window = nil, | |
| opacity = 0, | |
| scale = 1 | |
| }, true) | |
| function child:Scale(value: number) | |
| local scale = gui:FindFirstChildWhichIsA("UIScale") or framework.utils.instances.new("UIScale", { | |
| Parent = obj | |
| }); scale.Scale = value or 1 | |
| child.scale = scale.Scale | |
| end | |
| function child:Transparency(value: number) | |
| value = framework.utils.maths.clamp(value, 0, 1) | |
| obj.Visible = value < 1 | |
| child.opacity = value | |
| if not obj.Visible then return end | |
| if obj:IsA("CanvasGroup") and gui.ZIndexBehavior == Enum.ZIndexBehavior.Sibling then | |
| local old = scr.caches.opacity:Push(obj, obj.GroupTransparency, true) | |
| obj.GroupTransparency = old +value *(1 -old) | |
| return | |
| end | |
| setOpacity(scr, obj, value) | |
| for _, v in ipairs(obj:GetDescendants()) do | |
| setOpacity(scr, v, value) | |
| end | |
| end | |
| function child:Draggable(enabled: boolean) | |
| child.draggable = enabled | |
| if enabled then | |
| return framework.utils.inputs.makeDraggable(self) | |
| end | |
| framework.utils.inputs.makeUndraggable(self) | |
| end | |
| function child:IsDraggable() | |
| return child.draggable | |
| end | |
| function child:Windowed(enabled: boolean) | |
| local id = `Window-{scr.id}-{child.id}` | |
| local binding = child.window | |
| if binding then | |
| binding.frame:Destroy() | |
| binding:Unbind() | |
| child.window = nil | |
| return | |
| end | |
| if not enabled then return end | |
| binding = framework.renderer:BindToRenderer(id, framework.renderer.FrameworkPriority, function() | |
| local frame = binding.frame | |
| if not frame then self:Windowed(false) end | |
| local pos, siz = obj.AbsolutePosition, obj.AbsoluteSize | |
| local absx = siz.X /10 | |
| frame.Position = UDim2.fromOffset(pos.X +siz.X, pos.Y +siz.Y -absx) | |
| frame.Size = UDim2.fromOffset(absx, absx) | |
| end) | |
| local frame = framework.utils.instances.new("ImageButton", { | |
| AnchorPoint = Vector2.new(1, 1) | |
| }) | |
| frame.Parent = sui.instance | |
| binding.frame = frame | |
| child.window = binding | |
| binding:Render() | |
| end | |
| function child:IsWindowed() | |
| return not not child.binding | |
| end | |
| framework.utils.tables.insert(children, child) | |
| end | |
| return children | |
| end | |
| local conn; conn = gui.AncestryChanged:Connect(function(_, parent) | |
| if parent then return end | |
| conn:Disconnect() | |
| scripts[gui] = nil | |
| scr:ToChildren(function(child: {any}) | |
| child:Draggable(false) | |
| child:Windowed(false) | |
| end) | |
| for _, cache in pairs(scr.caches) do | |
| cache:Remove() | |
| end | |
| end) | |
| scripts[gui] = scr | |
| scriptAdded:Fire(scr) | |
| return scr | |
| end) | |
| local event | |
| function shandler:Start(parent: Folder) | |
| parent = parent or framework.utils.instances.dynamicParent() | |
| event = parent.ChildAdded:Connect(guiAdded) | |
| sui:SetEnabled(true) | |
| end | |
| function shandler:Stop() | |
| sui:SetEnabled(false) | |
| if not event then return end | |
| event:Disconnect() | |
| event = nil | |
| end | |
| function shandler:GetScripts() | |
| local res = {} | |
| for _, v in pairs(scripts) do | |
| framework.utils.tables.insert(res, v) | |
| end | |
| return res | |
| end | |
| framework.dependencies:Add("shandler", framework.protected:ProtectTable(shandler)) | |
| end | |
| do | |
| local teleport: TeleportService = framework.protected:GetService("TeleportService") | |
| local location = framework.protected:GetService(LPH_ENCSTR("JointsService")) | |
| local player = framework.protected:GetService("Players").LocalPlayer | |
| local tGui = framework.interface.new("TeleportGui") | |
| local cloudscripts = framework.dependencies.cloudscripts | |
| local exploit = framework.dependencies.exploit | |
| local OnMessage = framework.signals.newEvent() | |
| local OnFetched = framework.signals.newEvent() | |
| local serverside, allGames = {}, nil | |
| local PAGE_SIZE = 15 | |
| tGui.instance.ScreenInsets = Enum.ScreenInsets.None | |
| tGui.instance.IgnoreGuiInset = true | |
| tGui:AddInstance("ImageLabel", { -- TODO Teleport Loading UI | |
| Size = UDim2.fromScale(1, 1), | |
| Image = "" | |
| }) | |
| local get_email = framework.protected:GCProtect(function() | |
| local email = framework.settings:GetSetting(LPH_ENCSTR("User_EMail")) | |
| if framework.utils.strings.gsub(email, "%s", "") == "" then return end | |
| if not framework.utils.strings.match(email, LPH_ENCSTR("^[%w_%+%.%-]+@[%w%-%.]+%.%a%a+$")) then return end | |
| return email | |
| end) | |
| local onMessage = framework.protected:GCProtect(function(...: any) | |
| OnMessage:Fire(...) | |
| end) | |
| serverside.OnFetched = OnFetched | |
| serverside.OnMessage = OnMessage | |
| lastIdx = 0 | |
| function serverside:GetGames(page: number?) | |
| if allGames then | |
| lastIdx = page or lastIdx +1 | |
| local more = lastIdx ~= 1 | |
| if lastIdx > #allGames then | |
| OnFetched:Fire({}, more) | |
| return {}, more | |
| end | |
| lastIdx = math.clamp(lastIdx or 1, 1, #allGames) | |
| OnFetched:Fire(allGames[lastIdx], more) | |
| return allGames[lastIdx], more | |
| end | |
| local email = get_email() | |
| if not email then | |
| if framework.protected:IsStudio() then | |
| email = LPH_ENCSTR("arceusxhelp99@gmail.com") | |
| else | |
| OnFetched:Fire({}) return false | |
| end | |
| end | |
| local res = framework.utils.http:Request(`{endpoints.api}/getgames`, "POST", { | |
| [LPH_ENCSTR("Content-Type")] = LPH_ENCSTR("application/json") | |
| }, { | |
| hwid = framework.protected:IsStudio() and LPH_ENCSTR("d83f041df3b7c388") or exploit:GetHwid(), | |
| userid = player.UserId, | |
| email = email | |
| }) | |
| if not res then OnFetched:Fire({}) return false end | |
| local games = framework.utils.http.json.decode(res.Body) or {} | |
| local gamePages = {} | |
| local lastPage = {} | |
| for i, info in ipairs(games) do | |
| table.insert(lastPage, { | |
| id = info.place_id, | |
| plrs = info.playing, | |
| loadImage = function(img: ImageLabel, sync: boolean?) | |
| if sync then return cloudscripts.LoadImage(nil, nil, info.place_id, img) end | |
| task.spawn(cloudscripts.LoadImage, nil, nil, info.place_id, img) | |
| end | |
| }) | |
| if i%PAGE_SIZE ~= 0 then continue end | |
| table.insert(gamePages, lastPage) | |
| lastPage = {} | |
| end | |
| if #lastPage > 0 then | |
| table.insert(gamePages, lastPage) | |
| end | |
| allGames = gamePages | |
| return self:GetGames(1) | |
| end | |
| function serverside:TeleportTo(placeId: number) | |
| return pcall(teleport.Teleport, teleport, placeId, player, nil, tGui.instance) | |
| end | |
| function serverside:Connect() | |
| local remote = location:FindFirstChild(LPH_ENCSTR("JointsRemote")) | |
| if not remote then return end | |
| remote.OnClientEvent:Once(framework.protected:GCProtect(function(devices: {{[string]: any}}) | |
| local auth = false | |
| for _, device in ipairs(devices) do | |
| if device.hwid == exploit:GetHwid() then | |
| auth = true | |
| break | |
| end | |
| end | |
| if not auth then return end | |
| self.remote = remote | |
| remote.OnClientEvent:Connect(onMessage) | |
| remote:FireServer(LPH_ENCSTR("Connect")) | |
| end)) | |
| end | |
| function serverside:Execute(scr: string) | |
| if not self.remote then return end | |
| self.remote:FireServer(LPH_ENCSTR("Execute"), scr) | |
| end | |
| framework.dependencies:Add(LPH_ENCSTR("serverside"), framework.protected:ProtectTable(serverside)) | |
| end | |
| do -- authentication | |
| (function() return [[ | |
| Hello, if you are trying to bypass our authentication system, | |
| im letting you know that the license file is only used to prevent ddos attacks, | |
| or other networking issues, to block users in the login page for too long. | |
| This can be disabled anytime with a killswitch, dont waste your time here. | |
| Someone else has already did in the past.. | |
| ~ riky47 | |
| ]] end)() | |
| local Players = framework.protected:GetService("Players") | |
| local auth, authData = {}, framework.protected:GCProtect({}) | |
| local tim = framework.protected:GetFunction(workspace.GetServerTimeNow) --os.time) | |
| local exploit = framework.dependencies.exploit | |
| local infos | |
| --[[ | |
| local plan_infos = framework.protected:GCProtect({ | |
| {title = "Free", Color = Color3.fromRGB(255, 255, 255) }, | |
| {title = "Basic", Color = Color3.fromRGB(170, 169, 173) }, | |
| {title = "Plus", Color = Color3.fromRGB(229, 184, 11) }, | |
| {title = "Premium", Color = Color3.fromRGB(89, 219, 248) }, | |
| {title = "Ultimate", Color = Color3.fromRGB(255, 0, 0) } | |
| })]] | |
| local onAuthenticationAttemp = framework.signals.newEvent() | |
| exploit.OnUrlAttemp:Connect(framework.protected:GCProtect(function(url: string, retries: number, result: number) | |
| if not result and framework.utils.strings.find(url, "/issubscribed") then | |
| onAuthenticationAttemp:Fire(retries) | |
| end | |
| end)) | |
| auth.OnAuthenticationAttemp = onAuthenticationAttemp | |
| local getInfos = framework.protected:GCProtect(function() | |
| if not infos then | |
| local res = exploit:LoadUrl(`{endpoints.arceus_v}/configs.json`, 0) | |
| infos = framework.utils.http.json.decode(res) | |
| end | |
| return infos | |
| end) | |
| function auth:ValidateToken(token: string) | |
| local function ROR(x, n) | |
| return bit32.rrotate(x, n) | |
| end | |
| local function SHR(x, n) | |
| return bit32.rshift(x, n) | |
| end | |
| local function Ch(x, y, z) | |
| return bit32.bxor(bit32.band(x, y), bit32.band(bit32.bnot(x), z)) | |
| end | |
| local function Maj(x, y, z) | |
| return bit32.bxor(bit32.band(x, y), bit32.band(x, z), bit32.band(y, z)) | |
| end | |
| local function Sigma0(x) | |
| return bit32.bxor(ROR(x, 2), ROR(x, 13), ROR(x, 22)) | |
| end | |
| local function Sigma1(x) | |
| return bit32.bxor(ROR(x, 6), ROR(x, 11), ROR(x, 25)) | |
| end | |
| local function sigma0(x) | |
| return bit32.bxor(ROR(x, 7), ROR(x, 18), SHR(x, 3)) | |
| end | |
| local function sigma1(x) | |
| return bit32.bxor(ROR(x, 17), ROR(x, 19), SHR(x, 10)) | |
| end | |
| local K = { | |
| 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5, | |
| 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174, | |
| 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da, | |
| 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967, | |
| 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85, | |
| 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070, | |
| 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3, | |
| 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 | |
| } | |
| local function sha256_luau(msg) | |
| local function toBytes(s) | |
| local bytes = {} | |
| for i = 1, #s do | |
| bytes[#bytes+1] = s:byte(i) | |
| end | |
| return bytes | |
| end | |
| local bytes = toBytes(msg) | |
| local ml = #bytes * 8 | |
| -- Padding | |
| bytes[#bytes+1] = 0x80 | |
| while (#bytes % 64) ~= 56 do | |
| bytes[#bytes+1] = 0x00 | |
| end | |
| for i = 1, 8 do | |
| bytes[#bytes+1] = bit32.band(bit32.rshift(ml, (8 * (8 - i))), 0xFF) | |
| end | |
| local h = { | |
| 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, | |
| 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 | |
| } | |
| for i = 1, #bytes, 64 do | |
| local w = {} | |
| for j = 0, 15 do | |
| local k = i + j * 4 | |
| w[j] = bit32.lshift(bytes[k], 24) + bit32.lshift(bytes[k+1], 16) + bit32.lshift(bytes[k+2], 8) + bytes[k+3] | |
| end | |
| for j = 16, 63 do | |
| w[j] = bit32.band((sigma1(w[j-2]) + w[j-7] + sigma0(w[j-15]) + w[j-16]), 0xFFFFFFFF) | |
| end | |
| local a, b, c, d, e, f, g, h0 = table.unpack(h) | |
| for j = 0, 63 do | |
| local T1 = bit32.band(h0 + Sigma1(e) + Ch(e,f,g) + K[j+1] + w[j], 0xFFFFFFFF) | |
| local T2 = bit32.band(Sigma0(a) + Maj(a,b,c), 0xFFFFFFFF) | |
| h0 = g; g = f; f = e | |
| e = bit32.band(d + T1, 0xFFFFFFFF) | |
| d = c; c = b; b = a | |
| a = bit32.band(T1 + T2, 0xFFFFFFFF) | |
| end | |
| h[1] = bit32.band(h[1] + a, 0xFFFFFFFF) | |
| h[2] = bit32.band(h[2] + b, 0xFFFFFFFF) | |
| h[3] = bit32.band(h[3] + c, 0xFFFFFFFF) | |
| h[4] = bit32.band(h[4] + d, 0xFFFFFFFF) | |
| h[5] = bit32.band(h[5] + e, 0xFFFFFFFF) | |
| h[6] = bit32.band(h[6] + f, 0xFFFFFFFF) | |
| h[7] = bit32.band(h[7] + g, 0xFFFFFFFF) | |
| h[8] = bit32.band(h[8] + h0, 0xFFFFFFFF) | |
| end | |
| local result = "" | |
| for i = 1, 8 do | |
| result = result .. framework.utils.strings.format("%08x", h[i]) | |
| end | |
| return result | |
| end | |
| local valid = false | |
| for offset = -1, 0 do | |
| local t = framework.utils.maths.floor(tim(workspace) /30) +offset | |
| if sha256_luau(EXPLOIT_CONFIGS.API_CRYPT .. t .. exploit:GetHwid()) == token then | |
| valid = true | |
| break | |
| end | |
| end | |
| return valid | |
| end | |
| -- We should use Server-Side-Signed RSA JWT for a proper auth and license | |
| function auth:Authenticate() | |
| if authData.authenticated then return true end | |
| local email = framework.settings:GetSetting(LPH_ENCSTR("User_EMail")) | |
| if framework.utils.strings.gsub(email, "%s", "") == "" then | |
| return false | |
| end | |
| if not framework.utils.strings.match(email, LPH_ENCSTR("^[%w_%+%.%-]+@[%w%-%.]+%.%a%a+$")) then | |
| return false, { LPH_ENCSTR("Invalid email format.") } | |
| end | |
| local license if self:UsingLicense() then | |
| license = ARCEUS_FOLDERS.CONFIGS:ReadJsonFile(EXPLOIT_CONFIGS.LICENSE_FILE, EXPLOIT_CONFIGS.FILES_KEY) | |
| end | |
| if license and license.authenticated and license.expiring and license.issuedAt | |
| and license.hwid == exploit:GetHwid() -- Prevents sharing the file | |
| then | |
| license.authenticated = false | |
| authData = license | |
| if self:GetExpiring() > 0 then | |
| authData.authenticated = true | |
| return true | |
| end | |
| end | |
| local device_name = exploit:GetDeviceInfo(LPH_ENCSTR("BRAND")) | |
| if device_name then | |
| device_name = `{device_name} {exploit:GetDeviceInfo(LPH_ENCSTR("DEVICE"))}` | |
| else | |
| device_name = framework.protected:IsStudio() and LPH_ENCSTR("Studio") or | |
| framework.protected:GetService(LPH_ENCSTR("UserInputService")):GetDeviceType().Name | |
| end | |
| local info = exploit:LoadUrl(`{endpoints.api}/issubscribed`, 0, EXPLOIT_CONFIGS.AUTH_FETCH_DELAY, LPH_ENCSTR("POST"), { | |
| [LPH_ENCSTR("Content-Type")] = LPH_ENCSTR("application/json") | |
| }, { | |
| os = exploit:IsIos() and LPH_ENCSTR("iOS") or (`Android{exploit:IsVng() and LPH_ENCSTR(" VNG") or ""}`), | |
| userid = Players.LocalPlayer.UserId, | |
| device_name = device_name, | |
| hwid = exploit:GetHwid(), | |
| email = email | |
| }) | |
| local json = framework.utils.http.json.decode(info) | |
| if not json then return false, { LPH_ENCSTR("Invalid data.") } end | |
| if not json.success or not self:ValidateToken(json.token) then return false, {json.message} end | |
| json.issuedAt = json.issuedAt or tim(workspace) | |
| json.hwid = exploit:GetHwid() | |
| json.authenticated = true | |
| json.expiring = json.expiring and json.expiring /1000 or 24*60*60 | |
| ARCEUS_FOLDERS.CONFIGS:WriteJsonFile(EXPLOIT_CONFIGS.LICENSE_FILE, framework.utils.http.json.encode(json), EXPLOIT_CONFIGS.FILES_KEY) | |
| authData = json | |
| return true, json.message | |
| end | |
| --[[ function auth:Restore() | |
| if not exploit:LoadUrl(`{endpoints.api}/deletekey?hwid={exploit:GetHwid()}`, 3) then | |
| return false | |
| end | |
| authData.hwid = exploit:GetHwid() | |
| authData.authenticated = false | |
| authData.issuedAt = 0 | |
| authData.expiring = 0 | |
| local data = framework.utils.crypt.bytes(framework.utils.http.json.encode(authData), EXPLOIT_CONFIGS.FILES_KEY) | |
| ARCEUS_FOLDERS.CONFIGS:WriteFile(EXPLOIT_CONFIGS.LICENSE_FILE, data) | |
| return true | |
| end | |
| function auth:IsPremium() | |
| return authData.isPremium or (authData.plan or 0) >= 3 -- premium or higher | |
| end | |
| function auth:GetPlan() | |
| if not authData.authenticated then return false end | |
| local planId = authData.plan or 0 | |
| local info = plan_infos[framework.utils.maths.clamp(planId, 0, #plan_infos) +1] | |
| info = framework.utils.tables.deepCopy(info) | |
| info.id = planId | |
| return info | |
| end]] | |
| function auth:GetVersion() | |
| --[[ local file = exploit:IsIos() and LPH_ENCSTR("ios-version") or (exploit:IsVng() and LPH_ENCSTR("version-vng") or LPH_ENCSTR("version")) | |
| return exploit:LoadUrl(`{endpoints.arceus_neo}/{file}`, 0) ]] | |
| local vng = exploit:IsVng() and LPH_ENCSTR("_vng") or "" | |
| local type = exploit:IsIos() and LPH_ENCSTR("ios") or (LPH_ENCSTR("android") ..vng) | |
| return getInfos()[LPH_ENCSTR("version")][type] | |
| end | |
| function auth:IsKeyless() | |
| return getInfos()[LPH_ENCSTR("keyless")] or false | |
| end | |
| function auth:UsingLicense() | |
| return getInfos()[LPH_ENCSTR("authfile")] | |
| end | |
| function auth:GetExpiring() | |
| return authData.issuedAt and authData.expiring -(tim() -authData.issuedAt) or 0 | |
| end | |
| framework.dependencies:Add(LPH_ENCSTR("auth"), framework.protected:ProtectTable(auth)) | |
| end | |
| do -- Shared methods | |
| local players = framework.protected:GetService("Players") | |
| local sh = {} | |
| sh.antiAfk = framework.protected:GCProtect(LPH_NO_VIRTUALIZE(function() | |
| local GC = framework.env.getconnections | |
| or framework.env.get_signal_cons | |
| if GC then | |
| for i,v in pairs(GC(players.LocalPlayer.Idled)) do | |
| if v["Disable"] then | |
| v["Disable"](v) | |
| elseif v["Disconnect"] then | |
| v["Disconnect"](v) | |
| end | |
| end | |
| else | |
| local VirtualUser = framework.protected:GetService("VirtualUser") | |
| players.LocalPlayer.Idled:Connect(function() | |
| VirtualUser:CaptureController() | |
| VirtualUser:ClickButton2(Vector2.new()) | |
| end) | |
| end | |
| end)) | |
| framework.dependencies:Add("shared", framework.protected:ProtectTable(sh)) | |
| end | |
| do -- INIT | |
| local name, ver = framework.env.identifyexecutor() | |
| local isStudio = framework.protected:IsStudio() | |
| if not isStudio then -- Check for exploit identity | |
| if not name or not ver then return end | |
| local found = name:lower():find(EXPLOIT_CONFIGS.EXPLOIT_IDENTITY:lower()) | |
| if not found then return end | |
| else -- Check if its authorized to run in studio | |
| local succ, err = pcall(function() | |
| return script.Auth.Value == EXPLOIT_CONFIGS.FILES_KEY | |
| end) | |
| if not succ or not err then | |
| return framework.console.error(LPH_ENCSTR("Missing Authorization")) | |
| end | |
| end | |
| do -- On UI updated | |
| local old = ARCEUS_FOLDERS.CONFIGS:ReadJsonFile(EXPLOIT_CONFIGS.VERSION_FILE, EXPLOIT_CONFIGS.FILES_KEY) | |
| framework.utils.versioning:SetVersion(EXPLOIT_CONFIGS.UI_VERSION) | |
| if old and old.version and framework.utils.versioning:Compare(old.version) == framework.enums.versioning.older then -- UI Updated | |
| for _, file in ipairs(ARCEUS_FOLDERS.RAW:ListFiles()) do -- Reset raw content | |
| ARCEUS_FOLDERS.RAW:DeleteFile(file) | |
| end | |
| end | |
| ARCEUS_FOLDERS.CONFIGS:WriteJsonFile(EXPLOIT_CONFIGS.VERSION_FILE, { | |
| version = EXPLOIT_CONFIGS.UI_VERSION | |
| }, EXPLOIT_CONFIGS.FILES_KEY) | |
| end | |
| -- Migrate | |
| framework.dependencies.exploit:Migrate() | |
| -- Build UI | |
| local shandler = framework.dependencies.shandler | |
| local tabs = framework.dependencies.editortabs | |
| local libgui = framework.dependencies.gui | |
| local ui = libgui:Draw(framework) -- Draw | |
| framework.settings:LoadSettings() -- Update | |
| tabs:GetSelection():GetData() | |
| .instance:Select() | |
| libgui:LoadAnimations() | |
| ui:SetEnabled(true) | |
| shandler:Start() | |
| do | |
| local fps = framework.settings:GetSetting("Setting_Fps") | |
| if fps ~= 60 then | |
| framework.env.setfpscap(fps or 60) | |
| end | |
| local afk = not not framework.settings:GetSetting("Setting_Afk") | |
| if afk then | |
| if framework.env.WHWKIWIOSU then | |
| framework.env.WHWKIWIOSU(afk) | |
| else | |
| framework.dependencies.shared.antiAfk() | |
| end | |
| end | |
| end | |
| local loading = ui.getLoading() | |
| if framework.settings:GetSetting("User_Intro") then | |
| loading:Advance(3) | |
| else | |
| loading:Skip(4) | |
| end | |
| if not isStudio then -- Check for exploit versioning | |
| local auth = framework.dependencies.auth | |
| local newer = auth:GetVersion() | |
| framework.utils.versioning:SetVersion(ver or "0.0.0") | |
| if framework.utils.versioning:Compare(newer) == framework.enums.versioning.newer then | |
| libgui.utils:ShowToast("ButtonToast", { | |
| Id = "Update", | |
| Style = "confirm", | |
| AdditionalText = {"An update is available. Download?", "Un aggiornamento è disponibile. Scaricare?"}, | |
| AdditionalTitle = {"Update", "Aggiornamento"}, | |
| Callback = function(res: boolean) | |
| if not res then return end | |
| framework.utils.http:OpenUrl("https://spdmteam.com/") | |
| end | |
| }) | |
| end | |
| if not auth:IsKeyless() then | |
| auth.OnAuthenticationAttemp:Connect(framework.protected:GCProtect(function(retries: number) | |
| --framework.console.print(`Authenticating.. {(retries > 1) and `({retries})` or ""}`) | |
| end)) | |
| --[[local waitEvent = framework.signals.newEvent() | |
| local function waitPhase() | |
| task.spawn(loading.Skip, loading, 5, function() | |
| waitEvent:Fire() | |
| end) | |
| waitEvent:Wait() | |
| end]] | |
| loading:Skip(4) | |
| --waitPhase() | |
| local succ, msg = auth:Authenticate() | |
| while not succ do | |
| if msg then libgui.utils:ShowToast("ButtonToast", { AdditionalText = msg }) end | |
| loading:Skip(5, function() end) | |
| --waitPhase() | |
| succ, msg = auth:Authenticate() | |
| end | |
| --framework.console.print("Subscription found") | |
| --waitEvent:Remove() | |
| end | |
| else -- Dev Info | |
| framework.console.print("UI Instances:", #ui.instance:GetDescendants()) | |
| end | |
| local serverside = framework.dependencies.serverside | |
| task.spawn(serverside.Connect, serverside) | |
| loading:Skip(6) | |
| do -- Advanced auto-execution | |
| local gameId, placeId = game.GameId, game.PlaceId | |
| local advanceExecute = framework.protected:GCProtect(LPH_JIT(function(source: string, data: {any}) | |
| if data and data.autoexecute then | |
| if data.whitelist and (data.games or data.places) then | |
| local whitelisted = (data.games or {})[gameId] | |
| if not whitelisted then | |
| if whitelisted == false then return end | |
| whitelisted = (data.places or {})[placeId] | |
| if not whitelisted then return end | |
| end | |
| end | |
| framework.execution:Execute(source) | |
| end | |
| end)) | |
| local recursiveAutoexec | |
| recursiveAutoexec = framework.protected:GCProtect(LPH_JIT(function(files: {string}) | |
| for _, file in ipairs(files) do | |
| if framework.storage.isFolder(nil, file) then | |
| recursiveAutoexec(framework.storage.listFiles(nil, file)) | |
| continue | |
| end | |
| local src = framework.storage.readFile(nil, file) | |
| if not src then continue end | |
| local data, source = framework.dependencies.exploit:GetMetadata(src) | |
| advanceExecute(source, data) | |
| end | |
| end)) | |
| local tabs = framework.dependencies.editortabs:GetTabs() | |
| for _, tab in ipairs(tabs) do | |
| advanceExecute(tab:GetSource(), tab:GetProperties()) | |
| end | |
| task.spawn(recursiveAutoexec, ARCEUS_FOLDERS.SCRIPT_HUB:ListFiles()) | |
| end | |
| do | |
| local stgui = framework.protected:GetService("StarterGui") | |
| local axintelligence = framework.dependencies.axintelligence | |
| local track = framework.dependencies.track | |
| axintelligence:AddCustomFunction("stop", "stops the current playing song", "stop(): nil", function() track:Stop() end) | |
| axintelligence:AddCustomFunction("close", "closes the UI", "close(): nil", ui.close) | |
| axintelligence:AddCustomFunction("open", "opens the UI", "open(): nil", ui.open) | |
| axintelligence:AddCustomFunction("learn", "makes you, arcy, learn new functions by providing the required parameters, use this when you are asked to learn new abilities", "learn(functName: string, functDescription: string, functDefinition: string, funct: (any) -> ())", function(...: any) | |
| axintelligence:AddCustomFunction(...) | |
| end) | |
| axintelligence:AddCustomFunction("translate", "translates the UI text into the preset languages", "translate(CountryCode: string): nil", function(country_code: string) | |
| local cc = framework.utils.strings.upper(country_code) | |
| if not framework.enums.CountryCode[cc] then return end | |
| framework.settings:SetSetting("Country_Code", cc) | |
| end) | |
| axintelligence:AddCustomFunction("size", "resizes the UI with the preset states: Base, Large, Full", "size(state: string): nil", function(state: string) | |
| state = framework.enums.WindowState[state] | |
| if not state then return end | |
| ui.open() | |
| ui.nextSize(state) | |
| end) | |
| axintelligence:AddCustomFunction("play", "plays or stops music by roblox asset id, if the id is nil it toggles the current song", "play(id: number|nil): nil", function(id: number) | |
| if id and tonumber(id) then track:Play(id) else | |
| track:Toggle() | |
| end | |
| end) | |
| axintelligence:AddCustomFunction("console", "toggles the roblox console using the on/off status", "console(status: boolean): nil", function(status: boolean) | |
| stgui:SetCore("DevConsoleVisible", status) | |
| end) | |
| end | |
| do -- Plugins | |
| local plugins = framework.dependencies.plugins | |
| local loadPlugins = framework.protected:GCProtect(LPH_JIT(function() | |
| local res = framework.utils.http:Request(`{endpoints.arceus_v}/plugins.json`) | |
| if res then local default = framework.utils.http.json.decode(res.Body) | |
| for _, content in ipairs(default or {}) do | |
| plugins:Add(content) | |
| end | |
| end | |
| for _, url in ipairs(plugins:GetSaved()) do | |
| local res = framework.utils.http:Request(url, "GET") | |
| if not res then continue end | |
| local json = framework.utils.http.json.decode(res.Body) | |
| if not json then continue end | |
| json.url = url | |
| plugins:Add(json) | |
| end | |
| if isStudio then | |
| plugins:Add(require("../Arceus Hub/raw")) | |
| end | |
| end)) | |
| task.spawn(loadPlugins) | |
| end | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment