From f1cd1512436be1b689cf1c1b73707d5f056838ba Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Thu, 11 Jun 2026 23:57:35 +0300 Subject: [PATCH 01/27] Optimize event handling --- MainModule/Server/Commands/Moderators.luau | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/MainModule/Server/Commands/Moderators.luau b/MainModule/Server/Commands/Moderators.luau index 7a2c347e3a..17c77357f7 100644 --- a/MainModule/Server/Commands/Moderators.luau +++ b/MainModule/Server/Commands/Moderators.luau @@ -727,8 +727,7 @@ return function(Vargs, env) local torso = v.Character.HumanoidRootPart local pos = torso.CFrame local running=true - local event - event = v.Character.Humanoid.Jumping:Connect(function() + v.Character.Humanoid.Jumping:Once(function() running = false ff:Destroy() hum.Health = orig @@ -737,7 +736,6 @@ return function(Vargs, env) t.Parent = v.Backpack end Admin.RunCommand(`{Functions.GetMainPrefix()}unname`, v.Name) - event:Disconnect() end) repeat torso.CFrame = pos wait() until not v or not v.Character or not torso or not running or not torso.Parent end) From 94978bf1cfae22eb0861f6dc96a8b088cd1de386 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Fri, 12 Jun 2026 21:48:27 +0300 Subject: [PATCH 02/27] Update rank APIs from deprecated versions --- MainModule/Client/UI/Default/Profile.luau | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MainModule/Client/UI/Default/Profile.luau b/MainModule/Client/UI/Default/Profile.luau index 98c495acdb..e9da37e229 100644 --- a/MainModule/Client/UI/Default/Profile.luau +++ b/MainModule/Client/UI/Default/Profile.luau @@ -135,8 +135,8 @@ return function(data, env) for _, v in ipairs({ {data.IsServerOwner, "Private Server Owner", client.MatIcons.Grade, "User owns the current private server"}, {data.IsDonor, "Adonis Donor", "rbxassetid://6877822142", "User has purchased the Adonis donation pass/shirt"}, - {player:GetRankInGroup(886423) == 10, "Adonis Open-Source Contributor", "rbxassetid://6878433601", "User has contributed to the Adonis admin system (see credit list)"}, - {player:GetRankInGroup(886423) >= 12, "Adonis Developer", "rbxassetid://6878433601", "User is an official developer of the Adonis admin system (see credit list)"}, + {player:GetRankInGroupAsync(886423) == 10, "Adonis Open-Source Contributor", "rbxassetid://6878433601", "User has contributed to the Adonis admin system (see credit list)"}, + {player:GetRankInGroupAsync(886423) >= 12, "Adonis Developer", "rbxassetid://6878433601", "User is an official developer of the Adonis admin system (see credit list)"}, {player.UserId == 1237666 or player.UserId == 698712377, "Adonis Creator [Sceleratis/Davey_Bones]", "rbxassetid://6878433601", "You're looking at the creator of the Adonis admin system!"}, {player:IsInGroup(1200769) or player:IsInGroup(2868472), "Roblox Staff", "rbxassetid://6811962259", "User is an official Roblox employee (!)"}, {player:IsInGroup(3514227), "DevForum Member", "rbxassetid://6383940476", "User is a member of the Roblox Developer Forum"}, From 1f5b89510004daa60287e04b62a73c304e591dc9 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:11:57 +0300 Subject: [PATCH 03/27] Add missing properties from fake player --- MainModule/Server/Core/Functions.luau | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/MainModule/Server/Core/Functions.luau b/MainModule/Server/Core/Functions.luau index db5bbc418a..16f0881ca6 100644 --- a/MainModule/Server/Core/Functions.luau +++ b/MainModule/Server/Core/Functions.luau @@ -402,19 +402,24 @@ return function(Vargs, GetEnv) AccountAge = 0; MembershipType = Enum.MembershipType.None; CharacterAppearanceId = options.UserId or 0; + CanLoadCharacterAppearence = service.StarterPlayer.LoadPlayerAppearance; FollowUserId = 0; - GameplayPaused = false; + ReplicationFocus = nil; + Team = nil; + TeamColor = nil; + RespawnLocation = nil; Parent = service.Players; - Character = service.New("Model", {Name = options.Name or "Fake_Player"}); - Backpack = service.New("Backpack", {Name = "FakeBackpack"}); - PlayerGui = service.New("Folder", {Name = "FakePlayerGui"}); - PlayerScripts = service.New("Folder", {Name = "FakePlayerScripts"}); + Character = service.New("Model", {Name = options.Name or "Fake_Player"; Parent = fakePlayer}); + Backpack = service.New("Backpack", {Name = "FakeBackpack"; Parent = fakePlayer}); + PlayerGui = service.New("Folder", {Name = "FakePlayerGui"; Parent = fakePlayer}); + PlayerScripts = service.New("Folder", {Name = "FakePlayerScripts"; Parent = fakePlayer}); GetJoinData = function() return {} end; GetFriendsOnline = function() return {} end; - GetRankInGroup = function() return 0 end; - GetRoleInGroup = function() return "Guest" end; - IsFriendsWith = function() return false end; - Kick = function() fakePlayer:SetSpecial("Parent", nil) fakePlayer:Destroy() end; + GetRankInGroupAsync = function() return 0 end; GetRankInGroup = function() return 0 end; + GetRoleInGroupAsync = function() return "Guest" end; GetRoleInGroup = function() return "Guest" end; + IsInGroupAsync = function() return false end; + IsFriendsWithAsync = function() return false end; IsFriendsWith = function() return false end; + Kick = function() end fakePlayer:SetSpecial("Parent", nil) fakePlayer:Destroy() end; IsA = function(_, className) return className == "Player" or className == "Instance" end; } @@ -1705,4 +1710,4 @@ return function(Vargs, GetEnv) return itemNames end } -end \ No newline at end of file +end From fbb6864ffa0ab14e0126482f4d17c07f5e01a1e0 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:14:26 +0300 Subject: [PATCH 04/27] Fix task manager not working --- MainModule/Client/UI/Default/TaskManager.rbxmx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MainModule/Client/UI/Default/TaskManager.rbxmx b/MainModule/Client/UI/Default/TaskManager.rbxmx index 1387b860ad..d8a8b32278 100644 --- a/MainModule/Client/UI/Default/TaskManager.rbxmx +++ b/MainModule/Client/UI/Default/TaskManager.rbxmx @@ -2676,7 +2676,7 @@ return function(data, env) for index,task in pairs(clientTasks) do local new = Entry:Clone() local frame = new.Frame - local status = task:Status() + local status = task.R_Status or task.Status new.Parent = cFrame new.Visible = true new.Desc.Value = task.Name From 74b1fe36d48b5f1df5cc77f3e563e9b486b2c395 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:20:31 +0300 Subject: [PATCH 05/27] Add new GUI properties and improve class check performance --- MainModule/Client/Core/Functions.luau | 169 ++------------------------ 1 file changed, 8 insertions(+), 161 deletions(-) diff --git a/MainModule/Client/Core/Functions.luau b/MainModule/Client/Core/Functions.luau index 985dfdfd4e..e2e9304cf7 100644 --- a/MainModule/Client/Core/Functions.luau +++ b/MainModule/Client/Core/Functions.luau @@ -401,161 +401,6 @@ return function(Vargs, GetEnv) end; GetGuiData = function(args) - local props = { - "AbsolutePosition"; - "AutomaticCanvasSize"; - "BottomImage"; - "AbsoluteSize"; - "AnchorPoint"; - "CornerRadius"; - "CanvasSize"; - "CanvasPosition"; - "ClassName"; - "ElasticBehavior"; - "Name"; - "Parent"; - "Archivable"; - "DisplayOrder"; - "SelectionImageObject"; - "Active"; - "BackgroundColor3"; - "BackgroundTransparency"; - "BorderColor3"; - "BorderSizePixel"; - "Position"; - "Rotation"; - "RichText"; - "Selectable"; - "HorizontalScrollBarPosition"; - "Size"; - "Enabled"; - "Active"; - "SizeConstraint"; - "Style"; - "ScrollBarThickness"; - "ScrollBarImageTransparency"; - "ScrollingEnabled"; - "ScrollingDirection"; - "ScrollBarImageColor"; - "Visible"; - "ZIndex"; - "ClipsDescendants"; - "Draggable"; - "NextSelectionDown"; - "NextSelectionLeft"; - "NextSelectionRight"; - "NextSelectionUp"; - "PlaceholderColor3"; - "PlaceholderText"; - "AutoButtonColor"; - "Modal"; - "MidImage"; - "Image"; - "ImageColor3"; - "ImageRectOffset"; - "ImageRectSize"; - "ImageTransparency"; - "ScaleType"; - "SliceCenter"; - "Text"; - "TopImage"; - "TextColor3"; - "TextDirection"; - "Font"; - "TextScaled"; - "TextSize"; - "TextStrokeColor3"; - "TextStrokeTransparency"; - "TextTransparency"; - "TextTuncate"; - "TextWrapped"; - "TextXAlignment"; - "TextYAlignment"; - "VerticalScrollBarInset"; - "VerticalScrollBarPosition"; - "AspectRatio"; - "AspectType"; - "DominantAxis"; - "Offset"; - "Transparency"; - "CellPadding"; - "CellSize"; - "Padding"; - "PaddingBottom"; - "PaddingLeft"; - "PaddingRight"; - "PaddingTop"; - "Animated"; - "Circular"; - "EasingDirection"; - "EasingStyle"; - "TweenTime"; - "FillDirection"; - "SortOrder"; - "VerticalAlignment"; - "GamepadInputEnabled"; - "ScrollWheelInputEnabled"; - "TouchInputEnabled"; - "Scale"; - "MaxSize"; - "MinSize"; - "ApplyStrokeMode"; - "Color"; - "LineJoinMode"; - "Thickness"; - "FillEmptySpaceColumns"; - "FillEmptySpaceRow"; - "MajorAxis"; - "HorizontalAlignment"; - "MaxTextSize"; - "MinTextSize"; - "GroupColor3"; - "GroupTransparency"; - "SelectionImageObject"; - "Looped"; - "Playing"; - "TimePosition"; - "Video"; - "Volume"; - "LayoutOrder"; - "Ambient"; - "LightColor"; - "LightDirection"; - "CurrentCamera"; - "AutomaticSize"; - "AutoLocalize"; - "RootLocalizationTable"; - }; - - local classes = { - "ScreenGui"; - "GuiMain"; - "Frame"; - "CanvasGroup"; - "TextButton"; - "TextLabel"; - "ImageButton"; - "ImageLabel"; - "ScrollingFrame"; - "TextBox"; - "BillboardGui"; - "SurfaceGui"; - "UICorner"; - "UIAspectRatioConstraint"; - "UIGradient"; - "UIGridLayout"; - "UIListLayout"; - "UIPadding"; - "UIPageLayout"; - "UIScale"; - "UISizeConstraint"; - "UIStroke"; - "UITableLayout"; - "UITextSizeConstraint"; - "VideoFrame"; - "ViewportFrame" - } - local guis = { Properties = { Name = "ViewGuis"; @@ -564,12 +409,14 @@ return function(Vargs, GetEnv) Children = {}; } - local add; add = function(tab,child) - local good = false + local add; add = function(tab, child) + local good = Variables.GuiClasses.Cache[child.ClassName] - for _, v in classes do - if child:IsA(v) then - good = true + if not good then + for _, v in Variables.GuiClasses do + if child:IsA(v) then + good = true + end end end @@ -579,7 +426,7 @@ return function(Vargs, GetEnv) Children = {}; } - for _, v in props do + for _, v in variables.GuiProperties do pcall(function() new.Properties[v] = child[v] end) From c1ca9d4f514e43e9ecc17d9244b0265a3975fcfc Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:36:53 +0300 Subject: [PATCH 06/27] Add missing GUI classes and properties to Variables --- MainModule/Client/Core/Variables.luau | 54 ++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/MainModule/Client/Core/Variables.luau b/MainModule/Client/Core/Variables.luau index 9fe7edec1c..6d2bd3f8f8 100644 --- a/MainModule/Client/Core/Variables.luau +++ b/MainModule/Client/Core/Variables.luau @@ -45,6 +45,7 @@ return function(Vargs, GetEnv) Functions = client.Functions; Process = client.Process; Remote = client.Remote; + Variables.GuiClasses.Cache = service.Lookupify(Variables.GuiClasses) Variables.Init = nil; end @@ -55,7 +56,7 @@ return function(Vargs, GetEnv) end local function RunLast() - Variables.RunLast = nil; + Variables.RunLast = nil; end getfenv().client = nil @@ -113,5 +114,56 @@ return function(Vargs, GetEnv) }; KeycodeNames = require(client.Shared.KeycodeNames); HelpButtonAction = "Info", + GuiClasses = { + "AdGui", "BillboardGui", "CanvasGroup", + "DockWidgetPluginGui", "Frame", "GuiBase", + "GuiBase2d", "GuiButton", "GuiLabel", + "GuiMain", "GuiObject", "ImageButton", + "ImageLabel", "LayerCollector", "PluginGui", + "QWidgetPluginGui", "RelativeGui", "ScreenGui", + "ScrollingFrame", "SurfaceGui", "SurfaceGuiBase", + "TextBox", "TextButton", "TextLabel", + "UIAspectRatioConstraint", "UIBase", "UIComponent", + "UIConstraint", "UICorner", "UIDragDetector", + "UIFlexItem", "UIGradient", "UIGridLayout", + "UIGridStyleLayout", "UILayout", "UIListLayout", + "UIPadding", "UIPageLayout", "UIScale", + "UIShadow", "UISizeConstraint", "UIStroke", + "UITableLayout", "UITextSizeConstraint", "VideoDisplay", + "VideoFrame", "ViewportFrame" + }; + GuiProperties = { + "ActivatedCursorIcon", "ActivatedCursorIconContent", "Adornee", + "AdShape", "AlwaysOnTop", "BackgroundColor", "BlurRadius", + "BorderColor", "BorderMode", "BorderOffset", "BorderStrokePosition", + "BottomImageContent", "BottomLeftRadius", "BottomRightRadius", "BoundingBehavior", + "BoundingUI", "Brightness", "ClearTextOnFocus", "ClipToDeviceSafeArea", + "CursorIcon", "CursorIconContent", "CursorPosition", "DistanceLowerLimit", + "DistanceStep", "DistanceUpperLimit", "DragAxis", "DragRelativity", + "DragRotation", "DragSpace", "DragStyle", "DragUDim2", + "EnableVideoAds", "ExtentsOffset", "ExtentsOffsetWorldSpace", "Face", + "FallbackImage", "FallbackImageContent", "FillDirectionMaxCells", "FillEmptySpaceRows", + "FlexMode", "FontFace", "FontSize", "GrowRatio", + "HorizontalFlex", "HorizontalScrollBarInset", "HoverHapticEffect", "HoverImage", + "HoverImageContent", "IgnoreGuiInset", "ImageContent", "InputSink", + "Interactable", "InternalVideoUsage", "ItemLineAlignment", "LightInfluence", + "LineHeight", "Localize", "MaxDistance", "MaxDragAngle", + "MaxDragTranslation", "MaximumResolution", "MaxVisibleGraphemes", "MidImageContent", + "MinDragAngle", "MinDragTranslation", "MultiLine", "OpenTypeFeatures", + "PixelsPerStud", "PlayerToHideFrom", "PressedImage", "PressedImageContent", + "PressHapticEffect", "ReferenceUIInstance", "ResampleMode", "ResetOnSpawn", + "ResponseStyle", "RollOffMaxDistance", "RollOffMinDistance", "RollOffMode", + "SafeAreaCompatibility", "ScreenInsets", "ScrollBarImageColor3", "Selected", + "SelectionBehaviorDown", "SelectionBehaviorLeft", "SelectionBehaviorRight", "SelectionBehaviorUp", + "SelectionGroup", "SelectionModeDragSpeed", "SelectionModeRotateSpeed", "SelectionOrder", + "SelectionStart", "ShowNativeInput", "ShrinkRatio", "SizeOffset", + "SizingMode", "SliceScale", "Spread", "StartCorner", + "StrokeSizingMode", "StudsOffset", "StudsOffsetWorldSpace", "TextColor", + "TextEditable", "TextTruncate", "TextWrap", "TileSize", + "Title", "ToolPunchThroughDistance", "TopImageContent", "TopLeftRadius", + "TopRightRadius", "UIDragSpeedAxisMapping", "VerticalFlex", "VideoColor3", + "VideoContent", "VideoRectOffset", "VideoRectSize", "VideoTransparency", + "Wraps", "ZIndexBehavior", "ZOffset", + }; }; end From ccff84384a2ec880b77ecd3733fc83762ef1264b Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:38:37 +0300 Subject: [PATCH 07/27] Add Lookupify function to Service.luau --- MainModule/Shared/Service.luau | 1 + 1 file changed, 1 insertion(+) diff --git a/MainModule/Shared/Service.luau b/MainModule/Shared/Service.luau index 2c7837a31d..5316c17cef 100644 --- a/MainModule/Shared/Service.luau +++ b/MainModule/Shared/Service.luau @@ -1462,6 +1462,7 @@ return function(errorHandler, eventChecker, fenceSpecific, env) Localize = function(obj, readOnly) local Localize = service.Localize local ReadOnly = service.ReadOnly if type(obj) == "table" then local newTab = {} for i in obj do newTab[i] = Localize(obj[i], readOnly) end return (readOnly and ReadOnly(newTab)) or newTab else return obj end end; RawEqual = function(obj1, obj2) return service.UnWrap(obj1) == service.UnWrap(obj2) end; CheckProperty = function(obj, prop) return pcall(function() return obj[prop] end) end; + Lookupify = function(t, dest) local t2 = dest or {} for i = 1, #tbl do t2[t[i]] = true end return t2 end; NewWaiter = function() local event = service.New("BindableEvent") return {Wait = event.wait; Finish = event.Fire} end; -- TODO: Remove and replace with goodsignal }, { __index = function(tab, index) From 6bc6f701b532cda8f1b99d86f54295501533de0c Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:40:44 +0300 Subject: [PATCH 08/27] Misc cleanup --- MainModule/Client/Core/Variables.luau | 28 ++++++++++++--------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/MainModule/Client/Core/Variables.luau b/MainModule/Client/Core/Variables.luau index 6d2bd3f8f8..3de2fa1297 100644 --- a/MainModule/Client/Core/Variables.luau +++ b/MainModule/Client/Core/Variables.luau @@ -116,21 +116,17 @@ return function(Vargs, GetEnv) HelpButtonAction = "Info", GuiClasses = { "AdGui", "BillboardGui", "CanvasGroup", - "DockWidgetPluginGui", "Frame", "GuiBase", - "GuiBase2d", "GuiButton", "GuiLabel", - "GuiMain", "GuiObject", "ImageButton", - "ImageLabel", "LayerCollector", "PluginGui", - "QWidgetPluginGui", "RelativeGui", "ScreenGui", - "ScrollingFrame", "SurfaceGui", "SurfaceGuiBase", - "TextBox", "TextButton", "TextLabel", - "UIAspectRatioConstraint", "UIBase", "UIComponent", - "UIConstraint", "UICorner", "UIDragDetector", - "UIFlexItem", "UIGradient", "UIGridLayout", - "UIGridStyleLayout", "UILayout", "UIListLayout", - "UIPadding", "UIPageLayout", "UIScale", - "UIShadow", "UISizeConstraint", "UIStroke", - "UITableLayout", "UITextSizeConstraint", "VideoDisplay", - "VideoFrame", "ViewportFrame" + "DockWidgetPluginGui", "Frame", "GuiBase", "GuiBase2d", + "GuiButton", "GuiLabel", "GuiMain", "GuiObject", + "ImageButton", "ImageLabel", "LayerCollector", "PluginGui", + "QWidgetPluginGui", "RelativeGui", "ScreenGui", "ScrollingFrame", + "SurfaceGui", "SurfaceGuiBase", "TextBox", "TextButton", + "TextLabel", "UIAspectRatioConstraint", "UIBase", "UIComponent", + "UIConstraint", "UICorner", "UIDragDetector", "UIFlexItem", + "UIGradient", "UIGridLayout", "UIGridStyleLayout", "UILayout", + "UIListLayout", "UIPadding", "UIPageLayout", "UIScale", + "UIShadow", "UISizeConstraint", "UIStroke", "UITableLayout", + "UITextSizeConstraint", "VideoDisplay", "VideoFrame", "ViewportFrame" }; GuiProperties = { "ActivatedCursorIcon", "ActivatedCursorIconContent", "Adornee", @@ -163,7 +159,7 @@ return function(Vargs, GetEnv) "Title", "ToolPunchThroughDistance", "TopImageContent", "TopLeftRadius", "TopRightRadius", "UIDragSpeedAxisMapping", "VerticalFlex", "VideoColor3", "VideoContent", "VideoRectOffset", "VideoRectSize", "VideoTransparency", - "Wraps", "ZIndexBehavior", "ZOffset", + "Wraps", "ZIndexBehavior", "ZOffset" }; }; end From ff7ceb7d7085d80b4b38ea67c8f3563f19d24b7f Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:45:10 +0300 Subject: [PATCH 09/27] Update luaZ:make_getF to handle filename type --- MainModule/Server/Dependencies/Loadstring/LuaZ.luau | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MainModule/Server/Dependencies/Loadstring/LuaZ.luau b/MainModule/Server/Dependencies/Loadstring/LuaZ.luau index 41e044fa50..2421b5ca64 100644 --- a/MainModule/Server/Dependencies/Loadstring/LuaZ.luau +++ b/MainModule/Server/Dependencies/Loadstring/LuaZ.luau @@ -72,10 +72,10 @@ end ------------------------------------------------------------------------ -- create a chunk reader from a source file ------------------------------------------------------------------------ ---[[ + function luaZ:make_getF(filename) local LUAL_BUFFERSIZE = 512 - local h = io.open(filename, "r") + local h = type(filename) == "string" and io.open(filename, "r") or filename if not h then return nil end return function() -- chunk reader anonymous function here if not h or io.type(h) == "closed file" then return nil end @@ -84,7 +84,7 @@ function luaZ:make_getF(filename) return buff end end ---]] + ------------------------------------------------------------------------ -- creates a zio input stream -- returns the ZIO structure, z From e0b0e25afd998b10bf3ecc48f38f1c5a8cd39281 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:47:48 +0300 Subject: [PATCH 10/27] Support alternate Luau require semantics --- MainModule/Server/Dependencies/Loadstring/LuaY.luau | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MainModule/Server/Dependencies/Loadstring/LuaY.luau b/MainModule/Server/Dependencies/Loadstring/LuaY.luau index 75695ebbec..80f08919e5 100644 --- a/MainModule/Server/Dependencies/Loadstring/LuaY.luau +++ b/MainModule/Server/Dependencies/Loadstring/LuaY.luau @@ -72,9 +72,9 @@ --requires luaP, luaX, luaK local luaY = {} -local luaX = require(script.Parent.LuaX) -local luaK = require(script.Parent.LuaK)(luaY) -local luaP = require(script.Parent.LuaP) +local luaX = require(script and script.Parent.LuaX or "LuaX") +local luaK = require(script and script.Parent.LuaK or "LuaK")(luaY) +local luaP = require(script and script.Parent.LuaP or "LuaP") --[[-------------------------------------------------------------------- -- Expression descriptor From d082ea21eedfdde1644bffeaa854ea50ed83888a Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:48:23 +0300 Subject: [PATCH 11/27] Update LuaZ require statement for compatibility --- MainModule/Server/Dependencies/Loadstring/LuaX.luau | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MainModule/Server/Dependencies/Loadstring/LuaX.luau b/MainModule/Server/Dependencies/Loadstring/LuaX.luau index c3aecf1def..17d4ea0111 100644 --- a/MainModule/Server/Dependencies/Loadstring/LuaX.luau +++ b/MainModule/Server/Dependencies/Loadstring/LuaX.luau @@ -76,7 +76,7 @@ -- --------------------------------------------------------------------]] -local luaZ = require(script.Parent.LuaZ) +local luaZ = require(script and script.Parent.LuaZ or "LuaZ") local luaX = {} From 765578374a749a340c83088b8fe71f1b5c9d5450 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:49:11 +0300 Subject: [PATCH 12/27] Support alternate Luau require semantics --- MainModule/Server/Dependencies/Loadstring/LuaU.luau | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/MainModule/Server/Dependencies/Loadstring/LuaU.luau b/MainModule/Server/Dependencies/Loadstring/LuaU.luau index 88b19fb8ff..e47dead10f 100644 --- a/MainModule/Server/Dependencies/Loadstring/LuaU.luau +++ b/MainModule/Server/Dependencies/Loadstring/LuaU.luau @@ -59,7 +59,7 @@ --requires luaP local luaU = {} -local luaP = require(script.Parent.LuaP) +local luaP = require(script and script.Parent.LuaP or "LuaP") -- mark for precompiled code ('Lua') (from lua.h) luaU.LUA_SIGNATURE = "\27Lua" @@ -104,10 +104,9 @@ end -- * if a nil is passed, then writer should close the open file ------------------------------------------------------------------------ ---[[ function luaU:make_setF(filename) local buff = {} - buff.h = io.open(filename, "wb") + buff.h = type(filename) == "string" and io.open(filename, "wb") or filename if not buff.h then return nil end local writer = function(s, buff) -- chunk writer @@ -120,7 +119,7 @@ function luaU:make_setF(filename) return 1 end return writer, buff -end--]] +end ------------------------------------------------------------------------ -- works like the lobject.h version except that TObject used in these From 8b9d5e6f007c6deb5d3ea75adeeac109a2ddf061 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:50:35 +0300 Subject: [PATCH 13/27] Support alternate Luau require semantics --- .../Server/Dependencies/Loadstring/init.luau | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/MainModule/Server/Dependencies/Loadstring/init.luau b/MainModule/Server/Dependencies/Loadstring/init.luau index d1ce8bd360..acabddcfdc 100644 --- a/MainModule/Server/Dependencies/Loadstring/init.luau +++ b/MainModule/Server/Dependencies/Loadstring/init.luau @@ -23,16 +23,18 @@ local DEPENDENCIES = { "VirtualEnv"; } -for _, v in ipairs(DEPENDENCIES) do - script:WaitForChild(v) +if script then + for _, v in ipairs(DEPENDENCIES) do + script:WaitForChild(v) + end end -local luaX = require(script.LuaX) -local luaY = require(script.LuaY) -local luaZ = require(script.LuaZ) -local luaU = require(script.LuaU) -local fiOne = require(script.FiOne) -local getvenv = require(script.VirtualEnv) +local luaX = require(script and script.LuaX or "LuaX") +local luaY = require(script and script.LuaY or "LuaY") +local luaZ = require(script and script.LuaZ or "LuaZ") +local luaU = require(script and script.LuaU or "LuaU") +local fiOne = require(script and script.FiOne or "FiOne") +local getvenv = require(script and script.VirtualEnv or "VirtualEnv") local function to1BasedIndex(tbl) local tbl = table.move(tbl, 0, #tbl + (tbl[0] and 1 or 0), 1) From ea924b0b92e4e6e171c86e33dde9be04ae5fac3a Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sat, 13 Jun 2026 10:44:16 +0300 Subject: [PATCH 14/27] Fix specialkey logic and use animations for bot --- MainModule/Server/Core/Functions.luau | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/MainModule/Server/Core/Functions.luau b/MainModule/Server/Core/Functions.luau index 16f0881ca6..3c15bb8815 100644 --- a/MainModule/Server/Core/Functions.luau +++ b/MainModule/Server/Core/Functions.luau @@ -1191,6 +1191,7 @@ return function(Vargs, GetEnv) makeRobot = function(player, num, health, speed, damage, walk, attack, friendly) local Deps = server.Deps + local key = friendly and (Variables.BotKeys[player.Team or player]) or service.HttpService:GenerateGUID(false) local char = player.Character local torso = char:FindFirstChild("HumanoidRootPart") or char.PrimaryPart @@ -1221,6 +1222,10 @@ return function(Vargs, GetEnv) hum.Health = health if oldAnim then + anim:ClearAllChildren() + for _, v in oldAnim:GetChildren() do + v.Parent = anim + end oldAnim:Destroy() end @@ -1245,12 +1250,10 @@ return function(Vargs, GetEnv) Damage = damage; Health = health; WalkSpeed = speed; - SpecialKey = service.HttpService:GenerateGUID(false); + SpecialKey = key; + AttackBots = not player.TeamColor and not friendly; }) - - if walk then - task.defer(task.defer, event.Fire, event, "Init") - end + task.defer(task.defer, event.Fire, event, "Init") table.insert(Variables.Objects, new) end From ec20d17873add9a62fa77532781430b576c01b33 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sat, 13 Jun 2026 10:45:36 +0300 Subject: [PATCH 15/27] Add BotKeys variable to Variables.luau --- MainModule/Server/Core/Variables.luau | 1 + 1 file changed, 1 insertion(+) diff --git a/MainModule/Server/Core/Variables.luau b/MainModule/Server/Core/Variables.luau index b525302f79..f12c6bd7d4 100644 --- a/MainModule/Server/Core/Variables.luau +++ b/MainModule/Server/Core/Variables.luau @@ -78,6 +78,7 @@ return function(Vargs, GetEnv) CachedDonors = {}, Aliases = {}, ReturnPoints = {}, + BotKeys = {}, BanMessage = "Banned", PlayerJoinFilters = {}; LockMessage = "Not Whitelisted", From 4e931d54c26987a0cadd20b683d23a3785d6ef3c Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sat, 13 Jun 2026 10:48:31 +0300 Subject: [PATCH 16/27] Simplify event handling Refactored connection handling for humanoid.Died event. --- MainModule/Server/Plugins/Anti_Cheat.luau | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/MainModule/Server/Plugins/Anti_Cheat.luau b/MainModule/Server/Plugins/Anti_Cheat.luau index fe74aedf5c..b276b008b9 100644 --- a/MainModule/Server/Plugins/Anti_Cheat.luau +++ b/MainModule/Server/Plugins/Anti_Cheat.luau @@ -122,15 +122,7 @@ return function(Vargs, GetEnv) end) if service.Players.CharacterAutoLoads and Settings.AntiGod == true then - local connection - - connection = humanoid.Died:Connect(function() - if not connection.Connected then - return - end - - connection:Disconnect() - + humanoid.Died:Once(function() if service.Players.RespawnTime == math.huge then return end task.wait(service.Players.RespawnTime + 1.5) From 79ad7172d304b8fc7a362a70f9bbe7d5a1a6fa83 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sat, 13 Jun 2026 11:31:43 +0300 Subject: [PATCH 17/27] Forcefully convert key to string --- MainModule/Server/Core/Functions.luau | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MainModule/Server/Core/Functions.luau b/MainModule/Server/Core/Functions.luau index 3c15bb8815..b6fa272e09 100644 --- a/MainModule/Server/Core/Functions.luau +++ b/MainModule/Server/Core/Functions.luau @@ -1250,7 +1250,7 @@ return function(Vargs, GetEnv) Damage = damage; Health = health; WalkSpeed = speed; - SpecialKey = key; + SpecialKey = tostring(key); AttackBots = not player.TeamColor and not friendly; }) task.defer(task.defer, event.Fire, event, "Init") From 1f349840fc1bc7aba17633672a29c86d1d8f721c Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sat, 13 Jun 2026 21:22:41 +0300 Subject: [PATCH 18/27] Improve botbrain performance and pathfinding Refactor bot behavior and pathfinding logic, enhance target acquisition, and improve damage handling. --- .../Assets/BotBrain/init.server.lua | 362 ++++++++++++++---- 1 file changed, 291 insertions(+), 71 deletions(-) diff --git a/MainModule/Server/Dependencies/Assets/BotBrain/init.server.lua b/MainModule/Server/Dependencies/Assets/BotBrain/init.server.lua index d3c01e971c..b37057aace 100644 --- a/MainModule/Server/Dependencies/Assets/BotBrain/init.server.lua +++ b/MainModule/Server/Dependencies/Assets/BotBrain/init.server.lua @@ -13,17 +13,48 @@ local rarm = char:FindFirstChild("Right Arm") or char:FindFirstChild("RightLower local lleg = char:FindFirstChild("Left Leg") or char:FindFirstChild("LeftLowerLeg") local rleg = char:FindFirstChild("Right Leg") or char:FindFirstChild("RightLowerLeg") +local clone local getPath, validTarget -local path = {} +local path, blockedPath = {}, {} local current local currentInd = 0 - +local lastHealth = hum.Health +local hipHeight = hum.hipHeight - (hum.RigType == Enum.HumanoidRigType.R6 and 2 or 0) +local _, pathf = pcall(function() + return PathfindingService:CreatePath({ + AgentRadius = torso and math.max(math.max(torso.Size.X, torso.Size.Z) * 0.75, math.min(torso.Size.X, torso.Size.Z)) or 1; + AgentHeight = hum and torso and (hipHeight + torso.Size.Y / 2) * 0.85 or 2; + AgentCanJump = true; + AgentCanClimb = true; + Costs = { + CrackedLaval = 5000; + Water = 500; + ForceField = 10; + Glass = 10; + Foil = 1.7; + Climb = 1.5; + Jump = 1.1; + CorrodedMetal = 0.75; + Sandstone = 0.6; + CobbleStone = 0.3; + Slate = 0.1; + }; + }) +end) local props = { Target = nil; + MainTarget = nil; + AngerTarget = nil; + CacheTarget = nil; AutoTarget = true; + Walk = true; Swarm = false; + Anger = 0; Damage = 5; - Distance = 50; + Distance = 512; + LastSearch = 0; + TargetReset = 7; + ScanInterval = 4; PatrolDist = 50; PatrolZone = torso.Position; Attack = false; @@ -31,10 +62,11 @@ local props = { CanGiveUp = true; SpawnPoint = torso.CFrame; CanRespawn = false; - SpecialKey = "null"; + SpecialKey = "nil"; AttackBots = false; isDead = false; - LastCompute = os.clock(); + LastCompute = 0; + ComputeReset = 20; } local function tagHumanoid(humanoid, attacker) @@ -60,6 +92,13 @@ local function getCFrame() end end +local function checkHeightNormalized(cf, dest, rad) + local point = cf:PointToObjectSpace(dest) + local plane, hipVector = Vector3.new(1, 0, 1), Vector3.new(1, hum.HipHeight * 1.25, 1) + + return ((point / hipVector - point * plane):Abs():Floor() * hipVector + point * plane).Magnitude < rad or (cf.Position - dest).Magnitude < rad +end + local function jumpCheck() local cframe = getCFrame() local targ = props.Target and props.Target.Parent and (props.Target:FindFirstChild("HumanoidRootPart") or props.Target:FindFirstChild("Torso") or props.Target:FindFirstChild("UpperTorso")) @@ -68,10 +107,14 @@ local function jumpCheck() return --// Do something? else local checkVector = (cframe*CFrame.new(0,0,-3.5)).Position - local result = workspace:Raycast(cframe.Position, (checkVector - cframe.Position).Unit) + local rayParams = RaycastParams.new() + rayParams.IgnoreWater = true + rayParams.CollisionGroup = torso and torso.CollisionGroup or "Default" + rayParams.ExcludeInstances = {char} + local result = workspace:Raycast(cframe.Position, checkVector - cframe.Position, rayParams) if result then local hit, pos = result.Instance, result.Position - if hit and (pos-cframe.Position).Magnitude < 0.7 then + if hit and (pos - cframe.Position).Magnitude < 0.7 then hum.Jump = true end end @@ -81,11 +124,11 @@ end local function findTarget() local closest local prevDist = props.Distance - for i,v in workspace:GetChildren() do + for _, v in workspace:GetChildren() do local vTorso = v:FindFirstChild("HumanoidRootPart") or v:FindFirstChild("Torso") or v:FindFirstChild("UpperTorso") local human = v:FindFirstChildOfClass("Humanoid") - if v~=char and v:IsA("Model") and torso and vTorso and human and human.Health>0 then - local dist = (torso.Position-vTorso.Position).Magnitude + if v ~= char and v:IsA("Model") and vTorso and human and human.Health > 0 then + local dist = (torso.Position - vTorso.Position).Magnitude if dist < prevDist and validTarget(v) then prevDist = dist closest = v @@ -95,20 +138,83 @@ local function findTarget() return closest end -local function canSee(targCFrame) - local myPos = getCFrame().Position - local targetPos = targCFrame.Position +local function rayFilter(results, isVisual) + local obj = results.Instance + + if + not obj.Parent or not obj.CanCollide or obj.Size.Magnitude < 1 or + obj.Name == "Handle" or obj.Parent:IsA("Accoutrement") or obj.Parent:IsA("BackpackItem") or + obj.Parent:FindFirstChildOfClass("Humanoid") or + obj:IsA("WedgePart") or obj:IsA("CornerWedgePart") or + string.sub(obj.Name, 1, 6) == "Effect" or + isVisual and obj.Transparency <= 0.75 + then + return true + end + return false +end + +local function canSee(targCFrame, maxCalls, myPos, isVisual) + maxCalls, myPos = maxCalls or math.huge, myPos or getCFrame().Position + local calls, result = 0, nil + local targetPos = targCFrame.Position local rayParams = RaycastParams.new() - rayParams.FilterDescendantsInstances = {char, props.Target} - rayParams.FilterType = Enum.RaycastFilterType.Exclude + rayParams.IgnoreWater = true + rayParams.CollisionGroup = torso and torso.CollisionGroup or "Default" + rayParams.ExcludeInstances = {char, props.Target} + + while calls <= maxCalls do + local targetVector = targetPos - myPos + result = workspace:Raycast(myPos, targetVector, rayParams) + local obj = result and result.Instance + + if obj then + if rayFilter(result, isVisual) then + local blacklist = table.clone(rayParams.ExcludeInstances) + table.insert(blacklist, obj) + rayParams.ExcludeInstances = blacklist + myPos += targetVector.Unit * result.Distance * 0.75 + calls += 1 + + if obj.Parent and (obj.Parent:FindFirstChildOfClass("Humanoid") or obj.Parent:IsA("Accoutrement") or obj.Parent:IsA("BackpackItem")) then + table.insert(blacklist, obj.Parent) + end + else + return false, result.Position + end + else + return true, nil + end + end - local result = workspace:Raycast(myPos, (targetPos - myPos).Unit, rayParams) + return false, nil +end - if result and result.Instance then - return false - else - return true +local function broadcastAnger(level, attacker, rad) + for _, v in ipairs(workspace:GetChildren()) do + if v:IsA("Model") and v:FindFirstChild("isBot") and v ~= char then + local isBot = v.isBot + + if not props.AttackBots or props.Swarm and isBot:IsA("ValueBase") and isBot.Value == props.SpecialKey then + local brain = v:FindFirstChild("BotBrain") + local event = brain and brain:FindFirstChild("Event") + + if event then + event:Fire("Anger", {Level = level, Attacker = attacker}) + end + end + end + end +end + +local function onAnger(level, attacker, isPrimary) + local doBroadcast = level * 0.75 > props.Anger or attacker and attacker ~= props.AngerTarget + props.Anger = math.max(props.Anger, level) + props.AngerTarget = attacker or props.AngerTarget + + if doBroadcast then + broadcastAnger(props.Anger * 0.5, isPrimary and attacker or nil, isPrimary and props.Distance * 1.75 or props.Distance + math.random() * 0.25) end end @@ -116,7 +222,7 @@ validTarget = function(v) local targ = v or props.Target local isBot = targ:FindFirstChild("isBot") local isPlayer = Players:GetPlayerFromCharacter(targ) - local canHurt = (not isBot and not isPlayer) or (isBot and props.AttackBots and (isBot.Value ~= props.SpecialKey or isBot.Value == "null")) or (isPlayer and not (props.Friendly and (isPlayer == props.Creator or isPlayer.TeamColor == props.TeamColor))) + local canHurt = (not isBot and not isPlayer) or (isBot and props.AttackBots and (isBot.Value ~= props.SpecialKey or isBot.Value == "nil")) or (isPlayer and not (props.Friendly and (isPlayer == props.Creator or isPlayer.TeamColor == props.TeamColor))) if targ and targ ~= char and canHurt then local targetHumanoid = targ:FindFirstChildOfClass("Humanoid") if targetHumanoid ~= nil and targetHumanoid.Health < math.huge and (targ:FindFirstChild("HumanoidRootPart") or targ:FindFirstChild("Torso") or targ:FindFirstChild("UpperTorso")) then @@ -130,56 +236,78 @@ validTarget = function(v) end local function doAttack(v) - if props.Attack and not props.isDead and v == props.Target then - local foundHumanoid = v:FindFirstChildOfClass("Humanoid") - if foundHumanoid and validTarget(v) then - tagHumanoid(foundHumanoid, hum) - foundHumanoid:TakeDamage(props.Damage) - end + local foundHumanoid = v:FindFirstChildOfClass("Humanoid") + if foundHumanoid then + tagHumanoid(foundHumanoid, hum) + foundHumanoid:TakeDamage(props.Damage) end end local function checkPath() - if props.AutoCompute or os.clock() - props.LastCompute > 1 then + if props.AutoCompute or os.clock() - props.LastCompute > props.ComputeReset then getPath() end end getPath = function() - local targetPos + local targetPos, targetPart + local target = props.target and props.target.Parent and (props.Target:FindFirstChild("HumanoidRootPart") or props.Target:FindFirstChild("Torso") or props.Target:FindFirstChild("UpperTorso")) - if props.Target and props.Target.Parent then - local target = props.Target:FindFirstChild("HumanoidRootPart") or props.Target:FindFirstChild("Torso") or props.Target:FindFirstChild("UpperTorso") - if target then - targetPos = target.CFrame - else - targetPos = CFrame.new(props.PatrolZone + Vector3.new(math.random(-props.PatrolDist, props.PatrolDist),0,math.random(-props.PatrolDist, props.PatrolDist))) - task.wait(math.random()) - end - else - targetPos = CFrame.new(props.PatrolZone+Vector3.new(math.random(-props.PatrolDist, props.PatrolDist),0,math.random(-props.PatrolDist, props.PatrolDist))) + if target then + targetPos, targetPart = target.CFrame, target + elseif props.Walk then + targetPos = CFrame.new(props.PatrolZone + Vector3.new(math.random(-props.PatrolDist, props.PatrolDist), 0, math.random(-props.PatrolDist, props.PatrolDist))) task.wait(math.random()) end - if not props.isDead and not props.Computing then - if canSee(targetPos) then + if targetPos and not props.isDead and not props.Computing then + if canSee(targetPos, 32) then props.AutoCompute = true - path = {getCFrame(), targetPos.Position} + path = {{Position = getCFrame().Position}, {Position = targetPos.Position, Action = Enum.PathWaypointAction.Custom, Label = "_targetObj"}, Parts = {_targetObj = targetPart}} props.LastCompute = os.clock() current = nil currentInd = 2 else + local mustCompute = props.AutoCompute props.Computing = true props.AutoCompute = false - local pathf = PathfindingService:ComputeSmoothPathAsync( - getCFrame().Position, - targetPos.Position, - 500 - ) + local success, err = pcall(function() + pathf:ComputeAsync( + getCFrame().Position, + targetPos.Position + ) + end) + + if not success or pathf.Status ~= Enum.PathStatus.Success then + if err then + warn("Failed to compute path due to:", err) + end + + if mustCompute then + local pos = getCFrame().Position + local offset = (targetPos.Position - pos).Unit + path, blockedPath = {{Position = pos}, Parts = {_targetObj = targetPart}}, {} + + for i = 1, 20 do -- Fill waypoints with auxiliary positions + local newPos = pos + Vector3.new(math.random(-20, 20), 0, math.random(-20, 20)) + offset * 5 + local _, hit = canSee(CFrame.new(newPos), 16, pos) + pos = hit and pos:Lerp(hit, 0.9) or newPos + table.insert(path, {Position = pos}) + end + + table.insert(path, {Position = targetPos.Position, Action = Enum.PathWaypointAction.Custom, Label = "_targetObj"}) + props.LastCompute = os.clock() + current = nil + currentInd = 2 + end + + props.Computing = false + return + end - path = {} - path = pathf:GetPointCoordinates() + path, blockedPath = {}, {} + path = pathf:GetWaypoints() props.LastCompute = os.clock() props.Computing = false current = nil @@ -193,40 +321,107 @@ local function walkPath() local coord = path[currentInd] if coord then - current = coord - currentInd = currentInd+1 + current = coord.Position + currentInd += 1 if hum ~= nil and hum:IsA("Humanoid") then - hum:MoveTo(current) + hum:MoveTo(current, path.Parts and path.Parts[coord.Label] or nil) jumpCheck() - if (current.Y - getCFrame().Position.Y) > 2.5 then + if coord.Action and coord.Action.Name == "Jump" or current.Y - getCFrame().Position.Y > 2.5 then hum.Jump = true - elseif (current.Y - getCFrame().Position.Y) < -2.5 then - hum:MoveTo(current+Vector3.new(2,0,2)) + elseif current.Y - getCFrame().Position.Y < -2.5 then + hum:MoveTo(current + Vector3.new(2, 0, 2)) end if #path > 2 then - repeat task.wait(0.1) until path[currentInd] ~= coord or (getCFrame().Position - coord).Magnitude < 2.5 + local attempt, target = false, os.clock() + (getCFrame().Position - current).Magnitude / hum.WalkSpeed * 2 + + repeat + if attempt then + hum:MoveTo(current, path.Parts and path.Parts[coord.Label] or nil) + hum.Jump = true + end + hum.MoveToFinished:Wait() + attempt = true + until path[currentInd] ~= coord or checkHeightNormalized(getCFrame(), current, 2.5) or os.clock() < target end end if currentInd == #path then props.AutoCompute = true end + else + props.AutoCompute = true + print("Coordinates didn't exist. Requiring recomputation") end end +local function onDamage() + if hum.Health < lastHealth then + local creator = hum:FindFirstChild("creator") + + if creator and creator:IsA("ObjectValue") and creator.Value and creator.Value.Parent then + local newTarget = creator.Value:IsA("Player") and creator.Value.Character:FindFirstChildOfClass("Humanoid") or creator.Value:IsA("Humanoid") and creator.Value + props.MainTarget = newTarget.Parent + onAnger(math.max(props.Anger, 10) + 50 + math.ceil((lastHealth - hum.Health) / hum.MaxHealth * 200), newTarget.Parent, true) + elseif math.random() < (lastHealth - hum.Health) / hum.MaxHealth * 0.5 then + onAnger(math.max(props.Anger, 10) + 10 + math.ceil((lastHealth - hum.Health) / hum.MaxHealth * 50), nil, true) + end + end + + lastHealth = hum.Health +end + local function updateBot() - local targ = findTarget() - if targ and props.Swarm then - props.Target = targ - else - props.Target = nil + local targ = props.MainTarget or props.Anger > 0 and props.AngerTarget or props.Attack and (os.clock() < props.LastSearch + props.TargetReset and props.CachedTarget or os.clock() > props.LastSearch + props.ScanInterval and findTarget()) + + if targ ~= props.Target then + props.AutoCompute = true + end + + if targ then + local targHum = targ:FindFirstChildOfClass("Humanoid") + + if not targ.Parent or not targHum or targHum.Health <= 0 then + targ = nil + props.MainTarget, props.AngerTarget, props.CachedTarget, props.Target = nil, nil, nil, nil + end end + + props.Target = targ checkPath() walkPath() - task.wait(1/30) + props.Anger -= 1 + + if props.Anger > 0 and math.random() < math.clamp(props.Anger / 1000, 0, 0.75) / 60 then + broadcastAnger(props.Anger * 0.3, nil, props.Distance * 0.75 + math.random() * 0.25) + end +end + +local function respawn() + props.isDead = true + + if props.RespawnTime == false then + return + elseif props.CanRespawn and clone then + task.wait(props.RespawnTime or Players.RespawnTime) + clone.Parent = workspace + + if props.SpawnPoint then + clone:PivotTo(props.SpawnPoint) + end + + local event = clone:FindFirstChild("BotBrain") and clone.BotBrain:FindFirstChild("Event") + + if event then + task.defer(event.Fire, event, "SetSetting", props) + task.defer(task.defer, event.Fire, event, "Init") + end + task.delay(0.1, char.Destroy, char) + else + Debris:AddItem(char, props.RespawnTime or 1) + end end local function init() @@ -235,17 +430,26 @@ local function init() str.Value = props.SpecialKey str.Parent = char - hum.Died:Connect(function() - Debris:AddItem(char, 1) - props.isDead = true - end) + if props.CanRespawn then + if clone then + clone:Destroy() + end + + local oldArchivable = char.Archivable + char.Archivable = true + clone = char:Clone() + char.Archivable = oldArchivable + end - while task.wait(1/30) and not props.isDead do + hum.Died:Connect(respawn) + hum.HealthChanged:Connect(onDamage) + local took = 0 + + while task.wait(not props.Targ and 1/30 or nil) and not props.isDead do if char and hum and not props.isDead then updateBot() else - props.isDead = true - Debris:AddItem(char, 1) + respawn() break end end @@ -253,7 +457,7 @@ end local function doToucher(part) part.Touched:Connect(function(hit) - if hit and hit:IsA("BasePart") and hit.Parent and hit.Parent:IsA("Model") and hit.Parent:FindFirstChildOfClass("Humanoid") and hit.Parent ~= script.Parent then + if hit and hit:IsA("BasePart") and hit.Parent and hit.Parent == props.Target and not props.isDead then doAttack(hit.Parent) end end) @@ -264,12 +468,28 @@ doToucher(head) doToucher(lleg) doToucher(rleg) -event.Event:Connect(function(command,data) +event.Event:Connect(function(command, data) if command == "SetSetting" then for k, v in data do props[k] = v end + elseif command == "Anger" then + onAnger(data.Level, data.Attacker) elseif command == "Init" then init() end end) + +if pathf and pathf.Blocked and pathf.Unblocked then + pathf.Blocked:Connect(function(i) + if i >= currentInd and path[i] then + blockedPath[i], path[i] = path[i], nil + end + end) + + pathf.Unblocked:Connect(function(i) + if i >= currentInd and blockedPath[i] then + path[i], blockedPath[i] = blockedPath[i], nil + end + end) +end From accda67bb562d2dc7b6aafb301abe9f632f9e2fe Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sat, 13 Jun 2026 22:07:03 +0300 Subject: [PATCH 19/27] Fix tornado command not working --- MainModule/Server/Commands/Fun.luau | 47 ++++++++++++++--------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/MainModule/Server/Commands/Fun.luau b/MainModule/Server/Commands/Fun.luau index 64f0cea633..cedbd625f3 100644 --- a/MainModule/Server/Commands/Fun.luau +++ b/MainModule/Server/Commands/Fun.luau @@ -1685,42 +1685,41 @@ return function(Vargs, env) local cl = Core.NewScript("Script",[[ local Pcall=function(func,...) local function cour(...) coroutine.resume(coroutine.create(func),...) end local ran,error=pcall(cour,...) if error then print('Error: '..error) end end local parts = {} - local main=script.Parent - main.Anchored=true - main.CanCollide=false - main.Transparency=1 - local smoke=Instance.new("Smoke", main) - local sound=Instance.new("Sound", main) - smoke.RiseVelocity=25 - smoke.Size=25 - smoke.Color=Color3.new(170/255, 85/255, 0) - smoke.Opacity=1 - sound.SoundId="rbxassetid://142840797" - sound.Looped=true + local main = script.Parent + main.Anchored = true + main.CanCollide = false + main.Transparency = 1 + local smoke = Instance.new("Smoke", main) + local sound = Instance.new("Sound", main) + smoke.RiseVelocity = 25 + smoke.Size = 25 + smoke.Color = Color3.new(170/255, 85/255, 0) + smoke.Opacity = 1 + sound.SoundId = "rbxassetid://134811453767381" + sound.Looped = true sound:Play() - sound.Volume=1 - sound.Pitch=0.8 - local light=Instance + sound.Volume = 0.8 + sound.PlaybackSpeed = 0.8 function fling(part) part:BreakJoints() - part.Anchored=false + part.Anchored = false local attachment = Instance.new("Attachment", part) - local pos=Instance.new("AlignPosition", part) + local pos = Instance.new("AlignPosition", part) pos.MaxForce = math.huge pos.Position = part.Position pos.Attachment0 = attachment - local i=1 - local run=true - while main and wait() and run do + local i = 1 + local run = true + while main and task.wait() and run do if part.Position.Y>=main.Position.Y+50 then run=false end - pos.Position=Vector3.new(50*math.cos(i), part.Position.Y+5, 50*math.sin(i))+main.Position - i=i+1 + pos.Position = Vector3.new(50 * math.cos(i), part.Position.Y + 5, 50 * math.sin(i)) + main.Position + i += 1 end - pos.MaxForce = Vector3.new(500, 500, 500) - pos.Position=Vector3.new(main.Position.X+math.random(-100, 100), main.Position.Y+100, main.Position.Z+math.random(-100, 100)) + pos.MaxForce = 500 + pos.Position = Vector3.new(main.Position.X+math.random(-100, 100), main.Position.Y+100, main.Position.Z+math.random(-100, 100)) pos:Destroy() end From 155d73710e4f4dc3defebfdaa422d15cb2dbd668 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sat, 13 Jun 2026 22:16:10 +0300 Subject: [PATCH 20/27] Fix reboothandler not working --- .../RebootHandler/init.server.lua | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/MainModule/Server/Dependencies/RebootHandler/init.server.lua b/MainModule/Server/Dependencies/RebootHandler/init.server.lua index fa02ab72a8..37e448f6c6 100644 --- a/MainModule/Server/Dependencies/RebootHandler/init.server.lua +++ b/MainModule/Server/Dependencies/RebootHandler/init.server.lua @@ -17,25 +17,39 @@ if script.Parent then local function CleanUp() warn("TARGET DISABLED") dTarget.Disabled = true - pcall(function() dTarget.Parent = game:GetService("ServerScriptService") end) + pcall(function() dTarget.Parent = model:FindFirstChild("Loader") end) task.wait() - pcall(function() dTarget:Destroy() end) + pcall(function() dTarget.Name = "Loader" end) warn("TARGET DESTROYED") task.wait() warn("CLEANING") - if not table.isfrozen(_G) then - rawset(_G, "Adonis", nil) - rawset(_G, "__Adonis_MODULE_MUTEX", nil) - rawset(_G, "__Adonis_MUTEX", nil) - end + rawset(_G, "Adonis", nil) + rawset(_G, "__Adonis_MODULE_MUTEX", nil) + rawset(_G, "__Adonis_MUTEX", nil) warn("_G VARIABLES CLEARED") + if game:GetService("RunService"):FindFirstChild("__Adonis_MUTEX") then + game:GetService("RunService").__Adonis_MUTEX:Destroy() + warn("VARIABLE MUTEX CLEARED") + end + + if game:GetService("RunService"):FindFirstChild("__Adonis_MODULE_MUTEX") then + game:GetService("RunService").__Adonis_MODULE_MUTEX:Destroy() + warn("VARIABLE MODULE MUTEX CLEARED") + end + + if dTarget.Parent and dTarget.Parent:FindFirstChild("Dropper") then + dTarget.Parent.Dropper.Disabled = true + warn("DISABLED LEGACY DROPPED") + end + warn("MOVING MODEL") model.Parent = tParent + model.Name = "Adonis_Loader" end if mode == "REBOOT" then From 4dd6a8af9690e3a287acc863ebd593ef7f2a64a9 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sun, 14 Jun 2026 13:01:02 +0300 Subject: [PATCH 21/27] De-yanderefy transparentpart --- MainModule/Server/Commands/Moderators.luau | 355 ++++++--------------- 1 file changed, 95 insertions(+), 260 deletions(-) diff --git a/MainModule/Server/Commands/Moderators.luau b/MainModule/Server/Commands/Moderators.luau index 17c77357f7..9902bc425b 100644 --- a/MainModule/Server/Commands/Moderators.luau +++ b/MainModule/Server/Commands/Moderators.luau @@ -3540,275 +3540,110 @@ return function(Vargs, env) Args = {"player", "part names", "% value (0-1)"}; Description = "Set the transparency of the target's character's parts, including accessories; supports a comma-separated list of part names"; AdminLevel = "Moderators"; + Vars = { + TypeInput = { All = "Instance", Accessories = "Accoutrement" }; + ParentDir = { Accessories = "Accoutrement" } + GroupPartInputs = { + LeftArm = { "Left Arm", "LeftArm", "LeftUpperArm", "LeftLowerArm", "LeftHand" }; + RightArm = { "Right Arm", "RightArm", "RightUpperArm", "RightLowerArm", "RightHand" }; + LeftLeg = { "Left Leg", "LeftLeg", "LeftUpperLeg", "LeftLowerLeg", "LeftFoot" }; + RightLeg = { "Right Leg", "RightLeg", "RightUpperLeg", "RightLowerLeg", "RightFoot" }; + Torso = { "Torso", "UpperTorso", "LowerTorso" }; + }; + PartInputs = {"Head", "UpperTorso", "LowerTorso", "LeftUpperArm", "LeftLowerArm", "LeftHand", "RightUpperArm", "RightLowerArm", "RightHand", "LeftUpperLeg", "LeftLowerLeg", "LeftFoot", "RightUpperLeg", "RightLowerLeg", "RightFoot"}; + UsageText = { + "Possible inputs are:", + "R6: Head, LeftArm, RightArm, RightLeg, LeftLeg, Torso", + "R15: Head, UpperTorso, LowerTorso, LeftUpperArm, LeftLowerArm, LeftHand, RightUpperArm, RightLowerArm, RightHand, LeftUpperLeg, LeftLowerLeg, LeftFoot, RightUpperLeg, RightLowerLeg, RightFoot", + "", + "If the input is 'LeftArm' on a R15 rig, it will select the entire Left Arm for R15.", + "Special Inputs: all, accessories", + "all: All limbs including accessories. If this is specified it will ignore all other specified parts.", + "limbs: Changes the transparency of all limbs", + "face: Changes the transparency of the face", + "accessories: Changes transparency of accessories" + }; + }; Function = function(plr: Player, args: {string}) - for i, player in service.GetPlayers(plr, args[1]) do - if player.Character then - local humanoid = player.Character:FindFirstChildOfClass("Humanoid") - if humanoid then - local rigType = humanoid.RigType - local GroupPartInputs = {"LeftArm", "RightArm", "RightLeg", "LeftLeg", "Torso"} - local PartInputs = {"Head", "UpperTorso", "LowerTorso", "LeftUpperArm", "LeftLowerArm", "LeftHand", "RightUpperArm", "RightLowerArm", "RightHand", "LeftUpperLeg", "LeftLowerLeg", "LeftFoot", "RightUpperLeg", "RightLowerLeg", "RightFoot"} - - local usageText = { - "Possible inputs are:", - "R6: Head, LeftArm, RightArm, RightLeg, LeftLeg, Torso", - "R15: Head, UpperTorso, LowerTorso, LeftUpperArm, LeftLowerArm, LeftHand, RightUpperArm, RightLowerArm, RightHand, LeftUpperLeg, LeftLowerLeg, LeftFoot, RightUpperLeg, RightLowerLeg, RightFoot", - "", - "If the input is 'LeftArm' on a R15 rig, it will select the entire Left Arm for R15.", - "Special Inputs: all, accessories", - "all: All limbs including accessories. If this is specified it will ignore all other specified parts.", - "limbs: Changes the transparency of all limbs", - "face: Changes the transparency of the face", - "accessories: Changes transparency of accessories" - } - - if not (args[2]) then - --assert(args[2], "No parts specified. See developer console for possible inputs.") - local tab = table.create(#usageText) - for _,v in usageText do - table.insert(tab, { - Text = v; - Desc = v; - }) - end - --// Generate the UI for this player - server.Remote.MakeGui(plr, "List", { - Tab = tab; - Title = "Command Usage"; - }) - return - end - - local partInput = {} - local inputs = string.split(args[2], ",") - - for _, v in inputs do - if v ~= "" then - if v == "all" then - partInput = "all" - break -- break if "all" is found. - end - - -- Validate inputs - if v == "limbs" or v == "face" or v == "accessories" then - table.insert(partInput, v) - else - local found = false - while found ~= true do - for _,v2 in GroupPartInputs do - if v == v2 then - table.insert(partInput, v) - found = true - break - end - end - - for _,v2 in PartInputs do - if v == v2 then - table.insert(partInput, v) - found = true - break - end - end - - if not (found) then - assert(nil, `'{v}' is not a valid input. Run command with no arguments to see possible inputs.`) - end - end - end - else - assert(nil, "Part argument contains empty value.") - end + local value = assert(tonumber(args[3]), "") + local self = Commands.TransparentPart + local TypeInput, ParentDir, GroupPartInputs, PartInputs = self.Vars.TypeInput, self.Vars.ParentDir, self.Vars.GroupPartInputs, self.Vars.PartInputs + + if not args[2] then + --// Generate the UI for this player + server.Remote.MakeGui(plr, "List", { + Tab = self.Vars.UsageText; + Title = "Command Usage"; + }) + return + elseif not self.Vars._converted then + for _, t in ipairs({ TypeInput, ParentDir, GroupPartInputs }) do + for k, v in ipairs(t) do + t[string.lower(k)] = v + end + end + + for _, v in ipairs(PartInputs) do + PartInputs[string.lower(v)], PartInputs[v] = v, v + end + + self.Vars._converted = true + end + + for _, player in service.GetPlayers(plr, args[1]) do + local character = player.Character + + if character then + local partInput = {} + local parts = {} + + for _, v in ipairs(string.split(args[2], ",")) do + if v == "all" then + partInput = {"all"} + break + elseif self.TypeInput[string.lower(v)] then + table.insert(partInput, v) end - - - -- Check if partInput is a table - if type(partInput) == "table" then - local hash = {} - - -- Check for duplicates - for i,v in partInput do - if not (hash[v]) then - hash[v] = i -- Store into table to check for duplicates. - else - assert(nil, `Duplicate '{v}' found in input. Specify each input once only.`) - end + + local group = self.GroupPartInputs[string.lower(v)] + + if group then + for _, name in ipairs(group) do + table.insert(partInput, name) end - - - -- Clean up the parts we don't need, depending on rigType, to allow this command to be more dynamic - - if rigType == Enum.HumanoidRigType.R15 then - for i = #partInput, 1, -1 do - if partInput[i] == "RightArm" then - local foundKeys = {} - for k2, v2 in partInput do - if v2 == "RightUpperArm" or v2 == "RightLowerArm" or v2 == "RightHand" then - table.insert(foundKeys, k2) - end - end - -- If not all keys were found just remove all keys and add them manually - if #foundKeys ~= 3 then - for _, foundKey in foundKeys do - table.remove(partInput, foundKey) - end - table.insert(partInput, "RightUpperArm") - table.insert(partInput, "RightLowerArm") - table.insert(partInput, "RightHand") - end - table.remove(partInput, i) -- Remove the group part input - - elseif partInput[i] == "LeftArm" then - local foundKeys = {} - for k2, v2 in partInput do - if v2 == "LeftUpperArm" or v2 == "LeftLowerArm" or v2 == "LeftHand" then - table.insert(foundKeys, k2) - end - end - - if #foundKeys ~= 3 then - for _, foundKey in foundKeys do - table.remove(partInput, foundKey) - end - table.insert(partInput, "LeftUpperArm") - table.insert(partInput, "LeftLowerArm") - table.insert(partInput, "LeftHand") - end - table.remove(partInput, i) - elseif partInput[i] == "RightLeg" then - local foundKeys = {} - for i = #partInput, 1, -1 do - if partInput[i] == "RightUpperLeg" or partInput[i] == "RightLowerLeg" or partInput[i] == "RightFoot" then - table.insert(foundKeys, partInput[i]) - end - end - if #foundKeys ~= 3 then - for _, foundKey in foundKeys do - table.remove(partInput, foundKey) - end - table.insert(partInput, "RightUpperLeg") - table.insert(partInput, "RightLowerLeg") - table.insert(partInput, "RightFoot") - end - table.remove(partInput, i) - elseif partInput[i] == "LeftLeg" then - local foundKeys = {} - for k2, v2 in partInput do - if v2 == "LeftUpperLeg" or v2 == "LeftLowerLeg" or v2 == "LeftFoot" then - table.insert(foundKeys, k2) - end - end - - if #foundKeys ~= 3 then - for _, foundKey in foundKeys do - table.remove(partInput, foundKey) - end - table.insert(partInput, "LeftUpperLeg") - table.insert(partInput, "LeftLowerLeg") - table.insert(partInput, "LeftFoot") - end - table.remove(partInput, i) - elseif partInput[i] == "Torso" then - local foundKeys = {} - for k2, v2 in partInput do - if v2 == "UpperTorso" or v2 == "LowerTorso" then - table.insert(foundKeys, k2) - end - end - if #foundKeys ~= 2 then - for _, foundKey in foundKeys do - table.remove(partInput, foundKey) - end - table.insert(partInput, "UpperTorso") - table.insert(partInput, "LowerTorso") - end - table.remove(partInput, i) - end - end - end - - if rigType == Enum.HumanoidRigType.R6 then - local partsToRemove = { - ["RightUpperArm"] = true, - ["RightLowerArm"] = true, - ["RightHand"] = true, - ["LeftUpperArm"] = true, - ["LeftLowerArm"] = true, - ["LeftHand"] = true, - ["RightUpperLeg"] = true, - ["RightLowerLeg"] = true, - ["RightFoot"] = true, - ["LeftUpperLeg"] = true, - ["LeftLowerLeg"] = true, - ["LeftFoot"] = true, - ["UpperTorso"] = true, - ["LowerTorso"] = true - } - - for i = #partInput, 1, -1 do - if partsToRemove[partInput[i]] then - table.remove(partInput, i) - end - end + else + local name = self.PartInputs[string.lower(v)] + + if name then + table.insert(partInput, name) end - - -- Make chosen parts transparent - for k, v in partInput do - if not (v == "limbs" or v == "face" or v == "accessories") then - local part = player.Character:FindFirstChild(v) - if part ~= nil and part:IsA("BasePart") then - part.Transparency = args[3] - end - - elseif v == "limbs" then - for key, part in player.Character:GetChildren() do - if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then - part.Transparency = args[3] - end - end - - elseif v == "face" then - local headPart = player.Character:FindFirstChild("Head") - for _, v2 in headPart:GetChildren() do - if v2:IsA("Decal") then - v2.Transparency = args[3] - end - end - - elseif v == "accessories" then - for key, part in player.Character:GetChildren() do - if part:IsA("Accessory") then - for _, v2 in part:GetChildren() do - if v2:IsA("BasePart") then - v2.Transparency = args[3] - end - end - end - end + end + end + + for _, v in ipairs(partInput) do + local class = self.TypeInput[string.lower(v)] + local parent = self.ParentDir[string.lower(v)] and character:FindFirstChild(self.ParentDir[string.lower(v)]) or character + + if class then + for _, obj in ipairs(parent:GetChildren()) do + if v:IsA(class) then + table.insert(parts, v) end end - - elseif partInput == "all" then - for k, p in player.Character:GetChildren() do - if p:IsA("BasePart") and p.Name ~= "HumanoidRootPart" then - p.Transparency = args[3] - if p.Name == "Head" then - for _, v2 in p:GetChildren() do - if v2:IsA("Decal") then - v2.Transparency = args[3] - end - end - end - elseif p:IsA("Accessory") and #p:GetChildren() ~= 0 then - for _, v2 in p:GetChildren() do - if v2:IsA("BasePart") then - v2.Transparency = args[3] - end - end - end + else + local found = parent:FindFirstChild(v) + + if found then + table.insert(parts, found) end end end + + for _, v in ipairs(parts) do + if v:IsA("BasePart") or v:IsA("Decal") do + v.Transparency = value + end + end end end end From e7fadbb34024d1c047d6f18268dc836da33ad3a8 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sun, 14 Jun 2026 13:12:49 +0300 Subject: [PATCH 22/27] Convert commands to use assert --- MainModule/Server/Commands/Fun.luau | 55 +++++++++++------------------ 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/MainModule/Server/Commands/Fun.luau b/MainModule/Server/Commands/Fun.luau index cedbd625f3..11631f6df3 100644 --- a/MainModule/Server/Commands/Fun.luau +++ b/MainModule/Server/Commands/Fun.luau @@ -1341,8 +1341,7 @@ return function(Vargs, env) Fun = true; AdminLevel = "Moderators"; Function = function(plr: Player, args: {string}) - local img = tostring(args[2]) - if not img then error(`{args[2]} is not a valid ID`) end + local img = assert(tonumber(args[2]), `{args[2]} is not a valid ID`) for i, v in service.GetPlayers(plr, args[1]) do Remote.MakeGui(v, "Effect", { Mode = "ScreenImage"; @@ -1360,8 +1359,7 @@ return function(Vargs, env) Fun = true; AdminLevel = "Moderators"; Function = function(plr: Player, args: {string}) - local img = tostring(args[2]) - if not img then error(`{args[2]} is not a valid ID`) end + local img = assert(tostring(args[2]), `{args[2]} is not a valid ID`) for i, v in service.GetPlayers(plr, args[1]) do Remote.MakeGui(v, "Effect", {Mode = "ScreenVideo"; Video = args[2];}) end @@ -3273,16 +3271,13 @@ return function(Vargs, env) Fun = true; AdminLevel = "Moderators"; Function = function(plr: Player, args: {string}) - if not args[2] then error("Missing texture") end local startColor = {} local endColor = {} local startc = Color3.new(1, 1, 1) local endc = Color3.new(1, 1, 1) - if args[3] then - for s in args[3]:gmatch("[%d]+")do - table.insert(startColor, tonumber(s)) - end + for s in assert(args[3], "Missing texture"):gmatch("[%d]+")do + table.insert(startColor, tonumber(s)) end if args[4] then--276138620 :) @@ -4445,8 +4440,7 @@ return function(Vargs, env) if args[5] and args[5]:match("(.*),(.*),(.*)") then r, g, b = args[5]:match("(.*),(.*),(.*)") end - r, g, b = tonumber(r), tonumber(g), tonumber(b) - if not r or not g or not b then error("Invalid Input") end + r, g, b = assert(tonumber(r), "Invalid red"), assert(tonumber(g), "Invalid green"), assert(tonumber(b), "Invalid blue") for _, p in service.GetPlayers(plr, args[1]) do Remote.NewLocal(p, "ColorCorrectionEffect", { Name = "WINDOW_COLORCORRECTION", @@ -4472,8 +4466,7 @@ return function(Vargs, env) if args[1] and args[1]:match("(.*),(.*),(.*)") then r, g, b = args[1]:match("(.*),(.*),(.*)") end - r, g, b = tonumber(r), tonumber(g), tonumber(b) - if not r or not g or not b then error("Invalid Input") end + r, g, b = assert(tonumber(r), "Invalid red"), assert(tonumber(g), "Invalid green"), assert(tonumber(b), "Invalid blue") local num1, num2, num3 = r, g, b num1 = `-{num1}00000` num2 = `-{num2}00000` @@ -4528,20 +4521,16 @@ return function(Vargs, env) Function = function(plr: Player, args: {string}) local gearID = assert(tonumber(args[2]), "Invalid ID (not Number?)") local AssetIdType = service.MarketPlace:GetProductInfo(gearID).AssetTypeId + assert(AssetIdType == 19, "Invalid ID provided, Not AssetType Gear."= + local gear = service.Insert(gearID) - if AssetIdType == 19 then - local gear = service.Insert(gearID) - - if gear:IsA("BackpackItem") then - service.New("StringValue", gear).Name = Variables.CodeName..gear.Name - for i, v in service.GetPlayers(plr, args[1]) do - if v:FindFirstChild("StarterGear") then - gear:Clone().Parent = v.StarterGear - end + if gear:IsA("BackpackItem") then + service.New("StringValue", gear).Name = Variables.CodeName..gear.Name + for i, v in service.GetPlayers(plr, args[1]) do + if v:FindFirstChild("StarterGear") then + gear:Clone().Parent = v.StarterGear end end - else - error("Invalid ID provided, Not AssetType Gear.", 0) end end }; @@ -4556,20 +4545,16 @@ return function(Vargs, env) Function = function(plr: Player, args: {string}) local gearID = assert(tonumber(args[2]), "Invalid ID (not Number?)") local AssetIdType = service.MarketPlace:GetProductInfo(gearID).AssetTypeId + assert(AssetIdType == 19, "Invalid ID provided, Not AssetType Gear.") + local gear = service.Insert(gearID) - if AssetIdType == 19 then - local gear = service.Insert(gearID) - - if gear:IsA("BackpackItem") then - service.New("StringValue", gear).Name = Variables.CodeName..gear.Name - for i, v in service.GetPlayers(plr, args[1]) do - if v:FindFirstChild("Backpack") then - gear:Clone().Parent = v.Backpack - end + if gear:IsA("BackpackItem") then + service.New("StringValue", gear).Name = Variables.CodeName..gear.Name + for i, v in service.GetPlayers(plr, args[1]) do + if v:FindFirstChild("Backpack") then + gear:Clone().Parent = v.Backpack end end - else - error("Invalid ID provided, Not AssetType Gear.", 0) end end }; From f5cead55bc825985cde8bcceb354dfd61827a848 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sun, 14 Jun 2026 13:15:06 +0300 Subject: [PATCH 23/27] Removed unnecessary nightly check --- MainModule/Server/Plugins/Trello.luau | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MainModule/Server/Plugins/Trello.luau b/MainModule/Server/Plugins/Trello.luau index bb8e140942..75b9cbd05a 100644 --- a/MainModule/Server/Plugins/Trello.luau +++ b/MainModule/Server/Plugins/Trello.luau @@ -314,10 +314,10 @@ return function(Vargs, GetEnv) table.insert(server.Messages, { Level = 301; Title = "Potential Trello issue!"; - Message = "You have enabled Trello without having an AppKey and thus Trello will likely not work! For better behavior it is adviced to also add a Trello Token. Click to see more"; + Message = "You have enabled Trello without having an AppKey and thus Trello will likely not work! It is adviced also add a Trello Token. Click to see more"; Time = 15; Icon = "MatIcon://Description"; - onClick = (server.Data and server.Data.NightlyMode) and Core.Bytecode([[ + onClick = Core.Bytecode([[ local window = client.UI.Make("Window", { Title = "How to change the Trello AppKey"; Size = {700,300}; @@ -329,7 +329,7 @@ return function(Vargs, GetEnv) }) window:Ready() - ]]) or nil}) + ]])}) end end Logs:AddLog("Script", "Trello Module Loaded") From 41bbefd6df8e8a3cb5387f32941a401e33ee56b3 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sun, 14 Jun 2026 13:18:12 +0300 Subject: [PATCH 24/27] Only handle mutex changed if server is actually running --- MainModule/Server/Server.luau | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MainModule/Server/Server.luau b/MainModule/Server/Server.luau index 8115336b35..15d7f27422 100644 --- a/MainModule/Server/Server.luau +++ b/MainModule/Server/Server.luau @@ -472,7 +472,7 @@ return service.NewProxy({ local function makePersistent(m) local connection1, connection2 = nil, nil connection1 = m:GetPropertyChangedSignal("Parent"):Connect(function() - if not m or m.Parent ~= service.RunService then + if not m or m.Parent ~= service.RunService and server.Running then connection1:Disconnect() connection2:Disconnect() --warn("Adonis module mutex removed; Regenerating...") @@ -484,7 +484,7 @@ return service.NewProxy({ end) connection2 = m:GetPropertyChangedSignal("Name"):Connect(function() pcall(function() - if m and m.Name ~= "__Adonis_MODULE_MUTEX" then + if m and m.Name ~= "__Adonis_MODULE_MUTEX" and server.Running then m.Name = "__Adonis_MODULE_MUTEX" end end) From 11989dfbbf2d041233d9bd0344fea158d41628d1 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sun, 14 Jun 2026 13:37:48 +0300 Subject: [PATCH 25/27] Remove unnecessary GuiViewFolder destruction logic Removed code that destroys GuiViewFolder if it exists. --- MainModule/Client/Core/Process.luau | 5 ----- 1 file changed, 5 deletions(-) diff --git a/MainModule/Client/Core/Process.luau b/MainModule/Client/Core/Process.luau index 89bf864393..b320bb0401 100644 --- a/MainModule/Client/Core/Process.luau +++ b/MainModule/Client/Core/Process.luau @@ -159,11 +159,6 @@ return function(Vargs, GetEnv) end end - if Variables.GuiViewFolder then - Variables.GuiViewFolder:Destroy() - Variables.GuiViewFolder = nil - end - if Variables.ChatEnabled then service.StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Chat, true) end From f3f2540b89f077416397e49649577d5c181476e6 Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sun, 14 Jun 2026 13:41:38 +0300 Subject: [PATCH 26/27] Fix typos Fix a bunch of typos --- MainModule/Client/Core/Functions.luau | 2 +- MainModule/Server/Commands/Fun.luau | 2 +- MainModule/Server/Commands/Moderators.luau | 4 ++-- MainModule/Server/Core/Functions.luau | 2 +- MainModule/Shared/Service.luau | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/MainModule/Client/Core/Functions.luau b/MainModule/Client/Core/Functions.luau index e2e9304cf7..5626644d2b 100644 --- a/MainModule/Client/Core/Functions.luau +++ b/MainModule/Client/Core/Functions.luau @@ -426,7 +426,7 @@ return function(Vargs, GetEnv) Children = {}; } - for _, v in variables.GuiProperties do + for _, v in Variables.GuiProperties do pcall(function() new.Properties[v] = child[v] end) diff --git a/MainModule/Server/Commands/Fun.luau b/MainModule/Server/Commands/Fun.luau index 11631f6df3..52075e20fc 100644 --- a/MainModule/Server/Commands/Fun.luau +++ b/MainModule/Server/Commands/Fun.luau @@ -4521,7 +4521,7 @@ return function(Vargs, env) Function = function(plr: Player, args: {string}) local gearID = assert(tonumber(args[2]), "Invalid ID (not Number?)") local AssetIdType = service.MarketPlace:GetProductInfo(gearID).AssetTypeId - assert(AssetIdType == 19, "Invalid ID provided, Not AssetType Gear."= + assert(AssetIdType == 19, "Invalid ID provided, Not AssetType Gear.") local gear = service.Insert(gearID) if gear:IsA("BackpackItem") then diff --git a/MainModule/Server/Commands/Moderators.luau b/MainModule/Server/Commands/Moderators.luau index 9902bc425b..5d69ae040d 100644 --- a/MainModule/Server/Commands/Moderators.luau +++ b/MainModule/Server/Commands/Moderators.luau @@ -3542,7 +3542,7 @@ return function(Vargs, env) AdminLevel = "Moderators"; Vars = { TypeInput = { All = "Instance", Accessories = "Accoutrement" }; - ParentDir = { Accessories = "Accoutrement" } + ParentDir = { Accessories = "Accoutrement" }; GroupPartInputs = { LeftArm = { "Left Arm", "LeftArm", "LeftUpperArm", "LeftLowerArm", "LeftHand" }; RightArm = { "Right Arm", "RightArm", "RightUpperArm", "RightLowerArm", "RightHand" }; @@ -3640,7 +3640,7 @@ return function(Vargs, env) end for _, v in ipairs(parts) do - if v:IsA("BasePart") or v:IsA("Decal") do + if v:IsA("BasePart") or v:IsA("Decal") then v.Transparency = value end end diff --git a/MainModule/Server/Core/Functions.luau b/MainModule/Server/Core/Functions.luau index b6fa272e09..1192c2eef1 100644 --- a/MainModule/Server/Core/Functions.luau +++ b/MainModule/Server/Core/Functions.luau @@ -419,7 +419,7 @@ return function(Vargs, GetEnv) GetRoleInGroupAsync = function() return "Guest" end; GetRoleInGroup = function() return "Guest" end; IsInGroupAsync = function() return false end; IsFriendsWithAsync = function() return false end; IsFriendsWith = function() return false end; - Kick = function() end fakePlayer:SetSpecial("Parent", nil) fakePlayer:Destroy() end; + Kick = function() fakePlayer:SetSpecial("Parent", nil) fakePlayer:Destroy() end; IsA = function(_, className) return className == "Player" or className == "Instance" end; } diff --git a/MainModule/Shared/Service.luau b/MainModule/Shared/Service.luau index 5316c17cef..5af5139793 100644 --- a/MainModule/Shared/Service.luau +++ b/MainModule/Shared/Service.luau @@ -1462,7 +1462,7 @@ return function(errorHandler, eventChecker, fenceSpecific, env) Localize = function(obj, readOnly) local Localize = service.Localize local ReadOnly = service.ReadOnly if type(obj) == "table" then local newTab = {} for i in obj do newTab[i] = Localize(obj[i], readOnly) end return (readOnly and ReadOnly(newTab)) or newTab else return obj end end; RawEqual = function(obj1, obj2) return service.UnWrap(obj1) == service.UnWrap(obj2) end; CheckProperty = function(obj, prop) return pcall(function() return obj[prop] end) end; - Lookupify = function(t, dest) local t2 = dest or {} for i = 1, #tbl do t2[t[i]] = true end return t2 end; + Lookupify = function(t, dest) local t2 = dest or {} for i = 1, #t do t2[t[i]] = true end return t2 end; NewWaiter = function() local event = service.New("BindableEvent") return {Wait = event.wait; Finish = event.Fire} end; -- TODO: Remove and replace with goodsignal }, { __index = function(tab, index) From ccfa8d85d78529db7696d13802c427aa63d8f90f Mon Sep 17 00:00:00 2001 From: ccuser44 <68124053+ccuser44@users.noreply.github.com> Date: Sun, 14 Jun 2026 14:50:17 +0300 Subject: [PATCH 27/27] Refactor away from mixed tables --- .../Assets/BotBrain/init.server.lua | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/MainModule/Server/Dependencies/Assets/BotBrain/init.server.lua b/MainModule/Server/Dependencies/Assets/BotBrain/init.server.lua index b37057aace..4c481fcd8b 100644 --- a/MainModule/Server/Dependencies/Assets/BotBrain/init.server.lua +++ b/MainModule/Server/Dependencies/Assets/BotBrain/init.server.lua @@ -15,7 +15,7 @@ local rleg = char:FindFirstChild("Right Leg") or char:FindFirstChild("RightLower local clone local getPath, validTarget -local path, blockedPath = {}, {} +local path, blockedPath = { Points= {}, Parts = {} }, {} local current local currentInd = 0 local lastHealth = hum.Health @@ -263,7 +263,7 @@ getPath = function() if targetPos and not props.isDead and not props.Computing then if canSee(targetPos, 32) then props.AutoCompute = true - path = {{Position = getCFrame().Position}, {Position = targetPos.Position, Action = Enum.PathWaypointAction.Custom, Label = "_targetObj"}, Parts = {_targetObj = targetPart}} + path = {Points = {{Position = getCFrame().Position}, {Position = targetPos.Position, Action = Enum.PathWaypointAction.Custom, Label = "_targetObj"}}, Parts = {_targetObj = targetPart}} props.LastCompute = os.clock() current = nil currentInd = 2 @@ -287,16 +287,16 @@ getPath = function() if mustCompute then local pos = getCFrame().Position local offset = (targetPos.Position - pos).Unit - path, blockedPath = {{Position = pos}, Parts = {_targetObj = targetPart}}, {} + path, blockedPath = { Points = {{Position = pos}}, Parts = {_targetObj = targetPart}}, {} for i = 1, 20 do -- Fill waypoints with auxiliary positions local newPos = pos + Vector3.new(math.random(-20, 20), 0, math.random(-20, 20)) + offset * 5 local _, hit = canSee(CFrame.new(newPos), 16, pos) pos = hit and pos:Lerp(hit, 0.9) or newPos - table.insert(path, {Position = pos}) + table.insert(path.Points, {Position = pos}) end - table.insert(path, {Position = targetPos.Position, Action = Enum.PathWaypointAction.Custom, Label = "_targetObj"}) + table.insert(path.Points, {Position = targetPos.Position, Action = Enum.PathWaypointAction.Custom, Label = "_targetObj"}) props.LastCompute = os.clock() current = nil currentInd = 2 @@ -306,8 +306,7 @@ getPath = function() return end - path, blockedPath = {}, {} - path = pathf:GetWaypoints() + path, blockedPath = { Points = pathf:GetWaypoints(), Parts = {} }, {} props.LastCompute = os.clock() props.Computing = false current = nil @@ -319,13 +318,13 @@ end local function walkPath() local myPos = getCFrame().Position - local coord = path[currentInd] + local coord = path.Points[currentInd] if coord then current = coord.Position currentInd += 1 if hum ~= nil and hum:IsA("Humanoid") then - hum:MoveTo(current, path.Parts and path.Parts[coord.Label] or nil) + hum:MoveTo(current, path.Parts[coord.Label] or nil) jumpCheck() if coord.Action and coord.Action.Name == "Jump" or current.Y - getCFrame().Position.Y > 2.5 then @@ -334,21 +333,21 @@ local function walkPath() hum:MoveTo(current + Vector3.new(2, 0, 2)) end - if #path > 2 then + if #path.Points > 2 then local attempt, target = false, os.clock() + (getCFrame().Position - current).Magnitude / hum.WalkSpeed * 2 repeat if attempt then - hum:MoveTo(current, path.Parts and path.Parts[coord.Label] or nil) + hum:MoveTo(current, path.Parts[coord.Label] or nil) hum.Jump = true end hum.MoveToFinished:Wait() attempt = true - until path[currentInd] ~= coord or checkHeightNormalized(getCFrame(), current, 2.5) or os.clock() < target + until path.Points[currentInd] ~= coord or checkHeightNormalized(getCFrame(), current, 2.5) or os.clock() < target end end - if currentInd == #path then + if currentInd == #path.Points then props.AutoCompute = true end else @@ -483,13 +482,13 @@ end) if pathf and pathf.Blocked and pathf.Unblocked then pathf.Blocked:Connect(function(i) if i >= currentInd and path[i] then - blockedPath[i], path[i] = path[i], nil + blockedPath[i], path.Points[i] = path.Points[i], nil end end) pathf.Unblocked:Connect(function(i) if i >= currentInd and blockedPath[i] then - path[i], blockedPath[i] = blockedPath[i], nil + path.Points[i], blockedPath[i] = blockedPath[i], nil end end) end