diff --git a/Loader/Config/Settings.lua b/Loader/Config/Settings.lua index 6b2d5c94de..4dff8613fa 100644 --- a/Loader/Config/Settings.lua +++ b/Loader/Config/Settings.lua @@ -277,6 +277,7 @@ settings.CommandCooldowns = { settings.FunCommands = true -- Are fun commands enabled? settings.PlayerCommands = true -- Are player-level utility commands enabled? settings.AgeRestrictedCommands = true -- Are age-locked commands enabled? +settings.WarnDangerousCommand = false -- Do dangerous commands ask for confirmation? settings.CommandFeedback = false -- Should players be notified when commands with non-obvious effects are run on them? 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 @@ -284,21 +285,23 @@ settings.CreatorPowers = true -- Gives me creator-level admin; This is strictl settings.CodeExecution = true -- 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. +settings.ChatCreateRobloxCommands = true -- Whether "/" commands for Roblox should get created in new Chat settings.BanMessage = "Banned" -- Message shown to banned users upon kick settings.LockMessage = "Not Whitelisted" -- Message shown to people when they are kicked while the game is :slocked settings.SystemTitle = "System Message" -- Title to display in :sm and :bc -settings.MaxLogs = 5000 -- Maximum logs to save before deleting the oldest -settings.SaveCommandLogs = true -- If command logs are saved to the datastores -settings.Notification = true -- Whether or not to show the "You're an admin" and "Updated" notifications -settings.SongHint = true -- Display a hint with the current song name and ID when a song is played via :music -settings.TopBarShift = false -- By default hints and notifications will appear from the top edge of the window. Set this to true if you don't want hints/notifications to appear in that region. -settings.Messages = {} -- A list of notification messages to show HeadAdmins and above on join -settings.AutoClean = false -- Will auto clean workspace of things like hats and tools -settings.AutoCleanDelay = 60 -- Time between auto cleans -settings.AutoBackup = false -- Run :backupmap automatically when the server starts. To restore the map, run :restoremap -settings.ReJail = false -- If true then when a player rejoins they'll go back into jail. Or if the moderator leaves everybody gets unjailed +settings.MaxLogs = 5000 -- Maximum logs to save before deleting the oldest +settings.SaveCommandLogs = true -- If command logs are saved to the datastores +settings.Notification = true -- Whether or not to show the "You're an admin" and "Updated" notifications +settings.SongHint = true -- Display a hint with the current song name and ID when a song is played via :music +settings.TopBarShift = false -- By default hints and notifications will appear from the top edge of the window. Set this to true if you don't want hints/notifications to appear in that region. +settings.Messages = {} -- A list of notification messages to show HeadAdmins and above on join +settings.AutoClean = false -- Will auto clean workspace of things like hats and tools +settings.AutoCleanDelay = 60 -- Time between auto cleans +settings.AutoBackup = false -- Run :backupmap automatically when the server starts. To restore the map, run :restoremap +settings.ReJail = false -- If true then when a player rejoins they'll go back into jail. Or if the moderator leaves everybody gets unjailed +settings.DisableRejoinAtMaxPlayers = false -- If true, disables rejoin when max players is reached to avoid an exploit that allows more players than the max amount. settings.Console = true -- Whether the command console is enabled settings.Console_AdminsOnly = false -- If true, only admins will be able to access the console @@ -450,11 +453,13 @@ descs.Allowed_API_Calls = [[ Allowed calls ]] descs.FunCommands = [[ Are fun commands enabled? ]] descs.PlayerCommands = [[ Are players commands enabled? ]] descs.AgeRestrictedCommands = [[ Are age-restricted commands enabled? ]] +descs.WarnDangerousCommand = [[ Do dangerous commands ask for confirmation before executing?]] descs.CommandFeedback = [[ Should players be notified when commands with non-obvious effects are run on them? ]] descs.CrossServerCommands = [[ Are commands which affect more than one server enabled? ]] descs.ChatCommands = [[ 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 ]] descs.SilentCommandDenials = [[ 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 ]] descs.OverrideChatCallbacks = [[ If the TextChatService ShouldDeliverCallbacks of all channels are overridden by Adonis on load. Required for muting ]] +descs.ChatCreateRobloxCommands = [[ Whether "/" commands for Roblox should get created in new Chat ]] descs.BanMessage = [[ Message shown to banned users ]] @@ -469,6 +474,7 @@ descs.CodeExecution = [[ Enables the use of code execution in Adonis; Scripting descs.SongHint = [[ Display a hint with the current song name and ID when a song is played via :music ]] descs.TopBarShift = [[ By default hints and notifs will appear from the top edge of the window. Set this to true if you don't want hints/notifications to appear in that region. ]] descs.ReJail = [[ If true then when a player rejoins they'll go back into jail. Or if the moderator leaves everybody gets unjailed ]] +descs.DisableRejoinAtMaxPlayers = [[ If true, disables rejoin when max players is reached to avoid an exploit that allows more players than the max amount. ]] descs.Messages = [[ A list of notification messages to show HeadAdmins and above on join ]] @@ -592,6 +598,8 @@ order = { " "; "FunCommands"; "PlayerCommands"; + "AgeRestrictedCommands"; + "WarnDangerousCommand"; "CommandFeedback"; "CrossServerCommands"; "ChatCommands"; @@ -599,6 +607,7 @@ order = { ""; "SilentCommandDenials"; "OverrideChatCallbacks"; + "ChatCreateRobloxCommands"; " "; "BanMessage"; "LockMessage"; @@ -610,6 +619,7 @@ order = { "SongHint"; "TopBarShift"; "ReJail"; + "DisableRejoinAtMaxPlayers"; ""; "AutoClean"; "AutoCleanDelay"; diff --git a/Loader/Loader/Loader.server.lua b/Loader/Loader/Loader.server.lua index cf870061c1..60e4a081e5 100644 --- a/Loader/Loader/Loader.server.lua +++ b/Loader/Loader/Loader.server.lua @@ -82,7 +82,7 @@ else ModuleID = 7510592873; --// https://www.roblox.com/library/7510592873/Adonis-MainModule LoaderID = 7510622625; --// https://www.roblox.com/library/7510622625/Adonis-Loader-Sceleratis-Davey-Bones-Epix - --// Note: The nightly module is updated frequently with ever commit merged to the master branch on the Adonis repo. + --// Note: The nightly module is updated frequently with every commit merged to the master branch on the Adonis repo. --// It is prone to breaking, unstable, untested, and should not be used for anything other than testing/feature preview. NightlyMode = false; --// If true, uses the nightly module instead of the current release module. NightlyModuleID = 8612978896; --// https://www.roblox.com/library/8612978896/Nightlies-Adonis-MainModule diff --git a/Loader/Version.model.json b/Loader/Version.model.json index e1d9b8d4e1..c8f9b792b4 100644 --- a/Loader/Version.model.json +++ b/Loader/Version.model.json @@ -1,6 +1,6 @@ { "ClassName": "NumberValue", "Properties": { - "Value": 251 + "Value": 252 } } diff --git a/MainModule/Client/Plugins/Anti_Cheat.lua b/MainModule/Client/Plugins/Anti_Cheat.lua index 0d893f144f..b97904e183 100644 --- a/MainModule/Client/Plugins/Anti_Cheat.lua +++ b/MainModule/Client/Plugins/Anti_Cheat.lua @@ -337,7 +337,7 @@ return function(Vargs) 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 local coreUrls = getCoreUrls() - if not (service.GuiService.MenuIsOpen or service.ContentProvider.RequestQueueSize >= 50 or Player:GetNetworkPing() >= 750) then + if not (service.GuiService.MenuIsOpen or service.ContentProvider.RequestQueueSize >= 50 or Player:GetNetworkPing() * 1000 >= 750) then rawContentProvider.PreloadAsync(rawContentProvider, {tempDecal, tempDecal, tempDecal, service.UnWrap(service.CoreGui), tempDecal}, function(url, status) if url == "rbxasset://textures/face.png" and status == Enum.AssetFetchStatus.Success then activated = true @@ -540,6 +540,7 @@ return function(Vargs) if not string.find(string.lower(Message), "failed to load", 1, true) and not string.find(string.lower(Message), "meshcontentprovider failed to process", 1, true) and + not string.find(string.lower(Message), "unknown 'active' animation:", 1, true) and (string.match(string.lower(Message), string.lower(v)) or string.match(Message, v)) then return true diff --git a/MainModule/Client/UI/Aero/Output.rbxmx b/MainModule/Client/UI/Aero/Output.rbxmx index f7f57b7b77..9e3e3f2c76 100644 --- a/MainModule/Client/UI/Aero/Output.rbxmx +++ b/MainModule/Client/UI/Aero/Output.rbxmx @@ -232,7 +232,7 @@ 0 4 - false + true null 0 false @@ -314,6 +314,7 @@ return function(data, env) local t1 = main.Title local t2 = main.Message local msg = data.Message + local title = data.Title local color = data.Color local found = client.UI.Get("Output") @@ -325,8 +326,14 @@ return function(data, env) end end end - - t2.Text = msg + if title then + t2.Text = `{title}: {msg}` + else + t2.Text = msg + end + if color then + t2.TextColor3 = color + end task.spawn(function() local sound = Instance.new("Sound",service.LocalContainer()) diff --git a/MainModule/Client/UI/Aero/Window.rbxmx b/MainModule/Client/UI/Aero/Window.rbxmx index 4f474a9583..85800510d6 100644 --- a/MainModule/Client/UI/Aero/Window.rbxmx +++ b/MainModule/Client/UI/Aero/Window.rbxmx @@ -2769,7 +2769,7 @@ return function(data, env) api:SetSpecial("Refresh", DoRefresh) api:SetSpecial("AddTitleButton", function(ignore, data) if type(ignore) == "table" and not data then data = ignore end return addTitleButton(data) end) api:SetSpecial("Ready", function() if onReady then onReady() end gTable.Ready() BringToFront() end) - api:SetSpecial("BindEvent", function(ignore, ...) Event(...) end) + api:SetSpecial("BindEvent", function(ignore, ...) return Event(...) end) api:SetSpecial("Hide", function(ignore, hide) doHide(hide) end) api:SetSpecial("SetTitle", function(ignore, newTitle) Titlef.Text = newTitle end) api:SetSpecial("SetPosition", function(ignore, newPos) setPosition(newPos) end) diff --git a/MainModule/Client/UI/Default/Output.rbxmx b/MainModule/Client/UI/Default/Output.rbxmx index 4899e2faba..46cf98de02 100644 --- a/MainModule/Client/UI/Default/Output.rbxmx +++ b/MainModule/Client/UI/Default/Output.rbxmx @@ -197,7 +197,7 @@ 0 4 - false + true null 0 false @@ -261,18 +261,26 @@ return function(data, env) setfenv(1, env) end - local playergui = service.PlayerGui - local localplayer = service.Players.LocalPlayer + local playerGui = service.PlayerGui + local localPlayer = service.Players.LocalPlayer local scr = client.UI.Prepare(script.Parent.Parent) local main = scr.Main - local t1 = main.Title - local t2 = main.Message - local msg = data.Message - local color = data.Color + local titleLabel = main.Title + local messageLabel = main.Message + local messageData = data.Message + local titleData = data.Title or "" + local colorIn = data.Color + + local formattedMessage + if titleData then + formattedMessage = `{titleData}: {messageData}` + else + formattedMessage = messageData + end local found = client.UI.Get("Output") if found then - for i,v in pairs(found) do + for _,v in pairs(found) do local p = v.Object if p and p.Parent then p.Main.Position = UDim2.new(0, 0, 0.35, p.Main.Position.Y.Offset+50) @@ -280,11 +288,13 @@ return function(data, env) end end - t2.Text = msg - t2.Font = "Arial" - --t2.Position = UDim2.new(0, 0, 0.35, 0) + messageLabel.Text = formattedMessage + messageLabel.Font = Enum.Font.SourceSans + if data.Color then + messageLabel.TextColor3 = data.Color + end gTable.Ready() - wait(5) + task.wait(5) gTable.Destroy() end]]> -1 diff --git a/MainModule/Client/UI/Default/PerfStats.lua b/MainModule/Client/UI/Default/PerfStats.lua index 1e995551eb..7ae741d6c1 100644 --- a/MainModule/Client/UI/Default/PerfStats.lua +++ b/MainModule/Client/UI/Default/PerfStats.lua @@ -44,7 +44,7 @@ return function(data, env) "Render: %.1f fps\nPhysics: %.1f fps\nPing: %d ms", 1 / service["RunService"].RenderStepped:Wait(), workspace:GetRealPhysicsFPS(), - service.Players.LocalPlayer:GetNetworkPing() + service.Players.LocalPlayer:GetNetworkPing() * 1000 ) task.wait(1) until not gfps or not gTable.Active diff --git a/MainModule/Client/UI/Default/UserPanel.lua b/MainModule/Client/UI/Default/UserPanel.lua index cfd19cb456..7916979d56 100644 --- a/MainModule/Client/UI/Default/UserPanel.lua +++ b/MainModule/Client/UI/Default/UserPanel.lua @@ -334,13 +334,9 @@ return function(data, env) end end - if window then - local playerData = Remote.Get("PlayerData") - local chatMod = Remote.Get("Setting",{"Prefix","SpecialPrefix","BatchKey","AnyPrefix","DonorCommands","DonorCapes"}) - local settingsData = Remote.Get("AllSettings") - - Variables.Aliases = playerData.Aliases or {} - + if window then + local commandPrefix = ":" + local playerData, chatMod, settingsData local tabFrame = window:Add("TabFrame", { Size = UDim2.new(1, -10, 1, -10); Position = UDim2.new(0, 5, 0, 5); @@ -404,7 +400,7 @@ return function(data, env) BackgroundTransparency = 0.5; Events = { MouseButton1Down = function() - Remote.Send("ProcessCommand", `{chatMod.Prefix}cmds`) + Remote.Send("ProcessCommand", `{commandPrefix}cmds`) end } }) @@ -474,13 +470,47 @@ return function(data, env) end + local LOAD_ICON = { + BackgroundTransparency = 1; + Size = UDim2.new(0, 14, 0, 14); + Position = UDim2.new(0.5, 0, 0.5, 0); + AnchorPoint = Vector2.new(0.5, 0.5); + Image = "rbxassetid://69395121"; + ImageTransparency = 0.1; + ZIndex = 10; + } + + local loadingIcons = {donorTab:Add("ImageLabel", LOAD_ICON), keyTab:Add("ImageLabel", LOAD_ICON), aliasTab:Add("ImageLabel", LOAD_ICON), clientTab:Add("ImageLabel", LOAD_ICON), gameTab:Add("ImageLabel", LOAD_ICON)} + gTable = window.gTable + window:Ready() + + task.spawn(function() + local start = os.clock() + + while loadingIcons[1].Parent do + for _, v in loadingIcons do + v.Rotation = -(os.clock() - start)/(1/60)*10 + end + task.wait(1/60) + end + end) + + playerData = Remote.Get("PlayerData") + chatMod = Remote.Get("Setting",{"Prefix","SpecialPrefix","BatchKey","AnyPrefix","DonorCommands","DonorCapes"}) + settingsData = Remote.Get("AllSettings") + Variables.Aliases = playerData.Aliases or {} + commandPrefix = chatMod.Prefix + + for _, v in loadingIcons do + v:Destroy() + end --// Donor Tab do - local donorData = playerData.Donor + local donorData = playerData.Donor local currentMaterial = donorData and donorData.Cape.Material - local currentTexture = donorData and donorData.Cape.Image - local currentColor = donorData and donorData.Cape.Color + local currentTexture = donorData and donorData.Cape.Image + local currentColor = donorData and donorData.Cape.Color if type(currentColor) == "table" then currentColor = Color3.new(unpack(currentColor, 1, 3)) @@ -979,6 +1009,7 @@ return function(data, env) Variables.WaitingForBind = false if keyInputHandler then keyInputHandler:Disconnect() + keyInputHandler = nil end end end diff --git a/MainModule/Client/UI/Default/Window.rbxmx b/MainModule/Client/UI/Default/Window.rbxmx index 0956fa0cce..b774309cca 100644 --- a/MainModule/Client/UI/Default/Window.rbxmx +++ b/MainModule/Client/UI/Default/Window.rbxmx @@ -2033,13 +2033,13 @@ return function(data, env) Drag.Position = UDim2.new(0.5, -Drag.AbsoluteSize.X/2, 0.5, -Main.AbsoluteSize.Y/2) end end - + function setMinSize(Table) if Table and typeof(Table) == "table" then MinSize = Table end end - + function setMaxSize(Table) if Table and typeof(Table) == "table" then MaxSize = Table @@ -2497,7 +2497,7 @@ return function(data, env) api:SetSpecial("Refresh", DoRefresh) api:SetSpecial("AddTitleButton", function(ignore, data) if type(ignore) == "table" and not data then data = ignore end return addTitleButton(data) end) api:SetSpecial("Ready", function() if onReady then onReady() end gTable.Ready() BringToFront() end) - api:SetSpecial("BindEvent", function(ignore, ...) Event(...) end) + api:SetSpecial("BindEvent", function(ignore, ...) return Event(...) end) api:SetSpecial("Hide", function(ignore, hide) doHide(hide) end) api:SetSpecial("SetTitle", function(ignore, newTitle) Titlef.Text = newTitle end) api:SetSpecial("SetPosition", function(ignore, newPos) setPosition(newPos) end) diff --git a/MainModule/Client/UI/Rounded/Output.rbxmx b/MainModule/Client/UI/Rounded/Output.rbxmx index 9a92aa217e..b29ebe184c 100644 --- a/MainModule/Client/UI/Rounded/Output.rbxmx +++ b/MainModule/Client/UI/Rounded/Output.rbxmx @@ -422,6 +422,7 @@ return function(data, env) local t1 = main.Title local t2 = main.Message local msg = data.Message + local title = data.Title local color = data.Color --[[ local found = client.UI.Get("Output") @@ -433,9 +434,13 @@ return function(data, env) end end end--]] - - t2.Text = msg - t2.Font = "Arial" + local formattedMessage = msg + if title then formattedMessage = `{title}: {msg}` end + t2.Text = formattedMessage + t2.Font = "SourceSans" + if color then + t2.TextColor3 = color + end --t2.Position = UDim2.new(0, 0, 0.35, 0) gTable.Ready() wait(5) @@ -469,4 +474,4 @@ end]]> - \ No newline at end of file + diff --git a/MainModule/Client/UI/Steampunk/Output.rbxmx b/MainModule/Client/UI/Steampunk/Output.rbxmx index 2e82ffd31d..15a11d2b5e 100644 --- a/MainModule/Client/UI/Steampunk/Output.rbxmx +++ b/MainModule/Client/UI/Steampunk/Output.rbxmx @@ -228,7 +228,7 @@ 0 4 - false + true null 0 false @@ -310,6 +310,7 @@ return function(data, env) local t1 = main.Title local t2 = main.Message local msg = data.Message + local title = data.Message local color = data.Color local found = client.UI.Get("Output") @@ -321,12 +322,16 @@ return function(data, env) end end end - - t2.Text = msg + local formattedMessage = msg + if title then formattedMessage = `{title}: {msg}` end + t2.Text = formattedMessage t2.Font = "Arial" + if color then + t2.TextColor3 = color + end --t2.Position = UDim2.new(0, 0, 0.35, 0) gTable.Ready() - wait(5) + task.wait(5) gTable.Destroy() end]]> -1 diff --git a/MainModule/Client/UI/Steampunk/Window.rbxmx b/MainModule/Client/UI/Steampunk/Window.rbxmx index 725ee635af..6992ddc117 100644 --- a/MainModule/Client/UI/Steampunk/Window.rbxmx +++ b/MainModule/Client/UI/Steampunk/Window.rbxmx @@ -2588,7 +2588,7 @@ return function(data, env) api:SetSpecial("Refresh", DoRefresh) api:SetSpecial("AddTitleButton", function(ignore, data) if type(ignore) == "table" and not data then data = ignore end return addTitleButton(data) end) api:SetSpecial("Ready", function() if onReady then onReady() end gTable.Ready() BringToFront() end) - api:SetSpecial("BindEvent", function(ignore, ...) Event(...) end) + api:SetSpecial("BindEvent", function(ignore, ...) return Event(...) end) api:SetSpecial("Hide", function(ignore, hide) doHide(hide) end) api:SetSpecial("SetTitle", function(ignore, newTitle) Titlef.Text = newTitle end) api:SetSpecial("SetPosition", function(ignore, newPos) setPosition(newPos) end) diff --git a/MainModule/Client/UI/TransBlack/Window.rbxmx b/MainModule/Client/UI/TransBlack/Window.rbxmx index f329250f75..24b7cf5912 100644 --- a/MainModule/Client/UI/TransBlack/Window.rbxmx +++ b/MainModule/Client/UI/TransBlack/Window.rbxmx @@ -2589,7 +2589,7 @@ return function(data, env) api:SetSpecial("Refresh", DoRefresh) api:SetSpecial("AddTitleButton", function(ignore, data) if type(ignore) == "table" and not data then data = ignore end return addTitleButton(data) end) api:SetSpecial("Ready", function() if onReady then onReady() end gTable.Ready() BringToFront() end) - api:SetSpecial("BindEvent", function(ignore, ...) Event(...) end) + api:SetSpecial("BindEvent", function(ignore, ...) return Event(...) end) api:SetSpecial("Hide", function(ignore, hide) doHide(hide) end) api:SetSpecial("SetTitle", function(ignore, newTitle) Titlef.Text = newTitle end) api:SetSpecial("SetPosition", function(ignore, newPos) setPosition(newPos) end) diff --git a/MainModule/Client/UI/Unity/Output.rbxmx b/MainModule/Client/UI/Unity/Output.rbxmx index 0a681a0275..866f268028 100644 --- a/MainModule/Client/UI/Unity/Output.rbxmx +++ b/MainModule/Client/UI/Unity/Output.rbxmx @@ -232,7 +232,7 @@ 0 0 - false + true null 0 false @@ -405,9 +405,9 @@ return function(data, env) local t1 = main.Title local t2 = main.Message local msg = data.Message + local title = data.Title local color = data.Color or Color3.fromRGB(255, 78, 78) - local tweenInfo = TweenInfo.new(0.20)----service.SafeTweenSize(frame,UDim2.new(1,0,0,40),nil,nil,0.3,nil,function() if scrollOpen then frame.Size = UDim2.new(1,0,0,140) end end) local consoleOpenTween = service.TweenService:Create(main, tweenInfo, { Position = UDim2.new(0.11, 0, 0.35, 0); @@ -431,14 +431,17 @@ return function(data, env) end t2.TextColor3 = color main.BackgroundColor3 = color - t2.Text = msg + + local formattedMessage = msg + if title then formattedMessage = `{title}: {msg}` end + t2.Text = formattedMessage t2.Font = "Gotham" consoleOpenTween:Play() --t2.Position = UDim2.new(0, 0, 0.35, 0) gTable.Ready() - wait(5) + task.wait(5) consoleCloseTween:Play() - wait(2) + task.wait(2) gTable.Destroy() end]]> -1 diff --git a/MainModule/Client/UI/Unity/Window.rbxmx b/MainModule/Client/UI/Unity/Window.rbxmx index 0266b96a28..fa8bdddd66 100644 --- a/MainModule/Client/UI/Unity/Window.rbxmx +++ b/MainModule/Client/UI/Unity/Window.rbxmx @@ -1196,7 +1196,7 @@ return function(data, env) label.Font = Enum.Font.Gotham label.TextSize = 15 label.TextStrokeTransparency = 1 - + local font local sizeText = label.ContentText @@ -2580,7 +2580,7 @@ return function(data, env) api:SetSpecial("Refresh", DoRefresh) api:SetSpecial("AddTitleButton", function(ignore, data) if type(ignore) == "table" and not data then data = ignore end return addTitleButton(data) end) api:SetSpecial("Ready", function() if onReady then onReady() end gTable.Ready() BringToFront() end) - api:SetSpecial("BindEvent", function(ignore, ...) Event(...) end) + api:SetSpecial("BindEvent", function(ignore, ...) return Event(...) end) api:SetSpecial("Hide", function(ignore, hide) doHide(hide) end) api:SetSpecial("SetTitle", function(ignore, newTitle) Titlef.Text = newTitle end) api:SetSpecial("SetPosition", function(ignore, newPos) setPosition(newPos) end) diff --git a/MainModule/Client/UI/Windows XP/Output.rbxmx b/MainModule/Client/UI/Windows XP/Output.rbxmx index 2af0884f04..181702532f 100644 --- a/MainModule/Client/UI/Windows XP/Output.rbxmx +++ b/MainModule/Client/UI/Windows XP/Output.rbxmx @@ -172,7 +172,7 @@ 0 0 - false + true null 0 false @@ -451,7 +451,7 @@ 0.5 0 - false + true null 0 false @@ -1948,12 +1948,14 @@ return function(data, env) local localplayer = service.Players.LocalPlayer local scr = client.UI.Prepare(script.Parent.Parent) local window = scr.Window - local msg = data.Message - local color = data.Color + local dataMessage = data.Message + local dataTitle = data.Title + local dataColor = data.Color + local formattedMessage = msg local found = client.UI.Get("Output") if found then - for i,v in pairs(found) do + for _,v in found do local p = v.Object if p and p.Parent then p.Window.Position = UDim2.new(0.5, 0, 0.5, p.Window.Position.Y.Offset+160) @@ -1961,8 +1963,12 @@ return function(data, env) end end - window.Main.ScrollingFrame.ErrorText.Text = msg - window.Main.ScrollingFrame.ErrorText.TextColor3 = color + if title then + formattedMessage = `{dataTitle}: {msg}` + end + + window.Main.ScrollingFrame.ErrorText.Text = formattedMessage + window.Main.ScrollingFrame.ErrorText.TextColor3 = dataColor window.Close.MouseButton1Down:Connect(function() gTable.Destroy() @@ -1973,12 +1979,12 @@ return function(data, env) sound.SoundId = "rbxassetid://160715357" sound.Volume = 2 sound:Play() - wait(0.8) + task.wait(0.8) sound:Destroy() end) gTable.Ready() - wait(5) + task.wait(5) gTable.Destroy() end]]> -1 diff --git a/MainModule/Client/UI/Windows XP/Window.rbxmx b/MainModule/Client/UI/Windows XP/Window.rbxmx index aa56dfc010..cd162b580f 100644 --- a/MainModule/Client/UI/Windows XP/Window.rbxmx +++ b/MainModule/Client/UI/Windows XP/Window.rbxmx @@ -2668,7 +2668,7 @@ return function(data, env) api:SetSpecial("Refresh", DoRefresh) api:SetSpecial("AddTitleButton", function(ignore, data) if type(ignore) == "table" and not data then data = ignore end return addTitleButton(data) end) api:SetSpecial("Ready", function() if onReady then onReady() end gTable.Ready() BringToFront() end) - api:SetSpecial("BindEvent", function(ignore, ...) Event(...) end) + api:SetSpecial("BindEvent", function(ignore, ...) return Event(...) end) api:SetSpecial("Hide", function(ignore, hide) doHide(hide) end) api:SetSpecial("SetTitle", function(ignore, newTitle) Titlef.Text = newTitle end) api:SetSpecial("SetPosition", function(ignore, newPos) setPosition(newPos) end) diff --git a/MainModule/Server/Commands/Admins.lua b/MainModule/Server/Commands/Admins.lua index 34b5f0e9f6..14a226fe66 100644 --- a/MainModule/Server/Commands/Admins.lua +++ b/MainModule/Server/Commands/Admins.lua @@ -19,6 +19,7 @@ return function(Vargs, env) Args = {"player/user", "rank"}; Description = "Sets the admin rank of the target user(s); THIS SAVES!"; AdminLevel = "Admins"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {any}) assert(args[1], "Missing target user (argument #1)") local rankName = assert(args[2], "Missing rank name (argument #2)") @@ -62,6 +63,7 @@ return function(Vargs, env) Args = {"player", "rank"}; Description = `Identical to {Settings.Prefix}setrank, but doesn't save`; AdminLevel = "Admins"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {any}) assert(args[1], "Missing target player (argument #1)") local rankName = assert(args[2], "Missing rank name (argument #2)") @@ -101,6 +103,7 @@ return function(Vargs, env) Args = {"player", "level"}; Description = "Sets the target player(s) permission level for the current server; does not save"; AdminLevel = "Admins"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {any}) local senderLevel = data.PlayerData.Level local newLevel = assert(tonumber(args[2]), "Level must be a number") @@ -125,6 +128,7 @@ return function(Vargs, env) Args = {"player/user / list entry", "temp? (true/false) (default: false)"}; Description = "Removes admin/moderator ranks from the target player(s); saves unless is 'true'"; AdminLevel = "Admins"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {any}) local target = assert(args[1], "Missing target user (argument #1)") local temp = args[2] and args[2]:lower() == "true" @@ -197,6 +201,7 @@ return function(Vargs, env) Args = {"player"}; Description = "Removes the target players' admin powers for this server; does not save"; AdminLevel = "Admins"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {any}) local senderLevel = data.PlayerData.Level @@ -223,6 +228,7 @@ return function(Vargs, env) Args = {"player"}; Description = "Makes the target player(s) a temporary moderator; does not save"; AdminLevel = "Admins"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {any}) local senderLevel = data.PlayerData.Level @@ -244,6 +250,7 @@ return function(Vargs, env) Args = {"player/user"}; Description = "Makes the target player(s) a moderator; saves"; AdminLevel = "Admins"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {any}) local senderLevel = data.PlayerData.Level @@ -1424,7 +1431,7 @@ return function(Vargs, env) Commands = {"nil"}; Args = {"player"}; Hidden = true; - Description = "Sends the target player(s) to nil, where they will not show up on the player list and not normally be able to interact with the game"; + Description = `Deletes the player forcefully, causing them to be kicked for "unexpected client behaviour"`; AdminLevel = "Admins"; Function = function(plr: Player, args: {string}) for _, v in service.GetPlayers(plr, args[1]) do diff --git a/MainModule/Server/Commands/Creators.lua b/MainModule/Server/Commands/Creators.lua index fbff8f315e..b327396cc6 100644 --- a/MainModule/Server/Commands/Creators.lua +++ b/MainModule/Server/Commands/Creators.lua @@ -152,6 +152,7 @@ return function(Vargs, env) Args = {"player"}; Description = "Makes the target player(s) a HeadAdmin; Saves"; AdminLevel = "Creators"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {any}) local sendLevel = data.PlayerData.Level for _, v in service.GetPlayers(plr, args[1]) do @@ -173,6 +174,7 @@ return function(Vargs, env) Args = {"player"}; Description = "Makes the target player(s) a temporary head admin; Does not save"; AdminLevel = "Creators"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {any}) local sendLevel = data.PlayerData.Level for _, v in service.GetPlayers(plr, args[1]) do @@ -277,14 +279,14 @@ return function(Vargs, env) local oError = error local newenv = setfenv(getfenv(),{ - print = function(...) local args, str = table.pack(...), "" for i = 1, args.n do str ..= `{(i > 1 and " " or "")}{args[i]}` end Remote.MakeGui(plr, "Output",{Title = 'Output'; Message = `PRINT: {str}`}) end; - warn = function(...) local args, str = table.pack(...), "" for i = 1, args.n do str ..= `{(i > 1 and " " or "")}{args[i]}` end Remote.MakeGui(plr, "Output",{Title = 'Output'; Message = `WARN: {str}`}) end; + print = function(...) local args, str = table.pack(...), "" for i = 1, args.n do str ..= `{(i > 1 and " " or "")}{args[i]}` end Remote.MakeGui(plr, "Output",{Title = "WARN"; Message = `{str}`}) end; + warn = function(...) local args, str = table.pack(...), "" for i = 1, args.n do str ..= `{(i > 1 and " " or "")}{args[i]}` end Remote.MakeGui(plr, "Output",{Title = "WARN"; Message = `{str}`}) end; error = function(reason, level) if level ~= nil and type(level) ~= "number" then oError(string.format("bad argument #2 to 'error' (number expected, got %s)", type(level)), 2) end - Remote.MakeGui(plr, "Output",{Title = 'Output'; Message = `LUA_DEMAND_ERROR: {reason}`}) + Remote.MakeGui(plr, "Output",{Title = "LUA_DEMAND_ERROR"; Message = `{reason}`}) oError(`Adonis ScriptEditor error: {reason}`, (level or 1) + 1) end; }) @@ -296,9 +298,9 @@ return function(Vargs, env) func() end) - Remote.MakeGui(plr,'Output',{Title = 'Output'; Message = Err}) + Remote.MakeGui(plr,'Output',{Title = 'ScriptEditor error'; Message = Err}) else - Remote.MakeGui(plr,'Output',{Title = 'Output'; Message = err}) + Remote.MakeGui(plr,'Output',{Title = 'ScriptEditor error'; Message = err}) end end) end diff --git a/MainModule/Server/Commands/Fun.lua b/MainModule/Server/Commands/Fun.lua index 554c94eb8a..790defc4c8 100644 --- a/MainModule/Server/Commands/Fun.lua +++ b/MainModule/Server/Commands/Fun.lua @@ -796,7 +796,7 @@ return function(Vargs, env) end if not chosenMat then - Remote.MakeGui(plr, "Output", {Title = "Output"; Message = "Invalid material choice";}) + Remote.MakeGui(plr, "Output", {Title = "Error"; Message = "Invalid material choice";}) return end @@ -1071,6 +1071,28 @@ return function(Vargs, env) end; }; + Sword = { + Prefix = Settings.Prefix; + Commands = {"sword", "givesword"}; + Args = {"player", "allow teamkill (default: true)"}; + Description = "Gives the target player(s) a sword"; + AdminLevel = "Moderators"; + Fun = true; + Function = function(plr: Player, args: {string}) + local sword = service.Insert(125013769) + local config = sword:FindFirstChild("Configurations") + if config then + config.CanTeamkill.Value = if args[2] and args[2]:lower() == "false" then false else true + end + for _, v in service.GetPlayers(plr, args[1]) do + local Backpack = v:FindFirstChildOfClass("Backpack") + if Backpack then + sword:Clone().Parent = Backpack + end + end + end + }; + iloveyou = { Prefix = "?"; Commands = {"iloveyou", "alwaysnear", "alwayswatching"}; @@ -2674,7 +2696,7 @@ return function(Vargs, env) local human = plr.Character:FindFirstChildOfClass("Humanoid") if not human then - Remote.MakeGui(p, "Output", {Title = "Output"; Message = `{plr.Name} doesn't have a Humanoid [Transformation Error]`}) + Remote.MakeGui(p, "Output", {Title = "Error"; Message = `{plr.Name} doesn't have a Humanoid [Transformation Error]`}) return end @@ -2723,62 +2745,7 @@ return function(Vargs, env) end end elseif human.RigType == Enum.HumanoidRigType.R15 then - local character = plr.Character - if character:FindFirstChild("Shirt") then - character.Shirt.Parent = plr.Character.HumanoidRootPart - end - - if character:FindFirstChild("Pants") then - character.Pants.Parent = character.HumanoidRootPart - end - - local torso = character:WaitForChild("UpperTorso") or character:WaitForChild("Torso") - local head = plr.Character:WaitForChild("Head") - - torso.Transparency = 1 - - for _, v in torso:GetChildren() do - if v:IsA("Motor6D") then - local lc0 = Instance.new("CFrameValue") - lc0.Name = "LastC0" - lc0.Value = v.C0 - lc0.Parent = v - end - end - - torso.Neck.C0 = CFrame.new(0, -0.5, -2) * CFrame.Angles(math.rad(90), math.rad(180), 0) - - local humanoidDescription = Instance.new("HumanoidDescription") - humanoidDescription.RightShoulderAngle = 90 - humanoidDescription.LeftShoulderAngle = -90 - humanoidDescription.RightHipAngle = 90 - humanoidDescription.LeftHipAngle = -90 - human:ApplyDescription(humanoidDescription) - - local seat = Instance.new("Seat") - seat.Name = "Adonis_Torso" - seat.TopSurface = Enum.SurfaceType.Smooth - seat.BottomSurface = Enum.SurfaceType.Smooth - seat.Size = Vector3.new(3, 1, 4) - - local attachment = Instance.new("Attachment") - attachment.Parent = seat - - local vectorForce = Instance.new("VectorForce") - vectorForce.Force = Vector3.new(0, 2000, 0) - vectorForce.Parent = seat - vectorForce.Attachment0 = attachment - - seat.CFrame = torso.CFrame - seat.Parent = character - - torso.Waist.C0 = CFrame.new(0, 0.5, 0) - - for _, v in character:GetDescendants() do - if v:IsA("BasePart") then - v.BrickColor = BrickColor.new("Brown") - end - end + Remote.MakeGui(plr, "Output", {Title = "Nonfunctional"; Message = `This command does not yet support R15.`; Color = Color3.new(1,1,1)}) end end end diff --git a/MainModule/Server/Commands/HeadAdmins.lua b/MainModule/Server/Commands/HeadAdmins.lua index 7c0f8aa6ec..648efed1f6 100644 --- a/MainModule/Server/Commands/HeadAdmins.lua +++ b/MainModule/Server/Commands/HeadAdmins.lua @@ -16,6 +16,7 @@ return function(Vargs, env) Description = `Bans the target player(s) from the game for the supplied amount of time; data-persistent; undo using {Settings.Prefix}untimeban`; Filter = true; AdminLevel = "HeadAdmins"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {}) assert(args[1], "Missing target user (argument #1)") @@ -92,6 +93,7 @@ return function(Vargs, env) Args = {"user"}; Description = "Removes the target user(s) from the timebans list"; AdminLevel = "HeadAdmins"; + Dangerous = true; Function = function(plr: Player, args: {string}) for _, v in service.GetPlayers(plr, assert(args[1], "Missing target user (argument #1)"), { UseFakePlayer = true; @@ -114,6 +116,7 @@ return function(Vargs, env) Args = {"player/user", "reason"}; Description = "Bans the target player(s) from the game permanently; if they join a different server they will be banned there too"; AdminLevel = "HeadAdmins"; + Dangerous = true; Filter = true; Function = function(plr: Player, args: {string}, data: {}) local reason = args[2] or "No reason provided" @@ -139,6 +142,7 @@ return function(Vargs, env) Args = {"user"}; Description = "Unbans the target user(s) from the game; saves"; AdminLevel = "HeadAdmins"; + Dangerous = true; Function = function(plr: Player, args: {string}) for _, v in service.GetPlayers(plr, assert(args[1], "Missing target user (argument #1)"), { UseFakePlayer = true; @@ -161,6 +165,7 @@ return function(Vargs, env) Args = {"player"}; Description = "Makes the target player(s) a temporary admin; does not save"; AdminLevel = "HeadAdmins"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {}) local senderLevel = data.PlayerData.Level @@ -182,6 +187,7 @@ return function(Vargs, env) Args = {"player/user"}; Description = "Makes the target player(s) an admin; saves"; AdminLevel = "HeadAdmins"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {}) local senderLevel = data.PlayerData.Level diff --git a/MainModule/Server/Commands/Moderators.lua b/MainModule/Server/Commands/Moderators.lua index 2145bf0268..aceb0d0c94 100644 --- a/MainModule/Server/Commands/Moderators.lua +++ b/MainModule/Server/Commands/Moderators.lua @@ -19,6 +19,7 @@ return function(Vargs, env) Filter = true; Description = "Disconnects the target player from the server"; AdminLevel = "Moderators"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {}) for _, v in service.GetPlayers(plr, assert(args[1], "Missing target player (argument #1)"), { IsKicking = true; @@ -343,6 +344,7 @@ return function(Vargs, env) Commands = {"warn", "warning"}; Args = {"player/user", "reason"}; Filter = true; + Dangerous = true; Description = "Warns players"; AdminLevel = "Moderators"; Function = function(plr: Player, args: {string}, data: {}) @@ -383,6 +385,7 @@ return function(Vargs, env) Commands = {"kickwarn", "kwarn", "kickwarning"}; Args = {"player/user", "reason"}; Filter = true; + Dangerous = true; Description = "Warns & kicks a player"; AdminLevel = "Moderators"; Function = function(plr: Player, args: {string}, data: {}) @@ -422,6 +425,7 @@ return function(Vargs, env) Args = {"player/user", "warning reason"}; Description = "Removes the specified warning from the target player"; AdminLevel = "Moderators"; + Dangerous = true; Function = function(plr: Player, args: {string}, data: {}) assert(args[1], "Missing target player(s) (argument #1)") local reason = string.lower(assert(args[2], "Missing warning reason (argument #2)")) @@ -473,6 +477,7 @@ return function(Vargs, env) Prefix = Settings.Prefix; Commands = {"clearwarnings", "clearwarns"}; Args = {"player"}; + Dangerous = true; Description = "Clears any warnings on a player"; AdminLevel = "Moderators"; Function = function(plr: Player, args: {string}) @@ -550,15 +555,15 @@ return function(Vargs, env) local TextToUse = args[2] if data.Options.Chat ~= true then TextToUse = service.SanitizeXML(args[2] or "Hello world!") - end + end Remote.Send( v, "Function", "DisplaySystemMessageInTextChat", nil, `{ service.Filter(TextToUse, plr, v) }`) - else + else Remote.Send(v, "Function", "ChatMessage", service.Filter(args[2], plr, v), Color3.fromRGB(255, 64, 77)) end - + end end }; @@ -951,6 +956,7 @@ return function(Vargs, env) local filtered = service.BroadcastFilter(message, p) if filtered ~= message then Remote.MakeGui(p, "Output", { + Title = "Filter error", Message = "A message filtering error occurred; please try again." }) else @@ -1345,13 +1351,13 @@ return function(Vargs, env) if v and service.Players:FindFirstChild(v.Name) then local hum = v.Character and v.Character:FindFirstChildOfClass("Humanoid") table.insert(tab, { - Text = string.format("[%s] %s", v:GetNetworkPing(), service.FormatPlayer(v, true)); + Text = string.format("[%d ms] %s", v:GetNetworkPing() * 1000, service.FormatPlayer(v, true)); Desc = string.format("Lower: %s | Health: %d | MaxHealth: %d | WalkSpeed: %d | JumpPower: %d | Humanoid Name: %s", v.Name:lower(), hum and hum.Health or 0, hum and hum.MaxHealth or 0, hum and hum.WalkSpeed or 0, hum and hum.JumpPower or 0, hum and hum.Name or "?"); }) else table.insert(tab, { Text = `[LOADING] {service.FormatPlayer(v, true)}`; - Desc = `Lower: {string.lower(v.Name)} | Ping: {v:GetNetworkPing()}`; + Desc = `Lower: {string.lower(v.Name)} | Ping: {v:GetNetworkPing() * 1000}`; }) end end @@ -1707,7 +1713,7 @@ return function(Vargs, env) Description = "Command Box"; AdminLevel = "Moderators"; Function = function(plr: Player, args: {string}) - Remote.MakeGui(plr,"CommandBox") + Remote.MakeGui(plr,"CommandBox") end; }; @@ -1719,7 +1725,7 @@ return function(Vargs, env) AdminLevel = "Moderators"; Function = function(plr: Player, args: {string}) for _, v in service.GetPlayers(plr, args[1]) do - Functions.Hint(`{service.FormatPlayer(v)}'s Ping is {v:GetNetworkPing()}ms`, {plr}) + Functions.Hint(`{service.FormatPlayer(v)}'s Ping is {v:GetNetworkPing() * 1000}ms`, {plr}) end end }; @@ -2395,7 +2401,7 @@ return function(Vargs, env) if service.Lighting:FindFirstChildWhichIsA("Atmosphere") ~= nil then local Atmosphere = service.Lighting:FindFirstChildWhichIsA("Atmosphere") - + Atmosphere.Name = Variables.OriginalAtmosphereSettings.Name Atmosphere.Density = Variables.OriginalAtmosphereSettings.Density Atmosphere.Offset = Variables.OriginalAtmosphereSettings.Offset @@ -2533,7 +2539,7 @@ return function(Vargs, env) end end }; - + Clip = { Prefix = Settings.Prefix; Commands = {"clip", "unnoclip"}; @@ -2546,7 +2552,7 @@ return function(Vargs, env) if old then if old.Clip.Value then old.Clip.Value = false - + task.delay(.5,function() old:Destroy() end) if Settings.CommandFeedback then @@ -2802,7 +2808,7 @@ return function(Vargs, env) end end }; - + BubbleChat = { Prefix = Settings.Prefix; Commands = {"bchat", "dchat", "bubblechat", "dialogchat"}; @@ -2832,7 +2838,7 @@ return function(Vargs, env) AdminLevel = "Moderators", Function = function(plr: Player, args: { string }) local plrChar = assert(plr.Character, "You don't have a character") - local plrHum = assert(plrChar:FindFirstChildOfClass("Humanoid", "You don't have a humanoid")) + local plrHum = assert(plrChar:FindFirstChildOfClass("Humanoid"), "You don't have a humanoid") local persistent = args[2] and (args[2]:lower() == "true" or args[2]:lower() == "yes") if persistent and type(Variables.TrackingTable[plr.Name]) ~= "table" then @@ -2902,14 +2908,14 @@ return function(Vargs, env) beam.Color3 = v.TeamColor.Color end) local plrCharRemovingConn = plr.CharacterRemoving:Once(function() - Remote.RemoveLocal(plr, `{v.Name}Tracker`) + Remote.RemoveLocal(plr, `{v.Name}_Tracker`) teamChangeConn:Disconnect() if charRemovingConn then charRemovingConn:Disconnect() end end) charRemovingConn = v.CharacterRemoving:Once(function() - Remote.RemoveLocal(plr, `{v.Name}Tracker`) + Remote.RemoveLocal(plr, `{v.Name}_Tracker`) teamChangeConn:Disconnect() plrCharRemovingConn:Disconnect() end) @@ -2931,7 +2937,7 @@ return function(Vargs, env) else local trackTargets = Variables.TrackingTable[plr.Name] for _, v in service.GetPlayers(plr, args[1]) do - Remote.RemoveLocal(plr, `{v.Name}Tracker`) + Remote.RemoveLocal(plr, `{v.Name}_Tracker`) if trackTargets then trackTargets[v] = nil end @@ -2991,27 +2997,6 @@ return function(Vargs, env) end }; - Sword = { - Prefix = Settings.Prefix; - Commands = {"sword", "givesword"}; - Args = {"player", "allow teamkill (default: true)"}; - Description = "Gives the target player(s) a sword"; - AdminLevel = "Moderators"; - Function = function(plr: Player, args: {string}) - local sword = service.Insert(125013769) - local config = sword:FindFirstChild("Configurations") - if config then - config.CanTeamkill.Value = if args[2] and args[2]:lower() == "false" then false else true - end - for _, v in service.GetPlayers(plr, args[1]) do - local Backpack = v:FindFirstChildOfClass("Backpack") - if Backpack then - sword:Clone().Parent = Backpack - end - end - end - }; - LoadAvatar = { Prefix = Settings.Prefix; Commands = {"loadavatar", "loadchar", "loadcharacter", "clone", "cloneplayer", "duplicate"}; @@ -4634,7 +4619,7 @@ return function(Vargs, env) Description = "Teleport player1(s) to player2, a waypoint, or specific coords, use :tp player1 waypoint-WAYPOINTNAME to use waypoints, x,y,z for coords"; AdminLevel = "Moderators"; Function = function(plr: Player, args: {string}) - + if args[2] and (string.match(args[2], "^waypoint%-(.*)") or string.match(args[2], "wp%-(.*)")) then local m = string.match(args[2], "^waypoint%-(.*)") or string.match(args[2], "wp%-(.*)") local point @@ -4644,7 +4629,7 @@ return function(Vargs, env) point=v end end - + for _, v in service.GetPlayers(plr, args[1], { NoFakePlayer = true }) do if point then local Character = v.Character @@ -4891,7 +4876,7 @@ return function(Vargs, env) for i = (l-1) * math.floor(numPlayers/lines) + 1, l * math.floor(numPlayers/lines) do local char = players[i].Character if not char then continue end - + char:SetAttribute("ADONIS_isTeleporting", true) task.delay(0.5, function() if char then char:SetAttribute("ADONIS_isTeleporting", nil) end end) @@ -4922,7 +4907,7 @@ return function(Vargs, env) for i = lines*math.floor(numPlayers/lines)+1, lines*math.floor(numPlayers/lines) + numPlayers%lines do local char = players[i].Character if not char then continue end - + char:SetAttribute("ADONIS_isTeleporting", true) task.delay(0.5, function() if char then char:SetAttribute("ADONIS_isTeleporting", nil) end end) @@ -4983,7 +4968,7 @@ return function(Vargs, env) end end }; - + RemoveLeaderstat = { Prefix = Settings.Prefix; Commands = {"removestats", "delstat"}; @@ -5016,7 +5001,7 @@ return function(Vargs, env) end end }; - + NewStat = { Prefix = Settings.Prefix; Commands = {"newstat", "createstat", "cstat"}; @@ -5030,19 +5015,19 @@ return function(Vargs, env) end local statType = if args[2] then args[2]:lower() else "number" local FilteredStatName = service.BroadcastFilter(statName, plr) - + if FilteredStatName ~= statName then error("Stat name is filtered! Sorry!") end - - for _,p in service.GetPlayers() do + + for _,p in service.GetPlayers() do local leaderstats = p:FindFirstChild("leaderstats") or service.New("Folder") leaderstats.Name = "leaderstats" - if statName then - if not leaderstats:FindFirstChild(FilteredStatName) then - local newStat = service.New(if statType == "number" then "NumberValue" else "StringValue") + if statName then + if not leaderstats:FindFirstChild(FilteredStatName) then + local newStat = service.New(if statType == "number" then "NumberValue" else "StringValue") newStat.Name = FilteredStatName - if statType ~= "number" then + if statType ~= "number" then newStat.Value = "N/A" end newStat.Parent = leaderstats @@ -5052,7 +5037,7 @@ return function(Vargs, env) end end }; - + AddToStat = { Prefix = Settings.Prefix; Commands = {"add", "addtostat", "addstat"}; @@ -5152,7 +5137,7 @@ return function(Vargs, env) else bCreateNewDefaultClothing = true end - + if bCreateNewDefaultClothing then -- Set a new specified clothing. local humDescClone = humanoidAppliedDesc:Clone() @@ -5439,7 +5424,7 @@ return function(Vargs, env) end end, }, - + AvatarItem = { Prefix = Settings.Prefix; Commands = {"avataritem", "giveavtaritem", "catalogitem", "accessory", "hat", "tshirt", "givetshirt", "shirt", "giveshirt", "pants", "givepants", "face", "anim", @@ -5472,7 +5457,7 @@ return function(Vargs, env) local humanoid: Humanoid? = v.Character and v.Character:FindFirstChildOfClass("Humanoid") if humanoid then local humanoidDesc: HumanoidDescription = humanoid:GetAppliedDescription() - + if not typeEnum then if v.Character:GetAttribute("LoadingSavedOutfit") then continue end @@ -5521,7 +5506,7 @@ return function(Vargs, env) end end }; - + RemoveTShirt = { Prefix = Settings.Prefix; Commands = {"removetshirt", "untshirt", "notshirt"}; @@ -6269,7 +6254,7 @@ return function(Vargs, env) end end }; - + GivePackage = { Prefix = Settings.Prefix; Commands = {"package", "givepackage", "setpackage", "bundle"}; @@ -6330,7 +6315,7 @@ return function(Vargs, env) assert(args[1], "Missing player name") local target = service.GetPlayers(plr, assert(args[2], "Missing username or UserId"), { AllowUnknownUsers = true; - }) + }) if target then target = target[1] local success, desc = pcall(service.Players.GetHumanoidDescriptionFromUserId, service.Players, target.UserId) @@ -6491,11 +6476,11 @@ return function(Vargs, env) ListUpdater = function(plr: Player) local Count = if Logs.Errors.__meta == "DLL" then Logs.Errors.count else #Logs.Errors local tab = table.create(Count) - for i, v in - if Logs.Errors.__meta == "DLL" then - Logs.Errors:GetAsTable() - else - Logs.Errors + for i, v in + if Logs.Errors.__meta == "DLL" then + Logs.Errors:GetAsTable() + else + Logs.Errors do table.insert(tab, i, { Time = v.Time; @@ -6644,11 +6629,11 @@ return function(Vargs, env) ListUpdater = function(plr: Player) local Count = if Logs.Commands.__meta == "DLL" then Logs.Commands.count else #Logs.Commands local tab = table.create(Count) - for i, v in - if Logs.Commands.__meta == "DLL" then - Logs.Commands:GetAsTable() - else - Logs.Commands + for i, v in + if Logs.Commands.__meta == "DLL" then + Logs.Commands:GetAsTable() + else + Logs.Commands do table.insert(tab, i, { Time = v.Time; diff --git a/MainModule/Server/Commands/Players.lua b/MainModule/Server/Commands/Players.lua index 86c2f09c2a..c2b6f5e08b 100644 --- a/MainModule/Server/Commands/Players.lua +++ b/MainModule/Server/Commands/Players.lua @@ -432,6 +432,7 @@ return function(Vargs, env) NoStudio = true; -- Commands which cannot be used in Roblox Studio (e.g. commands which use TeleportService) AdminLevel = "Players"; Function = function(plr: Player, args: {string}) + assert(#(service.Players:GetPlayers()) < service.Players.MaxPlayers or not Settings.DisableRejoinAtMaxPlayers, "Cannot rejoin while server is at max capacity.") service.TeleportService:TeleportAsync(game.PlaceId, {plr}, service.New("TeleportOptions", { ServerInstanceId = game.JobId })) @@ -453,6 +454,7 @@ return function(Vargs, env) if UserId then local success, found, _, placeId, jobId = pcall(service.TeleportService.GetPlayerPlaceInstanceAsync, service.TeleportService, UserId) if success then + assert(jobId ~= service.DataModel.JobId, "You're already in this server!") if found and placeId and jobId then service.TeleportService:TeleportAsync(placeId, {plr}, service.New("TeleportOptions", { ServerInstanceId = jobId diff --git a/MainModule/Server/Core/Admin.lua b/MainModule/Server/Core/Admin.lua index 866463c1af..6cfd3b113e 100644 --- a/MainModule/Server/Core/Admin.lua +++ b/MainModule/Server/Core/Admin.lua @@ -1201,14 +1201,13 @@ return function(Vargs, GetEnv) local cmdArgs = com.Args or com.Arguments local args = Admin.GetArgs(coma, #cmdArgs, ...) - local ran, error = TrackTask( `{plr.Name}: {coma}`, com.Function, function(err) err = string.match(err, ":(.+)$") or "Unknown error" Remote.MakeGui(plr, "Output", { - Title = "", + Title = "Error", Message = error, Color = Color3.new(1, 0, 0), }) @@ -1273,61 +1272,63 @@ return function(Vargs, GetEnv) Admin.PrefixCache = tempPrefix Admin.CommandCache = tempTable - -- // Support for commands to be ran via TextChat - task.spawn(function() - local container = service.TextChatService.ChatVersion == Enum.ChatVersion.TextChatService and service.TextChatService:WaitForChild("TextChatCommands", 9e9) + if Settings.ChatCreateRobloxCommands then + -- // Support for commands to be ran via TextChat + task.spawn(function() + local container = service.TextChatService.ChatVersion == Enum.ChatVersion.TextChatService and service.TextChatService:WaitForChild("TextChatCommands", 9e9) - if container then - for _, v in container:GetChildren() do - if string.sub(v.Name, 1, 7) == "Adonis_" then - v:Destroy() + if container then + for _, v in container:GetChildren() do + if string.sub(v.Name, 1, 7) == "Adonis_" then + v:Destroy() + end end - end - local blacklistedCommands = {} + local blacklistedCommands = {} - for _, v in container:GetDescendants() do - if v:IsA("TextChatCommand") then - blacklistedCommands[v.PrimaryAlias] = true - blacklistedCommands[v.SecondaryAlias] = true + for _, v in container:GetDescendants() do + if v:IsA("TextChatCommand") then + blacklistedCommands[v.PrimaryAlias] = true + blacklistedCommands[v.SecondaryAlias] = true + end end - end - for name, data in Commands do - local command1, command2 = nil, nil + for name, data in Commands do + local command1, command2 = nil, nil - if type(data) ~= "table" or data.Hidden then - continue - end + if type(data) ~= "table" or data.Hidden then + continue + end - for _, v in data.Commands do - if not blacklistedCommands["/"..data.Prefix..v] then - if not command1 then - command1 = "/"..data.Prefix..v - else - command2 = "/"..data.Prefix..v + for _, v in data.Commands do + if not blacklistedCommands["/"..data.Prefix..v] then + if not command1 then + command1 = "/"..data.Prefix..v + else + command2 = "/"..data.Prefix..v + end end end - end - if command1 then - local command = Instance.new("TextChatCommand") + if command1 then + local command = Instance.new("TextChatCommand") - command.Name = "Adonis_"..name - command.PrimaryAlias = command1 - command.SecondaryAlias = command2 or "" - command.Parent = container - command.Triggered:Connect(function(textSource, text) - local player = service.Players:GetPlayerByUserId(textSource.UserId) + command.Name = "Adonis_"..name + command.PrimaryAlias = command1 + command.SecondaryAlias = command2 or "" + command.Parent = container + command.Triggered:Connect(function(textSource, text) + local player = service.Players:GetPlayerByUserId(textSource.UserId) - if player then - Process.Command(player, string.sub(text, 2)) - end - end) + if player then + Process.Command(player, string.sub(text, 2)) + end + end) + end end end - end - end) + end) + end end; GetCommand = function(Command) diff --git a/MainModule/Server/Core/Commands.lua b/MainModule/Server/Core/Commands.lua index 6dd7406918..1687d3abfd 100644 --- a/MainModule/Server/Core/Commands.lua +++ b/MainModule/Server/Core/Commands.lua @@ -47,6 +47,7 @@ return function(Vargs, GetEnv) AllowDonors = t.boolean, Donors = t.boolean, Filter = t.boolean, + Dangerous = t.boolean, Function = t.callback, ListUpdater = t.optional(t.union(t.string, t.callback)) }) @@ -78,8 +79,9 @@ return function(Vargs, GetEnv) CrossServerDenied = false; IsCrossServer = false; Filter = false; + Dangerous = false; Function = function(plr) - Remote.MakeGui(plr, "Output", {Message = "No command implementation"}) + Remote.MakeGui(plr, "Output", {Title = "Error", Message = "No command implementation"}) end } do diff --git a/MainModule/Server/Core/Functions.lua b/MainModule/Server/Core/Functions.lua index 59a7345979..e46a97973c 100644 --- a/MainModule/Server/Core/Functions.lua +++ b/MainModule/Server/Core/Functions.lua @@ -350,7 +350,7 @@ return function(Vargs, GetEnv) if matched and tonumber(matched) then local num = tonumber(matched) if not num then - Remote.MakeGui(plr,'Output',{Title = 'Output'; Message = "Invalid number!"}) + Remote.MakeGui(plr,'Output', {Title = "Invalid argument"; Message = "Argument supplied is not a number!"}) return; end @@ -368,7 +368,7 @@ return function(Vargs, GetEnv) if matched and tonumber(matched) then local num = tonumber(matched) if not num then - Remote.MakeGui(plr, "Output", {Message = "Invalid number!"}) + Remote.MakeGui(plr,'Output', {Title = "Invalid argument"; Message = "Argument supplied is not a number!"}) return; end @@ -591,6 +591,7 @@ return function(Vargs, GetEnv) if plrCount == 0 and not options.DontError then Remote.MakeGui(plr, "Output", { + Title = "Missing player"; Message = if not options.NoFakePlayer then `No user named '{s}' exists` else `No players matching '{s}' were found!`; }) diff --git a/MainModule/Server/Core/HTTP.lua b/MainModule/Server/Core/HTTP.lua index d12395e795..e0b3614c18 100644 --- a/MainModule/Server/Core/HTTP.lua +++ b/MainModule/Server/Core/HTTP.lua @@ -39,13 +39,7 @@ return function(Vargs, GetEnv) server.HTTP = { Init = Init; - HttpEnabled = (function() - local success, res = pcall(service.HttpService.GetAsync, service.HttpService, "https://www.google.com/robots.txt") - if not success and res:find("Http requests are not enabled.") then - return false - end - return true - end)(); + HttpEnabled = service.HttpService.HttpEnabled; LoadstringEnabled = pcall(loadstring, ""); CheckHttp = function() diff --git a/MainModule/Server/Core/Logs.lua b/MainModule/Server/Core/Logs.lua index 9e93b91aa0..db77de7135 100644 --- a/MainModule/Server/Core/Logs.lua +++ b/MainModule/Server/Core/Logs.lua @@ -92,7 +92,7 @@ return function(Vargs, GetEnv) if tab.__meta == "DLL" then tab:AddToStartAndRemoveEndIfEnd(log, MaxLogs) - else + else table.insert(tab, 1, log) if #tab > tonumber(MaxLogs) then table.remove(tab, #tab) @@ -123,13 +123,17 @@ return function(Vargs, GetEnv) -- table.insert(logsToSave, Logs.Commands[i]); --end - Core.UpdateData("OldCommandLogs", function(oldLogs) if typeof(oldLogs) ~= "table" then oldLogs = service.HttpService:JSONDecode(oldLogs) end + Core.UpdateData("OldCommandLogs", function(oldLogs) + if type(oldLogs) == "string" then + oldLogs = service.HttpService:JSONDecode(oldLogs) + end + local temp = {} for _, m in logsToSave do if m.__meta == "DLL" then local newTab = m:GetAsTable() - + for i,v in pairs(newTab) do table.insert(temp,v) end @@ -189,6 +193,6 @@ return function(Vargs, GetEnv) end; }; }; - + Logs = Logs end diff --git a/MainModule/Server/Core/Process.lua b/MainModule/Server/Core/Process.lua index 436736a08d..fa35453a94 100644 --- a/MainModule/Server/Core/Process.lua +++ b/MainModule/Server/Core/Process.lua @@ -460,6 +460,24 @@ return function(Vargs, GetEnv) end end + if command.Dangerous and Settings.WarnDangerousCommand and not isSystem then + -- more checks + for i, argname in ipairs(cmdArgs) do + if string.find(argname, "player") ~= nil or string.find(argname, "plr") ~= nil then + local playersamount = #(service.GetPlayers(p, args[i])); + if playersamount > 1 then + if Remote.GetGui(p, "YesNoPrompt", { + Question = string.format("Are you sure you want to proceed? (%s selected %s possible players)", msg, playersamount); + Title = "Dangerous command" + }) == "No" then + Functions.Hint(string.format("Aborted command %s", msg), { p }) + return + end + end + end + end + end + if (opts.CrossServer or (not isSystem and not opts.DontLog)) and not command.NoLog then local noSave = command.AdminLevel == "Player" or command.Donors or command.AdminLevel == 0 AddLog("Commands", { @@ -483,9 +501,9 @@ return function(Vargs, GetEnv) if not opts.IgnoreErrors then if type(cmdError) == "string" then AddLog("Errors", `[{matched}] {cmdError}`) - + cmdError = cmdError:match("%d: (.+)$") or cmdError - + if not isSystem then Remote.MakeGui(p, "Output", { Message = cmdError, @@ -626,7 +644,7 @@ return function(Vargs, GetEnv) end else local msg = string.sub(msg, 1, Process.MsgStringLimit) - + if Settings.ChatCommands then if Admin.DoHideChatCmd(p, msg) then Remote.Send(p,"Function","ChatMessage",`> {msg}`,Color3.new(1, 1, 1)) @@ -730,8 +748,8 @@ return function(Vargs, GetEnv) return "REMOVED" end end - - do + + do local Removed = false local success, err = pcall(function() for filter,func in pairs(server.Variables.PlayerJoinFilters) do @@ -749,8 +767,8 @@ return function(Vargs, GetEnv) return "REMOVED" end end - - + + end) if not ran then @@ -828,8 +846,8 @@ return function(Vargs, GetEnv) Player = p; }) - for _,rateLimit in RateLimiter do - if not rateLimit.Caches then + for _,rateLimit in RateLimiter do + if not rateLimit.Caches then continue end rateLimit.Caches[p.UserId] = nil @@ -864,7 +882,7 @@ return function(Vargs, GetEnv) trackTargets[p] = nil local otherPlr = service.Players:FindFirstChild(otherPlrName) if otherPlr then - task.defer(Remote.RemoveLocal, otherPlr, `{p.Name}Tracker`) + task.defer(Remote.RemoveLocal, otherPlr, `{p.Name}_Tracker`) end end end @@ -926,7 +944,7 @@ return function(Vargs, GetEnv) if Settings.Detection and Settings.AllowClientAntiExploit then Remote.Send(p, "LaunchAnti", "MainDetection") - + Remote.Send(p, "LaunchAnti", "AntiAntiIdle", { Enabled = (Settings.AntiAntiIdle ~= false or Settings.AntiClientIdle ~= false) }) @@ -966,7 +984,7 @@ return function(Vargs, GetEnv) local newVer = (level > 300) and tonumber(string.match(server.Changelog[1], "Version: (.*)")) if Settings.Notification then - + task.wait(1) Functions.Notification("Welcome.", `Your rank is {rank} ({level}). Click here for commands.`, {p}, 15, "MatIcon://Verified user", Core.Bytecode(`client.Remote.Send('ProcessCommand','{Settings.Prefix}cmds')`)) @@ -993,7 +1011,7 @@ return function(Vargs, GetEnv) window:Ready() ]])) end - + if level >= 300 and #Settings.Messages > 0 then for _, Message in Settings.Messages do task.delay(1, Functions.Notification, "Message", tostring(Message), {p}, math.round((#Message/19)+2.5)) @@ -1037,7 +1055,7 @@ return function(Vargs, GetEnv) CharacterAdded = function(p, char, ...) local key = tostring(p.UserId) local keyData = Remote.Clients[key] - + local args = {...} if keyData then @@ -1061,11 +1079,11 @@ return function(Vargs, GetEnv) Message = Variables.NotifMessage }) end - - if - (not args[1] or + + if + (not args[1] or (args[1] and typeof(args[1]) == 'table' and args[1].FinishedLoading == nil or args[1].FinishedLoading == true)) - and + and (Settings.Console and (not Settings.Console_AdminsOnly or level > 0)) then Remote.RefreshGui(p, "Console") end @@ -1115,8 +1133,8 @@ return function(Vargs, GetEnv) and char:WaitForChild("HumanoidRootPart", 2) then for otherPlrName, trackTargets in Variables.TrackingTable do - if trackTargets[p] then - server.Commands.Track.Function(service.Players[otherPlrName], {`@{p.Name}`, "true"}) + if trackTargets[p] and service.Players:FindFirstChild(otherPlrName) then + Admin.RunCommandAsPlayer(`{Settings.Prefix}track`, service.Players[otherPlrName], `@{p.Name}`, "true") end end end diff --git a/MainModule/Server/Dependencies/Assets/AnimateAvatar.meta.json b/MainModule/Server/Dependencies/Assets/AnimateAvatar.meta.json index 51c45b040c..0181c8769c 100644 --- a/MainModule/Server/Dependencies/Assets/AnimateAvatar.meta.json +++ b/MainModule/Server/Dependencies/Assets/AnimateAvatar.meta.json @@ -1,6 +1,6 @@ { "properties": { - "Disabled": true, + "Enabled": false, "RunContext": "Client" } } diff --git a/MainModule/Server/Dependencies/Assets/BunnyHop.meta.json b/MainModule/Server/Dependencies/Assets/BunnyHop.meta.json index 5077db135e..6bf7085e31 100644 --- a/MainModule/Server/Dependencies/Assets/BunnyHop.meta.json +++ b/MainModule/Server/Dependencies/Assets/BunnyHop.meta.json @@ -1,5 +1,5 @@ { "properties": { - "Disabled": true + "Enabled": false } } diff --git a/MainModule/Server/Dependencies/Assets/Fly.client.lua b/MainModule/Server/Dependencies/Assets/Fly.client.lua index 5fa51e17e5..5ca19bc08d 100644 --- a/MainModule/Server/Dependencies/Assets/Fly.client.lua +++ b/MainModule/Server/Dependencies/Assets/Fly.client.lua @@ -238,7 +238,9 @@ function DPadifyInput(direction, isGame) if yDir == 0 then HandleInput("Forward", isGame, false); HandleInput("Backward", isGame, false) end end -listenConnection(part.DescendantRemoving, function(Inst) +task.spawn(function() + local Inst = part.DescendantRemoving:Wait() + if Inst == bPos or Inst == bGyro or Inst == speedVal or Inst == noclip then if conn then conn:Disconnect() @@ -247,7 +249,7 @@ listenConnection(part.DescendantRemoving, function(Inst) for _, Signal in pairs(RBXConnections) do Signal:Disconnect() end - + contextService:UnbindAction("Toggle Flight") Stop() diff --git a/MainModule/Server/Dependencies/Assets/Fly.meta.json b/MainModule/Server/Dependencies/Assets/Fly.meta.json index 5077db135e..6bf7085e31 100644 --- a/MainModule/Server/Dependencies/Assets/Fly.meta.json +++ b/MainModule/Server/Dependencies/Assets/Fly.meta.json @@ -1,5 +1,5 @@ { "properties": { - "Disabled": true + "Enabled": false } } diff --git a/MainModule/Server/Dependencies/Assets/FlyClipper.meta.json b/MainModule/Server/Dependencies/Assets/FlyClipper.meta.json index 5077db135e..6bf7085e31 100644 --- a/MainModule/Server/Dependencies/Assets/FlyClipper.meta.json +++ b/MainModule/Server/Dependencies/Assets/FlyClipper.meta.json @@ -1,5 +1,5 @@ { "properties": { - "Disabled": true + "Enabled": false } } diff --git a/MainModule/Server/Dependencies/Assets/HatPets.meta.json b/MainModule/Server/Dependencies/Assets/HatPets.meta.json index 5077db135e..6bf7085e31 100644 --- a/MainModule/Server/Dependencies/Assets/HatPets.meta.json +++ b/MainModule/Server/Dependencies/Assets/HatPets.meta.json @@ -1,5 +1,5 @@ { "properties": { - "Disabled": true + "Enabled": false } } diff --git a/MainModule/Server/Dependencies/Assets/Illegal.meta.json b/MainModule/Server/Dependencies/Assets/Illegal.meta.json index 5077db135e..6bf7085e31 100644 --- a/MainModule/Server/Dependencies/Assets/Illegal.meta.json +++ b/MainModule/Server/Dependencies/Assets/Illegal.meta.json @@ -1,5 +1,5 @@ { "properties": { - "Disabled": true + "Enabled": false } } diff --git a/MainModule/Server/Dependencies/Assets/Quacker.meta.json b/MainModule/Server/Dependencies/Assets/Quacker.meta.json index 51c45b040c..0181c8769c 100644 --- a/MainModule/Server/Dependencies/Assets/Quacker.meta.json +++ b/MainModule/Server/Dependencies/Assets/Quacker.meta.json @@ -1,6 +1,6 @@ { "properties": { - "Disabled": true, + "Enabled": false, "RunContext": "Client" } } diff --git a/MainModule/Server/Dependencies/Assets/Seize.meta.json b/MainModule/Server/Dependencies/Assets/Seize.meta.json index 5077db135e..6bf7085e31 100644 --- a/MainModule/Server/Dependencies/Assets/Seize.meta.json +++ b/MainModule/Server/Dependencies/Assets/Seize.meta.json @@ -1,5 +1,5 @@ { "properties": { - "Disabled": true + "Enabled": false } } diff --git a/MainModule/Server/Dependencies/Assets/Singer.meta.json b/MainModule/Server/Dependencies/Assets/Singer.meta.json index 326d50c99d..0181c8769c 100644 --- a/MainModule/Server/Dependencies/Assets/Singer.meta.json +++ b/MainModule/Server/Dependencies/Assets/Singer.meta.json @@ -1,5 +1,6 @@ { "properties": { + "Enabled": false, "RunContext": "Client" } } diff --git a/MainModule/Server/Dependencies/Assets/Slippery.meta.json b/MainModule/Server/Dependencies/Assets/Slippery.meta.json index 5077db135e..6bf7085e31 100644 --- a/MainModule/Server/Dependencies/Assets/Slippery.meta.json +++ b/MainModule/Server/Dependencies/Assets/Slippery.meta.json @@ -1,5 +1,5 @@ { "properties": { - "Disabled": true + "Enabled": false } } diff --git a/MainModule/Server/Dependencies/Assets/Spinner.meta.json b/MainModule/Server/Dependencies/Assets/Spinner.meta.json index 5077db135e..6bf7085e31 100644 --- a/MainModule/Server/Dependencies/Assets/Spinner.meta.json +++ b/MainModule/Server/Dependencies/Assets/Spinner.meta.json @@ -1,5 +1,5 @@ { "properties": { - "Disabled": true + "Enabled": false } } diff --git a/MainModule/Server/Dependencies/ClientLoader.meta.json b/MainModule/Server/Dependencies/ClientLoader.meta.json index 5077db135e..6bf7085e31 100644 --- a/MainModule/Server/Dependencies/ClientLoader.meta.json +++ b/MainModule/Server/Dependencies/ClientLoader.meta.json @@ -1,5 +1,5 @@ { "properties": { - "Disabled": true + "Enabled": false } } diff --git a/MainModule/Server/Dependencies/ClientMover.meta.json b/MainModule/Server/Dependencies/ClientMover.meta.json index 5077db135e..6bf7085e31 100644 --- a/MainModule/Server/Dependencies/ClientMover.meta.json +++ b/MainModule/Server/Dependencies/ClientMover.meta.json @@ -1,5 +1,5 @@ { "properties": { - "Disabled": true + "Enabled": false } } diff --git a/MainModule/Server/Dependencies/DefaultSettings.lua b/MainModule/Server/Dependencies/DefaultSettings.lua index 6294188174..1b24a09c4f 100644 --- a/MainModule/Server/Dependencies/DefaultSettings.lua +++ b/MainModule/Server/Dependencies/DefaultSettings.lua @@ -277,6 +277,7 @@ settings.CommandCooldowns = { settings.FunCommands = true -- Are fun commands enabled? settings.PlayerCommands = true -- Are player-level utility commands enabled? settings.AgeRestrictedCommands = true -- Are age-locked commands enabled? +settings.WarnDangerousCommand = false -- Do dangerous commands ask for confirmation? settings.CommandFeedback = false -- Should players be notified when commands with non-obvious effects are run on them? 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 @@ -284,21 +285,23 @@ settings.CreatorPowers = true -- Gives me creator-level admin; This is strictl settings.CodeExecution = true -- 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. +settings.ChatCreateRobloxCommands = true -- Whether "/" commands for Roblox should get created in new Chat settings.BanMessage = "Banned" -- Message shown to banned users upon kick settings.LockMessage = "Not Whitelisted" -- Message shown to people when they are kicked while the game is :slocked settings.SystemTitle = "System Message" -- Title to display in :sm and :bc -settings.MaxLogs = 5000 -- Maximum logs to save before deleting the oldest -settings.SaveCommandLogs = true -- If command logs are saved to the datastores -settings.Notification = true -- Whether or not to show the "You're an admin" and "Updated" notifications -settings.SongHint = true -- Display a hint with the current song name and ID when a song is played via :music -settings.TopBarShift = false -- By default hints and notifications will appear from the top edge of the window. Set this to true if you don't want hints/notifications to appear in that region. -settings.Messages = {} -- A list of notification messages to show HeadAdmins and above on join -settings.AutoClean = false -- Will auto clean workspace of things like hats and tools -settings.AutoCleanDelay = 60 -- Time between auto cleans -settings.AutoBackup = false -- Run :backupmap automatically when the server starts. To restore the map, run :restoremap -settings.ReJail = false -- If true then when a player rejoins they'll go back into jail. Or if the moderator leaves everybody gets unjailed +settings.MaxLogs = 5000 -- Maximum logs to save before deleting the oldest +settings.SaveCommandLogs = true -- If command logs are saved to the datastores +settings.Notification = true -- Whether or not to show the "You're an admin" and "Updated" notifications +settings.SongHint = true -- Display a hint with the current song name and ID when a song is played via :music +settings.TopBarShift = false -- By default hints and notifications will appear from the top edge of the window. Set this to true if you don't want hints/notifications to appear in that region. +settings.Messages = {} -- A list of notification messages to show HeadAdmins and above on join +settings.AutoClean = false -- Will auto clean workspace of things like hats and tools +settings.AutoCleanDelay = 60 -- Time between auto cleans +settings.AutoBackup = false -- Run :backupmap automatically when the server starts. To restore the map, run :restoremap +settings.ReJail = false -- If true then when a player rejoins they'll go back into jail. Or if the moderator leaves everybody gets unjailed +settings.DisableRejoinAtMaxPlayers = false -- If true, disables rejoin when max players is reached to avoid an exploit that allows more players than the max amount. settings.Console = true -- Whether the command console is enabled settings.Console_AdminsOnly = false -- If true, only admins will be able to access the console @@ -450,11 +453,13 @@ descs.Allowed_API_Calls = [[ Allowed calls ]] descs.FunCommands = [[ Are fun commands enabled? ]] descs.PlayerCommands = [[ Are players commands enabled? ]] descs.AgeRestrictedCommands = [[ Are age-restricted commands enabled? ]] +descs.WarnDangerousCommand = [[ Do dangerous commands ask for confirmation before executing?]] descs.CommandFeedback = [[ Should players be notified when commands with non-obvious effects are run on them? ]] descs.CrossServerCommands = [[ Are commands which affect more than one server enabled? ]] descs.ChatCommands = [[ 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 ]] descs.SilentCommandDenials = [[ 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 ]] descs.OverrideChatCallbacks = [[ If the TextChatService ShouldDeliverCallbacks of all channels are overridden by Adonis on load. Required for muting ]] +descs.ChatCreateRobloxCommands = [[ Whether "/" commands for Roblox should get created in new Chat ]] descs.BanMessage = [[ Message shown to banned users ]] @@ -469,6 +474,7 @@ descs.CodeExecution = [[ Enables the use of code execution in Adonis; Scripting descs.SongHint = [[ Display a hint with the current song name and ID when a song is played via :music ]] descs.TopBarShift = [[ By default hints and notifs will appear from the top edge of the window. Set this to true if you don't want hints/notifications to appear in that region. ]] descs.ReJail = [[ If true then when a player rejoins they'll go back into jail. Or if the moderator leaves everybody gets unjailed ]] +descs.DisableRejoinAtMaxPlayers = [[ If true, disables rejoin when max players is reached to avoid an exploit that allows more players than the max amount. ]] descs.Messages = [[ A list of notification messages to show HeadAdmins and above on join ]] @@ -592,6 +598,8 @@ order = { " "; "FunCommands"; "PlayerCommands"; + "AgeRestrictedCommands"; + "WarnDangerousCommand"; "CommandFeedback"; "CrossServerCommands"; "ChatCommands"; @@ -599,6 +607,7 @@ order = { ""; "SilentCommandDenials"; "OverrideChatCallbacks"; + "ChatCreateRobloxCommands"; " "; "BanMessage"; "LockMessage"; @@ -610,6 +619,7 @@ order = { "SongHint"; "TopBarShift"; "ReJail"; + "DisableRejoinAtMaxPlayers"; ""; "AutoClean"; "AutoCleanDelay"; diff --git a/MainModule/Server/Dependencies/LocalScriptBase.meta.json b/MainModule/Server/Dependencies/LocalScriptBase.meta.json index 5077db135e..6bf7085e31 100644 --- a/MainModule/Server/Dependencies/LocalScriptBase.meta.json +++ b/MainModule/Server/Dependencies/LocalScriptBase.meta.json @@ -1,5 +1,5 @@ { "properties": { - "Disabled": true + "Enabled": false } } diff --git a/MainModule/Server/Dependencies/ScriptBase.meta.json b/MainModule/Server/Dependencies/ScriptBase.meta.json index 5077db135e..6bf7085e31 100644 --- a/MainModule/Server/Dependencies/ScriptBase.meta.json +++ b/MainModule/Server/Dependencies/ScriptBase.meta.json @@ -1,5 +1,5 @@ { "properties": { - "Disabled": true + "Enabled": false } } diff --git a/MainModule/Server/Plugins/ServerNewDex.rbxmx b/MainModule/Server/Plugins/ServerNewDex.rbxmx index f8347a10fe..a0c25c1268 100644 --- a/MainModule/Server/Plugins/ServerNewDex.rbxmx +++ b/MainModule/Server/Plugins/ServerNewDex.rbxmx @@ -154,7 +154,7 @@ Commands.DexExplorerNew = { Prefix = Settings.Prefix; - Commands = {"dexNew";"dexNewExplorer";}; + Commands = {"dexnew";"dexnewexplorer";"newdex";}; Args = {}; Description = "Lets you explore the game using new Dex [Credits to LorekeeperZinnia]"; AdminLevel = 300; diff --git a/MainModule/Server/Shared/Changelog.lua b/MainModule/Server/Shared/Changelog.lua index e021d39ba5..99bf9ee5ec 100644 --- a/MainModule/Server/Shared/Changelog.lua +++ b/MainModule/Server/Shared/Changelog.lua @@ -1,12 +1,40 @@ return { - "Version: 251"; + "Version: 252"; "*Drag edges to expand*"; "*Report bugs/issues on our GitHub repository*"; ""; + "[v252 2024-03-11 18:00 UTC] @Dimenpsyonal"; + "Ping readout now shows in Milliseconds"; + ":sword is now a fun command"; + "Output GUI changes for all themes"; + "> default and rounded now use a new font"; + "> are now correctly customised with title and colour"; + "New setting: DisableRejoinAtMaxPlayers"; + "- Can be used to stop players bypassing max server limits"; + "New setting: ChatCreateRobloxCommands"; + "> Toggles whether Adonis will make TextChat commands"; + "> Setting is enabled by default"; + "New setting: WarnDangerousCommand"; + "> Warns when a potentially dangerous action is about to be undertaken"; + "> Setting is disabled by default"; + "Added lazy load for userpanel - makes userpanel load faster"; + "> You can disable this in client settings"; + "Added :newdex as a command for new dex explorer"; + "Fixed error with oldlogs"; + "Fixed issue with keybind waiting for key to be selected"; + "Updated rojo meta.json files"; + "Updated description of :nil to reflect Roblox changes"; + "Fixed :unfly with SignalBehaviour set to deferred"; + "Fixed :untrack and process"; + "Now use ms for network ping"; + "Contributors: Git/DrewBokman, Git/RadiantUwU, Git/ccuser44, Git/fxeP1"; + "Git/karl-police, Git/kaiserandaxl and Git/YetAnotherClown"; + ""; "[v251 2024-02-29 13:15 UTC] @Dimenpsyonal"; "Happy leap day!"; "Performance stats window can now be resized"; "Bans list now has a search bar"; + "Contributors: Git/DrewBokman and Git/fxeP1"; ""; "[v250 2024-02-23 12:10 UTC] @Dimenpsyonal"; ":oldlogs now works correctly with LinkedLists";