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