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";