diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000000..7ce4f5c08a --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1 @@ +This is a Roblox admin system, which therefore uses Luau. Therefore make sure to optimise for Luau – generally, using task.wait() instead of wait(), and interpolated strings instead of concatenation. diff --git a/Loader/Config/Plugins/Server-Example Plugin.luau b/Loader/Config/Plugins/Server-Example Plugin.luau index 743ea699a5..cb09761b8c 100644 --- a/Loader/Config/Plugins/Server-Example Plugin.luau +++ b/Loader/Config/Plugins/Server-Example Plugin.luau @@ -8,11 +8,11 @@ PlayerJoined will fire after the player finishes initial loading CharacterAdded will also fire after the player is loaded, it does not use the CharacterAdded event. - service.Events.PlayerAdded(function(p) + service.Events.PlayerAdded:Connect(function(p) print(`{p.Name} Joined! Example Plugin`) end) - service.Events.CharacterAdded(function(p) + service.Events.CharacterAdded:Connect(function(p) server.RunCommand('name', plr.Name, 'BobTest Example Plugin') end) diff --git a/Loader/Config/Settings.luau b/Loader/Config/Settings.luau index cda345f7e6..678850d405 100644 --- a/Loader/Config/Settings.luau +++ b/Loader/Config/Settings.luau @@ -291,7 +291,7 @@ settings.CommandFeedback = false -- Should players be notified when commands wi settings.CrossServerCommands = true -- Are commands which affect more than one server enabled? settings.ChatCommands = true -- If false you will not be able to run commands via the chat; Instead, you MUST use the console or you will be unable to run commands settings.CreatorPowers = true -- Gives me creator-level admin; This is strictly used for debugging; I can't debug without full access to the script -settings.CodeExecution = true -- Enables the use of code execution in Adonis; Scripting related (such as ;s) and a few other commands require this +settings.CodeExecution = false -- Enables the use of code execution in Adonis. Scripting related (such as ;s) and a few other commands require this settings.SilentCommandDenials = false -- If true, there will be no differences between the error messages shown when a user enters an invalid command and when they have insufficient permissions for the command settings.OverrideChatCallbacks = true -- If the TextChatService ShouldDeliverCallbacks of all channels are overridden by Adonis on load. Required for slowmode. Mutes use a CanSend method to mute when this is set to false. diff --git a/Loader/Loader/Loader.server.luau b/Loader/Loader/Loader.server.luau index d3636c9c36..ed3db7fb33 100644 --- a/Loader/Loader/Loader.server.luau +++ b/Loader/Loader/Loader.server.luau @@ -201,14 +201,17 @@ else warn(`Failed to load Adonis MainModule {moduleId} due to {module}! If this does not work please purchase the Adonis MainModule to your inventory. Using backup method...`) yxpcall(function() module = loadModuleAsset(moduleId) + success = true end, function(reason) warn(`Failed to load Adonis mainmodule {moduleId} via :LoadAsset() method due to {reason}! Loading the backup MainModule...`) yxpcall(function() module = assert(require(data.Backup), "Backup module returned invalid values!") + success = true end, function(reason) warn(`Failed to load Adonis backup MainModule {data.Backup} due to {reason}! If this does not work please purchase the Adonis backup MainModule to your inventory. Using backup method...`) yxpcall(function() module = loadModuleAsset(data.Backup) + success = true end, function(reason) module = nil warn(`FATAL ERROR! Failed to load Adonis backup MainModule {moduleId} via :LoadAsset() method due to {reason}! Adonis can't be booted up! Please contact the Adonis helpers immediately and add both the regular MainModule and the backup MainModule to your user&group inventory!`) @@ -217,7 +220,7 @@ else end) end - local response = assert(module, "FATAL ERROR! Adonis bootstrap function is missing!")(data) + local response = assert(success and module, "FATAL ERROR! Adonis bootstrap function is missing!")(data) if response == "SUCCESS" then if data.Settings and data.Settings.HideScript and not data.DebugMode and not RunService:IsStudio() then diff --git a/Loader/Version.model.json b/Loader/Version.model.json index 5659d0aff5..2df16e191a 100644 --- a/Loader/Version.model.json +++ b/Loader/Version.model.json @@ -1,6 +1,6 @@ { "ClassName": "NumberValue", "Properties": { - "Value": 266 + "Value": 267 } } diff --git a/MainModule/Client/Client.luau b/MainModule/Client/Client.luau index 8e8ec347fb..42c154cf9c 100644 --- a/MainModule/Client/Client.luau +++ b/MainModule/Client/Client.luau @@ -139,9 +139,10 @@ local log = function(...) end --// Dump log on disconnect +local Folder = script.Parent local isStudio = game:GetService("RunService"):IsStudio() game:GetService("NetworkClient").ChildRemoved:Connect(function(p) - if not isStudio then + if not isStudio or Folder:FindFirstChild("ADONIS_DEBUGMODE_ENABLED") then print("~! PLAYER DISCONNECTED/KICKED! DUMPING ADONIS CLIENT LOG!") dumplog() end @@ -149,7 +150,6 @@ end) local unique = {} local origEnv = getfenv() -local Folder = script.Parent setfenv(1, setmetatable({}, { __metatable = unique })) local startTime = time() local oldInstNew = Instance.new @@ -170,9 +170,10 @@ end local function logError(...) warn("ERROR: ", ...) + table.insert(clientLog, table.concat({"ERROR:", ...}, " ")) if client and client.Remote then - client.Remote.Send("LogError", table.concat({ ... }, " ")) + client.Remote.Send("LogError", table.concat({...}, " ")) end end @@ -364,7 +365,7 @@ locals = { log("Create service metatable") -service = require(Folder.Shared.Service)(function(eType, msg, desc, ...) +service = require(Folder.Parent.Shared.Service)(function(eType, msg, desc, ...) --warn(eType, msg, desc, ...) local extra = { ... } if eType == "MethodError" then @@ -543,11 +544,20 @@ return service.NewProxy({ data.DebugMode = false end + log("Adding ACLI logs to the client logs") + if data.acliLogs then + for _, v in data.acliLogs do + log(v) + end + end + + log("Clearing environment") setfenv(1, setmetatable({}, { __metatable = unique })) + log("Loading necessary client values") client.Folder = Folder client.UIFolder = Folder:WaitForChild("UI", 9e9) - client.Shared = Folder:WaitForChild("Shared", 9e9) + client.Shared = Folder.Parent:WaitForChild("Shared", 9e9) client.Loader = data.Loader client.Module = data.Module @@ -578,11 +588,13 @@ return service.NewProxy({ end end + log("Fomratting chatlogs") for i, line in ipairs(client.Changelog) do client.FormattedChangelog[i] = applyColour(line) end --// Setup MatIcons + log("Setting up material icons") do local MaterialIcons = oldReq(service_UnWrap(client.Shared.MatIcons)) client.MatIcons = setmetatable({}, { diff --git a/MainModule/Client/Core/Functions.luau b/MainModule/Client/Core/Functions.luau index a8c8f27210..698f5819f5 100644 --- a/MainModule/Client/Core/Functions.luau +++ b/MainModule/Client/Core/Functions.luau @@ -860,7 +860,7 @@ return function(Vargs, GetEnv) Parent = p; Name = "Decal"; Face = 2; - Texture = `rbxassetid://{decalId}`; + Texture = `rbxthumb://type=Asset&id={decalId}&w=420&h=420`; Transparency = 0; }) else nil @@ -1456,7 +1456,7 @@ return function(Vargs, GetEnv) if decal and decal~=0 then local dec = service.New("Decal", p) dec.Face = 2 - dec.Texture = `http://www.roblox.com/asset/?id={decal}` + dec.Texture = `rbxthumb://type=Asset&id={decal}&w=420&h=420` dec.Transparency=0 end p.Size = Vector3.new(.2,.2,.2) diff --git a/MainModule/Client/Core/Variables.luau b/MainModule/Client/Core/Variables.luau index 84c9ae870c..f07f8cc09b 100644 --- a/MainModule/Client/Core/Variables.luau +++ b/MainModule/Client/Core/Variables.luau @@ -76,6 +76,7 @@ return function(Vargs, GetEnv) ParticlesEnabled = true; CapesEnabled = true; HideChatCommands = false; + KeepWindowWidthOnMinimize = false; CanUseEditableImages = false; -- TODO: Pool from FFlag Particles = {}; KeyBinds = {}; diff --git a/MainModule/Client/Plugins/Anti_Cheat.luau b/MainModule/Client/Plugins/Anti_Cheat.luau index 6c4187b325..37c5b9878b 100644 --- a/MainModule/Client/Plugins/Anti_Cheat.luau +++ b/MainModule/Client/Plugins/Anti_Cheat.luau @@ -296,13 +296,16 @@ return function(Vargs) local screenshotHud = service.GuiService:FindFirstChildOfClass("ScreenshotHud") for _, container in {Player.Character, service.StarterPack, Player:FindFirstChildOfClass("Backpack")} do - for _, v in ipairs(container:GetChildren()) do + for _, v: Instance in ipairs(container:GetChildren()) do if v:IsA("BackpackItem") and service.Trim(v.TextureId) ~= "" then table.insert(coreUrls, service.Trim(v.TextureId)) + elseif v:IsA("MeshPart") then + table.insert(coreUrls, service.Trim(v.MeshId)) + table.insert(coreUrls, service.Trim(v.TextureID)) -- For some reason, on MeshParts it's TextureID instead of TextureId end end end - + if screenshotHud and service.Trim(screenshotHud.CameraButtonIcon) ~= "" then table.insert(coreUrls, service.Trim(screenshotHud.CameraButtonIcon)) end @@ -315,7 +318,7 @@ return function(Vargs) local rawContentProvider = service.UnWrap(service.ContentProvider) local workspace = service.UnWrap(workspace) local tempDecal = service.UnWrap(Instance.new("Decal")) - tempDecal.Texture = "rbxasset://textures/face.png" -- Its a local asset and it's probably likely to never get removed, so it will never fail to load, unless the users PC is corrupted + tempDecal.Texture = "rbxasset://textures/face.png" -- It's a local asset and it's likely to never get removed, so it will never fail to load, unless the user's PC is corrupted local coreUrls = getCoreUrls() if not (service.GuiService.MenuIsOpen or service.ContentProvider.RequestQueueSize >= 50 or Player:GetNetworkPing() * 1000 >= 750) then @@ -337,14 +340,14 @@ return function(Vargs) end hasDetected = true - Detected("Kick", "Disallowed content URL detected in CoreGui") + Detected("Kick", "Disallowed content URL detected in CoreGui: " ..url) end end) tempDecal:Destroy() task.wait(6) - if not activated then -- // Checks for anti-coregui detetection bypasses - Detected("kick", "Coregui detection bypass found") + if not activated then -- // Checks for Anti-CoreGui detection bypasses + Detected("kick", "CoreGui detection bypass found") end end @@ -365,7 +368,7 @@ return function(Vargs) then Detected("kick", "Content provider spoofing detected") end - + -- // GetFocusedTextBox detection local textbox = service.UserInputService:GetFocusedTextBox() local success, value = pcall(service.StarterGui.GetCore, service.StarterGui, "DeveloperConsoleVisible") @@ -506,6 +509,7 @@ return function(Vargs) "run_secure_function"; -- synapse specific (?) "Kill by Avexus#1234 initialized"; --"FilteringEnabled Kill"; -- // Disabled due to potential of having false flags + "Depricated & Drop Support on"; -- VegaX detection "Couldn't find target with input:"; "Found target with input:"; "Couldn't find the target's root part%. :["; @@ -537,7 +541,7 @@ return function(Vargs) not service.UserInputService.TouchEnabled then if not pcall(function() - if not isStudio and (findService(game, "VirtualUser") or findService(game, "VirtualInputManager")) then + if not isStudio and (findService(game, "VirtualUser") or findService(game, "VirtualInputManager") or findService(game, "UGCValidationService")) then Detected("crash", "Disallowed Services Detected") end end) then @@ -712,7 +716,7 @@ return function(Vargs) if ran then Detected("crash", "RobloxLocked usable") end - + local function getDictionaryLenght(dictionary) local len = 0 @@ -789,7 +793,7 @@ return function(Vargs) end, function() Detected("kick", "Tamper Protection 0x16C1D") end) - + if gcinfo() ~= collectgarbage("count") then Detected("kick", "GC spoofing detected") end diff --git a/MainModule/Client/Plugins/Misc_Features.luau b/MainModule/Client/Plugins/Misc_Features.luau index 0ae630fbb0..5e7d74fa4c 100644 --- a/MainModule/Client/Plugins/Misc_Features.luau +++ b/MainModule/Client/Plugins/Misc_Features.luau @@ -38,6 +38,7 @@ return function(Vargs, GetEnv) Logs:AddLog("Script", `Attempted to add {ind} to legacy Remote.Unencrypted. Moving to Remote.Commands`) end }) + client.Folder:SetSpecial("Shared", client.Shared) Functions.GetRandom = function(pLen) local random = math.random local format = string.format diff --git a/MainModule/Client/UI/Default/BubbleChat.luau b/MainModule/Client/UI/Default/BubbleChat.luau index 655f7009d1..8c3991e3e0 100644 --- a/MainModule/Client/UI/Default/BubbleChat.luau +++ b/MainModule/Client/UI/Default/BubbleChat.luau @@ -22,19 +22,19 @@ return function(data, env) if window then local box = window:Add("TextBox",{ - Text = "Click here or press \";\" to chat"; - PlaceholderText = "Click here or press \";\" to chat"; + Text = `Click here or press "{client.Functions.KeyCodeToName(Enum.KeyCode.Semicolon.Value)}" to chat`; + PlaceholderText = `Click here or press "{client.Functions.KeyCodeToName(Enum.KeyCode.Semicolon.Value)}" to chat`; BackgroundTransparency = 1; TextScaled = true; TextSize = 20; }) box.FocusLost:Connect(function(enterPressed) - if enterPressed and service.Player.Character:FindFirstChild('Head') and color and box.Text~='Click here or press ";" to chat' then + if enterPressed and service.Player.Character:FindFirstChild('Head') and color and box.Text~=`Click here or press "{client.Functions.KeyCodeToName(Enum.KeyCode.Semicolon.Value)}" to chat` then if #box.Text > 0 then service.ChatService:Chat(service.Player.Character.Head, service.LaxFilter(box.Text), color) end - box.Text = 'Click here or press ";" to chat' + box.Text = `Click here or press "{client.Functions.KeyCodeToName(Enum.KeyCode.Semicolon.Value)}" to chat` end end) diff --git a/MainModule/Client/UI/Default/Console.rbxmx b/MainModule/Client/UI/Default/Console.rbxmx index 1973c0a529..d6a16587b7 100644 --- a/MainModule/Client/UI/Default/Console.rbxmx +++ b/MainModule/Client/UI/Default/Console.rbxmx @@ -124,7 +124,7 @@ 0 0 http://roblox.com/asset?id=158348114 - AutocompleteList + PlayerList null null null @@ -560,7 +560,7 @@ return function(data, env) local frame = gui.Frame local text = frame.TextBox local scroll = frame.ScrollingFrame - local autoList = frame.AutocompleteList + local autoList = frame.PlayerList local entry = gui.Entry local Settings = Remote.Get("Setting", {"SplitKey", "ConsoleKeyCode", "BatchKey", "Prefix"}) diff --git a/MainModule/Client/UI/Default/List.luau b/MainModule/Client/UI/Default/List.luau index 2a6fa596d5..469b8c8be7 100644 --- a/MainModule/Client/UI/Default/List.luau +++ b/MainModule/Client/UI/Default/List.luau @@ -114,15 +114,48 @@ return function(data, env) return newTab end - function doSearch(tab, text) - local found = {} - text = string.lower(tostring(text)):gsub("%%", "%%%%"):gsub("%[", "%%["):gsub("%]", "%%]") + function doSearch(tab, query) + if query == "" then + return tab + end + + local priorities = {{}, {}, {}, {}, {}, {}} + local total = 0 + query = string.lower(query) + for _, v in ipairs(tab) do - if text == "" or (type(v) == "string" and string.find(string.lower(v),text)) or (type(v) == "table" and ((v.Text and string.find(string.lower(tostring(v.Text)), text)) or (v.Filter and string.find(string.lower(v.Filter),text)))) then - table.insert(found, v) + local isTable = type(v) == "table" + local text = (isTable and v.Text) and string.lower(v.Text) or string.lower(tostring(v)) + local desc = (isTable and v.Desc) and string.lower(v.Desc) + local filter = (isTable and v.Filter) and string.lower(v.Filter) + + if text == search then + total += 1 + table.insert(priorities[1], v) + elseif string.find(text, query, 1, true) then + total += 1 + table.insert(priorities[2], v) + elseif desc == search then + total += 1 + table.insert(priorities[3], v) + elseif desc and string.find(desc, query, 1, true) then + total += 1 + table.insert(priorities[4], v) + elseif filter == search then + total += 1 + table.insert(priorities[5], v) + elseif filter and string.find(filter, query, 1, true) then + total += 1 + table.insert(priorities[6], v) end end - + + local found = table.create(total) + + for _, v in ipairs(priorities) do + table.move(v, 1, #v, #found + 1, found) + end + return found end diff --git a/MainModule/Client/UI/Default/Message.rbxmx b/MainModule/Client/UI/Default/Message.rbxmx index e4c9f3da97..ded862b17f 100644 --- a/MainModule/Client/UI/Default/Message.rbxmx +++ b/MainModule/Client/UI/Default/Message.rbxmx @@ -8,7 +8,7 @@ false 0 false - false + true Message false null @@ -51,7 +51,7 @@ 0 0 0 - -50 + 0 null 0 @@ -61,7 +61,7 @@ 1 0 1 - 50 + 0 0 -1 diff --git a/MainModule/Client/UI/Default/Music/init.luau b/MainModule/Client/UI/Default/Music/init.luau index 5bbd19740a..410505a6f1 100644 --- a/MainModule/Client/UI/Default/Music/init.luau +++ b/MainModule/Client/UI/Default/Music/init.luau @@ -384,33 +384,39 @@ return function(data, env) selected = nil availableSongLists[tab.Name] = {} tab:ClearAllChildren() - + local frame = tab:Add("ScrollingFrame", { Size = UDim2.new(1, 0, 1, 1); Position = UDim2.new(0, 0, 0, 0); BackgroundColor3 = Color3.new(0.235294, 0.235294, 0.235294); BackgroundTransparency = 1; }) - + local loading = frame:Add("TextLabel", { Text = "Loading nothing yet!"; ToolTip = "Never gonna give you up, Never gonna let you down..."; - BackgroundTransparency = 0; + BackgroundTransparency = 0.5; Size = UDim2.new(1,0,1,0); Position = UDim2.new(0,0,0,0); - ZIndex = 69420 + ZIndex = 69420; --TextXAlignment = "Left"; }) - + local function loop(i, v) if type(v) == "table" then local productInfo = service.GetProductInfo(v.ID, Enum.InfoType.Asset) - loading.Text = `Loading tracks ({i}/{#list})`; - - if productInfo.AssetTypeId == 3 then + + if num + 1 >= #list then + loading:Destroy() + elseif loading then + loading.Text = `Loading tracks ({num + 1}/{#list})` + loading.Active = false + end + + if productInfo.AssetTypeId == 3 or productInfo.Created == false then local trackPos = num + 1 table.insert(availableSongLists[tab.Name], v) - + v.Button = frame:Add("TextButton", { Text = ` {num + 1}) {productInfo.Name or `[ERROR] {v.Name}`}`; ToolTip = `Name: {v.Name} | ID: {v.ID}`; @@ -424,7 +430,7 @@ return function(data, env) activeSoundIdCache.listName = tab.Name fillSoundIdCache(availableSongLists[tab.Name]) end - + heading.Text = productInfo.Name or v.Name audioLib.AutoPlay = true audioLib:SetPlaylist(getRawPlaylist(availableSongLists[tab.Name])) @@ -437,12 +443,12 @@ return function(data, env) end end end - + for i, v in ipairs(list or {}) do task.spawn(xpcall, loop, warn, i, v) end - - loading:Destroy() + + service.Debris:AddItem(loading, 10) end -- Tabs for different playlists diff --git a/MainModule/Client/UI/Default/Settings.luau b/MainModule/Client/UI/Default/Settings.luau index 09f4c143bc..0da26aad9b 100644 --- a/MainModule/Client/UI/Default/Settings.luau +++ b/MainModule/Client/UI/Default/Settings.luau @@ -92,6 +92,19 @@ return function(data, env) toggle.Text = text end }; + { + Text = "Keep Window Width on Minimize: "; + Desc = "- Preserves window width when minimizing instead of resizing to fixed width"; + Entry = "Boolean"; + Value = Variables.KeepWindowWidthOnMinimize or false; + Function = function(enabled, toggle) + Variables.KeepWindowWidthOnMinimize = enabled + local text = toggle.Text + toggle.Text = "Saving.." + Remote.Get("UpdateClient","KeepWindowWidthOnMinimize",enabled) + toggle.Text = text + end + }; { Text = "Console Key: "; Desc = "Key used to open the console"; diff --git a/MainModule/Client/UI/Default/UserPanel.luau b/MainModule/Client/UI/Default/UserPanel.luau index 363fcfbdd8..aeba56b091 100644 --- a/MainModule/Client/UI/Default/UserPanel.luau +++ b/MainModule/Client/UI/Default/UserPanel.luau @@ -499,7 +499,6 @@ return function(data, env) Variables.Aliases = playerData.Aliases or {} commandPrefix = if type(chatMod.Prefix) == "table" then chatMod.Prefix[1] else chatMod.Prefix - for _, v in loadingIcons do v:Destroy() end @@ -533,6 +532,23 @@ return function(data, env) local function updateStatus() dStatus.Text = "Updating..." + + if settingsData.DonorCapes and playerData.isDonor then + if type(donorData) == "table" and donorData.Cape and type(donorData.Cape) == "table" then + if donorData.Enabled and service.Players.LocalPlayer.Character then + Functions.NewCape({ + Color = type(currentColor) == "table" and Color3.new(unpack(currentColor)) or currentColor or "White"; + Parent = service.Players.LocalPlayer.Character; + Material = donorData.Cape.Image or "Neon"; + --Reflectance = reflect; + Decal = donorData.Cape.Image; + }) + elseif service.Players.LocalPlayer.Character then + Functions.RemoveCape(service.Players.LocalPlayer.Character) + end + end + end + dStatus.Text = Remote.Get("UpdateDonor", playerData.Donor) task.wait(0.5) dStatus.Text = "Donated" @@ -681,7 +697,7 @@ return function(data, env) local img = pWindow:Add("ImageLabel", { BackgroundTransparency = 1; - Image = `rbxassetid://{Functions.GetTexture(currentTexture)}`; + Image = `rbxthumb://type=Asset&id={currentTexture}&w=420&h=420`; Size = UDim2.new(1, -10, 1, -80); Position = UDim2.new(0, 5, 0, 35); }) @@ -701,7 +717,7 @@ return function(data, env) local num = tonumber(text) if num then lastValid = num - img.Image = `rbxassetid://{Functions.GetTexture(num)}`; + img.Image = `rbxthumb://type=Asset&id={num}&w=420&h=420`; else new.Text = lastValid end @@ -1471,6 +1487,19 @@ return function(data, env) toggle.Text = text end };--]] + { + Text = "Keep Window Width on Minimize: "; + Desc = "- Preserves window width when minimizing instead of resizing to fixed width"; + Entry = "Boolean"; + Value = Variables.KeepWindowWidthOnMinimize or false; + Function = function(enabled, toggle) + Variables.KeepWindowWidthOnMinimize = enabled + local text = toggle.Text + toggle.Text = "Saving.." + Remote.Get("UpdateClient","KeepWindowWidthOnMinimize",enabled) + toggle.Text = text + end + }; { Text = "Console Key: "; Desc = "- Key used to open the console"; diff --git a/MainModule/Client/UI/Default/Window.rbxmx b/MainModule/Client/UI/Default/Window.rbxmx index ef654d38eb..33cd3f4360 100644 --- a/MainModule/Client/UI/Default/Window.rbxmx +++ b/MainModule/Client/UI/Default/Window.rbxmx @@ -1944,7 +1944,11 @@ return function(data, env) Main.Visible = false Drag.BackgroundTransparency = Main.BackgroundTransparency Drag.BackgroundColor3 = Main.BackgroundColor3 - Drag.Size = UDim2.new(0, 200, Drag.Size.Y.Scale, Drag.Size.Y.Offset) + -- Check if user wants to keep width on minimize + local keepWidth = client and client.Variables and client.Variables.KeepWindowWidthOnMinimize + local currentWidth = Drag.Size.X.Offset + local newWidth = keepWidth and math.max(currentWidth, MinSize[1]) or 200 + Drag.Size = UDim2.new(0, newWidth, Drag.Size.Y.Scale, Drag.Size.Y.Offset) if hideLabel then hideLabel.Text = "+" diff --git a/MainModule/Client/UI/Unity/Output.rbxmx b/MainModule/Client/UI/Unity/Output.rbxmx index 28d0338c5a..f5704946b9 100644 --- a/MainModule/Client/UI/Unity/Output.rbxmx +++ b/MainModule/Client/UI/Unity/Output.rbxmx @@ -433,7 +433,7 @@ return function(data, env) main.BackgroundColor3 = color t2.Text = msg - t2.FontFace = Font.new("rbxasset://fonts/families/Montserrat.json") + t2.Font = Enum.Font.Roboto consoleOpenTween:Play() --t2.Position = UDim2.new(0, 0, 0.35, 0) gTable.Ready() diff --git a/MainModule/Server/Commands/Admins.luau b/MainModule/Server/Commands/Admins.luau index 150654bf7e..6aac077991 100644 --- a/MainModule/Server/Commands/Admins.luau +++ b/MainModule/Server/Commands/Admins.luau @@ -989,6 +989,7 @@ return function(Vargs, env) AdminLevel = "Admins"; NoFilter = true; Function = function(plr: Player, args: {string}) + assert(Settings.CodeExecution, "CodeExecution must be enabled for this command to work") assert(args[2], "Missing LocalScript code (argument #2)") local bytecode = Core.Bytecode(args[2]) diff --git a/MainModule/Server/Commands/Creators.luau b/MainModule/Server/Commands/Creators.luau index 5ddb964e2f..1dc826c525 100644 --- a/MainModule/Server/Commands/Creators.luau +++ b/MainModule/Server/Commands/Creators.luau @@ -328,10 +328,9 @@ return function(Vargs, env) Functions.Hint("Operation cancelled", {plr}) end end, - } + }; - --[[ - TaskManager = { --// Unfinished + TaskManager = server.Data and server.Data.NightlyMode and { --// Unfinished Prefix = Settings.Prefix; Commands = {"taskmgr", "taskmanager"}; Args = {}; @@ -342,6 +341,5 @@ return function(Vargs, env) Remote.MakeGui(plr, "TaskManager", {}) end }; - --]] } end diff --git a/MainModule/Server/Commands/Donors.luau b/MainModule/Server/Commands/Donors.luau index 855c5603f4..fa5c001dca 100644 --- a/MainModule/Server/Commands/Donors.luau +++ b/MainModule/Server/Commands/Donors.luau @@ -227,7 +227,7 @@ return function(Vargs, env) Functions.RemoveParticle(torso, "DONOR_PARTICLE") Functions.NewParticle(torso, "ParticleEmitter", { Name = "DONOR_PARTICLE"; - Texture = `rbxassetid://{Functions.GetTexture(args[1])}`; + Texture = `rbxthumb://type=Asset&id={args[1]}&w=420&h=420`; Size = NumberSequence.new({ NumberSequenceKeypoint.new(0,0); NumberSequenceKeypoint.new(.1,.25,.25); diff --git a/MainModule/Server/Commands/Fun.luau b/MainModule/Server/Commands/Fun.luau index 690abcf533..4162454a35 100644 --- a/MainModule/Server/Commands/Fun.luau +++ b/MainModule/Server/Commands/Fun.luau @@ -1099,7 +1099,7 @@ return function(Vargs, env) Sword = { Prefix = Settings.Prefix; Commands = {"sword", "givesword"}; - Args = {"player", "allow teamkill (default: true)"}; + Args = {"player", "allow teamkill (default: true)", "base dmg (default: 5)", "slash dmg (default: 10)", "lunge dmg (default: 30)"}; Description = "Gives the target player(s) a sword"; AdminLevel = "Moderators"; Fun = true; @@ -1108,6 +1108,10 @@ return function(Vargs, env) local config = sword:FindFirstChild("Configurations") if config then config.CanTeamkill.Value = if args[2] and args[2]:lower() == "false" then false else true + + config.BaseDamage.Value = if args[3] then assert(tonumber(args[3]), "Base Damage is not a number!") else 5 + config.SlashDamage.Value = if args[4] then assert(tonumber(args[4]), "Slash Damage is not a number!") else 10 + config.LungeDamage.Value = if args[5] then assert(tonumber(args[5]), "Lunge Damage is not a number!") else 30 end for _, v in service.GetPlayers(plr, args[1]) do local Backpack = v:FindFirstChildOfClass("Backpack") @@ -2854,7 +2858,8 @@ return function(Vargs, env) local decal2 = decal1:Clone() decal2.Face = "Front" local sound = service.New("Sound") - sound.SoundId = "rbxassetid://138081566" + sound.SoundId = "rbxassetid://95156028272944" -- Alternative "rbxassetid://99986264226275" The old one that was used since audio purge: "rbxassetid://138081566" + sound.PlaybackSpeed = 0.22 sound.Looped = true sound.Name = "ADONIS_ANIMATEAVATAR_SOUND" @@ -2991,7 +2996,7 @@ return function(Vargs, env) decal2.Name = "Nyan2" local sound = service.New("Sound") - sound.SoundId = "rbxassetid://9067256917" -- Old audio 265125691 which is gone... + sound.SoundId = "rbxassetid://5008970630" -- Old audio 265125691 which is gone... sound.Looped = true sound.Name = "ADONIS_ANIMATEAVATAR_SOUND" @@ -3034,6 +3039,11 @@ return function(Vargs, env) avatarAnimator.Disabled = false sound:Play() + task.delay(3.35*2, function() -- Simulate nyan cat song better + sound:Stop() + sound.SoundId = "rbxassetid://9067256917" + sound:Play() + end) end end }; @@ -3819,7 +3829,7 @@ return function(Vargs, env) UnSeizure = { Prefix = Settings.Prefix; - Commands = {"unseizure"}; + Commands = {"unseizure", "unseize"}; Args = {"player"}; Description = "Removes the effects of the seizure command"; Fun = true; diff --git a/MainModule/Server/Commands/Moderators.luau b/MainModule/Server/Commands/Moderators.luau index 28c3ba6e4b..4bcefea460 100644 --- a/MainModule/Server/Commands/Moderators.luau +++ b/MainModule/Server/Commands/Moderators.luau @@ -1484,11 +1484,17 @@ return function(Vargs, env) View = { Prefix = Settings.Prefix; Commands = {"view", "watch", "nsa", "viewplayer"}; - Args = {"player"}; + Args = {"player", "persist (default: true)"}; Description = "Makes you view the target player"; AdminLevel = "Moderators"; Function = function(plr: Player, args: {string}) for _, v in service.GetPlayers(plr, args[1]) do + local function viewPlayer(plr: Player, rootPart: BasePart, humanoid: Humanoid) + Functions.ResetReplicationFocus(plr) + plr.ReplicationFocus = rootPart + Remote.Send(plr, "Function", "SetView", humanoid) + end + local hum = v.Character and v.Character:FindFirstChildOfClass("Humanoid") if not hum then Functions.Hint(`{service.FormatPlayer(v)} doesn't have a character humanoid`, {plr}) @@ -1499,14 +1505,52 @@ return function(Vargs, env) Functions.Hint(`{service.FormatPlayer(v)} doesn't have a HumanoidRootPart`, {plr}) continue end - Functions.ResetReplicationFocus(plr) - plr.ReplicationFocus = rootPart - Remote.Send(plr, "Function", "SetView", hum) + + viewPlayer(plr, rootPart, hum) + + if v.UserId ~= plr.UserId then + local persist = args[2] + local event + + event = v.CharacterAdded:Connect(function(char) + task.wait(0.5) + + local newhum = char:FindFirstChildOfClass("Humanoid") + local newRootPart = char.PrimaryPart + + if Variables.PersistView[plr.UserId] and Variables.PersistView[plr.UserId].Viewing then + if Variables.PersistView[plr.UserId].Viewing.UserId == v.UserId then + viewPlayer(plr, newRootPart, newhum) + else + event:Disconnect() + end + return; + elseif Variables.PersistView[plr.UserId] and not Variables.PersistView[plr.UserId].Viewing then + Variables.PersistView[plr.UserId] = nil + Remote.Send(plr, "Function", "SetView", "reset") + event:Disconnect() + + return; + else + if persist and persist:lower() == "false" then + Remote.Send(plr, "Function", "SetView", "reset") + event:Disconnect() + return; + else + Variables.PersistView[plr.UserId] = { + Viewing = v + } + + viewPlayer(plr, newRootPart, newhum) + end + end + end) + end end end }; - --[[Viewport = { + Viewport = server.Data and server.Data.NightlyMode and { Prefix = Settings.Prefix; Commands = {"viewport", "cctv"}; Args = {"player"}; @@ -1519,7 +1563,7 @@ return function(Vargs, env) end end end - };--]] + }; ResetView = { Prefix = Settings.Prefix; @@ -2339,7 +2383,7 @@ return function(Vargs, env) ResetLighting = { Prefix = Settings.Prefix; - Commands = {"fix", "resetlighting", "undisco", "unflash", "fixlighting", "resetatmosphere", "fixatmosphere"}; + Commands = {"resetlighting", "undisco", "unflash", "fixlighting", "resetatmosphere", "fixatmosphere"}; Args = {}; Description = "Reset lighting back to the setting it had on server start"; AdminLevel = "Moderators"; @@ -4839,7 +4883,7 @@ return function(Vargs, env) Return = { Prefix = Settings.Prefix; - Commands = {"return"}; + Commands = {"back", "return"}; Args = {"player"}; Description = "Returns the player to their original position"; AdminLevel = "Moderators"; @@ -6240,17 +6284,13 @@ return function(Vargs, env) Description = "Gives the target player(s) the desired package (ID MUST BE A NUMBER)"; AdminLevel = "Moderators"; Function = function(plr: Player, args: {string}) - assert(args[1] and args[2] and tonumber(args[2]), "Missing player name") - assert(args[1] and args[2] and tonumber(args[2]), "Missing or invalid package ID") - - local id = tonumber(args[2]) - + local id = assert(assert(args[1], "Missing player name") and tonumber(args[2]), "Missing or invalid package ID") local suc,ers = pcall(function() return service.AssetService:GetBundleDetailsAsync(id) end) if suc then for _, item in ers.Items do if item.Type == "Asset" then - Commands.AvatarItem.Function(plr, {`@{plr.Name}`, item.Id}) + Commands.AvatarItem.Function(plr, {args[1], item.Id}) break end end diff --git a/MainModule/Server/Commands/Players.luau b/MainModule/Server/Commands/Players.luau index 9af08f601e..7b56b6e228 100644 --- a/MainModule/Server/Commands/Players.luau +++ b/MainModule/Server/Commands/Players.luau @@ -30,7 +30,7 @@ return function(Vargs, env) end for _,alias in cmd.Commands do - if #cmdAliases >= 4 and (#cmd.Commands - #cmdAliases) ~= 0 then + if #cmdAliases >= 6 and (#cmd.Commands - #cmdAliases) ~= 0 then table.insert(cmdAliases, `and {#cmd.Commands - #cmdAliases} more...`) break end diff --git a/MainModule/Server/Core/Admin.luau b/MainModule/Server/Core/Admin.luau index 1f7d4fee80..f633c7166c 100644 --- a/MainModule/Server/Core/Admin.luau +++ b/MainModule/Server/Core/Admin.luau @@ -278,18 +278,6 @@ return function(Vargs, GetEnv) end end - if Settings.CustomRanks then - local Ranks = Settings.Ranks - for name, users in Settings.CustomRanks do - if not Ranks[name] then - Ranks[name] = { - Level = 1; - Users = users; - }; - end - end - end - if Settings.CommandCooldowns then for cmdName, cooldownData in Settings.CommandCooldowns do local realCmd = Admin.GetCommand(cmdName) @@ -1461,22 +1449,15 @@ return function(Vargs, GetEnv) StringToComLevel = function(str) local strType = type(str) + if strType == "string" and string.lower(str) == "players" then + return 0 + end if strType == "number" then return str - elseif strType == "string" then - if string.lower(str) == "players" then - return 0 - end - - local lvl = Settings.Ranks[str] - if not lvl then - return -1 - end - - return lvl.Level end - return tonumber(str) + local lvl = Settings.Ranks[str] + return (lvl and lvl.Level) or tonumber(str) end; CheckComLevel = function(plrAdminLevel, comLevel) @@ -1513,7 +1494,7 @@ return function(Vargs, GetEnv) return false, "This command has been disabled." end - if Variables.IsStudio and cmd.NoStudio then + if Variables.IsStudio and cmd.NoStudio and not Core.DebugMode then return false, "This command cannot be used in Roblox Studio." end diff --git a/MainModule/Server/Core/Commands.luau b/MainModule/Server/Core/Commands.luau index 92b6634227..e9b9ad82b8 100644 --- a/MainModule/Server/Core/Commands.luau +++ b/MainModule/Server/Core/Commands.luau @@ -112,13 +112,7 @@ return function(Vargs, GetEnv) local lvl = cmd.AdminLevel if type(lvl) == "string" and lvl ~= "Donors" then - local resp = Admin.StringToComLevel(lvl) - if resp == nil or resp == -1 then - warn(`'AdminLevel' for command {ind} is provided as '{lvl}' but is invalid. Defaulting to 0.`) - resp = 0 - end - - cmd.AdminLevel = resp + cmd.AdminLevel = Admin.StringToComLevel(lvl) elseif type(lvl) == "table" then for b, v in lvl do lvl[b] = Admin.StringToComLevel(v) diff --git a/MainModule/Server/Core/Core.luau b/MainModule/Server/Core/Core.luau index 3304eea17f..ccfe661e26 100644 --- a/MainModule/Server/Core/Core.luau +++ b/MainModule/Server/Core/Core.luau @@ -175,11 +175,21 @@ return function(Vargs, GetEnv) Ranks = true; Commands = true; + CreatorPowers = true; CodeExecution = true; + PlayerDataKeyBlacklist = true; + + ["Commands.MakeScript"] = true; + ["Commands.ScriptBuilder"] = true; + ["Commands.ScriptEditor"] = true; + + ["Variables.ScriptBuilder"] = true; + ["Variables.ScriptEditor"] = true; + ["Variables.DeveloperWhitelist"] = true; + ["Variables.UrgentModuleId"] = true; --// Not gonna let malicious stuff set DS_Blacklist to {} or anything! DS_BLACKLIST = true; - ["Variables.UrgentModuleId"] = true; }; --// Prevent certain keys from loading from the DataStore @@ -320,34 +330,34 @@ return function(Vargs, GetEnv) end loader.Object:Destroy() - end; + end local depsName = service.HttpService:GenerateGUID(false) local folder = server.Client:Clone() - local acli = Deps.ClientMover:Clone(); + local acli = Deps.ClientMover:Clone() local client = folder.Client - local parentObj = parent or service.StarterPlayer:FindFirstChildOfClass("StarterPlayerScripts"); + local parentObj = parent or service.StarterPlayer:FindFirstChildOfClass("StarterPlayerScripts") local clientLoader = { Removing = false; - }; + } Core.MockClientKeys = Core.MockClientKeys or { Special = depsName; Module = client; } - local depsName = Core.MockClientKeys.Special; + local depsName = Core.MockClientKeys.Special local specialVal = service.New("StringValue") specialVal.Value = `{Core.Name}\\{depsName}` specialVal.Name = "Special" specialVal.Parent = folder - acli.Parent = folder; - acli.Disabled = false; + acli.Parent = folder + acli.Disabled = false - folder.Archivable = false; - folder.Name = depsName; --"Adonis_Client" - folder.Parent = parentObj; + folder.Archivable = false + folder.Name = depsName --"Adonis_Client" + folder.Parent = parentObj if not parent then local oName = folder.Name @@ -411,7 +421,7 @@ return function(Vargs, GetEnv) folder.Parent = parentObj end) - clientLoader.Removing = false; + clientLoader.Removing = false AddLog("Script", "Created client") end; @@ -419,41 +429,44 @@ return function(Vargs, GetEnv) HookClient = function(p) local key = tostring(p.UserId) local keys = Remote.Clients[key] + if keys then local depsName = service.HttpService:GenerateGUID(false) local eventName = service.HttpService:GenerateGUID(false) - local folder = server.Client:Clone() - local acli = Deps.ClientMover:Clone(); - local client = folder.Client + local acli = Deps.ClientMover:Clone() local parentTo = "PlayerGui" --// Roblox, seriously, please give the server access to PlayerScripts already so I don't need to do this. - local parentObj = p:FindFirstChildOfClass(parentTo) or p:WaitForChild(parentTo, 600); + local folder = service.New("Folder") --// ^^^^ NO, the sun is a deadly lazer. - Roblox CEO, CEO of CEOs + local parentObj = p:FindFirstChildOfClass(parentTo) or p:WaitForChild(parentTo, 600) if not p.Parent then return false elseif not parentObj then - p:Kick("[CLI-102495] Loading Error - PlayerGui Missing (Waited 10 Minutes)") + p:Kick("[ACLI-0x102495]: Loading Error - PlayerGui Missing (Waited 10 Minutes)") return false end - local container = service.New("ScreenGui"); - container.ResetOnSpawn = false; - container.Enabled = false; - container.Name = "\0"; + local container = service.New("ScreenGui") + container.ResetOnSpawn = false + container.Enabled = false + container.Name = "\0" + + server.Client:Clone().Parent = folder + server.Shared:Clone().Parent = folder local specialVal = service.New("StringValue") specialVal.Value = `{Core.Name}\\{depsName}` specialVal.Name = "Special" - specialVal.Parent = folder + specialVal.Parent = folder.Client keys.Special = depsName keys.EventName = eventName - keys.Module = client + keys.Module = folder.Client - acli.Parent = folder; - acli.Disabled = false; + acli.Parent = folder + acli.Disabled = false - folder.Name = "Adonis_Client" - folder.Parent = container; + folder.Name = depsName--"Adonis_Client" + folder.Parent = container --// Event only fires AFTER the client is alive and well local event; event = service.Events.ClientLoaded:Connect(function(plr) @@ -473,7 +486,7 @@ return function(Vargs, GetEnv) leaveEvent:Disconnect() leaveEvent = nil - event:Disconnect(); + event:Disconnect() event = nil end end) @@ -483,14 +496,14 @@ return function(Vargs, GetEnv) end) if not ok then - p:Kick(`[CLI-192385] Loading Error [HookClient Error: {err}]`) + p:Kick(`[ACLI-0x192385]: Loading Error [HookClient Error: {err}]`) return false else return true end else if p and p.Parent then - p:Kick("[CLI-5691283] Loading Error [HookClient: Keys Missing]") + p:Kick("[ACLI-0x5691283]: Loading Error [HookClient: Keys Missing]") end end end; @@ -772,11 +785,20 @@ return function(Vargs, GetEnv) end; DataStoreEncode = function(key) - if Core.DS_RESET_SALTS[key] then - key = Core.DS_RESET_SALTS[key] .. key - end - - return Functions.Base64Encode(Remote.Encrypt(tostring(key), Settings.DataStoreKey)) + if Core.DS_RESET_SALTS[key] then + key = Core.DS_RESET_SALTS[key] .. key + end + + -- Only consider salting if the key isn't a number (like a player ID) and if the setting isn't true + local IsPlayer = tonumber(key) ~= nil + local SettingIsTrue = server.Settings.DontSaltDataStoreKey == true + local ShouldSaltKey = not IsPlayer and not SettingIsTrue + local EncryptionKey = Settings.DataStoreKey + if ShouldSaltKey then + EncryptionKey = ("SALT_" .. Settings.DataStoreKey):sub(1,50) + end + + return Functions.Base64Encode(Remote.Encrypt(tostring(key), EncryptionKey)) end; SaveData = function(...) diff --git a/MainModule/Server/Core/Functions.luau b/MainModule/Server/Core/Functions.luau index f137444a85..34b9631dd9 100644 --- a/MainModule/Server/Core/Functions.luau +++ b/MainModule/Server/Core/Functions.luau @@ -1235,7 +1235,7 @@ return function(Vargs, GetEnv) task.wait() end - event:Fire("SetSetting", { + task.defer(event.Fire, event, "SetSetting", { Creator = player; Friendly = friendly; TeamColor = player.TeamColor; @@ -1249,7 +1249,7 @@ return function(Vargs, GetEnv) }) if walk then - event:Fire("Init") + task.defer(task.defer, event.Fire, event, "Init") end table.insert(Variables.Objects, new) diff --git a/MainModule/Server/Core/Variables.luau b/MainModule/Server/Core/Variables.luau index bcba33dc8b..c9ef6d0ce7 100644 --- a/MainModule/Server/Core/Variables.luau +++ b/MainModule/Server/Core/Variables.luau @@ -164,6 +164,8 @@ return function(Vargs, GetEnv) Haze = atmosphere and atmosphere.Haze, }, + PersistView = {}; + PMtickets = {}; HelpRequests = {}; diff --git a/MainModule/Server/Dependencies/Assets/BotBrain/init.server.lua b/MainModule/Server/Dependencies/Assets/BotBrain/init.server.lua index ad580461d6..d3c01e971c 100644 --- a/MainModule/Server/Dependencies/Assets/BotBrain/init.server.lua +++ b/MainModule/Server/Dependencies/Assets/BotBrain/init.server.lua @@ -153,11 +153,12 @@ getPath = function() if target then targetPos = target.CFrame else - targetPos = CFrame.new(props.PatrolZone+Vector3.new(math.random(-props.PatrolDist,props.PatrolDist),0,math.random(-props.PatrolDist,props.PatrolDist))) - task.wait(0.1) + targetPos = CFrame.new(props.PatrolZone + Vector3.new(math.random(-props.PatrolDist, props.PatrolDist),0,math.random(-props.PatrolDist, props.PatrolDist))) + task.wait(math.random()) end else - targetPos = CFrame.new(props.PatrolZone+Vector3.new(math.random(-props.PatrolDist,props.PatrolDist),0,math.random(-props.PatrolDist,props.PatrolDist))) + targetPos = CFrame.new(props.PatrolZone+Vector3.new(math.random(-props.PatrolDist, props.PatrolDist),0,math.random(-props.PatrolDist, props.PatrolDist))) + task.wait(math.random()) end if not props.isDead and not props.Computing then @@ -205,7 +206,7 @@ local function walkPath() hum:MoveTo(current+Vector3.new(2,0,2)) end - if #path>2 then + if #path > 2 then repeat task.wait(0.1) until path[currentInd] ~= coord or (getCFrame().Position - coord).Magnitude < 2.5 end end @@ -239,7 +240,6 @@ local function init() props.isDead = true end) - while task.wait(1/30) and not props.isDead do if char and hum and not props.isDead then updateBot() diff --git a/MainModule/Server/Dependencies/Assets/LinkedSword.rbxmx b/MainModule/Server/Dependencies/Assets/LinkedSword.rbxmx index ca7c2208ef..b4f7fbc939 100644 --- a/MainModule/Server/Dependencies/Assets/LinkedSword.rbxmx +++ b/MainModule/Server/Dependencies/Assets/LinkedSword.rbxmx @@ -2,7 +2,7 @@ true null nil - + true @@ -57,9 +57,9 @@ - -144.377625 - 2.00007772 - -105.503006 + -396.708801 + 11.0000353 + -60.0715027 -0.132099196 0.914433837 0.382571191 @@ -72,7 +72,7 @@ - + false @@ -86,9 +86,9 @@ 0 0 - -135.688812 - 2.00003767 - -52.751503 + -266.198792 + 6.50003481 + -56.4115028 -0.132099196 0.914433837 0.382571191 @@ -170,7 +170,7 @@ 4 - + 0 @@ -194,7 +194,7 @@ 0.600000024 - + 0 @@ -218,7 +218,7 @@ 0.699999988 - + 0 @@ -242,7 +242,7 @@ 1 - + 0 @@ -271,7 +271,7 @@ - + 0 @@ -299,9 +299,9 @@ Grips = { } DamageValues = { - BaseDamage = 5, - SlashDamage = 10, - LungeDamage = 30, + BaseDamage = Tool.Configurations.BaseDamage.Value, + SlashDamage = Tool.Configurations.SlashDamage.Value, + LungeDamage = Tool.Configurations.LungeDamage.Value, } Damage = DamageValues.BaseDamage @@ -390,7 +390,7 @@ function Blow(Hit) return end local character = Hit.Parent - local humanoid = character:FindFirstChild("Humanoid") + local humanoid = character:FindFirstChildOfClass("Humanoid") if not humanoid then return end @@ -426,7 +426,7 @@ end function Equipped() Character = Tool.Parent Player = Players:GetPlayerFromCharacter(Character) - Humanoid = Character:FindFirstChild("Humanoid") + Humanoid = Character:FindFirstChildOfClass("Humanoid") RootPart = Character:FindFirstChild("HumanoidRootPart") if not CheckIfAlive() then return @@ -450,7 +450,7 @@ Tool.Unequipped:connect(Unequipped)]]> - + 0 @@ -493,52 +493,7 @@ Tool.Changed:connect(OnChanged) - - - - - -5.87045527 - 4.01329851 - -0.208732232 - -0.0371841602 - 0.322614908 - -0.945799708 - -0 - 0.946454227 - 0.322838187 - 0.999308407 - 0.0120044667 - -0.035193108 - - null - 0 - 0 - false - 30 - 0 - - -3.69511557 - 3.27077055 - -0.127788067 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - true - 1 - ThumbnailCamera - -1 - - false - - - + 0 @@ -547,7 +502,7 @@ Tool.Changed:connect(OnChanged) -1 - + 0 @@ -558,9 +513,42 @@ Tool.Changed:connect(OnChanged) true + + + + 0 + false + BaseDamage + -1 + + 5 + + + + + + 0 + false + SlashDamage + -1 + + 10 + + + + + + 0 + false + LungeDamage + -1 + + 30 + + - \ No newline at end of file + diff --git a/MainModule/Server/Dependencies/ClientLoader.client.luau b/MainModule/Server/Dependencies/ClientLoader.client.luau index f328868f82..2e3b848b85 100644 --- a/MainModule/Server/Dependencies/ClientLoader.client.luau +++ b/MainModule/Server/Dependencies/ClientLoader.client.luau @@ -2,7 +2,7 @@ --// ACLI - Adonis Client Loading Initializer if true then return end --// #DISABLED -local DebugMode = script.Parent:FindFirstChild("ADONIS_DEBUGMODE_ENABLED") ~= nil +local DebugMode = script.Parent:FindFirstChild("ADONIS_DEBUGMODE_ENABLED", true) ~= nil local otime = os.time local time = time local game = game @@ -82,14 +82,14 @@ local function callCheck(child) print(`CallCheck: {child}`) if Locked(child) then warn("Child locked?") - Kill("ACLI: Locked") + Kill("[ACLI-0x1A58C635]: Locked") else print("Child not locked") xpcall(function() return child[{}] end, function() if getfenv(1) ~= getfenv(2) then - Kill("ACLI: Error") + Kill("[ACLI-0x8142C75A]: Check calller error") end end) end @@ -101,7 +101,7 @@ local function doPcall(func, ...) return ran, ret else warn(tostring(ret)) - Kill(`ACLI: Error\n{ret}`) + Kill(`[ACLI-0x30FED06E]: Unknown error \n{ret}`) return ran, ret end end @@ -175,7 +175,7 @@ local function checkChild(child) print(`Got return: {ret}`) if ret ~= "SUCCESS" then warn("Loading failed! Reason", ret) - Kill("ACLI: Loading Error [Bad Module Return]") + Kill("[ACLI-0x4D1B3283]: Loading Error [Bad Module Return]") else print("Debug: The client was found and loaded?") warn("Client Loaded") @@ -205,7 +205,7 @@ local function scan(folder) end end end - end) then warn("Scan failed?") Kick(player, "ACLI: Loading Error [Scan failed]") end + end) then warn("Scan failed?") Kick(player, "[ACLI-0xB57B3835]: Loading Error [Scan failed]") end end --// Load client @@ -225,7 +225,7 @@ else print("Checking CoreGui") if not Locked(game:GetService("CoreGui")) then warn("CoreGui not locked?") - Kill("ACLI: Error") + Kill("[ACLI-0x1698C5FC9]: Error") else print(`CoreGui Locked: {Locked(game:GetService("CoreGui"))}`) end @@ -240,13 +240,7 @@ else if not playerGui then warn("PlayerGui not found after 10 minutes") - Kick(player, "ACLI: PlayerGui Never Appeared (Waited 10 Minutes)") - --else - --playerGui.Changed:Connect(function() -- How about no - -- if playerGui.Name ~= "PlayerGui" then - -- playerGui.Name = "PlayerGui" - -- end - --end) + Kick(player, "[ACLI-0x1A077DCA0]: Loading Error - PlayerGui Missing (Waited 10 Minutes)") end finderEvent = playerGui.ChildAdded:Connect(function(child) @@ -275,7 +269,7 @@ else print("Checking if client found...") if not foundClient then warn("Loading took too long") - Kick(player, "\nACLI: [CLI-1162246] \nLoading Error [Took Too Long (>10 Minutes)]") + Kick(player, "[ACLI-0x1162246]: Loading Error [Took Too Long (>10 Minutes)]") else print("Debug: Adonis loaded? Took:", time()) end diff --git a/MainModule/Server/Dependencies/ClientMover.client.luau b/MainModule/Server/Dependencies/ClientMover.client.luau index 37d157cb88..aafd589602 100644 --- a/MainModule/Server/Dependencies/ClientMover.client.luau +++ b/MainModule/Server/Dependencies/ClientMover.client.luau @@ -1,7 +1,7 @@ --# selene: allow(empty_loop) --// Adonis Client Loader (Non-ReplicatedFirst Version) -local DebugMode = script.Parent:FindFirstChild("ADONIS_DEBUGMODE_ENABLED") ~= nil +local DebugMode = script.Parent:FindFirstChild("ADONIS_DEBUGMODE_ENABLED", true) ~= nil local wait = task.wait local time = time @@ -10,17 +10,16 @@ local xpcall = xpcall local setfenv = setfenv local tostring = tostring --- This stops all of the public Adonis bypasses. Though they would still be detected in time but it may be better to kick them before load?? do local game = game local task_spawn, xpcall, require, task_wait = task.spawn, xpcall, require, task.wait - local Players = game:FindFirstChildWhichIsA("Players") or game:FindService("Players") + local Players = game:FindFirstChildWhichIsA("Players") or game:FindService("Players") local localPlayer = Players.LocalPlayer local triggered = false local function loadingDetected(reason) - (localPlayer or Players.LocalPlayer):Kick(`:: Adonis Loader - Security :: {reason}`) + (localPlayer or Players.LocalPlayer):Kick(`[ACLI-0x6E2FA164] Loading Error [Environment integrity violation error: {reason}]`) while true do end end @@ -131,25 +130,30 @@ end -- ccuser44 was here ^_^ local players = game:GetService("Players") local player = players.LocalPlayer -local folder = script.Parent -local container = folder.Parent +local mainFolder = script.Parent +local folder = mainFolder:WaitForChild("Client") +local container = mainFolder.Parent local Kick = player.Kick local module = folder:WaitForChild("Client") local target = player local realPrint = print local realWarn = warn local start = time() +local acliLogs = {} local function print(...) if DebugMode or player.UserId == 1237666 then realPrint("ACLI:", ...) end + table.insert(acliLogs, select(2, pcall(table.concat, {"ACLI:", ...}, " "))) end local function warn(...) realWarn("ACLI:", ...) + table.insert(acliLogs, select(2, pcall(table.concat, {"ACLI WARNING:", ...}, " "))) end + local function Kill(info) if DebugMode then warn(info) return end pcall(function() Kick(player, info) end) @@ -170,14 +174,14 @@ local function callCheck(child) print(`CallCheck: {child}`) if Locked(child) then warn("Child locked?") - Kill("ACLI: Locked") + Kill("[ACLI-0x213A7768D]: Locked") else print("Child not locked") xpcall(function() return child[{}] end, function() if getfenv(1) ~= getfenv(2) then - Kill("ACLI: Error") + Kill("[ACLI-0xBC34ADD8]: Check caller error") end end) end @@ -213,15 +217,17 @@ if module and module:IsA("ModuleScript") then end --// Sometimes we load a little too fast and generate a warning from Roblox so we need to introduce some (minor) artificial loading lag... print("Changing child parent...") - folder.Name = "" + mainFolder.Name = "" wait(0.01) - folder.Parent = nil --// We cannot do this assynchronously or it will disconnect events that manage to connect before it changes parent to nil... + mainFolder.Parent = nil --// We cannot do this asynchronously or it will disconnect events that manage to connect before it changes parent to nil... print("Debug: Loading the client?") - local meta = require(module) + local success, meta = pcall(require, module) print(`Got metatable: {meta}`) - if meta and type(meta) == "userdata" and tostring(meta) == "Adonis" then - local ran,ret = pcall(meta, { + if not success then + Kill(`[ACLI-0x20D21CEE7]: Loading Error [Module failed to load due to {meta}]`) + elseif meta and type(meta) == "userdata" and tostring(meta) == "Adonis" then + local ran, ret = pcall(meta, { Module = module, Start = start, Loader = script, @@ -229,13 +235,14 @@ if module and module:IsA("ModuleScript") then Folder = folder; LoadingTime = loadingTime, CallCheck = callCheck, - Kill = Kill + Kill = Kill, + acliLogs = acliLogs }) print(`Got return: {ret}`) if ret ~= "SUCCESS" then warn("Loading failed! Reason", ret) - Kill("ACLI: Loading Error [Bad Module Return]") + Kill("[ACLI-0x102134B1E]: Loading Error [Bad Module Return]") else print("Debug: The client was found and loaded?") if container and container:IsA("ScreenGui") then @@ -244,5 +251,6 @@ if module and module:IsA("ModuleScript") then end else warn(`Invalid metatable: {meta}!`) + Kill("[ACLI-0xCE8CEF67]: Loading Error [Bad Module Return]") end end diff --git a/MainModule/Server/Plugins/Cross_Server.luau b/MainModule/Server/Plugins/Cross_Server.luau index 8cac25e512..9e21623e24 100644 --- a/MainModule/Server/Plugins/Cross_Server.luau +++ b/MainModule/Server/Plugins/Cross_Server.luau @@ -43,9 +43,9 @@ return function(Vargs, GetEnv) Process.Command(Functions.GetFakePlayer(plrData), comString, {AdminLevel = plrData.AdminLevel, CrossServer = true}) end; - --[[Loadstring = function(jobId, source) + Loadstring = server.Data and server.Data.NightlyMode and function(jobId, source) Core.Loadstring(source, GetEnv{})() - end;]] + end; Message = function(jobId, fromPlayer, message, duration) server.Functions.Message( diff --git a/MainModule/Server/Plugins/Debug_Specific.luau b/MainModule/Server/Plugins/Debug_Specific.luau index f03793be6f..034ee1f7bc 100644 --- a/MainModule/Server/Plugins/Debug_Specific.luau +++ b/MainModule/Server/Plugins/Debug_Specific.luau @@ -14,10 +14,9 @@ return function(Vargs, GetEnv) return end - --[[ --// Unfortunately not viable --// TODO: Make this viable perhaps? If done so, expose as a :terminal command - Reboot = { + Reboot = server.Data and server.Data.NightlyMode and { Prefix = Settings.Prefix; Commands = {"rebootadonis", "reloadadonis"}; Args = {}; @@ -40,7 +39,7 @@ return function(Vargs, GetEnv) error("Unable to reload: Runner missing"); end end; - };--]] + }; Commands.DebugUsage = { Prefix = Settings.PlayerPrefix; diff --git a/MainModule/Server/Plugins/Misc_Features.luau b/MainModule/Server/Plugins/Misc_Features.luau index 05bfb2be39..fcb55e13af 100644 --- a/MainModule/Server/Plugins/Misc_Features.luau +++ b/MainModule/Server/Plugins/Misc_Features.luau @@ -53,6 +53,9 @@ return function(Vargs, GetEnv) Logs:AddLog("Script", `Attempted to add {ind} to legacy Remote.Unencrypted. Moving to Remote.Commands`) end }) + if service.Wrapped(server.Folder) then + server.Folder:SetSpecial("Shared", server.Shared) + end Functions.GetRandom = function(pLen) local random = math.random local format = string.format @@ -73,6 +76,17 @@ return function(Vargs, GetEnv) Settings.Ranks[if rank == "Owners" then "HeadAdmins" else rank].Users = Settings[rank] end end + if Settings.CustomRanks then + local Ranks = Settings.Ranks + for name, users in Settings.CustomRanks do + if not Ranks[name] then + Ranks[name] = { + Level = 1; + Users = users; + } + end + end + end for k, v in {-- Legacy aliases [`{Settings.Prefix}giveppoints `] = `{Settings.Prefix}clientscript game:GetService("StarterGui"):SetCore("SendNotification", \{Title = "Points Awarded", Text = "You received points!", Icon = "rbxassetid://155221172"\})`, [`{Settings.Prefix}giveplayerpoints `] = `{Settings.Prefix}clientscript game:GetService("StarterGui"):SetCore("SendNotification", \{Title = "Points Awarded", Text = "You received points!", Icon = "rbxassetid://155221172"\})`, diff --git a/MainModule/Server/Plugins/Server-SoftShutdown.luau b/MainModule/Server/Plugins/Server-SoftShutdown.luau index 2e6b95f180..af3064ec85 100644 --- a/MainModule/Server/Plugins/Server-SoftShutdown.luau +++ b/MainModule/Server/Plugins/Server-SoftShutdown.luau @@ -101,11 +101,11 @@ return function(Vargs, GetEnv) Arguments = 0; Description = "Restart the server, placing all of the players in a reserved server and teleporting each of them to the new server"; Function = function(p,args,data) - if service.RunService:IsStudio() then return end + if service.RunService:IsStudio() and not server.Core.DebugMode then return end if #Players:GetPlayers() == 0 then return end local newserver = TeleportService:ReserveServer(game.PlaceId) - Functions.Message("Adonis", "Server Restart", "The server is restarting, please wait...", 'MatIcon://Hourglass empty', service.GetPlayers(), false, 1000) + Functions.Message("Adonis", Settings.SystemTitle, "The server is restarting, please wait...", 'MatIcon://Hourglass empty', service.GetPlayers(), false, 1000) task.wait(2) @@ -167,7 +167,7 @@ return function(Vargs, GetEnv) end local newserver = TeleportService:ReserveServer(game.PlaceId) - Functions.Message("Adonis", "Server Restart", "The server is restarting, please wait...", 'MatIcon://Hourglass empty', service.GetPlayers(), false, 1000) + Functions.Message("Adonis", Settings.SystemTitle, "The server is restarting, please wait...", 'MatIcon://Hourglass empty', service.GetPlayers(), false, 1000) task.wait(1) diff --git a/MainModule/Server/Server.luau b/MainModule/Server/Server.luau index 3294a0e6e6..25aa174cf9 100644 --- a/MainModule/Server/Server.luau +++ b/MainModule/Server/Server.luau @@ -310,7 +310,7 @@ locals = { Pcall = Pcall; }; -service = require(Folder.Shared.Service)(function(eType, msg, desc, ...) +service = require(Folder.Parent.Shared.Service)(function(eType, msg, desc, ...) local extra = table.pack(...) if eType == "MethodError" then if server and server.Logs and server.Logs.AddLog then @@ -505,6 +505,13 @@ return service.NewProxy({ end end + if data.NightlyMode then -- Wrap things that should be wrapped? + for _, v in {"Folder", "Deps", "CommandModules", "Client", "Dependancies", "PluginsFolder"} do + server[v] = service.Wrap(server[v]) + end + locals.Folder = service.Wrap(locals.Folder) + end + if data.DebugMode == true then if not silentStartup then warn("Adonis was loaded with DebugMode enabled; This is intended for development use only, certain debug features intended for development use will be enabled, which can weaken Adonis's security in a production environment.") @@ -535,7 +542,7 @@ return service.NewProxy({ server.LoadPackage = LoadPackage server.ServiceSpecific = ServiceSpecific - server.Shared = Folder.Shared + server.Shared = Folder.Parent.Shared server.ServerPlugins = data.ServerPlugins server.ClientPlugins = data.ClientPlugins server.Client = Folder.Parent.Client @@ -548,16 +555,8 @@ return service.NewProxy({ --script:Destroy() -- Unnecessary and potentially harmful? end - --// Copy client themes, plugins, and shared modules to the client folder + --// Copy client themes and plugins modules to the client folder local packagesToRunWithPlugins = {} - local shared = service.New("Folder", { - Name = "Shared"; - Parent = server.Client; - }) - - for _, module in ipairs(Folder.Shared:GetChildren()) do - module:Clone().Parent = shared - end for _, module in ipairs(data.ClientPlugins or {}) do if type(module) ~= "string" then @@ -598,7 +597,7 @@ return service.NewProxy({ end --// Attempts to patch Settings.Prefix to fix issues - if type(server.Settings.Prefix) == "table" then + if type(server.Settings.Prefix) == "table" then -- TODO: Move to backwards compatibility module? setmetatable(server.Settings.Prefix, { __concat = function(self, value) return `{self[1]}{value}` @@ -606,14 +605,13 @@ return service.NewProxy({ __tostring = function(self) return self[1] end, - + __index = string, -- Fix backwards compatibility for namecall usage of prefix + __eq = function(self, v) + return rawequal(self, v) or table.find(self, v) or service.CompareTables(self, v) or false + end, }) end - - - - --// Bind cleanup service.DataModel:BindToClose(function(...) server.CleanUp(...) diff --git a/MainModule/Server/Shared/AudioLib.luau b/MainModule/Shared/AudioLib.luau similarity index 99% rename from MainModule/Server/Shared/AudioLib.luau rename to MainModule/Shared/AudioLib.luau index ff3c332626..125823b958 100644 --- a/MainModule/Server/Shared/AudioLib.luau +++ b/MainModule/Shared/AudioLib.luau @@ -97,7 +97,7 @@ function AudioLib:__newindex(k, v) end end -function AudioLib:tostring() +function AudioLib:__tostring() return "AudioLib" end diff --git a/MainModule/Server/Shared/Changelog.luau b/MainModule/Shared/Changelog.luau similarity index 99% rename from MainModule/Server/Shared/Changelog.luau rename to MainModule/Shared/Changelog.luau index e9534b967e..ba40d6da63 100644 --- a/MainModule/Server/Shared/Changelog.luau +++ b/MainModule/Shared/Changelog.luau @@ -1,9 +1,29 @@ return { - "Version: 266"; + "Version: 267"; "*Drag edges to expand*"; "*Report bugs/issues on our GitHub repository*"; ""; - "[v266 2025-03-31 18:28 UTC] @Dimenpsyonal"; + "[v267 2025-06-06 13:09 UTC] @Dimenpsyonal"; + "Disable code execution on new loaders by default"; + "Add Keep Window Width on Minimize setting to preserve GUI window width (#1907)"; + "(Git/WalkerOfBacon) Change fix lighting command from ;fix to ;resetlighting (#1873)"; + "(Git/ccuser44) Add ;back alias to ;return (#1894)"; + "(Git/EasternBloxxer) Made all asset ids work on capes and particles (#1895)"; + "(Git/WalkerOfBacon) Make ;clientscript only work when CodeExecution is on (#1896)"; + "(Git/kaiserandaxl) Fix Unity Output Not Displaying (#1897)"; + "(Git/WalkerOfBacon) ;view persists when the target user respawns (#1880)"; + "(Git/WalkerOfBacon) ;sword using custom damage (#1881)"; + "(Git/ccuser44) Fix backwards compatibility for command prefix (#1888)"; + "(Git/ccuser44) Move CustomRanks conversion to misc features module (#1891)"; + "(Git/xs4u) Fix self-view causing disallowed content URL in CoreGui detection to trigger (#1898)"; + "(Git/ccuser44) Dump Adonis client logs on studio if debug mode is on (#1882)"; + "(Git/ccuser44) Misc Fixes and improvements (#1903)"; + "(Git/ccuser44) Fix bots sometimes not working (#1904)"; + ""; + "[Patch v266.1 2025-04-02 13:24 UTC] @Dimenpsyonal"; + "Reverts change to invalid admin levels"; + ""; + "[v266 2025-03-31 17:28 UTC] @Dimenpsyonal"; "(Git/StayBlue) Refactor Autocomplete suggestions in Default theme (#1853)"; "(Git/convxors) Fix :oldlogs command (#1867)"; "(Git/StayBlue) Fix invalid admin level giving no warning (#1852)"; diff --git a/MainModule/Server/Shared/Credits.luau b/MainModule/Shared/Credits.luau similarity index 100% rename from MainModule/Server/Shared/Credits.luau rename to MainModule/Shared/Credits.luau diff --git a/MainModule/Server/Shared/DoubleLinkedList.luau b/MainModule/Shared/DoubleLinkedList.luau similarity index 100% rename from MainModule/Server/Shared/DoubleLinkedList.luau rename to MainModule/Shared/DoubleLinkedList.luau diff --git a/MainModule/Server/Shared/FiOne/LocalRunner.meta.json b/MainModule/Shared/FiOne/LocalRunner.meta.json similarity index 100% rename from MainModule/Server/Shared/FiOne/LocalRunner.meta.json rename to MainModule/Shared/FiOne/LocalRunner.meta.json diff --git a/MainModule/Server/Shared/FiOne/LocalRunner.server.lua b/MainModule/Shared/FiOne/LocalRunner.server.lua similarity index 100% rename from MainModule/Server/Shared/FiOne/LocalRunner.server.lua rename to MainModule/Shared/FiOne/LocalRunner.server.lua diff --git a/MainModule/Server/Shared/FiOne/Runner.meta.json b/MainModule/Shared/FiOne/Runner.meta.json similarity index 100% rename from MainModule/Server/Shared/FiOne/Runner.meta.json rename to MainModule/Shared/FiOne/Runner.meta.json diff --git a/MainModule/Server/Shared/FiOne/Runner.server.luau b/MainModule/Shared/FiOne/Runner.server.luau similarity index 100% rename from MainModule/Server/Shared/FiOne/Runner.server.luau rename to MainModule/Shared/FiOne/Runner.server.luau diff --git a/MainModule/Server/Shared/FiOne/init.luau b/MainModule/Shared/FiOne/init.luau similarity index 100% rename from MainModule/Server/Shared/FiOne/init.luau rename to MainModule/Shared/FiOne/init.luau diff --git a/MainModule/Server/Shared/GoodSignal.luau b/MainModule/Shared/GoodSignal.luau similarity index 100% rename from MainModule/Server/Shared/GoodSignal.luau rename to MainModule/Shared/GoodSignal.luau diff --git a/MainModule/Server/Shared/HashLib.luau b/MainModule/Shared/HashLib.luau similarity index 100% rename from MainModule/Server/Shared/HashLib.luau rename to MainModule/Shared/HashLib.luau diff --git a/MainModule/Server/Shared/KeycodeNames.luau b/MainModule/Shared/KeycodeNames.luau similarity index 100% rename from MainModule/Server/Shared/KeycodeNames.luau rename to MainModule/Shared/KeycodeNames.luau diff --git a/MainModule/Server/Shared/MatIcons.luau b/MainModule/Shared/MatIcons.luau similarity index 100% rename from MainModule/Server/Shared/MatIcons.luau rename to MainModule/Shared/MatIcons.luau diff --git a/MainModule/Server/Shared/Service.luau b/MainModule/Shared/Service.luau similarity index 99% rename from MainModule/Server/Shared/Service.luau rename to MainModule/Shared/Service.luau index 9ed8db791c..65c0db3daf 100644 --- a/MainModule/Server/Shared/Service.luau +++ b/MainModule/Shared/Service.luau @@ -3,6 +3,7 @@ client = nil Pcall = nil Routine = nil logError = nil +Folder = nil local main local ErrorHandler @@ -697,6 +698,20 @@ return function(errorHandler, eventChecker, fenceSpecific, env) return num end; + CompareTables = function(t1, t2) + if service.CountTable(t1) ~= service.CountTable(t2) then + return false + end + + for k, _ in t1 do + if not rawequal(t1[k], t2[k]) then + return false + end + end + + return true + end; + Debounce = function(key, func) local env = getfenv(2) -- TODO: Remove env thing local Debounces = env and env._ADONIS_DEBOUNCES or Debounces or {} @@ -1461,7 +1476,9 @@ return function(errorHandler, eventChecker, fenceSpecific, env) end end end; - __tostring = "Service"; + __tostring = function() + return "Service" + end; __metatable = if main.Core and main.Core.DebugMode then nil else "Service"; }) @@ -1474,7 +1491,7 @@ return function(errorHandler, eventChecker, fenceSpecific, env) service.HelperService = HelperService service.ThreadService = ThreadService service.EventService = EventService - service.Signal = require(script.Parent.Shared.GoodSignal) + service.Signal = require((main.Shared or (main.Folder or Folder).Parent.Shared).GoodSignal) if client ~= nil then for i, val in service do diff --git a/MainModule/Server/Shared/Typechecker.luau b/MainModule/Shared/Typechecker.luau similarity index 100% rename from MainModule/Server/Shared/Typechecker.luau rename to MainModule/Shared/Typechecker.luau