Arcs yield
Key RequiredUniversal

Arcs yield

Universal Scriptbobjsbobjs 14.5K views 19.2K executesUpdated Apr 14, 2026
4.4/ 5(9 votes)
8189% Positive
Lua Script•32701 lines (1546828 chars)
if IY_LOADED and not _G.IY_DEBUG then
        -- error("Infinite Yield is already running!", 0)
        return
end

-- Arc Yield: mark as loaded immediately to prevent normal IY from loading
pcall(function() getgenv().IY_LOADED = true end)
pcall(function() getgenv().ARC_YIELD_LOADED = true end)
pcall(function() _G.ARC_YIELD_LOADED = true end)
if not game:IsLoaded() then game.Loaded:Wait() end

-- Auto-unlock FPS cap to max on load
pcall(function() setfpscap(1/0) end)
pcall(function() setfpscap(math.huge) end)

function missing(t, f, fallback)
        if type(f) == t then return f end
        return fallback
end

cloneref = missing("function", cloneref, function(...) return ... end)
sethidden =  missing("function", sethiddenproperty or set_hidden_property or set_hidden_prop)
gethidden =  missing("function", gethiddenproperty or get_hidden_property or get_hidden_prop)
queueteleport =  missing("function", queue_on_teleport or (syn and syn.queue_on_teleport) or (fluxus and fluxus.queue_on_teleport))
httprequest =  missing("function", request or http_request or (syn and syn.request) or (http and http.request) or (fluxus and fluxus.request))
everyClipboard = missing("function", setclipboard or toclipboard or set_clipboard or (Clipboard and Clipboard.set))
firetouchinterest = missing("function", firetouchinterest)
waxwritefile, waxreadfile = writefile, readfile
writefile = missing("function", waxwritefile) and function(file, data, safe)
        if safe == true then return pcall(waxwritefile, file, data) end
        waxwritefile(file, data)
end
readfile = missing("function", waxreadfile) and function(file, safe)
        if safe == true then return pcall(waxreadfile, file) end
        return waxreadfile(file)
end
isfile = missing("function", isfile, readfile and function(file)
        local success, result = pcall(function()
                return readfile(file)
        end)
        return success and result ~= nil and result ~= ""
end)
makefolder = missing("function", makefolder)
isfolder = missing("function", isfolder)
waxgetcustomasset = missing("function", getcustomasset or getsynasset)
hookfunction = missing("function", hookfunction)
hookmetamethod = missing("function", hookmetamethod)
getnamecallmethod = missing("function", getnamecallmethod or get_namecall_method)
checkcaller = missing("function", checkcaller, function() return false end)
newcclosure = missing("function", newcclosure)
getgc = missing("function", getgc or get_gc_objects)
setthreadidentity = missing("function", setthreadidentity or (syn and syn.set_thread_identity) or syn_context_set or setthreadcontext)
replicatesignal = missing("function", replicatesignal)
getconnections = missing("function", getconnections or get_signal_cons)

Services = setmetatable({}, {
        __index = function(self, name)
                local success, cache = pcall(function()
                        return cloneref(game:GetService(name))
                end)
                if success then
                        rawset(self, name, cache)
                        return cache
                else
                        error("Invalid Service: " .. tostring(name))
                end
        end
})

Players = Services.Players
UserInputService = Services.UserInputService
TweenService = Services.TweenService
HttpService = Services.HttpService
MarketplaceService = Services.MarketplaceService
RunService = Services.RunService
TeleportService = Services.TeleportService
StarterGui = Services.StarterGui
GuiService = Services.GuiService
Lighting = Services.Lighting
ContextActionService = Services.ContextActionService
ReplicatedStorage = Services.ReplicatedStorage
GroupService = Services.GroupService
PathService = Services.PathfindingService
SoundService = Services.SoundService
Teams = Services.Teams
StarterPlayer = Services.StarterPlayer
InsertService = Services.InsertService
ChatService = Services.Chat
ProximityPromptService = Services.ProximityPromptService
ContentProvider = Services.ContentProvider
StatsService = Services.Stats
MaterialService = Services.MaterialService
AvatarEditorService = Services.AvatarEditorService
TextService = Services.TextService
TextChatService = Services.TextChatService
CaptureService = Services.CaptureService
VoiceChatService = Services.VoiceChatService
SocialService = Services.SocialService

PlayerGui = cloneref(Players.LocalPlayer:FindFirstChildWhichIsA("PlayerGui"))
COREGUI = Services.CoreGui or PlayerGui
IYMouse = cloneref(Players.LocalPlayer:GetMouse())
PlaceId, JobId = game.PlaceId, game.JobId
xpcall(function()
        IsOnMobile = table.find({Enum.Platform.Android, Enum.Platform.IOS}, UserInputService:GetPlatform())
end, function()
        IsOnMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled
end)
isLegacyChat = TextChatService.ChatVersion == Enum.ChatVersion.LegacyChatService
--[[rcdEnabled = select(2, pcall(function()
    return gethidden(workspace, "RejectCharacterDeletions") ~= Enum.RejectCharacterDeletions.Disabled
end)) or false]]

-- xylex & europa
local iyassets = {
        ["infiniteyield/assets/bindsandplugins.png"] = "rbxassetid://5147695474",
        ["infiniteyield/assets/close.png"] = "rbxassetid://5054663650",
        ["infiniteyield/assets/editaliases.png"] = "rbxassetid://5147488658",
        ["infiniteyield/assets/editkeybinds.png"] = "rbxassetid://129697930",
        ["infiniteyield/assets/edittheme.png"] = "rbxassetid://4911962991",
        ["infiniteyield/assets/editwaypoints.png"] = "rbxassetid://5147488592",
        ["infiniteyield/assets/imgstudiopluginlogo.png"] = "rbxassetid://4113050383",
        ["infiniteyield/assets/logo.png"] = "rbxassetid://1352543873",
        ["infiniteyield/assets/minimize.png"] = "rbxassetid://2406617031",
        ["infiniteyield/assets/pin.png"] = "rbxassetid://6234691350",
        ["infiniteyield/assets/reference.png"] = "rbxassetid://3523243755",
        ["infiniteyield/assets/settings.png"] = "rbxassetid://1204397029"
}

local function getcustomasset(asset)
        if waxgetcustomasset then
                local success, result = pcall(function()
                        return waxgetcustomasset(asset)
                end)
                if success and result ~= nil and result ~= "" then
                        return result
                end
        end
        return iyassets[asset]
end

if makefolder and isfolder and writefile and isfile then
        pcall(function() -- good executor trust
                local assets = "https://raw.githubusercontent.com/infyiff/backup/refs/heads/main/"
                for _, folder in {"infiniteyield", "infiniteyield/assets"} do
                        if not isfolder(folder) then
                                makefolder(folder)
                        end
                end
                for path in iyassets do
                        if not isfile(path) then
                                writefile(path, game:HttpGet((path:gsub("infiniteyield/", assets))))
                        end
                end
                if IsOnMobile then writefile("infiniteyield/assets/.nomedia", "") end
        end)
end

currentVersion = "6.4.1"

ScaledHolder = Instance.new("Frame")
Scale = Instance.new("UIScale")
Holder = Instance.new("Frame")
Title = Instance.new("TextLabel")
Dark = Instance.new("Frame")
Cmdbar = Instance.new("TextBox")
CMDsF = Instance.new("ScrollingFrame")
cmdListLayout = Instance.new("UIListLayout")
SettingsButton = Instance.new("ImageButton")
ColorsButton = Instance.new("ImageButton")
Settings = Instance.new("Frame")
Prefix = Instance.new("TextLabel")
PrefixBox = Instance.new("TextBox")
Keybinds = Instance.new("TextLabel")
StayOpen = Instance.new("TextLabel")
Button = Instance.new("Frame")
On = Instance.new("TextButton")
Positions = Instance.new("TextLabel")
EventBind = Instance.new("TextLabel")
Plugins = Instance.new("TextLabel")
Example = Instance.new("TextButton")
Notification = Instance.new("Frame")
Title_2 = Instance.new("TextLabel")
Text_2 = Instance.new("TextLabel")
CloseButton = Instance.new("TextButton")
CloseImage = Instance.new("ImageLabel")
PinButton = Instance.new("TextButton")
PinImage = Instance.new("ImageLabel")
Tooltip = Instance.new("Frame")
Title_3 = Instance.new("TextLabel")
Description = Instance.new("TextLabel")
IntroBackground = Instance.new("Frame")
Logo = Instance.new("ImageLabel")
Credits = Instance.new("TextBox")
KeybindsFrame = Instance.new("Frame")
Close = Instance.new("TextButton")
Add = Instance.new("TextButton")
Delete = Instance.new("TextButton")
Holder_2 = Instance.new("ScrollingFrame")
Example_2 = Instance.new("Frame")
Text_3 = Instance.new("TextLabel")
Delete_2 = Instance.new("TextButton")
KeybindEditor = Instance.new("Frame")
background_2 = Instance.new("Frame")
Dark_3 = Instance.new("Frame")
Directions = Instance.new("TextLabel")
BindTo = Instance.new("TextButton")
TriggerLabel = Instance.new("TextLabel")
BindTriggerSelect = Instance.new("TextButton")
Add_2 = Instance.new("TextButton")
Toggles = Instance.new("ScrollingFrame")
ClickTP  = Instance.new("TextLabel")
Select = Instance.new("TextButton")
ClickDelete = Instance.new("TextLabel")
Select_2 = Instance.new("TextButton")
Cmdbar_2 = Instance.new("TextBox")
Cmdbar_3 = Instance.new("TextBox")
CreateToggle = Instance.new("TextLabel")
Button_2 = Instance.new("Frame")
On_2 = Instance.new("TextButton")
shadow_2 = Instance.new("Frame")
PopupText_2 = Instance.new("TextLabel")
Exit_2 = Instance.new("TextButton")
ExitImage_2 = Instance.new("ImageLabel")
PositionsFrame = Instance.new("Frame")
Close_3 = Instance.new("TextButton")
Delete_5 = Instance.new("TextButton")
Part = Instance.new("TextButton")
Holder_4 = Instance.new("ScrollingFrame")
Example_4 = Instance.new("Frame")
Text_5 = Instance.new("TextLabel")
Delete_6 = Instance.new("TextButton")
TP = Instance.new("TextButton")
AliasesFrame = Instance.new("Frame")
Close_2 = Instance.new("TextButton")
Delete_3 = Instance.new("TextButton")
Holder_3 = Instance.new("ScrollingFrame")
Example_3 = Instance.new("Frame")
Text_4 = Instance.new("TextLabel")
Delete_4 = Instance.new("TextButton")
Aliases = Instance.new("TextLabel")
PluginsFrame = Instance.new("Frame")
Close_4 = Instance.new("TextButton")
Add_3 = Instance.new("TextButton")
Holder_5 = Instance.new("ScrollingFrame")
Example_5 = Instance.new("Frame")
Text_6 = Instance.new("TextLabel")
Delete_7 = Instance.new("TextButton")
PluginEditor = Instance.new("Frame")
background_3 = Instance.new("Frame")
Dark_2 = Instance.new("Frame")
Img = Instance.new("ImageButton")
AddPlugin = Instance.new("TextButton")
FileName = Instance.new("TextBox")
About = Instance.new("TextLabel")
Directions_2 = Instance.new("TextLabel")
shadow_3 = Instance.new("Frame")
PopupText_3 = Instance.new("TextLabel")
Exit_3 = Instance.new("TextButton")
ExitImage_3 = Instance.new("ImageLabel")
AliasHint = Instance.new("TextLabel")
PluginsHint = Instance.new("TextLabel")
PositionsHint = Instance.new("TextLabel")
ToPartFrame = Instance.new("Frame")
background_4 = Instance.new("Frame")
ChoosePart = Instance.new("TextButton")
CopyPath = Instance.new("TextButton")
Directions_3 = Instance.new("TextLabel")
Path = Instance.new("TextLabel")
shadow_4 = Instance.new("Frame")
PopupText_5 = Instance.new("TextLabel")
Exit_4 = Instance.new("TextButton")
ExitImage_5 = Instance.new("ImageLabel")
logs = Instance.new("Frame")
shadow = Instance.new("Frame")
Hide = Instance.new("TextButton")
ImageLabel = Instance.new("ImageLabel")
PopupText = Instance.new("TextLabel")
Exit = Instance.new("TextButton")
ImageLabel_2 = Instance.new("ImageLabel")
background = Instance.new("Frame")
chat = Instance.new("Frame")
Clear = Instance.new("TextButton")
SaveChatlogs = Instance.new("TextButton")
Toggle = Instance.new("TextButton")
scroll_2 = Instance.new("ScrollingFrame")
join = Instance.new("Frame")
Toggle_2 = Instance.new("TextButton")
Clear_2 = Instance.new("TextButton")
scroll_3 = Instance.new("ScrollingFrame")
listlayout = Instance.new("UIListLayout",scroll_3)
selectChat = Instance.new("TextButton")
selectJoin = Instance.new("TextButton")

function randomString()
        local length = math.random(10,20)
        local array = {}
        for i = 1, length do
                array[i] = string.char(math.random(32, 126))
        end
        return table.concat(array)
end

PARENT = nil
MAX_DISPLAY_ORDER = 2147483647
if get_hidden_gui or gethui then
    local hiddenUI = get_hidden_gui or gethui
    local Main = Instance.new("ScreenGui")
    Main.Name = randomString()
    Main.ResetOnSpawn = false
    Main.DisplayOrder = MAX_DISPLAY_ORDER
    Main.Parent = hiddenUI()
    PARENT = Main
elseif (not is_sirhurt_closure) and (syn and syn.protect_gui) then
    local Main = Instance.new("ScreenGui")
    Main.Name = randomString()
    Main.ResetOnSpawn = false
    Main.DisplayOrder = MAX_DISPLAY_ORDER
    syn.protect_gui(Main)
    Main.Parent = COREGUI
    PARENT = Main
elseif COREGUI:FindFirstChild("RobloxGui") then
    PARENT = COREGUI.RobloxGui
else
    local Main = Instance.new("ScreenGui")
    Main.Name = randomString()
    Main.ResetOnSpawn = false
    Main.DisplayOrder = MAX_DISPLAY_ORDER
    Main.Parent = COREGUI
    PARENT = Main
end

shade1 = {}
shade2 = {}
shade3 = {}
text1 = {}
text2 = {}
scroll = {}

ScaledHolder.Name = randomString()
ScaledHolder.Size = UDim2.fromScale(1, 1)
ScaledHolder.BackgroundTransparency = 1
ScaledHolder.Parent = PARENT
Scale.Name = randomString()

Holder.Name = randomString()
Holder.Parent = ScaledHolder
Holder.Active = true
Holder.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Holder.BorderSizePixel = 0
Holder.Position = UDim2.new(1, -250, 1, -220)
Holder.Size = UDim2.new(0, 250, 0, 220)
Holder.ZIndex = 10
table.insert(shade2,Holder)

Title.Name = "Title"
Title.Parent = Holder
Title.Active = true
Title.BackgroundColor3 = Color3.fromRGB(36,36,37)
Title.BorderSizePixel = 0
Title.Size = UDim2.new(0, 250, 0, 20)
Title.Font = Enum.Font.SourceSans
Title.TextSize = 18
Title.Text = "Arc Yield FE v" .. currentVersion
        Title.TextColor3 = Color3.new(1, 1, 1)
        Title.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
        Title.TextStrokeTransparency = 0.5

do
        local emoji = ({
                ["01 01"] = "🎆",
                [(function(Year)
                        local A = math.floor(Year/100)
                        local B = math.floor((13+8*A)/25)
                        local C = (15-B+A-math.floor(A/4))%30
                        local D = (4+A-math.floor(A/4))%7
                        local E = (19*(Year%19)+C)%30
                        local F = (2*(Year%4)+4*(Year%7)+6*E+D)%7
                        local G = (22+E+F)
                        if E == 29 and F == 6 then
                                return "04 19"
                        elseif E == 28 and F == 6 then
                                return "04 18"
                        elseif 31 < G then
                                return ("04 %02d"):format(G-31)
                        end
                        return ("03 %02d"):format(G)
                end)(tonumber(os.date"%Y"))] = "🥚",
                ["10 31"] = "🎃",
                ["12 25"] = "🎄"
        })[os.date("%m %d")]
        if emoji then
                Title.Text = ("%s %s %s"):format(emoji, Title.Text, emoji)
        end
end

Title.TextColor3 = Color3.new(1, 1, 1)
Title.ZIndex = 10
table.insert(shade1,Title)
table.insert(text1,Title)

Dark.Name = "Dark"
Dark.Parent = Holder
Dark.Active = true
Dark.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
Dark.BorderSizePixel = 0
Dark.Position = UDim2.new(0, 0, 0, 45)
Dark.Size = UDim2.new(0, 250, 0, 175)
Dark.ZIndex = 10
table.insert(shade1,Dark)

Cmdbar.Name = "Cmdbar"
Cmdbar.Parent = Holder
Cmdbar.BackgroundTransparency = 1
Cmdbar.BorderSizePixel = 0
Cmdbar.Position = UDim2.new(0, 5, 0, 20)
Cmdbar.Size = UDim2.new(0, 240, 0, 25)
Cmdbar.Font = Enum.Font.SourceSans
Cmdbar.TextSize = 18
Cmdbar.TextXAlignment = Enum.TextXAlignment.Left
Cmdbar.TextColor3 = Color3.new(1, 1, 1)
Cmdbar.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
Cmdbar.TextStrokeTransparency = 0.5
Cmdbar.Text = ""
Cmdbar.ZIndex = 10
Cmdbar.PlaceholderText = "Command Bar"

CMDsF.Name = "CMDs"
CMDsF.Parent = Holder
CMDsF.BackgroundTransparency = 1
CMDsF.BorderSizePixel = 0
CMDsF.Position = UDim2.new(0, 5, 0, 45)
CMDsF.Size = UDim2.new(0, 245, 0, 175)
CMDsF.ScrollBarImageColor3 = Color3.fromRGB(78,78,79)
CMDsF.BottomImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
CMDsF.CanvasSize = UDim2.new(0, 0, 0, 0)
CMDsF.MidImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
CMDsF.ScrollBarThickness = 8
CMDsF.TopImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
CMDsF.VerticalScrollBarInset = 'Always'
CMDsF.ZIndex = 10
table.insert(scroll,CMDsF)

cmdListLayout.Parent = CMDsF

SettingsButton.Name = "SettingsButton"
SettingsButton.Parent = Holder
SettingsButton.BackgroundTransparency = 1
SettingsButton.Position = UDim2.new(0, 230, 0, 0)
SettingsButton.Size = UDim2.new(0, 20, 0, 20)
SettingsButton.Image = getcustomasset("infiniteyield/assets/settings.png")
SettingsButton.ZIndex = 10

ReferenceButton = Instance.new("ImageButton")
ReferenceButton.Name = "ReferenceButton"
ReferenceButton.Parent = Holder
ReferenceButton.BackgroundTransparency = 1
ReferenceButton.Position = UDim2.new(0, 212, 0, 2)
ReferenceButton.Size = UDim2.new(0, 16, 0, 16)
ReferenceButton.Image = getcustomasset("infiniteyield/assets/reference.png")
ReferenceButton.ZIndex = 10

Settings.Name = "Settings"
Settings.Parent = Holder
Settings.Active = true
Settings.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
Settings.BorderSizePixel = 0
Settings.Position = UDim2.new(0, 0, 0, 220)
Settings.Size = UDim2.new(0, 250, 0, 175)
Settings.ZIndex = 10
table.insert(shade1,Settings)

SettingsHolder = Instance.new("ScrollingFrame")
SettingsHolder.Name = "Holder"
SettingsHolder.Parent = Settings
SettingsHolder.BackgroundTransparency = 1
SettingsHolder.BorderSizePixel = 0
SettingsHolder.Size = UDim2.new(1,0,1,0)
SettingsHolder.ScrollBarImageColor3 = Color3.fromRGB(78,78,79)
SettingsHolder.BottomImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
SettingsHolder.CanvasSize = UDim2.new(0, 0, 0, 235)
SettingsHolder.MidImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
SettingsHolder.ScrollBarThickness = 8
SettingsHolder.TopImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
SettingsHolder.VerticalScrollBarInset = 'Always'
SettingsHolder.ZIndex = 10
table.insert(scroll,SettingsHolder)

Prefix.Name = "Prefix"
Prefix.Parent = SettingsHolder
Prefix.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Prefix.BorderSizePixel = 0
Prefix.BackgroundTransparency = 1
Prefix.Position = UDim2.new(0, 5, 0, 5)
Prefix.Size = UDim2.new(1, -10, 0, 20)
Prefix.Font = Enum.Font.SourceSans
Prefix.TextSize = 14
Prefix.Text = "Prefix"
Prefix.TextColor3 = Color3.new(1, 1, 1)
Prefix.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
Prefix.TextStrokeTransparency = 0.6
Prefix.TextXAlignment = Enum.TextXAlignment.Left
Prefix.ZIndex = 10
table.insert(shade2,Prefix)
table.insert(text1,Prefix)

PrefixBox.Name = "PrefixBox"
PrefixBox.Parent = Prefix
PrefixBox.BackgroundColor3 = Color3.fromRGB(78, 78, 79)
PrefixBox.BorderSizePixel = 0
PrefixBox.Position = UDim2.new(1, -20, 0, 0)
PrefixBox.Size = UDim2.new(0, 20, 0, 20)
PrefixBox.Font = Enum.Font.SourceSansBold
PrefixBox.TextSize = 14
PrefixBox.Text = ''
PrefixBox.TextColor3 = Color3.new(0, 0, 0)
PrefixBox.ZIndex = 10
table.insert(shade3,PrefixBox)
table.insert(text2,PrefixBox)

function makeSettingsButton(name,iconID,off)
        local button = Instance.new("TextButton")
        button.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
        button.BorderSizePixel = 0
        button.Position = UDim2.new(0,0,0,0)
        button.Size = UDim2.new(1,0,0,25)
        button.Text = ""
        button.ZIndex = 10
        local icon = Instance.new("ImageLabel")
        icon.Name = "Icon"
        icon.Parent = button
        icon.Position = UDim2.new(0,5,0,5)
        icon.Size = UDim2.new(0,16,0,16)
        icon.BackgroundTransparency = 1
        icon.Image = iconID
        icon.ZIndex = 10
        if off then
                icon.ScaleType = Enum.ScaleType.Crop
                icon.ImageRectSize = Vector2.new(16,16)
                icon.ImageRectOffset = Vector2.new(off,0)
        end
        local label = Instance.new("TextLabel")
        label.Name = "ButtonLabel"
        label.Parent = button
        label.BackgroundTransparency = 1
        label.Text = name
        label.Position = UDim2.new(0,28,0,0)
        label.Size = UDim2.new(1,-28,1,0)
        label.Font = Enum.Font.SourceSans
        label.TextColor3 = Color3.new(1, 1, 1)
        label.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
        label.TextStrokeTransparency = 0.6
        label.TextSize = 14
        label.ZIndex = 10
        label.TextXAlignment = Enum.TextXAlignment.Left
        table.insert(shade2,button)
        table.insert(text1,label)
        return button
end

ColorsButton = makeSettingsButton("Edit Theme",getcustomasset("infiniteyield/assets/edittheme.png"))
ColorsButton.Position = UDim2.new(0, 5, 0, 55)
ColorsButton.Size = UDim2.new(1, -10, 0, 25)
ColorsButton.Name = "Colors"
ColorsButton.Parent = SettingsHolder

Keybinds = makeSettingsButton("Edit Keybinds",getcustomasset("infiniteyield/assets/editkeybinds.png"))
Keybinds.Position = UDim2.new(0, 5, 0, 85)
Keybinds.Size = UDim2.new(1, -10, 0, 25)
Keybinds.Name = "Keybinds"
Keybinds.Parent = SettingsHolder

Aliases = makeSettingsButton("Edit Aliases",getcustomasset("infiniteyield/assets/editaliases.png"))
Aliases.Position = UDim2.new(0, 5, 0, 115)
Aliases.Size = UDim2.new(1, -10, 0, 25)
Aliases.Name = "Aliases"
Aliases.Parent = SettingsHolder

StayOpen.Name = "StayOpen"
StayOpen.Parent = SettingsHolder
StayOpen.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
StayOpen.BorderSizePixel = 0
StayOpen.BackgroundTransparency = 1
StayOpen.Position = UDim2.new(0, 5, 0, 30)
StayOpen.Size = UDim2.new(1, -10, 0, 20)
StayOpen.Font = Enum.Font.SourceSans
StayOpen.TextSize = 14
StayOpen.Text = "Keep Menu Open"
StayOpen.TextColor3 = Color3.new(1, 1, 1)
StayOpen.TextXAlignment = Enum.TextXAlignment.Left
StayOpen.ZIndex = 10
table.insert(shade2,StayOpen)
table.insert(text1,StayOpen)

Button.Name = "Button"
Button.Parent = StayOpen
Button.BackgroundColor3 = Color3.fromRGB(78, 78, 79)
Button.BorderSizePixel = 0
Button.Position = UDim2.new(1, -20, 0, 0)
Button.Size = UDim2.new(0, 20, 0, 20)
Button.ZIndex = 10
table.insert(shade3,Button)

On.Name = "On"
On.Parent = Button
On.BackgroundColor3 = Color3.fromRGB(150, 150, 151)
On.BackgroundTransparency = 1
On.BorderSizePixel = 0
On.Position = UDim2.new(0, 2, 0, 2)
On.Size = UDim2.new(0, 16, 0, 16)
On.Font = Enum.Font.SourceSans
On.FontSize = Enum.FontSize.Size14
On.Text = ""
On.TextColor3 = Color3.new(0, 0, 0)
On.ZIndex = 10

Positions = makeSettingsButton("Edit/Goto Waypoints",getcustomasset("infiniteyield/assets/editwaypoints.png"))
Positions.Position = UDim2.new(0, 5, 0, 145)
Positions.Size = UDim2.new(1, -10, 0, 25)
Positions.Name = "Waypoints"
Positions.Parent = SettingsHolder

EventBind = makeSettingsButton("Edit Event Binds",getcustomasset("infiniteyield/assets/bindsandplugins.png"),759)
EventBind.Position = UDim2.new(0, 5, 0, 205)
EventBind.Size = UDim2.new(1, -10, 0, 25)
EventBind.Name = "EventBinds"
EventBind.Parent = SettingsHolder

Plugins = makeSettingsButton("Manage Plugins",getcustomasset("infiniteyield/assets/bindsandplugins.png"),743)
Plugins.Position = UDim2.new(0, 5, 0, 175)
Plugins.Size = UDim2.new(1, -10, 0, 25)
Plugins.Name = "Plugins"
Plugins.Parent = SettingsHolder

Example.Name = "Example"
Example.Parent = Holder
Example.BackgroundTransparency = 1
Example.BorderSizePixel = 0
Example.Size = UDim2.new(0, 190, 0, 20)
Example.Visible = false
Example.Font = Enum.Font.SourceSans
Example.TextSize = 18
Example.Text = "Example"
Example.TextColor3 = Color3.new(1, 1, 1)
Example.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
Example.TextStrokeTransparency = 0.6
Example.TextXAlignment = Enum.TextXAlignment.Left
Example.ZIndex = 10
table.insert(text1,Example)

Notification.Name = randomString()
Notification.Parent = ScaledHolder
Notification.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
Notification.BorderSizePixel = 0
Notification.Position = UDim2.new(1, -500, 1, 20)
Notification.Size = UDim2.new(0, 250, 0, 100)
Notification.ZIndex = 10
table.insert(shade1,Notification)

Title_2.Name = "Title"
Title_2.Parent = Notification
Title_2.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Title_2.BorderSizePixel = 0
Title_2.Size = UDim2.new(0, 250, 0, 20)
Title_2.Font = Enum.Font.SourceSans
Title_2.TextSize = 14
Title_2.Text = "Notification Title"
Title_2.TextColor3 = Color3.new(1, 1, 1)
Title_2.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
Title_2.TextStrokeTransparency = 0.5
Title_2.ZIndex = 10
table.insert(shade2,Title_2)
table.insert(text1,Title_2)

Text_2.Name = "Text"
Text_2.Parent = Notification
Text_2.BackgroundTransparency = 1
Text_2.BorderSizePixel = 0
Text_2.Position = UDim2.new(0, 5, 0, 25)
Text_2.Size = UDim2.new(0, 240, 0, 75)
Text_2.Font = Enum.Font.SourceSans
Text_2.TextSize = 16
Text_2.Text = "Notification Text"
Text_2.TextColor3 = Color3.new(1, 1, 1)
Text_2.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
Text_2.TextStrokeTransparency = 0.5
Text_2.TextWrapped = true
Text_2.ZIndex = 10
table.insert(text1,Text_2)

CloseButton.Name = "CloseButton"
CloseButton.Parent = Notification
CloseButton.BackgroundTransparency = 1
CloseButton.Position = UDim2.new(1, -20, 0, 0)
CloseButton.Size = UDim2.new(0, 20, 0, 20)
CloseButton.Text = ""
CloseButton.ZIndex = 10

CloseImage.Parent = CloseButton
CloseImage.BackgroundColor3 = Color3.new(1, 1, 1)
CloseImage.BackgroundTransparency = 1
CloseImage.Position = UDim2.new(0, 5, 0, 5)
CloseImage.Size = UDim2.new(0, 10, 0, 10)
CloseImage.Image = getcustomasset("infiniteyield/assets/close.png")
CloseImage.ZIndex = 10

PinButton.Name = "PinButton"
PinButton.Parent = Notification
PinButton.BackgroundTransparency = 1
PinButton.Size = UDim2.new(0, 20, 0, 20)
PinButton.ZIndex = 10
PinButton.Text = ""

PinImage.Parent = PinButton
PinImage.BackgroundColor3 = Color3.new(1, 1, 1)
PinImage.BackgroundTransparency = 1
PinImage.Position = UDim2.new(0, 3, 0, 3)
PinImage.Size = UDim2.new(0, 14, 0, 14)
PinImage.ZIndex = 10
PinImage.Image = getcustomasset("infiniteyield/assets/pin.png")

Tooltip.Name = randomString()
Tooltip.Parent = ScaledHolder
Tooltip.Active = true
Tooltip.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
Tooltip.BackgroundTransparency = 0.1
Tooltip.BorderSizePixel = 0
Tooltip.Size = UDim2.new(0, 200, 0, 96)
Tooltip.Visible = false
Tooltip.ZIndex = 10
table.insert(shade1,Tooltip)

Title_3.Name = "Title"
Title_3.Parent = Tooltip
Title_3.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Title_3.BackgroundTransparency = 0.1
Title_3.BorderSizePixel = 0
Title_3.Size = UDim2.new(0, 200, 0, 20)
Title_3.Font = Enum.Font.SourceSans
Title_3.TextSize = 14
Title_3.Text = ""
Title_3.TextColor3 = Color3.new(1, 1, 1)
Title_3.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
Title_3.TextStrokeTransparency = 0.5
Title_3.TextTransparency = 0.1
Title_3.ZIndex = 10
table.insert(shade2,Title_3)
table.insert(text1,Title_3)

Description.Name = "Description"
Description.Parent = Tooltip
Description.BackgroundTransparency = 1
Description.BorderSizePixel = 0
Description.Size = UDim2.new(0,180,0,72)
Description.Position = UDim2.new(0,10,0,18)
Description.Font = Enum.Font.SourceSans
Description.TextSize = 16
Description.Text = ""
Description.TextColor3 = Color3.new(1, 1, 1)
Description.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
Description.TextStrokeTransparency = 0.5
Description.TextTransparency = 0.1
Description.TextWrapped = true
Description.ZIndex = 10
table.insert(text1,Description)

IntroBackground.Name = "IntroBackground"
IntroBackground.Parent = Holder
IntroBackground.Active = true
IntroBackground.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
IntroBackground.BorderSizePixel = 0
IntroBackground.Position = UDim2.new(0, 0, 0, 45)
IntroBackground.Size = UDim2.new(0, 250, 0, 175)
IntroBackground.ZIndex = 10

Logo.Name = "Logo"
Logo.Parent = Holder
Logo.BackgroundTransparency = 1
Logo.BorderSizePixel = 0
Logo.Position = UDim2.new(0, 125, 0, 127)
Logo.Size = UDim2.new(0, 10, 0, 10)
Logo.Image = getcustomasset("infiniteyield/assets/logo.png")
Logo.ImageTransparency = 0
Logo.ZIndex = 10

Credits.Name = "Credits"
Credits.Parent = Holder
Credits.BackgroundTransparency = 1
Credits.BorderSizePixel = 0
Credits.Position = UDim2.new(0, 0, 0.9, 30)
Credits.Size = UDim2.new(0, 250, 0, 20)
Credits.Font = Enum.Font.SourceSansLight
Credits.FontSize = Enum.FontSize.Size14
Credits.Text = "Edge // Zwolf // Moon // Toon // Peyton // ATP"
Credits.TextColor3 = Color3.new(1, 1, 1)
Credits.ZIndex = 10

KeybindsFrame.Name = "KeybindsFrame"
KeybindsFrame.Parent = Settings
KeybindsFrame.Active = true
KeybindsFrame.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
KeybindsFrame.BorderSizePixel = 0
KeybindsFrame.Position = UDim2.new(0, 0, 0, 175)
KeybindsFrame.Size = UDim2.new(0, 250, 0, 175)
KeybindsFrame.ZIndex = 10
table.insert(shade1,KeybindsFrame)

Close.Name = "Close"
Close.Parent = KeybindsFrame
Close.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Close.BorderSizePixel = 0
Close.Position = UDim2.new(0, 205, 0, 150)
Close.Size = UDim2.new(0, 40, 0, 20)
Close.Font = Enum.Font.SourceSans
Close.TextSize = 14
Close.Text = "Close"
Close.TextColor3 = Color3.new(1, 1, 1)
Close.ZIndex = 10
table.insert(shade2,Close)
table.insert(text1,Close)

Add.Name = "Add"
Add.Parent = KeybindsFrame
Add.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Add.BorderSizePixel = 0
Add.Position = UDim2.new(0, 5, 0, 150)
Add.Size = UDim2.new(0, 40, 0, 20)
Add.Font = Enum.Font.SourceSans
Add.TextSize = 14
Add.Text = "Add"
Add.TextColor3 = Color3.new(1, 1, 1)
Add.ZIndex = 10
table.insert(shade2,Add)
table.insert(text1,Add)

Delete.Name = "Delete"
Delete.Parent = KeybindsFrame
Delete.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Delete.BorderSizePixel = 0
Delete.Position = UDim2.new(0, 50, 0, 150)
Delete.Size = UDim2.new(0, 40, 0, 20)
Delete.Font = Enum.Font.SourceSans
Delete.TextSize = 14
Delete.Text = "Clear"
Delete.TextColor3 = Color3.new(1, 1, 1)
Delete.ZIndex = 10
table.insert(shade2,Delete)
table.insert(text1,Delete)

Holder_2.Name = "Holder"
Holder_2.Parent = KeybindsFrame
Holder_2.BackgroundTransparency = 1
Holder_2.BorderSizePixel = 0
Holder_2.Position = UDim2.new(0, 0, 0, 0)
Holder_2.Size = UDim2.new(0, 250, 0, 145)
Holder_2.ScrollBarImageColor3 = Color3.fromRGB(78,78,79)
Holder_2.BottomImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Holder_2.CanvasSize = UDim2.new(0, 0, 0, 0)
Holder_2.MidImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Holder_2.ScrollBarThickness = 0
Holder_2.TopImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Holder_2.VerticalScrollBarInset = 'Always'
Holder_2.ZIndex = 10

Example_2.Name = "Example"
Example_2.Parent = KeybindsFrame
Example_2.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Example_2.BorderSizePixel = 0
Example_2.Size = UDim2.new(0, 10, 0, 20)
Example_2.Visible = false
Example_2.ZIndex = 10
table.insert(shade2,Example_2)

Text_3.Name = "Text"
Text_3.Parent = Example_2
Text_3.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Text_3.BorderSizePixel = 0
Text_3.Position = UDim2.new(0, 10, 0, 0)
Text_3.Size = UDim2.new(0, 240, 0, 20)
Text_3.Font = Enum.Font.SourceSans
Text_3.TextSize = 14
Text_3.Text = "nom"
Text_3.TextColor3 = Color3.new(1, 1, 1)
Text_3.TextXAlignment = Enum.TextXAlignment.Left
Text_3.ZIndex = 10
table.insert(shade2,Text_3)
table.insert(text1,Text_3)

Delete_2.Name = "Delete"
Delete_2.Parent = Text_3
Delete_2.BackgroundColor3 = Color3.fromRGB(78, 78, 79)
Delete_2.BorderSizePixel = 0
Delete_2.Position = UDim2.new(0, 200, 0, 0)
Delete_2.Size = UDim2.new(0, 40, 0, 20)
Delete_2.Font = Enum.Font.SourceSans
Delete_2.TextSize = 14
Delete_2.Text = "Delete"
Delete_2.TextColor3 = Color3.new(0, 0, 0)
Delete_2.ZIndex = 10
table.insert(shade3,Delete_2)
table.insert(text2,Delete_2)

KeybindEditor.Name = randomString()
KeybindEditor.Parent = ScaledHolder
KeybindEditor.Active = true
KeybindEditor.BackgroundTransparency = 1
KeybindEditor.Position = UDim2.new(0.5, -180, 0, -500)
KeybindEditor.Size = UDim2.new(0, 360, 0, 20)
KeybindEditor.ZIndex = 10

background_2.Name = "background"
background_2.Parent = KeybindEditor
background_2.Active = true
background_2.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
background_2.BorderSizePixel = 0
background_2.Position = UDim2.new(0, 0, 0, 20)
background_2.Size = UDim2.new(0, 360, 0, 185)
background_2.ZIndex = 10
table.insert(shade1,background_2)

Dark_3.Name = "Dark"
Dark_3.Parent = background_2
Dark_3.Active = true
Dark_3.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Dark_3.BorderSizePixel = 0
Dark_3.Position = UDim2.new(0, 135, 0, 0)
Dark_3.Size = UDim2.new(0, 2, 0, 185)
Dark_3.ZIndex = 10
table.insert(shade2,Dark_3)

Directions.Name = "Directions"
Directions.Parent = background_2
Directions.BackgroundTransparency = 1
Directions.BorderSizePixel = 0
Directions.Position = UDim2.new(0, 10, 0, 15)
Directions.Size = UDim2.new(0, 115, 0, 90)
Directions.ZIndex = 10
Directions.Font = Enum.Font.SourceSans
Directions.Text = "Click the button below and press a key/mouse button. Then select what you want to bind it to."
Directions.TextColor3 = Color3.fromRGB(255, 255, 255)
Directions.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
Directions.TextStrokeTransparency = 0.5
Directions.TextSize = 14.000
Directions.TextWrapped = true
Directions.TextYAlignment = Enum.TextYAlignment.Top
table.insert(text1,Directions)

BindTo.Name = "BindTo"
BindTo.Parent = background_2
BindTo.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
BindTo.BorderSizePixel = 0
BindTo.Position = UDim2.new(0, 10, 0, 95)
BindTo.Size = UDim2.new(0, 115, 0, 50)
BindTo.ZIndex = 10
BindTo.Font = Enum.Font.SourceSans
BindTo.Text = "Click to bind"
BindTo.TextColor3 = Color3.fromRGB(255, 255, 255)
BindTo.TextSize = 16.000
table.insert(shade2,BindTo)
table.insert(text1,BindTo)

TriggerLabel.Name = "TriggerLabel"
TriggerLabel.Parent = background_2
TriggerLabel.BackgroundTransparency = 1
TriggerLabel.Position = UDim2.new(0, 10, 0, 155)
TriggerLabel.Size = UDim2.new(0, 45, 0, 20)
TriggerLabel.ZIndex = 10
TriggerLabel.Font = Enum.Font.SourceSans
TriggerLabel.Text = "Trigger:"
TriggerLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
TriggerLabel.TextSize = 14.000
TriggerLabel.TextXAlignment = Enum.TextXAlignment.Left
table.insert(text1,TriggerLabel)

BindTriggerSelect.Name = "BindTo"
BindTriggerSelect.Parent = background_2
BindTriggerSelect.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
BindTriggerSelect.BorderSizePixel = 0
BindTriggerSelect.Position = UDim2.new(0, 60, 0, 155)
BindTriggerSelect.Size = UDim2.new(0, 65, 0, 20)
BindTriggerSelect.ZIndex = 10
BindTriggerSelect.Font = Enum.Font.SourceSans
BindTriggerSelect.Text = "KeyDown"
BindTriggerSelect.TextColor3 = Color3.fromRGB(255, 255, 255)
BindTriggerSelect.TextSize = 16.000
table.insert(shade2,BindTriggerSelect)
table.insert(text1,BindTriggerSelect)

Add_2.Name = "Add"
Add_2.Parent = background_2
Add_2.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Add_2.BorderSizePixel = 0
Add_2.Position = UDim2.new(0, 310, 0, 35)
Add_2.Size = UDim2.new(0, 40, 0, 20)
Add_2.ZIndex = 10
Add_2.Font = Enum.Font.SourceSans
Add_2.Text = "Add"
Add_2.TextColor3 = Color3.fromRGB(255, 255, 255)
Add_2.TextSize = 14.000
table.insert(shade2,Add_2)
table.insert(text1,Add_2)

Toggles.Name = "Toggles"
Toggles.Parent = background_2
Toggles.BackgroundTransparency = 1
Toggles.BorderSizePixel = 0
Toggles.Position = UDim2.new(0, 150, 0, 125)
Toggles.Size = UDim2.new(0, 200, 0, 50)
Toggles.ZIndex = 10
Toggles.BottomImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Toggles.CanvasSize = UDim2.new(0, 0, 0, 50)
Toggles.ScrollBarThickness = 8
Toggles.TopImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Toggles.VerticalScrollBarInset = Enum.ScrollBarInset.Always
table.insert(scroll,Toggles)

ClickTP.Name = "Click TP (Hold Key & Click)"
ClickTP.Parent = Toggles
ClickTP.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
ClickTP.BorderSizePixel = 0
ClickTP.Size = UDim2.new(0, 200, 0, 20)
ClickTP.ZIndex = 10
ClickTP.Font = Enum.Font.SourceSans
ClickTP.Text = "    Click TP (Hold Key & Click)"
ClickTP.TextColor3 = Color3.fromRGB(255, 255, 255)
ClickTP.TextSize = 14.000
ClickTP.TextXAlignment = Enum.TextXAlignment.Left
table.insert(shade2,ClickTP)
table.insert(text1,ClickTP)

Select.Name = "Select"
Select.Parent = ClickTP
Select.BackgroundColor3 = Color3.fromRGB(78, 78, 79)
Select.BorderSizePixel = 0
Select.Position = UDim2.new(0, 160, 0, 0)
Select.Size = UDim2.new(0, 40, 0, 20)
Select.ZIndex = 10
Select.Font = Enum.Font.SourceSans
Select.Text = "Add"
Select.TextColor3 = Color3.fromRGB(0, 0, 0)
Select.TextSize = 14.000
table.insert(shade3,Select)
table.insert(text2,Select)

ClickDelete.Name = "Click Delete (Hold Key & Click)"
ClickDelete.Parent = Toggles
ClickDelete.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
ClickDelete.BorderSizePixel = 0
ClickDelete.Position = UDim2.new(0, 0, 0, 25)
ClickDelete.Size = UDim2.new(0, 200, 0, 20)
ClickDelete.ZIndex = 10
ClickDelete.Font = Enum.Font.SourceSans
ClickDelete.Text = "    Click Delete (Hold Key & Click)"
ClickDelete.TextColor3 = Color3.fromRGB(255, 255, 255)
ClickDelete.TextSize = 14.000
ClickDelete.TextXAlignment = Enum.TextXAlignment.Left
table.insert(shade2,ClickDelete)
table.insert(text1,ClickDelete)

Select_2.Name = "Select"
Select_2.Parent = ClickDelete
Select_2.BackgroundColor3 = Color3.fromRGB(78, 78, 79)
Select_2.BorderSizePixel = 0
Select_2.Position = UDim2.new(0, 160, 0, 0)
Select_2.Size = UDim2.new(0, 40, 0, 20)
Select_2.ZIndex = 10
Select_2.Font = Enum.Font.SourceSans
Select_2.Text = "Add"
Select_2.TextColor3 = Color3.fromRGB(0, 0, 0)
Select_2.TextSize = 14.000
table.insert(shade3,Select_2)
table.insert(text2,Select_2)

Cmdbar_2.Name = "Cmdbar_2"
Cmdbar_2.Parent = background_2
Cmdbar_2.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Cmdbar_2.BorderSizePixel = 0
Cmdbar_2.Position = UDim2.new(0, 150, 0, 35)
Cmdbar_2.Size = UDim2.new(0, 150, 0, 20)
Cmdbar_2.ZIndex = 10
Cmdbar_2.Font = Enum.Font.SourceSans
Cmdbar_2.PlaceholderText = "Command"
Cmdbar_2.Text = ""
Cmdbar_2.TextColor3 = Color3.fromRGB(255, 255, 255)
Cmdbar_2.TextSize = 14.000
Cmdbar_2.TextXAlignment = Enum.TextXAlignment.Left

Cmdbar_3.Name = "Cmdbar_3"
Cmdbar_3.Parent = background_2
Cmdbar_3.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Cmdbar_3.BorderSizePixel = 0
Cmdbar_3.Position = UDim2.new(0, 150, 0, 60)
Cmdbar_3.Size = UDim2.new(0, 150, 0, 20)
Cmdbar_3.ZIndex = 10
Cmdbar_3.Font = Enum.Font.SourceSans
Cmdbar_3.PlaceholderText = "Command 2"
Cmdbar_3.Text = ""
Cmdbar_3.TextColor3 = Color3.fromRGB(255, 255, 255)
Cmdbar_3.TextSize = 14.000
Cmdbar_3.TextXAlignment = Enum.TextXAlignment.Left

CreateToggle.Name = "CreateToggle"
CreateToggle.Parent = background_2
CreateToggle.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
CreateToggle.BackgroundTransparency = 1
CreateToggle.BorderSizePixel = 0
CreateToggle.Position = UDim2.new(0, 152, 0, 10)
CreateToggle.Size = UDim2.new(0, 198, 0, 20)
CreateToggle.ZIndex = 10
CreateToggle.Font = Enum.Font.SourceSans
CreateToggle.Text = "Create Toggle"
CreateToggle.TextColor3 = Color3.fromRGB(255, 255, 255)
CreateToggle.TextSize = 14.000
CreateToggle.TextXAlignment = Enum.TextXAlignment.Left
table.insert(text1,CreateToggle)

Button_2.Name = "Button"
Button_2.Parent = CreateToggle
Button_2.BackgroundColor3 = Color3.fromRGB(78, 78, 79)
Button_2.BorderSizePixel = 0
Button_2.Position = UDim2.new(1, -20, 0, 0)
Button_2.Size = UDim2.new(0, 20, 0, 20)
Button_2.ZIndex = 10
table.insert(shade3,Button_2)

On_2.Name = "On"
On_2.Parent = Button_2
On_2.BackgroundColor3 = Color3.fromRGB(150, 150, 151)
On_2.BackgroundTransparency = 1
On_2.BorderSizePixel = 0
On_2.Position = UDim2.new(0, 2, 0, 2)
On_2.Size = UDim2.new(0, 16, 0, 16)
On_2.ZIndex = 10
On_2.Font = Enum.Font.SourceSans
On_2.Text = ""
On_2.TextColor3 = Color3.fromRGB(0, 0, 0)
On_2.TextSize = 14.000

shadow_2.Name = "shadow"
shadow_2.Parent = KeybindEditor
shadow_2.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
shadow_2.BorderSizePixel = 0
shadow_2.Size = UDim2.new(0, 360, 0, 20)
shadow_2.ZIndex = 10
table.insert(shade2,shadow_2)

PopupText_2.Name = "PopupText_2"
PopupText_2.Parent = shadow_2
PopupText_2.BackgroundTransparency = 1
PopupText_2.Size = UDim2.new(1, 0, 0.949999988, 0)
PopupText_2.ZIndex = 10
PopupText_2.Font = Enum.Font.SourceSans
PopupText_2.Text = "Set Keybinds"
PopupText_2.TextColor3 = Color3.fromRGB(255, 255, 255)
PopupText_2.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
PopupText_2.TextStrokeTransparency = 0.5
PopupText_2.TextSize = 14.000
PopupText_2.TextWrapped = true
table.insert(text1,PopupText_2)

Exit_2.Name = "Exit_2"
Exit_2.Parent = shadow_2
Exit_2.BackgroundTransparency = 1
Exit_2.Position = UDim2.new(1, -20, 0, 0)
Exit_2.Size = UDim2.new(0, 20, 0, 20)
Exit_2.ZIndex = 10
Exit_2.Text = ""

ExitImage_2.Parent = Exit_2
ExitImage_2.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
ExitImage_2.BackgroundTransparency = 1
ExitImage_2.Position = UDim2.new(0, 5, 0, 5)
ExitImage_2.Size = UDim2.new(0, 10, 0, 10)
ExitImage_2.ZIndex = 10
ExitImage_2.Image = getcustomasset("infiniteyield/assets/close.png")

PositionsFrame.Name = "PositionsFrame"
PositionsFrame.Parent = Settings
PositionsFrame.Active = true
PositionsFrame.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
PositionsFrame.BorderSizePixel = 0
PositionsFrame.Size = UDim2.new(0, 250, 0, 175)
PositionsFrame.Position = UDim2.new(0, 0, 0, 175)
PositionsFrame.ZIndex = 10
table.insert(shade1,PositionsFrame)

Close_3.Name = "Close"
Close_3.Parent = PositionsFrame
Close_3.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Close_3.BorderSizePixel = 0
Close_3.Position = UDim2.new(0, 205, 0, 150)
Close_3.Size = UDim2.new(0, 40, 0, 20)
Close_3.Font = Enum.Font.SourceSans
Close_3.TextSize = 14
Close_3.Text = "Close"
Close_3.TextColor3 = Color3.new(1, 1, 1)
Close_3.ZIndex = 10
table.insert(shade2,Close_3)
table.insert(text1,Close_3)

Delete_5.Name = "Delete"
Delete_5.Parent = PositionsFrame
Delete_5.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Delete_5.BorderSizePixel = 0
Delete_5.Position = UDim2.new(0, 50, 0, 150)
Delete_5.Size = UDim2.new(0, 40, 0, 20)
Delete_5.Font = Enum.Font.SourceSans
Delete_5.TextSize = 14
Delete_5.Text = "Clear"
Delete_5.TextColor3 = Color3.new(1, 1, 1)
Delete_5.ZIndex = 10
table.insert(shade2,Delete_5)
table.insert(text1,Delete_5)

Part.Name = "PartGoto"
Part.Parent = PositionsFrame
Part.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Part.BorderSizePixel = 0
Part.Position = UDim2.new(0, 5, 0, 150)
Part.Size = UDim2.new(0, 40, 0, 20)
Part.Font = Enum.Font.SourceSans
Part.TextSize = 14
Part.Text = "Part"
Part.TextColor3 = Color3.new(1, 1, 1)
Part.ZIndex = 10
table.insert(shade2,Part)
table.insert(text1,Part)

Holder_4.Name = "Holder"
Holder_4.Parent = PositionsFrame
Holder_4.BackgroundTransparency = 1
Holder_4.BorderSizePixel = 0
Holder_4.Position = UDim2.new(0, 0, 0, 0)
Holder_4.Selectable = false
Holder_4.Size = UDim2.new(0, 250, 0, 145)
Holder_4.ScrollBarImageColor3 = Color3.fromRGB(78,78,79)
Holder_4.BottomImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Holder_4.CanvasSize = UDim2.new(0, 0, 0, 0)
Holder_4.MidImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Holder_4.ScrollBarThickness = 0
Holder_4.TopImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Holder_4.VerticalScrollBarInset = 'Always'
Holder_4.ZIndex = 10

Example_4.Name = "Example"
Example_4.Parent = PositionsFrame
Example_4.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Example_4.BorderSizePixel = 0
Example_4.Size = UDim2.new(0, 10, 0, 20)
Example_4.Visible = false
Example_4.Position = UDim2.new(0, 0, 0, -5)
Example_4.ZIndex = 10
table.insert(shade2,Example_4)

Text_5.Name = "Text"
Text_5.Parent = Example_4
Text_5.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Text_5.BorderSizePixel = 0
Text_5.Position = UDim2.new(0, 10, 0, 0)
Text_5.Size = UDim2.new(0, 240, 0, 20)
Text_5.Font = Enum.Font.SourceSans
Text_5.TextSize = 14
Text_5.Text = "Position"
Text_5.TextColor3 = Color3.new(1, 1, 1)
Text_5.TextXAlignment = Enum.TextXAlignment.Left
Text_5.ZIndex = 10
table.insert(shade2,Text_5)
table.insert(text1,Text_5)

Delete_6.Name = "Delete"
Delete_6.Parent = Text_5
Delete_6.BackgroundColor3 = Color3.fromRGB(78, 78, 79)
Delete_6.BorderSizePixel = 0
Delete_6.Position = UDim2.new(0, 200, 0, 0)
Delete_6.Size = UDim2.new(0, 40, 0, 20)
Delete_6.Font = Enum.Font.SourceSans
Delete_6.TextSize = 14
Delete_6.Text = "Delete"
Delete_6.TextColor3 = Color3.new(0, 0, 0)
Delete_6.ZIndex = 10
table.insert(shade3,Delete_6)
table.insert(text2,Delete_6)

TP.Name = "TP"
TP.Parent = Text_5
TP.BackgroundColor3 = Color3.fromRGB(78, 78, 79)
TP.BorderSizePixel = 0
TP.Position = UDim2.new(0, 155, 0, 0)
TP.Size = UDim2.new(0, 40, 0, 20)
TP.Font = Enum.Font.SourceSans
TP.TextSize = 14
TP.Text = "Goto"
TP.TextColor3 = Color3.new(0, 0, 0)
TP.ZIndex = 10
table.insert(shade3,TP)
table.insert(text2,TP)

AliasesFrame.Name = "AliasesFrame"
AliasesFrame.Parent = Settings
AliasesFrame.Active = true
AliasesFrame.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
AliasesFrame.BorderSizePixel = 0
AliasesFrame.Position = UDim2.new(0, 0, 0, 175)
AliasesFrame.Size = UDim2.new(0, 250, 0, 175)
AliasesFrame.ZIndex = 10
table.insert(shade1,AliasesFrame)

Close_2.Name = "Close"
Close_2.Parent = AliasesFrame
Close_2.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Close_2.BorderSizePixel = 0
Close_2.Position = UDim2.new(0, 205, 0, 150)
Close_2.Size = UDim2.new(0, 40, 0, 20)
Close_2.Font = Enum.Font.SourceSans
Close_2.TextSize = 14
Close_2.Text = "Close"
Close_2.TextColor3 = Color3.new(1, 1, 1)
Close_2.ZIndex = 10
table.insert(shade2,Close_2)
table.insert(text1,Close_2)

Delete_3.Name = "Delete"
Delete_3.Parent = AliasesFrame
Delete_3.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Delete_3.BorderSizePixel = 0
Delete_3.Position = UDim2.new(0, 5, 0, 150)
Delete_3.Size = UDim2.new(0, 40, 0, 20)
Delete_3.Font = Enum.Font.SourceSans
Delete_3.TextSize = 14
Delete_3.Text = "Clear"
Delete_3.TextColor3 = Color3.new(1, 1, 1)
Delete_3.ZIndex = 10
table.insert(shade2,Delete_3)
table.insert(text1,Delete_3)

Holder_3.Name = "Holder"
Holder_3.Parent = AliasesFrame
Holder_3.BackgroundTransparency = 1
Holder_3.BorderSizePixel = 0
Holder_3.Position = UDim2.new(0, 0, 0, 0)
Holder_3.Size = UDim2.new(0, 250, 0, 145)
Holder_3.ScrollBarImageColor3 = Color3.fromRGB(78,78,79)
Holder_3.BottomImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Holder_3.CanvasSize = UDim2.new(0, 0, 0, 0)
Holder_3.MidImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Holder_3.ScrollBarThickness = 0
Holder_3.TopImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Holder_3.VerticalScrollBarInset = 'Always'
Holder_3.ZIndex = 10

Example_3.Name = "Example"
Example_3.Parent = AliasesFrame
Example_3.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Example_3.BorderSizePixel = 0
Example_3.Size = UDim2.new(0, 10, 0, 20)
Example_3.Visible = false
Example_3.ZIndex = 10
table.insert(shade2,Example_3)

Text_4.Name = "Text"
Text_4.Parent = Example_3
Text_4.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Text_4.BorderSizePixel = 0
Text_4.Position = UDim2.new(0, 10, 0, 0)
Text_4.Size = UDim2.new(0, 240, 0, 20)
Text_4.Font = Enum.Font.SourceSans
Text_4.TextSize = 14
Text_4.Text = "honk"
Text_4.TextColor3 = Color3.new(1, 1, 1)
Text_4.TextXAlignment = Enum.TextXAlignment.Left
Text_4.ZIndex = 10
table.insert(shade2,Text_4)
table.insert(text1,Text_4)

Delete_4.Name = "Delete"
Delete_4.Parent = Text_4
Delete_4.BackgroundColor3 = Color3.fromRGB(78, 78, 79)
Delete_4.BorderSizePixel = 0
Delete_4.Position = UDim2.new(0, 200, 0, 0)
Delete_4.Size = UDim2.new(0, 40, 0, 20)
Delete_4.Font = Enum.Font.SourceSans
Delete_4.TextSize = 14
Delete_4.Text = "Delete"
Delete_4.TextColor3 = Color3.new(0, 0, 0)
Delete_4.ZIndex = 10
table.insert(shade3,Delete_4)
table.insert(text2,Delete_4)

PluginsFrame.Name = "PluginsFrame"
PluginsFrame.Parent = Settings
PluginsFrame.Active = true
PluginsFrame.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
PluginsFrame.BorderSizePixel = 0
PluginsFrame.Position = UDim2.new(0, 0, 0, 175)
PluginsFrame.Size = UDim2.new(0, 250, 0, 175)
PluginsFrame.ZIndex = 10
table.insert(shade1,PluginsFrame)

Close_4.Name = "Close"
Close_4.Parent = PluginsFrame
Close_4.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Close_4.BorderSizePixel = 0
Close_4.Position = UDim2.new(0, 205, 0, 150)
Close_4.Size = UDim2.new(0, 40, 0, 20)
Close_4.Font = Enum.Font.SourceSans
Close_4.TextSize = 14
Close_4.Text = "Close"
Close_4.TextColor3 = Color3.new(1, 1, 1)
Close_4.ZIndex = 10
table.insert(shade2,Close_4)
table.insert(text1,Close_4)

Add_3.Name = "Add"
Add_3.Parent = PluginsFrame
Add_3.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Add_3.BorderSizePixel = 0
Add_3.Position = UDim2.new(0, 5, 0, 150)
Add_3.Size = UDim2.new(0, 40, 0, 20)
Add_3.Font = Enum.Font.SourceSans
Add_3.TextSize = 14
Add_3.Text = "Add"
Add_3.TextColor3 = Color3.new(1, 1, 1)
Add_3.ZIndex = 10
table.insert(shade2,Add_3)
table.insert(text1,Add_3)

Holder_5.Name = "Holder"
Holder_5.Parent = PluginsFrame
Holder_5.BackgroundTransparency = 1
Holder_5.BorderSizePixel = 0
Holder_5.Position = UDim2.new(0, 0, 0, 0)
Holder_5.Selectable = false
Holder_5.Size = UDim2.new(0, 250, 0, 145)
Holder_5.ScrollBarImageColor3 = Color3.fromRGB(78,78,79)
Holder_5.BottomImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Holder_5.CanvasSize = UDim2.new(0, 0, 0, 0)
Holder_5.MidImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Holder_5.ScrollBarThickness = 0
Holder_5.TopImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
Holder_5.VerticalScrollBarInset = 'Always'
Holder_5.ZIndex = 10

Example_5.Name = "Example"
Example_5.Parent = PluginsFrame
Example_5.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Example_5.BorderSizePixel = 0
Example_5.Size = UDim2.new(0, 10, 0, 20)
Example_5.Visible = false
Example_5.ZIndex = 10
table.insert(shade2,Example_5)

Text_6.Name = "Text"
Text_6.Parent = Example_5
Text_6.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Text_6.BorderSizePixel = 0
Text_6.Position = UDim2.new(0, 10, 0, 0)
Text_6.Size = UDim2.new(0, 240, 0, 20)
Text_6.Font = Enum.Font.SourceSans
Text_6.TextSize = 14
Text_6.Text = "F4 > Toggle Fly"
Text_6.TextColor3 = Color3.new(1, 1, 1)
Text_6.TextXAlignment = Enum.TextXAlignment.Left
Text_6.ZIndex = 10
table.insert(shade2,Text_6)
table.insert(text1,Text_6)

Delete_7.Name = "Delete"
Delete_7.Parent = Text_6
Delete_7.BackgroundColor3 = Color3.fromRGB(78, 78, 79)
Delete_7.BorderSizePixel = 0
Delete_7.Position = UDim2.new(0, 200, 0, 0)
Delete_7.Size = UDim2.new(0, 40, 0, 20)
Delete_7.Font = Enum.Font.SourceSans
Delete_7.TextSize = 14
Delete_7.Text = "Delete"
Delete_7.TextColor3 = Color3.new(0, 0, 0)
Delete_7.ZIndex = 10
table.insert(shade3,Delete_7)
table.insert(text2,Delete_7)

PluginEditor.Name = randomString()
PluginEditor.Parent = ScaledHolder
PluginEditor.BorderSizePixel = 0
PluginEditor.Active = true
PluginEditor.BackgroundTransparency = 1
PluginEditor.Position = UDim2.new(0.5, -180, 0, -500)
PluginEditor.Size = UDim2.new(0, 360, 0, 20)
PluginEditor.ZIndex = 10

background_3.Name = "background"
background_3.Parent = PluginEditor
background_3.Active = true
background_3.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
background_3.BorderSizePixel = 0
background_3.Position = UDim2.new(0, 0, 0, 20)
background_3.Size = UDim2.new(0, 360, 0, 160)
background_3.ZIndex = 10
table.insert(shade1,background_3)

Dark_2.Name = "Dark"
Dark_2.Parent = background_3
Dark_2.Active = true
Dark_2.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
Dark_2.BorderSizePixel = 0
Dark_2.Position = UDim2.new(0, 222, 0, 0)
Dark_2.Size = UDim2.new(0, 2, 0, 160)
Dark_2.ZIndex = 10
table.insert(shade2,Dark_2)

Img.Name = "Img"
Img.Parent = background_3
Img.BackgroundTransparency = 1
Img.Position = UDim2.new(0, 242, 0, 3)
Img.Size = UDim2.new(0, 100, 0, 95)
Img.Image = getcustomasset("infiniteyield/assets/imgstudiopluginlogo.png")
Img.ZIndex = 10

AddPlugin.Name = "AddPlugin"
AddPlugin.Parent = background_3
AddPlugin.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
AddPlugin.BorderSizePixel = 0
AddPlugin.Position = UDim2.new(0, 235, 0, 100)
AddPlugin.Size = UDim2.new(0, 115, 0, 50)
AddPlugin.Font = Enum.Font.SourceSans
AddPlugin.TextSize = 14
AddPlugin.Text = "Add Plugin"
AddPlugin.TextColor3 = Color3.new(1, 1, 1)
AddPlugin.ZIndex = 10
table.insert(shade2,AddPlugin)
table.insert(text1,AddPlugin)

FileName.Name = "FileName"
FileName.Parent = background_3
FileName.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
FileName.BorderSizePixel = 0
FileName.Position = UDim2.new(0.028, 0, 0.625, 0)
FileName.Size = UDim2.new(0, 200, 0, 50)
FileName.Font = Enum.Font.SourceSans
FileName.TextSize = 14
FileName.Text = "Plugin File Name"
FileName.TextColor3 = Color3.new(1, 1, 1)
FileName.ZIndex = 10
table.insert(shade2,FileName)
table.insert(text1,FileName)

About.Name = "About"
About.Parent = background_3
About.BackgroundTransparency = 1
About.BorderSizePixel = 0
About.Position = UDim2.new(0, 17, 0, 10)
About.Size = UDim2.new(0, 187, 0, 49)
About.Font = Enum.Font.SourceSans
About.TextSize = 14
About.Text = "Plugins are .iy files and should be located in the 'workspace' folder of your exploit."
About.TextColor3 = Color3.fromRGB(255, 255, 255)
About.TextWrapped = true
About.TextYAlignment = Enum.TextYAlignment.Top
About.ZIndex = 10
table.insert(text1,About)

Directions_2.Name = "Directions"
Directions_2.Parent = background_3
Directions_2.BackgroundTransparency = 1
Directions_2.BorderSizePixel = 0
Directions_2.Position = UDim2.new(0, 17, 0, 60)
Directions_2.Size = UDim2.new(0, 187, 0, 49)
Directions_2.Font = Enum.Font.SourceSans
Directions_2.TextSize = 14
Directions_2.Text = "Type the name of the plugin file you want to add below."
Directions_2.TextColor3 = Color3.fromRGB(255, 255, 255)
Directions_2.TextWrapped = true
Directions_2.TextYAlignment = Enum.TextYAlignment.Top
Directions_2.ZIndex = 10
table.insert(text1,Directions_2)

shadow_3.Name = "shadow"
shadow_3.Parent = PluginEditor
shadow_3.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
shadow_3.BorderSizePixel = 0
shadow_3.Size = UDim2.new(0, 360, 0, 20)
shadow_3.ZIndex = 10
table.insert(shade2,shadow_3)

PopupText_3.Name = "PopupText"
PopupText_3.Parent = shadow_3
PopupText_3.BackgroundTransparency = 1
PopupText_3.Size = UDim2.new(1, 0, 0.95, 0)
PopupText_3.ZIndex = 10
PopupText_3.Font = Enum.Font.SourceSans
PopupText_3.TextSize = 14
PopupText_3.Text = "Add Plugins"
PopupText_3.TextColor3 = Color3.new(1, 1, 1)
PopupText_3.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
PopupText_3.TextStrokeTransparency = 0.5
PopupText_3.TextWrapped = true
table.insert(text1,PopupText_3)

Exit_3.Name = "Exit"
Exit_3.Parent = shadow_3
Exit_3.BackgroundTransparency = 1
Exit_3.Position = UDim2.new(1, -20, 0, 0)
Exit_3.Size = UDim2.new(0, 20, 0, 20)
Exit_3.Text = ""
Exit_3.ZIndex = 10

ExitImage_3.Parent = Exit_3
ExitImage_3.BackgroundColor3 = Color3.new(1, 1, 1)
ExitImage_3.BackgroundTransparency = 1
ExitImage_3.Position = UDim2.new(0, 5, 0, 5)
ExitImage_3.Size = UDim2.new(0, 10, 0, 10)
ExitImage_3.Image = getcustomasset("infiniteyield/assets/close.png")
ExitImage_3.ZIndex = 10

AliasHint.Name = "AliasHint"
AliasHint.Parent = AliasesFrame
AliasHint.BackgroundTransparency = 1
AliasHint.BorderSizePixel = 0
AliasHint.Position = UDim2.new(0, 25, 0, 40)
AliasHint.Size = UDim2.new(0, 200, 0, 50)
AliasHint.Font = Enum.Font.SourceSansItalic
AliasHint.TextSize = 16
AliasHint.Text = "Add aliases by using the 'addalias' command"
AliasHint.TextColor3 = Color3.new(1, 1, 1)
AliasHint.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
AliasHint.TextWrapped = true
AliasHint.ZIndex = 10
table.insert(text1,AliasHint)

PluginsHint.Name = "PluginsHint"
PluginsHint.Parent = PluginsFrame
PluginsHint.BackgroundTransparency = 1
PluginsHint.BorderSizePixel = 0
PluginsHint.Position = UDim2.new(0, 25, 0, 40)
PluginsHint.Size = UDim2.new(0, 200, 0, 50)
PluginsHint.Font = Enum.Font.SourceSansItalic
PluginsHint.TextSize = 16
PluginsHint.Text = "Download plugins from the IY Discord (discord.gg/78ZuWSq)"
PluginsHint.TextColor3 = Color3.new(1, 1, 1)
PluginsHint.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
PluginsHint.TextWrapped = true
PluginsHint.ZIndex = 10
table.insert(text1,PluginsHint)

PositionsHint.Name = "PositionsHint"
PositionsHint.Parent = PositionsFrame
PositionsHint.BackgroundTransparency = 1
PositionsHint.BorderSizePixel = 0
PositionsHint.Position = UDim2.new(0, 25, 0, 40)
PositionsHint.Size = UDim2.new(0, 200, 0, 70)
PositionsHint.Font = Enum.Font.SourceSansItalic
PositionsHint.TextSize = 16
PositionsHint.Text = "Use the 'swp' or 'setwaypoint' command to add a position using your character (NOTE: Part teleports will not save)"
PositionsHint.TextColor3 = Color3.new(1, 1, 1)
PositionsHint.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
PositionsHint.TextWrapped = true
PositionsHint.ZIndex = 10
table.insert(text1,PositionsHint)

ToPartFrame.Name = randomString()
ToPartFrame.Parent = ScaledHolder
ToPartFrame.Active = true
ToPartFrame.BackgroundTransparency = 1
ToPartFrame.Position = UDim2.new(0.5, -180, 0, -500)
ToPartFrame.Size = UDim2.new(0, 360, 0, 20)
ToPartFrame.ZIndex = 10

background_4.Name = "background"
background_4.Parent = ToPartFrame
background_4.Active = true
background_4.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
background_4.BorderSizePixel = 0
background_4.Position = UDim2.new(0, 0, 0, 20)
background_4.Size = UDim2.new(0, 360, 0, 117)
background_4.ZIndex = 10
table.insert(shade1,background_4)

ChoosePart.Name = "ChoosePart"
ChoosePart.Parent = background_4
ChoosePart.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
ChoosePart.BorderSizePixel = 0
ChoosePart.Position = UDim2.new(0, 100, 0, 55)
ChoosePart.Size = UDim2.new(0, 75, 0, 30)
ChoosePart.Font = Enum.Font.SourceSans
ChoosePart.TextSize = 14
ChoosePart.Text = "Select Part"
ChoosePart.TextColor3 = Color3.new(1, 1, 1)
ChoosePart.ZIndex = 10
table.insert(shade2,ChoosePart)
table.insert(text1,ChoosePart)

CopyPath.Name = "CopyPath"
CopyPath.Parent = background_4
CopyPath.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
CopyPath.BorderSizePixel = 0
CopyPath.Position = UDim2.new(0, 185, 0, 55)
CopyPath.Size = UDim2.new(0, 75, 0, 30)
CopyPath.Font = Enum.Font.SourceSans
CopyPath.TextSize = 14
CopyPath.Text = "Copy Path"
CopyPath.TextColor3 = Color3.new(1, 1, 1)
CopyPath.ZIndex = 10
table.insert(shade2,CopyPath)
table.insert(text1,CopyPath)

Directions_3.Name = "Directions"
Directions_3.Parent = background_4
Directions_3.BackgroundTransparency = 1
Directions_3.BorderSizePixel = 0
Directions_3.Position = UDim2.new(0, 51, 0, 17)
Directions_3.Size = UDim2.new(0, 257, 0, 32)
Directions_3.Font = Enum.Font.SourceSans
Directions_3.TextSize = 14
Directions_3.Text = 'Click on a part and then click the "Select Part" button below to set it as a teleport location'
Directions_3.TextColor3 = Color3.new(1, 1, 1)
Directions_3.TextWrapped = true
Directions_3.TextYAlignment = Enum.TextYAlignment.Top
Directions_3.ZIndex = 10
table.insert(text1,Directions_3)

Path.Name = "Path"
Path.Parent = background_4
Path.BackgroundTransparency = 1
Path.BorderSizePixel = 0
Path.Position = UDim2.new(0, 0, 0, 94)
Path.Size = UDim2.new(0, 360, 0, 16)
Path.Font = Enum.Font.SourceSansItalic
Path.TextSize = 14
Path.Text = ""
Path.TextColor3 = Color3.new(1, 1, 1)
Path.TextScaled = true
Path.TextWrapped = true
Path.TextYAlignment = Enum.TextYAlignment.Top
Path.ZIndex = 10
table.insert(text1,Path)

shadow_4.Name = "shadow"
shadow_4.Parent = ToPartFrame
shadow_4.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
shadow_4.BorderSizePixel = 0
shadow_4.Size = UDim2.new(0, 360, 0, 20)
shadow_4.ZIndex = 10
table.insert(shade2,shadow_4)

PopupText_5.Name = "PopupText"
PopupText_5.Parent = shadow_4
PopupText_5.BackgroundTransparency = 1
PopupText_5.Size = UDim2.new(1, 0, 0.95, 0)
PopupText_5.ZIndex = 10
PopupText_5.Font = Enum.Font.SourceSans
PopupText_5.TextSize = 14
PopupText_5.Text = "Teleport to Part"
PopupText_5.TextColor3 = Color3.new(1, 1, 1)
PopupText_5.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
PopupText_5.TextStrokeTransparency = 0.5
PopupText_5.TextWrapped = true
table.insert(text1,PopupText_5)

Exit_4.Name = "Exit"
Exit_4.Parent = shadow_4
Exit_4.BackgroundTransparency = 1
Exit_4.Position = UDim2.new(1, -20, 0, 0)
Exit_4.Size = UDim2.new(0, 20, 0, 20)
Exit_4.Text = ""
Exit_4.ZIndex = 10

ExitImage_5.Parent = Exit_4
ExitImage_5.BackgroundColor3 = Color3.new(1, 1, 1)
ExitImage_5.BackgroundTransparency = 1
ExitImage_5.Position = UDim2.new(0, 5, 0, 5)
ExitImage_5.Size = UDim2.new(0, 10, 0, 10)
ExitImage_5.Image = getcustomasset("infiniteyield/assets/close.png")
ExitImage_5.ZIndex = 10

logs.Name = randomString()
logs.Parent = ScaledHolder
logs.Active = true
logs.BackgroundTransparency = 1
logs.Position = UDim2.new(0, 0, 1, 10)
logs.Size = UDim2.new(0, 338, 0, 20)
logs.ZIndex = 10

shadow.Name = "shadow"
shadow.Parent = logs
shadow.BackgroundColor3 = Color3.new(0.180392, 0.180392, 0.184314)
shadow.BorderSizePixel = 0
shadow.Position = UDim2.new(0, 0, 0.00999999978, 0)
shadow.Size = UDim2.new(0, 338, 0, 20)
shadow.ZIndex = 10
table.insert(shade2,shadow)

Hide.Name = "Hide"
Hide.Parent = shadow
Hide.BackgroundTransparency = 1
Hide.Position = UDim2.new(1, -40, 0, 0)
Hide.Size = UDim2.new(0, 20, 0, 20)
Hide.ZIndex = 10
Hide.Text = ""

ImageLabel.Parent = Hide
ImageLabel.BackgroundColor3 = Color3.new(1, 1, 1)
ImageLabel.BackgroundTransparency = 1
ImageLabel.Position = UDim2.new(0, 3, 0, 3)
ImageLabel.Size = UDim2.new(0, 14, 0, 14)
ImageLabel.Image = getcustomasset("infiniteyield/assets/minimize.png")
ImageLabel.ZIndex = 10

PopupText.Name = "PopupText"
PopupText.Parent = shadow
PopupText.BackgroundTransparency = 1
PopupText.Size = UDim2.new(1, 0, 0.949999988, 0)
PopupText.ZIndex = 10
PopupText.Font = Enum.Font.SourceSans
PopupText.FontSize = Enum.FontSize.Size14
PopupText.Text = "Logs"
PopupText.TextColor3 = Color3.new(1, 1, 1)
PopupText.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
PopupText.TextStrokeTransparency = 0.5
PopupText.TextWrapped = true
table.insert(text1,PopupText)

Exit.Name = "Exit"
Exit.Parent = shadow
Exit.BackgroundTransparency = 1
Exit.Position = UDim2.new(1, -20, 0, 0)
Exit.Size = UDim2.new(0, 20, 0, 20)
Exit.ZIndex = 10
Exit.Text = ""

ImageLabel_2.Parent = Exit
ImageLabel_2.BackgroundColor3 = Color3.new(1, 1, 1)
ImageLabel_2.BackgroundTransparency = 1
ImageLabel_2.Position = UDim2.new(0, 5, 0, 5)
ImageLabel_2.Size = UDim2.new(0, 10, 0, 10)
ImageLabel_2.Image = getcustomasset("infiniteyield/assets/close.png")
ImageLabel_2.ZIndex = 10

background.Name = "background"
background.Parent = logs
background.Active = true
background.BackgroundColor3 = Color3.new(0.141176, 0.141176, 0.145098)
background.BorderSizePixel = 0
background.ClipsDescendants = true
background.Position = UDim2.new(0, 0, 1, 0)
background.Size = UDim2.new(0, 338, 0, 245)
background.ZIndex = 10

chat.Name = "chat"
chat.Parent = background
chat.Active = true
chat.BackgroundColor3 = Color3.new(0.141176, 0.141176, 0.145098)
chat.BorderSizePixel = 0
chat.ClipsDescendants = true
chat.Size = UDim2.new(0, 338, 0, 245)
chat.ZIndex = 10
table.insert(shade1,chat)

Clear.Name = "Clear"
Clear.Parent = chat
Clear.BackgroundColor3 = Color3.new(0.180392, 0.180392, 0.184314)
Clear.BorderSizePixel = 0
Clear.Position = UDim2.new(0, 5, 0, 220)
Clear.Size = UDim2.new(0, 50, 0, 20)
Clear.ZIndex = 10
Clear.Font = Enum.Font.SourceSans
Clear.FontSize = Enum.FontSize.Size14
Clear.Text = "Clear"
Clear.TextColor3 = Color3.new(1, 1, 1)
table.insert(shade2,Clear)
table.insert(text1,Clear)

SaveChatlogs.Name = "SaveChatlogs"
SaveChatlogs.Parent = chat
SaveChatlogs.BackgroundColor3 = Color3.new(0.180392, 0.180392, 0.184314)
SaveChatlogs.BorderSizePixel = 0
SaveChatlogs.Position = UDim2.new(0, 258, 0, 220)
SaveChatlogs.Size = UDim2.new(0, 75, 0, 20)
SaveChatlogs.ZIndex = 10
SaveChatlogs.Font = Enum.Font.SourceSans
SaveChatlogs.FontSize = Enum.FontSize.Size14
SaveChatlogs.Text = "Save To .txt"
SaveChatlogs.TextColor3 = Color3.new(1, 1, 1)
table.insert(shade2,SaveChatlogs)
table.insert(text1,SaveChatlogs)

Toggle.Name = "Toggle"
Toggle.Parent = chat
Toggle.BackgroundColor3 = Color3.new(0.180392, 0.180392, 0.184314)
Toggle.BorderSizePixel = 0
Toggle.Position = UDim2.new(0, 60, 0, 220)
Toggle.Size = UDim2.new(0, 66, 0, 20)
Toggle.ZIndex = 10
Toggle.Font = Enum.Font.SourceSans
Toggle.FontSize = Enum.FontSize.Size14
Toggle.Text = "Disabled"
Toggle.TextColor3 = Color3.new(1, 1, 1)
table.insert(shade2,Toggle)
table.insert(text1,Toggle)

scroll_2.Name = "scroll"
scroll_2.Parent = chat
scroll_2.BackgroundColor3 = Color3.new(0.180392, 0.180392, 0.184314)
scroll_2.BorderSizePixel = 0
scroll_2.Position = UDim2.new(0, 5, 0, 25)
scroll_2.Size = UDim2.new(0, 328, 0, 190)
scroll_2.ZIndex = 10
scroll_2.BottomImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
scroll_2.CanvasSize = UDim2.new(0, 0, 0, 10)
scroll_2.ScrollBarThickness = 8
scroll_2.TopImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
table.insert(scroll,scroll_2)
table.insert(shade2,scroll_2)

join.Name = "join"
join.Parent = background
join.Active = true
join.BackgroundColor3 = Color3.new(0.141176, 0.141176, 0.145098)
join.BorderSizePixel = 0
join.ClipsDescendants = true
join.Size = UDim2.new(0, 338, 0, 245)
join.Visible = false
join.ZIndex = 10
table.insert(shade1,join)

Toggle_2.Name = "Toggle"
Toggle_2.Parent = join
Toggle_2.BackgroundColor3 = Color3.new(0.180392, 0.180392, 0.184314)
Toggle_2.BorderSizePixel = 0
Toggle_2.Position = UDim2.new(0, 60, 0, 220)
Toggle_2.Size = UDim2.new(0, 66, 0, 20)
Toggle_2.ZIndex = 10
Toggle_2.Font = Enum.Font.SourceSans
Toggle_2.FontSize = Enum.FontSize.Size14
Toggle_2.Text = "Disabled"
Toggle_2.TextColor3 = Color3.new(1, 1, 1)
table.insert(shade2,Toggle_2)
table.insert(text1,Toggle_2)

Clear_2.Name = "Clear"
Clear_2.Parent = join
Clear_2.BackgroundColor3 = Color3.new(0.180392, 0.180392, 0.184314)
Clear_2.BorderSizePixel = 0
Clear_2.Position = UDim2.new(0, 5, 0, 220)
Clear_2.Size = UDim2.new(0, 50, 0, 20)
Clear_2.ZIndex = 10
Clear_2.Font = Enum.Font.SourceSans
Clear_2.FontSize = Enum.FontSize.Size14
Clear_2.Text = "Clear"
Clear_2.TextColor3 = Color3.new(1, 1, 1)
table.insert(shade2,Clear_2)
table.insert(text1,Clear_2)

scroll_3.Name = "scroll"
scroll_3.Parent = join
scroll_3.BackgroundColor3 = Color3.new(0.180392, 0.180392, 0.184314)
scroll_3.BorderSizePixel = 0
scroll_3.Position = UDim2.new(0, 5, 0, 25)
scroll_3.Size = UDim2.new(0, 328, 0, 190)
scroll_3.ZIndex = 10
scroll_3.BottomImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
scroll_3.CanvasSize = UDim2.new(0, 0, 0, 10)
scroll_3.ScrollBarThickness = 8
scroll_3.TopImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"
table.insert(scroll,scroll_3)
table.insert(shade2,scroll_3)

selectChat.Name = "selectChat"
selectChat.Parent = background
selectChat.BackgroundColor3 = Color3.new(0.180392, 0.180392, 0.184314)
selectChat.BorderSizePixel = 0
selectChat.Position = UDim2.new(0, 5, 0, 5)
selectChat.Size = UDim2.new(0, 164, 0, 20)
selectChat.ZIndex = 10
selectChat.Font = Enum.Font.SourceSans
selectChat.FontSize = Enum.FontSize.Size14
selectChat.Text = "Chat Logs"
selectChat.TextColor3 = Color3.new(1, 1, 1)
table.insert(shade2,selectChat)
table.insert(text1,selectChat)

selectJoin.Name = "selectJoin"
selectJoin.Parent = background
selectJoin.BackgroundColor3 = Color3.new(0.305882, 0.305882, 0.309804)
selectJoin.BorderSizePixel = 0
selectJoin.Position = UDim2.new(0, 169, 0, 5)
selectJoin.Size = UDim2.new(0, 164, 0, 20)
selectJoin.ZIndex = 10
selectJoin.Font = Enum.Font.SourceSans
selectJoin.FontSize = Enum.FontSize.Size14
selectJoin.Text = "Join Logs"
selectJoin.TextColor3 = Color3.new(1, 1, 1)
table.insert(shade3,selectJoin)
table.insert(text1,selectJoin)

function create(data)
        local insts = {}
        for i,v in pairs(data) do insts[v[1]] = Instance.new(v[2]) end

        for _,v in pairs(data) do
                for prop,val in pairs(v[3]) do
                        if type(val) == "table" then
                                insts[v[1]][prop] = insts[val[1]]
                        else
                                insts[v[1]][prop] = val
                        end
                end
        end

        return insts[1]
end

ViewportTextBox = (function()

        local funcs = {}
        funcs.Update = function(self)
                local cursorPos = self.TextBox.CursorPosition
                local text = self.TextBox.Text
                if text == "" then self.TextBox.Position = UDim2.new(0,2,0,0) return end
                if cursorPos == -1 then return end

                local cursorText = text:sub(1,cursorPos-1)
                local pos = nil
                local leftEnd = -self.TextBox.Position.X.Offset
                local rightEnd = leftEnd + self.View.AbsoluteSize.X

                local totalTextSize = TextService:GetTextSize(text,self.TextBox.TextSize,self.TextBox.Font,Vector2.new(999999999,100)).X
                local cursorTextSize = TextService:GetTextSize(cursorText,self.TextBox.TextSize,self.TextBox.Font,Vector2.new(999999999,100)).X

                if cursorTextSize > rightEnd then
                        pos = math.max(-2,cursorTextSize - self.View.AbsoluteSize.X + 2)
                elseif cursorTextSize < leftEnd then
                        pos = math.max(-2,cursorTextSize-2)
                elseif totalTextSize < rightEnd then
                        pos = math.max(-2,totalTextSize - self.View.AbsoluteSize.X + 2)
                end

                if pos then
                        self.TextBox.Position = UDim2.new(0,-pos,0,0)
                        self.TextBox.Size = UDim2.new(1,pos,1,0)
                end
        end

        local mt = {}
        mt.__index = funcs

        local function convert(textbox)
                local obj = setmetatable({OffsetX = 0, TextBox = textbox},mt)

                local view = Instance.new("Frame")
                view.BackgroundTransparency = textbox.BackgroundTransparency
                view.BackgroundColor3 = textbox.BackgroundColor3
                view.BorderSizePixel = textbox.BorderSizePixel
                view.BorderColor3 = textbox.BorderColor3
                view.Position = textbox.Position
                view.Size = textbox.Size
                view.ClipsDescendants = true
                view.Name = textbox.Name
                view.ZIndex = 10
                textbox.BackgroundTransparency = 1
                textbox.Position = UDim2.new(0,4,0,0)
                textbox.Size = UDim2.new(1,-8,1,0)
                textbox.TextXAlignment = Enum.TextXAlignment.Left
                textbox.Name = "Input"
                table.insert(text1,textbox)
                table.insert(shade2,view)

                obj.View = view

                textbox.Changed:Connect(function(prop)
                        if prop == "Text" or prop == "CursorPosition" or prop == "AbsoluteSize" then
                                obj:Update()
                        end
                end)

                obj:Update()

                view.Parent = textbox.Parent
                textbox.Parent = view

                return obj
        end

        return {convert = convert}
end)()

ViewportTextBox.convert(Cmdbar).View.ZIndex = 10
ViewportTextBox.convert(Cmdbar_2).View.ZIndex = 10
ViewportTextBox.convert(Cmdbar_3).View.ZIndex = 10

function writefileExploit()
        if writefile then
                return true
        end
end

function readfileExploit()
        if readfile then
                return true
        end
end

function isNumber(str)
        if tonumber(str) ~= nil or str == "inf" then
                return true
        end
end

function vtype(o, t)
        if o == nil then return false end
        if type(o) == "userdata" then return typeof(o) == t end
        return type(o) == t
end

function getRoot(char)
        if char and char:FindFirstChildOfClass("Humanoid") then
                return char:FindFirstChildOfClass("Humanoid").RootPart
        else
                return nil
        end
end

function tools(plr)
        if plr:FindFirstChildOfClass("Backpack"):FindFirstChildOfClass("Tool") or plr.Character:FindFirstChildOfClass("Tool") then
                return true
        end
end

function r15(plr)
        if plr.Character:FindFirstChildOfClass("Humanoid").RigType == Enum.HumanoidRigType.R15 then
                return true
        end
end

function breakVelocity()
    local V3 = Vector3.new(0, 0, 0)
    for _, v in ipairs(Players.LocalPlayer.Character:GetDescendants()) do
        if v:IsA("BasePart") then
            v.Velocity, v.RotVelocity = V3, V3
        end
    end
end

function toClipboard(txt)
        if everyClipboard then
                everyClipboard(tostring(txt)) -- some executor errored without tostring btw so dont call me out for this
                notify("Clipboard", "Copied to clipboard")
        else
                notify("Clipboard", "Your exploit doesn't have the ability to use the clipboard")
        end
end

function chatMessage(str)
        str = tostring(str)
        if not isLegacyChat then
                TextChatService.TextChannels.RBXGeneral:SendAsync(str)
        else
                ReplicatedStorage.DefaultChatSystemChatEvents.SayMessageRequest:FireServer(str, "All")
        end
end

function getHierarchy(obj)
        local fullname
        local period

        if string.find(obj.Name,' ') then
                fullname = '["'..obj.Name..'"]'
                period = false
        else
                fullname = obj.Name
                period = true
        end

        local getS = obj
        local parent = obj
        local service = ''

        if getS.Parent ~= game then
                repeat
                        getS = getS.Parent
                        service = getS.ClassName
                until getS.Parent == game
        end

        if parent.Parent ~= getS then
                repeat
                        parent = parent.Parent
                        if string.find(tostring(parent),' ') then
                                if period then
                                        fullname = '["'..parent.Name..'"].'..fullname
                                else
                                        fullname = '["'..parent.Name..'"]'..fullname
                                end
                                period = false
                        else
                                if period then
                                        fullname = parent.Name..'.'..fullname
                                else
                                        fullname = parent.Name..''..fullname
                                end
                                period = true
                        end
                until parent.Parent == getS
        elseif string.find(tostring(parent),' ') then
                fullname = '["'..parent.Name..'"]'
                period = false
        end

        if period then
                return 'game:GetService("'..service..'").'..fullname
        else
                return 'game:GetService("'..service..'")'..fullname
        end
end

AllWaypoints = {}

local cooldown = false
function writefileCooldown(name,data)
        task.spawn(function()
                if not cooldown then
                        cooldown = true
                        writefile(name, data, true)
                else
                        repeat wait() until cooldown == false
                        writefileCooldown(name,data)
                end
                wait(3)
                cooldown = false
        end)
end

function dragGUI(gui)
        task.spawn(function()
                local dragging
                local dragInput
                local dragStart = Vector3.new(0,0,0)
                local startPos
                local function update(input)
                        local delta = input.Position - dragStart
                        local Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
                        TweenService:Create(gui, TweenInfo.new(.20), {Position = Position}):Play()
                end
                gui.InputBegan:Connect(function(input)
                        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
                                dragging = true
                                dragStart = input.Position
                                startPos = gui.Position

                                input.Changed:Connect(function()
                                        if input.UserInputState == Enum.UserInputState.End then
                                                dragging = false
                                        end
                                end)
                        end
                end)
                gui.InputChanged:Connect(function(input)
                        if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
                                dragInput = input
                        end
                end)
                UserInputService.InputChanged:Connect(function(input)
                        if input == dragInput and dragging then
                                update(input)
                        end
                end)
        end)
end

dragGUI(logs)
dragGUI(KeybindEditor)
dragGUI(PluginEditor)
dragGUI(ToPartFrame)

eventEditor = (function()
        local events = {}

        local function registerEvent(name,sets)
                events[name] = {
                        commands = {},
                        sets = sets or {}
                }
        end

        local onEdited = nil

        local function fireEvent(name,...)
                local args = {...}
                local event = events[name]
                if event then
                        for i,cmd in pairs(event.commands) do
                                local metCondition = true
                                for idx,set in pairs(event.sets) do
                                        local argVal = args[idx]
                                        local cmdSet = cmd[2][idx]
                                        local condType = set.Type
                                        if condType == "Player" then
                                                if cmdSet == 0 then
                                                        metCondition = metCondition and (tostring(Players.LocalPlayer) == argVal)
                                                elseif cmdSet ~= 1 then
                                                        metCondition = metCondition and table.find(getPlayer(cmdSet,Players.LocalPlayer),argVal)
                                                end
                                        elseif condType == "String" then
                                                if cmdSet ~= 0 then
                                                        metCondition = metCondition and string.find(argVal:lower(),cmdSet:lower())
                                                end
                                        elseif condType == "Number" then
                                                if cmdSet ~= 0 then
                                                        metCondition = metCondition and tonumber(argVal)<=tonumber(cmdSet)
                                                end
                                        end
                                        if not metCondition then break end
                                end

                                if metCondition then
                                        pcall(task.spawn(function()
                                                local cmdStr = cmd[1]
                                                for count,arg in pairs(args) do
                                                        cmdStr = cmdStr:gsub("%$"..count,arg)
                                                end
                                                wait(cmd[3] or 0)
                                                execCmd(cmdStr)
                                        end))
                                end
                        end
                end
        end

        local main = create({
                {1,"Frame",{BackgroundColor3=Color3.new(0.14117647707462,0.14117647707462,0.14509804546833),BackgroundTransparency=1,BorderSizePixel=0,Name="EventEditor",Position=UDim2.new(0.5,-175,0,-500),Size=UDim2.new(0,350,0,20),ZIndex=10,}},
                {2,"Frame",{BackgroundColor3=currentShade2,BorderSizePixel=0,Name="TopBar",Parent={1},Size=UDim2.new(1,0,0,20),ZIndex=10,}},
                {3,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Title",Parent={2},Position=UDim2.new(0,0,0,0),Size=UDim2.new(1,0,0.95,0),Text="Event Editor",TextColor3=Color3.new(1,1,1),TextSize=14,TextXAlignment=Enum.TextXAlignment.Center,ZIndex=10,}},
                {4,"TextButton",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Close",Parent={2},Position=UDim2.new(1,-20,0,0),Size=UDim2.new(0,20,0,20),Text="",TextColor3=Color3.new(1,1,1),TextSize=14,ZIndex=10,}},
                {5,"ImageLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Image=getcustomasset("infiniteyield/assets/close.png"),Parent={4},Position=UDim2.new(0,5,0,5),Size=UDim2.new(0,10,0,10),ZIndex=10,}},
                {6,"Frame",{BackgroundColor3=currentShade1,BorderSizePixel=0,Name="Content",Parent={1},Position=UDim2.new(0,0,0,20),Size=UDim2.new(1,0,0,202),ZIndex=10,}},
                {7,"ScrollingFrame",{BackgroundColor3=Color3.new(0.14117647707462,0.14117647707462,0.14509804546833),BackgroundTransparency=1,BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),BorderSizePixel=0,BottomImage="rbxasset://textures/ui/Scroll/scroll-middle.png",CanvasSize=UDim2.new(0,0,0,100),Name="List",Parent={6},Position=UDim2.new(0,5,0,5),ScrollBarImageColor3=Color3.new(0.30588236451149,0.30588236451149,0.3098039329052),ScrollBarThickness=8,Size=UDim2.new(1,-10,1,-10),TopImage="rbxasset://textures/ui/Scroll/scroll-middle.png",ZIndex=10,}},
                {8,"Frame",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Name="Holder",Parent={7},Size=UDim2.new(1,0,1,0),ZIndex=10,}},
                {9,"UIListLayout",{Parent={8},SortOrder=2,}},
                {10,"Frame",{BackgroundColor3=Color3.new(0.14117647707462,0.14117647707462,0.14509804546833),BackgroundTransparency=1,BorderColor3=Color3.new(0.3137255012989,0.3137255012989,0.3137255012989),BorderSizePixel=0,ClipsDescendants=true,Name="Settings",Parent={6},Position=UDim2.new(1,0,0,0),Size=UDim2.new(0,150,1,0),ZIndex=10,}},
                {11,"Frame",{BackgroundColor3=Color3.new(0.14117647707462,0.14117647707462,0.14509804546833),Name="Slider",Parent={10},Position=UDim2.new(0,-150,0,0),Size=UDim2.new(1,0,1,0),ZIndex=10,}},
                {12,"Frame",{BackgroundColor3=Color3.new(0.23529413342476,0.23529413342476,0.23529413342476),BorderColor3=Color3.new(0.3137255012989,0.3137255012989,0.3137255012989),BorderSizePixel=0,Name="Line",Parent={11},Size=UDim2.new(0,1,1,0),ZIndex=10,}},
                {13,"ScrollingFrame",{BackgroundColor3=Color3.new(0.14117647707462,0.14117647707462,0.14509804546833),BackgroundTransparency=1,BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),BorderSizePixel=0,BottomImage="rbxasset://textures/ui/Scroll/scroll-middle.png",CanvasSize=UDim2.new(0,0,0,100),Name="List",Parent={11},Position=UDim2.new(0,0,0,25),ScrollBarImageColor3=Color3.new(0.30588236451149,0.30588236451149,0.3098039329052),ScrollBarThickness=8,Size=UDim2.new(1,0,1,-25),TopImage="rbxasset://textures/ui/Scroll/scroll-middle.png",ZIndex=10,}},
                {14,"Frame",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Name="Holder",Parent={13},Size=UDim2.new(1,0,1,0),ZIndex=10,}},
                {15,"UIListLayout",{Parent={14},SortOrder=2,}},
                {16,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Title",Parent={11},Size=UDim2.new(1,0,0,20),Text="Event Settings",TextColor3=Color3.new(1,1,1),TextSize=14,ZIndex=10,}},
                {17,"TextButton",{BackgroundColor3=Color3.new(0.14117647707462,0.14117647707462,0.14509804546833),BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),Font=3,Name="Close",BorderSizePixel=0,Parent={11},Position=UDim2.new(1,-20,0,0),Size=UDim2.new(0,20,0,20),Text="<",TextColor3=Color3.new(1,1,1),TextSize=18,ZIndex=10,}},
                {18,"Folder",{Name="Templates",Parent={10},}},
                {19,"Frame",{BackgroundColor3=Color3.new(0.19607844948769,0.19607844948769,0.19607844948769),BackgroundTransparency=1,BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),Name="Players",Parent={18},Position=UDim2.new(0,0,0,25),Size=UDim2.new(1,0,0,86),Visible=false,ZIndex=10,}},
                {20,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Title",Parent={19},Size=UDim2.new(1,0,0,20),Text="Choose Players",TextColor3=Color3.new(1,1,1),TextSize=14,ZIndex=10,}},
                {21,"TextLabel",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Font=3,Name="Any",Parent={19},Position=UDim2.new(0,5,0,42),Size=UDim2.new(1,-10,0,20),Text="Any Player",TextColor3=Color3.new(1,1,1),TextSize=14,TextXAlignment=0,ZIndex=10,}},
                {22,"Frame",{BackgroundColor3=Color3.new(0.30588236451149,0.30588236451149,0.3098039329052),BorderSizePixel=0,Name="Button",Parent={21},Position=UDim2.new(1,-20,0,0),Size=UDim2.new(0,20,0,20),ZIndex=10,}},
                {23,"TextButton",{BackgroundColor3=Color3.new(0.58823531866074,0.58823531866074,0.59215688705444),BackgroundTransparency=1,BorderSizePixel=0,Font=3,Name="On",Parent={22},Position=UDim2.new(0,2,0,2),Size=UDim2.new(0,16,0,16),Text="",TextColor3=Color3.new(0,0,0),TextSize=14,ZIndex=10,}},
                {24,"TextLabel",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Font=3,Name="Me",Parent={19},Position=UDim2.new(0,5,0,20),Size=UDim2.new(1,-10,0,20),Text="Me Only",TextColor3=Color3.new(1,1,1),TextSize=14,TextXAlignment=0,ZIndex=10,}},
                {25,"Frame",{BackgroundColor3=Color3.new(0.30588236451149,0.30588236451149,0.3098039329052),BorderSizePixel=0,Name="Button",Parent={24},Position=UDim2.new(1,-20,0,0),Size=UDim2.new(0,20,0,20),ZIndex=10,}},
                {26,"TextButton",{BackgroundColor3=Color3.new(0.58823531866074,0.58823531866074,0.59215688705444),BackgroundTransparency=1,BorderSizePixel=0,Font=3,Name="On",Parent={25},Position=UDim2.new(0,2,0,2),Size=UDim2.new(0,16,0,16),Text="",TextColor3=Color3.new(0,0,0),TextSize=14,ZIndex=10,}},
                {27,"TextBox",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),BorderSizePixel=0,ClearTextOnFocus=false,Font=3,Name="Custom",Parent={19},PlaceholderColor3=Color3.new(0.47058826684952,0.47058826684952,0.47058826684952),PlaceholderText="Custom Player Set",Position=UDim2.new(0,5,0,64),Size=UDim2.new(1,-35,0,20),Text="",TextColor3=Color3.new(1,1,1),TextSize=14,TextXAlignment=0,ZIndex=10,}},
                {28,"Frame",{BackgroundColor3=Color3.new(0.30588236451149,0.30588236451149,0.3098039329052),BorderSizePixel=0,Name="CustomButton",Parent={19},Position=UDim2.new(1,-25,0,64),Size=UDim2.new(0,20,0,20),ZIndex=10,}},
                {29,"TextButton",{BackgroundColor3=Color3.new(0.58823531866074,0.58823531866074,0.59215688705444),BackgroundTransparency=1,BorderSizePixel=0,Font=3,Name="On",Parent={28},Position=UDim2.new(0,2,0,2),Size=UDim2.new(0,16,0,16),Text="",TextColor3=Color3.new(0,0,0),TextSize=14,ZIndex=10,}},
                {30,"Frame",{BackgroundColor3=Color3.new(0.19607844948769,0.19607844948769,0.19607844948769),BackgroundTransparency=1,BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),Name="Strings",Parent={18},Position=UDim2.new(0,0,0,25),Size=UDim2.new(1,0,0,64),Visible=false,ZIndex=10,}},
                {31,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Title",Parent={30},Size=UDim2.new(1,0,0,20),Text="Choose String",TextColor3=Color3.new(1,1,1),TextSize=14,ZIndex=10,}},
                {32,"TextLabel",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Font=3,Name="Any",Parent={30},Position=UDim2.new(0,5,0,20),Size=UDim2.new(1,-10,0,20),Text="Any String",TextColor3=Color3.new(1,1,1),TextSize=14,TextXAlignment=0,ZIndex=10,}},
                {33,"Frame",{BackgroundColor3=Color3.new(0.30588236451149,0.30588236451149,0.3098039329052),BorderSizePixel=0,Name="Button",Parent={32},Position=UDim2.new(1,-20,0,0),Size=UDim2.new(0,20,0,20),ZIndex=10,}},
                {34,"TextButton",{BackgroundColor3=Color3.new(0.58823531866074,0.58823531866074,0.59215688705444),BackgroundTransparency=1,BorderSizePixel=0,Font=3,Name="On",Parent={33},Position=UDim2.new(0,2,0,2),Size=UDim2.new(0,16,0,16),Text="",TextColor3=Color3.new(0,0,0),TextSize=14,ZIndex=10,}},
                {54,"Frame",{BackgroundColor3=Color3.new(0.19607844948769,0.19607844948769,0.19607844948769),BackgroundTransparency=1,BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),Name="Numbers",Parent={18},Position=UDim2.new(0,0,0,25),Size=UDim2.new(1,0,0,64),Visible=false,ZIndex=10,}},
                {55,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Title",Parent={54},Size=UDim2.new(1,0,0,20),Text="Choose String",TextColor3=Color3.new(1,1,1),TextSize=14,ZIndex=10,}},
                {56,"TextLabel",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Font=3,Name="Any",Parent={54},Position=UDim2.new(0,5,0,20),Size=UDim2.new(1,-10,0,20),Text="Any Number",TextColor3=Color3.new(1,1,1),TextSize=14,TextXAlignment=0,ZIndex=10,}},
                {57,"Frame",{BackgroundColor3=Color3.new(0.30588236451149,0.30588236451149,0.3098039329052),BorderSizePixel=0,Name="Button",Parent={56},Position=UDim2.new(1,-20,0,0),Size=UDim2.new(0,20,0,20),ZIndex=10,}},
                {58,"TextButton",{BackgroundColor3=Color3.new(0.58823531866074,0.58823531866074,0.59215688705444),BackgroundTransparency=1,BorderSizePixel=0,Font=3,Name="On",Parent={57},Position=UDim2.new(0,2,0,2),Size=UDim2.new(0,16,0,16),Text="",TextColor3=Color3.new(0,0,0),TextSize=14,ZIndex=10,}},
                {59,"TextBox",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),BorderSizePixel=0,ClearTextOnFocus=false,Font=3,Name="Custom",Parent={54},PlaceholderColor3=Color3.new(0.47058826684952,0.47058826684952,0.47058826684952),PlaceholderText="Number",Position=UDim2.new(0,5,0,42),Size=UDim2.new(1,-35,0,20),Text="",TextColor3=Color3.new(1,1,1),TextSize=14,TextXAlignment=0,ZIndex=10,}},
                {60,"Frame",{BackgroundColor3=Color3.new(0.30588236451149,0.30588236451149,0.3098039329052),BorderSizePixel=0,Name="CustomButton",Parent={54},Position=UDim2.new(1,-25,0,42),Size=UDim2.new(0,20,0,20),ZIndex=10,}},
                {61,"TextButton",{BackgroundColor3=Color3.new(0.58823531866074,0.58823531866074,0.59215688705444),BackgroundTransparency=1,BorderSizePixel=0,Font=3,Name="On",Parent={60},Position=UDim2.new(0,2,0,2),Size=UDim2.new(0,16,0,16),Text="",TextColor3=Color3.new(0,0,0),TextSize=14,ZIndex=10,}},
                {35,"TextBox",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),BorderSizePixel=0,ClearTextOnFocus=false,Font=3,Name="Custom",Parent={30},PlaceholderColor3=Color3.new(0.47058826684952,0.47058826684952,0.47058826684952),PlaceholderText="Match String",Position=UDim2.new(0,5,0,42),Size=UDim2.new(1,-35,0,20),Text="",TextColor3=Color3.new(1,1,1),TextSize=14,TextXAlignment=0,ZIndex=10,}},
                {36,"Frame",{BackgroundColor3=Color3.new(0.30588236451149,0.30588236451149,0.3098039329052),BorderSizePixel=0,Name="CustomButton",Parent={30},Position=UDim2.new(1,-25,0,42),Size=UDim2.new(0,20,0,20),ZIndex=10,}},
                {37,"TextButton",{BackgroundColor3=Color3.new(0.58823531866074,0.58823531866074,0.59215688705444),BackgroundTransparency=1,BorderSizePixel=0,Font=3,Name="On",Parent={36},Position=UDim2.new(0,2,0,2),Size=UDim2.new(0,16,0,16),Text="",TextColor3=Color3.new(0,0,0),TextSize=14,ZIndex=10,}},
                {38,"Frame",{BackgroundColor3=Color3.new(0.19607844948769,0.19607844948769,0.19607844948769),BackgroundTransparency=1,BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),Name="DelayEditor",Parent={18},Position=UDim2.new(0,0,0,25),Size=UDim2.new(1,0,0,24),Visible=false,ZIndex=10,}},
                {39,"TextBox",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),BorderSizePixel=0,Font=3,Name="Secs",Parent={38},PlaceholderColor3=Color3.new(0.47058826684952,0.47058826684952,0.47058826684952),Position=UDim2.new(0,60,0,2),Size=UDim2.new(1,-65,0,20),Text="",TextColor3=Color3.new(1,1,1),TextSize=14,TextXAlignment=0,ZIndex=10,}},
                {40,"TextLabel",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Font=3,Name="Label",Parent={39},Position=UDim2.new(0,-55,0,0),Size=UDim2.new(1,0,1,0),Text="Delay (s):",TextColor3=Color3.new(1,1,1),TextSize=14,TextXAlignment=0,ZIndex=10,}},
                {41,"Frame",{BackgroundColor3=currentShade1,BorderSizePixel=0,ClipsDescendants=true,Name="EventTemplate",Parent={6},Size=UDim2.new(1,0,0,20),Visible=false,ZIndex=10,}},
                {42,"TextButton",{BackgroundColor3=currentText1,BackgroundTransparency=1,Font=3,Name="Expand",Parent={41},Size=UDim2.new(0,20,0,20),Text=">",TextColor3=Color3.new(1,1,1),TextSize=18,ZIndex=10,}},
                {43,"TextLabel",{BackgroundColor3=currentText1,BackgroundTransparency=1,Font=3,Name="EventName",Parent={41},Position=UDim2.new(0,25,0,0),Size=UDim2.new(1,-25,0,20),Text="OnSpawn",TextColor3=Color3.new(1,1,1),TextSize=14,TextXAlignment=0,ZIndex=10,}},
                {44,"Frame",{BackgroundColor3=Color3.new(0.19607844948769,0.19607844948769,0.19607844948769),BorderSizePixel=0,BackgroundTransparency=1,ClipsDescendants=true,Name="Cmds",Parent={41},Position=UDim2.new(0,0,0,20),Size=UDim2.new(1,0,1,-20),ZIndex=10,}},
                {45,"Frame",{BackgroundColor3=Color3.new(0.14117647707462,0.14117647707462,0.14509804546833),BorderColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),Name="Add",Parent={44},Position=UDim2.new(0,0,1,-20),Size=UDim2.new(1,0,0,20),ZIndex=10,}},
                {46,"TextBox",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,ClearTextOnFocus=false,Font=3,Parent={45},PlaceholderColor3=Color3.new(0.7843137383461,0.7843137383461,0.7843137383461),PlaceholderText="Add new command",Position=UDim2.new(0,5,0,0),Size=UDim2.new(1,-10,1,0),Text="",TextColor3=Color3.new(1,1,1),TextSize=14,TextXAlignment=0,ZIndex=10,}},
                {47,"Frame",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Name="Holder",Parent={44},Size=UDim2.new(1,0,1,-20),ZIndex=10,}},
                {48,"UIListLayout",{Parent={47},SortOrder=2,}},
                {49,"Frame",{currentShade1,BorderSizePixel=0,ClipsDescendants=true,Name="CmdTemplate",Parent={6},Size=UDim2.new(1,0,0,20),Visible=false,ZIndex=10,}},
                {50,"TextBox",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,ClearTextOnFocus=false,Font=3,Parent={49},PlaceholderColor3=Color3.new(1,1,1),Position=UDim2.new(0,5,0,0),Size=UDim2.new(1,-45,0,20),Text="a\\b\\c\\d",TextColor3=currentText1,TextSize=14,TextXAlignment=0,ZIndex=10,}},
                {51,"TextButton",{BackgroundColor3=currentShade1,BorderSizePixel=0,Font=3,Name="Delete",Parent={49},Position=UDim2.new(1,-20,0,0),Size=UDim2.new(0,20,0,20),Text="X",TextColor3=Color3.new(1,1,1),TextSize=18,ZIndex=10,}},
                {52,"TextButton",{BackgroundColor3=currentShade1,BorderSizePixel=0,Font=3,Name="Settings",Parent={49},Position=UDim2.new(1,-40,0,0),Size=UDim2.new(0,20,0,20),Text="",TextColor3=Color3.new(1,1,1),TextSize=18,ZIndex=10,}},
                {53,"ImageLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Image=getcustomasset("infiniteyield/assets/settings.png"),Parent={52},Position=UDim2.new(0,2,0,2),Size=UDim2.new(0,16,0,16),ZIndex=10,}},
        })
        main.Name = randomString()
        local mainFrame = main:WaitForChild("Content")
        local eventList = mainFrame:WaitForChild("List")
        local eventListHolder = eventList:WaitForChild("Holder")
        local cmdTemplate = mainFrame:WaitForChild("CmdTemplate")
        local eventTemplate = mainFrame:WaitForChild("EventTemplate")
        local settingsFrame = mainFrame:WaitForChild("Settings"):WaitForChild("Slider")
        local settingsTemplates = mainFrame.Settings:WaitForChild("Templates")
        local settingsList = settingsFrame:WaitForChild("List"):WaitForChild("Holder")
        table.insert(shade2,main.TopBar) table.insert(shade1,mainFrame) table.insert(shade2,eventTemplate)
        table.insert(text1,eventTemplate.EventName) table.insert(shade1,eventTemplate.Cmds.Add) table.insert(shade1,cmdTemplate)
        table.insert(text1,cmdTemplate.TextBox) table.insert(shade2,cmdTemplate.Delete) table.insert(shade2,cmdTemplate.Settings)
        table.insert(scroll,mainFrame.List) table.insert(shade1,settingsFrame) table.insert(shade2,settingsFrame.Line)
        table.insert(shade2,settingsFrame.Close) table.insert(scroll,settingsFrame.List) table.insert(shade2,settingsTemplates.DelayEditor.Secs)
        table.insert(text1,settingsTemplates.DelayEditor.Secs) table.insert(text1,settingsTemplates.DelayEditor.Secs.Label) table.insert(text1,settingsTemplates.Players.Title)
        table.insert(shade3,settingsTemplates.Players.CustomButton) table.insert(shade2,settingsTemplates.Players.Custom) table.insert(text1,settingsTemplates.Players.Custom)
        table.insert(shade3,settingsTemplates.Players.Any.Button) table.insert(shade3,settingsTemplates.Players.Me.Button) table.insert(text1,settingsTemplates.Players.Any)
        table.insert(text1,settingsTemplates.Players.Me) table.insert(text1,settingsTemplates.Strings.Title) table.insert(text1,settingsTemplates.Strings.Any)
        table.insert(shade3,settingsTemplates.Strings.Any.Button) table.insert(shade3,settingsTemplates.Strings.CustomButton) table.insert(text1,settingsTemplates.Strings.Custom)
        table.insert(shade2,settingsTemplates.Strings.Custom)
        table.insert(text1,settingsTemplates.Players.Me) table.insert(text1,settingsTemplates.Numbers.Title) table.insert(text1,settingsTemplates.Numbers.Any)
        table.insert(shade3,settingsTemplates.Numbers.Any.Button) table.insert(shade3,settingsTemplates.Numbers.CustomButton) table.insert(text1,settingsTemplates.Numbers.Custom)
        table.insert(shade2,settingsTemplates.Numbers.Custom)

        local tweenInf = TweenInfo.new(0.25,Enum.EasingStyle.Quart,Enum.EasingDirection.Out)

        local currentlyEditingCmd = nil

        settingsFrame:WaitForChild("Close").MouseButton1Click:Connect(function()
                settingsFrame:TweenPosition(UDim2.new(0,-150,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,0.25,true)
        end)

        local function resizeList()
                local size = 0

                for i,v in pairs(eventListHolder:GetChildren()) do
                        if v.Name == "EventTemplate" then
                                size = size + 20
                                if v.Expand.Rotation == 90 then
                                        size = size + 20*(1+(#events[v.EventName:GetAttribute("RawName")].commands or 0))
                                end
                        end
                end

                TweenService:Create(eventList,tweenInf,{CanvasSize = UDim2.new(0,0,0,size)}):Play()

                if size > eventList.AbsoluteSize.Y then
                        eventListHolder.Size = UDim2.new(1,-8,1,0)
                else
                        eventListHolder.Size = UDim2.new(1,0,1,0)
                end
        end

        local function resizeSettingsList()
                local size = 0

                for i,v in pairs(settingsList:GetChildren()) do
                        if v:IsA("Frame") then
                                size = size + v.AbsoluteSize.Y
                        end
                end

                settingsList.Parent.CanvasSize = UDim2.new(0,0,0,size)

                if size > settingsList.Parent.AbsoluteSize.Y then
                        settingsList.Size = UDim2.new(1,-8,1,0)
                else
                        settingsList.Size = UDim2.new(1,0,1,0)
                end
        end

        local function setupCheckbox(button,callback)
                local enabled = button.On.BackgroundTransparency == 0

                local function update()
                        button.On.BackgroundTransparency = (enabled and 0 or 1)
                end

                button.On.MouseButton1Click:Connect(function()
                        enabled = not enabled
                        update()
                        if callback then callback(enabled) end
                end)

                return {
                        Toggle = function(nocall) enabled = not enabled update() if not nocall and callback then callback(enabled) end end,
                        Enable = function(nocall) if enabled then return end enabled = true update()if not nocall and callback then callback(enabled) end end,
                        Disable = function(nocall) if not enabled then return end enabled = false update()if not nocall and callback then callback(enabled) end end,
                        IsEnabled = function() return enabled end
                }
        end

        local function openSettingsEditor(event,cmd)
                currentlyEditingCmd = cmd

                for i,v in pairs(settingsList:GetChildren()) do if v:IsA("Frame") then v:Destroy() end end

                local delayEditor = settingsTemplates.DelayEditor:Clone()
                delayEditor.Secs.FocusLost:Connect(function()
                        cmd[3] = tonumber(delayEditor.Secs.Text) or 0
                        delayEditor.Secs.Text = cmd[3]
                        if onEdited then onEdited() end
                end)
                delayEditor.Secs.Text = cmd[3]
                delayEditor.Visible = true
                table.insert(shade2,delayEditor.Secs)
                table.insert(text1,delayEditor.Secs)
                table.insert(text1,delayEditor.Secs.Label)
                delayEditor.Parent = settingsList

                for i,v in pairs(event.sets) do
                        if v.Type == "Player" then
                                local template = settingsTemplates.Players:Clone()
                                template.Title.Text = v.Name or "Player"

                                local me,any,custom

                                me = setupCheckbox(template.Me.Button,function(on)
                                        if not on then return end
                                        any.Disable()
                                        custom.Disable()
                                        cmd[2][i] = 0
                                        if onEdited then onEdited() end
                                end)

                                any = setupCheckbox(template.Any.Button,function(on)
                                        if not on then return end
                                        me.Disable()
                                        custom.Disable()
                                        cmd[2][i] = 1
                                        if onEdited then onEdited() end
                                end)

                                local customTextBox = template.Custom
                                custom = setupCheckbox(template.CustomButton,function(on)
                                        if not on then return end
                                        me.Disable()
                                        any.Disable()
                                        cmd[2][i] = customTextBox.Text
                                        if onEdited then onEdited() end
                                end)

                                ViewportTextBox.convert(customTextBox)
                                customTextBox.FocusLost:Connect(function()
                                        if custom:IsEnabled() then
                                                cmd[2][i] = customTextBox.Text
                                                if onEdited then onEdited() end
                                        end
                                end)

                                local cVal = cmd[2][i]
                                if cVal == 0 then
                                        me:Enable()
                                elseif cVal == 1 then
                                        any:Enable()
                                else
                                        custom:Enable()
                                        customTextBox.Text = cVal
                                end

                                template.Visible = true
                                table.insert(text1,template.Title)
                                table.insert(shade3,template.CustomButton)
                                table.insert(shade3,template.Any.Button)
                                table.insert(shade3,template.Me.Button)
                                table.insert(text1,template.Any)
                                table.insert(text1,template.Me)
                                template.Parent = settingsList
                        elseif v.Type == "String" then
                                local template = settingsTemplates.Strings:Clone()
                                template.Title.Text = v.Name or "String"

                                local any,custom

                                any = setupCheckbox(template.Any.Button,function(on)
                                        if not on then return end
                                        custom.Disable()
                                        cmd[2][i] = 0
                                        if onEdited then onEdited() end
                                end)

                                local customTextBox = template.Custom
                                custom = setupCheckbox(template.CustomButton,function(on)
                                        if not on then return end
                                        any.Disable()
                                        cmd[2][i] = customTextBox.Text
                                        if onEdited then onEdited() end
                                end)

                                ViewportTextBox.convert(customTextBox)
                                customTextBox.FocusLost:Connect(function()
                                        if custom:IsEnabled() then
                                                cmd[2][i] = customTextBox.Text
                                                if onEdited then onEdited() end
                                        end
                                end)

                                local cVal = cmd[2][i]
                                if cVal == 0 then
                                        any:Enable()
                                else
                                        custom:Enable()
                                        customTextBox.Text = cVal
                                end

                                template.Visible = true
                                table.insert(text1,template.Title)
                                table.insert(text1,template.Any)
                                table.insert(shade3,template.Any.Button)
                                table.insert(shade3,template.CustomButton)
                                template.Parent = settingsList
                        elseif v.Type == "Number" then
                                local template = settingsTemplates.Numbers:Clone()
                                template.Title.Text = v.Name or "Number"

                                local any,custom

                                any = setupCheckbox(template.Any.Button,function(on)
                                        if not on then return end
                                        custom.Disable()
                                        cmd[2][i] = 0
                                        if onEdited then onEdited() end
                                end)

                                local customTextBox = template.Custom
                                custom = setupCheckbox(template.CustomButton,function(on)
                                        if not on then return end
                                        any.Disable()
                                        cmd[2][i] = customTextBox.Text
                                        if onEdited then onEdited() end
                                end)

                                ViewportTextBox.convert(customTextBox)
                                customTextBox.FocusLost:Connect(function()
                                        cmd[2][i] = tonumber(customTextBox.Text) or 0
                                        customTextBox.Text = cmd[2][i]
                                        if custom:IsEnabled() then
                                                if onEdited then onEdited() end
                                        end
                                end)

                                local cVal = cmd[2][i]
                                if cVal == 0 then
                                        any:Enable()
                                else
                                        custom:Enable()
                                        customTextBox.Text = cVal
                                end

                                template.Visible = true
                                table.insert(text1,template.Title)
                                table.insert(text1,template.Any)
                                table.insert(shade3,template.Any.Button)
                                table.insert(shade3,template.CustomButton)
                                template.Parent = settingsList
                        end
                end
                resizeSettingsList()
                settingsFrame:TweenPosition(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,0.25,true)
        end

        local function defaultSettings(ev)
                local res = {}

                for i,v in pairs(ev.sets) do
                        if v.Type == "Player" then
                                res[#res+1] = v.Default or 0
                        elseif v.Type == "String" then
                                res[#res+1] = v.Default or 0
                        elseif v.Type == "Number" then
                                res[#res+1] = v.Default or 0
                        end
                end

                return res
        end

        local function refreshList()
                for i,v in pairs(eventListHolder:GetChildren()) do if v:IsA("Frame") then v:Destroy() end end

                for name,event in pairs(events) do
                        local eventF = eventTemplate:Clone()
                        eventF.EventName.Text = name
                        eventF.Visible = true
                        eventF.EventName:SetAttribute("RawName", name)
                        table.insert(shade2,eventF)
                        table.insert(text1,eventF.EventName)
                        table.insert(shade1,eventF.Cmds.Add)

                        local expanded = false
                        eventF.Expand.MouseButton1Down:Connect(function()
                                expanded = not expanded
                                eventF:TweenSize(UDim2.new(1,0,0,20 + (expanded and 20*#eventF.Cmds.Holder:GetChildren() or 0)),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,0.25,true)
                                eventF.Expand.Rotation = expanded and 90 or 0
                                resizeList()
                        end)

                        local function refreshCommands()
                                for i,v in pairs(eventF.Cmds.Holder:GetChildren()) do
                                        if v.Name == "CmdTemplate" then
                                                v:Destroy()
                                        end
                                end

                                eventF.EventName.Text = name..(#event.commands > 0 and " ("..#event.commands..")" or "")

                                for i,cmd in pairs(event.commands) do
                                        local cmdF = cmdTemplate:Clone()
                                        local cmdTextBox = cmdF.TextBox
                                        ViewportTextBox.convert(cmdTextBox)
                                        cmdTextBox.Text = cmd[1]
                                        cmdF.Visible = true
                                        table.insert(shade1,cmdF)
                                        table.insert(shade2,cmdF.Delete)
                                        table.insert(shade2,cmdF.Settings)

                                        cmdTextBox.FocusLost:Connect(function()
                                                event.commands[i] = {cmdTextBox.Text,cmd[2],cmd[3]}
                                                if onEdited then onEdited() end
                                        end)

                                        cmdF.Settings.MouseButton1Click:Connect(function()
                                                openSettingsEditor(event,cmd)
                                        end)

                                        cmdF.Delete.MouseButton1Click:Connect(function()
                                                table.remove(event.commands,i)
                                                refreshCommands()
                                                resizeList()

                                                if currentlyEditingCmd == cmd then
                                                        settingsFrame:TweenPosition(UDim2.new(0,-150,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,0.25,true)
                                                end
                                                if onEdited then onEdited() end
                                        end)

                                        cmdF.Parent = eventF.Cmds.Holder
                                end

                                eventF:TweenSize(UDim2.new(1,0,0,20 + (expanded and 20*#eventF.Cmds.Holder:GetChildren() or 0)),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,0.25,true)
                        end

                        local newBox = eventF.Cmds.Add.TextBox
                        ViewportTextBox.convert(newBox)
                        newBox.FocusLost:Connect(function(enter)
                                if enter then
                                        event.commands[#event.commands+1] = {newBox.Text,defaultSettings(event),0}
                                        newBox.Text = ""

                                        refreshCommands()
                                        resizeList()
                                        if onEdited then onEdited() end
                                end
                        end)

                        --eventF:GetPropertyChangedSignal("AbsoluteSize"):Connect(resizeList)

                        eventF.Parent = eventListHolder

                        refreshCommands()
                end

                resizeList()
        end

        local function saveData()
                local result = {}
                for i,v in pairs(events) do
                        result[i] = v.commands
                end
                return HttpService:JSONEncode(result)
        end

        local function loadData(str)
                local data = HttpService:JSONDecode(str)
                for i,v in pairs(data) do
                        if events[i] then
                                events[i].commands = v
                        end
                end
        end

        local function addCmd(event,data)
                table.insert(events[event].commands,data)
        end

        local function setOnEdited(f)
                if type(f) == "function" then
                        onEdited = f
                end
        end

        main.TopBar.Close.MouseButton1Click:Connect(function()
                main:TweenPosition(UDim2.new(0.5,-175,0,-500), "InOut", "Quart", 0.5, true, nil)
        end)
        dragGUI(main)
        main.Parent = ScaledHolder

        return {
                RegisterEvent = registerEvent,
                FireEvent = fireEvent,
                Refresh = refreshList,
                SaveData = saveData,
                LoadData = loadData,
                AddCmd = addCmd,
                Frame = main,
                SetOnEdited = setOnEdited
        }
end)()

reference = (function()
        local main = create({
                {1,"Frame",{BackgroundColor3=Color3.new(0.14117647707462,0.14117647707462,0.14509804546833),BackgroundTransparency=1,BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),BorderSizePixel=0,Name="Main",Position=UDim2.new(0.5,-250,0,-500),Size=UDim2.new(0,500,0,20),ZIndex=10,}},
                {2,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderSizePixel=0,Name="TopBar",Parent={1},Size=UDim2.new(1,0,0,20),ZIndex=10,}},
                {3,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Title",Parent={2},Size=UDim2.new(1,0,0.94999998807907,0),Text="Reference",TextColor3=Color3.new(1,1,1),TextSize=14,ZIndex=10,}},
                {4,"TextButton",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Close",Parent={2},Position=UDim2.new(1,-20,0,0),Size=UDim2.new(0,20,0,20),Text="",TextColor3=Color3.new(1,1,1),TextSize=14,ZIndex=10,}},
                {5,"ImageLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Image=getcustomasset("infiniteyield/assets/close.png"),Parent={4},Position=UDim2.new(0,5,0,5),Size=UDim2.new(0,10,0,10),ZIndex=10,}},
                {6,"Frame",{BackgroundColor3=Color3.new(0.14117647707462,0.14117647707462,0.14509804546833),BorderSizePixel=0,Name="Content",Parent={1},Position=UDim2.new(0,0,0,20),Size=UDim2.new(1,0,0,300),ZIndex=10,}},
                {7,"ScrollingFrame",{BackgroundColor3=Color3.new(0.14117647707462,0.14117647707462,0.14509804546833),BackgroundTransparency=1,BorderColor3=Color3.new(0.15686275064945,0.15686275064945,0.15686275064945),BorderSizePixel=0,BottomImage="rbxasset://textures/ui/Scroll/scroll-middle.png",CanvasSize=UDim2.new(0,0,0,1313),Name="List",Parent={6},ScrollBarImageColor3=Color3.new(0.30588236451149,0.30588236451149,0.3098039329052),ScrollBarThickness=8,Size=UDim2.new(1,0,1,0),TopImage="rbxasset://textures/ui/Scroll/scroll-middle.png",VerticalScrollBarInset=2,ZIndex=10,}},
                {8,"UIListLayout",{Parent={7},SortOrder=2,}},
                {9,"Frame",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Name="Section",Parent={7},Size=UDim2.new(1,0,0,429),ZIndex=10,}},
                {10,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Header",Parent={9},Position=UDim2.new(0,8,0,5),Size=UDim2.new(1,-8,0,20),Text="Special Player Cases",TextColor3=Color3.new(1,1,1),TextSize=20,TextXAlignment=0,ZIndex=10,}},
                {11,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={9},Position=UDim2.new(0,8,0,25),Size=UDim2.new(1,-8,0,20),Text="These keywords can be used to quickly select groups of players in commands:",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {12,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderSizePixel=0,Name="Line",Parent={9},Position=UDim2.new(0,10,1,-1),Size=UDim2.new(1,-20,0,1),ZIndex=10,}},
                {13,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Cases",Parent={9},Position=UDim2.new(0,8,0,55),Size=UDim2.new(1,-16,0,342),ZIndex=10,}},
                {14,"UIListLayout",{Parent={13},SortOrder=2,}},
                {15,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,LayoutOrder=-4,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {16,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={15},Size=UDim2.new(1,0,1,0),Text="all",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {17,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={15},Position=UDim2.new(0,15,0,0),Size=UDim2.new(1,0,1,0),Text="- includes everyone",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {18,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,LayoutOrder=-3,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {19,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={18},Size=UDim2.new(1,0,1,0),Text="others",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {20,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={18},Position=UDim2.new(0,37,0,0),Size=UDim2.new(1,0,1,0),Text="- includes everyone except you",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {21,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,LayoutOrder=-2,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {22,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={21},Size=UDim2.new(1,0,1,0),Text="me",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {23,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={21},Position=UDim2.new(0,19,0,0),Size=UDim2.new(1,0,1,0),Text="- includes your player only",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {24,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {25,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={24},Size=UDim2.new(1,0,1,0),Text="#[number]",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {26,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={24},Position=UDim2.new(0,59,0,0),Size=UDim2.new(1,0,1,0),Text="- gets a specified amount of random players",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {27,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {28,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={27},Size=UDim2.new(1,0,1,0),Text="random",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {29,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={27},Position=UDim2.new(0,44,0,0),Size=UDim2.new(1,0,1,0),Text="- affects a random player",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {30,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {31,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={30},Size=UDim2.new(1,0,1,0),Text="%[team name]",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {32,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={30},Position=UDim2.new(0,78,0,0),Size=UDim2.new(1,0,1,0),Text="- includes everyone on a given team",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {33,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {34,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={33},Size=UDim2.new(1,0,1,0),Text="allies / team",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {35,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={33},Position=UDim2.new(0,63,0,0),Size=UDim2.new(1,0,1,0),Text="- players who are on your team",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {36,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {37,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={36},Size=UDim2.new(1,0,1,0),Text="enemies / nonteam",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {38,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={36},Position=UDim2.new(0,101,0,0),Size=UDim2.new(1,0,1,0),Text="- players who are not on your team",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {39,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {40,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={39},Size=UDim2.new(1,0,1,0),Text="friends",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {41,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={39},Position=UDim2.new(0,40,0,0),Size=UDim2.new(1,0,1,0),Text="- anyone who is friends with you",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {42,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {43,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={42},Size=UDim2.new(1,0,1,0),Text="nonfriends",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {44,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={42},Position=UDim2.new(0,61,0,0),Size=UDim2.new(1,0,1,0),Text="- anyone who is not friends with you",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {45,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {46,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={45},Size=UDim2.new(1,0,1,0),Text="guests",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {47,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={45},Position=UDim2.new(0,36,0,0),Size=UDim2.new(1,0,1,0),Text="- guest players (obsolete)",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {48,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {49,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={48},Size=UDim2.new(1,0,1,0),Text="bacons",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {50,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={48},Position=UDim2.new(0,40,0,0),Size=UDim2.new(1,0,1,0),Text="- anyone with the \"bacon\" or pal hair",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {51,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {52,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={51},Size=UDim2.new(1,0,1,0),Text="age[number]",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {53,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={51},Position=UDim2.new(0,71,0,0),Size=UDim2.new(1,0,1,0),Text="- includes anyone below or at the given age",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {54,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {55,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={54},Size=UDim2.new(1,0,1,0),Text="rad[number]",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {56,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={54},Position=UDim2.new(0,70,0,0),Size=UDim2.new(1,0,1,0),Text="- includes anyone within the given radius",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {57,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {58,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={57},Size=UDim2.new(1,0,1,0),Text="nearest",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {59,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={57},Position=UDim2.new(0,43,0,0),Size=UDim2.new(1,0,1,0),Text="- gets the closest player to you",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {60,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {61,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={60},Size=UDim2.new(1,0,1,0),Text="farthest",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {62,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={60},Position=UDim2.new(0,46,0,0),Size=UDim2.new(1,0,1,0),Text="- gets the farthest player from you",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {63,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {64,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={63},Size=UDim2.new(1,0,1,0),Text="group[ID]",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {65,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={63},Position=UDim2.new(0,55,0,0),Size=UDim2.new(1,0,1,0),Text="- gets players who are in a certain group",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {66,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {67,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={66},Size=UDim2.new(1,0,1,0),Text="alive",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {68,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={66},Position=UDim2.new(0,27,0,0),Size=UDim2.new(1,0,1,0),Text="- gets players who are alive",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {69,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {70,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={69},Size=UDim2.new(1,0,1,0),Text="dead",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {71,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={69},Position=UDim2.new(0,29,0,0),Size=UDim2.new(1,0,1,0),Text="- gets players who are dead",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {72,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BackgroundTransparency=1,BorderSizePixel=0,LayoutOrder=-1,Name="Case",Parent={13},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,0,0,18),ZIndex=10,}},
                {73,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="CaseName",Parent={72},Size=UDim2.new(1,0,1,0),Text="@username",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {74,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="CaseDesc",Parent={72},Position=UDim2.new(0,66,0,0),Size=UDim2.new(1,0,1,0),Text="- searches for players by username only (ignores displaynames)",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {75,"Frame",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Name="Section",Parent={7},Size=UDim2.new(1,0,0,180),ZIndex=10,}},
                {76,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Header",Parent={75},Position=UDim2.new(0,8,0,5),Size=UDim2.new(1,-8,0,20),Text="Various Operators",TextColor3=Color3.new(1,1,1),TextSize=20,TextXAlignment=0,ZIndex=10,}},
                {77,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderSizePixel=0,Name="Line",Parent={75},Position=UDim2.new(0,10,1,-1),Size=UDim2.new(1,-20,0,1),ZIndex=10,}},
                {78,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Text",Parent={75},Position=UDim2.new(0,8,0,30),Size=UDim2.new(1,-8,0,16),Text="Use commas to separate multiple expressions:",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,TextYAlignment=0,ZIndex=10,}},
                {79,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Text",Parent={75},Position=UDim2.new(0,8,0,75),Size=UDim2.new(1,-8,0,16),Text="Use - to exclude, and + to include players in your expression:",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,TextYAlignment=0,ZIndex=10,}},
                {80,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={75},Position=UDim2.new(0,8,0,91),Size=UDim2.new(1,-8,0,16),Text=";locate %blue-friends (gets players in blue team who aren't your friends)",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,TextYAlignment=0,ZIndex=10,}},
                {81,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={75},Position=UDim2.new(0,8,0,46),Size=UDim2.new(1,-8,0,16),Text=";locate noob,noob2,bob",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,TextYAlignment=0,ZIndex=10,}},
                {82,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Text",Parent={75},Position=UDim2.new(0,8,0,120),Size=UDim2.new(1,-8,0,16),Text="Put ! before a command to run it with the last arguments it was ran with:",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,TextYAlignment=0,ZIndex=10,}},
                {83,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={75},Position=UDim2.new(0,8,0,136),Size=UDim2.new(1,-8,0,32),Text="After running ;offset 0 100 0,  you can run !offset anytime to repeat that command with the same arguments that were used to run it last time",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,TextYAlignment=0,ZIndex=10,}},
                {84,"Frame",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Name="Section",Parent={7},Size=UDim2.new(1,0,0,154),ZIndex=10,}},
                {85,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Header",Parent={84},Position=UDim2.new(0,8,0,5),Size=UDim2.new(1,-8,0,20),Text="Command Looping",TextColor3=Color3.new(1,1,1),TextSize=20,TextXAlignment=0,ZIndex=10,}},
                {86,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Text",Parent={84},Position=UDim2.new(0,8,0,30),Size=UDim2.new(1,-8,0,20),Text="Form: [How many times it loops]^[delay (optional)]^[command]",TextColor3=Color3.new(1,1,1),TextSize=15,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {87,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderSizePixel=0,Name="Line",Parent={84},Position=UDim2.new(0,10,1,-1),Size=UDim2.new(1,-20,0,1),ZIndex=10,}},
                {88,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={84},Position=UDim2.new(0,8,0,50),Size=UDim2.new(1,-8,0,20),Text="Use the 'breakloops' command to stop all running loops.",TextColor3=Color3.new(1,1,1),TextSize=15,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {89,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Text",Parent={84},Position=UDim2.new(0,8,0,80),Size=UDim2.new(1,-8,0,16),Text="Examples:",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,TextYAlignment=0,ZIndex=10,}},
                {90,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={84},Position=UDim2.new(0,8,0,98),Size=UDim2.new(1,-8,0,42),Text=";5^btools - gives you 5 sets of btools\n;10^3^drophats - drops your hats every 3 seconds 10 times\n;inf^0.1^animspeed 100 - infinitely loops your animation speed to 100",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,TextYAlignment=0,ZIndex=10,}},
                {91,"Frame",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Name="Section",Parent={7},Size=UDim2.new(1,0,0,120),ZIndex=10,}},
                {92,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Header",Parent={91},Position=UDim2.new(0,8,0,5),Size=UDim2.new(1,-8,0,20),Text="Execute Multiple Commands at Once",TextColor3=Color3.new(1,1,1),TextSize=20,TextXAlignment=0,ZIndex=10,}},
                {93,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Text",Parent={91},Position=UDim2.new(0,8,0,30),Size=UDim2.new(1,-8,0,20),Text="You can execute multiple commands at once using \"\\\"",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {94,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderSizePixel=0,Name="Line",Parent={91},Position=UDim2.new(0,10,1,-1),Size=UDim2.new(1,-20,0,1),ZIndex=10,}},
                {95,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Text",Parent={91},Position=UDim2.new(0,8,0,60),Size=UDim2.new(1,-8,0,16),Text="Examples:",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,TextYAlignment=0,ZIndex=10,}},
                {96,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={91},Position=UDim2.new(0,8,0,78),Size=UDim2.new(1,-8,0,32),Text=";drophats\\respawn - drops your hats and respawns you\n;enable inventory\\enable playerlist\\refresh - enables those coregui items and refreshes you",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,TextYAlignment=0,ZIndex=10,}},
                {97,"Frame",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Name="Section",Parent={7},Size=UDim2.new(1,0,0,75),ZIndex=10,}},
                {98,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Header",Parent={97},Position=UDim2.new(0,8,0,5),Size=UDim2.new(1,-8,0,20),Text="Browse Command History",TextColor3=Color3.new(1,1,1),TextSize=20,TextXAlignment=0,ZIndex=10,}},
                {99,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={97},Position=UDim2.new(0,8,0,30),Size=UDim2.new(1,-8,0,32),Text="While focused on the command bar, you can use the up and down arrow keys to browse recently used commands",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {100,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderSizePixel=0,Name="Line",Parent={97},Position=UDim2.new(0,10,1,-1),Size=UDim2.new(1,-20,0,1),ZIndex=10,}},
                {101,"Frame",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Name="Section",Parent={7},Size=UDim2.new(1,0,0,75),ZIndex=10,}},
                {102,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Header",Parent={101},Position=UDim2.new(0,8,0,5),Size=UDim2.new(1,-8,0,20),Text="Autocomplete in the Command Bar",TextColor3=Color3.new(1,1,1),TextSize=20,TextXAlignment=0,ZIndex=10,}},
                {103,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={101},Position=UDim2.new(0,8,0,30),Size=UDim2.new(1,-8,0,32),Text="While focused on the command bar, you can use the tab key to insert the top suggested command into the command bar.",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {104,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderSizePixel=0,Name="Line",Parent={101},Position=UDim2.new(0,10,1,-1),Size=UDim2.new(1,-20,0,1),ZIndex=10,}},
                {105,"Frame",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Name="Section",Parent={7},Size=UDim2.new(1,0,0,175),ZIndex=10,}},
                {106,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Header",Parent={105},Position=UDim2.new(0,8,0,5),Size=UDim2.new(1,-8,0,20),Text="Using Event Binds",TextColor3=Color3.new(1,1,1),TextSize=20,TextXAlignment=0,ZIndex=10,}},
                {107,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={105},Position=UDim2.new(0,8,0,30),Size=UDim2.new(1,-8,0,32),Text="Use event binds to set up commands that get executed when certain events happen. You can edit the conditions for an event command to run (such as which player triggers it).",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {108,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderSizePixel=0,Name="Line",Parent={105},Position=UDim2.new(0,10,1,-1),Size=UDim2.new(1,-20,0,1),ZIndex=10,}},
                {109,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={105},Position=UDim2.new(0,8,0,70),Size=UDim2.new(1,-8,0,48),Text="Some events may send arguments; you can use them in your event command by using $ followed by the argument number ($1, $2, etc). You can find out the order and types of these arguments by looking at the settings of the event command.",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {110,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Text",Parent={105},Position=UDim2.new(0,8,0,130),Size=UDim2.new(1,-8,0,16),Text="Example:",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,TextYAlignment=0,ZIndex=10,}},
                {111,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={105},Position=UDim2.new(0,8,0,148),Size=UDim2.new(1,-8,0,16),Text="Setting up 'goto $1' on the OnChatted event will teleport you to any player that chats.",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,TextYAlignment=0,ZIndex=10,}},
                {112,"Frame",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Name="Section",Parent={7},Size=UDim2.new(1,0,0,105),ZIndex=10,}},
                {113,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=4,Name="Header",Parent={112},Position=UDim2.new(0,8,0,5),Size=UDim2.new(1,-8,0,20),Text="Get Further Help",TextColor3=Color3.new(1,1,1),TextSize=20,TextXAlignment=0,ZIndex=10,}},
                {114,"TextLabel",{BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,Font=3,Name="Text",Parent={112},Position=UDim2.new(0,8,0,30),Size=UDim2.new(1,-8,0,32),Text="You can join the Discord server to get support with IY,  and read up on more documentation such as the Plugin API.",TextColor3=Color3.new(1,1,1),TextSize=14,TextWrapped=true,TextXAlignment=0,ZIndex=10,}},
                {115,"Frame",{BackgroundColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),BorderSizePixel=0,Name="Line",Parent={112},Position=UDim2.new(0,10,1,-1),Size=UDim2.new(1,-20,0,1),Visible=false,ZIndex=10,}},
                {116,"TextButton",{BackgroundColor3=Color3.new(0.48627451062202,0.61960786581039,0.85098040103912),BorderColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),Font=4,Name="InviteButton",Parent={112},Position=UDim2.new(0,5,0,75),Size=UDim2.new(1,-10,0,25),Text="Copy Discord Invite Link (https://discord.gg/78ZuWSq)",TextColor3=Color3.new(0.1803921610117,0.1803921610117,0.1843137294054),TextSize=16,ZIndex=10,}},
        })
        for i,v in pairs(main.Content.List:GetDescendants()) do
                if v:IsA("TextLabel") then
                        table.insert(text1,v)
                end
        end
        table.insert(scroll,main.Content.List)
        table.insert(shade1,main.Content)
        table.insert(shade2,main.TopBar)
        main.Name = randomString()
        main.TopBar.Close.MouseButton1Click:Connect(function()
                main:TweenPosition(UDim2.new(0.5,-250,0,-500), "InOut", "Quart", 0.5, true, nil)
        end)
        local inviteButton = main:FindFirstChild("InviteButton",true)
        local lastPress = nil
        inviteButton.MouseButton1Click:Connect(function()
                if everyClipboard then
                        toClipboard("https://discord.gg/78ZuWSq")
                        inviteButton.Text = "Copied"
                else
                        inviteButton.Text = "No Clipboard Function, type out the link"
                end
                local pressTime = tick()
                lastPress = pressTime
                wait(2)
                if lastPress ~= pressTime then return end
                inviteButton.Text = "Copy Discord Invite Link (https://discord.gg/78ZuWSq)"
        end)
        dragGUI(main)
        main.Parent = ScaledHolder

        ReferenceButton.MouseButton1Click:Connect(function()
                main:TweenPosition(UDim2.new(0.5,-250,0.5,-150), "InOut", "Quart", 0.5, true, nil)
        end)
end)()

currentShade1 = Color3.fromRGB(8, 8, 14)
currentShade2 = Color3.fromRGB(15, 15, 28)
currentShade3 = Color3.fromRGB(30, 30, 55)
currentText1 = Color3.new(1, 1, 1)
currentText2 = Color3.new(0, 0, 0)
currentScroll = Color3.fromRGB(50, 100, 255)

defaultGuiScale = IsOnMobile and 0.9 or 1
defaultsettings = {
        prefix = ';';
        StayOpen = false;
        guiScale = defaultGuiScale;
        espTransparency = 0.3;
        keepIY = true;
        logsEnabled = false;
        jLogsEnabled = false;
        aliases = {};
        binds = {};
        WayPoints = {};
        PluginsTable = {};
        currentShade1 = {currentShade1.R,currentShade1.G,currentShade1.B};
        currentShade2 = {currentShade2.R,currentShade2.G,currentShade2.B};
        currentShade3 = {currentShade3.R,currentShade3.G,currentShade3.B};
        currentText1 = {currentText1.R,currentText1.G,currentText1.B};
        currentText2 = {currentText2.R,currentText2.G,currentText2.B};
        currentScroll = {currentScroll.R,currentScroll.G,currentScroll.B};
        eventBinds = eventEditor.SaveData()
}

defaults = HttpService:JSONEncode(defaultsettings)
nosaves = false
useFactorySettings = function()
        prefix = ';'
        StayOpen = false
        guiScale = defaultGuiScale
        KeepInfYield = true
        espTransparency = 0.3
        logsEnabled = false
        jLogsEnabled = false
        logsWebhook = nil
        aliases = {}
        binds = {}
        WayPoints = {}
        PluginsTable = {}
end

function createPopup(title, text)
        local Popup = Instance.new("Frame")
        local background = Instance.new("Frame")
        local Directions = Instance.new("TextLabel")
        local shadow = Instance.new("Frame")
        local PopupText = Instance.new("TextLabel")
        local Exit = Instance.new("TextButton")
        local ExitImage = Instance.new("ImageLabel")

        Popup.Name = randomString()
        Popup.Parent = ScaledHolder
        Popup.Active = true
        Popup.BackgroundTransparency = 1
        Popup.Position = UDim2.new(0.5, -180, 0, -500)
        Popup.Size = UDim2.new(0, 360, 0, 20)
        Popup.ZIndex = 10

        background.Name = "background"
        background.Parent = Popup
        background.Active = true
        background.BackgroundColor3 = Color3.fromRGB(36, 36, 37)
        background.BorderSizePixel = 0
        background.Position = UDim2.new(0, 0, 0, 20)
        background.Size = UDim2.new(0, 360, 0, 205)
        background.ZIndex = 10

        Directions.Name = "Directions"
        Directions.Parent = background
        Directions.BackgroundTransparency = 1
        Directions.BorderSizePixel = 0
        Directions.Position = UDim2.new(0, 10, 0, 10)
        Directions.Size = UDim2.new(0, 340, 0, 185)
        Directions.Font = Enum.Font.SourceSans
        Directions.TextSize = 14
        Directions.Text = text
        Directions.TextColor3 = Color3.new(1, 1, 1)
        Directions.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
        Directions.TextStrokeTransparency = 0.5
        Directions.TextWrapped = true
        Directions.TextXAlignment = Enum.TextXAlignment.Left
        Directions.TextYAlignment = Enum.TextYAlignment.Top
        Directions.ZIndex = 10

        shadow.Name = "shadow"
        shadow.Parent = Popup
        shadow.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
        shadow.BorderSizePixel = 0
        shadow.Size = UDim2.new(0, 360, 0, 20)
        shadow.ZIndex = 10

        PopupText.Name = "PopupText"
        PopupText.Parent = shadow
        PopupText.BackgroundTransparency = 1
        PopupText.Size = UDim2.new(1, 0, 0.95, 0)
        PopupText.ZIndex = 10
        PopupText.Font = Enum.Font.SourceSans
        PopupText.TextSize = 14
        PopupText.Text = title
        PopupText.TextColor3 = Color3.new(1, 1, 1)
        PopupText.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
        PopupText.TextStrokeTransparency = 0.5
        PopupText.TextWrapped = true

        Exit.Name = "Exit"
        Exit.Parent = shadow
        Exit.BackgroundTransparency = 1
        Exit.Position = UDim2.new(1, -20, 0, 0)
        Exit.Size = UDim2.new(0, 20, 0, 20)
        Exit.Text = ""
        Exit.ZIndex = 10

        ExitImage.Parent = Exit
        ExitImage.BackgroundColor3 = Color3.new(1, 1, 1)
        ExitImage.BackgroundTransparency = 1
        ExitImage.Position = UDim2.new(0, 5, 0, 5)
        ExitImage.Size = UDim2.new(0, 10, 0, 10)
        ExitImage.Image = getcustomasset("infiniteyield/assets/close.png")
        ExitImage.ZIndex = 10

        Popup:TweenPosition(UDim2.new(0.5, -180, 0, 150), "InOut", "Quart", 0.5, true, nil)

        Exit.MouseButton1Click:Connect(function()
                Popup:TweenPosition(UDim2.new(0.5, -180, 0, -500), "InOut", "Quart", 0.5, true, nil)
                task.wait(0.6)
                Popup:Destroy()
        end)
end

local loadedEventData = nil
local jsonAttempts = 0
function saves()
        if writefileExploit() and readfileExploit() and jsonAttempts < 10 then
                local readSuccess, out = readfile("IY_FE.iy", true)
                if readSuccess then
                        if out ~= nil and tostring(out):gsub("%s", "") ~= "" then
                                local success, response = pcall(function()
                                        local json = HttpService:JSONDecode(out)
                                        if vtype(json.prefix, "string") then prefix = json.prefix else prefix = ';' end
                                        if vtype(json.StayOpen, "boolean") then StayOpen = json.StayOpen else StayOpen = false end
                                        if vtype(json.guiScale, "number") then guiScale = json.guiScale else guiScale = defaultGuiScale end
                                        if vtype(json.keepIY, "boolean") then KeepInfYield = json.keepIY else KeepInfYield = true end
                                        if vtype(json.espTransparency, "number") then espTransparency = json.espTransparency else espTransparency = 0.3 end
                                        if vtype(json.logsEnabled, "boolean") then logsEnabled = json.logsEnabled else logsEnabled = false end
                                        if vtype(json.jLogsEnabled, "boolean") then jLogsEnabled = json.jLogsEnabled else jLogsEnabled = false end
                                        if vtype(json.logsWebhook, "string") then logsWebhook = json.logsWebhook else logsWebhook = nil end
                                        if vtype(json.aliases, "table") then aliases = json.aliases else aliases = {} end
                                        if vtype(json.binds, "table") then binds = json.binds else binds = {} end
                                        if vtype(json.spawnCmds, "table") then spawnCmds = json.spawnCmds end
                                        if vtype(json.WayPoints, "table") then AllWaypoints = json.WayPoints else WayPoints = {} AllWaypoints = {} end
                                        if vtype(json.PluginsTable, "table") then PluginsTable = json.PluginsTable else PluginsTable = {} end
                                        if vtype(json.currentShade1, "table") then currentShade1 = Color3.new(json.currentShade1[1],json.currentShade1[2],json.currentShade1[3]) end
                                        if vtype(json.currentShade2, "table") then currentShade2 = Color3.new(json.currentShade2[1],json.currentShade2[2],json.currentShade2[3]) end
                                        if vtype(json.currentShade3, "table") then currentShade3 = Color3.new(json.currentShade3[1],json.currentShade3[2],json.currentShade3[3]) end
                                        if vtype(json.currentText1, "table") then currentText1 = Color3.new(json.currentText1[1],json.currentText1[2],json.currentText1[3]) end
                                        if vtype(json.currentText2, "table") then currentText2 = Color3.new(json.currentText2[1],json.currentText2[2],json.currentText2[3]) end
                                        if vtype(json.currentScroll, "table") then currentScroll = Color3.new(json.currentScroll[1],json.currentScroll[2],json.currentScroll[3]) end
                                        if vtype(json.eventBinds, "string") then loadedEventData = json.eventBinds end
                                end)
                                if not success then
                                        jsonAttempts = jsonAttempts + 1
                                        warn("Save Json Error:", response)
                                        warn("Overwriting Save File")
                                        writefile("IY_FE.iy", defaults, true)
                                        wait()
                                        saves()
                                end
                        else
                                writefile("IY_FE.iy", defaults, true)
                                wait()
                                local dReadSuccess, dOut = readfile("IY_FE.iy", true)
                                if dReadSuccess and dOut ~= nil and tostring(dOut):gsub("%s", "") ~= "" then
                                        saves()
                                else
                                        nosaves = true
                                        useFactorySettings()
                                        createPopup("File Error", "There was a problem writing a save file to your PC.\n\nPlease contact the developer/support team for your exploit and tell them writefile/readfile is not working.\n\nYour settings, keybinds, waypoints, and aliases will not save if you continue.\n\nThings to try:\n> Make sure a 'workspace' folder is located in the same folder as your exploit\n> If your exploit is inside of a zip/rar file, extract it.\n> Rejoin the game and try again or restart your PC and try again.")
                                end
                        end
                else
                        writefile("IY_FE.iy", defaults, true)
                        wait()
                        local dReadSuccess, dOut = readfile("IY_FE.iy", true)
                        if dReadSuccess and dOut ~= nil and tostring(dOut):gsub("%s", "") ~= "" then
                                saves()
                        else
                                nosaves = true
                                useFactorySettings()
                                createPopup("File Error", "There was a problem writing a save file to your PC.\n\nPlease contact the developer/support team for your exploit and tell them writefile/readfile is not working.\n\nYour settings, keybinds, waypoints, and aliases will not save if you continue.\n\nThings to try:\n> Make sure a 'workspace' folder is located in the same folder as your exploit\n> If your exploit is inside of a zip/rar file, extract it.\n> Rejoin the game and try again or restart your PC and try again.")
                        end
                end
        else
                if jsonAttempts >= 10 then
                        nosaves = true
                        useFactorySettings()
                        createPopup("File Error", "Sorry, we have attempted to parse your save file, but it is unreadable!\n\nArc Yield is now using factory settings until your exploit's file system works.\n\nYour save file has not been deleted.")
                else
                        nosaves = true
                        useFactorySettings()
                end
        end
end

saves()

function updatesaves()
        if nosaves == false and writefileExploit() then
                local update = {
                        prefix = prefix;
                        StayOpen = StayOpen;
                        guiScale = guiScale;
                        keepIY = KeepInfYield;
                        espTransparency = espTransparency;
                        logsEnabled = logsEnabled;
                        jLogsEnabled = jLogsEnabled;
                        logsWebhook = logsWebhook;
                        aliases = aliases;
                        binds = binds or {};
                        WayPoints = AllWaypoints;
                        PluginsTable = PluginsTable;
                        currentShade1 = {currentShade1.R,currentShade1.G,currentShade1.B};
                        currentShade2 = {currentShade2.R,currentShade2.G,currentShade2.B};
                        currentShade3 = {currentShade3.R,currentShade3.G,currentShade3.B};
                        currentText1 = {currentText1.R,currentText1.G,currentText1.B};
                        currentText2 = {currentText2.R,currentText2.G,currentText2.B};
                        currentScroll = {currentScroll.R,currentScroll.G,currentScroll.B};
                        eventBinds = eventEditor.SaveData()
                }
                writefileCooldown("IY_FE.iy", HttpService:JSONEncode(update))
        end
end

eventEditor.SetOnEdited(updatesaves)

pWayPoints = {}
WayPoints = {}

if #AllWaypoints > 0 then
        for i = 1, #AllWaypoints do
                if not AllWaypoints[i].GAME or AllWaypoints[i].GAME == PlaceId then
                        WayPoints[#WayPoints + 1] = {NAME = AllWaypoints[i].NAME, COORD = {AllWaypoints[i].COORD[1], AllWaypoints[i].COORD[2], AllWaypoints[i].COORD[3]}, GAME = AllWaypoints[i].GAME}
                end
        end
end

if type(binds) ~= "table" then binds = {} end

if type(PluginsTable) == "table" then
        for i = #PluginsTable, 1, -1 do
                if string.sub(PluginsTable[i], -3) ~= ".iy" then
                        table.remove(PluginsTable, i)
                end
        end
end

function Time()
        local HOUR = math.floor((tick() % 86400) / 3600)
        local MINUTE = math.floor((tick() % 3600) / 60)
        local SECOND = math.floor(tick() % 60)
        local AP = HOUR > 11 and 'PM' or 'AM'
        HOUR = (HOUR % 12 == 0 and 12 or HOUR % 12)
        HOUR = HOUR < 10 and '0' .. HOUR or HOUR
        MINUTE = MINUTE < 10 and '0' .. MINUTE or MINUTE
        SECOND = SECOND < 10 and '0' .. SECOND or SECOND
        return HOUR .. ':' .. MINUTE .. ':' .. SECOND .. ' ' .. AP
end

PrefixBox.Text = prefix
local SettingsOpen = false
local isHidden = false

if StayOpen == false then
        On.BackgroundTransparency = 1
else
        On.BackgroundTransparency = 0
end

if logsEnabled then
        Toggle.Text = 'Enabled'
else
        Toggle.Text = 'Disabled'
end

if jLogsEnabled then
        Toggle_2.Text = 'Enabled'
else
        Toggle_2.Text = 'Disabled'
end

function maximizeHolder()
        if StayOpen == false then
                Holder:TweenPosition(UDim2.new(1, Holder.Position.X.Offset, 1, -220), "InOut", "Quart", 0.2, true, nil)
        end
end

minimizeNum = -20
function minimizeHolder()
        if StayOpen == false then
                Holder:TweenPosition(UDim2.new(1, Holder.Position.X.Offset, 1, minimizeNum), "InOut", "Quart", 0.5, true, nil)
        end
end

function cmdbarHolder()
        if StayOpen == false then
                Holder:TweenPosition(UDim2.new(1, Holder.Position.X.Offset, 1, -45), "InOut", "Quart", 0.5, true, nil)
        end
end

pinNotification = nil
local notifyCount = 0
function notify(text,text2,length)
        task.spawn(function()
                local LnotifyCount = notifyCount+1
                local notificationPinned = false
                notifyCount = notifyCount+1
                if pinNotification then pinNotification:Disconnect() end
                pinNotification = PinButton.MouseButton1Click:Connect(function()
                        task.spawn(function()
                                pinNotification:Disconnect()
                                notificationPinned = true
                                Title_2.BackgroundTransparency = 1
                                wait(0.5)
                                Title_2.BackgroundTransparency = 0
                        end)
                end)
                Notification:TweenPosition(UDim2.new(1, Notification.Position.X.Offset, 1, 0), "InOut", "Quart", 0.5, true, nil)
                wait(0.6)
                local closepressed = false
                if text2 then
                        Title_2.Text = text
                        Text_2.Text = text2
                else
                        Title_2.Text = 'Notification'
                        Text_2.Text = text
                end
                Notification:TweenPosition(UDim2.new(1, Notification.Position.X.Offset, 1, -100), "InOut", "Quart", 0.5, true, nil)
                CloseButton.MouseButton1Click:Connect(function()
                        Notification:TweenPosition(UDim2.new(1, Notification.Position.X.Offset, 1, 0), "InOut", "Quart", 0.5, true, nil)
                        closepressed = true
                        pinNotification:Disconnect()
                end)
                if length and isNumber(length) then
                        wait(length)
                else
                        wait(3)
                end
                if LnotifyCount == notifyCount then
                        if closepressed == false and notificationPinned == false then
                                pinNotification:Disconnect()
                                Notification:TweenPosition(UDim2.new(1, Notification.Position.X.Offset, 1, 0), "InOut", "Quart", 0.5, true, nil)
                        end
                        notifyCount = 0
                end
        end)
end

local lastMessage = nil
local lastLabel = nil
local dupeCount = 1
function CreateLabel(Name, Text)
        if lastMessage == Name..Text then
                dupeCount = dupeCount+1
                lastLabel.Text = Time()..' - ['..Name..']: '..Text..' (x'..dupeCount..')'
        else
                if dupeCount > 1 then dupeCount = 1 end
                if #scroll_2:GetChildren() >= 2546 then
                        scroll_2:ClearAllChildren()
                end
                local alls = 0
                for i,v in pairs(scroll_2:GetChildren()) do
                        if v then
                                alls = v.Size.Y.Offset + alls
                        end
                        if not v then
                                alls = 0
                        end
                end
                local tl = Instance.new('TextLabel')
                lastMessage = Name..Text
                lastLabel = tl
                tl.Name = Name
                tl.Parent = scroll_2
                tl.ZIndex = 10
                tl.RichText = true
                tl.Text = Time().." - ["..Name.."]: "..Text
                tl.Text = tl.ContentText
                tl.Size = UDim2.new(0,322,0,84)
                tl.BackgroundTransparency = 1
                tl.BorderSizePixel = 0
                tl.Font = "SourceSans"
                tl.Position = UDim2.new(-1,0,0,alls)
                tl.TextTransparency = 1
                tl.TextScaled = false
                tl.TextSize = 14
                tl.TextWrapped = true
                tl.TextXAlignment = "Left"
                tl.TextYAlignment = "Top"
                tl.TextColor3 = currentText1
                tl.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
                tl.TextStrokeTransparency = 0.6
                tl.Size = UDim2.new(0,322,0,tl.TextBounds.Y)
                table.insert(text1,tl)
                scroll_2.CanvasSize = UDim2.new(0,0,0,alls+tl.TextBounds.Y)
                scroll_2.CanvasPosition = Vector2.new(0,scroll_2.CanvasPosition.Y+tl.TextBounds.Y)
                tl:TweenPosition(UDim2.new(0,3,0,alls), 'In', 'Quint', 0.5)
                TweenService:Create(tl, TweenInfo.new(1.25, Enum.EasingStyle.Linear), { TextTransparency = 0 }):Play()
        end
end

function CreateJoinLabel(plr,ID)
        if #scroll_3:GetChildren() >= 2546 then
                scroll_3:ClearAllChildren()
        end
        local infoFrame = Instance.new("Frame")
        local info1 = Instance.new("TextLabel")
        local info2 = Instance.new("TextLabel")
        local ImageLabel_3 = Instance.new("ImageLabel")
        infoFrame.Name = randomString()
        infoFrame.Parent = scroll_3
        infoFrame.BackgroundColor3 = Color3.new(1, 1, 1)
        infoFrame.BackgroundTransparency = 1
        infoFrame.BorderColor3 = Color3.new(0.105882, 0.164706, 0.207843)
        infoFrame.Size = UDim2.new(1, 0, 0, 50)
        info1.Name = randomString()
        info1.Parent = infoFrame
        info1.BackgroundTransparency = 1
        info1.BorderSizePixel = 0
        info1.Position = UDim2.new(0, 45, 0, 0)
        info1.Size = UDim2.new(0, 135, 1, 0)
        info1.ZIndex = 10
        info1.Font = Enum.Font.SourceSans
        info1.FontSize = Enum.FontSize.Size14
        info1.Text = "Username: "..plr.Name.."\nJoined Server: "..Time()
        info1.TextColor3 = Color3.new(1, 1, 1)
        info1.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
        info1.TextStrokeTransparency = 0.5
        info1.TextWrapped = true
        info1.TextXAlignment = Enum.TextXAlignment.Left
        info2.Name = randomString()
        info2.Parent = infoFrame
        info2.BackgroundTransparency = 1
        info2.BorderSizePixel = 0
        info2.Position = UDim2.new(0, 185, 0, 0)
        info2.Size = UDim2.new(0, 140, 1, -5)
        info2.ZIndex = 10
        info2.Font = Enum.Font.SourceSans
        info2.FontSize = Enum.FontSize.Size14
        info2.Text = "User ID: "..ID.."\nAccount Age: "..plr.AccountAge.."\nJoined Roblox: Loading..."
        info2.TextColor3 = Color3.new(1, 1, 1)
        info2.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
        info2.TextStrokeTransparency = 0.5
        info2.TextWrapped = true
        info2.TextXAlignment = Enum.TextXAlignment.Left
        info2.TextYAlignment = Enum.TextYAlignment.Center
        ImageLabel_3.Parent = infoFrame
        ImageLabel_3.BackgroundTransparency = 1
        ImageLabel_3.BorderSizePixel = 0
        ImageLabel_3.Size = UDim2.new(0, 45, 1, 0)
        ImageLabel_3.Image = Players:GetUserThumbnailAsync(ID, Enum.ThumbnailType.AvatarThumbnail, Enum.ThumbnailSize.Size420x420)
        scroll_3.CanvasSize = UDim2.new(0, 0, 0, listlayout.AbsoluteContentSize.Y)
        scroll_3.CanvasPosition = Vector2.new(0,scroll_2.CanvasPosition.Y+infoFrame.AbsoluteSize.Y)
        wait()
        local user = game:HttpGet("https://users.roblox.com/v1/users/"..ID)
        local json = HttpService:JSONDecode(user)
        local date = json["created"]:sub(1,10)
        local splitDates = string.split(date,"-")
        info2.Text = string.gsub(info2.Text, "Loading...",splitDates[2].."/"..splitDates[3].."/"..splitDates[1])
end

IYMouse.KeyDown:Connect(function(Key)
        if (Key==prefix) then
                RunService.RenderStepped:Wait()
                Cmdbar:CaptureFocus()
                maximizeHolder()
        end
end)

local lastMinimizeReq = 0
Holder.MouseEnter:Connect(function()
        lastMinimizeReq = 0
        maximizeHolder()
end)

Holder.MouseLeave:Connect(function()
        if not Cmdbar:IsFocused() then
                local reqTime = tick()
                lastMinimizeReq = reqTime
                wait(1)
                if lastMinimizeReq ~= reqTime then return end
                if not Cmdbar:IsFocused() then
                        minimizeHolder()
                end
        end
end)

function updateColors(color,ctype)
        if ctype == shade1 then
                for i,v in pairs(shade1) do
                        v.BackgroundColor3 = color
                end
                currentShade1 = color
        elseif ctype == shade2 then
                for i,v in pairs(shade2) do
                        v.BackgroundColor3 = color
                end
                currentShade2 = color
        elseif ctype == shade3 then
                for i,v in pairs(shade3) do
                        v.BackgroundColor3 = color
                end
                currentShade3 = color
        elseif ctype == text1 then
                for i,v in pairs(text1) do
                        v.TextColor3 = color
                        v.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
                        v.TextStrokeTransparency = 0.6
                        if v:IsA("TextBox") then
                                v.PlaceholderColor3 = color
                        end
                end
                currentText1 = color
        elseif ctype == text2 then
                for i,v in pairs(text2) do
                        v.TextColor3 = color
                end
                currentText2 = color
        elseif ctype == scroll then
                for i,v in pairs(scroll) do
                        v.ScrollBarImageColor3 = color
                end
                currentScroll = color
        end
end

local colorpickerOpen = false
ColorsButton.MouseButton1Click:Connect(function()
        cache_currentShade1 = currentShade1
        cache_currentShade2 = currentShade2
        cache_currentShade3 = currentShade3
        cache_currentText1 = currentText1
        cache_currentText2 = currentText2
        cache_currentScroll = currentScroll
        if not colorpickerOpen then
                colorpickerOpen = true
                picker = game:GetObjects("rbxassetid://4908465318")[1]
                picker.Name = randomString()
                picker.Parent = ScaledHolder

                local ColorPicker do
                        ColorPicker = {}

                        ColorPicker.new = function()
                                local newMt = setmetatable({},{})

                                local pickerGui = picker.ColorPicker
                                local pickerTopBar = pickerGui.TopBar
                                local pickerExit = pickerTopBar.Exit
                                local pickerFrame = pickerGui.Content
                                local colorSpace = pickerFrame.ColorSpaceFrame.ColorSpace
                                local colorStrip = pickerFrame.ColorStrip
                                local previewFrame = pickerFrame.Preview
                                local basicColorsFrame = pickerFrame.BasicColors
                                local customColorsFrame = pickerFrame.CustomColors
                                local defaultButton = pickerFrame.Default
                                local cancelButton = pickerFrame.Cancel
                                local shade1Button = pickerFrame.Shade1
                                local shade2Button = pickerFrame.Shade2
                                local shade3Button = pickerFrame.Shade3
                                local text1Button = pickerFrame.Text1
                                local text2Button = pickerFrame.Text2
                                local scrollButton = pickerFrame.Scroll

                                local colorScope = colorSpace.Scope
                                local colorArrow = pickerFrame.ArrowFrame.Arrow

                                local hueInput = pickerFrame.Hue.Input
                                local satInput = pickerFrame.Sat.Input
                                local valInput = pickerFrame.Val.Input

                                local redInput = pickerFrame.Red.Input
                                local greenInput = pickerFrame.Green.Input
                                local blueInput = pickerFrame.Blue.Input

                                local mouse = IYMouse

                                local hue,sat,val = 0,0,1
                                local red,green,blue = 1,1,1
                                local chosenColor = Color3.new(0,0,0)

                                local basicColors = {Color3.new(0,0,0),Color3.new(0.66666668653488,0,0),Color3.new(0,0.33333334326744,0),Color3.new(0.66666668653488,0.33333334326744,0),Color3.new(0,0.66666668653488,0),Color3.new(0.66666668653488,0.66666668653488,0),Color3.new(0,1,0),Color3.new(0.66666668653488,1,0),Color3.new(0,0,0.49803924560547),Color3.new(0.66666668653488,0,0.49803924560547),Color3.new(0,0.33333334326744,0.49803924560547),Color3.new(0.66666668653488,0.33333334326744,0.49803924560547),Color3.new(0,0.66666668653488,0.49803924560547),Color3.new(0.66666668653488,0.66666668653488,0.49803924560547),Color3.new(0,1,0.49803924560547),Color3.new(0.66666668653488,1,0.49803924560547),Color3.new(0,0,1),Color3.new(0.66666668653488,0,1),Color3.new(0,0.33333334326744,1),Color3.new(0.66666668653488,0.33333334326744,1),Color3.new(0,0.66666668653488,1),Color3.new(0.66666668653488,0.66666668653488,1),Color3.new(0,1,1),Color3.new(0.66666668653488,1,1),Color3.new(0.33333334326744,0,0),Color3.new(1,0,0),Color3.new(0.33333334326744,0.33333334326744,0),Color3.new(1,0.33333334326744,0),Color3.new(0.33333334326744,0.66666668653488,0),Color3.new(1,0.66666668653488,0),Color3.new(0.33333334326744,1,0),Color3.new(1,1,0),Color3.new(0.33333334326744,0,0.49803924560547),Color3.new(1,0,0.49803924560547),Color3.new(0.33333334326744,0.33333334326744,0.49803924560547),Color3.new(1,0.33333334326744,0.49803924560547),Color3.new(0.33333334326744,0.66666668653488,0.49803924560547),Color3.new(1,0.66666668653488,0.49803924560547),Color3.new(0.33333334326744,1,0.49803924560547),Color3.new(1,1,0.49803924560547),Color3.new(0.33333334326744,0,1),Color3.new(1,0,1),Color3.new(0.33333334326744,0.33333334326744,1),Color3.new(1,0.33333334326744,1),Color3.new(0.33333334326744,0.66666668653488,1),Color3.new(1,0.66666668653488,1),Color3.new(0.33333334326744,1,1),Color3.new(1,1,1)}
                                local customColors = {}

                                dragGUI(picker)

                                local function updateColor(noupdate)
                                        local relativeX,relativeY,relativeStripY = 219 - hue*219, 199 - sat*199, 199 - val*199
                                        local hsvColor = Color3.fromHSV(hue,sat,val)

                                        if noupdate == 2 or not noupdate then
                                                hueInput.Text = tostring(math.ceil(359*hue))
                                                satInput.Text = tostring(math.ceil(255*sat))
                                                valInput.Text = tostring(math.floor(255*val))
                                        end
                                        if noupdate == 1 or not noupdate then
                                                redInput.Text = tostring(math.floor(255*red))
                                                greenInput.Text = tostring(math.floor(255*green))
                                                blueInput.Text = tostring(math.floor(255*blue))
                                        end

                                        chosenColor = Color3.new(red,green,blue)

                                        colorScope.Position = UDim2.new(0,relativeX-9,0,relativeY-9)
                                        colorStrip.ImageColor3 = Color3.fromHSV(hue,sat,1)
                                        colorArrow.Position = UDim2.new(0,-2,0,relativeStripY-4)
                                        previewFrame.BackgroundColor3 = chosenColor

                                        newMt.Color = chosenColor
                                        if newMt.Changed then newMt:Changed(chosenColor) end
                                end

                                local function colorSpaceInput()
                                        local relativeX = mouse.X - colorSpace.AbsolutePosition.X
                                        local relativeY = mouse.Y - colorSpace.AbsolutePosition.Y

                                        if relativeX < 0 then relativeX = 0 elseif relativeX > 219 then relativeX = 219 end
                                        if relativeY < 0 then relativeY = 0 elseif relativeY > 199 then relativeY = 199 end

                                        hue = (219 - relativeX)/219
                                        sat = (199 - relativeY)/199

                                        local hsvColor = Color3.fromHSV(hue,sat,val)
                                        red,green,blue = hsvColor.r,hsvColor.g,hsvColor.b

                                        updateColor()
                                end

                                local function colorStripInput()
                                        local relativeY = mouse.Y - colorStrip.AbsolutePosition.Y

                                        if relativeY < 0 then relativeY = 0 elseif relativeY > 199 then relativeY = 199 end     

                                        val = (199 - relativeY)/199

                                        local hsvColor = Color3.fromHSV(hue,sat,val)
                                        red,green,blue = hsvColor.r,hsvColor.g,hsvColor.b

                                        updateColor()
                                end

                                local function hookButtons(frame,func)
                                        frame.ArrowFrame.Up.InputBegan:Connect(function(input)
                                                if input.UserInputType == Enum.UserInputType.MouseMovement then
                                                        frame.ArrowFrame.Up.BackgroundTransparency = 0.5
                                                elseif input.UserInputType == Enum.UserInputType.MouseButton1 then
                                                        local releaseEvent,runEvent

                                                        local startTime = tick()
                                                        local pressing = true
                                                        local startNum = tonumber(frame.Text)

                                                        if not startNum then return end

                                                        releaseEvent = UserInputService.InputEnded:Connect(function(input)
                                                                if input.UserInputType ~= Enum.UserInputType.MouseButton1 then return end
                                                                releaseEvent:Disconnect()
                                                                pressing = false
                                                        end)

                                                        startNum = startNum + 1
                                                        func(startNum)
                                                        while pressing do
                                                                if tick()-startTime > 0.3 then
                                                                        startNum = startNum + 1
                                                                        func(startNum)
                                                                end
                                                                wait(0.1)
                                                        end
                                                end
                                        end)

                                        frame.ArrowFrame.Up.InputEnded:Connect(function(input)
                                                if input.UserInputType == Enum.UserInputType.MouseMovement then
                                                        frame.ArrowFrame.Up.BackgroundTransparency = 1
                                                end
                                        end)

                                        frame.ArrowFrame.Down.InputBegan:Connect(function(input)
                                                if input.UserInputType == Enum.UserInputType.MouseMovement then
                                                        frame.ArrowFrame.Down.BackgroundTransparency = 0.5
                                                elseif input.UserInputType == Enum.UserInputType.MouseButton1 then
                                                        local releaseEvent,runEvent

                                                        local startTime = tick()
                                                        local pressing = true
                                                        local startNum = tonumber(frame.Text)

                                                        if not startNum then return end

                                                        releaseEvent = UserInputService.InputEnded:Connect(function(input)
                                                                if input.UserInputType ~= Enum.UserInputType.MouseButton1 then return end
                                                                releaseEvent:Disconnect()
                                                                pressing = false
                                                        end)

                                                        startNum = startNum - 1
                                                        func(startNum)
                                                        while pressing do
                                                                if tick()-startTime > 0.3 then
                                                                        startNum = startNum - 1
                                                                        func(startNum)
                                                                end
                                                                wait(0.1)
                                                        end
                                                end
                                        end)

                                        frame.ArrowFrame.Down.InputEnded:Connect(function(input)
                                                if input.UserInputType == Enum.UserInputType.MouseMovement then
                                                        frame.ArrowFrame.Down.BackgroundTransparency = 1
                                                end
                                        end)
                                end

                                colorSpace.InputBegan:Connect(function(input)
                                        if input.UserInputType == Enum.UserInputType.MouseButton1 then
                                                local releaseEvent,mouseEvent

                                                releaseEvent = UserInputService.InputEnded:Connect(function(input)
                                                        if input.UserInputType ~= Enum.UserInputType.MouseButton1 then return end
                                                        releaseEvent:Disconnect()
                                                        mouseEvent:Disconnect()
                                                end)

                                                mouseEvent = UserInputService.InputChanged:Connect(function(input)
                                                        if input.UserInputType == Enum.UserInputType.MouseMovement then
                                                                colorSpaceInput()
                                                        end
                                                end)

                                                colorSpaceInput()
                                        end
                                end)

                                colorStrip.InputBegan:Connect(function(input)
                                        if input.UserInputType == Enum.UserInputType.MouseButton1 then
                                                local releaseEvent,mouseEvent

                                                releaseEvent = UserInputService.InputEnded:Connect(function(input)
                                                        if input.UserInputType ~= Enum.UserInputType.MouseButton1 then return end
                                                        releaseEvent:Disconnect()
                                                        mouseEvent:Disconnect()
                                                end)

                                                mouseEvent = UserInputService.InputChanged:Connect(function(input)
                                                        if input.UserInputType == Enum.UserInputType.MouseMovement then
                                                                colorStripInput()
                                                        end
                                                end)

                                                colorStripInput()
                                        end
                                end)

                                local function updateHue(str)
                                        local num = tonumber(str)
                                        if num then
                                                hue = math.clamp(math.floor(num),0,359)/359
                                                local hsvColor = Color3.fromHSV(hue,sat,val)
                                                red,green,blue = hsvColor.r,hsvColor.g,hsvColor.b
                                                hueInput.Text = tostring(hue*359)
                                                updateColor(1)
                                        end
                                end
                                hueInput.FocusLost:Connect(function() updateHue(hueInput.Text) end) hookButtons(hueInput,updateHue)

                                local function updateSat(str)
                                        local num = tonumber(str)
                                        if num then
                                                sat = math.clamp(math.floor(num),0,255)/255
                                                local hsvColor = Color3.fromHSV(hue,sat,val)
                                                red,green,blue = hsvColor.r,hsvColor.g,hsvColor.b
                                                satInput.Text = tostring(sat*255)
                                                updateColor(1)
                                        end
                                end
                                satInput.FocusLost:Connect(function() updateSat(satInput.Text) end) hookButtons(satInput,updateSat)

                                local function updateVal(str)
                                        local num = tonumber(str)
                                        if num then
                                                val = math.clamp(math.floor(num),0,255)/255
                                                local hsvColor = Color3.fromHSV(hue,sat,val)
                                                red,green,blue = hsvColor.r,hsvColor.g,hsvColor.b
                                                valInput.Text = tostring(val*255)
                                                updateColor(1)
                                        end
                                end
                                valInput.FocusLost:Connect(function() updateVal(valInput.Text) end) hookButtons(valInput,updateVal)

                                local function updateRed(str)
                                        local num = tonumber(str)
                                        if num then
                                                red = math.clamp(math.floor(num),0,255)/255
                                                local newColor = Color3.new(red,green,blue)
                                                hue,sat,val = Color3.toHSV(newColor)
                                                redInput.Text = tostring(red*255)
                                                updateColor(2)
                                        end
                                end
                                redInput.FocusLost:Connect(function() updateRed(redInput.Text) end) hookButtons(redInput,updateRed)

                                local function updateGreen(str)
                                        local num = tonumber(str)
                                        if num then
                                                green = math.clamp(math.floor(num),0,255)/255
                                                local newColor = Color3.new(red,green,blue)
                                                hue,sat,val = Color3.toHSV(newColor)
                                                greenInput.Text = tostring(green*255)
                                                updateColor(2)
                                        end
                                end
                                greenInput.FocusLost:Connect(function() updateGreen(greenInput.Text) end) hookButtons(greenInput,updateGreen)

                                local function updateBlue(str)
                                        local num = tonumber(str)
                                        if num then
                                                blue = math.clamp(math.floor(num),0,255)/255
                                                local newColor = Color3.new(red,green,blue)
                                                hue,sat,val = Color3.toHSV(newColor)
                                                blueInput.Text = tostring(blue*255)
                                                updateColor(2)
                                        end
                                end
                                blueInput.FocusLost:Connect(function() updateBlue(blueInput.Text) end) hookButtons(blueInput,updateBlue)

                                local colorChoice = Instance.new("TextButton")
                                colorChoice.Name = "Choice"
                                colorChoice.Size = UDim2.new(0,25,0,18)
                                colorChoice.BorderColor3 = Color3.new(96/255,96/255,96/255)
                                colorChoice.Text = ""
                                colorChoice.AutoButtonColor = false
                                colorChoice.ZIndex = 10

                                local row = 0
                                local column = 0
                                for i,v in pairs(basicColors) do
                                        local newColor = colorChoice:Clone()
                                        newColor.BackgroundColor3 = v
                                        newColor.Position = UDim2.new(0,1 + 30*column,0,21 + 23*row)

                                        newColor.MouseButton1Click:Connect(function()
                                                red,green,blue = v.r,v.g,v.b
                                                local newColor = Color3.new(red,green,blue)
                                                hue,sat,val = Color3.toHSV(newColor)
                                                updateColor()
                                        end)    

                                        newColor.Parent = basicColorsFrame
                                        column = column + 1
                                        if column == 6 then row = row + 1 column = 0 end
                                end

                                row = 0
                                column = 0
                                for i = 1,12 do
                                        local color = customColors[i] or Color3.new(0,0,0)
                                        local newColor = colorChoice:Clone()
                                        newColor.BackgroundColor3 = color
                                        newColor.Position = UDim2.new(0,1 + 30*column,0,20 + 23*row)

                                        newColor.MouseButton1Click:Connect(function()
                                                local curColor = customColors[i] or Color3.new(0,0,0)
                                                red,green,blue = curColor.r,curColor.g,curColor.b
                                                hue,sat,val = Color3.toHSV(curColor)
                                                updateColor()
                                        end)

                                        newColor.MouseButton2Click:Connect(function()
                                                customColors[i] = chosenColor
                                                newColor.BackgroundColor3 = chosenColor
                                        end)

                                        newColor.Parent = customColorsFrame
                                        column = column + 1
                                        if column == 6 then row = row + 1 column = 0 end
                                end

                                shade1Button.MouseButton1Click:Connect(function() if newMt.Confirm then newMt:Confirm(chosenColor,shade1) end end)
                                shade1Button.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then shade1Button.BackgroundTransparency = 0.4 end end)
                                shade1Button.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then shade1Button.BackgroundTransparency = 0 end end)

                                shade2Button.MouseButton1Click:Connect(function() if newMt.Confirm then newMt:Confirm(chosenColor,shade2) end end)
                                shade2Button.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then shade2Button.BackgroundTransparency = 0.4 end end)
                                shade2Button.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then shade2Button.BackgroundTransparency = 0 end end)

                                shade3Button.MouseButton1Click:Connect(function() if newMt.Confirm then newMt:Confirm(chosenColor,shade3) end end)
                                shade3Button.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then shade3Button.BackgroundTransparency = 0.4 end end)
                                shade3Button.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then shade3Button.BackgroundTransparency = 0 end end)

                                text1Button.MouseButton1Click:Connect(function() if newMt.Confirm then newMt:Confirm(chosenColor,text1) end end)
                                text1Button.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then text1Button.BackgroundTransparency = 0.4 end end)
                                text1Button.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then text1Button.BackgroundTransparency = 0 end end)

                                text2Button.MouseButton1Click:Connect(function() if newMt.Confirm then newMt:Confirm(chosenColor,text2) end end)
                                text2Button.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then text2Button.BackgroundTransparency = 0.4 end end)
                                text2Button.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then text2Button.BackgroundTransparency = 0 end end)

                                scrollButton.MouseButton1Click:Connect(function() if newMt.Confirm then newMt:Confirm(chosenColor,scroll) end end)
                                scrollButton.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then scrollButton.BackgroundTransparency = 0.4 end end)
                                scrollButton.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then scrollButton.BackgroundTransparency = 0 end end)

                                cancelButton.MouseButton1Click:Connect(function() if newMt.Cancel then newMt:Cancel() end end)
                                cancelButton.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then cancelButton.BackgroundTransparency = 0.4 end end)
                                cancelButton.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then cancelButton.BackgroundTransparency = 0 end end)

                                defaultButton.MouseButton1Click:Connect(function() if newMt.Default then newMt:Default() end end)
                                defaultButton.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then defaultButton.BackgroundTransparency = 0.4 end end)
                                defaultButton.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then defaultButton.BackgroundTransparency = 0 end end)

                                pickerExit.MouseButton1Click:Connect(function()
                                        picker:TweenPosition(UDim2.new(0.5, -219, 0, -500), "InOut", "Quart", 0.5, true, nil)
                                end)

                                updateColor()

                                newMt.SetColor = function(self,color)
                                        red,green,blue = color.r,color.g,color.b
                                        hue,sat,val = Color3.toHSV(color)
                                        updateColor()
                                end

                                return newMt
                        end
                end

                picker:TweenPosition(UDim2.new(0.5, -219, 0, 100), "InOut", "Quart", 0.5, true, nil)

                local Npicker = ColorPicker.new()
                Npicker.Confirm = function(self,color,ctype) updateColors(color,ctype) wait() updatesaves() end
                Npicker.Cancel = function(self)
                        updateColors(cache_currentShade1,shade1)
                        updateColors(cache_currentShade2,shade2)
                        updateColors(cache_currentShade3,shade3)
                        updateColors(cache_currentText1,text1)
                        updateColors(cache_currentText2,text2)
                        updateColors(cache_currentScroll,scroll)
                        wait()
                        updatesaves()
                end
                Npicker.Default = function(self)
                        updateColors(Color3.fromRGB(8, 8, 14),shade1)
                        updateColors(Color3.fromRGB(15, 15, 28),shade2)
                        updateColors(Color3.fromRGB(30, 30, 55),shade3)
                        updateColors(Color3.new(1, 1, 1),text1)
                        updateColors(Color3.new(0, 0, 0),text2)
                        updateColors(Color3.fromRGB(50, 100, 255),scroll)
                        wait()
                        updatesaves()
                end
        else
                picker:TweenPosition(UDim2.new(0.5, -219, 0, 100), "InOut", "Quart", 0.5, true, nil)
        end
end)


SettingsButton.MouseButton1Click:Connect(function()
        if SettingsOpen == false then SettingsOpen = true
                Settings:TweenPosition(UDim2.new(0, 0, 0, 45), "InOut", "Quart", 0.5, true, nil)
                CMDsF.Visible = false
        else SettingsOpen = false
                CMDsF.Visible = true
                Settings:TweenPosition(UDim2.new(0, 0, 0, 220), "InOut", "Quart", 0.5, true, nil)
        end
end)

On.MouseButton1Click:Connect(function()
        if isHidden == false then
                if StayOpen == false then
                        StayOpen = true
                        On.BackgroundTransparency = 0
                else
                        StayOpen = false
                        On.BackgroundTransparency = 1
                end
                updatesaves()
        end
end)

Clear.MouseButton1Down:Connect(function()
        for _, child in pairs(scroll_2:GetChildren()) do
                child:Destroy()
        end
        scroll_2.CanvasSize = UDim2.new(0, 0, 0, 10)
end)

Clear_2.MouseButton1Down:Connect(function()
        for _, child in pairs(scroll_3:GetChildren()) do
                child:Destroy()
        end
        scroll_3.CanvasSize = UDim2.new(0, 0, 0, 10)
end)

Toggle.MouseButton1Down:Connect(function()
        if logsEnabled then
                logsEnabled = false
                Toggle.Text = 'Disabled'
                updatesaves()
        else
                logsEnabled = true
                Toggle.Text = 'Enabled'
                updatesaves()
        end
end)

Toggle_2.MouseButton1Down:Connect(function()
        if jLogsEnabled then
                jLogsEnabled = false
                Toggle_2.Text = 'Disabled'
                updatesaves()
        else
                jLogsEnabled = true
                Toggle_2.Text = 'Enabled'
                updatesaves()
        end
end)

selectChat.MouseButton1Down:Connect(function()
        join.Visible = false
        chat.Visible = true
        table.remove(shade3,table.find(shade3,selectChat))
        table.remove(shade2,table.find(shade2,selectJoin))
        table.insert(shade2,selectChat)
        table.insert(shade3,selectJoin)
        selectJoin.BackgroundColor3 = currentShade3
        selectChat.BackgroundColor3 = currentShade2
end)

selectJoin.MouseButton1Down:Connect(function()
        chat.Visible = false
        join.Visible = true     
        table.remove(shade3,table.find(shade3,selectJoin))
        table.remove(shade2,table.find(shade2,selectChat))
        table.insert(shade2,selectJoin)
        table.insert(shade3,selectChat)
        selectChat.BackgroundColor3 = currentShade3
        selectJoin.BackgroundColor3 = currentShade2
end)

if not writefileExploit() then
        notify("Saves", "Your exploit does not support read/write file. Your settings will not save.")
end

avatarcache = {}
function sendChatWebhook(player, message)
        if httprequest and vtype(logsWebhook, "string") then
                local id = player.UserId
                local avatar = avatarcache[id]
                if not avatar then
                        local d = HttpService:JSONDecode(httprequest({
                                Url = "https://thumbnails.roblox.com/v1/users/avatar-headshot?userIds=" .. id .. "&size=420x420&format=Png&isCircular=false",
                                Method = "GET"
                        }).Body)["data"]
                        avatar = d and d[1].state == "Completed" and d[1].imageUrl or "https://files.catbox.moe/i968v2.jpg"
                        avatarcache[id] = avatar
                end
                local log = HttpService:JSONEncode({
                        content = message,
                        avatar_url = avatar,
                        username = formatUsername(player),
                        allowed_mentions = {parse = {}}
                })
                httprequest({
                        Url = logsWebhook,
                        Method = "POST",
                        Headers = {["Content-Type"] = "application/json"},
                        Body = log
                })
        end
end

ChatLog = function(player)
        player.Chatted:Connect(function(message)
                if logsEnabled == true then
                        CreateLabel(player.Name, message)
                        sendChatWebhook(player, message)
                end
        end)
end

JoinLog = function(plr)
        if jLogsEnabled == true then
                CreateJoinLabel(plr,plr.UserId)
        end
end

CleanFileName = function(name)
        return tostring(name):gsub("[*\\?:<>|]+", ""):sub(1, 175)
end

SaveChatlogs.MouseButton1Down:Connect(function()
        if writefileExploit() then
                if #scroll_2:GetChildren() > 0 then
                        notify("Loading",'Hold on a sec')
                        local placeName = CleanFileName(MarketplaceService:GetProductInfo(PlaceId).Name)
                        local writelogs = '-- Arc Yield Chat logs for "'..placeName..'"\n'
                        for _, child in pairs(scroll_2:GetChildren()) do
                                writelogs = writelogs..'\n'..child.Text
                        end
                        local writelogsFile = tostring(writelogs)
                        local fileext = 0
                        local function nameFile()
                                local file
                                pcall(function() file = readfile(placeName..' Chat Logs ('..fileext..').txt') end)
                                if file then
                                        fileext = fileext+1
                                        nameFile()
                                else
                                        writefileCooldown(placeName..' Chat Logs ('..fileext..').txt', writelogsFile)
                                end
                        end
                        nameFile()
                        notify('Chat Logs','Saved chat logs to the workspace folder within your exploit folder.')
                end
        else
                notify('Chat Logs','Your exploit does not support write file. You cannot save chat logs.')
        end
end)

if isLegacyChat then
        for _, plr in pairs(Players:GetPlayers()) do
                ChatLog(plr)
        end
end

Players.PlayerRemoving:Connect(function(player)
        if ESPenabled or CHMSenabled or COREGUI:FindFirstChild(player.Name..'_LC') then
                for i,v in pairs(COREGUI:GetChildren()) do
                        if v.Name == player.Name..'_ESP' or v.Name == player.Name..'_LC' or v.Name == player.Name..'_CHMS' then
                                v:Destroy()
                        end
                end
        end
        if viewing ~= nil and player == viewing then
                workspace.CurrentCamera.CameraSubject = Players.LocalPlayer.Character
                viewing = nil
                if viewDied then
                        viewDied:Disconnect()
                        viewChanged:Disconnect()
                end
                notify('Spectate','View turned off (player left)')
        end
        eventEditor.FireEvent("OnLeave", player.Name)
end)

Exit.MouseButton1Down:Connect(function()
        logs:TweenPosition(UDim2.new(0, 0, 1, 10), "InOut", "Quart", 0.3, true, nil)
end)

Hide.MouseButton1Down:Connect(function()
        if logs.Position ~= UDim2.new(0, 0, 1, -20) then
                logs:TweenPosition(UDim2.new(0, 0, 1, -20), "InOut", "Quart", 0.3, true, nil)
        else
                logs:TweenPosition(UDim2.new(0, 0, 1, -265), "InOut", "Quart", 0.3, true, nil)
        end
end)

EventBind.MouseButton1Click:Connect(function()
        eventEditor.Frame:TweenPosition(UDim2.new(0.5,-175,0.5,-101), "InOut", "Quart", 0.5, true, nil)
end)

Keybinds.MouseButton1Click:Connect(function()
        KeybindsFrame:TweenPosition(UDim2.new(0, 0, 0, 0), "InOut", "Quart", 0.5, true, nil)
        wait(0.5)
        SettingsHolder.Visible = false
end)

Close.MouseButton1Click:Connect(function()
        SettingsHolder.Visible = true
        KeybindsFrame:TweenPosition(UDim2.new(0, 0, 0, 175), "InOut", "Quart", 0.5, true, nil)
end)

Keybinds.MouseButton1Click:Connect(function()
        KeybindsFrame:TweenPosition(UDim2.new(0, 0, 0, 0), "InOut", "Quart", 0.5, true, nil)
        wait(0.5)
        SettingsHolder.Visible = false
end)

Add.MouseButton1Click:Connect(function()
        KeybindEditor:TweenPosition(UDim2.new(0.5, -180, 0, 260), "InOut", "Quart", 0.5, true, nil)
end)

Delete.MouseButton1Click:Connect(function()
        binds = {}
        refreshbinds()
        updatesaves()
        notify('Keybinds Updated','Removed all keybinds')
end)

Close_2.MouseButton1Click:Connect(function()
        SettingsHolder.Visible = true
        AliasesFrame:TweenPosition(UDim2.new(0, 0, 0, 175), "InOut", "Quart", 0.5, true, nil)
end)

Aliases.MouseButton1Click:Connect(function()
        AliasesFrame:TweenPosition(UDim2.new(0, 0, 0, 0), "InOut", "Quart", 0.5, true, nil)
        wait(0.5)
        SettingsHolder.Visible = false
end)

Close_3.MouseButton1Click:Connect(function()
        SettingsHolder.Visible = true
        PositionsFrame:TweenPosition(UDim2.new(0, 0, 0, 175), "InOut", "Quart", 0.5, true, nil)
end)

Positions.MouseButton1Click:Connect(function()
        PositionsFrame:TweenPosition(UDim2.new(0, 0, 0, 0), "InOut", "Quart", 0.5, true, nil)
        wait(0.5)
        SettingsHolder.Visible = false
end)

local selectionBox = Instance.new("SelectionBox")
selectionBox.Name = randomString()
selectionBox.Color3 = Color3.new(255,255,255)
selectionBox.Adornee = nil
selectionBox.Parent = PARENT

local selected = Instance.new("SelectionBox")
selected.Name = randomString()
selected.Color3 = Color3.new(0,166,0)
selected.Adornee = nil
selected.Parent = PARENT

local ActivateHighlight = nil
local ClickSelect = nil
function selectPart()
        ToPartFrame:TweenPosition(UDim2.new(0.5, -180, 0, 335), "InOut", "Quart", 0.5, true, nil)
        local function HighlightPart()
                if selected.Adornee ~= IYMouse.Target then
                        selectionBox.Adornee = IYMouse.Target
                else
                        selectionBox.Adornee = nil
                end
        end
        ActivateHighlight = IYMouse.Move:Connect(HighlightPart)
        local function SelectPart()
                if IYMouse.Target ~= nil then
                        selected.Adornee = IYMouse.Target
                        Path.Text = getHierarchy(IYMouse.Target)
                end
        end
        ClickSelect = IYMouse.Button1Down:Connect(SelectPart)
end

Part.MouseButton1Click:Connect(function()
        selectPart()
end)

Exit_4.MouseButton1Click:Connect(function()
        ToPartFrame:TweenPosition(UDim2.new(0.5, -180, 0, -500), "InOut", "Quart", 0.5, true, nil)
        if ActivateHighlight then
                ActivateHighlight:Disconnect()
        end
        if ClickSelect then
                ClickSelect:Disconnect()
        end
        selectionBox.Adornee = nil
        selected.Adornee = nil
        Path.Text = ""
end)

CopyPath.MouseButton1Click:Connect(function()
        if Path.Text ~= "" then
                toClipboard(Path.Text)
        else
                notify('Copy Path','Select a part to copy its path')
        end
end)

ChoosePart.MouseButton1Click:Connect(function()
        if Path.Text ~= "" then
                local tpNameExt = ''
                local function handleWpNames()
                        local FoundDupe = false
                        for i,v in pairs(pWayPoints) do
                                if v.NAME:lower() == selected.Adornee.Name:lower()..tpNameExt then
                                        FoundDupe = true
                                end
                        end
                        if not FoundDupe then
                                notify('Modified Waypoints',"Created waypoint: "..selected.Adornee.Name..tpNameExt)
                                pWayPoints[#pWayPoints + 1] = {NAME = selected.Adornee.Name..tpNameExt, COORD = {selected.Adornee}}
                        else
                                if isNumber(tpNameExt) then
                                        tpNameExt = tpNameExt+1
                                else
                                        tpNameExt = 1
                                end
                                handleWpNames()
                        end
                end
                handleWpNames()
                refreshwaypoints()
        else
                notify('Part Selection','Select a part first')
        end
end)

cmds={}
customAlias = {}
Delete_3.MouseButton1Click:Connect(function()
        customAlias = {}
        aliases = {}
        notify('Aliases Modified','Removed all aliases')
        updatesaves()
        refreshaliases()
end)

PrefixBox:GetPropertyChangedSignal("Text"):Connect(function()
        prefix = PrefixBox.Text
        Cmdbar.PlaceholderText = "Command Bar ("..prefix..")"
        updatesaves()
end)

function CamViewport()
        if workspace.CurrentCamera then
                return workspace.CurrentCamera.ViewportSize.X
        end
end

function UpdateToViewport()
        if Holder.Position.X.Offset < -CamViewport() then
                Holder:TweenPosition(UDim2.new(1, -CamViewport(), Holder.Position.Y.Scale, Holder.Position.Y.Offset), "InOut", "Quart", 0.04, true, nil)
                Notification:TweenPosition(UDim2.new(1, -CamViewport() + 250, Notification.Position.Y.Scale, Notification.Position.Y.Offset), "InOut", "Quart", 0.04, true, nil)
        end
end
CameraChanged = workspace.CurrentCamera:GetPropertyChangedSignal("ViewportSize"):Connect(UpdateToViewport)

function updateCamera(child, parent)
        if parent ~= workspace then
                CamMoved:Disconnect()
                CameraChanged:Disconnect()
                repeat wait() until workspace.CurrentCamera
                CameraChanged = workspace.CurrentCamera:GetPropertyChangedSignal("ViewportSize"):Connect(UpdateToViewport)
                CamMoved = workspace.CurrentCamera.AncestryChanged:Connect(updateCamera)
        end
end
CamMoved = workspace.CurrentCamera.AncestryChanged:Connect(updateCamera)

function dragMain(dragpoint,gui)
        task.spawn(function()
                local dragging
                local dragInput
                local dragStart = Vector3.new(0,0,0)
                local startPos
                local function update(input)
                        local pos = -250
                        local delta = input.Position - dragStart
                        if startPos.X.Offset + delta.X <= -500 then
                                local Position = UDim2.new(1, -250, Notification.Position.Y.Scale, Notification.Position.Y.Offset)
                                TweenService:Create(Notification, TweenInfo.new(.20), {Position = Position}):Play()
                                pos = 250
                        else
                                local Position = UDim2.new(1, -500, Notification.Position.Y.Scale, Notification.Position.Y.Offset)
                                TweenService:Create(Notification, TweenInfo.new(.20), {Position = Position}):Play()
                                pos = -250
                        end
                        if startPos.X.Offset + delta.X <= -250 and -CamViewport() <= startPos.X.Offset + delta.X then
                                local Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, gui.Position.Y.Scale, gui.Position.Y.Offset)
                                TweenService:Create(gui, TweenInfo.new(.20), {Position = Position}):Play()
                                local Position2 = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X + pos, Notification.Position.Y.Scale, Notification.Position.Y.Offset)
                                TweenService:Create(Notification, TweenInfo.new(.20), {Position = Position2}):Play()
                        elseif startPos.X.Offset + delta.X > -500 then
                                local Position = UDim2.new(1, -250, gui.Position.Y.Scale, gui.Position.Y.Offset)
                                TweenService:Create(gui, TweenInfo.new(.20), {Position = Position}):Play()
                        elseif -CamViewport() > startPos.X.Offset + delta.X then
                                gui:TweenPosition(UDim2.new(1, -CamViewport(), gui.Position.Y.Scale, gui.Position.Y.Offset), "InOut", "Quart", 0.04, true, nil)
                                local Position = UDim2.new(1, -CamViewport(), gui.Position.Y.Scale, gui.Position.Y.Offset)
                                TweenService:Create(gui, TweenInfo.new(.20), {Position = Position}):Play()
                                local Position2 = UDim2.new(1, -CamViewport() + 250, Notification.Position.Y.Scale, Notification.Position.Y.Offset)
                                TweenService:Create(Notification, TweenInfo.new(.20), {Position = Position2}):Play()
                        end
                end
                dragpoint.InputBegan:Connect(function(input)
                        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
                                dragging = true
                                dragStart = input.Position
                                startPos = gui.Position

                                input.Changed:Connect(function()
                                        if input.UserInputState == Enum.UserInputState.End then
                                                dragging = false
                                        end
                                end)
                        end
                end)
                dragpoint.InputChanged:Connect(function(input)
                        if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
                                dragInput = input
                        end
                end)
                UserInputService.InputChanged:Connect(function(input)
                        if input == dragInput and dragging then
                                update(input)
                        end
                end)
        end)
end

dragMain(Title,Holder)

Match = function(name,str)
        str = str:gsub("%W", "%%%1")
        return name:lower():find(str:lower()) and true
end

local canvasPos = Vector2.new(0,0)
local topCommand = nil
IndexContents = function(str,bool,cmdbar,Ianim)
        CMDsF.CanvasPosition = Vector2.new(0,0)
        local SizeY = 0
        local indexnum = 0
        local frame = CMDsF
        topCommand = nil
        local chunks = {}
        if str:sub(#str,#str) == "\\" then str = "" end
        for w in string.gmatch(str,"[^\\]+") do
                table.insert(chunks,w)
        end
        if #chunks > 0 then str = chunks[#chunks] end
        if str:sub(1,1) == "!" then str = str:sub(2) end
        for i,v in next, frame:GetChildren() do
                if v:IsA("TextButton") then
                        if bool then
                                if Match(v.Text,str) then
                                        indexnum = indexnum + 1
                                        v.Visible = true
                                        if topCommand == nil then
                                                topCommand = v.Text
                                        end
                                else
                                        v.Visible = false
                                end
                        else
                                v.Visible = true
                                if topCommand == nil then
                                        topCommand = v.Text
                                end
                        end
                end
        end
        frame.CanvasSize = UDim2.new(0,0,0,cmdListLayout.AbsoluteContentSize.Y)
        if not Ianim then
                if indexnum == 0 or string.find(str, " ") then
                        if not cmdbar then
                                minimizeHolder()
                        elseif cmdbar then
                                cmdbarHolder()
                        end
                else
                        maximizeHolder()
                end
        else
                minimizeHolder()
        end
end

task.spawn(function()
        if not isLegacyChat then return end
        local chatbox
        local success, result = pcall(function() chatbox = PlayerGui:WaitForChild("Chat").Frame.ChatBarParentFrame.Frame.BoxFrame.Frame.ChatBar end)
        if success then
                local function chatboxFocused()
                        canvasPos = CMDsF.CanvasPosition
                end
                local chatboxFocusedC = chatbox.Focused:Connect(chatboxFocused)

                local function Index()
                        if chatbox.Text:lower():sub(1,1) == prefix then
                                if SettingsOpen == true then
                                        wait(0.2)
                                        CMDsF.Visible = true
                                        Settings:TweenPosition(UDim2.new(0, 0, 0, 220), "InOut", "Quart", 0.2, true, nil)
                                end
                                IndexContents(PlayerGui.Chat.Frame.ChatBarParentFrame.Frame.BoxFrame.Frame.ChatBar.Text:lower():sub(2),true)
                        else
                                minimizeHolder()
                                if SettingsOpen == true then
                                        wait(0.2)
                                        Settings:TweenPosition(UDim2.new(0, 0, 0, 45), "InOut", "Quart", 0.2, true, nil)
                                        CMDsF.Visible = false
                                end
                        end
                end
                local chatboxFunc = chatbox:GetPropertyChangedSignal("Text"):Connect(Index)

                local function chatboxFocusLost(enterpressed)
                        if not enterpressed or chatbox.Text:lower():sub(1,1) ~= prefix then
                                IndexContents('',true)
                        end
                        CMDsF.CanvasPosition = canvasPos
                        minimizeHolder()
                end
                local chatboxFocusLostC = chatbox.FocusLost:Connect(chatboxFocusLost)

                PlayerGui:WaitForChild("Chat").Frame.ChatBarParentFrame.ChildAdded:Connect(function(newbar)
                        wait()
                        if newbar:FindFirstChild('BoxFrame') then
                                chatbox = PlayerGui:WaitForChild("Chat").Frame.ChatBarParentFrame.Frame.BoxFrame.Frame.ChatBar
                                if chatboxFocusedC then chatboxFocusedC:Disconnect() end
                                chatboxFocusedC = chatbox.Focused:Connect(chatboxFocused)
                                if chatboxFunc then chatboxFunc:Disconnect() end
                                chatboxFunc = chatbox:GetPropertyChangedSignal("Text"):Connect(Index)
                                if chatboxFocusLostC then chatboxFocusLostC:Disconnect() end
                                chatboxFocusLostC = chatbox.FocusLost:Connect(chatboxFocusLost)
                        end
                end)
                --else
                --print('Custom chat detected. Will not provide suggestions for commands typed in the chat.')
        end
end)

function autoComplete(str,curText)
        local endingChar = {"[", "/", "(", " "}
        local stop = 0
        for i=1,#str do
                local c = str:sub(i,i)
                if table.find(endingChar, c) then
                        stop = i
                        break
                end
        end
        curText = curText or Cmdbar.Text
        local subPos = 0
        local pos = 1
        local findRes = string.find(curText,"\\",pos)
        while findRes do
                subPos = findRes
                pos = findRes+1
                findRes = string.find(curText,"\\",pos)
        end
        if curText:sub(subPos+1,subPos+1) == "!" then subPos = subPos + 1 end
        Cmdbar.Text = curText:sub(1,subPos) .. str:sub(1, stop - 1)..' '
        RunService.RenderStepped:Wait()
        Cmdbar.Text = Cmdbar.Text:gsub( '\t', '' )
        Cmdbar.CursorPosition = #Cmdbar.Text+1--1020
end

CMDs = {}
CMDs[#CMDs + 1] = {NAME = 'discord / support / help', DESC = 'Invite to the Arc Yield discord server.'}
CMDs[#CMDs + 1] = {NAME = 'guiscale [number]', DESC = 'Changes the size of the gui. [number] accepts both decimals and whole numbers. Min is 0.4 and Max is 2'}
CMDs[#CMDs + 1] = {NAME = 'console', DESC = 'Loads Roblox console'}
CMDs[#CMDs + 1] = {NAME = 'oldconsole', DESC = 'Loads old Roblox console'}
CMDs[#CMDs + 1] = {NAME = 'explorer / dex', DESC = 'Opens DEX by Moon'}
CMDs[#CMDs + 1] = {NAME = 'olddex / odex', DESC = 'Opens Old DEX by Moon'}
CMDs[#CMDs + 1] = {NAME = 'remotespy / rspy', DESC = 'Opens Simple Spy V3'}
CMDs[#CMDs + 1] = {NAME = 'executor', DESC = 'Opens an internal executor gui by dnezero'}
CMDs[#CMDs + 1] = {NAME = 'nds / naturaldisaster / disastersurvival', DESC = 'Loads Natural Disaster Survival script by KaterHub'}
CMDs[#CMDs + 1] = {NAME = 'audiologger / alogger', DESC = 'Opens Edges audio logger'}
CMDs[#CMDs + 1] = {NAME = 'serverinfo / info', DESC = 'Gives you info about the server'}
CMDs[#CMDs + 1] = {NAME = 'jobid', DESC = 'Copies the games JobId to your clipboard'}
CMDs[#CMDs + 1] = {NAME = 'notifyjobid', DESC = 'Notifies you the games JobId'}
CMDs[#CMDs + 1] = {NAME = 'rejoin / rj', DESC = 'Makes you rejoin the game'}
CMDs[#CMDs + 1] = {NAME = 'autorejoin / autorj', DESC = 'Automatically rejoins the server if you get kicked/disconnected'}
CMDs[#CMDs + 1] = {NAME = 'serverhop / shop', DESC = 'Teleports you to a different server'}
CMDs[#CMDs + 1] = {NAME = 'gameteleport / gametp [place ID]', DESC = 'Joins a game by ID'}
CMDs[#CMDs + 1] = {NAME = 'antiidle / antiafk', DESC = 'Prevents the game from kicking you for being idle/afk'}
CMDs[#CMDs + 1] = {NAME = 'datalimit [num]', DESC = 'Set outgoing KBPS limit'}
CMDs[#CMDs + 1] = {NAME = 'replicationlag / backtrack [num]', DESC = 'Set IncomingReplicationLag'}
CMDs[#CMDs + 1] = {NAME = 'creatorid / creator', DESC = 'Notifies you the creators ID'}
CMDs[#CMDs + 1] = {NAME = 'copycreatorid / copycreator', DESC = 'Copies the creators ID to your clipboard'}
CMDs[#CMDs + 1] = {NAME = 'setcreatorid / setcreator', DESC = 'Sets your userid to the creators ID'}
CMDs[#CMDs + 1] = {NAME = 'noprompts', DESC = 'Prevents the game from showing you purchase/premium prompts'}
CMDs[#CMDs + 1] = {NAME = 'showprompts', DESC = 'Allows the game to show purchase/premium prompts again'}
CMDs[#CMDs + 1] = {NAME = 'enable [inventory/playerlist/chat/reset/emotes/all]', DESC = 'Toggles visibility of coregui items'}
CMDs[#CMDs + 1] = {NAME = 'disable [inventory/playerlist/chat/reset/emotes/all]', DESC = 'Toggles visibility of coregui items'}
CMDs[#CMDs + 1] = {NAME = 'showguis', DESC = 'Shows any invisible GUIs'}
CMDs[#CMDs + 1] = {NAME = 'unshowguis', DESC = 'Undoes showguis'}
CMDs[#CMDs + 1] = {NAME = 'hideguis', DESC = 'Hides any GUIs in PlayerGui'}
CMDs[#CMDs + 1] = {NAME = 'unhideguis', DESC = 'Undoes hideguis'}
CMDs[#CMDs + 1] = {NAME = 'guidelete', DESC = 'Enables backspace to delete GUI'}
CMDs[#CMDs + 1] = {NAME = 'unguidelete / noguidelete', DESC = 'Disables guidelete'}
CMDs[#CMDs + 1] = {NAME = 'hideiy', DESC = 'Hides the main IY GUI'}
CMDs[#CMDs + 1] = {NAME = 'showiy / unhideiy', DESC = 'Shows IY again'}
CMDs[#CMDs + 1] = {NAME = 'keepiy', DESC = 'Auto execute IY when you teleport through servers'}
CMDs[#CMDs + 1] = {NAME = 'unkeepiy', DESC = 'Disable keepiy'}
CMDs[#CMDs + 1] = {NAME = 'togglekeepiy', DESC = 'Toggles keepiy'}
CMDs[#CMDs + 1] = {NAME = 'removeads / adblock', DESC = 'Automatically removes ad billboards'}
CMDs[#CMDs + 1] = {NAME = 'savegame / saveplace', DESC = 'Uses saveinstance to save the game'}
CMDs[#CMDs + 1] = {NAME = 'clearerror', DESC = 'Clears the annoying box and blur when a game kicks you'}
CMDs[#CMDs + 1] = {NAME = 'antigameplaypaused', DESC = 'Clears the annoying box shown when a game is loading assets due to network lag'}
CMDs[#CMDs + 1] = {NAME = 'unantigameplaypaused', DESC = 'Disables antigameplaypaused'}
CMDs[#CMDs + 1] = {NAME = 'clientantikick / antikick (CLIENT)', DESC = 'Prevents localscripts from kicking you'}
CMDs[#CMDs + 1] = {NAME = 'clientantiteleport / antiteleport (CLIENT)', DESC = 'Prevents localscripts from teleporting you'}
CMDs[#CMDs + 1] = {NAME = 'allowrejoin / allowrj [true/false] (CLIENT)', DESC = 'Changes if antiteleport allows you to rejoin or not'}
CMDs[#CMDs + 1] = {NAME = 'cancelteleport / canceltp', DESC = 'Cancels teleports in progress'}
CMDs[#CMDs + 1] = {NAME = 'volume / vol [0-10]', DESC = 'Adjusts your game volume on a scale of 0 to 10'}
CMDs[#CMDs + 1] = {NAME = 'antilag / boostfps / lowgraphics', DESC = 'Lowers game quality to boost FPS'}
CMDs[#CMDs + 1] = {NAME = 'record / rec', DESC = 'Starts Roblox recorder'}
CMDs[#CMDs + 1] = {NAME = 'screenshot / scrnshot', DESC = 'Takes a screenshot'}
CMDs[#CMDs + 1] = {NAME = 'togglefullscreen / togglefs', DESC = 'Toggles fullscreen'}
CMDs[#CMDs + 1] = {NAME = 'notify [text]', DESC = 'Sends you a notification with the provided text'}
CMDs[#CMDs + 1] = {NAME = 'lastcommand / lastcmd', DESC = 'Executes the previous command used'}
CMDs[#CMDs + 1] = {NAME = 'notifyping / ping', DESC = 'Notify yourself your ping'}
CMDs[#CMDs + 1] = {NAME = 'norender', DESC = 'Disable 3d Rendering to decrease the amount of CPU the client uses'}
CMDs[#CMDs + 1] = {NAME = 'render', DESC = 'Enable 3d Rendering'}
CMDs[#CMDs + 1] = {NAME = 'use2022materials / 2022materials', DESC = 'Enables 2022 material textures'}
CMDs[#CMDs + 1] = {NAME = 'unuse2022materials / un2022materials', DESC = 'Disables 2022 material textures'}
CMDs[#CMDs + 1] = {NAME = 'alignmentkeys', DESC = 'Enables the left and right alignment keys (comma and period)'}
CMDs[#CMDs + 1] = {NAME = 'unalignmentkeys / noalignmentkeys', DESC = 'Disables the alignment keys'}
CMDs[#CMDs + 1] = {NAME = 'ctrllock', DESC = 'Binds Shiftlock to LeftControl'}
CMDs[#CMDs + 1] = {NAME = 'unctrllock', DESC = 'Re-binds Shiftlock to LeftShift'}
CMDs[#CMDs + 1] = {NAME = 'exit', DESC = 'Kills roblox process'}
CMDs[#CMDs + 1] = {NAME = 'removecmd / deletecmd', DESC = 'Removes a command until the script is reloaded'}
CMDs[#CMDs + 1] = {NAME = 'breakloops / break (cmd loops)', DESC = 'Stops any cmd loops (;100^1^cmd)'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'noclip', DESC = 'Go through objects'}
CMDs[#CMDs + 1] = {NAME = 'unnoclip / clip', DESC = 'Disables noclip'}
CMDs[#CMDs + 1] = {NAME = 'nocliph / hclip [studs]', DESC = 'Teleports you vertically through floors/ceilings (default 10 studs)'}
CMDs[#CMDs + 1] = {NAME = 'fly [speed]', DESC = 'Makes you fly'}
CMDs[#CMDs + 1] = {NAME = 'unfly', DESC = 'Disables fly'}
CMDs[#CMDs + 1] = {NAME = 'flyspeed [num]', DESC = 'Set fly speed (default is 20)'}
CMDs[#CMDs + 1] = {NAME = 'vehiclefly / vfly [speed]', DESC = 'Makes you fly in a vehicle'}
CMDs[#CMDs + 1] = {NAME = 'unvehiclefly / unvfly', DESC = 'Disables vehicle fly'}
CMDs[#CMDs + 1] = {NAME = 'vehicleflyspeed  / vflyspeed [num]', DESC = 'Set vehicle fly speed'}
CMDs[#CMDs + 1] = {NAME = 'cframefly / cfly [speed]', DESC = 'Makes you fly, bypassing some anti cheats (works on mobile)'}
CMDs[#CMDs + 1] = {NAME = 'uncframefly / uncfly', DESC = 'Disables cfly'}
CMDs[#CMDs + 1] = {NAME = 'cframeflyspeed  / cflyspeed [num]', DESC = 'Sets cfly speed'}
CMDs[#CMDs + 1] = {NAME = 'rotatespeed / rspeed / rs [angle] [key]', DESC = 'Snaps camera to angle for 0.05s on key press then restores. Example: rotatespeed 90 E'}
CMDs[#CMDs + 1] = {NAME = 'unrotatespeed / unrspeed / unrs', DESC = 'Disables rotatespeed'}
CMDs[#CMDs + 1] = {NAME = 'qefly [true / false]', DESC = 'Enables or disables the Q and E hotkeys for fly'}
CMDs[#CMDs + 1] = {NAME = 'vehiclenoclip / vnoclip', DESC = 'Turns off vehicle collision'}
CMDs[#CMDs + 1] = {NAME = 'vehicleclip / vclip / unvnoclip', DESC = 'Enables vehicle collision'}
CMDs[#CMDs + 1] = {NAME = 'float /  platform', DESC = 'Spawns a platform beneath you causing you to float'}
CMDs[#CMDs + 1] = {NAME = 'unfloat / noplatform', DESC = 'Removes the platform'}
CMDs[#CMDs + 1] = {NAME = 'swim', DESC = 'Allows you to swim in the air'}
CMDs[#CMDs + 1] = {NAME = 'unswim / noswim', DESC = 'Stops you from swimming everywhere'}
CMDs[#CMDs + 1] = {NAME = 'toggleswim', DESC = 'Toggles swimming'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'setwaypoint / swp [name]', DESC = 'Sets a waypoint at your position'}
CMDs[#CMDs + 1] = {NAME = 'waypointpos / wpp [name] [X Y Z]', DESC = 'Sets a waypoint with specified coordinates'}
CMDs[#CMDs + 1] = {NAME = 'waypoints', DESC = 'Shows a list of currently active waypoints'}
CMDs[#CMDs + 1] = {NAME = 'showwaypoints / showwp', DESC = 'Shows all currently set waypoints'}
CMDs[#CMDs + 1] = {NAME = 'hidewaypoints / hidewp', DESC = 'Hides shown waypoints'}
CMDs[#CMDs + 1] = {NAME = 'waypoint / wp [name]', DESC = 'Teleports player to a waypoint'}
CMDs[#CMDs + 1] = {NAME = 'tweenwaypoint / twp [name]', DESC = 'Tweens player to a waypoint'}
CMDs[#CMDs + 1] = {NAME = 'walktowaypoint / wtwp [name]', DESC = 'Walks player to a waypoint'}
CMDs[#CMDs + 1] = {NAME = 'deletewaypoint / dwp [name]', DESC = 'Deletes a waypoint'}
CMDs[#CMDs + 1] = {NAME = 'clearwaypoints / cwp', DESC = 'Clears all waypoints'}
CMDs[#CMDs + 1] = {NAME = 'cleargamewaypoints / cgamewp', DESC = 'Clears all waypoints for the game you are in'}
CMDs[#CMDs + 1] = {NAME = 'pathfindtopos / pftopos [X] [Y] [Z]', DESC = 'Pathfind walk to a specific coordinate'}
CMDs[#CMDs + 1] = {NAME = 'unpathfindtopos / unpftopos', DESC = 'Stops pathfindtopos'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'goto [player]', DESC = 'Go to a player'}
CMDs[#CMDs + 1] = {NAME = 'tweengoto / tgoto [player]', DESC = 'Tween to a player (bypasses some anti cheats)'}
CMDs[#CMDs + 1] = {NAME = 'tweenspeed / tspeed [num]', DESC = 'Sets how fast all tween commands go (default is 1)'}
CMDs[#CMDs + 1] = {NAME = 'vehiclegoto / vgoto [player]', DESC = 'Go to a player while in a vehicle'}
CMDs[#CMDs + 1] = {NAME = 'loopgoto [player] [distance] [delay]', DESC = 'Loop teleport to a player'}
CMDs[#CMDs + 1] = {NAME = 'unloopgoto', DESC = 'Stops teleporting you to a player'}
CMDs[#CMDs + 1] = {NAME = 'pulsetp / ptp [player] [seconds]', DESC = 'Teleports you to a player for a specified amount of time'}
CMDs[#CMDs + 1] = {NAME = 'clientbring / cbring [player] (CLIENT)', DESC = 'Bring a player'}
CMDs[#CMDs + 1] = {NAME = 'loopbring [player] [distance] [delay] (CLIENT)', DESC = 'Loop brings a player to you (useful for killing)'}
CMDs[#CMDs + 1] = {NAME = 'unloopbring [player]', DESC = 'Undoes loopbring'}
CMDs[#CMDs + 1] = {NAME = 'freeze / fr [player] (CLIENT)', DESC = 'Freezes a player'}
CMDs[#CMDs + 1] = {NAME = 'freezeanims', DESC = 'Freezes your animations / pauses your animations - Does not work on default animations'}
CMDs[#CMDs + 1] = {NAME = 'unfreezeanims', DESC = 'Unfreezes your animations / plays your animations'}
CMDs[#CMDs + 1] = {NAME = 'thaw / unfr [player] (CLIENT)', DESC = 'Unfreezes a player'}
CMDs[#CMDs + 1] = {NAME = 'anchor', DESC = 'Anchors your characters RootPart'}
CMDs[#CMDs + 1] = {NAME = 'unanchor', DESC = 'Unanchors your characters RootPart'}
CMDs[#CMDs + 1] = {NAME = 'tpposition / tppos [X Y Z]', DESC = 'Teleports you to certain coordinates'}
CMDs[#CMDs + 1] = {NAME = 'tweentpposition / ttppos [X Y Z]', DESC = 'Tween to coordinates (bypasses some anti cheats)'}
CMDs[#CMDs + 1] = {NAME = 'offset [X Y Z]', DESC = 'Offsets you by certain coordinates'}
CMDs[#CMDs + 1] = {NAME = 'tweenoffset / toffset [X Y Z]', DESC = 'Tween offset (bypasses some anti cheats)'}
CMDs[#CMDs + 1] = {NAME = 'thru [num]', DESC = 'Teleports you [num] studs ahead of where your character is facing'}
CMDs[#CMDs + 1] = {NAME = 'notifyposition / notifypos [player]', DESC = 'Notifies you the coordinates of a character'}
CMDs[#CMDs + 1] = {NAME = 'copyposition / copypos [player]', DESC = 'Copies the coordinates of a character to your clipboard'}
CMDs[#CMDs + 1] = {NAME = 'walktoposition / walktopos [X Y Z]', DESC = 'Makes you walk to a coordinate'}
CMDs[#CMDs + 1] = {NAME = 'spawnpoint / spawn [delay]', DESC = 'Sets a position where you will spawn'}
CMDs[#CMDs + 1] = {NAME = 'nospawnpoint / nospawn', DESC = 'Removes your custom spawn point'}
CMDs[#CMDs + 1] = {NAME = 'flashback / diedtp', DESC = 'Teleports you to where you last died'}
CMDs[#CMDs + 1] = {NAME = 'walltp', DESC = 'Teleports you above/over any wall you run into'}
CMDs[#CMDs + 1] = {NAME = 'nowalltp / unwalltp', DESC = 'Disables walltp'}
CMDs[#CMDs + 1] = {NAME = 'teleporttool / tptool', DESC = 'Gives you a teleport tool'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'logs', DESC = 'Opens the logs GUI'}
CMDs[#CMDs + 1] = {NAME = 'chatlogs / clogs', DESC = 'Log what people say or whisper'}
CMDs[#CMDs + 1] = {NAME = 'joinlogs / jlogs', DESC = 'Log when people join'}
CMDs[#CMDs + 1] = {NAME = 'chatlogswebhook / logswebhook [url]', DESC = 'Set a discord webhook for chatlogs to go to (provide no url to disable this)'}
CMDs[#CMDs + 1] = {NAME = 'chat / say [text]', DESC = 'Makes you chat a string (possible mute bypass)'}
CMDs[#CMDs + 1] = {NAME = 'spam [text]', DESC = 'Makes you spam the chat'}
CMDs[#CMDs + 1] = {NAME = 'unspam', DESC = 'Turns off spam'}
CMDs[#CMDs + 1] = {NAME = 'whisper / pm [player] [text]', DESC = 'Makes you whisper a string to someone (possible mute bypass)'}
CMDs[#CMDs + 1] = {NAME = 'pmspam [player] [text]', DESC = 'Makes you spam a players whispers'}
CMDs[#CMDs + 1] = {NAME = 'unpmspam [player]', DESC = 'Turns off pm spam'}
CMDs[#CMDs + 1] = {NAME = 'spamspeed [num]', DESC = 'How quickly you spam (default is 1)'}
CMDs[#CMDs + 1] = {NAME = 'bubblechat (CLIENT)', DESC = 'Enables bubble chat for your client'}
CMDs[#CMDs + 1] = {NAME = 'unbubblechat / nobubblechat', DESC = 'Disables the bubblechat command'}
CMDs[#CMDs + 1] = {NAME = 'chatwindow', DESC = 'Enables the chat window for your client'}
CMDs[#CMDs + 1] = {NAME = 'unchatwindow / nochatwindow', DESC = 'Disables the chat window for your client'}
CMDs[#CMDs + 1] = {NAME = 'darkchat', DESC = 'Makes the chat window dark for your client'}
CMDs[#CMDs + 1] = {NAME = 'listento [player]', DESC = 'Listens to the area around a player. Can also eavesdrop with vc'}
CMDs[#CMDs + 1] = {NAME = 'unlistento', DESC = 'Disables listento'}
CMDs[#CMDs + 1] = {NAME = 'muteallvoices / muteallvcs', DESC = 'Mutes voice chat for all players'}
CMDs[#CMDs + 1] = {NAME = 'unmuteallvoices / unmuteallvcs', DESC = 'Unmutes voice chat for all players'}
CMDs[#CMDs + 1] = {NAME = 'mutevc [player]', DESC = 'Mutes the voice chat of a player'}
CMDs[#CMDs + 1] = {NAME = 'unmutevc [player]', DESC = 'Unmutes the voice chat of a player'}
CMDs[#CMDs + 1] = {NAME = 'phonebook / call', DESC = 'Prompts the Roblox phonebook UI to let you call your friends. Needs voice chat enabled'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'esp', DESC = 'View all players and their status'}
CMDs[#CMDs + 1] = {NAME = 'espteam', DESC = 'ESP but teammates are green and bad guys are red'}
CMDs[#CMDs + 1] = {NAME = 'noesp / unesp / unespteam', DESC = 'Removes ESP'}
CMDs[#CMDs + 1] = {NAME = 'esptransparency [number]', DESC = 'Changes the transparency of ESP related commands'}
CMDs[#CMDs + 1] = {NAME = 'partesp [part name]', DESC = 'Highlights a part'}
CMDs[#CMDs + 1] = {NAME = 'unpartesp / nopartesp [part name]', DESC = 'removes partesp'}
CMDs[#CMDs + 1] = {NAME = 'chams', DESC = 'ESP but without text in the way'}
CMDs[#CMDs + 1] = {NAME = 'nochams / unchams', DESC = 'Removes chams'}
CMDs[#CMDs + 1] = {NAME = 'locate [player]', DESC = 'View a single player and their status'}
CMDs[#CMDs + 1] = {NAME = 'unlocate / nolocate [player]', DESC = 'Removes locate'}
CMDs[#CMDs + 1] = {NAME = 'xray', DESC = 'Makes all parts in workspace transparent'}
CMDs[#CMDs + 1] = {NAME = 'unxray / noxray', DESC = 'Restores transparency to all parts in workspace'}
CMDs[#CMDs + 1] = {NAME = 'loopxray', DESC = 'Makes all parts in workspace transparent but looped'}
CMDs[#CMDs + 1] = {NAME = 'unloopxray', DESC = 'Unloops xray'}
CMDs[#CMDs + 1] = {NAME = 'togglexray', DESC = 'Toggles xray'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'spectate / view [player]', DESC = 'View a player'}
CMDs[#CMDs + 1] = {NAME = 'viewpart / viewp [part name]', DESC = 'View a part'}
CMDs[#CMDs + 1] = {NAME = 'unspectate / unview', DESC = 'Stops viewing player'}
CMDs[#CMDs + 1] = {NAME = 'freecam / fc', DESC = 'Allows you to freely move camera around the game'}
CMDs[#CMDs + 1] = {NAME = 'freecampos / fcpos [X Y Z]', DESC = 'Moves / opens freecam in a certain position'}
CMDs[#CMDs + 1] = {NAME = 'freecamwaypoint / fcwp [name]', DESC = 'Moves / opens freecam to a waypoint'}
CMDs[#CMDs + 1] = {NAME = 'freecamgoto / fcgoto / fctp [player]', DESC = 'Moves / opens freecam to a player'}
CMDs[#CMDs + 1] = {NAME = 'unfreecam / unfc', DESC = 'Disables freecam'}
CMDs[#CMDs + 1] = {NAME = 'freecamspeed / fcspeed [num]', DESC = 'Adjusts freecam speed (default is 1)'}
CMDs[#CMDs + 1] = {NAME = 'notifyfreecamposition / notifyfcpos', DESC = 'Noitifies you your freecam coordinates'}
CMDs[#CMDs + 1] = {NAME = 'copyfreecamposition / copyfcpos', DESC = 'Copies your freecam coordinates to your clipboard'}
CMDs[#CMDs + 1] = {NAME = 'gotocamera / gotocam', DESC = 'Teleports you to the location of your camera'}
CMDs[#CMDs + 1] = {NAME = 'tweengotocam / tgotocam', DESC = 'Tweens you to the location of your camera'}
CMDs[#CMDs + 1] = {NAME = 'firstp', DESC = 'Forces camera to go into first person'}
CMDs[#CMDs + 1] = {NAME = 'thirdp', DESC = 'Allows camera to go into third person'}
CMDs[#CMDs + 1] = {NAME = 'noclipcam / nccam', DESC = 'Allows camera to go through objects like walls'}
CMDs[#CMDs + 1] = {NAME = 'maxzoom [num]', DESC = 'Maximum camera zoom'}
CMDs[#CMDs + 1] = {NAME = 'minzoom [num]', DESC = 'Minimum camera zoom'}
CMDs[#CMDs + 1] = {NAME = 'camdistance [num]', DESC = 'Changes camera distance from your player'}
CMDs[#CMDs + 1] = {NAME = 'fov [num]', DESC = 'Adjusts field of view (default is 70)'}
CMDs[#CMDs + 1] = {NAME = 'fixcam / restorecam', DESC = 'Fixes camera'}
CMDs[#CMDs + 1] = {NAME = 'enableshiftlock / enablesl', DESC = 'Enables the shift lock option'}
CMDs[#CMDs + 1] = {NAME = 'lookat [player]', DESC = 'Moves your camera view to a player'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'btools (CLIENT)', DESC = 'Gives you building tools (DOES NOT REPLICATE)'}
CMDs[#CMDs + 1] = {NAME = 'f3x (CLIENT)', DESC = 'Gives you F3X building tools (DOES NOT REPLICATE)'}
CMDs[#CMDs + 1] = {NAME = 'partname / partpath', DESC = 'Allows you to click a part to see its path & name'}
CMDs[#CMDs + 1] = {NAME = 'delete [instance name] (CLIENT)', DESC = 'Removes any part with a certain name from the workspace (DOES NOT REPLICATE)'}
CMDs[#CMDs + 1] = {NAME = 'deleteclass / dc [class name] (CLIENT)', DESC = 'Removes any part with a certain classname from the workspace (DOES NOT REPLICATE)'}
CMDs[#CMDs + 1] = {NAME = 'lockworkspace / lockws', DESC = 'Locks the whole workspace'}
CMDs[#CMDs + 1] = {NAME = 'unlockworkspace / unlockws', DESC = 'Unlocks the whole workspace'}
CMDs[#CMDs + 1] = {NAME = 'invisibleparts / invisparts (CLIENT)', DESC = 'Shows invisible parts'}
CMDs[#CMDs + 1] = {NAME = 'uninvisibleparts / uninvisparts (CLIENT)', DESC = 'Makes parts affected by invisparts return to normal'}
CMDs[#CMDs + 1] = {NAME = 'deleteinvisparts / dip (CLIENT)', DESC = 'Deletes invisible parts'}
CMDs[#CMDs + 1] = {NAME = 'gotopart [part name]', DESC = 'Moves your character to a part or multiple parts'}
CMDs[#CMDs + 1] = {NAME = 'tweengotopart / tgotopart [part name]', DESC = 'Tweens your character to a part or multiple parts'}
CMDs[#CMDs + 1] = {NAME = 'gotopartclass / gpc [class name]', DESC = 'Moves your character to a part or multiple parts based on classname'}
CMDs[#CMDs + 1] = {NAME = 'tweengotopartclass / tgpc [class name]', DESC = 'Tweens your character to a part or multiple parts based on classname'}
CMDs[#CMDs + 1] = {NAME = 'gotomodel [part name]', DESC = 'Moves your character to a model or multiple models'}
CMDs[#CMDs + 1] = {NAME = 'tweengotomodel / tgotomodel [part name]', DESC = 'Tweens your character to a model or multiple models'}
CMDs[#CMDs + 1] = {NAME = 'gotopartdelay / gotomodeldelay [num]', DESC = 'Adjusts how quickly you teleport to each part (default is 0.1)'}
CMDs[#CMDs + 1] = {NAME = 'bringpart [part name] (CLIENT)', DESC = 'Moves a part or multiple parts to your character'}
CMDs[#CMDs + 1] = {NAME = 'bringpartclass / bpc [class name] (CLIENT)', DESC = 'Moves a part or multiple parts to your character based on classname'}
CMDs[#CMDs + 1] = {NAME = 'noclickdetectorlimits / nocdlimits', DESC = 'Sets all click detectors MaxActivationDistance to math.huge'}
CMDs[#CMDs + 1] = {NAME = 'fireclickdetectors / firecd [name]', DESC = 'Uses all click detectors in a game or uses the optional name'}
CMDs[#CMDs + 1] = {NAME = 'firetouchinterests / touchinterests [name]', DESC = 'Uses all touchinterests in a game or uses the optional name'}
CMDs[#CMDs + 1] = {NAME = 'touchparts [name] [delay]', DESC = 'Teleports to all parts with given name. Default delay 0.2s'}
CMDs[#CMDs + 1] = {NAME = 'noproximitypromptlimits / nopplimits', DESC = 'Sets all proximity prompts MaxActivationDistance to math.huge'}
CMDs[#CMDs + 1] = {NAME = 'fireproximityprompts / firepp [name]', DESC = 'Uses all proximity prompts in a game or uses the optional name'}
CMDs[#CMDs + 1] = {NAME = 'instantproximityprompts / instantpp', DESC = 'Disable the cooldown for proximity prompts'}
CMDs[#CMDs + 1] = {NAME = 'uninstantproximityprompts / uninstantpp', DESC = 'Undo the cooldown removal'}
CMDs[#CMDs + 1] = {NAME = 'tpunanchored / tpua [player]', DESC = 'Teleports unanchored parts to a player'}
CMDs[#CMDs + 1] = {NAME = 'animsunanchored / freezeua', DESC = 'Freezes unanchored parts'}
CMDs[#CMDs + 1] = {NAME = 'thawunanchored / thawua / unfreezeua', DESC = 'Thaws unanchored parts'}
CMDs[#CMDs + 1] = {NAME = 'removeterrain / rterrain / noterrain', DESC = 'Removes all terrain'}
CMDs[#CMDs + 1] = {NAME = 'clearnilinstances / nonilinstances / cni', DESC = 'Removes nil instances'}
CMDs[#CMDs + 1] = {NAME = 'destroyheight / dh [num]', DESC = 'Sets FallenPartsDestroyHeight'}
CMDs[#CMDs + 1] = {NAME = 'fakeout', DESC = 'Tp to the void and then back (useful to kill people attached to you)'}
CMDs[#CMDs + 1] = {NAME = 'antivoid', DESC = 'Prevents you from falling into the void by launching you upwards'}
CMDs[#CMDs + 1] = {NAME = 'unantivoid / noantivoid', DESC = 'Disables antivoid'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'fullbright / fb (CLIENT)', DESC = 'Makes the map brighter / more visible'}
CMDs[#CMDs + 1] = {NAME = 'loopfullbright / loopfb (CLIENT)', DESC = 'Makes the map brighter / more visible but looped'}
CMDs[#CMDs + 1] = {NAME = 'unloopfullbright / unloopfb', DESC = 'Unloops fullbright'}
CMDs[#CMDs + 1] = {NAME = 'ambient [num] [num] [num] (CLIENT)', DESC = 'Changes ambient'}
CMDs[#CMDs + 1] = {NAME = 'day (CLIENT)', DESC = 'Changes the time to day for the client'}
CMDs[#CMDs + 1] = {NAME = 'night (CLIENT)', DESC = 'Changes the time to night for the client'}
CMDs[#CMDs + 1] = {NAME = 'nofog (CLIENT)', DESC = 'Removes fog'}
CMDs[#CMDs + 1] = {NAME = 'brightness [num] (CLIENT)', DESC = 'Changes the brightness lighting property'}
CMDs[#CMDs + 1] = {NAME = 'globalshadows / gshadows (CLIENT)', DESC = 'Enables global shadows'}
CMDs[#CMDs + 1] = {NAME = 'noglobalshadows / nogshadows (CLIENT)', DESC = 'Disables global shadows'}
CMDs[#CMDs + 1] = {NAME = 'restorelighting / rlighting', DESC = 'Restores Lighting properties'}
CMDs[#CMDs + 1] = {NAME = 'light [radius] [brightness] (CLIENT)', DESC = 'Gives your player dynamic light'}
CMDs[#CMDs + 1] = {NAME = 'nolight / unlight', DESC = 'Removes dynamic light from your player'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'inspect / examine [player]', DESC = 'Opens InspectMenu for a certain player'}
CMDs[#CMDs + 1] = {NAME = 'age [player]', DESC = 'Tells you the age of a player'}
CMDs[#CMDs + 1] = {NAME = 'chatage [player]', DESC = 'Chats the age of a player'}
CMDs[#CMDs + 1] = {NAME = 'joindate / jd [player]', DESC = 'Tells you the date the player joined Roblox'}
CMDs[#CMDs + 1] = {NAME = 'chatjoindate / cjd [player]', DESC = 'Chats the date the player joined Roblox'}
CMDs[#CMDs + 1] = {NAME = 'copyname / copyuser [player]', DESC = 'Copies a players full username to your clipboard'}
CMDs[#CMDs + 1] = {NAME = 'userid / id [player]', DESC = 'Notifies a players user ID'}
CMDs[#CMDs + 1] = {NAME = 'copyplaceid / placeid', DESC = 'Copies the current place id to your clipboard'}
CMDs[#CMDs + 1] = {NAME = 'copygameid / gameid', DESC = 'Copies the current game id to your clipboard'}
CMDs[#CMDs + 1] = {NAME = 'copyuserid / copyid [player]', DESC = 'Copies a players user ID to your clipboard'}
CMDs[#CMDs + 1] = {NAME = 'appearanceid / aid [player]', DESC = 'Notifies a players appearance ID'}
CMDs[#CMDs + 1] = {NAME = 'copyappearanceid / caid [player]', DESC = 'Copies a players appearance ID to your clipboard'}
CMDs[#CMDs + 1] = {NAME = 'bang [player] [speed]', DESC = 'owo'}
CMDs[#CMDs + 1] = {NAME = 'unbang', DESC = 'uwu'}
CMDs[#CMDs + 1] = {NAME = 'jerk', DESC = 'Makes you jork it'}
CMDs[#CMDs + 1] = {NAME = 'scare / spook [player]', DESC = 'Teleports in front of a player for half a second'}
CMDs[#CMDs + 1] = {NAME = 'carpet [player]', DESC = 'Be someones carpet'}
CMDs[#CMDs + 1] = {NAME = 'uncarpet', DESC = 'Undoes carpet'}
CMDs[#CMDs + 1] = {NAME = 'friend [player]', DESC = 'Sends a friend request to certain players'}
CMDs[#CMDs + 1] = {NAME = 'unfriend [player]', DESC = 'Unfriends certain players'}
CMDs[#CMDs + 1] = {NAME = 'headsit [player]', DESC = 'Sit on a players head'}
CMDs[#CMDs + 1] = {NAME = 'walkto / follow [player]', DESC = 'Follow a player'}
CMDs[#CMDs + 1] = {NAME = 'pathfindwalkto / pathfindfollow [player]', DESC = 'Follow a player using pathfinding'}
CMDs[#CMDs + 1] = {NAME = 'pathfindwalktowaypoint / pathfindwalktowp [waypoint]', DESC = 'Walk to a waypoint using pathfinding'}
CMDs[#CMDs + 1] = {NAME = 'pathfindflyto / pfflyto [player] [height]', DESC = 'Flies you up then pathfinds to a player (escapes walls/boxes)'}
CMDs[#CMDs + 1] = {NAME = 'pathfindflytowp / pfflytowp [waypoint] [height]', DESC = 'Flies you up then pathfinds to a waypoint'}
CMDs[#CMDs + 1] = {NAME = 'unpathfindfly', DESC = 'Stops pathfindflyto / pathfindflytowp'}
CMDs[#CMDs + 1] = {NAME = 'unwalkto / unfollow', DESC = 'Stops following a player'}
CMDs[#CMDs + 1] = {NAME = 'orbit [player] [speed] [distance]', DESC = 'Makes your character orbit around a player with an optional speed and an optional distance'}
CMDs[#CMDs + 1] = {NAME = 'unorbit', DESC = 'Disables orbit'}
CMDs[#CMDs + 1] = {NAME = 'stareat / stare [player]', DESC = 'Stare / look at a player'}
CMDs[#CMDs + 1] = {NAME = 'unstareat / unstare [player]', DESC = 'Disables stareat'}
CMDs[#CMDs + 1] = {NAME = 'rolewatch [group id] [role name]', DESC = 'Notify if someone from a watched group joins the server'}
CMDs[#CMDs + 1] = {NAME = 'rolewatchstop / unrolewatch', DESC = 'Disable Rolewatch'}
CMDs[#CMDs + 1] = {NAME = 'rolewatchleave', DESC = 'Toggle if you should leave the game if someone from a watched group joins the server'}
CMDs[#CMDs + 1] = {NAME = 'staffwatch', DESC = 'Notify if a staff member of the game joins the server'}
CMDs[#CMDs + 1] = {NAME = 'unstaffwatch', DESC = 'Disable Staffwatch'}
CMDs[#CMDs + 1] = {NAME = 'findfriendgroups', DESC = 'Notifies you if any players are friends with each other'}
CMDs[#CMDs + 1] = {NAME = 'handlekill / hkill [player] [radius] (TOOL)', DESC = 'Kills a player using tool damage (YOU NEED A TOOL)'}
CMDs[#CMDs + 1] = {NAME = 'fling', DESC = 'Flings anyone you touch'}
CMDs[#CMDs + 1] = {NAME = 'unfling', DESC = 'Disables the fling command'}
CMDs[#CMDs + 1] = {NAME = 'flyfling [speed]', DESC = 'Basically the invisfling command but not invisible'}
CMDs[#CMDs + 1] = {NAME = 'unflyfling', DESC = 'Disables the flyfling command'}
CMDs[#CMDs + 1] = {NAME = 'walkfling', DESC = 'Basically fling but no spinning'}
CMDs[#CMDs + 1] = {NAME = 'unwalkfling / nowalkfling', DESC = 'Disables walkfling'}
CMDs[#CMDs + 1] = {NAME = 'invisfling', DESC = 'Enables invisible fling (the invis part is patched, try using the god command before using this)'}
CMDs[#CMDs + 1] = {NAME = 'antifling', DESC = 'Disables player collisions to prevent you from being flung'}
CMDs[#CMDs + 1] = {NAME = 'unantifling', DESC = 'Disables antifling'}
CMDs[#CMDs + 1] = {NAME = 'loopoof', DESC = 'Loops everyones character sounds (everyone can hear)'}
CMDs[#CMDs + 1] = {NAME = 'unloopoof', DESC = 'Stops the oof chaos'}
CMDs[#CMDs + 1] = {NAME = 'muteboombox [player]', DESC = 'Mutes someones boombox'}
CMDs[#CMDs + 1] = {NAME = 'unmuteboombox [player]', DESC = 'Unmutes someones boombox'}
CMDs[#CMDs + 1] = {NAME = 'hitbox [player] [size] [transparency]', DESC = 'Expands the hitbox for players HumanoidRootPart (default is 1)'}
CMDs[#CMDs + 1] = {NAME = 'headsize [player] [size]', DESC = 'Expands the head size for players Head (default is 1)'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'reset', DESC = 'Resets your character normally'}
CMDs[#CMDs + 1] = {NAME = 'respawn', DESC = 'Respawns you'}
CMDs[#CMDs + 1] = {NAME = 'suicide / killme', DESC = 'Kills yourself'}
CMDs[#CMDs + 1] = {NAME = 'refresh / re', DESC = 'Respawns and brings you back to the same position'}
CMDs[#CMDs + 1] = {NAME = 'time / settime [hour]', DESC = 'Set lighting time of day (0-24)'}
CMDs[#CMDs + 1] = {NAME = 'god', DESC = 'Makes your character difficult to kill in most games'}
CMDs[#CMDs + 1] = {NAME = 'invisible / invis', DESC = 'Makes you invisible to other players'}
CMDs[#CMDs + 1] = {NAME = 'visible / vis', DESC = 'Makes you visible to other players'}
CMDs[#CMDs + 1] = {NAME = 'toolinvisible / toolinvis / tinvis', DESC = 'Makes you invisible to other players and able to use tools'}
CMDs[#CMDs + 1] = {NAME = 'speed / ws / walkspeed [num]', DESC = 'Change your walkspeed (default is 16)'}
CMDs[#CMDs + 1] = {NAME = 'spoofspeed / spoofws [num]', DESC = 'Spoofs your WalkSpeed on the Client'}
CMDs[#CMDs + 1] = {NAME = 'loopspeed / loopws [num]', DESC = 'Loops your walkspeed'}
CMDs[#CMDs + 1] = {NAME = 'unloopspeed / unloopws', DESC = 'Turns off loopspeed'}
CMDs[#CMDs + 1] = {NAME = 'hipheight / hheight [num]', DESC = 'Adjusts hip height'}
CMDs[#CMDs + 1] = {NAME = 'jumppower / jpower / jp [num]', DESC = 'Change a players jump height (default is 50)'}
CMDs[#CMDs + 1] = {NAME = 'spoofjumppower / spoofjp [num]', DESC = 'Spoofs your JumpPower on the Client'}
CMDs[#CMDs + 1] = {NAME = 'loopjumppower / loopjp [num]', DESC = 'Loops your jump height'}
CMDs[#CMDs + 1] = {NAME = 'unloopjumppower / unloopjp', DESC = 'Turns off loopjumppower'}
CMDs[#CMDs + 1] = {NAME = 'maxslopeangle / msa [num]', DESC = 'Adjusts MaxSlopeAngle'}
CMDs[#CMDs + 1] = {NAME = 'gravity / grav [num] (CLIENT)', DESC = 'Change your gravity'}
CMDs[#CMDs + 1] = {NAME = 'sit', DESC = 'Makes your character sit'}
CMDs[#CMDs + 1] = {NAME = 'lay / laydown', DESC = 'Makes your character lay down'}
CMDs[#CMDs + 1] = {NAME = 'sitwalk', DESC = 'Makes your character sit while still being able to walk'}
CMDs[#CMDs + 1] = {NAME = 'nosit', DESC = 'Prevents your character from sitting'}
CMDs[#CMDs + 1] = {NAME = 'unnosit', DESC = 'Disables nosit'}
CMDs[#CMDs + 1] = {NAME = 'jump', DESC = 'Makes your character jump'}
CMDs[#CMDs + 1] = {NAME = 'infinitejump / infjump', DESC = 'Allows you to jump before hitting the ground'}
CMDs[#CMDs + 1] = {NAME = 'uninfinitejump / uninfjump', DESC = 'Disables infjump'}
CMDs[#CMDs + 1] = {NAME = 'flyjump', DESC = 'Allows you to hold space to fly up'}
CMDs[#CMDs + 1] = {NAME = 'unflyjump', DESC = 'Disables flyjump'}
CMDs[#CMDs + 1] = {NAME = 'autojump / ajump', DESC = 'Automatically jumps when you run into an object'}
CMDs[#CMDs + 1] = {NAME = 'unautojump / unajump', DESC = 'Disables autojump'}
CMDs[#CMDs + 1] = {NAME = 'edgejump / ejump', DESC = 'Automatically jumps when you get to the edge of an object'}
CMDs[#CMDs + 1] = {NAME = 'unedgejump / unejump', DESC = 'Disables edgejump'}
CMDs[#CMDs + 1] = {NAME = 'platformstand / stun', DESC = 'Enables PlatformStand'}
CMDs[#CMDs + 1] = {NAME = 'unplatformstand / unstun', DESC = 'Disables PlatformStand'}
CMDs[#CMDs + 1] = {NAME = 'norotate / noautorotate', DESC = 'Disables AutoRotate'}
CMDs[#CMDs + 1] = {NAME = 'unnorotate / autorotate', DESC = 'Enables AutoRotate'}
CMDs[#CMDs + 1] = {NAME = 'enablestate [StateType]', DESC = 'Enables a humanoid state type'}
CMDs[#CMDs + 1] = {NAME = 'disablestate [StateType]', DESC = 'Disables a humanoid state type'}
CMDs[#CMDs + 1] = {NAME = 'team [team name] (CLIENT)', DESC = 'Changes your team. Sometimes fools localscripts.'}
CMDs[#CMDs + 1] = {NAME = 'nobillboardgui / nobgui / noname', DESC = 'Removes billboard and surface GUIs from your players (i.e. name GUIs at cafes)'}
CMDs[#CMDs + 1] = {NAME = 'loopnobgui / loopnoname', DESC = 'Loop removes billboard and surface GUIs from your players (i.e. name GUIs at cafes)'}
CMDs[#CMDs + 1] = {NAME = 'unloopnobgui / unloopnoname', DESC = 'Disables loopnobgui'}
CMDs[#CMDs + 1] = {NAME = 'noarms', DESC = 'Removes your arms'}
CMDs[#CMDs + 1] = {NAME = 'nolegs', DESC = 'Removes your legs'}
CMDs[#CMDs + 1] = {NAME = 'nolimbs', DESC = 'Removes your limbs'}
CMDs[#CMDs + 1] = {NAME = 'naked (CLIENT)', DESC = 'Removes your clothing'}
CMDs[#CMDs + 1] = {NAME = 'noface / removeface', DESC = 'Removes your face'}
CMDs[#CMDs + 1] = {NAME = 'blockhead', DESC = 'Turns your head into a block'}
CMDs[#CMDs + 1] = {NAME = 'blockhats', DESC = 'Turns your hats into blocks'}
CMDs[#CMDs + 1] = {NAME = 'blocktool', DESC = 'Turns the currently selected tool into a block'}
CMDs[#CMDs + 1] = {NAME = 'creeper', DESC = 'Makes you look like a creeper'}
CMDs[#CMDs + 1] = {NAME = 'drophats', DESC = 'Drops your hats'}
CMDs[#CMDs + 1] = {NAME = 'nohats / deletehats / rhats', DESC = 'Deletes your hats'}
CMDs[#CMDs + 1] = {NAME = 'hatspin / spinhats', DESC = 'Spins your characters accessories'}
CMDs[#CMDs + 1] = {NAME = 'unhatspin / unspinhats', DESC = 'Undoes spinhats'}
CMDs[#CMDs + 1] = {NAME = 'clearhats / cleanhats', DESC = 'Clears hats in the workspace'}
CMDs[#CMDs + 1] = {NAME = 'chardelete / cd [instance name]', DESC = 'Removes any part with a certain name from your character'}
CMDs[#CMDs + 1] = {NAME = 'chardeleteclass / cdc [class name]', DESC = 'Removes any part with a certain classname from your character'}
CMDs[#CMDs + 1] = {NAME = 'deletevelocity / dv / removeforces', DESC = 'Removes any velocity / force instances in your character'}
CMDs[#CMDs + 1] = {NAME = 'weaken [num]', DESC = 'Makes your character less dense'}
CMDs[#CMDs + 1] = {NAME = 'unweaken', DESC = 'Sets your characters CustomPhysicalProperties to default'}
CMDs[#CMDs + 1] = {NAME = 'strengthen [num]', DESC = 'Makes your character more dense (CustomPhysicalProperties)'}
CMDs[#CMDs + 1] = {NAME = 'unstrengthen', DESC = 'Sets your characters CustomPhysicalProperties to default'}
CMDs[#CMDs + 1] = {NAME = 'breakvelocity', DESC = 'Sets your characters velocity to 0'}
CMDs[#CMDs + 1] = {NAME = 'spin [speed]', DESC = 'Spins your character'}
CMDs[#CMDs + 1] = {NAME = 'unspin', DESC = 'Disables spin'}
CMDs[#CMDs + 1] = {NAME = 'split', DESC = 'Splits your character in half'}
CMDs[#CMDs + 1] = {NAME = 'nilchar', DESC = 'Sets your characters parent to nil'}
CMDs[#CMDs + 1] = {NAME = 'unnilchar / nonilchar', DESC = 'Sets your characters parent to workspace'}
CMDs[#CMDs + 1] = {NAME = 'noroot / removeroot / rroot', DESC = 'Removes your characters HumanoidRootPart'}
CMDs[#CMDs + 1] = {NAME = 'replaceroot', DESC = 'Replaces your characters HumanoidRootPart'}
CMDs[#CMDs + 1] = {NAME = 'clearcharappearance / clearchar / clrchar', DESC = 'Removes all accessory, shirt, pants, charactermesh, and bodycolors'}
CMDs[#CMDs + 1] = {NAME = 'tpwalk / teleportwalk [num]', DESC = 'Teleports you to your move direction'}
CMDs[#CMDs + 1] = {NAME = 'untpwalk / unteleportwalk', DESC = 'Undoes tpwalk / teleportwalk'}
CMDs[#CMDs + 1] = {NAME = 'trip', DESC = 'Makes your character fall over'}
CMDs[#CMDs + 1] = {NAME = 'wallwalk / walkonwalls', DESC = 'Walk on walls'}
CMDs[#CMDs + 1] = {NAME = 'promptr6', DESC = 'Prompts the game to switch your rig type to R6'}
CMDs[#CMDs + 1] = {NAME = 'promptr15', DESC = 'Prompts the game to switch your rig type to R15'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'animation / anim [ID] [speed]', DESC = 'Makes your character perform an animation (must be an animation on the marketplace or by roblox/stickmasterluke to replicate)'}
CMDs[#CMDs + 1] = {NAME = 'emote / em [ID] [speed]', DESC = 'Makes your character perform an emote (must be on the marketplace or by roblox/stickmasterluke to replicate)'}
CMDs[#CMDs + 1] = {NAME = 'dance', DESC = 'Makes you  d a n c e'}
CMDs[#CMDs + 1] = {NAME = 'undance', DESC = 'Stops dance animations'}
CMDs[#CMDs + 1] = {NAME = 'spasm', DESC = 'Makes you  c r a z y'}
CMDs[#CMDs + 1] = {NAME = 'unspasm', DESC = 'Stops spasm'}
CMDs[#CMDs + 1] = {NAME = 'headthrow', DESC = 'Simply makes you throw your head'}
CMDs[#CMDs + 1] = {NAME = 'noanim', DESC = 'Disables your animations'}
CMDs[#CMDs + 1] = {NAME = 'reanim', DESC = 'Restores your animations'}
CMDs[#CMDs + 1] = {NAME = 'animspeed [num]', DESC = 'Changes the speed of your current animation'}
CMDs[#CMDs + 1] = {NAME = 'copyanimation / copyanim / copyemote [player]', DESC = 'Copies someone elses animation'}
CMDs[#CMDs + 1] = {NAME = 'copyanimationid / copyanimid / copyemoteid [player]', DESC = 'Copies your animation id or someone elses to your clipboard'}
CMDs[#CMDs + 1] = {NAME = 'loopanimation / loopanim', DESC = 'Loops your current animation'}
CMDs[#CMDs + 1] = {NAME = 'stopanimations / stopanims', DESC = 'Stops running animations'}
CMDs[#CMDs + 1] = {NAME = 'refreshanimations / refreshanims', DESC = 'Refreshes animations'}
CMDs[#CMDs + 1] = {NAME = 'allowcustomanim / allowcustomanimations', DESC = 'Lets you use custom animation packs instead'}
CMDs[#CMDs + 1] = {NAME = 'unallowcustomanim / unallowcustomanimations', DESC = 'Doesn\'t let you use custom animation packs instead'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'autoclick [click delay] [release delay]', DESC = 'Automatically clicks your mouse with a set delay'}
CMDs[#CMDs + 1] = {NAME = 'unautoclick / noautoclick', DESC = 'Turns off autoclick'}
CMDs[#CMDs + 1] = {NAME = 'autokeypress [key] [down delay] [up delay]', DESC = 'Automatically presses a key with a set delay'}
CMDs[#CMDs + 1] = {NAME = 'unautokeypress', DESC = 'Stops autokeypress'}
CMDs[#CMDs + 1] = {NAME = 'hovername', DESC = 'Shows a players username when your mouse is hovered over them'}
CMDs[#CMDs + 1] = {NAME = 'unhovername / nohovername', DESC = 'Turns off hovername'}
CMDs[#CMDs + 1] = {NAME = 'mousesensitivity / ms [0-10]', DESC = 'Sets your mouse sensitivity (affects first person and right click drag) (default is 1)'}
CMDs[#CMDs + 1] = {NAME = 'clickdelete', DESC = 'Go to Settings > Keybinds > Add for click delete'}
CMDs[#CMDs + 1] = {NAME = 'clickteleport', DESC = 'Go to Settings > Keybinds > Add for click teleport'}
CMDs[#CMDs + 1] = {NAME = 'mouseteleport / mousetp', DESC = 'Teleports your character to your mouse. This is recommended as a keybind'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'tools', DESC = 'Copies tools from ReplicatedStorage and Lighting'}
CMDs[#CMDs + 1] = {NAME = 'notools / removetools / deletetools', DESC = 'Removes tools from character and backpack'}
CMDs[#CMDs + 1] = {NAME = 'deleteselectedtool / dst', DESC = 'Removes any currently selected tools'}
CMDs[#CMDs + 1] = {NAME = 'grabtools', DESC = 'Automatically get tools that are dropped'}
CMDs[#CMDs + 1] = {NAME = 'ungrabtools / nograbtools', DESC = 'Disables grabtools'}
CMDs[#CMDs + 1] = {NAME = 'copytools [player] (CLIENT)', DESC = 'Copies a players tools'}
CMDs[#CMDs + 1] = {NAME = 'dupetools / clonetools [num]', DESC = 'Duplicates your inventory tools a set amount of times'}
CMDs[#CMDs + 1] = {NAME = 'droptools', DESC = 'Drops your tools'}
CMDs[#CMDs + 1] = {NAME = 'droppabletools', DESC = 'Makes your tools droppable'}
CMDs[#CMDs + 1] = {NAME = 'equiptools', DESC = 'Equips every tool in your inventory at once'}
CMDs[#CMDs + 1] = {NAME = 'unequiptools', DESC = 'Unequips every tool you are currently holding at once'}
CMDs[#CMDs + 1] = {NAME = 'removespecifictool [name]', DESC = 'Automatically remove a specific tool from your inventory'}
CMDs[#CMDs + 1] = {NAME = 'unremovespecifictool [name]', DESC = 'Stops removing a specific tool from your inventory'}
CMDs[#CMDs + 1] = {NAME = 'clearremovespecifictool', DESC = 'Stop removing all specific tools from your inventory'}
CMDs[#CMDs + 1] = {NAME = 'reach [num]', DESC = 'Increases the hitbox of your held tool'}
CMDs[#CMDs + 1] = {NAME = 'boxreach [num]', DESC = 'Increases the hitbox of your held tool in a box shape'}
CMDs[#CMDs + 1] = {NAME = 'unreach / noreach', DESC = 'Turns off reach'}
CMDs[#CMDs + 1] = {NAME = 'grippos [X Y Z]', DESC = 'Changes your current tools grip position'}
CMDs[#CMDs + 1] = {NAME = 'usetools [amount] [delay]', DESC = 'Activates all tools in your backpack at the same time'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'addalias [cmd] [alias]', DESC = 'Adds an alias to a command'}
CMDs[#CMDs + 1] = {NAME = 'removealias [alias]', DESC = 'Removes a custom alias'}
CMDs[#CMDs + 1] = {NAME = 'clraliases', DESC = 'Removes all custom aliases'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'addplugin / plugin [name]', DESC = 'Add a plugin via command'}
CMDs[#CMDs + 1] = {NAME = 'removeplugin / deleteplugin [name]', DESC = 'Remove a plugin via command'}
CMDs[#CMDs + 1] = {NAME = 'reloadplugin [name]', DESC = 'Reloads a plugin'}
CMDs[#CMDs + 1] = {NAME = 'addallplugins / loadallplugins', DESC = 'Adds all available plugins from the workspace folder'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = '-- Arc Yield Custom Commands --', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'unarc', DESC = 'Removes ALL custom effects at once'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = '-- Trails (17 types) --', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'trail [type]', DESC = 'Set trail type. Types: fire,ice,lightning,smoke,rainbow,neon,purple,pink,blood,shadow,holy,toxic,galaxy,crystal,spark,heart,phantom'}
CMDs[#CMDs + 1] = {NAME = 'firetrail / icetrail / lightningtrail / etc.', DESC = 'Quick shortcut for each trail type'}
CMDs[#CMDs + 1] = {NAME = 'untrail / toggletrail', DESC = 'Remove or toggle trail'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = '-- Particle Auras (14 types) --', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'particleaura [type] / partaura', DESC = 'Set particle aura type. Types: fire,ice,lightning,smoke,shadow,holy,toxic,neon,purple,pink,galaxy,blood,phantom,crystal'}
CMDs[#CMDs + 1] = {NAME = 'fireaura / iceaura / lightningaura / etc.', DESC = 'Quick shortcut for each aura type'}
CMDs[#CMDs + 1] = {NAME = 'unparticleaura / toggleparticleaura', DESC = 'Remove or toggle particle aura'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = '-- Character Effects --', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'glow [r] [g] [b]', DESC = 'Glowing light on all body parts. Blue by default'}
CMDs[#CMDs + 1] = {NAME = 'unglow', DESC = 'Remove body glow'}
CMDs[#CMDs + 1] = {NAME = 'highlight [r] [g] [b]', DESC = 'Highlight outline on your character'}
CMDs[#CMDs + 1] = {NAME = 'unhighlight', DESC = 'Remove highlight'}
CMDs[#CMDs + 1] = {NAME = 'wireframe', DESC = 'ForceField material on all world parts'}
CMDs[#CMDs + 1] = {NAME = 'unwireframe', DESC = 'Disable wireframe'}
CMDs[#CMDs + 1] = {NAME = 'trans [0-1]', DESC = 'Set character transparency'}
CMDs[#CMDs + 1] = {NAME = 'untrans', DESC = 'Reset transparency'}
CMDs[#CMDs + 1] = {NAME = 'scale [number]', DESC = 'Scale character size'}
CMDs[#CMDs + 1] = {NAME = 'unscale', DESC = 'Reset scale'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = '-- Visual Effects --', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'arcfloat / afloat', DESC = 'Float GUI panel - toggle, rise speed slider'}
CMDs[#CMDs + 1] = {NAME = 'spinchar [speed]', DESC = 'Spin your character'}
CMDs[#CMDs + 1] = {NAME = 'unspinchar', DESC = 'Stop spinning'}
CMDs[#CMDs + 1] = {NAME = 'pulse', DESC = 'Pulsing scale effect'}
CMDs[#CMDs + 1] = {NAME = 'unpulse', DESC = 'Stop pulse effect'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = '-- HUD Elements --', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'fps / fpscounter', DESC = 'Show FPS counter'}
CMDs[#CMDs + 1] = {NAME = 'nofps', DESC = 'Hide FPS counter'}
CMDs[#CMDs + 1] = {NAME = 'ping / pingcounter', DESC = 'Show ping counter'}
CMDs[#CMDs + 1] = {NAME = 'noping', DESC = 'Hide ping counter'}
CMDs[#CMDs + 1] = {NAME = 'coords / coordinates', DESC = 'Show XYZ coordinates'}
CMDs[#CMDs + 1] = {NAME = 'nocoords', DESC = 'Hide coordinates'}
CMDs[#CMDs + 1] = {NAME = 'speedometer', DESC = 'Show speed display'}
CMDs[#CMDs + 1] = {NAME = 'nospeedometer', DESC = 'Hide speed display'}
CMDs[#CMDs + 1] = {NAME = 'crosshair / xhair', DESC = 'Show blue crosshair'}
CMDs[#CMDs + 1] = {NAME = 'nocrosshair', DESC = 'Hide crosshair'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = '-- Cosmetics --', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'crown', DESC = 'Gold crown above your head'}
CMDs[#CMDs + 1] = {NAME = 'uncrown', DESC = 'Remove crown'}
CMDs[#CMDs + 1] = {NAME = 'halo [r] [g] [b]', DESC = 'Glowing halo above head'}
CMDs[#CMDs + 1] = {NAME = 'unhalo', DESC = 'Remove halo'}
CMDs[#CMDs + 1] = {NAME = 'wings [r] [g] [b]', DESC = 'Neon wings on your character'}
CMDs[#CMDs + 1] = {NAME = 'unwings', DESC = 'Remove wings'}
CMDs[#CMDs + 1] = {NAME = 'nametag [text]', DESC = 'Custom floating name above head'}
CMDs[#CMDs + 1] = {NAME = 'unnametag', DESC = 'Remove nametag'}
CMDs[#CMDs + 1] = {NAME = 'orbittext [text]', DESC = 'Text orbits around your head'}
CMDs[#CMDs + 1] = {NAME = 'unorbittext', DESC = 'Remove orbit text'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = '-- Camera --', DESC = ''}
-- fov already defined above
CMDs[#CMDs + 1] = {NAME = 'unfov', DESC = 'Reset field of view'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = '-- Custom Animations --', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'customanim [type] [assetId]', DESC = 'Load custom animation. Types: idle,walk,run,jump,fall'}
CMDs[#CMDs + 1] = {NAME = 'unanim', DESC = 'Reset custom animations'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = '-- Utility --', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'antiafk', DESC = 'Prevents being kicked for being AFK'}
CMDs[#CMDs + 1] = {NAME = 'noantiafk', DESC = 'Disable anti-AFK'}
CMDs[#CMDs + 1] = {NAME = '', DESC = ''}
CMDs[#CMDs + 1] = {NAME = '-- Combat / UA --', DESC = ''}
CMDs[#CMDs + 1] = {NAME = 'pwalkfling / dkwalkfling [speed]', DESC = 'Invisible hitbox jitters forward/back at speed to fling people. Default 50'}
CMDs[#CMDs + 1] = {NAME = 'unpwalkfling / togglepwalkfling', DESC = 'Disable/toggle walk fling'}
CMDs[#CMDs + 1] = {NAME = 'orbitua [radius] [speed] [height]', DESC = 'Tornado orbit all parts around you. Default 50 500 0'}
CMDs[#CMDs + 1] = {NAME = 'unorbitua / toggleorbitua', DESC = 'Disable/toggle orbit UA'}
CMDs[#CMDs + 1] = {NAME = 'cube / cubebuild', DESC = 'Finds 6 unanchored parts of the same type (by Name), builds a cube 15 studs above your head'}
CMDs[#CMDs + 1] = {NAME = 'uncube / nocube / cubeoff / togglecube', DESC = 'Removes the cube and restores parts'}
CMDs[#CMDs + 1] = {NAME = 'blackhole / bhole [speed]', DESC = 'ALL unanchored parts form black hole: 75% tight core, 25% orbit ring. Stays on after death'}
CMDs[#CMDs + 1] = {NAME = 'unblackhole / noblackhole / blackholeoff / toggleblackhole', DESC = 'Disable/toggle black hole'}
CMDs[#CMDs + 1] = {NAME = 'god / ungod / togglegod', DESC = 'Toggle physics godmode manually. Same invincibility used by cannon, trowel, orbitua etc. No fall damage, no physics death.'}
CMDs[#CMDs + 1] = {NAME = 'cannon [power] / uncannon', DESC = 'Grab 1 random unanchored part, hold in front of u, click to launch toward green dot. Default power 500'}
CMDs[#CMDs + 1] = {NAME = 'minigun [power] / unminigun', DESC = 'Fires up to 30 unanchored parts one by one toward mouse, 0.2s apart. Default power 500'}
CMDs[#CMDs + 1] = {NAME = 'trowel [mode] / untrowel', DESC = 'Open-top box 300 studs above. Collect + Launch tools. Modes: normal, explode, rain, spiral, shotgun, orbit, scatter, wave, gun, one, drop, tower, wall, floor, bridge, cage, staircase, missile, shield, hail, volcano, magnet, fling, pile'}
CMDs[#CMDs + 1] = {NAME = 'slift [target] / unslift', DESC = 'Flatten all unanchored parts flat like _, place under target, slowly lift them up serversided'}
CMDs[#CMDs + 1] = {NAME = 'cageua [player] / uncageua', DESC = 'Build a 19x19x19 cage around a player using ALL unanchored parts. Serversided.'}
CMDs[#CMDs + 1] = {NAME = 'ownparts', DESC = 'Claim server ownership of ALL unanchored parts instantly'}
CMDs[#CMDs + 1] = {NAME = 'mm2 / unmm2', DESC = 'MM2 Role ESP! Red=Murderer Blue=Sheriff Green=Innocent. Distance, weapon, HP bar. Click any player to fling!'}
CMDs[#CMDs + 1] = {NAME = 'assist / unassist', DESC = 'MM2 auto-play helper! Red ESP on murderer (always on). [R] Toggle aim camera lock. [F] Toggle rush (click to fling murderer). Auto walkspeed boosts + panic teleport.'}
CMDs[#CMDs + 1] = {NAME = 'desync [speed] / undesync', DESC = 'Ghost desync! Purple ghost moves for you with WASD+Space. Real body stays frozen. Disable to teleport to ghost. Speed = optional walkspeed (default 16). Collisions work!'}
CMDs[#CMDs + 1] = {NAME = 'magnet [speed] / unmagnet', DESC = 'ALL unanchored parts fly toward you like a vacuum! They pile up on you. Default speed 300'}
CMDs[#CMDs + 1] = {NAME = 'tumble [speed] / untumble', DESC = 'CHAOS MODE - all parts spin and fling everywhere insanely. Zero friction, pure madness. Default speed 200'}
CMDs[#CMDs + 1] = {NAME = 'helicopter [spin speed] / unhelicopter', DESC = 'All unanchored parts stay in place but spin on their axis like a blender!'}
CMDs[#CMDs + 1] = {NAME = 'jumper / unjumper', DESC = 'Zombie parts! All unanchored parts walk at speed 18 and hop toward you from random directions'}
CMDs[#CMDs + 1] = {NAME = 'claimall / unclaimall', DESC = 'Claim server ownership of all unanchored parts. Press P to teleport-claim!'}
CMDs[#CMDs + 1] = {NAME = 'hoverboard', DESC = 'Find a flat unanchored part, ride it! WASD to move, idle = tilted + Aura Idle, moving = Floating anim'}
CMDs[#CMDs + 1] = {NAME = 'unhoverboard / nohoverboard / hoverboardoff / togglehoverboard', DESC = 'Disable/toggle hoverboard'}
CMDs[#CMDs + 1] = {NAME = 'lolanim / lol', DESC = 'Random different animation every time you walk, jump, or climb!'}
CMDs[#CMDs + 1] = {NAME = 'floatpack / floatanim', DESC = 'Levitation Pack - float idle, float walk/run, swim in air'}
CMDs[#CMDs + 1] = {NAME = 'godpack / godanim / god', DESC = 'God/Superhero Pack - arms out, powerful movement'}
CMDs[#CMDs + 1] = {NAME = 'ninjapack / ninjaanim / ninja', DESC = 'Ninja Pack - stealth idle, ninja run/jump'}
CMDs[#CMDs + 1] = {NAME = 'zombiepack / zombieanim / zombie', DESC = 'Zombie Pack - arms forward, stumbling walk'}
CMDs[#CMDs + 1] = {NAME = 'stylishpack / stylishanim / stylish', DESC = 'Stylish Pack - swagger walk, cool movement'}
CMDs[#CMDs + 1] = {NAME = 'robotpack / robotanim / robot', DESC = 'Robot Pack - mechanical, stiff movement'}
CMDs[#CMDs + 1] = {NAME = 'magepack / mageanim / mage', DESC = 'Mage Pack - caster walk, mystical movement'}
CMDs[#CMDs + 1] = {NAME = 'vampirepack / vampireanim / vampire', DESC = 'Vampire Pack - dark elegant movement'}
CMDs[#CMDs + 1] = {NAME = 'werewolfpack / werewolfanim', DESC = 'Werewolf Pack - beast, animalistic movement'}
CMDs[#CMDs + 1] = {NAME = 'piratepack / pirateanim / pirate', DESC = 'Pirate Pack - swashbuckler walk'}
CMDs[#CMDs + 1] = {NAME = 'cartoonyanim / cartypack', DESC = 'Cartoony Pack - exaggerated bouncy movement'}
CMDs[#CMDs + 1] = {NAME = 'bubblypack / bubblyanim / bubbly', DESC = 'Bubbly Pack - playful bouncy walk + swim'}
CMDs[#CMDs + 1] = {NAME = 'cowboyppack / cowboyanim / cowboy', DESC = 'Cowboy Pack - western stroll, rugged run'}
CMDs[#CMDs + 1] = {NAME = 'knightpack / knightanim / knight', DESC = 'Knight Pack - heavy armored movement'}
CMDs[#CMDs + 1] = {NAME = 'princesspack / princessanim / princess', DESC = 'Princess Pack - graceful, elegant walk'}
CMDs[#CMDs + 1] = {NAME = 'sneakypack / sneakyanim / sneaky', DESC = 'Sneaky Pack - tiptoe, stealth movement'}
CMDs[#CMDs + 1] = {NAME = 'confidpack / confidanim / confident', DESC = 'Confident Pack - cool idle, swagger walk'}
CMDs[#CMDs + 1] = {NAME = 'astronautpk / astronautanim', DESC = 'Astronaut Pack - space walk, skydive fall'}
CMDs[#CMDs + 1] = {NAME = 'elderpack / elderanim / elder', DESC = 'Elder Pack - slow hunched walk'}
CMDs[#CMDs + 1] = {NAME = 'popstarpack / popstaranim / popstar', DESC = 'Popstar Pack - idol walk, star movement'}
CMDs[#CMDs + 1] = {NAME = 'toypack / toyanim / toy', DESC = 'Toy Pack - stiff playful movements'}
CMDs[#CMDs + 1] = {NAME = 'unanim / noanim / stopanim / resetanim', DESC = 'Stop animation pack, restore originals'}
CMDs[#CMDs + 1] = {NAME = 'flingua / fua [spinpower]', DESC = 'Takes ALL unanchored parts, assigns one per player, spins at max speed. Default 9999'}
CMDs[#CMDs + 1] = {NAME = 'unflingua / toggleflingua', DESC = 'Disable/toggle fling UA'}
CMDs[#CMDs + 1] = {NAME = 'funnyua', DESC = 'ALL unanchored parts orbit random players, jitter & spin MAD'}
CMDs[#CMDs + 1] = {NAME = 'unfunnyua / togglefunnyua', DESC = 'Disable/toggle funny UA'}
CMDs[#CMDs + 1] = {NAME = 'aura', DESC = 'Float + orbiting unanchored parts above your head'}
CMDs[#CMDs + 1] = {NAME = 'unaura / noaura / toggleaura', DESC = 'Disable or toggle aura'}
CMDs[#CMDs + 1] = {NAME = 'tuffanim / tuff', DESC = 'Tuff Anim Pack: Demonic Float idle + Lord Walk run'}
CMDs[#CMDs + 1] = {NAME = 'untuffanim / toggletuffanim', DESC = 'Disable or toggle tuff anim pack'}
CMDs[#CMDs + 1] = {NAME = 'lolspam', DESC = 'Random emote spam whenever you move or do anything'}
CMDs[#CMDs + 1] = {NAME = 'tas', DESC = 'Tool-Assisted Speedrun recorder. F=forward, R=rewind, CapsLock=pause'}
CMDs[#CMDs + 1] = {NAME = 'untas', DESC = 'Stop TAS recorder and clean up'}
CMDs[#CMDs + 1] = {NAME = 'orbitallazer / orblazer', DESC = 'ALL unanchored parts follow your mouse, jitter & spin MAD'}
CMDs[#CMDs + 1] = {NAME = 'unorbitallazer / toggleorbitallazer', DESC = 'Disable/toggle orbital lazer'}
CMDs[#CMDs + 1] = {NAME = 'arrow [player]', DESC = 'ALL unanchored parts form a GIANT arrow above target player'}
CMDs[#CMDs + 1] = {NAME = 'unarrow / togglearrow', DESC = 'Disable/toggle arrow'}
CMDs[#CMDs + 1] = {NAME = 'antiua', DESC = 'ALL unanchored parts get anti-gravity, float upward and drift'}
CMDs[#CMDs + 1] = {NAME = 'unantiua / toggleantiua', DESC = 'Disable/toggle anti-gravity UA'}
CMDs[#CMDs + 1] = {NAME = '0gravityua / zerogua', DESC = 'ALL unanchored parts in zero gravity, float in space'}
CMDs[#CMDs + 1] = {NAME = 'un0gravityua / toggle0gravityua', DESC = 'Disable/toggle zero gravity UA'}
CMDs[#CMDs + 1] = {NAME = 'mouseua', DESC = 'ALL unanchored parts form a line from you to your mouse'}

CMDs[#CMDs + 1] = {NAME = 'unsmartesp / nosmartesp / togglesmartesp', DESC = 'Disable/toggle smart ESP'}
CMDs[#CMDs + 1] = {NAME = 'mm2', DESC = 'Load Bubbly MM2 script (needs Bubbly_MM2.lua in workspace)'}
CMDs[#CMDs + 1] = {NAME = 'yunas', DESC = 'Load Yunas hub script'}
CMDs[#CMDs + 1] = {NAME = 'dropkick', DESC = 'Load DropKick script'}
CMDs[#CMDs + 1] = {NAME = 'lumber', DESC = 'Load Kron Hub (Lumber Tycoon)'}
CMDs[#CMDs + 1] = {NAME = 'grabparts', DESC = 'Load Grab Parts script'}
-- 50 CUSTOM COMMANDS
CMDs[#CMDs + 1] = {NAME = 'hyperspeed [num]', DESC = 'Velocity-based speed that bypasses normal cap. Default 150'}
CMDs[#CMDs + 1] = {NAME = 'superjump [num]', DESC = 'High impulse jump. Default power 150'}
CMDs[#CMDs + 1] = {NAME = 'bhop', DESC = 'Auto bunny hop while moving'}
CMDs[#CMDs + 1] = {NAME = 'infjump', DESC = 'Infinite jump (jump midair)'}
-- float already defined above
CMDs[#CMDs + 1] = {NAME = 'rocket', DESC = 'Launch yourself upward at 500 speed'}
CMDs[#CMDs + 1] = {NAME = 'bouncy [num]', DESC = 'Bounce when touching ground. Default 120'}
CMDs[#CMDs + 1] = {NAME = 'antigrav', DESC = 'Zero gravity on your character'}
CMDs[#CMDs + 1] = {NAME = 'dash', DESC = 'Quick burst of speed in look direction'}
CMDs[#CMDs + 1] = {NAME = 'spider', DESC = 'Walk on walls and ceilings'}
CMDs[#CMDs + 1] = {NAME = 'itemesp', DESC = 'ESP for dropped items/tools on ground (yellow text)'}
-- partesp already defined above
CMDs[#CMDs + 1] = {NAME = 'vehicleesp', DESC = 'ESP for seats/vehicles. Red=occupied Green=empty'}
CMDs[#CMDs + 1] = {NAME = 'mobesp', DESC = 'ESP for NPCs/monsters (orange text + HP)'}
-- chams already defined above
-- trail already defined above
CMDs[#CMDs + 1] = {NAME = 'nightvision', DESC = 'Green night vision overlay + bright lighting'}
-- wireframe already defined above
CMDs[#CMDs + 1] = {NAME = 'toolgrabber', DESC = 'Auto-grab dropped tools within 100 studs'}
-- reach already defined above
CMDs[#CMDs + 1] = {NAME = 'autofarm', DESC = 'Auto-collect nearby items/tools (80 stud range)'}
CMDs[#CMDs + 1] = {NAME = 'killaura [range]', DESC = 'Auto-damage nearby players. Default 25 stud range'}
CMDs[#CMDs + 1] = {NAME = 'toolcopy [player]', DESC = 'Clone a players held/backpack tool'}
CMDs[#CMDs + 1] = {NAME = 'heal', DESC = 'Heal yourself to full HP'}
CMDs[#CMDs + 1] = {NAME = 'healall', DESC = 'Heal all players to full HP'}
CMDs[#CMDs + 1] = {NAME = 'explode [player]', DESC = 'Create explosion on a player (blast radius 20)'}
CMDs[#CMDs + 1] = {NAME = 'serverlock', DESC = 'Lock server (kick new joiners)'}
CMDs[#CMDs + 1] = {NAME = 'loopkill [player]', DESC = 'Loop kill a player (kills on respawn)'}
CMDs[#CMDs + 1] = {NAME = 'jail [player]', DESC = 'Put player in a blue forcefield cage'}
CMDs[#CMDs + 1] = {NAME = 'blind [player]', DESC = 'Black screen on target player'}
-- freeze already defined above
CMDs[#CMDs + 1] = {NAME = 'punish [player]', DESC = 'Remove a players character'}
-- trip already defined above
CMDs[#CMDs + 1] = {NAME = 'stun [player]', DESC = 'Set player speed to 0 (cannot move)'}
-- fling already defined above
CMDs[#CMDs + 1] = {NAME = 'bringall / tpall', DESC = 'Teleport ALL players to your position'}
CMDs[#CMDs + 1] = {NAME = 'crashplayer [player]', DESC = 'Lag/crash a player with 200 parts'}
CMDs[#CMDs + 1] = {NAME = 'spin2', DESC = 'Spin your character (BodyAngularVelocity)'}
CMDs[#CMDs + 1] = {NAME = 'seizure', DESC = 'Random camera offset + sit spam'}
CMDs[#CMDs + 1] = {NAME = 'fire [hexcolor]', DESC = 'Fire effect on your character. Default orange'}
CMDs[#CMDs + 1] = {NAME = 'sparkles [hexcolor]', DESC = 'Sparkle effect on your character. Default gold'}
CMDs[#CMDs + 1] = {NAME = 'smoke [hexcolor]', DESC = 'Smoke effect on your character. Default gray'}
CMDs[#CMDs + 1] = {NAME = 'tiny', DESC = 'Shrink to 10% size'}
CMDs[#CMDs + 1] = {NAME = 'giant', DESC = 'Grow to 500% size'}
CMDs[#CMDs + 1] = {NAME = 'npp', DESC = 'No Player Parts (invisible to others)'}
-- fullbright already defined above
-- removeterrain already defined above
CMDs[#CMDs + 1] = {NAME = 'music [assetid]', DESC = 'Play music by Roblox asset ID'}
CMDs[#CMDs + 1] = {NAME = 'stopmusic', DESC = 'Stop playing music'}
-- gravity already defined above
CMDs[#CMDs + 1] = {NAME = 'smartesp', DESC = 'SERVERSIDED MM2 ESP! Highlight + billboards ALL players see. Name/age/dist/role/tools/avatar/HP. Click to fling!'}
CMDs[#CMDs + 1] = {NAME = 'scatter', DESC = 'Launch all unanchored parts away from you'}
CMDs[#CMDs + 1] = {NAME = 'gather', DESC = 'Gather all unanchored parts to you'}
CMDs[#CMDs + 1] = {NAME = 'deleteparts', DESC = 'Delete all unanchored non-player parts'}
CMDs[#CMDs + 1] = {NAME = 'anchorparts', DESC = 'Anchor ALL unanchored parts'}
CMDs[#CMDs + 1] = {NAME = 'unanchorparts', DESC = 'Unanchor all anchored parts (except terrain)'}
CMDs[#CMDs + 1] = {NAME = 'orbitparts', DESC = 'Make parts orbit around you in a circle'}
CMDs[#CMDs + 1] = {NAME = 'spiralparts', DESC = 'Make parts spiral upward around you'}
CMDs[#CMDs + 1] = {NAME = 'partrain', DESC = 'Rain unanchored parts from above'}
CMDs[#CMDs + 1] = {NAME = 'antikick', DESC = 'Hook Kick method to prevent being kicked (server-sided)'}
-- antivoid already defined above
CMDs[#CMDs + 1] = {NAME = 'namespoof [name]', DESC = 'Display a fake name above your head'}
CMDs[#CMDs + 1] = {NAME = 'godmode', DESC = 'Infinite HP + speed 50 + jump 100'}
-- noclip already defined above
CMDs[#CMDs + 1] = {NAME = 'cloud', DESC = 'Load Cloud Hub script'}
CMDs[#CMDs + 1] = {NAME = 'fluxus', DESC = 'Load Fluxus Hub script'}
CMDs[#CMDs + 1] = {NAME = 'unnamed', DESC = 'Load Unnamed ESP Hub script'}
CMDs[#CMDs + 1] = {NAME = 'janitor', DESC = 'Load Janitor cleanup hub script'}
CMDs[#CMDs + 1] = {NAME = 'oxygen', DESC = 'Load Oxygen Hub script'}
CMDs[#CMDs + 1] = {NAME = 'lynx', DESC = 'Load Lynx Hub script'}
CMDs[#CMDs + 1] = {NAME = 'ctrlclicktp', DESC = 'Ctrl+Click to teleport anywhere'}
CMDs[#CMDs + 1] = {NAME = 'toptool', DESC = 'Give yourself the best tool in workspace'}
CMDs[#CMDs + 1] = {NAME = 'alltools', DESC = 'Give yourself EVERY tool in workspace'}
CMDs[#CMDs + 1] = {NAME = 'stealfly [player]', DESC = 'Copy another players fly (BodyVelocity/Bav)'}
CMDs[#CMDs + 1] = {NAME = 'raid [player]', DESC = 'Spam explosions on a player'}
CMDs[#CMDs + 1] = {NAME = 'speedrun', DESC = 'Set speed 100 + jump 200'}
CMDs[#CMDs + 1] = {NAME = 'slow', DESC = 'Set speed to 5'}
CMDs[#CMDs + 1] = {NAME = 'clicktp', DESC = 'Right click to teleport anywhere'}
CMDs[#CMDs + 1] = {NAME = 'say [msg]', DESC = 'Send a chat message'}
-- spam entry already exists above (spam [text])
CMDs[#CMDs + 1] = {NAME = 'sspam [msg]', DESC = 'Serversided spam - spam chat with a message'}
-- SERVERSIDED COMMANDS (create objects in Workspace that ALL players see)
CMDs[#CMDs + 1] = {NAME = 'sshat [#hexcolor]', DESC = 'SERVERSIDED hat on your head (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unsshat', DESC = 'Remove serversided hat'}
CMDs[#CMDs + 1] = {NAME = 'sscape [#hexcolor]', DESC = 'SERVERSIDED cape on your back (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unsscape', DESC = 'Remove serversided cape'}
CMDs[#CMDs + 1] = {NAME = 'sswing [#hexcolor]', DESC = 'SERVERSIDED wings on your character (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unsswing', DESC = 'Remove serversided wings'}
CMDs[#CMDs + 1] = {NAME = 'ssring [#hexcolor]', DESC = 'SERVERSIDED neon ring on ground (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unssring', DESC = 'Remove serversided ring'}
CMDs[#CMDs + 1] = {NAME = 'sslight [#hexcolor]', DESC = 'SERVERSIDED point light on character (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unsslight', DESC = 'Remove serversided light'}
CMDs[#CMDs + 1] = {NAME = 'ssparticles [#hexcolor]', DESC = 'SERVERSIDED particle emitters on body (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unssparticles', DESC = 'Remove serversided particles'}
CMDs[#CMDs + 1] = {NAME = 'ssmusic [assetid]', DESC = 'SERVERSIDED music all players hear (default 6895079853)'}
CMDs[#CMDs + 1] = {NAME = 'unssmusic', DESC = 'Stop serversided music'}
CMDs[#CMDs + 1] = {NAME = 'ssmsg [text]', DESC = 'SERVERSIDED floating text in workspace (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unssmsg', DESC = 'Remove serversided messages'}
CMDs[#CMDs + 1] = {NAME = 'sscrosshair', DESC = 'SERVERSIDED crosshair on head (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unsscrosshair', DESC = 'Remove serversided crosshair'}
CMDs[#CMDs + 1] = {NAME = 'ssarrow', DESC = 'SERVERSIDED arrow pointing to nearest player (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unssarrow', DESC = 'Remove serversided arrow'}
CMDs[#CMDs + 1] = {NAME = 'ssorb [#hexcolor]', DESC = 'SERVERSIDED 6 orbiting balls with lights (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unssorb', DESC = 'Remove serversided orbs'}
CMDs[#CMDs + 1] = {NAME = 'ssfloating [text]', DESC = 'SERVERSIDED floating text above YOUR head (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unssfloating', DESC = 'Remove serversided floating text'}
CMDs[#CMDs + 1] = {NAME = 'ssaura [#hexcolor]', DESC = 'SERVERSIDED pulsing aura balls (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unssaura', DESC = 'Remove serversided aura'}
CMDs[#CMDs + 1] = {NAME = 'sscrown', DESC = 'SERVERSIDED golden crown on head (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unsscrown', DESC = 'Remove serversided crown'}
CMDs[#CMDs + 1] = {NAME = 'sstrail [#hexcolor]', DESC = 'SERVERSIDED trail of neon balls (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unsstrail', DESC = 'Remove serversided trail'}
CMDs[#CMDs + 1] = {NAME = 'ssexplode [player]', DESC = 'SERVERSIDED explosion on a player (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'ssblock [player]', DESC = 'SERVERSIDED forcefield cage around a player (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unssblock', DESC = 'Remove serversided cage'}
CMDs[#CMDs + 1] = {NAME = 'ssflag [#hexcolor]', DESC = 'SERVERSIDED flag on a pole above head (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unssflag', DESC = 'Remove serversided flag'}
CMDs[#CMDs + 1] = {NAME = 'sshalo', DESC = 'SERVERSIDED golden halo above head (everyone sees)'}
CMDs[#CMDs + 1] = {NAME = 'unsshalo', DESC = 'Remove serversided halo'}
CMDs[#CMDs + 1] = {NAME = 'cleanupss / clearss', DESC = 'Remove ALL serversided Arc Yield objects from workspace'}

-- ARC GUI PANEL COMMANDS (HD Admin-style menus)
CMDs[#CMDs + 1] = {NAME = 'arcgui', DESC = 'Open Arc Yield GUI hub - browse all 50 GUI panels'}
CMDs[#CMDs + 1] = {NAME = 'closearc / closeallarc', DESC = 'Close ALL open Arc GUI panels'}
CMDs[#CMDs + 1] = {NAME = 'arcuseresp / detectusers', DESC = 'ESP showing other Infinite Yield / Arc Yield users'}
CMDs[#CMDs + 1] = {NAME = 'arcfly / afly', DESC = 'Fly GUI panel - toggle, speed slider'}
CMDs[#CMDs + 1] = {NAME = 'archyper / ahspeed', DESC = 'Hyperspeed GUI panel - toggle, speed slider'}
CMDs[#CMDs + 1] = {NAME = 'arcsjump / asjump', DESC = 'Super Jump GUI panel - toggle, power slider'}
CMDs[#CMDs + 1] = {NAME = 'arcbhop / abhop', DESC = 'Bunny Hop GUI panel - toggle, boost height slider'}
CMDs[#CMDs + 1] = {NAME = 'arcinfjump / ainfjump', DESC = 'Infinite Jump GUI panel - toggle'}
-- arcfloat / afloat entry already above (Visual Effects section)
CMDs[#CMDs + 1] = {NAME = 'arcbouncy / abouncy', DESC = 'Bouncy GUI panel - toggle, bounce power slider'}
CMDs[#CMDs + 1] = {NAME = 'arcantigrav / aantigrav', DESC = 'Anti-Gravity GUI panel - toggle'}
CMDs[#CMDs + 1] = {NAME = 'arcdash / adash', DESC = 'Dash GUI panel - power slider, dash button'}
CMDs[#CMDs + 1] = {NAME = 'arcspider / aspider', DESC = 'Spider GUI panel - toggle, climb speed slider'}
CMDs[#CMDs + 1] = {NAME = 'arcnoclip / anoclip', DESC = 'Noclip GUI panel - toggle'}
CMDs[#CMDs + 1] = {NAME = 'arcspeed / aspeed', DESC = 'WalkSpeed GUI panel - speed slider'}
CMDs[#CMDs + 1] = {NAME = 'arcjp / ajumppower', DESC = 'JumpPower GUI panel - power slider'}
CMDs[#CMDs + 1] = {NAME = 'arccfly / accfly', DESC = 'CFrame Fly GUI panel - toggle, speed slider'}
CMDs[#CMDs + 1] = {NAME = 'arcvfly / avfly', DESC = 'Vehicle Fly GUI panel - toggle, speed slider'}
CMDs[#CMDs + 1] = {NAME = 'arcesp / aesp', DESC = 'ESP GUI panel - toggle, transparency slider'}
CMDs[#CMDs + 1] = {NAME = 'arcitemesp / aitemesp', DESC = 'Item ESP GUI panel - toggle, range slider'}
CMDs[#CMDs + 1] = {NAME = 'arcpartesp / apartesp', DESC = 'Part ESP GUI panel - toggle, filter text'}
CMDs[#CMDs + 1] = {NAME = 'arcvesp / avesp', DESC = 'Vehicle ESP GUI panel - toggle'}
CMDs[#CMDs + 1] = {NAME = 'arcmobesp / amobesp', DESC = 'Mob ESP GUI panel - toggle, range slider'}
CMDs[#CMDs + 1] = {NAME = 'arcchams / achams', DESC = 'Chams GUI panel - toggle, transparency slider'}
CMDs[#CMDs + 1] = {NAME = 'arctrail / atrail', DESC = 'Trail GUI panel - toggle, color, lifetime slider'}
CMDs[#CMDs + 1] = {NAME = 'arcnv / anv', DESC = 'Night Vision GUI panel - toggle, brightness slider'}
CMDs[#CMDs + 1] = {NAME = 'arcwireframe / awireframe', DESC = 'Wireframe GUI panel - toggle'}
CMDs[#CMDs + 1] = {NAME = 'arcfb / afb', DESC = 'Fullbright GUI panel - toggle'}
CMDs[#CMDs + 1] = {NAME = 'arckaura / akaura', DESC = 'Kill Aura GUI panel - toggle, range & damage sliders'}
CMDs[#CMDs + 1] = {NAME = 'arcreach / areach', DESC = 'Reach GUI panel - toggle, distance slider'}
CMDs[#CMDs + 1] = {NAME = 'arctoolgrab / atoolgrab', DESC = 'Tool Grabber GUI panel - toggle, range slider'}
CMDs[#CMDs + 1] = {NAME = 'arcautofarm / aautofarm', DESC = 'Auto Farm GUI panel - toggle, range slider'}
CMDs[#CMDs + 1] = {NAME = 'arctoolcopy / atoolcopy', DESC = 'Tool Copy GUI panel - player name, copy button'}
CMDs[#CMDs + 1] = {NAME = 'arcexplode / aexplode', DESC = 'Explode GUI panel - player name, blast radius, explode btn'}
CMDs[#CMDs + 1] = {NAME = 'arcslock / aslock', DESC = 'Server Lock GUI panel - toggle'}
CMDs[#CMDs + 1] = {NAME = 'arcloopkill / aloopkill', DESC = 'Loop Kill GUI panel - player name, start/stop'}
CMDs[#CMDs + 1] = {NAME = 'arcjail / ajail', DESC = 'Jail GUI panel - player name, jail/unjail'}
CMDs[#CMDs + 1] = {NAME = 'arcfreeze / afreeze', DESC = 'Freeze GUI panel - player name, freeze/unfreeze'}
CMDs[#CMDs + 1] = {NAME = 'arcblind / ablind', DESC = 'Blind GUI panel - player name, blind/unblind'}
CMDs[#CMDs + 1] = {NAME = 'arcfling / afling', DESC = 'Fling GUI panel - player name, power slider, fling btn'}
CMDs[#CMDs + 1] = {NAME = 'arcbringall / abringall', DESC = 'Bring All GUI panel - offset range, bring button'}
CMDs[#CMDs + 1] = {NAME = 'arctpall / atpall', DESC = 'TP All GUI panel - offset range, tp button'}
CMDs[#CMDs + 1] = {NAME = 'arccrash / acrash', DESC = 'Crash Player GUI panel - player name, crash button'}
CMDs[#CMDs + 1] = {NAME = 'arcspin2 / aspin2', DESC = 'Spin GUI panel - toggle, speed slider'}
CMDs[#CMDs + 1] = {NAME = 'arcseizure / aseizure', DESC = 'Seizure GUI panel - toggle, intensity slider'}
CMDs[#CMDs + 1] = {NAME = 'arcfire / afire', DESC = 'Fire GUI panel - toggle, color, size slider'}
CMDs[#CMDs + 1] = {NAME = 'arcsparkles / asparkles', DESC = 'Sparkles GUI panel - toggle, color'}
CMDs[#CMDs + 1] = {NAME = 'arcsmoke / asmoke', DESC = 'Smoke GUI panel - toggle, color, opacity slider'}
CMDs[#CMDs + 1] = {NAME = 'arctiny / atinyscale', DESC = 'Tiny GUI panel - toggle, scale slider'}
CMDs[#CMDs + 1] = {NAME = 'arcgravity / agravity', DESC = 'Gravity GUI panel - slider, set/reset buttons'}
CMDs[#CMDs + 1] = {NAME = 'arcmusic / amusic', DESC = 'Music GUI panel - asset ID, volume, play/stop'}
CMDs[#CMDs + 1] = {NAME = 'arcnpp / anpp', DESC = 'NPP GUI panel - toggle'}
CMDs[#CMDs + 1] = {NAME = 'arcgiant / agiant', DESC = 'Giant GUI panel - toggle, scale slider'}

for i = 1, #CMDs do
        local newcmd = Example:Clone()
        newcmd.Parent = CMDsF
        newcmd.Visible = false
        newcmd.Text = CMDs[i].NAME
        newcmd.Name = "CMD"
        table.insert(text1, newcmd)
        if CMDs[i].DESC ~= "" then
                newcmd:SetAttribute("Title", CMDs[i].NAME)
                newcmd:SetAttribute("Desc", CMDs[i].DESC)
                newcmd.MouseButton1Down:Connect(function()
                        if not IsOnMobile and newcmd.Visible and newcmd.TextTransparency == 0 then
                                local currentText = Cmdbar.Text
                                Cmdbar:CaptureFocus()
                                autoComplete(newcmd.Text, currentText)
                                maximizeHolder()
                        end
                end)
        end
end

IndexContents("", true)

function checkTT()
        local t
        local guisAtPosition = COREGUI:GetGuiObjectsAtPosition(IYMouse.X, IYMouse.Y)

        for _, gui in pairs(guisAtPosition) do
                if gui.Parent == CMDsF then
                        t = gui
                end
        end

        if t ~= nil and t:GetAttribute("Title") ~= nil then
                local x = IYMouse.X
                local y = IYMouse.Y
                local xP
                local yP
                if IYMouse.X > 200 then
                        xP = x - 201
                else
                        xP = x + 21
                end
                if IYMouse.Y > (IYMouse.ViewSizeY-96) then
                        yP = y - 97
                else
                        yP = y
                end
                Tooltip.Position = UDim2.new(0, xP, 0, yP)
                Description.Text = t:GetAttribute("Desc")
                if t:GetAttribute("Title") ~= nil then
                        Title_3.Text = t:GetAttribute("Title")
                else
                        Title_3.Text = ''
                end
                Tooltip.Visible = true
        else
                Tooltip.Visible = false
        end
end

function FindInTable(tbl,val)
        if tbl == nil then return false end
        for _,v in pairs(tbl) do
                if v == val then return true end
        end 
        return false
end

function GetInTable(Table, Name)
        for i = 1, #Table do
                if Table[i] == Name then
                        return i
                end
        end
        return false
end

function respawn(plr)
        if invisRunning then TurnVisible() end
    local char = plr.Character
    local hum = char:FindFirstChildWhichIsA("Humanoid")
    if hum then hum:ChangeState(Enum.HumanoidStateType.Dead) end
    char:ClearAllChildren()
    local newChar = Instance.new("Model")
    newChar.Parent = workspace
    plr.Character = newChar
    task.wait()
    plr.Character = char
    newChar:Destroy()
end

local refreshCmd = false
function refresh(plr)
        refreshCmd = true
        local root = getRoot(plr.Character)
        local pos = root.CFrame
        local pos1 = workspace.CurrentCamera.CFrame
        respawn(plr)
        task.spawn(function()
                local char = plr.CharacterAdded:Wait()
                local humanoid = char:FindFirstChildOfClass("Humanoid")
                while not humanoid do
                        wait()
                        humanoid = char:FindFirstChildOfClass("Humanoid")
                end
                humanoid.RootPart.CFrame, workspace.CurrentCamera.CFrame = pos, task.wait() and pos1
                refreshCmd = false
        end)
end

local lastDeath

function onDied()
        task.spawn(function()
                if pcall(function() Players.LocalPlayer.Character:FindFirstChildOfClass('Humanoid') end) and Players.LocalPlayer.Character:FindFirstChildOfClass('Humanoid') then
                        Players.LocalPlayer.Character:FindFirstChildOfClass('Humanoid').Died:Connect(function()
                                if getRoot(Players.LocalPlayer.Character) then
                                        lastDeath = getRoot(Players.LocalPlayer.Character).CFrame
                                end
                        end)
                else
                        wait(2)
                        onDied()
                end
        end)
end

Clip = true
spDelay = 0.1
Players.LocalPlayer.CharacterAdded:Connect(function()
        NOFLY()
        Floating = false

        if not Clip then
                execCmd('clip')
        end

        repeat wait() until getRoot(Players.LocalPlayer.Character)

        pcall(function()
                if spawnpoint and not refreshCmd and spawnpos ~= nil then
                        wait(spDelay)
                        getRoot(Players.LocalPlayer.Character).CFrame = spawnpos
                end
        end)

        onDied()
end)

onDied()

local booly = {
    truthy = { ["true"] = true, ["t"] = true, ["1"] = true, yes = true, y = true, on = true, enable = true, enabled = true },
    falsy = { ["false"] = true, ["f"] = true, ["0"] = true, no = true, n = true, off = true, disable = true, disabled = true }
}

function parseBoolean(raw, default)
    raw = tostring(raw)
    if booly.truthy[raw] then return true end
    if booly.falsy[raw] then return false end
    return default or false
end

function getstring(begin, args)
    return table.concat(args or cargs, " ", begin)
end

findCmd=function(cmd_name)
        for i,v in pairs(cmds)do
                if v.NAME:lower()==cmd_name:lower() or FindInTable(v.ALIAS,cmd_name:lower()) then
                        return v
                end
        end
        return customAlias[cmd_name:lower()]
end

function splitString(str,delim)
        local broken = {}
        if delim == nil then delim = "," end
        for w in string.gmatch(str,"[^"..delim.."]+") do
                table.insert(broken,w)
        end
        return broken
end

cmdHistory = {}
local lastCmds = {}
local historyCount = 0
local split=" "
local lastBreakTime = 0
function execCmd(cmdStr,speaker,store)
        cmdStr = cmdStr:gsub("%s+$","")
        task.spawn(function()
                local rawCmdStr = cmdStr
                cmdStr = string.gsub(cmdStr,"\\\\","%%BackSlash%%")
                local commandsToRun = splitString(cmdStr,"\\")
                for i,v in pairs(commandsToRun) do
                        v = string.gsub(v,"%%BackSlash%%","\\")
                        local x,y,num = v:find("^(%d+)%^")
                        local cmdDelay = 0
                        local infTimes = false
                        if num then
                                v = v:sub(y+1)
                                local x,y,del = v:find("^([%d%.]+)%^")
                                if del then
                                        v = v:sub(y+1)
                                        cmdDelay = tonumber(del) or 0
                                end
                        else
                                local x,y = v:find("^inf%^")
                                if x then
                                        infTimes = true
                                        v = v:sub(y+1)
                                        local x,y,del = v:find("^([%d%.]+)%^")
                                        if del then
                                                v = v:sub(y+1)
                                                del = tonumber(del) or 1
                                                cmdDelay = (del > 0 and del or 1)
                                        else
                                                cmdDelay = 1
                                        end
                                end
                        end
                        num = tonumber(num or 1)

                        if v:sub(1,1) == "!" then
                                local chunks = splitString(v:sub(2),split)
                                if chunks[1] and lastCmds[chunks[1]] then v = lastCmds[chunks[1]] end
                        end

                        local args = splitString(v,split)
                        local cmdName = args[1]
                        local cmd = findCmd(cmdName)
                        if cmd then
                                table.remove(args,1)
                                cargs = args
                                if not speaker then speaker = Players.LocalPlayer end
                                if store then
                                        if speaker == Players.LocalPlayer then
                                                if cmdHistory[1] ~= rawCmdStr and rawCmdStr:sub(1,11) ~= 'lastcommand' and rawCmdStr:sub(1,7) ~= 'lastcmd' then
                                                        table.insert(cmdHistory,1,rawCmdStr)
                                                end
                                        end
                                        if #cmdHistory > 30 then table.remove(cmdHistory) end

                                        lastCmds[cmdName] = v
                                end
                                local cmdStartTime = tick()
                                if infTimes then
                                        while lastBreakTime < cmdStartTime do
                                                local success,err = pcall(cmd.FUNC,args, speaker)
                                                if not success and _G.IY_DEBUG then
                                                        warn("Command Error:", cmdName, err)
                                                end
                                                wait(cmdDelay)
                                        end
                                else
                                        for rep = 1,num do
                                                if lastBreakTime > cmdStartTime then break end
                                                local success,err = pcall(function()
                                                        cmd.FUNC(args, speaker)
                                                end)
                                                if not success and _G.IY_DEBUG then
                                                        warn("Command Error:", cmdName, err)
                                                end
                                                if cmdDelay ~= 0 then wait(cmdDelay) end
                                        end
                                end
                        end
                end
        end)
end     

function addcmd(name,alias,func,plgn)
        cmds[#cmds+1]=
                {
                        NAME=name;
                        ALIAS=alias or {};
                        FUNC=func;
                        PLUGIN=plgn;
                }
        -- UI buttons are already created by the CMDs list loop below,
        -- so we skip creating duplicates here
end

function removecmd(cmd)
        if cmd ~= " " then
                for i = #cmds,1,-1 do
                        if cmds[i].NAME == cmd or FindInTable(cmds[i].ALIAS,cmd) then
                                table.remove(cmds, i)
                                for a,c in pairs(CMDsF:GetChildren()) do
                                        if string.find(c.Text, "^"..cmd.."$") or string.find(c.Text, "^"..cmd.." ") or string.find(c.Text, " "..cmd.."$") or string.find(c.Text, " "..cmd.." ") then
                                                c.TextTransparency = 0.7
                                                c.MouseButton1Click:Connect(function()
                                                        notify(c.Text, "Command has been disabled by you or a plugin")
                                                end)
                                        end
                                end
                        end
                end
        end
end

function overridecmd(name, func)
        local cmd = findCmd(name)
        if cmd and cmd.FUNC then cmd.FUNC = func end
end

function addbind(cmd,key,iskeyup,toggle)
        if toggle then
                binds[#binds+1]=
                        {
                                COMMAND=cmd;
                                KEY=key;
                                ISKEYUP=iskeyup;
                                TOGGLE = toggle;
                        }
        else
                binds[#binds+1]=
                        {
                                COMMAND=cmd;
                                KEY=key;
                                ISKEYUP=iskeyup;
                        }
        end
end

function addcmdtext(text,name,desc)
        local newcmd = Example:Clone()
        local tooltipText = tostring(text)
        local tooltipDesc = tostring(desc)
        newcmd.Parent = CMDsF
        newcmd.Visible = false
        newcmd.Text = text
        newcmd.Name = 'PLUGIN_'..name
        table.insert(text1,newcmd)
        if desc and desc ~= '' then
                newcmd:SetAttribute("Title", tooltipText)
                newcmd:SetAttribute("Desc", tooltipDesc)
                newcmd.MouseButton1Down:Connect(function()
                        if newcmd.Visible and newcmd.TextTransparency == 0 then
                                Cmdbar:CaptureFocus()
                                autoComplete(newcmd.Text)
                                maximizeHolder()
                        end
                end)
        end
end

local WorldToScreen = function(Object)
        local ObjectVector = workspace.CurrentCamera:WorldToScreenPoint(Object.Position)
        return Vector2.new(ObjectVector.X, ObjectVector.Y)
end

local MousePositionToVector2 = function()
        return Vector2.new(IYMouse.X, IYMouse.Y)
end

local GetClosestPlayerFromCursor = function()
        local found = nil
        local ClosestDistance = math.huge
        for i, v in pairs(Players:GetPlayers()) do
                if v ~= Players.LocalPlayer and v.Character and v.Character:FindFirstChildOfClass("Humanoid") then
                        for k, x in pairs(v.Character:GetChildren()) do
                                if string.find(x.Name, "Torso") then
                                        local Distance = (WorldToScreen(x) - MousePositionToVector2()).Magnitude
                                        if Distance < ClosestDistance then
                                                ClosestDistance = Distance
                                                found = v
                                        end
                                end
                        end
                end
        end
        return found
end

SpecialPlayerCases = {
        ["all"] = function(speaker) return Players:GetPlayers() end,
        ["others"] = function(speaker)
                local plrs = {}
                for i,v in pairs(Players:GetPlayers()) do
                        if v ~= speaker then
                                table.insert(plrs,v)
                        end
                end
                return plrs
        end,
        ["me"] = function(speaker)return {speaker} end,
        ["#(%d+)"] = function(speaker,args,currentList)
                local returns = {}
                local randAmount = tonumber(args[1])
                local players = {unpack(currentList)}
                for i = 1,randAmount do
                        if #players == 0 then break end
                        local randIndex = math.random(1,#players)
                        table.insert(returns,players[randIndex])
                        table.remove(players,randIndex)
                end
                return returns
        end,
        ["random"] = function(speaker,args,currentList)
                local players = Players:GetPlayers()
                local localplayer = Players.LocalPlayer
                table.remove(players, table.find(players, localplayer))
                return {players[math.random(1,#players)]}
        end,
        ["%%(.+)"] = function(speaker,args)
                local returns = {}
                local team = args[1]
                for _,plr in pairs(Players:GetPlayers()) do
                        if plr.Team and string.sub(string.lower(plr.Team.Name),1,#team) == string.lower(team) then
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["allies"] = function(speaker)
                local returns = {}
                local team = speaker.Team
                for _,plr in pairs(Players:GetPlayers()) do
                        if plr.Team == team then
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["enemies"] = function(speaker)
                local returns = {}
                local team = speaker.Team
                for _,plr in pairs(Players:GetPlayers()) do
                        if plr.Team ~= team then
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["team"] = function(speaker)
                local returns = {}
                local team = speaker.Team
                for _,plr in pairs(Players:GetPlayers()) do
                        if plr.Team == team then
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["nonteam"] = function(speaker)
                local returns = {}
                local team = speaker.Team
                for _,plr in pairs(Players:GetPlayers()) do
                        if plr.Team ~= team then
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["friends"] = function(speaker,args)
                local returns = {}
                for _,plr in pairs(Players:GetPlayers()) do
                        if plr:IsFriendsWith(speaker.UserId) and plr ~= speaker then
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["nonfriends"] = function(speaker,args)
                local returns = {}
                for _,plr in pairs(Players:GetPlayers()) do
                        if not plr:IsFriendsWith(speaker.UserId) and plr ~= speaker then
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["guests"] = function(speaker,args)
                local returns = {}
                for _,plr in pairs(Players:GetPlayers()) do
                        if plr.Guest then
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["bacons"] = function(speaker,args)
                local returns = {}
                for _,plr in pairs(Players:GetPlayers()) do
                        if plr.Character:FindFirstChild('Pal Hair') or plr.Character:FindFirstChild('Kate Hair') then
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["age(%d+)"] = function(speaker,args)
                local returns = {}
                local age = tonumber(args[1])
                if not age == nil then return end
                for _,plr in pairs(Players:GetPlayers()) do
                        if plr.AccountAge <= age then
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["nearest"] = function(speaker,args,currentList)
                local speakerChar = speaker.Character
                if not speakerChar or not getRoot(speakerChar) then return end
                local lowest = math.huge
                local NearestPlayer = nil
                for _,plr in pairs(currentList) do
                        if plr ~= speaker and plr.Character then
                                local distance = plr:DistanceFromCharacter(getRoot(speakerChar).Position)
                                if distance < lowest then
                                        lowest = distance
                                        NearestPlayer = {plr}
                                end
                        end
                end
                return NearestPlayer
        end,
        ["farthest"] = function(speaker,args,currentList)
                local speakerChar = speaker.Character
                if not speakerChar or not getRoot(speakerChar) then return end
                local highest = 0
                local Farthest = nil
                for _,plr in pairs(currentList) do
                        if plr ~= speaker and plr.Character then
                                local distance = plr:DistanceFromCharacter(getRoot(speakerChar).Position)
                                if distance > highest then
                                        highest = distance
                                        Farthest = {plr}
                                end
                        end
                end
                return Farthest
        end,
        ["group(%d+)"] = function(speaker,args)
                local returns = {}
                local groupID = tonumber(args[1])
                for _,plr in pairs(Players:GetPlayers()) do
                        if plr:IsInGroup(groupID) then  
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["alive"] = function(speaker,args)
                local returns = {}
                for _,plr in pairs(Players:GetPlayers()) do
                        if plr.Character and plr.Character:FindFirstChildOfClass("Humanoid") and plr.Character:FindFirstChildOfClass("Humanoid").Health > 0 then
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["dead"] = function(speaker,args)
                local returns = {}
                for _,plr in pairs(Players:GetPlayers()) do
                        if (not plr.Character or not plr.Character:FindFirstChildOfClass("Humanoid")) or plr.Character:FindFirstChildOfClass("Humanoid").Health <= 0 then
                                table.insert(returns,plr)
                        end
                end
                return returns
        end,
        ["rad(%d+)"] = function(speaker,args)
                local returns = {}
                local radius = tonumber(args[1])
                local speakerChar = speaker.Character
                if not speakerChar or not getRoot(speakerChar) then return end
                for _,plr in pairs(Players:GetPlayers()) do
                        if plr.Character and getRoot(plr.Character) then
                                local magnitude = (getRoot(plr.Character).Position-getRoot(speakerChar).Position).magnitude
                                if magnitude <= radius then table.insert(returns,plr) end
                        end
                end
                return returns
        end,
        ["cursor"] = function(speaker)
                local plrs = {}
                local v = GetClosestPlayerFromCursor()
                if v ~= nil then table.insert(plrs, v) end
                return plrs
        end,
        ["npcs"] = function(speaker,args)
                local returns = {}
                for _, v in pairs(workspace:GetDescendants()) do
                        if v:IsA("Model") and getRoot(v) and v:FindFirstChildWhichIsA("Humanoid") and Players:GetPlayerFromCharacter(v) == nil then
                                local clone = Instance.new("Player")
                                clone.Name = v.Name .. " - " .. v:FindFirstChildWhichIsA("Humanoid").DisplayName
                                clone.Character = v
                                table.insert(returns, clone)
                        end
                end
                return returns
        end,
}

function toTokens(str)
        local tokens = {}
        for op,name in string.gmatch(str,"([+-])([^+-]+)") do
                table.insert(tokens,{Operator = op,Name = name})
        end
        return tokens
end

function onlyIncludeInTable(tab,matches)
        local matchTable = {}
        local resultTable = {}
        for i,v in pairs(matches) do matchTable[v.Name] = true end
        for i,v in pairs(tab) do if matchTable[v.Name] then table.insert(resultTable,v) end end
        return resultTable
end

function removeTableMatches(tab,matches)
        local matchTable = {}
        local resultTable = {}
        for i,v in pairs(matches) do matchTable[v.Name] = true end
        for i,v in pairs(tab) do if not matchTable[v.Name] then table.insert(resultTable,v) end end
        return resultTable
end

function getPlayersByName(Name)
        local Name,Len,Found = string.lower(Name),#Name,{}
        for _,v in pairs(Players:GetPlayers()) do
                if Name:sub(0,1) == '@' then
                        if string.sub(string.lower(v.Name),1,Len-1) == Name:sub(2) then
                                table.insert(Found,v)
                        end
                else
                        if string.sub(string.lower(v.Name),1,Len) == Name or string.sub(string.lower(v.DisplayName),1,Len) == Name then
                                table.insert(Found,v)
                        end
                end
        end
        return Found
end

function getPlayer(list,speaker)
        if list == nil then return {speaker.Name} end
        local nameList = splitString(list,",")

        local foundList = {}

        for _,name in pairs(nameList) do
                if string.sub(name,1,1) ~= "+" and string.sub(name,1,1) ~= "-" then name = "+"..name end
                local tokens = toTokens(name)
                local initialPlayers = Players:GetPlayers()

                for i,v in pairs(tokens) do
                        if v.Operator == "+" then
                                local tokenContent = v.Name
                                local foundCase = false
                                for regex,case in pairs(SpecialPlayerCases) do
                                        local matches = {string.match(tokenContent,"^"..regex.."$")}
                                        if #matches > 0 then
                                                foundCase = true
                                                initialPlayers = onlyIncludeInTable(initialPlayers,case(speaker,matches,initialPlayers))
                                        end
                                end
                                if not foundCase then
                                        initialPlayers = onlyIncludeInTable(initialPlayers,getPlayersByName(tokenContent))
                                end
                        else
                                local tokenContent = v.Name
                                local foundCase = false
                                for regex,case in pairs(SpecialPlayerCases) do
                                        local matches = {string.match(tokenContent,"^"..regex.."$")}
                                        if #matches > 0 then
                                                foundCase = true
                                                initialPlayers = removeTableMatches(initialPlayers,case(speaker,matches,initialPlayers))
                                        end
                                end
                                if not foundCase then
                                        initialPlayers = removeTableMatches(initialPlayers,getPlayersByName(tokenContent))
                                end
                        end
                end

                for i,v in pairs(initialPlayers) do table.insert(foundList,v) end
        end

        local foundNames = {}
        for i,v in pairs(foundList) do table.insert(foundNames,v.Name) end

        return foundNames
end

function formatUsername(player)
        if player.DisplayName ~= player.Name then
                return string.format("%s (%s)", player.Name, player.DisplayName)
        end
        return player.Name
end

getprfx=function(strn)
        if strn:sub(1,string.len(prefix))==prefix then return{'cmd',string.len(prefix)+1}
        end return
end

function do_exec(str, plr)
        str = str:gsub('/e ', '')
        local t = getprfx(str)
        if not t then return end
        str = str:sub(t[2])
        if t[1]=='cmd' then
                execCmd(str, plr, true)
                IndexContents('',true,false,true)
                CMDsF.CanvasPosition = canvasPos
        end
end

lastTextBoxString,lastTextBoxCon,lastEnteredString = nil,nil,nil

UserInputService.TextBoxFocused:Connect(function(obj)
        if lastTextBoxCon then lastTextBoxCon:Disconnect() end
        if obj == Cmdbar then lastTextBoxString = nil return end
        lastTextBoxString = obj.Text
        lastTextBoxCon = obj:GetPropertyChangedSignal("Text"):Connect(function()
                if not (UserInputService:IsKeyDown(Enum.KeyCode.Return) or UserInputService:IsKeyDown(Enum.KeyCode.KeypadEnter)) then
                        lastTextBoxString = obj.Text
                end
        end)
end)

UserInputService.InputBegan:Connect(function(input,gameProcessed)
        if gameProcessed then
                if Cmdbar and Cmdbar:IsFocused() then
                        if input.KeyCode == Enum.KeyCode.Up then
                                historyCount = historyCount + 1
                                if historyCount > #cmdHistory then historyCount = #cmdHistory end
                                Cmdbar.Text = cmdHistory[historyCount] or ""
                                Cmdbar.CursorPosition = 1020
                        elseif input.KeyCode == Enum.KeyCode.Down then
                                historyCount = historyCount - 1
                                if historyCount < 0 then historyCount = 0 end
                                Cmdbar.Text = cmdHistory[historyCount] or ""
                                Cmdbar.CursorPosition = 1020
                        end
                elseif input.KeyCode == Enum.KeyCode.Return or input.KeyCode == Enum.KeyCode.KeypadEnter then
                        lastEnteredString = lastTextBoxString
                end
        end
end)

Players.LocalPlayer.Chatted:Connect(function()
        wait()
        if lastEnteredString then
                local message = lastEnteredString
                lastEnteredString = nil
                do_exec(message, Players.LocalPlayer)
        end
end)

Cmdbar.PlaceholderText = "Command Bar ("..prefix..")"
Cmdbar:GetPropertyChangedSignal("Text"):Connect(function()
        if Cmdbar:IsFocused() then
                IndexContents(Cmdbar.Text,true,true)
        end
end)

local tabComplete = nil
tabAllowed = true
Cmdbar.FocusLost:Connect(function(enterpressed)
        if enterpressed then
                local cmdbarText = Cmdbar.Text:gsub("^"..prefix,"")
                execCmd(cmdbarText,Players.LocalPlayer,true)
        end
        if tabComplete then tabComplete:Disconnect() end
        wait()
        if not Cmdbar:IsFocused() then
                Cmdbar.Text = ""
                IndexContents('',true,false,true)
                if SettingsOpen == true then
                        wait(0.2)
                        Settings:TweenPosition(UDim2.new(0, 0, 0, 45), "InOut", "Quart", 0.2, true, nil)
                        CMDsF.Visible = false
                end
        end
        CMDsF.CanvasPosition = canvasPos
end)

Cmdbar.Focused:Connect(function()
        historyCount = 0
        canvasPos = CMDsF.CanvasPosition
        if SettingsOpen == true then
                wait(0.2)
                CMDsF.Visible = true
                Settings:TweenPosition(UDim2.new(0, 0, 0, 220), "InOut", "Quart", 0.2, true, nil)
        end
        tabComplete = UserInputService.InputBegan:Connect(function(input,gameProcessed)
                if Cmdbar:IsFocused() then
                        if tabAllowed == true and input.KeyCode == Enum.KeyCode.Tab and topCommand ~= nil then
                                autoComplete(topCommand)
                        end
                else
                        tabComplete:Disconnect()
                end
        end)
end)

ESPenabled = false
CHMSenabled = false

function round(num, numDecimalPlaces)
        local mult = 10^(numDecimalPlaces or 0)
        return math.floor(num * mult + 0.5) / mult
end

function ESP(plr, logic)
        task.spawn(function()
                for i,v in pairs(COREGUI:GetChildren()) do
                        if v.Name == plr.Name..'_ESP' then
                                v:Destroy()
                        end
                end
                wait()
                if plr.Character and plr.Name ~= Players.LocalPlayer.Name and not COREGUI:FindFirstChild(plr.Name..'_ESP') then
                        local ESPholder = Instance.new("Folder")
                        ESPholder.Name = plr.Name..'_ESP'
                        ESPholder.Parent = COREGUI
                        repeat wait(1) until plr.Character and getRoot(plr.Character) and plr.Character:FindFirstChildOfClass("Humanoid")
                        for b,n in pairs (plr.Character:GetChildren()) do
                                if (n:IsA("BasePart")) then
                                        local a = Instance.new("BoxHandleAdornment")
                                        a.Name = plr.Name
                                        a.Parent = ESPholder
                                        a.Adornee = n
                                        a.AlwaysOnTop = true
                                        a.ZIndex = 10
                                        a.Size = n.Size
                                        a.Transparency = espTransparency
                                        if logic == true then
                                                a.Color = BrickColor.new(plr.TeamColor == Players.LocalPlayer.TeamColor and "Bright green" or "Bright red")
                                        else
                                                a.Color = plr.TeamColor
                                        end
                                end
                        end
                        if plr.Character and plr.Character:FindFirstChild('Head') then
                                local BillboardGui = Instance.new("BillboardGui")
                                local TextLabel = Instance.new("TextLabel")
                                BillboardGui.Adornee = plr.Character.Head
                                BillboardGui.Name = plr.Name
                                BillboardGui.Parent = ESPholder
                                BillboardGui.Size = UDim2.new(0, 100, 0, 150)
                                BillboardGui.StudsOffset = Vector3.new(0, 1, 0)
                                BillboardGui.AlwaysOnTop = true
                                TextLabel.Parent = BillboardGui
                                TextLabel.BackgroundTransparency = 1
                                TextLabel.Position = UDim2.new(0, 0, 0, -50)
                                TextLabel.Size = UDim2.new(0, 100, 0, 100)
                                TextLabel.Font = Enum.Font.SourceSansSemibold
                                TextLabel.TextSize = 20
                                TextLabel.TextColor3 = Color3.new(1, 1, 1)
                                TextLabel.TextStrokeTransparency = 0
                                TextLabel.TextYAlignment = Enum.TextYAlignment.Bottom
                                TextLabel.Text = 'Name: '..plr.Name
                                TextLabel.ZIndex = 10
                                local espLoopFunc
                                local teamChange
                                local addedFunc
                                addedFunc = plr.CharacterAdded:Connect(function()
                                        if ESPenabled then
                                                espLoopFunc:Disconnect()
                                                teamChange:Disconnect()
                                                ESPholder:Destroy()
                                                repeat wait(1) until getRoot(plr.Character) and plr.Character:FindFirstChildOfClass("Humanoid")
                                                ESP(plr, logic)
                                                addedFunc:Disconnect()
                                        else
                                                teamChange:Disconnect()
                                                addedFunc:Disconnect()
                                        end
                                end)
                                teamChange = plr:GetPropertyChangedSignal("TeamColor"):Connect(function()
                                        if ESPenabled then
                                                espLoopFunc:Disconnect()
                                                addedFunc:Disconnect()
                                                ESPholder:Destroy()
                                                repeat wait(1) until getRoot(plr.Character) and plr.Character:FindFirstChildOfClass("Humanoid")
                                                ESP(plr, logic)
                                                teamChange:Disconnect()
                                        else
                                                teamChange:Disconnect()
                                        end
                                end)
                                local function espLoop()
                                        if COREGUI:FindFirstChild(plr.Name..'_ESP') then
                                                if plr.Character and getRoot(plr.Character) and plr.Character:FindFirstChildOfClass("Humanoid") and Players.LocalPlayer.Character and getRoot(Players.LocalPlayer.Character) and Players.LocalPlayer.Character:FindFirstChildOfClass("Humanoid") then
                                                        local pos = math.floor((getRoot(Players.LocalPlayer.Character).Position - getRoot(plr.Character).Position).magnitude)
                                                        TextLabel.Text = 'Name: '..plr.Name..' | Health: '..round(plr.Character:FindFirstChildOfClass('Humanoid').Health, 1)..' | Studs: '..pos
                                                end
                                        else
                                                teamChange:Disconnect()
                                                addedFunc:Disconnect()
                                                espLoopFunc:Disconnect()
                                        end
                                end
                                espLoopFunc = RunService.RenderStepped:Connect(espLoop)
                        end
                end
        end)
end

function CHMS(plr)
        task.spawn(function()
                for i,v in pairs(COREGUI:GetChildren()) do
                        if v.Name == plr.Name..'_CHMS' then
                                v:Destroy()
                        end
                end
                wait()
                if plr.Character and plr.Name ~= Players.LocalPlayer.Name and not COREGUI:FindFirstChild(plr.Name..'_CHMS') then
                        local ESPholder = Instance.new("Folder")
                        ESPholder.Name = plr.Name..'_CHMS'
                        ESPholder.Parent = COREGUI
                        repeat wait(1) until plr.Character and getRoot(plr.Character) and plr.Character:FindFirstChildOfClass("Humanoid")
                        for b,n in pairs (plr.Character:GetChildren()) do
                                if (n:IsA("BasePart")) then
                                        local a = Instance.new("BoxHandleAdornment")
                                        a.Name = plr.Name
                                        a.Parent = ESPholder
                                        a.Adornee = n
                                        a.AlwaysOnTop = true
                                        a.ZIndex = 10
                                        a.Size = n.Size
                                        a.Transparency = espTransparency
                                        a.Color = plr.TeamColor
                                end
                        end
                        local addedFunc
                        local teamChange
                        local CHMSremoved
                        addedFunc = plr.CharacterAdded:Connect(function()
                                if CHMSenabled then
                                        ESPholder:Destroy()
                                        teamChange:Disconnect()
                                        repeat wait(1) until getRoot(plr.Character) and plr.Character:FindFirstChildOfClass("Humanoid")
                                        CHMS(plr)
                                        addedFunc:Disconnect()
                                else
                                        teamChange:Disconnect()
                                        addedFunc:Disconnect()
                                end
                        end)
                        teamChange = plr:GetPropertyChangedSignal("TeamColor"):Connect(function()
                                if CHMSenabled then
                                        ESPholder:Destroy()
                                        addedFunc:Disconnect()
                                        repeat wait(1) until getRoot(plr.Character) and plr.Character:FindFirstChildOfClass("Humanoid")
                                        CHMS(plr)
                                        teamChange:Disconnect()
                                else
                                        teamChange:Disconnect()
                                end
                        end)
                        CHMSremoved = ESPholder.AncestryChanged:Connect(function()
                                teamChange:Disconnect()
                                addedFunc:Disconnect()
                                CHMSremoved:Disconnect()
                        end)
                end
        end)
end

function Locate(plr)
        task.spawn(function()
                for i,v in pairs(COREGUI:GetChildren()) do
                        if v.Name == plr.Name..'_LC' then
                                v:Destroy()
                        end
                end
                wait()
                if plr.Character and plr.Name ~= Players.LocalPlayer.Name and not COREGUI:FindFirstChild(plr.Name..'_LC') then
                        local ESPholder = Instance.new("Folder")
                        ESPholder.Name = plr.Name..'_LC'
                        ESPholder.Parent = COREGUI
                        repeat wait(1) until plr.Character and getRoot(plr.Character) and plr.Character:FindFirstChildOfClass("Humanoid")
                        for b,n in pairs (plr.Character:GetChildren()) do
                                if (n:IsA("BasePart")) then
                                        local a = Instance.new("BoxHandleAdornment")
                                        a.Name = plr.Name
                                        a.Parent = ESPholder
                                        a.Adornee = n
                                        a.AlwaysOnTop = true
                                        a.ZIndex = 10
                                        a.Size = n.Size
                                        a.Transparency = espTransparency
                                        a.Color = plr.TeamColor
                                end
                        end
                        if plr.Character and plr.Character:FindFirstChild('Head') then
                                local BillboardGui = Instance.new("BillboardGui")
                                local TextLabel = Instance.new("TextLabel")
                                BillboardGui.Adornee = plr.Character.Head
                                BillboardGui.Name = plr.Name
                                BillboardGui.Parent = ESPholder
                                BillboardGui.Size = UDim2.new(0, 100, 0, 150)
                                BillboardGui.StudsOffset = Vector3.new(0, 1, 0)
                                BillboardGui.AlwaysOnTop = true
                                TextLabel.Parent = BillboardGui
                                TextLabel.BackgroundTransparency = 1
                                TextLabel.Position = UDim2.new(0, 0, 0, -50)
                                TextLabel.Size = UDim2.new(0, 100, 0, 100)
                                TextLabel.Font = Enum.Font.SourceSansSemibold
                                TextLabel.TextSize = 20
                                TextLabel.TextColor3 = Color3.new(1, 1, 1)
                                TextLabel.TextStrokeTransparency = 0
                                TextLabel.TextYAlignment = Enum.TextYAlignment.Bottom
                                TextLabel.Text = 'Name: '..plr.Name
                                TextLabel.ZIndex = 10
                                local lcLoopFunc
                                local addedFunc
                                local teamChange
                                addedFunc = plr.CharacterAdded:Connect(function()
                                        if ESPholder ~= nil and ESPholder.Parent ~= nil then
                                                lcLoopFunc:Disconnect()
                                                teamChange:Disconnect()
                                                ESPholder:Destroy()
                                                repeat wait(1) until getRoot(plr.Character) and plr.Character:FindFirstChildOfClass("Humanoid")
                                                Locate(plr)
                                                addedFunc:Disconnect()
                                        else
                                                teamChange:Disconnect()
                                                addedFunc:Disconnect()
                                        end
                                end)
                                teamChange = plr:GetPropertyChangedSignal("TeamColor"):Connect(function()
                                        if ESPholder ~= nil and ESPholder.Parent ~= nil then
                                                lcLoopFunc:Disconnect()
                                                addedFunc:Disconnect()
                                                ESPholder:Destroy()
                                                repeat wait(1) until getRoot(plr.Character) and plr.Character:FindFirstChildOfClass("Humanoid")
                                                Locate(plr)
                                                teamChange:Disconnect()
                                        else
                                                teamChange:Disconnect()
                                        end
                                end)
                                local function lcLoop()
                                        if COREGUI:FindFirstChild(plr.Name..'_LC') then
                                                if plr.Character and getRoot(plr.Character) and plr.Character:FindFirstChildOfClass("Humanoid") and Players.LocalPlayer.Character and getRoot(Players.LocalPlayer.Character) and Players.LocalPlayer.Character:FindFirstChildOfClass("Humanoid") then
                                                        local pos = math.floor((getRoot(Players.LocalPlayer.Character).Position - getRoot(plr.Character).Position).magnitude)
                                                        TextLabel.Text = 'Name: '..plr.Name..' | Health: '..round(plr.Character:FindFirstChildOfClass('Humanoid').Health, 1)..' | Studs: '..pos
                                                end
                                        else
                                                teamChange:Disconnect()
                                                addedFunc:Disconnect()
                                                lcLoopFunc:Disconnect()
                                        end
                                end
                                lcLoopFunc = RunService.RenderStepped:Connect(lcLoop)
                        end
                end
        end)
end

local bindsGUI = KeybindEditor
local awaitingInput = false
local keySelected = false

function refreshbinds()
        if Holder_2 then
                Holder_2:ClearAllChildren()
                Holder_2.CanvasSize = UDim2.new(0, 0, 0, 10)
                for i = 1, #binds do
                        local YSize = 25
                        local Position = ((i * YSize) - YSize)
                        local newbind = Example_2:Clone()
                        newbind.Parent = Holder_2
                        newbind.Visible = true
                        newbind.Position = UDim2.new(0,0,0, Position + 5)
                        table.insert(shade2,newbind)
                        table.insert(shade2,newbind.Text)
                        table.insert(text1,newbind.Text)
                        table.insert(shade3,newbind.Text.Delete)
                        table.insert(text2,newbind.Text.Delete)
                        local input = tostring(binds[i].KEY)
                        local key
                        if input == 'RightClick' or input == 'LeftClick' then
                                key = input
                        else
                                key = input:sub(14)
                        end
                        if binds[i].TOGGLE then
                                newbind.Text.Text = key.." > "..binds[i].COMMAND.." / "..binds[i].TOGGLE
                        else
                                newbind.Text.Text = key.." > "..binds[i].COMMAND.."  "..(binds[i].ISKEYUP and "(keyup)" or "(keydown)")
                        end
                        Holder_2.CanvasSize = UDim2.new(0,0,0, Position + 30)
                        newbind.Text.Delete.MouseButton1Click:Connect(function()
                                unkeybind(binds[i].COMMAND,binds[i].KEY)
                        end)
                end
        end
end

refreshbinds()

toggleOn = {}

function unkeybind(cmd,key)
        for i = #binds,1,-1 do
                if binds[i].COMMAND == cmd and binds[i].KEY == key then
                        toggleOn[binds[i]] = nil
                        table.remove(binds, i)
                end
        end
        refreshbinds()
        updatesaves()
        if key == 'RightClick' or key == 'LeftClick' then
                notify('Keybinds Updated','Unbinded '..key..' from '..cmd)
        else
                notify('Keybinds Updated','Unbinded '..key:sub(14)..' from '..cmd)
        end
end

PositionsFrame.Delete.MouseButton1Click:Connect(function()
        execCmd('cpos')
end)

function refreshwaypoints()
        if #WayPoints > 0 or #pWayPoints > 0 then
                PositionsHint:Destroy()
        end
        if Holder_4 then
                Holder_4:ClearAllChildren()
                Holder_4.CanvasSize = UDim2.new(0, 0, 0, 10)
                local YSize = 25
                local num = 1
                for i = 1, #WayPoints do
                        local Position = ((num * YSize) - YSize)
                        local newpoint = Example_4:Clone()
                        newpoint.Parent = Holder_4
                        newpoint.Visible = true
                        newpoint.Position = UDim2.new(0,0,0, Position + 5)
                        newpoint.Text.Text = WayPoints[i].NAME
                        table.insert(shade2,newpoint)
                        table.insert(shade2,newpoint.Text)
                        table.insert(text1,newpoint.Text)
                        table.insert(shade3,newpoint.Text.Delete)
                        table.insert(text2,newpoint.Text.Delete)
                        table.insert(shade3,newpoint.Text.TP)
                        table.insert(text2,newpoint.Text.TP)
                        Holder_4.CanvasSize = UDim2.new(0,0,0, Position + 30)
                        newpoint.Text.Delete.MouseButton1Click:Connect(function()
                                execCmd('dpos '..WayPoints[i].NAME)
                        end)
                        newpoint.Text.TP.MouseButton1Click:Connect(function()
                                execCmd("loadpos "..WayPoints[i].NAME)
                        end)
                        num = num+1
                end
                for i = 1, #pWayPoints do
                        local Position = ((num * YSize) - YSize)
                        local newpoint = Example_4:Clone()
                        newpoint.Parent = Holder_4
                        newpoint.Visible = true
                        newpoint.Position = UDim2.new(0,0,0, Position + 5)
                        newpoint.Text.Text = pWayPoints[i].NAME
                        table.insert(shade2,newpoint)
                        table.insert(shade2,newpoint.Text)
                        table.insert(text1,newpoint.Text)
                        table.insert(shade3,newpoint.Text.Delete)
                        table.insert(text2,newpoint.Text.Delete)
                        table.insert(shade3,newpoint.Text.TP)
                        table.insert(text2,newpoint.Text.TP)
                        Holder_4.CanvasSize = UDim2.new(0,0,0, Position + 30)
                        newpoint.Text.Delete.MouseButton1Click:Connect(function()
                                execCmd('dpos '..pWayPoints[i].NAME)
                        end)
                        newpoint.Text.TP.MouseButton1Click:Connect(function()
                                execCmd("loadpos "..pWayPoints[i].NAME)
                        end)
                        num = num+1
                end
        end
end

refreshwaypoints()

function refreshaliases()
        if #aliases > 0 then
                AliasHint:Destroy()
        end
        if Holder_3 then
                Holder_3:ClearAllChildren()
                Holder_3.CanvasSize = UDim2.new(0, 0, 0, 10)
                for i = 1, #aliases do
                        local YSize = 25
                        local Position = ((i * YSize) - YSize)
                        local newalias = Example_3:Clone()
                        newalias.Parent = Holder_3
                        newalias.Visible = true
                        newalias.Position = UDim2.new(0,0,0, Position + 5)
                        newalias.Text.Text = aliases[i].CMD.." > "..aliases[i].ALIAS
                        table.insert(shade2,newalias)
                        table.insert(shade2,newalias.Text)
                        table.insert(text1,newalias.Text)
                        table.insert(shade3,newalias.Text.Delete)
                        table.insert(text2,newalias.Text.Delete)
                        Holder_3.CanvasSize = UDim2.new(0,0,0, Position + 30)
                        newalias.Text.Delete.MouseButton1Click:Connect(function()
                                execCmd('removealias '..aliases[i].ALIAS)
                        end)
                end
        end
end

local bindChosenKeyUp = false

BindTo.MouseButton1Click:Connect(function()
        awaitingInput = true
        BindTo.Text = 'Press something'
end)

BindTriggerSelect.MouseButton1Click:Connect(function()
        bindChosenKeyUp = not bindChosenKeyUp
        BindTriggerSelect.Text = bindChosenKeyUp and "KeyUp" or "KeyDown"
end)

newToggle = false
Cmdbar_3.Parent.Visible = false
On_2.MouseButton1Click:Connect(function()
        if newToggle == false then newToggle = true
                On_2.BackgroundTransparency = 0
                Cmdbar_3.Parent.Visible = true
                BindTriggerSelect.Visible = false
        else newToggle = false
                On_2.BackgroundTransparency = 1
                Cmdbar_3.Parent.Visible = false
                BindTriggerSelect.Visible = true
        end
end)

Add_2.MouseButton1Click:Connect(function()
        if keySelected then
                if string.find(Cmdbar_2.Text, "\\\\") or string.find(Cmdbar_3.Text, "\\\\") then
                        notify('Keybind Error','Only use one backslash to keybind multiple commands into one keybind or command')
                else
                        if newToggle and Cmdbar_3.Text ~= '' and Cmdbar_2.text ~= '' then
                                addbind(Cmdbar_2.Text,keyPressed,false,Cmdbar_3.Text)
                        elseif not newToggle and Cmdbar_2.text ~= '' then
                                addbind(Cmdbar_2.Text,keyPressed,bindChosenKeyUp)
                        else
                                return
                        end
                        refreshbinds()
                        updatesaves()
                        if keyPressed == 'RightClick' or keyPressed == 'LeftClick' then
                                notify('Keybinds Updated','Binded '..keyPressed..' to '..Cmdbar_2.Text..(newToggle and " / "..Cmdbar_3.Text or ""))
                        else
                                notify('Keybinds Updated','Binded '..keyPressed:sub(14)..' to '..Cmdbar_2.Text..(newToggle and " / "..Cmdbar_3.Text or ""))
                        end
                end
        end
end)

Exit_2.MouseButton1Click:Connect(function()
        Cmdbar_2.Text = 'Command'
        Cmdbar_3.Text = 'Command 2'
        BindTo.Text = 'Click to bind'
        bindChosenKeyUp = false
        BindTriggerSelect.Text = "KeyDown"
        keySelected = false
        KeybindEditor:TweenPosition(UDim2.new(0.5, -180, 0, -500), "InOut", "Quart", 0.5, true, nil)
end)

function onInputBegan(input,gameProcessed)
        if awaitingInput then
                if input.UserInputType == Enum.UserInputType.Keyboard then
                        keyPressed = tostring(input.KeyCode)
                        BindTo.Text = keyPressed:sub(14)
                elseif input.UserInputType == Enum.UserInputType.MouseButton1 then
                        keyPressed = 'LeftClick'
                        BindTo.Text = 'LeftClick'
                elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
                        keyPressed = 'RightClick'
                        BindTo.Text = 'RightClick'
                end
                awaitingInput = false
                keySelected = true
        end
        if not gameProcessed and #binds > 0 then
                for i,v in pairs(binds) do
                        if not v.ISKEYUP then
                                if (input.UserInputType == Enum.UserInputType.Keyboard and v.KEY:lower()==tostring(input.KeyCode):lower()) or (input.UserInputType == Enum.UserInputType.MouseButton1 and v.KEY:lower()=='leftclick') or (input.UserInputType == Enum.UserInputType.MouseButton2 and v.KEY:lower()=='rightclick') then
                                        if v.TOGGLE then
                                                local isOn = toggleOn[v] == true
                                                toggleOn[v] = not isOn
                                                if isOn then
                                                        execCmd(v.TOGGLE,Players.LocalPlayer)
                                                else
                                                        execCmd(v.COMMAND,Players.LocalPlayer)
                                                end
                                        else
                                                execCmd(v.COMMAND,Players.LocalPlayer)
                                        end
                                end
                        end
                end
        end
end

function onInputEnded(input,gameProcessed)
        if not gameProcessed and #binds > 0 then
                for i,v in pairs(binds) do
                        if v.ISKEYUP then
                                if (input.UserInputType == Enum.UserInputType.Keyboard and v.KEY:lower()==tostring(input.KeyCode):lower()) or (input.UserInputType == Enum.UserInputType.MouseButton1 and v.KEY:lower()=='leftclick') or (input.UserInputType == Enum.UserInputType.MouseButton2 and v.KEY:lower()=='rightclick') then
                                        execCmd(v.COMMAND,Players.LocalPlayer)
                                end
                        end
                end
        end
end

UserInputService.InputBegan:Connect(onInputBegan)
UserInputService.InputEnded:Connect(onInputEnded)

ClickTP.Select.MouseButton1Click:Connect(function()
        if keySelected then
                addbind('clicktp',keyPressed,bindChosenKeyUp)
                refreshbinds()
                updatesaves()
                if keyPressed == 'RightClick' or keyPressed == 'LeftClick' then
                        notify('Keybinds Updated','Binded '..keyPressed..' to click tp')
                else
                        notify('Keybinds Updated','Binded '..keyPressed:sub(14)..' to click tp')
                end
        end
end)

ClickDelete.Select.MouseButton1Click:Connect(function()
        if keySelected then
                addbind('clickdel',keyPressed,bindChosenKeyUp)
                refreshbinds()
                updatesaves()
                if keyPressed == 'RightClick' or keyPressed == 'LeftClick' then
                        notify('Keybinds Updated','Binded '..keyPressed..' to click delete')
                else
                        notify('Keybinds Updated','Binded '..keyPressed:sub(14)..' to click delete')
                end
        end
end)

local function clicktpFunc()
        pcall(function()
                local character = Players.LocalPlayer.Character
                local humanoid = character:FindFirstChildOfClass("Humanoid")
                if humanoid and humanoid.SeatPart then
                        humanoid.Sit = false
                        wait(0.1)
                end

                local hipHeight = humanoid and humanoid.HipHeight > 0 and (humanoid.HipHeight + 1)
                local rootPart = getRoot(character)
                local rootPartPosition = rootPart.Position
                local hitPosition = IYMouse.Hit.Position
                local newCFrame = CFrame.new(
                        hitPosition, 
                        Vector3.new(rootPartPosition.X, hitPosition.Y, rootPartPosition.Z)
                ) * CFrame.Angles(0, math.pi, 0)

                rootPart.CFrame = newCFrame + Vector3.new(0, hipHeight or 4, 0)
                breakVelocity()
        end)
end

IYMouse.Button1Down:Connect(function()
        for i,v in pairs(binds) do
                if v.COMMAND == 'clicktp' then
                        local input = v.KEY
                        if input == 'RightClick' and UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton2) and Players.LocalPlayer.Character then
                                clicktpFunc()
                        elseif input == 'LeftClick' and UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) and Players.LocalPlayer.Character then
                                clicktpFunc()
                        elseif UserInputService:IsKeyDown(Enum.KeyCode[input:sub(14)]) and Players.LocalPlayer.Character then
                                clicktpFunc()
                        end
                elseif v.COMMAND == 'clickdel' then
                        local input = v.KEY
                        if input == 'RightClick' and UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton2) then
                                pcall(function() IYMouse.Target:Destroy() end)
                        elseif input == 'LeftClick' and UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) then
                                pcall(function() IYMouse.Target:Destroy() end)
                        elseif UserInputService:IsKeyDown(Enum.KeyCode[input:sub(14)]) then
                                pcall(function() IYMouse.Target:Destroy() end)
                        end
                end
        end
end)

PluginsGUI = PluginEditor.background

function addPlugin(name)
        if name:lower() == 'plugin file name' or name:lower() == 'iy_fe.iy' or name == 'iy_fe' then
                notify('Plugin Error','Please enter a valid plugin')
        else
                local file
                local fileName
                if name:sub(-3) == '.iy' then
                        pcall(function() file = readfile(name) end)
                        fileName = name
                else
                        pcall(function() file = readfile(name..'.iy') end)
                        fileName = name..'.iy'
                end
                if file then
                        if not FindInTable(PluginsTable, fileName) then
                                table.insert(PluginsTable, fileName)
                                LoadPlugin(fileName)
                                refreshplugins()
                                pcall(eventEditor.Refresh)
                        else
                                notify('Plugin Error','This plugin is already added')
                        end
                else
                        notify('Plugin Error','Cannot locate file "'..fileName..'". Is the file in the correct folder?')
                end
        end
end

function deletePlugin(name)
        local pName = name..'.iy'
        if name:sub(-3) == '.iy' then
                pName = name
        end
        for i = #cmds,1,-1 do
                if cmds[i].PLUGIN == pName then
                        table.remove(cmds, i)
                end
        end
        for i,v in pairs(CMDsF:GetChildren()) do
                if v.Name == 'PLUGIN_'..pName then
                        v:Destroy()
                end
        end
        for i,v in pairs(PluginsTable) do
                if v == pName then
                        table.remove(PluginsTable, i)
                        notify('Removed Plugin',pName..' was removed')
                end
        end
        IndexContents('',true)
        refreshplugins()
end

function refreshplugins(dontSave)
        if #PluginsTable > 0 then
                PluginsHint:Destroy()
        end
        if Holder_5 then
                Holder_5:ClearAllChildren()
                Holder_5.CanvasSize = UDim2.new(0, 0, 0, 10)
                for i,v in pairs(PluginsTable) do
                        local pName = v
                        local YSize = 25
                        local Position = ((i * YSize) - YSize)
                        local newplugin = Example_5:Clone()
                        newplugin.Parent = Holder_5
                        newplugin.Visible = true
                        newplugin.Position = UDim2.new(0,0,0, Position + 5)
                        newplugin.Text.Text = pName
                        table.insert(shade2,newplugin)
                        table.insert(shade2,newplugin.Text)
                        table.insert(text1,newplugin.Text)
                        table.insert(shade3,newplugin.Text.Delete)
                        table.insert(text2,newplugin.Text.Delete)
                        Holder_5.CanvasSize = UDim2.new(0,0,0, Position + 30)
                        newplugin.Text.Delete.MouseButton1Click:Connect(function()
                                deletePlugin(pName)
                        end)
                end
                if not dontSave then
                        updatesaves()
                end
        end
end

local PluginCache
function LoadPlugin(val,startup)
        local plugin

        function CatchedPluginLoad()
                plugin = loadfile(val)()
        end

        function handlePluginError(plerror)
                notify('Plugin Error','An error occurred with the plugin, "'..val..'" and it could not be loaded')
                if FindInTable(PluginsTable,val) then
                        for i,v in pairs(PluginsTable) do
                                if v == val then
                                        table.remove(PluginsTable,i)
                                end
                        end
                end
                updatesaves()

                print("Original Error: "..tostring(plerror))
                print("Plugin Error, stack traceback: "..tostring(debug.traceback()))

                plugin = nil

                return false
        end

        xpcall(CatchedPluginLoad, handlePluginError)

        if plugin ~= nil then
                if not startup then
                        notify('Loaded Plugin',"Name: "..plugin["PluginName"].."\n".."Description: "..plugin["PluginDescription"])
                end
                addcmdtext('',val)
                addcmdtext(string.upper('--'..plugin["PluginName"]),val,plugin["PluginDescription"])
                if plugin["Commands"] then
                        for i,v in pairs(plugin["Commands"]) do 
                                local cmdExt = ''
                                local cmdName = i
                                local function handleNames()
                                        cmdName = i
                                        if findCmd(cmdName..cmdExt) then
                                                if isNumber(cmdExt) then
                                                        cmdExt = cmdExt+1
                                                else
                                                        cmdExt = 1
                                                end
                                                handleNames()
                                        else
                                                cmdName = cmdName..cmdExt
                                        end
                                end
                                handleNames()
                                addcmd(cmdName, v["Aliases"], v["Function"], val)
                                if v["ListName"] then
                                        local newName = v.ListName
                                        local cmdNames = {i,unpack(v.Aliases)}
                                        for i,v in pairs(cmdNames) do
                                                newName = newName:gsub(v,v..cmdExt)
                                        end
                                        addcmdtext(newName,val,v["Description"])
                                else
                                        addcmdtext(cmdName,val,v["Description"])
                                end
                        end
                end
                IndexContents('',true)
        elseif plugin == nil then
                plugin = nil
        end
end

function FindPlugins()
        if PluginsTable ~= nil and type(PluginsTable) == "table" then
                for i,v in pairs(PluginsTable) do
                        LoadPlugin(v,true)
                end
                refreshplugins(true)
        end
end

AddPlugin.MouseButton1Click:Connect(function()
        addPlugin(PluginsGUI.FileName.Text)
end)

Exit_3.MouseButton1Click:Connect(function()
        PluginEditor:TweenPosition(UDim2.new(0.5, -180, 0, -500), "InOut", "Quart", 0.5, true, nil)
        FileName.Text = 'Plugin File Name'
end)

Add_3.MouseButton1Click:Connect(function()
        PluginEditor:TweenPosition(UDim2.new(0.5, -180, 0, 310), "InOut", "Quart", 0.5, true, nil)
end)

Plugins.MouseButton1Click:Connect(function()
        if writefileExploit() then
                PluginsFrame:TweenPosition(UDim2.new(0, 0, 0, 0), "InOut", "Quart", 0.5, true, nil)
                wait(0.5)
                SettingsHolder.Visible = false
        else
                notify('Incompatible Exploit','Your exploit is unable to use plugins (missing read/writefile)')
        end
end)

Close_4.MouseButton1Click:Connect(function()
        SettingsHolder.Visible = true
        PluginsFrame:TweenPosition(UDim2.new(0, 0, 0, 175), "InOut", "Quart", 0.5, true, nil)
end)

local TeleportCheck = false
Players.LocalPlayer.OnTeleport:Connect(function(State)
        if State ~= Enum.TeleportState.InProgress then return end
        if TeleportCheck then return end
        TeleportCheck = true
        if queueteleport then
                -- Reload Arc Yield from the executor's workspace file on teleport
                -- MUST reset IY_LOADED first because getgenv persists across teleports,
                -- which causes Arc Yield's own startup check (line 1) to bail out immediately
                pcall(function()
                        queueteleport([[
                                pcall(function() getgenv().IY_LOADED = false end)
                                pcall(function() getgenv().ARC_YIELD_LOADED = false end)
                                pcall(function() _G.IY_LOADED = false end)
                                pcall(function() _G.ARC_YIELD_LOADED = false end)
                                loadstring(readfile('Arc Yield.lua'))()
                        ]])
                end)
        end
end)

addcmd('addalias',{},function(args, speaker)
        if #args < 2 then return end
        local cmd = string.lower(args[1])
        local alias = string.lower(args[2])
        for i,v in pairs(cmds) do
                if v.NAME:lower()==cmd or FindInTable(v.ALIAS,cmd) then
                        customAlias[alias] = v
                        aliases[#aliases + 1] = {CMD = cmd, ALIAS = alias}
                        notify('Aliases Modified',"Added "..alias.." as an alias to "..cmd)
                        updatesaves()
                        refreshaliases()
                        break
                end
        end
end)

addcmd('removealias',{},function(args, speaker)
        if #args < 1 then return end
        local alias = string.lower(args[1])
        if customAlias[alias] then
                local cmd = customAlias[alias].NAME
                customAlias[alias] = nil
                for i = #aliases,1,-1 do
                        if aliases[i].ALIAS == tostring(alias) then
                                table.remove(aliases, i)
                        end
                end
                notify('Aliases Modified',"Removed the alias "..alias.." from "..cmd)
                updatesaves()
                refreshaliases()
        end
end)

addcmd('clraliases',{},function(args, speaker)
        customAlias = {}
        aliases = {}
        notify('Aliases Modified','Removed all aliases')
        updatesaves()
        refreshaliases()
end)

addcmd('discord', {'support', 'help'}, function(args, speaker)
        if everyClipboard then
                toClipboard('https://discord.com/invite/78ZuWSq')
                notify('Discord Invite', 'Copied to clipboard!\ndiscord.gg/78ZuWSq')
        else
                notify('Discord Invite', 'discord.gg/78ZuWSq')
        end
        if httprequest then
                httprequest({
                        Url = 'http://127.0.0.1:6463/rpc?v=1',
                        Method = 'POST',
                        Headers = {
                                ['Content-Type'] = 'application/json',
                                Origin = 'https://discord.com'
                        },
                        Body = HttpService:JSONEncode({
                                cmd = 'INVITE_BROWSER',
                                nonce = HttpService:GenerateGUID(false),
                                args = {code = '78ZuWSq'}
                        })
                })
        end
end)

addcmd('keepiy', {}, function(args, speaker)
        if queueteleport then
                KeepInfYield = true
                notify('KeepIY','Arc Yield will now run after you teleport')
                updatesaves()
        else
                notify('Incompatible Exploit','Your exploit does not support this command (missing queue_on_teleport)')
        end
end)

addcmd('unkeepiy', {}, function(args, speaker)
        if queueteleport then
                KeepInfYield = false
                notify('KeepIY','Arc Yield will no longer run after you teleport')
                updatesaves()
        else
                notify('Incompatible Exploit','Your exploit does not support this command (missing queue_on_teleport)')
        end
end)

addcmd('togglekeepiy', {}, function(args, speaker)
        if queueteleport then
                KeepInfYield = not KeepInfYield
                updatesaves()
        else
                notify('Incompatible Exploit','Your exploit does not support this command (missing queue_on_teleport)')
        end
end)

local canOpenServerinfo = true
addcmd('serverinfo',{'info','sinfo'},function(args, speaker)
        if not canOpenServerinfo then return end
        canOpenServerinfo = false
        task.spawn(function()
                local FRAME = Instance.new("Frame")
                local shadow = Instance.new("Frame")
                local PopupText = Instance.new("TextLabel")
                local Exit = Instance.new("TextButton")
                local ExitImage = Instance.new("ImageLabel")
                local background = Instance.new("Frame")
                local TextLabel = Instance.new("TextLabel")
                local TextLabel2 = Instance.new("TextLabel")
                local TextLabel3 = Instance.new("TextLabel")
                local Time = Instance.new("TextLabel")
                local appearance = Instance.new("TextLabel")
                local maxplayers = Instance.new("TextLabel")
                local name = Instance.new("TextLabel")
                local placeid = Instance.new("TextLabel")
                local playerid = Instance.new("TextLabel")
                local players = Instance.new("TextLabel")
                local CopyApp = Instance.new("TextButton")
                local CopyPlrID = Instance.new("TextButton")
                local CopyPlcID = Instance.new("TextButton")
                local CopyPlcName = Instance.new("TextButton")

                FRAME.Name = randomString()
                FRAME.Parent = ScaledHolder
                FRAME.Active = true
                FRAME.BackgroundTransparency = 1
                FRAME.Position = UDim2.new(0.5, -130, 0, -500)
                FRAME.Size = UDim2.new(0, 250, 0, 20)
                FRAME.ZIndex = 10
                dragGUI(FRAME)

                shadow.Name = "shadow"
                shadow.Parent = FRAME
                shadow.BackgroundColor3 = currentShade2
                shadow.BorderSizePixel = 0
                shadow.Size = UDim2.new(0, 250, 0, 20)
                shadow.ZIndex = 10
                table.insert(shade2,shadow)

                PopupText.Name = "PopupText"
                PopupText.Parent = shadow
                PopupText.BackgroundTransparency = 1
                PopupText.Size = UDim2.new(1, 0, 0.95, 0)
                PopupText.ZIndex = 10
                PopupText.Font = Enum.Font.SourceSans
                PopupText.TextSize = 14
                PopupText.Text = "Server"
                PopupText.TextColor3 = currentText1
                PopupText.TextWrapped = true
                table.insert(text1,PopupText)

                Exit.Name = "Exit"
                Exit.Parent = shadow
                Exit.BackgroundTransparency = 1
                Exit.Position = UDim2.new(1, -20, 0, 0)
                Exit.Size = UDim2.new(0, 20, 0, 20)
                Exit.Text = ""
                Exit.ZIndex = 10

                ExitImage.Parent = Exit
                ExitImage.BackgroundColor3 = Color3.new(1, 1, 1)
                ExitImage.BackgroundTransparency = 1
                ExitImage.Position = UDim2.new(0, 5, 0, 5)
                ExitImage.Size = UDim2.new(0, 10, 0, 10)
                ExitImage.Image = getcustomasset("infiniteyield/assets/close.png")
                ExitImage.ZIndex = 10

                background.Name = "background"
                background.Parent = FRAME
                background.Active = true
                background.BackgroundColor3 = currentShade1
                background.BorderSizePixel = 0
                background.Position = UDim2.new(0, 0, 1, 0)
                background.Size = UDim2.new(0, 250, 0, 250)
                background.ZIndex = 10
                table.insert(shade1,background)

                TextLabel.Name = "Text Label"
                TextLabel.Parent = background
                TextLabel.BackgroundTransparency = 1
                TextLabel.BorderSizePixel = 0
                TextLabel.Position = UDim2.new(0, 5, 0, 80)
                TextLabel.Size = UDim2.new(0, 100, 0, 20)
                TextLabel.ZIndex = 10
                TextLabel.Font = Enum.Font.SourceSansLight
                TextLabel.TextSize = 20
                TextLabel.Text = "Run Time:"
                TextLabel.TextColor3 = currentText1
                TextLabel.TextXAlignment = Enum.TextXAlignment.Left
                table.insert(text1,TextLabel)

                TextLabel2.Name = "Text Label2"
                TextLabel2.Parent = background
                TextLabel2.BackgroundTransparency = 1
                TextLabel2.BorderSizePixel = 0
                TextLabel2.Position = UDim2.new(0, 5, 0, 130)
                TextLabel2.Size = UDim2.new(0, 100, 0, 20)
                TextLabel2.ZIndex = 10
                TextLabel2.Font = Enum.Font.SourceSansLight
                TextLabel2.TextSize = 20
                TextLabel2.Text = "Statistics:"
                TextLabel2.TextColor3 = currentText1
                TextLabel2.TextXAlignment = Enum.TextXAlignment.Left
                table.insert(text1,TextLabel2)

                TextLabel3.Name = "Text Label3"
                TextLabel3.Parent = background
                TextLabel3.BackgroundTransparency = 1
                TextLabel3.BorderSizePixel = 0
                TextLabel3.Position = UDim2.new(0, 5, 0, 10)
                TextLabel3.Size = UDim2.new(0, 100, 0, 20)
                TextLabel3.ZIndex = 10
                TextLabel3.Font = Enum.Font.SourceSansLight
                TextLabel3.TextSize = 20
                TextLabel3.Text = "Local Player:"
                TextLabel3.TextColor3 = currentText1
                TextLabel3.TextXAlignment = Enum.TextXAlignment.Left
                table.insert(text1,TextLabel3)

                Time.Name = "Time"
                Time.Parent = background
                Time.BackgroundTransparency = 1
                Time.BorderSizePixel = 0
                Time.Position = UDim2.new(0, 5, 0, 105)
                Time.Size = UDim2.new(0, 100, 0, 20)
                Time.ZIndex = 10
                Time.Font = Enum.Font.SourceSans
                Time.FontSize = Enum.FontSize.Size14
                Time.Text = "LOADING"
                Time.TextColor3 = currentText1
                Time.TextXAlignment = Enum.TextXAlignment.Left
                table.insert(text1,Time)

                appearance.Name = "appearance"
                appearance.Parent = background
                appearance.BackgroundTransparency = 1
                appearance.BorderSizePixel = 0
                appearance.Position = UDim2.new(0, 5, 0, 55)
                appearance.Size = UDim2.new(0, 100, 0, 20)
                appearance.ZIndex = 10
                appearance.Font = Enum.Font.SourceSans
                appearance.FontSize = Enum.FontSize.Size14
                appearance.Text = "Appearance: LOADING"
                appearance.TextColor3 = currentText1
                appearance.TextXAlignment = Enum.TextXAlignment.Left
                table.insert(text1,appearance)

                maxplayers.Name = "maxplayers"
                maxplayers.Parent = background
                maxplayers.BackgroundTransparency = 1
                maxplayers.BorderSizePixel = 0
                maxplayers.Position = UDim2.new(0, 5, 0, 175)
                maxplayers.Size = UDim2.new(0, 100, 0, 20)
                maxplayers.ZIndex = 10
                maxplayers.Font = Enum.Font.SourceSans
                maxplayers.FontSize = Enum.FontSize.Size14
                maxplayers.Text = "LOADING"
                maxplayers.TextColor3 = currentText1
                maxplayers.TextXAlignment = Enum.TextXAlignment.Left
                table.insert(text1,maxplayers)

                name.Name = "name"
                name.Parent = background
                name.BackgroundTransparency = 1
                name.BorderSizePixel = 0
                name.Position = UDim2.new(0, 5, 0, 215)
                name.Size = UDim2.new(0, 240, 0, 30)
                name.ZIndex = 10
                name.Font = Enum.Font.SourceSans
                name.FontSize = Enum.FontSize.Size14
                name.Text = "Place Name: LOADING"
                name.TextColor3 = currentText1
                name.TextWrapped = true
                name.TextXAlignment = Enum.TextXAlignment.Left
                name.TextYAlignment = Enum.TextYAlignment.Top
                table.insert(text1,name)

                placeid.Name = "placeid"
                placeid.Parent = background
                placeid.BackgroundTransparency = 1
                placeid.BorderSizePixel = 0
                placeid.Position = UDim2.new(0, 5, 0, 195)
                placeid.Size = UDim2.new(0, 100, 0, 20)
                placeid.ZIndex = 10
                placeid.Font = Enum.Font.SourceSans
                placeid.FontSize = Enum.FontSize.Size14
                placeid.Text = "Place ID: LOADING"
                placeid.TextColor3 = currentText1
                placeid.TextXAlignment = Enum.TextXAlignment.Left
                table.insert(text1,placeid)

                playerid.Name = "playerid"
                playerid.Parent = background
                playerid.BackgroundTransparency = 1
                playerid.BorderSizePixel = 0
                playerid.Position = UDim2.new(0, 5, 0, 35)
                playerid.Size = UDim2.new(0, 100, 0, 20)
                playerid.ZIndex = 10
                playerid.Font = Enum.Font.SourceSans
                playerid.FontSize = Enum.FontSize.Size14
                playerid.Text = "Player ID: LOADING"
                playerid.TextColor3 = currentText1
                playerid.TextXAlignment = Enum.TextXAlignment.Left
                table.insert(text1,playerid)

                players.Name = "players"
                players.Parent = background
                players.BackgroundTransparency = 1
                players.BorderSizePixel = 0
                players.Position = UDim2.new(0, 5, 0, 155)
                players.Size = UDim2.new(0, 100, 0, 20)
                players.ZIndex = 10
                players.Font = Enum.Font.SourceSans
                players.FontSize = Enum.FontSize.Size14
                players.Text = "LOADING"
                players.TextColor3 = currentText1
                players.TextXAlignment = Enum.TextXAlignment.Left
                table.insert(text1,players)

                CopyApp.Name = "CopyApp"
                CopyApp.Parent = background
                CopyApp.BackgroundColor3 = currentShade2
                CopyApp.BorderSizePixel = 0
                CopyApp.Position = UDim2.new(0, 210, 0, 55)
                CopyApp.Size = UDim2.new(0, 35, 0, 20)
                CopyApp.Font = Enum.Font.SourceSans
                CopyApp.TextSize = 14
                CopyApp.Text = "Copy"
                CopyApp.TextColor3 = currentText1
                CopyApp.ZIndex = 10
                table.insert(shade2,CopyApp)
                table.insert(text1,CopyApp)

                CopyPlrID.Name = "CopyPlrID"
                CopyPlrID.Parent = background
                CopyPlrID.BackgroundColor3 = currentShade2
                CopyPlrID.BorderSizePixel = 0
                CopyPlrID.Position = UDim2.new(0, 210, 0, 35)
                CopyPlrID.Size = UDim2.new(0, 35, 0, 20)
                CopyPlrID.Font = Enum.Font.SourceSans
                CopyPlrID.TextSize = 14
                CopyPlrID.Text = "Copy"
                CopyPlrID.TextColor3 = currentText1
                CopyPlrID.ZIndex = 10
                table.insert(shade2,CopyPlrID)
                table.insert(text1,CopyPlrID)

                CopyPlcID.Name = "CopyPlcID"
                CopyPlcID.Parent = background
                CopyPlcID.BackgroundColor3 = currentShade2
                CopyPlcID.BorderSizePixel = 0
                CopyPlcID.Position = UDim2.new(0, 210, 0, 195)
                CopyPlcID.Size = UDim2.new(0, 35, 0, 20)
                CopyPlcID.Font = Enum.Font.SourceSans
                CopyPlcID.TextSize = 14
                CopyPlcID.Text = "Copy"
                CopyPlcID.TextColor3 = currentText1
                CopyPlcID.ZIndex = 10
                table.insert(shade2,CopyPlcID)
                table.insert(text1,CopyPlcID)

                CopyPlcName.Name = "CopyPlcName"
                CopyPlcName.Parent = background
                CopyPlcName.BackgroundColor3 = currentShade2
                CopyPlcName.BorderSizePixel = 0
                CopyPlcName.Position = UDim2.new(0, 210, 0, 215)
                CopyPlcName.Size = UDim2.new(0, 35, 0, 20)
                CopyPlcName.Font = Enum.Font.SourceSans
                CopyPlcName.TextSize = 14
                CopyPlcName.Text = "Copy"
                CopyPlcName.TextColor3 = currentText1
                CopyPlcName.ZIndex = 10
                table.insert(shade2,CopyPlcName)
                table.insert(text1,CopyPlcName)

                local SINFOGUI = background
                FRAME:TweenPosition(UDim2.new(0.5, -130, 0, 100), "InOut", "Quart", 0.5, true, nil) 
                wait(0.5)
                Exit.MouseButton1Click:Connect(function()
                        FRAME:TweenPosition(UDim2.new(0.5, -130, 0, -500), "InOut", "Quart", 0.5, true, nil) 
                        wait(0.6)
                        FRAME:Destroy()
                        canOpenServerinfo = true
                end)
                local Asset = MarketplaceService:GetProductInfo(PlaceId)
                SINFOGUI.name.Text = "Place Name: " .. Asset.Name
                SINFOGUI.playerid.Text = "Player ID: " ..speaker.UserId
                SINFOGUI.maxplayers.Text = Players.MaxPlayers.. " Players Max"
                SINFOGUI.placeid.Text = "Place ID: " ..PlaceId

                CopyApp.MouseButton1Click:Connect(function()
                        toClipboard(speaker.CharacterAppearanceId)
                end)
                CopyPlrID.MouseButton1Click:Connect(function()
                        toClipboard(speaker.UserId)
                end)
                CopyPlcID.MouseButton1Click:Connect(function()
                        toClipboard(PlaceId)
                end)
                CopyPlcName.MouseButton1Click:Connect(function()
                        toClipboard(Asset.Name)
                end)

                repeat
                        players = Players:GetPlayers()
                        SINFOGUI.players.Text = #players.. " Player(s)"
                        SINFOGUI.appearance.Text = "Appearance: " ..speaker.CharacterAppearanceId
                        local seconds = math.floor(workspace.DistributedGameTime)
                        local minutes = math.floor(workspace.DistributedGameTime / 60)
                        local hours = math.floor(workspace.DistributedGameTime / 60 / 60)
                        local seconds = seconds - (minutes * 60)
                        local minutes = minutes - (hours * 60)
                        if hours < 1 then if minutes < 1 then
                                        SINFOGUI.Time.Text = seconds .. " Second(s)" else
                                        SINFOGUI.Time.Text = minutes .. " Minute(s), " .. seconds .. " Second(s)"
                                end
                        else
                                SINFOGUI.Time.Text = hours .. " Hour(s), " .. minutes .. " Minute(s), " .. seconds .. " Second(s)"
                        end
                        wait(1)
                until SINFOGUI.Parent == nil
        end)
end)

addcmd("jobid", {}, function(args, speaker)
        toClipboard("roblox://placeId=" .. PlaceId .. "&gameInstanceId=" .. JobId)
end)

addcmd('notifyjobid',{},function(args, speaker)
        notify('JobId / PlaceId',JobId..' / '..PlaceId)
end)

addcmd('breakloops',{'break'},function(args, speaker)
        lastBreakTime = tick()
end)

addcmd('gametp',{'gameteleport'},function(args, speaker)
        TeleportService:Teleport(args[1])
end)

addcmd("rejoin", {"rj"}, function(args, speaker)
        if #Players:GetPlayers() <= 1 then
                Players.LocalPlayer:Kick("\nRejoining...")
                wait()
                TeleportService:Teleport(PlaceId, Players.LocalPlayer)
        else
                TeleportService:TeleportToPlaceInstance(PlaceId, JobId, Players.LocalPlayer)
        end
end)

addcmd("autorejoin", {"autorj"}, function(args, speaker)
        GuiService.ErrorMessageChanged:Connect(function()
                execCmd("rejoin")
        end)
        notify("Auto Rejoin", "Auto rejoin enabled")
end)

addcmd("serverhop", {"shop"}, function(args, speaker)
        -- thanks to Amity for fixing
        local servers = {}
        local req = game:HttpGet("https://games.roblox.com/v1/games/" .. PlaceId .. "/servers/Public?sortOrder=Desc&limit=100&excludeFullGames=true")
        local body = HttpService:JSONDecode(req)

        if body and body.data then
                for i, v in next, body.data do
                        if type(v) == "table" and tonumber(v.playing) and tonumber(v.maxPlayers) and v.playing < v.maxPlayers and v.id ~= JobId then
                                table.insert(servers, 1, v.id)
                        end
                end
        end

        if #servers > 0 then
                TeleportService:TeleportToPlaceInstance(PlaceId, servers[math.random(1, #servers)], Players.LocalPlayer)
        else
                return notify("Serverhop", "Couldn't find a server.")
        end
end)

addcmd("exit", {}, function(args, speaker)
        game:Shutdown()
end)

addcmd("respawn", {}, function(args, speaker)
        local char = speaker.Character
        if char then
                local hum = char:FindFirstChildOfClass("Humanoid")
                if hum then
                        hum.Health = 0
                else
                        -- Fallback: destroy and let Roblox respawn
                        char:Destroy()
                end
        end
end)

addcmd("suicide", {"killme"}, function(args, speaker)
        local char = speaker.Character
        if char then
                local hum = char:FindFirstChildOfClass("Humanoid")
                if hum then
                        hum.Health = 0
                end
        end
end)

addcmd("sit", {"sitdown"}, function(args, speaker)
        local hum = speaker.Character and speaker.Character:FindFirstChildOfClass("Humanoid")
        if hum then
                hum.Sit = true
                notify("Sit", "Now sitting")
        end
end)

addcmd("time", {"settime", "timeofday"}, function(args, speaker)
        local t = tonumber(args[1])
        if t then
                if t < 0 then t = 0 end
                if t > 24 then t = 24 end
                game:GetService("Lighting").ClockTime = t
                notify("Time", "Set to " .. t .. ":00")
        else
                notify("Time", "Provide a number (0-24)")
        end
end)

local Noclipping = nil
addcmd('noclip',{},function(args, speaker)
        Clip = false
        wait(0.1)
        local function NoclipLoop()
                if Clip == false and speaker.Character ~= nil then
                        for _, child in pairs(speaker.Character:GetDescendants()) do
                                if child:IsA("BasePart") and child.CanCollide == true and child.Name ~= floatName then
                                        child.CanCollide = false
                                end
                        end
                end
        end
        Noclipping = RunService.Stepped:Connect(NoclipLoop)
        if args[1] and args[1] == 'nonotify' then return end
        notify('Noclip','Noclip Enabled')
end)

addcmd('clip',{'unnoclip'},function(args, speaker)
        if Noclipping then
                Noclipping:Disconnect()
        end
        Clip = true
        if args[1] and args[1] == 'nonotify' then return end
        notify('Noclip','Noclip Disabled')
end)

-- nocliph: vertical noclip (teleport up/down through floors/ceilings)
local Nocliph = nil
addcmd('nocliph',{'hclip'},function(args, speaker)
        local studs = tonumber(args[1])
        if studs == nil then
                -- Default: detect if pressing shift (move down) or just move up
                studs = 10
        end
        local root = getRoot(speaker.Character)
        if root then
                root.CFrame = root.CFrame + Vector3.new(0, studs, 0)
                notify('NoclipH', 'Moved ' .. (studs > 0 and 'up ' or 'down ') .. math.abs(studs) .. ' studs')
        end
end)

addcmd('togglenoclip',{},function(args, speaker)
        if Clip then
                execCmd('noclip')
        else
                execCmd('clip')
        end
end)

FLYING = false
QEfly = true
iyflyspeed = 1
vehicleflyspeed = 1
function sFLY(vfly)
        local plr = Players.LocalPlayer
        local char = plr.Character or plr.CharacterAdded:Wait()
        local humanoid = char:FindFirstChildOfClass("Humanoid")
        if not humanoid then
                repeat task.wait() until char:FindFirstChildOfClass("Humanoid")
                humanoid = char:FindFirstChildOfClass("Humanoid")
        end

        if flyKeyDown or flyKeyUp then
                flyKeyDown:Disconnect()
                flyKeyUp:Disconnect()
        end

        local T = getRoot(char)
        local CONTROL = {F = 0, B = 0, L = 0, R = 0, Q = 0, E = 0}
        local lCONTROL = {F = 0, B = 0, L = 0, R = 0, Q = 0, E = 0}
        local SPEED = 0

        local function FLY()
                FLYING = true
                local BG = Instance.new('BodyGyro')
                local BV = Instance.new('BodyVelocity')
                BG.P = 9e4
                BG.Parent = T
                BV.Parent = T
                BG.MaxTorque = Vector3.new(9e9, 9e9, 9e9)
                BG.CFrame = T.CFrame
                BV.Velocity = Vector3.new(0, 0, 0)
                BV.MaxForce = Vector3.new(9e9, 9e9, 9e9)
                task.spawn(function()
                        repeat task.wait()
                                local camera = workspace.CurrentCamera
                                if not vfly and humanoid then
                                        humanoid.PlatformStand = true
                                end

                                if CONTROL.L + CONTROL.R ~= 0 or CONTROL.F + CONTROL.B ~= 0 or CONTROL.Q + CONTROL.E ~= 0 then
                                        SPEED = 50
                                elseif not (CONTROL.L + CONTROL.R ~= 0 or CONTROL.F + CONTROL.B ~= 0 or CONTROL.Q + CONTROL.E ~= 0) and SPEED ~= 0 then
                                        SPEED = 0
                                end
                                if (CONTROL.L + CONTROL.R) ~= 0 or (CONTROL.F + CONTROL.B) ~= 0 or (CONTROL.Q + CONTROL.E) ~= 0 then
                                        BV.Velocity = ((camera.CFrame.LookVector * (CONTROL.F + CONTROL.B)) + ((camera.CFrame * CFrame.new(CONTROL.L + CONTROL.R, (CONTROL.F + CONTROL.B + CONTROL.Q + CONTROL.E) * 0.2, 0).p) - camera.CFrame.p)) * SPEED
                                        lCONTROL = {F = CONTROL.F, B = CONTROL.B, L = CONTROL.L, R = CONTROL.R}
                                elseif (CONTROL.L + CONTROL.R) == 0 and (CONTROL.F + CONTROL.B) == 0 and (CONTROL.Q + CONTROL.E) == 0 and SPEED ~= 0 then
                                        BV.Velocity = ((camera.CFrame.LookVector * (lCONTROL.F + lCONTROL.B)) + ((camera.CFrame * CFrame.new(lCONTROL.L + lCONTROL.R, (lCONTROL.F + lCONTROL.B + CONTROL.Q + CONTROL.E) * 0.2, 0).p) - camera.CFrame.p)) * SPEED
                                else
                                        BV.Velocity = Vector3.new(0, 0, 0)
                                end
                                BG.CFrame = camera.CFrame
                        until not FLYING
                        CONTROL = {F = 0, B = 0, L = 0, R = 0, Q = 0, E = 0}
                        lCONTROL = {F = 0, B = 0, L = 0, R = 0, Q = 0, E = 0}
                        SPEED = 0
                        BG:Destroy()
                        BV:Destroy()

                        if humanoid then humanoid.PlatformStand = false end
                end)
        end

        flyKeyDown = UserInputService.InputBegan:Connect(function(input, processed)
                if processed then return end
                if input.KeyCode == Enum.KeyCode.W then
                        CONTROL.F = (vfly and vehicleflyspeed or iyflyspeed)
                elseif input.KeyCode == Enum.KeyCode.S then
                        CONTROL.B = - (vfly and vehicleflyspeed or iyflyspeed)
                elseif input.KeyCode == Enum.KeyCode.A then
                        CONTROL.L = - (vfly and vehicleflyspeed or iyflyspeed)
                elseif input.KeyCode == Enum.KeyCode.D then
                        CONTROL.R = (vfly and vehicleflyspeed or iyflyspeed)
                elseif input.KeyCode == Enum.KeyCode.E and QEfly then
                        CONTROL.Q = (vfly and vehicleflyspeed or iyflyspeed)*2
                elseif input.KeyCode == Enum.KeyCode.Q and QEfly then
                        CONTROL.E = -(vfly and vehicleflyspeed or iyflyspeed)*2
                end
                pcall(function() camera.CameraType = Enum.CameraType.Track end)
        end)

        flyKeyUp = UserInputService.InputEnded:Connect(function(input, processed)
                if processed then return end
                if input.KeyCode == Enum.KeyCode.W then
                        CONTROL.F = 0
                elseif input.KeyCode == Enum.KeyCode.S then
                        CONTROL.B = 0
                elseif input.KeyCode == Enum.KeyCode.A then
                        CONTROL.L = 0
                elseif input.KeyCode == Enum.KeyCode.D then
                        CONTROL.R = 0
                elseif input.KeyCode == Enum.KeyCode.E then
                        CONTROL.Q = 0
                elseif input.KeyCode == Enum.KeyCode.Q then
                        CONTROL.E = 0
                end
        end)
        FLY()
end

function NOFLY()
        FLYING = false
        if flyKeyDown or flyKeyUp then flyKeyDown:Disconnect() flyKeyUp:Disconnect() end
        if Players.LocalPlayer.Character:FindFirstChildOfClass('Humanoid') then
                Players.LocalPlayer.Character:FindFirstChildOfClass('Humanoid').PlatformStand = false
        end
        pcall(function() workspace.CurrentCamera.CameraType = Enum.CameraType.Custom end)
end

local velocityHandlerName = randomString()
local gyroHandlerName = randomString()
local mfly1
local mfly2

local unmobilefly = function(speaker)
        pcall(function()
                FLYING = false
                local root = getRoot(speaker.Character)
                root:FindFirstChild(velocityHandlerName):Destroy()
                root:FindFirstChild(gyroHandlerName):Destroy()
                speaker.Character:FindFirstChildWhichIsA("Humanoid").PlatformStand = false
                mfly1:Disconnect()
                mfly2:Disconnect()
        end)
end

local mobilefly = function(speaker, vfly)
        unmobilefly(speaker)
        FLYING = true

        local root = getRoot(speaker.Character)
        local camera = workspace.CurrentCamera
        local v3none = Vector3.new()
        local v3zero = Vector3.new(0, 0, 0)
        local v3inf = Vector3.new(9e9, 9e9, 9e9)

        local controlModule = require(speaker.PlayerScripts:WaitForChild("PlayerModule"):WaitForChild("ControlModule"))
        local bv = Instance.new("BodyVelocity")
        bv.Name = velocityHandlerName
        bv.Parent = root
        bv.MaxForce = v3zero
        bv.Velocity = v3zero

        local bg = Instance.new("BodyGyro")
        bg.Name = gyroHandlerName
        bg.Parent = root
        bg.MaxTorque = v3inf
        bg.P = 1000
        bg.D = 50

        mfly1 = speaker.CharacterAdded:Connect(function()
                local bv = Instance.new("BodyVelocity")
                bv.Name = velocityHandlerName
                bv.Parent = root
                bv.MaxForce = v3zero
                bv.Velocity = v3zero

                local bg = Instance.new("BodyGyro")
                bg.Name = gyroHandlerName
                bg.Parent = root
                bg.MaxTorque = v3inf
                bg.P = 1000
                bg.D = 50
        end)

        mfly2 = RunService.RenderStepped:Connect(function()
                root = getRoot(speaker.Character)
                camera = workspace.CurrentCamera
                if speaker.Character:FindFirstChildWhichIsA("Humanoid") and root and root:FindFirstChild(velocityHandlerName) and root:FindFirstChild(gyroHandlerName) then
                        local humanoid = speaker.Character:FindFirstChildWhichIsA("Humanoid")
                        local VelocityHandler = root:FindFirstChild(velocityHandlerName)
                        local GyroHandler = root:FindFirstChild(gyroHandlerName)

                        VelocityHandler.MaxForce = v3inf
                        GyroHandler.MaxTorque = v3inf
                        if not vfly then humanoid.PlatformStand = true end
                        GyroHandler.CFrame = camera.CoordinateFrame
                        VelocityHandler.Velocity = v3none

                        local direction = controlModule:GetMoveVector()
                        if direction.X > 0 then
                                VelocityHandler.Velocity = VelocityHandler.Velocity + camera.CFrame.RightVector * (direction.X * ((vfly and vehicleflyspeed or iyflyspeed) * 50))
                        end
                        if direction.X < 0 then
                                VelocityHandler.Velocity = VelocityHandler.Velocity + camera.CFrame.RightVector * (direction.X * ((vfly and vehicleflyspeed or iyflyspeed) * 50))
                        end
                        if direction.Z > 0 then
                                VelocityHandler.Velocity = VelocityHandler.Velocity - camera.CFrame.LookVector * (direction.Z * ((vfly and vehicleflyspeed or iyflyspeed) * 50))
                        end
                        if direction.Z < 0 then
                                VelocityHandler.Velocity = VelocityHandler.Velocity - camera.CFrame.LookVector * (direction.Z * ((vfly and vehicleflyspeed or iyflyspeed) * 50))
                        end
                end
        end)
end

addcmd('fly',{},function(args, speaker)
        if not IsOnMobile then
                NOFLY()
                wait()
                sFLY()
        else
                mobilefly(speaker)
        end
        if args[1] and isNumber(args[1]) then
                iyflyspeed = args[1]
        end
end)

addcmd('flyspeed',{'flysp'},function(args, speaker)
        local speed = args[1] or 1
        if isNumber(speed) then
                iyflyspeed = speed
        end
end)

addcmd('unfly',{'nofly','novfly','unvehiclefly','novehiclefly','unvfly'},function(args, speaker)
        if not IsOnMobile then NOFLY() else unmobilefly(speaker) end
end)

addcmd('vfly',{'vehiclefly'},function(args, speaker)
        if not IsOnMobile then
                NOFLY()
                wait()
                sFLY(true)
        else
                mobilefly(speaker, true)
        end
        if args[1] and isNumber(args[1]) then
                vehicleflyspeed = args[1]
        end
end)

addcmd('togglevfly',{},function(args, speaker)
        if FLYING then
                if not IsOnMobile then NOFLY() else unmobilefly(speaker) end
        else
                if not IsOnMobile then sFLY(true) else mobilefly(speaker, true) end
        end
end)

addcmd('vflyspeed',{'vflysp','vehicleflyspeed','vehicleflysp'},function(args, speaker)
        local speed = args[1] or 1
        if isNumber(speed) then
                vehicleflyspeed = speed
        end
end)

addcmd('qefly',{'flyqe'},function(args, speaker)
        if args[1] == 'false' then
                QEfly = false
        else
                QEfly = true
        end
end)

addcmd('togglefly',{},function(args, speaker)
        if FLYING then
                if not IsOnMobile then NOFLY() else unmobilefly(speaker) end
        else
                if not IsOnMobile then sFLY() else mobilefly(speaker) end
        end
end)

CFspeed = 50
addcmd('cframefly', {'cfly'}, function(args, speaker)
        if args[1] and isNumber(args[1]) then
                CFspeed = args[1]
        end

        -- Full credit to peyton#9148 (apeyton)
        speaker.Character:FindFirstChildOfClass('Humanoid').PlatformStand = true
        local Head = speaker.Character:WaitForChild("Head")
        Head.Anchored = true
        if CFloop then CFloop:Disconnect() end
        CFloop = RunService.Heartbeat:Connect(function(deltaTime)
                local moveDirection = speaker.Character:FindFirstChildOfClass('Humanoid').MoveDirection * (CFspeed * deltaTime)
                local headCFrame = Head.CFrame
                local camera = workspace.CurrentCamera
                local cameraCFrame = camera.CFrame
                local cameraOffset = headCFrame:ToObjectSpace(cameraCFrame).Position
                cameraCFrame = cameraCFrame * CFrame.new(-cameraOffset.X, -cameraOffset.Y, -cameraOffset.Z + 1)
                local cameraPosition = cameraCFrame.Position
                local headPosition = headCFrame.Position

                local objectSpaceVelocity = CFrame.new(cameraPosition, Vector3.new(headPosition.X, cameraPosition.Y, headPosition.Z)):VectorToObjectSpace(moveDirection)
                Head.CFrame = CFrame.new(headPosition) * (cameraCFrame - cameraPosition) * CFrame.new(objectSpaceVelocity)
        end)
end)

addcmd('uncframefly',{'uncfly'},function(args, speaker)
        if CFloop then
                CFloop:Disconnect()
                speaker.Character:FindFirstChildOfClass('Humanoid').PlatformStand = false
                local Head = speaker.Character:WaitForChild("Head")
                Head.Anchored = false
        end
end)

addcmd('cframeflyspeed',{'cflyspeed'},function(args, speaker)
        if isNumber(args[1]) then
                CFspeed = args[1]
        end
end)

do
-- ======================== ROTATESPEED ========================
-- rotatespeed <angle> <keycode>
-- Snaps camera to <angle> degrees for 0.05s when <keycode> is pressed, then restores
local rsActive = false
local rsAngle = 0
local rsKey = nil
local rsConn = nil

local function rsStop()
        rsActive = false
        if rsConn then
                rsConn:Disconnect()
                rsConn = nil
        end
end

local function rsStart(angle, keyName)
        rsStop()
        rsActive = true
        rsAngle = tonumber(angle) or 0
        -- Convert key name string (e.g. "E", "Q", "F") to KeyCode enum
        local enumKey = Enum.KeyCode[keyName]
        if not enumKey then
                notify("RotateSpeed", "Invalid key: " .. tostring(keyName))
                rsActive = false
                return
        end
        rsKey = enumKey
        rsConn = UserInputService.InputBegan:Connect(function(input, gp)
                if gp then return end
                if input.KeyCode == rsKey then
                        if not rsActive then return end
                        local cam = workspace.CurrentCamera
                        if not cam then return end
                        -- Save original camera CFrame
                        local originalCFrame = cam.CFrame
                        local pos = originalCFrame.Position
                        -- Build new CFrame at the same position but facing <angle> degrees
                        -- Y-axis rotation, math.rad converts degrees to radians
                        local newCFrame = CFrame.new(pos) * CFrame.Angles(math.rad(rsAngle), 0, 0)
                        cam.CFrame = newCFrame
                        -- Hold for 0.05 seconds then restore
                        task.delay(0.05, function()
                                if cam and cam.Parent then
                                        cam.CFrame = originalCFrame
                                end
                        end)
                end
        end)
end

addcmd("rotatespeed", {"rspeed", "rs", "rotspd"}, function(args, speaker)
        if not args[1] or not args[2] then
                notify("RotateSpeed", "Usage: rotatespeed <angle> <key>\nExample: rotatespeed 90 E\nStops: unrotatespeed")
                return
        end
        if not isNumber(args[1]) then
                notify("RotateSpeed", "First argument must be a number (angle in degrees)")
                return
        end
        rsStart(args[1], args[2])
        notify("RotateSpeed", "Set to " .. args[1] .. " degrees on key [" .. args[2] .. "]")
end)

addcmd("unrotatespeed", {"unrspeed", "unrs", "unrotspd"}, function(args, speaker)
        rsStop()
        notify("RotateSpeed", "Disabled")
end)

Floating = false
floatName = randomString()
addcmd('float', {'platform'},function(args, speaker)
        Floating = true
        local pchar = speaker.Character
        if pchar and not pchar:FindFirstChild(floatName) then
                task.spawn(function()
                        local Float = Instance.new('Part')
                        Float.Name = floatName
                        Float.Parent = pchar
                        Float.Transparency = 1
                        Float.Size = Vector3.new(2,0.2,1.5)
                        Float.Anchored = true
                        local FloatValue = -3.1
                        Float.CFrame = getRoot(pchar).CFrame * CFrame.new(0,FloatValue,0)
                        notify('Float','Float Enabled (Q = down & E = up)')
                        qUp = IYMouse.KeyUp:Connect(function(KEY)
                                if KEY == 'q' then
                                        FloatValue = FloatValue + 0.5
                                end
                        end)
                        eUp = IYMouse.KeyUp:Connect(function(KEY)
                                if KEY == 'e' then
                                        FloatValue = FloatValue - 1.5
                                end
                        end)
                        qDown = IYMouse.KeyDown:Connect(function(KEY)
                                if KEY == 'q' then
                                        FloatValue = FloatValue - 0.5
                                end
                        end)
                        eDown = IYMouse.KeyDown:Connect(function(KEY)
                                if KEY == 'e' then
                                        FloatValue = FloatValue + 1.5
                                end
                        end)
                        floatDied = speaker.Character:FindFirstChildOfClass('Humanoid').Died:Connect(function()
                                FloatingFunc:Disconnect()
                                Float:Destroy()
                                qUp:Disconnect()
                                eUp:Disconnect()
                                qDown:Disconnect()
                                eDown:Disconnect()
                                floatDied:Disconnect()
                        end)
                        local function FloatPadLoop()
                                if pchar:FindFirstChild(floatName) and getRoot(pchar) then
                                        Float.CFrame = getRoot(pchar).CFrame * CFrame.new(0,FloatValue,0)
                                else
                                        FloatingFunc:Disconnect()
                                        Float:Destroy()
                                        qUp:Disconnect()
                                        eUp:Disconnect()
                                        qDown:Disconnect()
                                        eDown:Disconnect()
                                        floatDied:Disconnect()
                                end
                        end                     
                        FloatingFunc = RunService.Heartbeat:Connect(FloatPadLoop)
                end)
        end
end)

addcmd('unfloat',{'nofloat','unplatform','noplatform'},function(args, speaker)
        Floating = false
        local pchar = speaker.Character
        notify('Float','Float Disabled')
        if pchar:FindFirstChild(floatName) then
                pchar:FindFirstChild(floatName):Destroy()
        end
        if floatDied then
                FloatingFunc:Disconnect()
                qUp:Disconnect()
                eUp:Disconnect()
                qDown:Disconnect()
                eDown:Disconnect()
                floatDied:Disconnect()
        end
end)

addcmd('togglefloat',{},function(args, speaker)
        if Floating then
                execCmd('unfloat')
        else
                execCmd('float')
        end
end)

swimming = false
local oldgrav = workspace.Gravity
local swimbeat = nil
addcmd('swim',{},function(args, speaker)
        if not swimming and speaker and speaker.Character and speaker.Character:FindFirstChildWhichIsA("Humanoid") then
                oldgrav = workspace.Gravity
                workspace.Gravity = 0
                local swimDied = function()
                        workspace.Gravity = oldgrav
                        swimming = false
                end
                local Humanoid = speaker.Character:FindFirstChildWhichIsA("Humanoid")
                gravReset = Humanoid.Died:Connect(swimDied)
                local enums = Enum.HumanoidStateType:GetEnumItems()
                table.remove(enums, table.find(enums, Enum.HumanoidStateType.None))
                for i, v in pairs(enums) do
                        Humanoid:SetStateEnabled(v, false)
                end
                Humanoid:ChangeState(Enum.HumanoidStateType.Swimming)
                swimbeat = RunService.Heartbeat:Connect(function()
                        pcall(function()
                                getRoot(speaker.Character).Humanoid.RootPart.Velocity = ((Humanoid.MoveDirection ~= Vector3.new() or UserInputService:IsKeyDown(Enum.KeyCode.Space)) and getRoot(speaker.Character).Humanoid.RootPart.Velocity or Vector3.new())
                        end)
                end)
                swimming = true
        end
end)

addcmd('unswim',{'noswim'},function(args, speaker)
        if speaker and speaker.Character and speaker.Character:FindFirstChildWhichIsA("Humanoid") then
                workspace.Gravity = oldgrav
                swimming = false
                if gravReset then
                        gravReset:Disconnect()
                end
                if swimbeat ~= nil then
                        swimbeat:Disconnect()
                        swimbeat = nil
                end
                local Humanoid = speaker.Character:FindFirstChildWhichIsA("Humanoid")
                local enums = Enum.HumanoidStateType:GetEnumItems()
                table.remove(enums, table.find(enums, Enum.HumanoidStateType.None))
                for i, v in pairs(enums) do
                        Humanoid:SetStateEnabled(v, true)
                end
        end
end)

addcmd('toggleswim',{},function(args, speaker)
        if swimming then
                execCmd('unswim')
        else
                execCmd('swim')
        end
end)

addcmd('setwaypoint',{'swp','setwp','spos','saveposition','savepos'},function(args, speaker)
        local WPName = tostring(getstring(1, args))
        if getRoot(speaker.Character) then
                notify('Modified Waypoints',"Created waypoint: "..getstring(1, args))
                local torso = getRoot(speaker.Character)
                WayPoints[#WayPoints + 1] = {NAME = WPName, COORD = {math.floor(torso.Position.X), math.floor(torso.Position.Y), math.floor(torso.Position.Z)}, GAME = PlaceId}
                if AllWaypoints ~= nil then
                        AllWaypoints[#AllWaypoints + 1] = {NAME = WPName, COORD = {math.floor(torso.Position.X), math.floor(torso.Position.Y), math.floor(torso.Position.Z)}, GAME = PlaceId}
                end
        end     
        refreshwaypoints()
        updatesaves()
end)

addcmd('waypointpos',{'wpp','setwaypointposition','setpos','setwaypoint','setwaypointpos'},function(args, speaker)
        local WPName = tostring(getstring(1, args))
        if getRoot(speaker.Character) then
                notify('Modified Waypoints',"Created waypoint: "..getstring(1, args))
                WayPoints[#WayPoints + 1] = {NAME = WPName, COORD = {args[2], args[3], args[4]}, GAME = PlaceId}
                if AllWaypoints ~= nil then
                        AllWaypoints[#AllWaypoints + 1] = {NAME = WPName, COORD = {args[2], args[3], args[4]}, GAME = PlaceId}
                end
        end     
        refreshwaypoints()
        updatesaves()
end)

addcmd('waypoints',{'positions'},function(args, speaker)
        if SettingsOpen == false then SettingsOpen = true
                Settings:TweenPosition(UDim2.new(0, 0, 0, 45), "InOut", "Quart", 0.5, true, nil)
                CMDsF.Visible = false
        end
        KeybindsFrame:TweenPosition(UDim2.new(0, 0, 0, 175), "InOut", "Quart", 0.5, true, nil)
        AliasesFrame:TweenPosition(UDim2.new(0, 0, 0, 175), "InOut", "Quart", 0.5, true, nil)
        PluginsFrame:TweenPosition(UDim2.new(0, 0, 0, 175), "InOut", "Quart", 0.5, true, nil)
        PositionsFrame:TweenPosition(UDim2.new(0, 0, 0, 0), "InOut", "Quart", 0.5, true, nil)
        wait(0.5)
        SettingsHolder.Visible = false
        maximizeHolder()
end)

waypointParts = {}
addcmd('showwaypoints',{'showwp','showwps'},function(args, speaker)
        execCmd('hidewaypoints')
        wait()
        for i,_ in pairs(WayPoints) do
                local x = WayPoints[i].COORD[1]
                local y = WayPoints[i].COORD[2]
                local z = WayPoints[i].COORD[3]
                local part = Instance.new("Part")
                part.Size = Vector3.new(5,5,5)
                part.CFrame = CFrame.new(x,y,z)
                part.Parent = workspace
                part.Anchored = true
                part.CanCollide = false
                table.insert(waypointParts,part)
                local view = Instance.new("BoxHandleAdornment")
                view.Adornee = part
                view.AlwaysOnTop = true
                view.ZIndex = 10
                view.Size = part.Size
                view.Parent = part
        end
        for i,v in pairs(pWayPoints) do
                local view = Instance.new("BoxHandleAdornment")
                view.Adornee = pWayPoints[i].COORD[1]
                view.AlwaysOnTop = true
                view.ZIndex = 10
                view.Size = pWayPoints[i].COORD[1].Size
                view.Parent = pWayPoints[i].COORD[1]
                table.insert(waypointParts,view)
        end
end)

addcmd('hidewaypoints',{'hidewp','hidewps'},function(args, speaker)
        for i,v in pairs(waypointParts) do
                v:Destroy()
        end
        waypointParts = {}
end)

addcmd('waypoint',{'wp','lpos','loadposition','loadpos'},function(args, speaker)
        local WPName = tostring(getstring(1, args))
        if speaker.Character then
                for i,_ in pairs(WayPoints) do
                        if tostring(WayPoints[i].NAME):lower() == tostring(WPName):lower() then
                                local x = WayPoints[i].COORD[1]
                                local y = WayPoints[i].COORD[2]
                                local z = WayPoints[i].COORD[3]
                                getRoot(speaker.Character).CFrame = CFrame.new(x,y,z)
                        end
                end
                for i,_ in pairs(pWayPoints) do
                        if tostring(pWayPoints[i].NAME):lower() == tostring(WPName):lower() then
                                getRoot(speaker.Character).CFrame = CFrame.new(pWayPoints[i].COORD[1].Position)
                        end
                end
        end
end)

tweenSpeed = 1
addcmd('tweenspeed',{'tspeed'},function(args, speaker)
        local newSpeed = args[1] or 1
        if tonumber(newSpeed) then
                tweenSpeed = tonumber(newSpeed)
        end
end)

addcmd('tweenwaypoint',{'twp'},function(args, speaker)
        local WPName = tostring(getstring(1, args))
        if speaker.Character then
                for i,_ in pairs(WayPoints) do
                        local x = WayPoints[i].COORD[1]
                        local y = WayPoints[i].COORD[2]
                        local z = WayPoints[i].COORD[3]
                        if tostring(WayPoints[i].NAME):lower() == tostring(WPName):lower() then
                                TweenService:Create(getRoot(speaker.Character), TweenInfo.new(tweenSpeed, Enum.EasingStyle.Linear), {CFrame = CFrame.new(x,y,z)}):Play()
                        end
                end
                for i,_ in pairs(pWayPoints) do
                        if tostring(pWayPoints[i].NAME):lower() == tostring(WPName):lower() then
                                TweenService:Create(getRoot(speaker.Character), TweenInfo.new(tweenSpeed, Enum.EasingStyle.Linear), {CFrame = CFrame.new(pWayPoints[i].COORD[1].Position)}):Play()
                        end
                end
        end
end)

addcmd('walktowaypoint',{'wtwp'},function(args, speaker)
        local WPName = tostring(getstring(1, args))
        if speaker.Character then
                for i,_ in pairs(WayPoints) do
                        local x = WayPoints[i].COORD[1]
                        local y = WayPoints[i].COORD[2]
                        local z = WayPoints[i].COORD[3]
                        if tostring(WayPoints[i].NAME):lower() == tostring(WPName):lower() then
                                if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                        speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                        wait(.1)
                                end
                                speaker.Character:FindFirstChildOfClass('Humanoid').WalkToPoint = Vector3.new(x,y,z)
                        end
                end
                for i,_ in pairs(pWayPoints) do
                        if tostring(pWayPoints[i].NAME):lower() == tostring(WPName):lower() then
                                if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                        speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                        wait(.1)
                                end
                                speaker.Character:FindFirstChildOfClass('Humanoid').WalkToPoint = Vector3.new(pWayPoints[i].COORD[1].Position)
                        end
                end
        end
end)

addcmd('deletewaypoint',{'dwp','dpos','deleteposition','deletepos'},function(args, speaker)
        for i,v in pairs(WayPoints) do
                if v.NAME:lower() == tostring(getstring(1, args)):lower() then
                        notify('Modified Waypoints',"Deleted waypoint: " .. v.NAME)
                        table.remove(WayPoints, i)
                end
        end
        if AllWaypoints ~= nil and #AllWaypoints > 0 then
                for i,v in pairs(AllWaypoints) do
                        if v.NAME:lower() == tostring(getstring(1, args)):lower() then
                                if not v.GAME or v.GAME == PlaceId then
                                        table.remove(AllWaypoints, i)
                                end
                        end
                end
        end
        for i,v in pairs(pWayPoints) do
                if v.NAME:lower() == tostring(getstring(1, args)):lower() then
                        notify('Modified Waypoints',"Deleted waypoint: " .. v.NAME)
                        table.remove(pWayPoints, i)
                end
        end
        refreshwaypoints()
        updatesaves()
end)

addcmd('clearwaypoints',{'cwp','clearpositions','cpos','clearpos'},function(args, speaker)
        WayPoints = {}
        pWayPoints = {}
        refreshwaypoints()
        updatesaves()
        AllWaypoints = {}
        notify('Modified Waypoints','Removed all waypoints')
end)

addcmd('cleargamewaypoints',{'cgamewp'},function(args, speaker)
        for i,v in pairs(WayPoints) do
                if v.GAME == PlaceId then
                        table.remove(WayPoints, i)
                end
        end
        if AllWaypoints ~= nil and #AllWaypoints > 0 then
                for i,v in pairs(AllWaypoints) do
                        if v.GAME == PlaceId then
                                table.remove(AllWaypoints, i)
                        end
                end
        end
        for i,v in pairs(pWayPoints) do
                if v.GAME == PlaceId then
                        table.remove(pWayPoints, i)
                end
        end
        refreshwaypoints()
        updatesaves()
        notify('Modified Waypoints','Deleted game waypoints')
end)


local coreGuiTypeNames = {
        -- predefined aliases
        ["inventory"] = Enum.CoreGuiType.Backpack,
        ["leaderboard"] = Enum.CoreGuiType.PlayerList,
        ["emotes"] = Enum.CoreGuiType.EmotesMenu
}

-- Load the full list of enums
for _, enumItem in ipairs(Enum.CoreGuiType:GetEnumItems()) do
        coreGuiTypeNames[enumItem.Name:lower()] = enumItem
end

addcmd('enable',{},function(args, speaker)
        local input = args[1] and args[1]:lower()
        if input then
                if input == "reset" then
                        StarterGui:SetCore("ResetButtonCallback", true)
                else
                        local coreGuiType = coreGuiTypeNames[input]
                        if coreGuiType then
                                StarterGui:SetCoreGuiEnabled(coreGuiType, true)
                        end
                end
        end
end)

addcmd('disable',{},function(args, speaker)
        local input = args[1] and args[1]:lower()
        if input then
                if input == "reset" then
                        StarterGui:SetCore("ResetButtonCallback", false)
                else
                        local coreGuiType = coreGuiTypeNames[input]
                        if coreGuiType then
                                StarterGui:SetCoreGuiEnabled(coreGuiType, false)
                        end
                end
        end
end)


local invisGUIS = {}
addcmd('showguis',{},function(args, speaker)
        for i,v in pairs(PlayerGui:GetDescendants()) do
                if (v:IsA("Frame") or v:IsA("ImageLabel") or v:IsA("ScrollingFrame")) and not v.Visible then
                        v.Visible = true
                        if not FindInTable(invisGUIS,v) then
                                table.insert(invisGUIS,v)
                        end
                end
        end
end)

addcmd('unshowguis',{},function(args, speaker)
        for i,v in pairs(invisGUIS) do
                v.Visible = false
        end
        invisGUIS = {}
end)

local hiddenGUIS = {}
addcmd('hideguis',{},function(args, speaker)
        for i,v in pairs(PlayerGui:GetDescendants()) do
                if (v:IsA("Frame") or v:IsA("ImageLabel") or v:IsA("ScrollingFrame")) and v.Visible then
                        v.Visible = false
                        if not FindInTable(hiddenGUIS,v) then
                                table.insert(hiddenGUIS,v)
                        end
                end
        end
end)

addcmd('unhideguis',{},function(args, speaker)
        for i,v in pairs(hiddenGUIS) do
                v.Visible = true
        end
        hiddenGUIS = {}
end)

function deleteGuisAtPos()
        pcall(function()
                local guisAtPosition = PlayerGui:GetGuiObjectsAtPosition(IYMouse.X, IYMouse.Y)
                for _, gui in pairs(guisAtPosition) do
                        if gui.Visible == true then
                                gui:Destroy()
                        end
                end
        end)
end

local deleteGuiInput
addcmd('guidelete',{},function(args, speaker)
        deleteGuiInput = UserInputService.InputBegan:Connect(function(input, gameProcessedEvent)
                if not gameProcessedEvent then
                        if input.KeyCode == Enum.KeyCode.Backspace then
                                deleteGuisAtPos()
                        end
                end
        end)
        notify('GUI Delete Enabled','Hover over a GUI and press backspace to delete it')
end)

addcmd('unguidelete',{'noguidelete'},function(args, speaker)
        if deleteGuiInput then deleteGuiInput:Disconnect() end
        notify('GUI Delete Disabled','GUI backspace delete has been disabled')
end)

local wasStayOpen = StayOpen
addcmd('hideiy',{},function(args, speaker)
        isHidden = true
        wasStayOpen = StayOpen
        if StayOpen == true then
                StayOpen = false
                On.BackgroundTransparency = 1
        end
        minimizeNum = 0
        minimizeHolder()
        if not (args[1] and tostring(args[1]) == 'nonotify') then notify('IY Hidden','You can press the prefix key to access the command bar') end
end)

addcmd('showiy',{'unhideiy'},function(args, speaker)
        isHidden = false
        minimizeNum = -20
        if wasStayOpen then
                maximizeHolder()
                StayOpen = true
                On.BackgroundTransparency = 0
        else
                minimizeHolder()
        end
end)

addcmd('rec', {'record'}, function(args, speaker)
        return COREGUI:ToggleRecording()
end)

addcmd('screenshot', {'scrnshot'}, function(args, speaker)
        return COREGUI:TakeScreenshot()
end)

addcmd('togglefs', {'togglefullscreen'}, function(args, speaker)
        return GuiService:ToggleFullscreen()
end)

addcmd('inspect', {'examine'}, function(args, speaker)
        for _, v in ipairs(getPlayer(args[1], speaker)) do
                GuiService:CloseInspectMenu()
                GuiService:InspectPlayerFromUserId(Players[v].UserId)
        end
end)

addcmd("savegame", {"saveplace"}, function(args, speaker)
        if saveinstance then
                notify("Loading", "Downloading game. This will take a while")
                saveinstance()
                notify("Game Saved", "Saved place to the workspace folder within your exploit folder.")
        else
                notify("Incompatible Exploit", "Your exploit does not support this command (missing saveinstance)")
        end
end)

addcmd("clearerror", {"clearerrors"}, function(args, speaker)
    GuiService:ClearError()
end)

addcmd("antigameplaypaused", {}, function(args, speaker)
    pcall(function() networkPaused:Disconnect() end)
    networkPaused = COREGUI.RobloxGui.ChildAdded:Connect(function(obj)
        if obj.Name == "CoreScripts/NetworkPause" then
            obj:Destroy()
        end
    end)
    COREGUI.RobloxGui["CoreScripts/NetworkPause"]:Destroy()
end)

addcmd("unantigameplaypaused", {}, function(args, speaker)
    networkPaused:Disconnect()
end)

addcmd('clientantikick',{'antikick'},function(args, speaker)
        if not hookmetamethod then 
                return notify('Incompatible Exploit','Your exploit does not support this command (missing hookmetamethod)')
        end
        local LocalPlayer = Players.LocalPlayer
        local oldhmmi
        local oldhmmnc
        local oldKickFunction
        if hookfunction then
                oldKickFunction = hookfunction(LocalPlayer.Kick, function() end)
        end
        oldhmmi = hookmetamethod(game, "__index", function(self, method)
                if self == LocalPlayer and method:lower() == "kick" then
                        return error("Expected ':' not '.' calling member function Kick", 2)
                end
                return oldhmmi(self, method)
        end)
        oldhmmnc = hookmetamethod(game, "__namecall", function(self, ...)
                if self == LocalPlayer and getnamecallmethod():lower() == "kick" then
                        return
                end
                return oldhmmnc(self, ...)
        end)

        notify('Client Antikick','Client anti kick is now active (only effective on localscript kick)')
end)

allow_rj = true
addcmd('clientantiteleport',{'antiteleport'},function(args, speaker)
        if not hookmetamethod then 
                return notify('Incompatible Exploit','Your exploit does not support this command (missing hookmetamethod)')
        end
        local TeleportService = TeleportService
        local oldhmmi
        local oldhmmnc
        oldhmmi = hookmetamethod(game, "__index", function(self, method)
                if self == TeleportService then
                        if method:lower() == "teleport" then
                                return error("Expected ':' not '.' calling member function Kick", 2)
                        elseif method == "TeleportToPlaceInstance" then
                                return error("Expected ':' not '.' calling member function TeleportToPlaceInstance", 2)
                        end
                end
                return oldhmmi(self, method)
        end)
        oldhmmnc = hookmetamethod(game, "__namecall", function(self, ...)
                if self == TeleportService and getnamecallmethod():lower() == "teleport" or getnamecallmethod() == "TeleportToPlaceInstance" then
                        return
                end
                return oldhmmnc(self, ...)
        end)

        notify('Client AntiTP','Client anti teleport is now active (only effective on localscript teleport)')
end)

addcmd('allowrejoin',{'allowrj'},function(args, speaker)
        if args[1] and args[1] == 'false' then
                allow_rj = false
                notify('Client AntiTP','Allow rejoin set to false')
        else
                allow_rj = true
                notify('Client AntiTP','Allow rejoin set to true')
        end
end)

addcmd("cancelteleport", {"canceltp"}, function(args, speaker)
        TeleportService:TeleportCancel()
end)

addcmd("volume",{ "vol"}, function(args, speaker)
        UserSettings():GetService("UserGameSettings").MasterVolume = args[1]/10
end)

addcmd("antilag", {"boostfps", "lowgraphics"}, function(args, speaker)
        local Terrain = workspace:FindFirstChildWhichIsA("Terrain")
        Terrain.WaterWaveSize = 0
        Terrain.WaterWaveSpeed = 0
        Terrain.WaterReflectance = 0
        Terrain.WaterTransparency = 1
        Lighting.GlobalShadows = false
        Lighting.FogEnd = 9e9
        Lighting.FogStart = 9e9
        settings().Rendering.QualityLevel = 1
        for _, v in pairs(game:GetDescendants()) do
                if v:IsA("BasePart") then
                        v.CastShadow = false
                        v.Material = "Plastic"
                        v.Reflectance = 0
                        v.BackSurface = "SmoothNoOutlines"
                        v.BottomSurface = "SmoothNoOutlines"
                        v.FrontSurface = "SmoothNoOutlines"
                        v.LeftSurface = "SmoothNoOutlines"
                        v.RightSurface = "SmoothNoOutlines"
                        v.TopSurface = "SmoothNoOutlines"
                elseif v:IsA("Decal") then
                        v.Transparency = 1
                        v.Texture = ""
                elseif v:IsA("ParticleEmitter") or v:IsA("Trail") then
                        v.Lifetime = NumberRange.new(0)
                end
        end
        for _, v in pairs(Lighting:GetDescendants()) do
                if v:IsA("PostEffect") then
                        v.Enabled = false
                end
        end
        workspace.DescendantAdded:Connect(function(child)
                task.spawn(function()
                        if child:IsA("ForceField") or child:IsA("Sparkles") or child:IsA("Smoke") or child:IsA("Fire") or child:IsA("Beam") then
                                RunService.Heartbeat:Wait()
                                child:Destroy()
                        elseif child:IsA("BasePart") then
                                child.CastShadow = false
                        end
                end)
        end)
end)

addcmd("setfpscap", {"fpscap", "maxfps"}, function(args, speaker)
        if fpscaploop then
                task.cancel(fpscaploop)
                fpscaploop = nil
        end

        local fpsCap = 60
        local num = tonumber(args[1]) or 1e6
        if num == "none" then
                return
        elseif num > 0 then
                fpsCap = num
        else
                return notify("Invalid argument", "Please provide a number above 0 or 'none'.")
        end

        if setfpscap and type(setfpscap) == "function" then
                setfpscap(fpsCap)
        else
                fpscaploop = task.spawn(function()
                        local timer = os.clock()
                        while true do
                                if os.clock() >= timer + 1 / fpsCap then
                                        timer = os.clock()
                                        task.wait()
                                end
                        end
                end)
        end
end)

addcmd('notify',{},function(args, speaker)
        notify(getstring(1, args))
end)

addcmd('lastcommand',{'lastcmd'},function(args, speaker)
        if cmdHistory[1]:sub(1,11) ~= 'lastcommand' and cmdHistory[1]:sub(1,7) ~= 'lastcmd' then
                execCmd(cmdHistory[1])
        end
end)

addcmd('esp',{},function(args, speaker)
        if not CHMSenabled then
                ESPenabled = true
                for i,v in pairs(Players:GetPlayers()) do
                        if v.Name ~= speaker.Name then
                                ESP(v)
                        end
                end
        else
                notify('ESP','Disable chams (nochams) before using esp')
        end
end)

addcmd('espteam',{},function(args, speaker)
        if not CHMSenabled then
                ESPenabled = true
                for i,v in pairs(Players:GetPlayers()) do
                        if v.Name ~= speaker.Name then
                                ESP(v, true)
                        end
                end
        else
                notify('ESP','Disable chams (nochams) before using esp')
        end
end)

addcmd('noesp',{'unesp','unespteam'},function(args, speaker)
        ESPenabled = false
        for i,c in pairs(COREGUI:GetChildren()) do
                if string.sub(c.Name, -4) == '_ESP' then
                        c:Destroy()
                end
        end
end)

addcmd("esptransparency", {}, function(args, speaker)
    espTransparency = tonumber(args[1]) or 0.3
    if ESPenabled then execCmd("esp") end
    if CHMSenabled then execCmd("chams") end
    updatesaves()
end)

local espParts = {}
local partEspTrigger = nil
function partAdded(part)
        if #espParts > 0 then
                if FindInTable(espParts,part.Name:lower()) then
                        local a = Instance.new("BoxHandleAdornment")
                        a.Name = part.Name:lower().."_PESP"
                        a.Parent = part
                        a.Adornee = part
                        a.AlwaysOnTop = true
                        a.ZIndex = 0
                        a.Size = part.Size
                        a.Transparency = espTransparency
                        a.Color = BrickColor.new("Lime green")
                end
        else
                partEspTrigger:Disconnect()
                partEspTrigger = nil
        end
end

addcmd('partesp',{},function(args, speaker)
        local partEspName = getstring(1, args):lower()
        if not FindInTable(espParts,partEspName) then
                table.insert(espParts,partEspName)
                for i,v in pairs(workspace:GetDescendants()) do
                        if v:IsA("BasePart") and v.Name:lower() == partEspName then
                                local a = Instance.new("BoxHandleAdornment")
                                a.Name = partEspName.."_PESP"
                                a.Parent = v
                                a.Adornee = v
                                a.AlwaysOnTop = true
                                a.ZIndex = 0
                                a.Size = v.Size
                                a.Transparency = espTransparency
                                a.Color = BrickColor.new("Lime green")
                        end
                end
        end
        if partEspTrigger == nil then
                partEspTrigger = workspace.DescendantAdded:Connect(partAdded)
        end
end)

addcmd('unpartesp',{'nopartesp'},function(args, speaker)
        if args[1] then
                local partEspName = getstring(1, args):lower()
                if FindInTable(espParts,partEspName) then
                        table.remove(espParts, GetInTable(espParts, partEspName))
                end
                for i,v in pairs(workspace:GetDescendants()) do
                        if v:IsA("BoxHandleAdornment") and v.Name == partEspName..'_PESP' then
                                v:Destroy()
                        end
                end
        else
                partEspTrigger:Disconnect()
                partEspTrigger = nil
                espParts = {}
                for i,v in pairs(workspace:GetDescendants()) do
                        if v:IsA("BoxHandleAdornment") and v.Name:sub(-5) == '_PESP' then
                                v:Destroy()
                        end
                end
        end
end)

addcmd('chams',{},function(args, speaker)
        if not ESPenabled then
                CHMSenabled = true
                for i,v in pairs(Players:GetPlayers()) do
                        if v.Name ~= speaker.Name then
                                CHMS(v)
                        end
                end
        else
                notify('Chams','Disable ESP (noesp) before using chams')
        end
end)

addcmd('nochams',{'unchams'},function(args, speaker)
        CHMSenabled = false
        for i,v in pairs(Players:GetPlayers()) do
                local chmsplr = v
                for i,c in pairs(COREGUI:GetChildren()) do
                        if c.Name == chmsplr.Name..'_CHMS' then
                                c:Destroy()
                        end
                end
        end
end)

addcmd('locate',{},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players) do
                Locate(Players[v])
        end
end)

addcmd('nolocate',{'unlocate'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        if args[1] then
                for i,v in pairs(players) do
                        for i,c in pairs(COREGUI:GetChildren()) do
                                if c.Name == Players[v].Name..'_LC' then
                                        c:Destroy()
                                end
                        end
                end
        else
                for i,c in pairs(COREGUI:GetChildren()) do
                        if string.sub(c.Name, -3) == '_LC' then
                                c:Destroy()
                        end
                end
        end
end)

viewing = nil
addcmd('view',{'spectate'},function(args, speaker)
        StopFreecam()
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players) do
                if viewDied then
                        viewDied:Disconnect()
                        viewChanged:Disconnect()
                end
                viewing = Players[v]
                workspace.CurrentCamera.CameraSubject = viewing.Character
                notify('Spectate','Viewing ' .. Players[v].Name)
                local function viewDiedFunc()
                        repeat wait() until Players[v].Character ~= nil and getRoot(Players[v].Character)
                        workspace.CurrentCamera.CameraSubject = viewing.Character
                end
                viewDied = Players[v].CharacterAdded:Connect(viewDiedFunc)
                local function viewChangedFunc()
                        workspace.CurrentCamera.CameraSubject = viewing.Character
                end
                viewChanged = workspace.CurrentCamera:GetPropertyChangedSignal("CameraSubject"):Connect(viewChangedFunc)
        end
end)

addcmd('viewpart',{'viewp'},function(args, speaker)
        StopFreecam()
        if args[1] then
                for i,v in pairs(workspace:GetDescendants()) do
                        if v.Name:lower() == getstring(1, args):lower() and v:IsA("BasePart") then
                                wait(0.1)
                                workspace.CurrentCamera.CameraSubject = v
                        end
                end
        end
end)

addcmd('unview',{'unspectate'},function(args, speaker)
        StopFreecam()
        if viewing ~= nil then
                viewing = nil
                notify('Spectate','View turned off')
        end
        if viewDied then
                viewDied:Disconnect()
                viewChanged:Disconnect()
        end
        workspace.CurrentCamera.CameraSubject = speaker.Character
end)


fcRunning = false
Camera = workspace.CurrentCamera
workspace:GetPropertyChangedSignal("CurrentCamera"):Connect(function()
        local newCamera = workspace.CurrentCamera
        if newCamera then
                Camera = newCamera
        end
end)

local INPUT_PRIORITY = Enum.ContextActionPriority.High.Value

Spring = {} do
        Spring.__index = Spring

        function Spring.new(freq, pos)
                local self = setmetatable({}, Spring)
                self.f = freq
                self.p = pos
                self.v = pos*0
                return self
        end

        function Spring:Update(dt, goal)
                local f = self.f*2*math.pi
                local p0 = self.p
                local v0 = self.v

                local offset = goal - p0
                local decay = math.exp(-f*dt)

                local p1 = goal + (v0*dt - offset*(f*dt + 1))*decay
                local v1 = (f*dt*(offset*f - v0) + v0)*decay

                self.p = p1
                self.v = v1

                return p1
        end

        function Spring:Reset(pos)
                self.p = pos
                self.v = pos*0
        end
end

local cameraPos = Vector3.new()
local cameraRot = Vector2.new()

local velSpring = Spring.new(5, Vector3.new())
local panSpring = Spring.new(5, Vector2.new())

Input = {} do

        keyboard = {
                W = 0,
                A = 0,
                S = 0,
                D = 0,
                E = 0,
                Q = 0,
                Up = 0,
                Down = 0,
                LeftShift = 0,
        }

        mouse = {
                Delta = Vector2.new(),
        }

        NAV_KEYBOARD_SPEED = Vector3.new(1, 1, 1)
        PAN_MOUSE_SPEED = Vector2.new(1, 1)*(math.pi/64)
        NAV_ADJ_SPEED = 0.75
        NAV_SHIFT_MUL = 0.25

        navSpeed = 1

        function Input.Vel(dt)
                navSpeed = math.clamp(navSpeed + dt*(keyboard.Up - keyboard.Down)*NAV_ADJ_SPEED, 0.01, 4)

                local kKeyboard = Vector3.new(
                        keyboard.D - keyboard.A,
                        keyboard.E - keyboard.Q,
                        keyboard.S - keyboard.W
                )*NAV_KEYBOARD_SPEED

                local shift = UserInputService:IsKeyDown(Enum.KeyCode.LeftShift)

                return (kKeyboard)*(navSpeed*(shift and NAV_SHIFT_MUL or 1))
        end

        function Input.Pan(dt)
                local kMouse = mouse.Delta*PAN_MOUSE_SPEED
                mouse.Delta = Vector2.new()
                return kMouse
        end

        do
                function Keypress(action, state, input)
                        keyboard[input.KeyCode.Name] = state == Enum.UserInputState.Begin and 1 or 0
                        return Enum.ContextActionResult.Sink
                end

                function MousePan(action, state, input)
                        local delta = input.Delta
                        mouse.Delta = Vector2.new(-delta.y, -delta.x)
                        return Enum.ContextActionResult.Sink
                end

                function Zero(t)
                        for k, v in pairs(t) do
                                t[k] = v*0
                        end
                end

                function Input.StartCapture()
                        ContextActionService:BindActionAtPriority("FreecamKeyboard",Keypress,false,INPUT_PRIORITY,
                                Enum.KeyCode.W,
                                Enum.KeyCode.A,
                                Enum.KeyCode.S,
                                Enum.KeyCode.D,
                                Enum.KeyCode.E,
                                Enum.KeyCode.Q,
                                Enum.KeyCode.Up,
                                Enum.KeyCode.Down
                        )
                        ContextActionService:BindActionAtPriority("FreecamMousePan",MousePan,false,INPUT_PRIORITY,Enum.UserInputType.MouseMovement)
                end

                function Input.StopCapture()
                        navSpeed = 1
                        Zero(keyboard)
                        Zero(mouse)
                        ContextActionService:UnbindAction("FreecamKeyboard")
                        ContextActionService:UnbindAction("FreecamMousePan")
                end
        end
end

function GetFocusDistance(cameraFrame)
        local znear = 0.1
        local viewport = Camera.ViewportSize
        local projy = 2*math.tan(cameraFov/2)
        local projx = viewport.x/viewport.y*projy
        local fx = cameraFrame.rightVector
        local fy = cameraFrame.upVector
        local fz = cameraFrame.lookVector

        local minVect = Vector3.new()
        local minDist = 512

        for x = 0, 1, 0.5 do
                for y = 0, 1, 0.5 do
                        local cx = (x - 0.5)*projx
                        local cy = (y - 0.5)*projy
                        local offset = fx*cx - fy*cy + fz
                        local origin = cameraFrame.p + offset*znear
                        local _, hit = workspace:FindPartOnRay(Ray.new(origin, offset.unit*minDist))
                        local dist = (hit - origin).magnitude
                        if minDist > dist then
                                minDist = dist
                                minVect = offset.unit
                        end
                end
        end

        return fz:Dot(minVect)*minDist
end

local function StepFreecam(dt)
        local vel = velSpring:Update(dt, Input.Vel(dt))
        local pan = panSpring:Update(dt, Input.Pan(dt))

        local zoomFactor = math.sqrt(math.tan(math.rad(70/2))/math.tan(math.rad(cameraFov/2)))

        cameraRot = cameraRot + pan*Vector2.new(0.75, 1)*8*(dt/zoomFactor)
        cameraRot = Vector2.new(math.clamp(cameraRot.x, -math.rad(90), math.rad(90)), cameraRot.y%(2*math.pi))

        local cameraCFrame = CFrame.new(cameraPos)*CFrame.fromOrientation(cameraRot.x, cameraRot.y, 0)*CFrame.new(vel*Vector3.new(1, 1, 1)*64*dt)
        cameraPos = cameraCFrame.p

        Camera.CFrame = cameraCFrame
        Camera.Focus = cameraCFrame*CFrame.new(0, 0, -GetFocusDistance(cameraCFrame))
        Camera.FieldOfView = cameraFov
end

local PlayerState = {} do
        mouseBehavior = ""
        mouseIconEnabled = ""
        cameraType = ""
        cameraFocus = ""
        cameraCFrame = ""
        cameraFieldOfView = ""

        function PlayerState.Push()
                cameraFieldOfView = Camera.FieldOfView
                Camera.FieldOfView = 70

                cameraType = Camera.CameraType
                Camera.CameraType = Enum.CameraType.Custom

                cameraCFrame = Camera.CFrame
                cameraFocus = Camera.Focus

                mouseIconEnabled = UserInputService.MouseIconEnabled
                UserInputService.MouseIconEnabled = true

                mouseBehavior = UserInputService.MouseBehavior
                UserInputService.MouseBehavior = Enum.MouseBehavior.Default
        end

        function PlayerState.Pop()
                Camera.FieldOfView = 70

                Camera.CameraType = cameraType
                cameraType = nil

                Camera.CFrame = cameraCFrame
                cameraCFrame = nil

                Camera.Focus = cameraFocus
                cameraFocus = nil

                UserInputService.MouseIconEnabled = mouseIconEnabled
                mouseIconEnabled = nil

                UserInputService.MouseBehavior = mouseBehavior
                mouseBehavior = nil
        end
end

function StartFreecam(pos)
        if fcRunning then
                StopFreecam()
        end
        local cameraCFrame = Camera.CFrame
        if pos then
                cameraCFrame = pos
        end
        cameraRot = Vector2.new()
        cameraPos = cameraCFrame.p
        cameraFov = Camera.FieldOfView

        velSpring:Reset(Vector3.new())
        panSpring:Reset(Vector2.new())

        PlayerState.Push()
        RunService:BindToRenderStep("Freecam", Enum.RenderPriority.Camera.Value, StepFreecam)
        Input.StartCapture()
        fcRunning = true
end

function StopFreecam()
        if not fcRunning then return end
        Input.StopCapture()
        RunService:UnbindFromRenderStep("Freecam")
        PlayerState.Pop()
        workspace.Camera.FieldOfView = 70
        fcRunning = false
end

addcmd('freecam',{'fc'},function(args, speaker)
        StartFreecam()
end)

addcmd('freecampos',{'fcpos','fcp','freecamposition','fcposition'},function(args, speaker)
        if not args[1] then return end
        local freecamPos = CFrame.new(args[1],args[2],args[3])
        StartFreecam(freecamPos)
end)

addcmd('freecamwaypoint',{'fcwp'},function(args, speaker)
        local WPName = tostring(getstring(1, args))
        if speaker.Character then
                for i,_ in pairs(WayPoints) do
                        local x = WayPoints[i].COORD[1]
                        local y = WayPoints[i].COORD[2]
                        local z = WayPoints[i].COORD[3]
                        if tostring(WayPoints[i].NAME):lower() == tostring(WPName):lower() then
                                StartFreecam(CFrame.new(x,y,z))
                        end
                end
                for i,_ in pairs(pWayPoints) do
                        if tostring(pWayPoints[i].NAME):lower() == tostring(WPName):lower() then
                                StartFreecam(CFrame.new(pWayPoints[i].COORD[1].Position))
                        end
                end
        end
end)

addcmd('freecamgoto',{'fcgoto','freecamtp','fctp'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players) do
                StartFreecam(getRoot(Players[v].Character).CFrame)
        end
end)

addcmd('unfreecam',{'nofreecam','unfc','nofc'},function(args, speaker)
        StopFreecam()
end)

addcmd('freecamspeed',{'fcspeed'},function(args, speaker)
        local FCspeed = args[1] or 1
        if isNumber(FCspeed) then
                NAV_KEYBOARD_SPEED = Vector3.new(FCspeed, FCspeed, FCspeed)
        end
end)

addcmd('notifyfreecamposition',{'notifyfcpos'},function(args, speaker)
        if fcRunning then
                local X,Y,Z = workspace.CurrentCamera.CFrame.Position.X,workspace.CurrentCamera.CFrame.Position.Y,workspace.CurrentCamera.CFrame.Position.Z
                local Format, Round = string.format, math.round
                notify("Current Position", Format("%s, %s, %s", Round(X), Round(Y), Round(Z)))
        end
end)

addcmd('copyfreecamposition',{'copyfcpos'},function(args, speaker)
        if fcRunning then
                local X,Y,Z = workspace.CurrentCamera.CFrame.Position.X,workspace.CurrentCamera.CFrame.Position.Y,workspace.CurrentCamera.CFrame.Position.Z
                local Format, Round = string.format, math.round
                toClipboard(Format("%s, %s, %s", Round(X), Round(Y), Round(Z)))
        end
end)

addcmd('gotocamera',{'gotocam','tocam'},function(args, speaker)
        getRoot(speaker.Character).CFrame = workspace.Camera.CFrame
end)

addcmd('tweengotocamera',{'tweengotocam','tgotocam','ttocam'},function(args, speaker)
        TweenService:Create(getRoot(speaker.Character), TweenInfo.new(tweenSpeed, Enum.EasingStyle.Linear), {CFrame = workspace.Camera.CFrame}):Play()
end)

addcmd('fov',{},function(args, speaker)
        local fov = args[1] or 70
        if isNumber(fov) then
                workspace.CurrentCamera.FieldOfView = fov
        end
end)

local preMaxZoom = Players.LocalPlayer.CameraMaxZoomDistance
local preMinZoom = Players.LocalPlayer.CameraMinZoomDistance
addcmd('lookat',{},function(args, speaker)
        if speaker.CameraMaxZoomDistance ~= 0.5 then
                preMaxZoom = speaker.CameraMaxZoomDistance
                preMinZoom = speaker.CameraMinZoomDistance
        end
        speaker.CameraMaxZoomDistance = 0.5
        speaker.CameraMinZoomDistance = 0.5
        wait()
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players) do
                local target = Players[v].Character
                if target and target:FindFirstChild('Head') then
                        workspace.CurrentCamera.CFrame = CFrame.new(workspace.CurrentCamera.CFrame.p, target.Head.CFrame.p)
                        wait(0.1)
                end
        end
        speaker.CameraMaxZoomDistance = preMaxZoom
        speaker.CameraMinZoomDistance = preMinZoom
end)

addcmd('fixcam',{'restorecam'},function(args, speaker)
        StopFreecam()
        execCmd('unview')
        workspace.CurrentCamera:remove()
        wait(.1)
        repeat wait() until speaker.Character ~= nil
        workspace.CurrentCamera.CameraSubject = speaker.Character:FindFirstChildWhichIsA('Humanoid')
        workspace.CurrentCamera.CameraType = "Custom"
        speaker.CameraMinZoomDistance = 0.5
        speaker.CameraMaxZoomDistance = 400
        speaker.CameraMode = "Classic"
        speaker.Character.Head.Anchored = false
end)

addcmd("enableshiftlock", {"enablesl", "shiftlock"}, function(args, speaker)
        local function enableShiftlock() 
                speaker.DevEnableMouseLock = true 
        end
        speaker:GetPropertyChangedSignal("DevEnableMouseLock"):Connect(enableShiftlock)
        enableShiftlock()
        notify("Shiftlock", "Shift lock should now be available")
end)

addcmd('firstp',{},function(args, speaker)
        speaker.CameraMode = "LockFirstPerson"
end)

addcmd('thirdp',{},function(args, speaker)
        speaker.CameraMode = "Classic"
end)

addcmd('noclipcam', {'nccam'}, function(args, speaker)
        local sc = (debug and debug.setconstant) or setconstant
        local gc = (debug and debug.getconstants) or getconstants
        if not sc or not getgc or not gc then
                return notify('Incompatible Exploit', 'Your exploit does not support this command (missing setconstant or getconstants or getgc)')
        end
        local pop = speaker.PlayerScripts.PlayerModule.CameraModule.ZoomController.Popper
        for _, v in pairs(getgc()) do
                if type(v) == 'function' and getfenv(v).script == pop then
                        for i, v1 in pairs(gc(v)) do
                                if tonumber(v1) == .25 then
                                        sc(v, i, 0)
                                elseif tonumber(v1) == 0 then
                                        sc(v, i, .25)
                                end
                        end
                end
        end
end)

addcmd('maxzoom',{},function(args, speaker)
        speaker.CameraMaxZoomDistance = args[1]
end)

addcmd('minzoom',{},function(args, speaker)
        speaker.CameraMinZoomDistance = args[1]
end)

addcmd('camdistance',{},function(args, speaker)
        local camMax = speaker.CameraMaxZoomDistance
        local camMin = speaker.CameraMinZoomDistance
        if camMax < tonumber(args[1]) then
                camMax = args[1]
        end
        speaker.CameraMaxZoomDistance = args[1]
        speaker.CameraMinZoomDistance = args[1]
        wait()
        speaker.CameraMaxZoomDistance = camMax
        speaker.CameraMinZoomDistance = camMin
end)

addcmd('unlockws',{'unlockworkspace'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v:IsA("BasePart") then
                        v.Locked = false
                end
        end
end)

addcmd('lockws',{'lockworkspace'},function(args, speaker) 
        for i,v in pairs(workspace:GetDescendants()) do
                if v:IsA("BasePart") then
                        v.Locked = true
                end
        end
end)

addcmd('delete',{'remove'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v.Name:lower() == getstring(1, args):lower() then
                        v:Destroy()
                end
        end
        notify('Item(s) Deleted','Deleted ' ..getstring(1, args))
end)

addcmd('deleteclass',{'removeclass','deleteclassname','removeclassname','dc'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v.ClassName:lower() == getstring(1, args):lower() then
                        v:Destroy()
                end
        end
        notify('Item(s) Deleted','Deleted items with ClassName ' ..getstring(1, args))
end)

addcmd('chardelete',{'charremove','cd'},function(args, speaker)
        for i,v in pairs(speaker.Character:GetDescendants()) do
                if v.Name:lower() == getstring(1, args):lower() then
                        v:Destroy()
                end
        end
        notify('Item(s) Deleted','Deleted ' ..getstring(1, args))
end)

addcmd('chardeleteclass',{'charremoveclass','chardeleteclassname','charremoveclassname','cdc'},function(args, speaker)
        for i,v in pairs(speaker.Character:GetDescendants()) do
                if v.ClassName:lower() == getstring(1, args):lower() then
                        v:Destroy()
                end
        end
        notify('Item(s) Deleted','Deleted items with ClassName ' ..getstring(1, args))
end)

addcmd('deletevelocity',{'dv','removevelocity','removeforces'},function(args, speaker)
        for i,v in pairs(speaker.Character:GetDescendants()) do
                if v:IsA("BodyVelocity") or v:IsA("BodyGyro") or v:IsA("RocketPropulsion") or v:IsA("BodyThrust") or v:IsA("BodyAngularVelocity") or v:IsA("AngularVelocity") or v:IsA("BodyForce") or v:IsA("VectorForce") or v:IsA("LineForce") then
                        v:Destroy()
                end
        end
end)

addcmd('deleteinvisparts',{'deleteinvisibleparts','dip'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v:IsA("BasePart") and v.Transparency == 1 and v.CanCollide then
                        v:Destroy()
                end
        end
end)

local shownParts = {}
addcmd('invisibleparts',{'invisparts'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v:IsA("BasePart") and v.Transparency == 1 then
                        if not table.find(shownParts,v) then
                                table.insert(shownParts,v)
                        end
                        v.Transparency = 0
                end
        end
end)

addcmd('uninvisibleparts',{'uninvisparts'},function(args, speaker)
        for i,v in pairs(shownParts) do
                v.Transparency = 1
        end
        shownParts = {}
end)

addcmd("btools", {}, function(args, speaker)
        for i = 1, 4 do
                local Tool = Instance.new("HopperBin")
                Tool.BinType = i
                Tool.Name = randomString()
                Tool.Parent = speaker:FindFirstChildWhichIsA("Backpack")
        end
end)

addcmd("f3x", {"fex"}, function(args, speaker)
        loadstring(game:HttpGet("https://raw.githubusercontent.com/infyiff/backup/refs/heads/main/f3x.lua"))()
end)

addcmd("partpath", {"partname"}, function(args, speaker)
        selectPart()
end)

addcmd("antiafk", {"antiidle"}, function(args, speaker)
        if getconnections then
                for _, connection in pairs(getconnections(speaker.Idled)) do
                        if connection["Disable"] then
                                connection["Disable"](connection)
                        elseif connection["Disconnect"] then
                                connection["Disconnect"](connection)
                        end
                end
        else
                speaker.Idled:Connect(function()
                        Services.VirtualUser:CaptureController()
                        Services.VirtualUser:ClickButton2(Vector2.new())
                end)
        end
        if not (args[1] and tostring(args[1]) == "nonotify") then notify("Anti Idle", "Anti idle is enabled") end
end)

addcmd("datalimit", {}, function(args, speaker)
        local kbps = tonumber(args[1])
        if kbps then
                Services.NetworkClient:SetOutgoingKBPSLimit(kbps)
        end
end)

addcmd("replicationlag", {"backtrack"}, function(args, speaker)
        if tonumber(args[1]) then
                settings():GetService("NetworkSettings").IncomingReplicationLag = args[1]
        end
end)

addcmd("noprompts", {"nopurchaseprompts"}, function(args, speaker)
        COREGUI.PurchasePromptApp.Enabled = false
end)

addcmd("showprompts", {"showpurchaseprompts"}, function(args, speaker)
        COREGUI.PurchasePromptApp.Enabled = true
end)

promptNewRig = function(speaker, rig)
        local humanoid = speaker.Character:FindFirstChildWhichIsA("Humanoid")
        if humanoid then
                AvatarEditorService:PromptSaveAvatar(humanoid.HumanoidDescription, Enum.HumanoidRigType[rig])
                local result = AvatarEditorService.PromptSaveAvatarCompleted:Wait()
                if result == Enum.AvatarPromptResult.Success then
                        execCmd("reset")
                end
        end
end

addcmd("promptr6", {}, function(args, speaker)
        promptNewRig(speaker, "R6")
end)

addcmd("promptr15", {}, function(args, speaker)
        promptNewRig(speaker, "R15")
end)

addcmd("wallwalk", {"walkonwalls"}, function(args, speaker)
        loadstring(game:HttpGet("https://raw.githubusercontent.com/infyiff/backup/main/wallwalker.lua"))()
end)

addcmd('age',{},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        local ages = {}
        for i,v in pairs(players) do
                local p = Players[v]
                table.insert(ages, p.Name.."'s age is: "..p.AccountAge)
        end
        notify('Account Age',table.concat(ages, ',\n'))
end)

addcmd('chatage',{},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        local ages = {}
        for i,v in pairs(players) do
                local p = Players[v]
                table.insert(ages, p.Name.."'s age is: "..p.AccountAge)
        end
        local chatString = table.concat(ages, ', ')
        chatMessage(chatString)
end)

addcmd('joindate',{'jd'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        local dates = {}
        for i,v in pairs(players) do
                local p = Players[v]

                local secondsOld = p.AccountAge * 24 * 60 * 60
                local now = os.time()
                local dateJoined  = p.Name .. " joined: " .. os.date("%m/%d/%y", now - secondsOld)

                table.insert(dates, dateJoined)
        end
        notify('Join Date (Month/Day/Year)',table.concat(dates, ',\n'))
end)

addcmd('chatjoindate',{'cjd'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        local dates = {}
        for i,v in pairs(players) do
                local p = Players[v]

                local secondsOld = p.AccountAge * 24 * 60 * 60
                local now = os.time()
                local dateJoined  = p.Name .. " joined: " .. os.date("%m/%d/%y", now - secondsOld)

                table.insert(dates, dateJoined)
        end
        local chatString = table.concat(dates, ', ')
        chatMessage(chatString)
end)

addcmd('copyname',{'copyuser'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players) do
                local name = tostring(Players[v].Name)
                toClipboard(name)
        end
end)

addcmd('userid',{'id'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players) do
                local id = tostring(Players[v].UserId)
                notify('User ID',id)
        end
end)

addcmd("copyplaceid", {"placeid"}, function(args, speaker)
        toClipboard(PlaceId)
end)

addcmd("copygameid", {"gameid"}, function(args, speaker)
        toClipboard(game.GameId)
end)

addcmd('copyid',{'copyuserid'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players) do
                local id = tostring(Players[v].UserId)
                toClipboard(id)
        end
end)

addcmd('creatorid',{'creator'},function(args, speaker)
        if game.CreatorType == Enum.CreatorType.User then
                notify('Creator ID',game.CreatorId)
        elseif game.CreatorType == Enum.CreatorType.Group then
                local OwnerID = GroupService:GetGroupInfoAsync(game.CreatorId).Owner.Id
                speaker.UserId = OwnerID
                notify('Creator ID',OwnerID)
        end
end)

addcmd('copycreatorid',{'copycreator'},function(args, speaker)
        if game.CreatorType == Enum.CreatorType.User then
                toClipboard(game.CreatorId)
                notify('Copied ID','Copied creator ID to clipboard')
        elseif game.CreatorType == Enum.CreatorType.Group then
                local OwnerID = GroupService:GetGroupInfoAsync(game.CreatorId).Owner.Id
                toClipboard(OwnerID)
                notify('Copied ID','Copied creator ID to clipboard')
        end
end)

addcmd('setcreatorid',{'setcreator'},function(args, speaker)
        if game.CreatorType == Enum.CreatorType.User then
                speaker.UserId = game.CreatorId
                notify('Set ID','Set UserId to '..game.CreatorId)
        elseif game.CreatorType == Enum.CreatorType.Group then
                local OwnerID = GroupService:GetGroupInfoAsync(game.CreatorId).Owner.Id
                speaker.UserId = OwnerID
                notify('Set ID','Set UserId to '..OwnerID)
        end
end)

addcmd('appearanceid',{'aid'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players) do
                local aid = tostring(Players[v].CharacterAppearanceId)
                notify('Appearance ID',aid)
        end
end)

addcmd('copyappearanceid',{'caid'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players) do
                local aid = tostring(Players[v].CharacterAppearanceId)
                toClipboard(aid)
        end
end)

addcmd('norender',{},function(args, speaker)
        RunService:Set3dRenderingEnabled(false)
end)

addcmd('render',{},function(args, speaker)
        RunService:Set3dRenderingEnabled(true)
end)

addcmd('2022materials',{'use2022materials'},function(args, speaker)
        if sethidden then
                sethidden(MaterialService, "Use2022Materials", true)
        else
                notify('Incompatible Exploit','Your exploit does not support this command (missing sethiddenproperty)')
        end
end)

addcmd('un2022materials',{'unuse2022materials'},function(args, speaker)
        if sethidden then
                sethidden(MaterialService, "Use2022Materials", false)
        else
                notify('Incompatible Exploit','Your exploit does not support this command (missing sethiddenproperty)')
        end
end)

addcmd("goto", {"to"}, function(args, speaker)
    local character = speaker and speaker.Character
    local humanoid = character and character:FindFirstChildWhichIsA("Humanoid")
    local players = getPlayer(args[1], speaker)
    for _, v in pairs(players) do
        if Players[v].Character ~= nil then
            if humanoid and humanoid.SeatPart then
                humanoid.Sit = false
                task.wait(0.1)
            end
            getRoot(speaker.Character).CFrame = getRoot(Players[v].Character):GetPivot() + Vector3.new(3, 1, 0)
        end
    end
    execCmd("breakvelocity")
end)

addcmd("tweengoto", {"tgoto", "tto", "tweento"}, function(args, speaker)
    local character = speaker and speaker.Character
    local humanoid = character and character:FindFirstChildWhichIsA("Humanoid")

    local oldState = humanoid and humanoid:GetStateEnabled(Enum.HumanoidStateType.Seated)
    if humanoid then humanoid:SetStateEnabled(Enum.HumanoidStateType.Seated, false) end

    local players = getPlayer(args[1], speaker)
    for _, v in pairs(players) do
        if Players[v].Character ~= nil then
            if humanoid and humanoid.SeatPart then
                humanoid.Sit = false
                task.wait(0.1)
            end
            TweenService:Create(getRoot(speaker.Character), TweenInfo.new(tweenSpeed, Enum.EasingStyle.Linear), {
                CFrame = getRoot(Players[v].Character):GetPivot() + Vector3.new(3, 1, 0)
            }):Play()
        end
    end
    execCmd("breakvelocity")

    if type(oldState) == "boolean" then
        humanoid:SetStateEnabled(Enum.HumanoidStateType.Seated, oldState)
    end
end)

addcmd('vehiclegoto',{'vgoto','vtp','vehicletp'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                if Players[v].Character ~= nil then
                        local seat = speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart
                        local vehicleModel = seat:FindFirstAncestorWhichIsA("Model")
                        vehicleModel:MoveTo(getRoot(Players[v].Character).Position)
                end
        end
end)

addcmd('pulsetp',{'ptp'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                if Players[v].Character ~= nil then
                        local startPos = getRoot(speaker.Character).CFrame
                        local seconds = args[2] or 1
                        if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                wait(.1)
                        end
                        getRoot(speaker.Character).CFrame = getRoot(Players[v].Character).CFrame + Vector3.new(3,1,0)
                        wait(seconds)
                        getRoot(speaker.Character).CFrame = startPos
                end
        end
        execCmd('breakvelocity')
end)

local vnoclipParts = {}
addcmd('vehiclenoclip',{'vnoclip'},function(args, speaker)
        vnoclipParts = {}
        local seat = speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart
        local vehicleModel = seat.Parent
        repeat
                if vehicleModel.ClassName ~= "Model" then
                        vehicleModel = vehicleModel.Parent
                end
        until vehicleModel.ClassName == "Model"
        wait(0.1)
        execCmd('noclip')
        for i,v in pairs(vehicleModel:GetDescendants()) do
                if v:IsA("BasePart") and v.CanCollide then
                        table.insert(vnoclipParts,v)
                        v.CanCollide = false
                end
        end
end)

addcmd("vehicleclip", {"vclip", "unvnoclip", "unvehiclenoclip"}, function(args, speaker)
        execCmd("clip")
        for i, v in pairs(vnoclipParts) do
                v.CanCollide = true
        end
        vnoclipParts = {}
end)

addcmd("togglevnoclip", {}, function(args, speaker)
        execCmd(Clip and "vnoclip" or "vclip")
end)

addcmd('clientbring',{'cbring'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                if Players[v].Character ~= nil then
                        if Players[v].Character:FindFirstChildOfClass('Humanoid') then
                                Players[v].Character:FindFirstChildOfClass('Humanoid').Sit = false
                        end
                        wait()
                        getRoot(Players[v].Character).CFrame = getRoot(speaker.Character).CFrame + Vector3.new(3,1,0)
                end
        end
end)

local bringT = {}
addcmd('loopbring',{},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                task.spawn(function()
                        if Players[v].Name ~= speaker.Name and not FindInTable(bringT, Players[v].Name) then
                                table.insert(bringT, Players[v].Name)
                                local plrName = Players[v].Name
                                local pchar=Players[v].Character
                                local distance = 3
                                if args[2] and isNumber(args[2]) then
                                        distance = args[2]
                                end
                                local lDelay = 0
                                if args[3] and isNumber(args[3]) then
                                        lDelay = args[3]
                                end
                                repeat
                                        for i,c in pairs(players) do
                                                if Players:FindFirstChild(v) then
                                                        pchar = Players[v].Character
                                                        if pchar~= nil and Players[v].Character ~= nil and getRoot(pchar) and speaker.Character ~= nil and getRoot(speaker.Character) then
                                                                getRoot(pchar).CFrame = getRoot(speaker.Character).CFrame + Vector3.new(distance,1,0)
                                                        end
                                                        wait(lDelay)
                                                else 
                                                        for a,b in pairs(bringT) do if b == plrName then table.remove(bringT, a) end end
                                                end
                                        end
                                until not FindInTable(bringT, plrName)
                        end
                end)
        end
end)

addcmd('unloopbring',{'noloopbring'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                task.spawn(function()
                        for a,b in pairs(bringT) do if b == Players[v].Name then table.remove(bringT, a) end end
                end)
        end
end)

-- ======================== LOOP CLIENT BRING ALL ========================
-- Brings ALL players to you every 0.2 seconds
loopcbringActive = false
loopcbringConn = nil

addcmd('loopcbring', {}, function(args, speaker)
        if loopcbringActive then
                loopcbringActive = false
                if loopcbringConn then loopcbringConn:Disconnect() loopcbringConn = nil end
                notify('Loop CBring', 'Stopped')
                return
        end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('Loop CBring', 'Character not found') return end

        loopcbringActive = true
        notify('Loop CBring', 'Active! Bringing all every 0.2s')

        loopcbringConn = RunService.Heartbeat:Connect(function(dt)
                if not loopcbringActive then return end
                task.wait(0.2)
                if not loopcbringActive then return end
                local myRoot = getRoot(speaker.Character)
                if not myRoot then return end
                for _, plr in pairs(Players:GetPlayers()) do
                        if plr ~= speaker and plr.Character and plr.Character:FindFirstChildWhichIsA('Humanoid') then
                                pcall(function()
                                        plr.Character:FindFirstChildWhichIsA('Humanoid').Sit = false
                                end)
                                local pRoot = getRoot(plr.Character)
                                if pRoot then
                                        pcall(function()
                                                pRoot.CFrame = myRoot.CFrame + Vector3.new(3, 1, 0)
                                        end)
                                end
                        end
                end
        end)
end)

walkto = false
local waypointwalkto = false
addcmd('walkto',{'follow'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                if Players[v].Character ~= nil then
                        if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                wait(.1)
                        end
                        walkto = true
                        repeat wait()
                                speaker.Character:FindFirstChildOfClass('Humanoid'):MoveTo(getRoot(Players[v].Character).Position)
                        until Players[v].Character == nil or not getRoot(Players[v].Character) or walkto == false
                end
        end
end)

addcmd('pathfindwalkto',{'pathfindfollow'},function(args, speaker)
        walkto = false
        wait()
        local players = getPlayer(args[1], speaker)
        local hum = Players.LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
        local path = PathService:CreatePath()
        for i,v in pairs(players)do
                if Players[v].Character ~= nil then
                        if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                wait(.1)
                        end
                        walkto = true
                        repeat wait()
                                local success, response = pcall(function()
                                        path:ComputeAsync(getRoot(speaker.Character).Position, getRoot(Players[v].Character).Position)
                                        local waypoints = path:GetWaypoints()
                                        local distance 
                                        for waypointIndex, waypoint in pairs(waypoints) do
                                                local waypointPosition = waypoint.Position
                                                hum:MoveTo(waypointPosition)
                                                repeat 
                                                        distance = (waypointPosition - hum.Parent.PrimaryPart.Position).magnitude
                                                        wait()
                                                until
                                                distance <= 5
                                        end      
                                end)
                                if not success then
                                        speaker.Character:FindFirstChildOfClass('Humanoid'):MoveTo(getRoot(Players[v].Character).Position)
                                end
                        until Players[v].Character == nil or not getRoot(Players[v].Character) or walkto == false
                end
        end
end)

addcmd('pathfindwalktowaypoint',{'pathfindwalktowp'},function(args, speaker)
        waypointwalkto = false
        wait()
        local WPName = tostring(getstring(1, args))
        local hum = Players.LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
        local path = PathService:CreatePath()
        if speaker.Character then
                for i,_ in pairs(WayPoints) do
                        if tostring(WayPoints[i].NAME):lower() == tostring(WPName):lower() then
                                if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                        speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                        wait(.1)
                                end
                                local TrueCoords = Vector3.new(WayPoints[i].COORD[1], WayPoints[i].COORD[2], WayPoints[i].COORD[3])
                                waypointwalkto = true
                                repeat wait()
                                        local success, response = pcall(function()
                                                path:ComputeAsync(getRoot(speaker.Character).Position, TrueCoords)
                                                local waypoints = path:GetWaypoints()
                                                local distance 
                                                for waypointIndex, waypoint in pairs(waypoints) do
                                                        local waypointPosition = waypoint.Position
                                                        hum:MoveTo(waypointPosition)
                                                        repeat 
                                                                distance = (waypointPosition - hum.Parent.PrimaryPart.Position).magnitude
                                                                wait()
                                                        until
                                                        distance <= 5
                                                end
                                        end)
                                        if not success then
                                                speaker.Character:FindFirstChildOfClass('Humanoid'):MoveTo(TrueCoords)
                                        end
                                until not speaker.Character or waypointwalkto == false
                        end
                end
                for i,_ in pairs(pWayPoints) do
                        if tostring(pWayPoints[i].NAME):lower() == tostring(WPName):lower() then
                                if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                        speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                        wait(.1)
                                end
                                local TrueCoords = pWayPoints[i].COORD[1].Position
                                waypointwalkto = true
                                repeat wait()
                                        local success, response = pcall(function()
                                                path:ComputeAsync(getRoot(speaker.Character).Position, TrueCoords)
                                                local waypoints = path:GetWaypoints()
                                                local distance 
                                                for waypointIndex, waypoint in pairs(waypoints) do
                                                        local waypointPosition = waypoint.Position
                                                        hum:MoveTo(waypointPosition)
                                                        repeat 
                                                                distance = (waypointPosition - hum.Parent.PrimaryPart.Position).magnitude
                                                                wait()
                                                        until
                                                        distance <= 5
                                                end
                                        end)
                                        if not success then
                                                speaker.Character:FindFirstChildOfClass('Humanoid'):MoveTo(TrueCoords)
                                        end
                                until not speaker.Character or waypointwalkto == false
                        end
                end
        end
end)

addcmd('unwalkto',{'nowalkto','unfollow','nofollow'},function(args, speaker)
        walkto = false
        waypointwalkto = false
        pathfindflyActive = false
end)

-- pathfindflyto: fly up to escape walls/boxes, then pathfind to target player
local pathfindflyActive = false
addcmd('pathfindflyto',{'pfflyto'},function(args, speaker)
        pathfindflyActive = false
        wait()
        local players = getPlayer(args[1], speaker)
        local flyHeight = tonumber(args[2]) or 150
        local hum = Players.LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
        local root = getRoot(speaker.Character)
        if not hum or not root then return notify('PathfindFly', 'Character not found') end
        pathfindflyActive = true
        for i,v in pairs(players) do
                if pathfindflyActive == false then break end
                if Players[v].Character ~= nil and getRoot(Players[v].Character) then
                        -- Unsit if seated
                        if hum.SeatPart then hum.Sit = false wait(.1) end
                        notify('PathfindFly', 'Flying up ' .. flyHeight .. ' studs to escape obstacles...')
                        -- Step 1: Fly straight up to escape obstacles
                        local targetPos = root.Position
                        local upTarget = targetPos + Vector3.new(0, flyHeight, 0)
                        local BV = Instance.new('BodyVelocity')
                        local BG = Instance.new('BodyGyro')
                        BV.MaxForce = Vector3.new(9e9, 9e9, 9e9)
                        BV.Velocity = Vector3.new(0, 200, 0)
                        BV.Parent = root
                        BG.MaxTorque = Vector3.new(9e9, 9e9, 9e9)
                        BG.CFrame = root.CFrame
                        BG.Parent = root
                        -- Wait until we reach the target height
                        repeat task.wait()
                                if pathfindflyActive == false then
                                        BV:Destroy() BG:Destroy()
                                        return
                                end
                        until root.Position.Y >= upTarget.Y or not root
                        BV:Destroy()
                        BG:Destroy()
                        task.wait(0.2)
                        -- Step 2: Pathfind to target player
                        local path = PathService:CreatePath()
                        repeat task.wait()
                                if pathfindflyActive == false then break end
                                local success, errMsg = pcall(function()
                                        path:ComputeAsync(root.Position, getRoot(Players[v].Character).Position)
                                        local waypoints = path:GetWaypoints()
                                        local distance
                                        for waypointIndex, waypoint in pairs(waypoints) do
                                                if pathfindflyActive == false then break end
                                                local waypointPosition = waypoint.Position
                                                hum:MoveTo(waypointPosition)
                                                repeat
                                                        distance = (waypointPosition - root.Position).magnitude
                                                        task.wait()
                                                until distance <= 5 or pathfindflyActive == false
                                        end
                                end)
                                if not success then
                                        hum:MoveTo(getRoot(Players[v].Character).Position)
                                end
                        until Players[v].Character == nil or not getRoot(Players[v].Character) or pathfindflyActive == false
                end
        end
        pathfindflyActive = false
end)

-- pathfindflytowp: fly up to escape obstacles, then pathfind to waypoint
addcmd('pathfindflytowp',{'pfflytowp'},function(args, speaker)
        pathfindflyActive = false
        wait()
        local flyHeight = 150
        local WPName = ""
        -- Parse: pathfindflytowp <name> [height]
        -- Check if last arg is a number (height)
        if args[2] and isNumber(args[2]) then
                flyHeight = tonumber(args[2])
                WPName = tostring(getstring(1, args))
        elseif args[1] then
                -- Try to extract a trailing number from the joined string
                local joined = table.concat(args, ' ')
                local namePart, heightPart = joined:match('^(.-)%s+(%d+)$')
                if namePart and heightPart then
                        WPName = namePart
                        flyHeight = tonumber(heightPart)
                else
                        WPName = joined
                end
        end
        local hum = Players.LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
        local root = getRoot(speaker.Character)
        if not hum or not root then return notify('PathfindFly', 'Character not found') end
        pathfindflyActive = true
        -- Search in WayPoints
        local foundWP = false
        local TrueCoords = nil
        for i,_ in pairs(WayPoints) do
                if tostring(WayPoints[i].NAME):lower() == WPName:lower() then
                        TrueCoords = Vector3.new(WayPoints[i].COORD[1], WayPoints[i].COORD[2], WayPoints[i].COORD[3])
                        foundWP = true
                        break
                end
        end
        -- Search in pWayPoints if not found
        if not foundWP then
                for i,_ in pairs(pWayPoints) do
                        if tostring(pWayPoints[i].NAME):lower() == WPName:lower() then
                                TrueCoords = pWayPoints[i].COORD[1].Position
                                foundWP = true
                                break
                        end
                end
        end
        if not foundWP or not TrueCoords then
                pathfindflyActive = false
                return notify('PathfindFly', 'Waypoint "' .. tostring(getstring(1, args)) .. '" not found')
        end
        -- Unsit if seated
        if hum.SeatPart then hum.Sit = false wait(.1) end
        -- Step 1: Fly straight up
        local upTarget = root.Position + Vector3.new(0, flyHeight, 0)
        local BV = Instance.new('BodyVelocity')
        local BG = Instance.new('BodyGyro')
        BV.MaxForce = Vector3.new(9e9, 9e9, 9e9)
        BV.Velocity = Vector3.new(0, 200, 0)
        BV.Parent = root
        BG.MaxTorque = Vector3.new(9e9, 9e9, 9e9)
        BG.CFrame = root.CFrame
        BG.Parent = root
        repeat task.wait()
                if pathfindflyActive == false then BV:Destroy() BG:Destroy() return end
        until root.Position.Y >= upTarget.Y or not root
        BV:Destroy()
        BG:Destroy()
        task.wait(0.2)
        -- Step 2: Pathfind to waypoint
        local path = PathService:CreatePath()
        repeat task.wait()
                if pathfindflyActive == false then break end
                local success, errMsg = pcall(function()
                        path:ComputeAsync(root.Position, TrueCoords)
                        local waypoints = path:GetWaypoints()
                        local distance
                        for waypointIndex, waypoint in pairs(waypoints) do
                                if pathfindflyActive == false then break end
                                local waypointPosition = waypoint.Position
                                hum:MoveTo(waypointPosition)
                                repeat
                                        distance = (waypointPosition - root.Position).magnitude
                                        task.wait()
                                until distance <= 5 or pathfindflyActive == false
                        end
                end)
                if not success then
                        hum:MoveTo(TrueCoords)
                end
        until not speaker.Character or pathfindflyActive == false
        pathfindflyActive = false
end)

addcmd('unpathfindfly',{'unpfflyto','unpffly','stoppffly'},function(args, speaker)
        pathfindflyActive = false
        walkto = false
        waypointwalkto = false
        local hum = Players.LocalPlayer.Character and Players.LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
        if hum then
                hum:MoveTo(hum.Parent and getRoot(hum.Parent) and getRoot(hum.Parent).Position or Vector3.new(0,0,0))
        end
        notify('PathfindFly', 'Stopped')
end)

addcmd("orbit", {}, function(args, speaker)
        execCmd("unorbit nonotify")
        local target = Players:FindFirstChild(getPlayer(args[1], speaker)[1])
        local root = getRoot(speaker.Character)
        local humanoid = speaker.Character:FindFirstChildWhichIsA("Humanoid")
        if target and target.Character and getRoot(target.Character) and root and humanoid then
                local rotation = 0
                local speed = tonumber(args[2]) or 0.2
                local distance = tonumber(args[3]) or 6
                orbit1 = RunService.Heartbeat:Connect(function()
                        pcall(function()
                                rotation = rotation + speed
                                root.CFrame = CFrame.new(getRoot(target.Character).Position) * CFrame.Angles(0, math.rad(rotation), 0) * CFrame.new(distance, 0, 0)
                        end)
                end)
                orbit2 = RunService.RenderStepped:Connect(function()
                        pcall(function()
                                root.CFrame = CFrame.new(root.Position, getRoot(target.Character).Position)
                        end)
                end)
                orbit3 = humanoid.Died:Connect(function() execCmd("unorbit") end)
                orbit4 = humanoid.Seated:Connect(function(value) if value then execCmd("unorbit") end end)
                notify("Orbit", "Started orbiting " .. formatUsername(target))
        end
end)

addcmd("unorbit", {}, function(args, speaker)
        if orbit1 then orbit1:Disconnect() end
        if orbit2 then orbit2:Disconnect() end
        if orbit3 then orbit3:Disconnect() end
        if orbit4 then orbit4:Disconnect() end
        if args[1] ~= "nonotify" then notify("Orbit", "Stopped orbiting player") end
end)

addcmd('freeze',{'fr'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        if players ~= nil then
                for i,v in pairs(players) do
                        task.spawn(function()
                                for i, x in next, Players[v].Character:GetDescendants() do
                                        if x:IsA("BasePart") and not x.Anchored then
                                                x.Anchored = true
                                        end
                                end
                        end)
                end
        end
end)


addcmd('thaw',{'unfreeze','unfr'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        if players ~= nil then
                for i,v in pairs(players) do
                        task.spawn(function()
                                for i, x in next, Players[v].Character:GetDescendants() do
                                        if x.Name ~= floatName and x:IsA("BasePart") and x.Anchored then
                                                x.Anchored = false
                                        end
                                end
                        end)
                end
        end
end)

addcmd("anchor", {}, function(args, speaker)
    getRoot(speaker.Character).Anchored = true
end)

addcmd("unanchor", {}, function(args, speaker)
    getRoot(speaker.Character).Anchored = false
end)

oofing = false
addcmd('loopoof',{},function(args, speaker)
        oofing = true
        repeat wait(0.1)
                for i,v in pairs(Players:GetPlayers()) do
                        if v.Character ~= nil and v.Character:FindFirstChild'Head' then
                                for _,x in pairs(v.Character.Head:GetChildren()) do
                                        if x:IsA'Sound' then x.Playing = true end
                                end
                        end
                end
        until oofing == false
end)

addcmd('unloopoof',{},function(args, speaker)
        oofing = false
end)

local notifiedRespectFiltering = false
addcmd('muteboombox',{},function(args, speaker)
        if not notifiedRespectFiltering and SoundService.RespectFilteringEnabled then notifiedRespectFiltering = true notify('RespectFilteringEnabled','RespectFilteringEnabled is set to true (the command will still work but may only be clientsided)') end
        local players = getPlayer(args[1], speaker)
        if players ~= nil then
                for i,v in pairs(players) do
                        task.spawn(function()
                                for i, x in next, Players[v].Character:GetDescendants() do
                                        if x:IsA("Sound") and x.Playing == true then
                                                x.Playing = false
                                        end
                                end
                                for i, x in next, Players[v]:FindFirstChildOfClass("Backpack"):GetDescendants() do
                                        if x:IsA("Sound") and x.Playing == true then
                                                x.Playing = false
                                        end
                                end
                        end)
                end
        end
end)

addcmd('unmuteboombox',{},function(args, speaker)
        if not notifiedRespectFiltering and SoundService.RespectFilteringEnabled then notifiedRespectFiltering = true notify('RespectFilteringEnabled','RespectFilteringEnabled is set to true (the command will still work but may only be clientsided)') end
        local players = getPlayer(args[1], speaker)
        if players ~= nil then
                for i,v in pairs(players) do
                        task.spawn(function()
                                for i, x in next, Players[v].Character:GetDescendants() do
                                        if x:IsA("Sound") and x.Playing == false then
                                                x.Playing = true
                                        end
                                end
                        end)
                end
        end
end)

addcmd("reset", {}, function(args, speaker)
        local humanoid = speaker.Character and speaker.Character:FindFirstChildWhichIsA("Humanoid")
        if humanoid then
                humanoid:ChangeState(Enum.HumanoidStateType.Dead)
        else
                speaker.Character:BreakJoints()
        end
end)

addcmd('freezeanims',{},function(args, speaker)
        local Humanoid = speaker.Character:FindFirstChildOfClass("Humanoid") or speaker.Character:FindFirstChildOfClass("AnimationController")
        local ActiveTracks = Humanoid:GetPlayingAnimationTracks()
        for _, v in pairs(ActiveTracks) do
                v:AdjustSpeed(0)
        end
end)

addcmd('unfreezeanims',{},function(args, speaker)
        local Humanoid = speaker.Character:FindFirstChildOfClass("Humanoid") or speaker.Character:FindFirstChildOfClass("AnimationController")
        local ActiveTracks = Humanoid:GetPlayingAnimationTracks()
        for _, v in pairs(ActiveTracks) do
                v:AdjustSpeed(1)
        end
end)

addcmd("refresh", {"re"}, function(args, speaker)
        refresh(speaker)
end)

addcmd("god", {}, function(args, speaker)
        local Cam = workspace.CurrentCamera
        local Char, Pos = speaker.Character, Cam.CFrame
        local Human = Char and Char:FindFirstChildWhichIsA("Humanoid")
        local nHuman = Human:Clone()
        nHuman.Parent = char
        speaker.Character = nil
        nHuman:SetStateEnabled(15, false)
        nHuman:SetStateEnabled(1, false)
        nHuman:SetStateEnabled(0, false)
        nHuman.BreakJointsOnDeath = true
        Human:Destroy()
        speaker.Character = char
        Cam.CameraSubject = nHuman
        Cam.CFrame = task.wait() and pos
        nHuman.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None
        local Script = Char:FindFirstChild("Animate")
        if Script then
                Script.Disabled = true
                task.wait()
                Script.Disabled = false
        end
        nHuman.Health = nHuman.MaxHealth
end)

invisRunning = false
addcmd('invisible',{'invis'},function(args, speaker)
        if invisRunning then return end
        invisRunning = true
        -- Full credit to AmokahFox @V3rmillion
        local Player = speaker
        repeat wait(.1) until Player.Character
        local Character = Player.Character
        Character.Archivable = true
        local IsInvis = false
        local IsRunning = true
        local InvisibleCharacter = Character:Clone()
        InvisibleCharacter.Parent = Lighting
        local Void = workspace.FallenPartsDestroyHeight
        InvisibleCharacter.Name = ""
        local CF

        local invisFix = RunService.Stepped:Connect(function()
                pcall(function()
                        local IsInteger
                        if tostring(Void):find'-' then
                                IsInteger = true
                        else
                                IsInteger = false
                        end
                        local Pos = Player.Character.Humanoid.RootPart.Position
                        local Pos_String = tostring(Pos)
                        local Pos_Seperate = Pos_String:split(', ')
                        local X = tonumber(Pos_Seperate[1])
                        local Y = tonumber(Pos_Seperate[2])
                        local Z = tonumber(Pos_Seperate[3])
                        if IsInteger == true then
                                if Y <= Void then
                                        Respawn()
                                end
                        elseif IsInteger == false then
                                if Y >= Void then
                                        Respawn()
                                end
                        end
                end)
        end)

        for i,v in pairs(InvisibleCharacter:GetDescendants())do
                if v:IsA("BasePart") then
                        if v.Name == "HumanoidRootPart" then
                                v.Transparency = 1
                        else
                                v.Transparency = .5
                        end
                end
        end

        function Respawn()
                IsRunning = false
                if IsInvis == true then
                        pcall(function()
                                Player.Character = Character
                                wait()
                                Character.Parent = workspace
                                Character:FindFirstChildWhichIsA'Humanoid':Destroy()
                                IsInvis = false
                                InvisibleCharacter.Parent = nil
                                invisRunning = false
                        end)
                elseif IsInvis == false then
                        pcall(function()
                                Player.Character = Character
                                wait()
                                Character.Parent = workspace
                                Character:FindFirstChildWhichIsA'Humanoid':Destroy()
                                TurnVisible()
                        end)
                end
        end

        local invisDied
        invisDied = InvisibleCharacter:FindFirstChildOfClass'Humanoid'.Died:Connect(function()
                Respawn()
                invisDied:Disconnect()
        end)

        if IsInvis == true then return end
        IsInvis = true
        CF = workspace.CurrentCamera.CFrame
        local CF_1 = Player.Character.Humanoid.RootPart.CFrame
        Character:MoveTo(Vector3.new(0,math.pi*1000000,0))
        workspace.CurrentCamera.CameraType = Enum.CameraType.Scriptable
        wait(.2)
        workspace.CurrentCamera.CameraType = Enum.CameraType.Custom
        InvisibleCharacter = InvisibleCharacter
        Character.Parent = Lighting
        InvisibleCharacter.Parent = workspace
        InvisibleCharacter.Humanoid.RootPart.CFrame = CF_1
        Player.Character = InvisibleCharacter
        execCmd('fixcam')
        Player.Character.Animate.Disabled = true
        Player.Character.Animate.Disabled = false

        function TurnVisible()
                if IsInvis == false then return end
                invisFix:Disconnect()
                invisDied:Disconnect()
                CF = workspace.CurrentCamera.CFrame
                Character = Character
                local CF_1 = Player.Character.Humanoid.RootPart.CFrame
                Character.Humanoid.RootPart.CFrame = CF_1
                InvisibleCharacter:Destroy()
                Player.Character = Character
                Character.Parent = workspace
                IsInvis = false
                Player.Character.Animate.Disabled = true
                Player.Character.Animate.Disabled = false
                invisDied = Character:FindFirstChildOfClass'Humanoid'.Died:Connect(function()
                        Respawn()
                        invisDied:Disconnect()
                end)
                invisRunning = false
        end
        notify('Invisible','You now appear invisible to other players')
end)

addcmd("visible", {"vis","uninvisible"}, function(args, speaker)
        TurnVisible()
end)

addcmd("toggleinvis", {}, function(args, speaker)
        execCmd(invisRunning and "visible" or "invisible")
end)

addcmd('toolinvisible',{'toolinvis','tinvis'},function(args, speaker)
        local Char  = Players.LocalPlayer.Character
        local touched = false
        local tpdback = false
        local box = Instance.new('Part')
        box.Anchored = true
        box.CanCollide = true
        box.Size = Vector3.new(10,1,10)
        box.Position = Vector3.new(0,10000,0)
        box.Parent = workspace
        local boxTouched = box.Touched:connect(function(part)
                if (part.Parent.Name == Players.LocalPlayer.Name) then
                        if touched == false then
                                touched = true
                                local function apply()
                                        local no = Char.Humanoid.RootPart:Clone()
                                        task.wait(.25)
                                        Char.Humanoid.RootPart:Destroy()
                                        no.Parent = Char
                                        Char:MoveTo(loc)
                                        touched = false
                                end
                                if Char then
                                        apply()
                                end
                        end
                end
        end)
        repeat wait() until Char
        local cleanUp
        cleanUp = Players.LocalPlayer.CharacterAdded:connect(function(char)
                boxTouched:Disconnect()
                box:Destroy()
                cleanUp:Disconnect()
        end)
        loc = Char.Humanoid.RootPart.Position
        Char:MoveTo(box.Position + Vector3.new(0,.5,0))
end)

addcmd("strengthen", {}, function(args, speaker)
        for _, child in pairs(speaker.Character:GetDescendants()) do
                if child.ClassName == "Part" then
                        if args[1] then
                                child.CustomPhysicalProperties = PhysicalProperties.new(args[1], 0.3, 0.5)
                        else
                                child.CustomPhysicalProperties = PhysicalProperties.new(100, 0.3, 0.5)
                        end
                end
        end
end)

addcmd("weaken", {}, function(args, speaker)
        for _, child in pairs(speaker.Character:GetDescendants()) do
                if child.ClassName == "Part" then
                        if args[1] then
                                child.CustomPhysicalProperties = PhysicalProperties.new(-args[1], 0.3, 0.5)
                        else
                                child.CustomPhysicalProperties = PhysicalProperties.new(0, 0.3, 0.5)
                        end
                end
        end
end)

addcmd("unweaken", {"unstrengthen"}, function(args, speaker)
        for _, child in pairs(speaker.Character:GetDescendants()) do
                if child.ClassName == "Part" then
                        child.CustomPhysicalProperties = PhysicalProperties.new(0.7, 0.3, 0.5)
                end
        end
end)

addcmd("breakvelocity", {}, function(args, speaker)
        local BeenASecond, V3 = false, Vector3.new(0, 0, 0)
        delay(1, function()
                BeenASecond = true
        end)
        while not BeenASecond do
                for _, v in ipairs(speaker.Character:GetDescendants()) do
                        if v:IsA("BasePart") then
                                v.Velocity, v.RotVelocity = V3, V3
                        end
                end
                wait()
        end
end)

addcmd('jpower',{'jumppower','jp'},function(args, speaker)
        local jpower = args[1] or 50
        if isNumber(jpower) then
                if speaker.Character:FindFirstChildOfClass('Humanoid').UseJumpPower then
                        speaker.Character:FindFirstChildOfClass('Humanoid').JumpPower = jpower
                else
                        speaker.Character:FindFirstChildOfClass('Humanoid').JumpHeight  = jpower
                end
        end
end)

addcmd("maxslopeangle", {"msa"}, function(args, speaker)
        local sangle = args[1] or 89
        if isNumber(sangle) then
                speaker.Character:FindFirstChildWhichIsA("Humanoid").MaxSlopeAngle = sangle
        end
end)

addcmd("gravity", {"grav"}, function(args, speaker)
        local grav = args[1] or oldgrav
        if isNumber(grav) then
                workspace.Gravity = grav
        end
end)

addcmd("hipheight", {"hheight"}, function(args, speaker)
        local hipHeight = args[1] or (r15(speaker) and 2.1 or 0)
        if isNumber(hipHeight) then
                speaker.Character:FindFirstChildWhichIsA("Humanoid").HipHeight = hipHeight
        end
end)

addcmd("dance", {}, function(args, speaker)
        pcall(execCmd, "undance")
        local dances = {"27789359", "30196114", "248263260", "45834924", "33796059", "28488254", "52155728"}
        if r15(speaker) then
                dances = {"3333432454", "4555808220", "4049037604", "4555782893", "10214311282", "10714010337", "10713981723", "10714372526", "10714076981", "10714392151", "11444443576"}
        end
        local animation = Instance.new("Animation")
        animation.AnimationId = "rbxassetid://" .. dances[math.random(1, #dances)]
        danceTrack = speaker.Character:FindFirstChildWhichIsA("Humanoid"):LoadAnimation(animation)
        danceTrack.Looped = true
        danceTrack:Play()
end)

addcmd("undance", {"nodance"}, function(args, speaker)
        danceTrack:Stop()
        danceTrack:Destroy()
end)

addcmd('nolimbs',{'rlimbs'},function(args, speaker)
        if r15(speaker) then
                for i,v in pairs(speaker.Character:GetChildren()) do
                        if v:IsA("BasePart") and
                                v.Name == "RightUpperLeg" or
                                v.Name == "LeftUpperLeg" or
                                v.Name == "RightUpperArm" or
                                v.Name == "LeftUpperArm" then
                                v:Destroy()
                        end
                end
        else
                for i,v in pairs(speaker.Character:GetChildren()) do
                        if v:IsA("BasePart") and
                                v.Name == "Right Leg" or
                                v.Name == "Left Leg" or
                                v.Name == "Right Arm" or
                                v.Name == "Left Arm" then
                                v:Destroy()
                        end
                end
        end
end)

addcmd('noarms',{'rarms'},function(args, speaker)
        if r15(speaker) then
                for i,v in pairs(speaker.Character:GetChildren()) do
                        if v:IsA("BasePart") and
                                v.Name == "RightUpperArm" or
                                v.Name == "LeftUpperArm" then
                                v:Destroy()
                        end
                end
        else
                for i,v in pairs(speaker.Character:GetChildren()) do
                        if v:IsA("BasePart") and
                                v.Name == "Right Arm" or
                                v.Name == "Left Arm" then
                                v:Destroy()
                        end
                end
        end
end)

addcmd('nolegs',{'rlegs'},function(args, speaker)
        if r15(speaker) then
                for i,v in pairs(speaker.Character:GetChildren()) do
                        if v:IsA("BasePart") and
                                v.Name == "RightUpperLeg" or
                                v.Name == "LeftUpperLeg" then
                                v:Destroy()
                        end
                end
        else
                for i,v in pairs(speaker.Character:GetChildren()) do
                        if v:IsA("BasePart") and
                                v.Name == "Right Leg" or
                                v.Name == "Left Leg" then
                                v:Destroy()
                        end
                end
        end
end)

addcmd("lay", {"laydown"}, function(args, speaker)
        local humanoid = speaker.Character:FindFirstChildWhichIsA("Humanoid")
        humanoid.Sit = true
        task.wait(0.1)
        humanoid.RootPart.CFrame = humanoid.RootPart.CFrame * CFrame.Angles(math.pi * 0.5, 0, 0)
        for _, v in ipairs(humanoid:GetPlayingAnimationTracks()) do
                v:Stop()
        end
end)

addcmd("sitwalk", {}, function(args, speaker)
        local anims = speaker.Character.Animate
        local sit = anims.sit:FindFirstChildWhichIsA("Animation").AnimationId
        anims.idle:FindFirstChildWhichIsA("Animation").AnimationId = sit
        anims.walk:FindFirstChildWhichIsA("Animation").AnimationId = sit
        anims.run:FindFirstChildWhichIsA("Animation").AnimationId = sit
        anims.jump:FindFirstChildWhichIsA("Animation").AnimationId = sit
        speaker.Character:FindFirstChildWhichIsA("Humanoid").HipHeight = not r15(speaker) and -1.5 or 0.5
end)

addcmd("nosit", {}, function(args, speaker)
        speaker.Character:FindFirstChildWhichIsA("Humanoid"):SetStateEnabled(Enum.HumanoidStateType.Seated, false)
end)

addcmd("unnosit", {}, function(args, speaker)
        speaker.Character:FindFirstChildWhichIsA("Humanoid"):SetStateEnabled(Enum.HumanoidStateType.Seated, true)
end)

addcmd("jump", {}, function(args, speaker)
        speaker.Character:FindFirstChildWhichIsA("Humanoid"):ChangeState(Enum.HumanoidStateType.Jumping)
end)

local infJump
infJumpDebounce = false
addcmd("infjump", {"infinitejump"}, function(args, speaker)
        if infJump then infJump:Disconnect() end
        infJumpDebounce = false
        infJump = UserInputService.JumpRequest:Connect(function()
                if not infJumpDebounce then
                        infJumpDebounce = true
                        speaker.Character:FindFirstChildWhichIsA("Humanoid"):ChangeState(Enum.HumanoidStateType.Jumping)
                        wait()
                        infJumpDebounce = false
                end
        end)
end)

addcmd("uninfjump", {"uninfinitejump", "noinfjump", "noinfinitejump"}, function(args, speaker)
        if infJump then infJump:Disconnect() end
        infJumpDebounce = false
end)

local flyjump
addcmd("flyjump", {}, function(args, speaker)
        if flyjump then flyjump:Disconnect() end
        flyjump = UserInputService.JumpRequest:Connect(function()
                speaker.Character:FindFirstChildWhichIsA("Humanoid"):ChangeState(Enum.HumanoidStateType.Jumping)
        end)
end)

addcmd("unflyjump", {"noflyjump"}, function(args, speaker)
        if flyjump then flyjump:Disconnect() end
end)

local HumanModCons = {}
addcmd('autojump',{'ajump'},function(args, speaker)
        local Char = speaker.Character
        local Human = Char and Char:FindFirstChildWhichIsA("Humanoid")
        local function autoJump()
                if Char and Human then
                        local check1 = workspace:FindPartOnRay(Ray.new(Human.RootPart.Position-Vector3.new(0,1.5,0), Human.RootPart.CFrame.lookVector*3), Human.Parent)
                        local check2 = workspace:FindPartOnRay(Ray.new(Human.RootPart.Position+Vector3.new(0,1.5,0), Human.RootPart.CFrame.lookVector*3), Human.Parent)
                        if check1 or check2 then
                                Human.Jump = true
                        end
                end
        end
        autoJump()
        HumanModCons.ajLoop = (HumanModCons.ajLoop and HumanModCons.ajLoop:Disconnect() and false) or RunService.RenderStepped:Connect(autoJump)
        HumanModCons.ajCA = (HumanModCons.ajCA and HumanModCons.ajCA:Disconnect() and false) or speaker.CharacterAdded:Connect(function(nChar)
                Char, Human = nChar, nChar:WaitForChild("Humanoid")
                autoJump()
                HumanModCons.ajLoop = (HumanModCons.ajLoop and HumanModCons.ajLoop:Disconnect() and false) or RunService.RenderStepped:Connect(autoJump)
        end)
end)

addcmd('unautojump',{'noautojump', 'noajump', 'unajump'},function(args, speaker)
        HumanModCons.ajLoop = (HumanModCons.ajLoop and HumanModCons.ajLoop:Disconnect() and false) or nil
        HumanModCons.ajCA = (HumanModCons.ajCA and HumanModCons.ajCA:Disconnect() and false) or nil
end)

addcmd('edgejump',{'ejump'},function(args, speaker)
        local Char = speaker.Character
        local Human = Char and Char:FindFirstChildWhichIsA("Humanoid")
        -- Full credit to NoelGamer06 @V3rmillion
        local state
        local laststate
        local lastcf
        local function edgejump()
                if Char and Human then
                        laststate = state
                        state = Human:GetState()
                        if laststate ~= state and state == Enum.HumanoidStateType.Freefall and laststate ~= Enum.HumanoidStateType.Jumping then
                                Char.Humanoid.RootPart.CFrame = lastcf
                                Char.Humanoid.RootPart.Velocity = Vector3.new(Char.Humanoid.RootPart.Velocity.X, Human.JumpPower or Human.JumpHeight, Char.Humanoid.RootPart.Velocity.Z)
                        end
                        lastcf = Char.Humanoid.RootPart.CFrame
                end
        end
        edgejump()
        HumanModCons.ejLoop = (HumanModCons.ejLoop and HumanModCons.ejLoop:Disconnect() and false) or RunService.RenderStepped:Connect(edgejump)
        HumanModCons.ejCA = (HumanModCons.ejCA and HumanModCons.ejCA:Disconnect() and false) or speaker.CharacterAdded:Connect(function(nChar)
                Char, Human = nChar, nChar:WaitForChild("Humanoid")
                edgejump()
                HumanModCons.ejLoop = (HumanModCons.ejLoop and HumanModCons.ejLoop:Disconnect() and false) or RunService.RenderStepped:Connect(edgejump)
        end)
end)

addcmd('unedgejump',{'noedgejump', 'noejump', 'unejump'},function(args, speaker)
        HumanModCons.ejLoop = (HumanModCons.ejLoop and HumanModCons.ejLoop:Disconnect() and false) or nil
        HumanModCons.ejCA = (HumanModCons.ejCA and HumanModCons.ejCA:Disconnect() and false) or nil
end)

addcmd("team", {}, function(args, speaker)
        local teamName = getstring(1, args)
        local team = nil
        local root = speaker.Character and getRoot(speaker.Character)
        for _, v in ipairs(Teams:GetChildren()) do
                if v.Name:lower():match(teamName:lower()) then
                        team = v
                        break
                end
        end
        if not team then
                return notify("Invalid Team", teamName .. " is not a valid team")
        end
        if root and firetouchinterest then
                for _, v in ipairs(workspace:GetDescendants()) do
                        if v:IsA("SpawnLocation") and v.BrickColor == team.TeamColor and v.AllowTeamChangeOnTouch == true then
                                firetouchinterest(v, root, 0)
                                firetouchinterest(v, root, 1)
                                break
                        end
                end
        else
                speaker.Team = team
        end
end)

addcmd('nobgui',{'unbgui','nobillboardgui','unbillboardgui','noname','rohg'},function(args, speaker)
        for i,v in pairs(speaker.Character:GetDescendants())do
                if v:IsA("BillboardGui") or v:IsA("SurfaceGui") then
                        v:Destroy()
                end
        end
end)

addcmd('loopnobgui',{'loopunbgui','loopnobillboardgui','loopunbillboardgui','loopnoname','looprohg'},function(args, speaker)
        for i,v in pairs(speaker.Character:GetDescendants())do
                if v:IsA("BillboardGui") or v:IsA("SurfaceGui") then
                        v:Destroy()
                end
        end
        local function charPartAdded(part)
                if part:IsA("BillboardGui") or part:IsA("SurfaceGui") then
                        wait()
                        part:Destroy()
                end
        end
        charPartTrigger = speaker.Character.DescendantAdded:Connect(charPartAdded)
end)

addcmd('unloopnobgui',{'unloopunbgui','unloopnobillboardgui','unloopunbillboardgui','unloopnoname','unlooprohg'},function(args, speaker)
        if charPartTrigger then
                charPartTrigger:Disconnect()
        end
end)

addcmd('spasm',{},function(args, speaker)
        if not r15(speaker) then
                local pchar=speaker.Character
                local AnimationId = "33796059"
                SpasmAnim = Instance.new("Animation")
                SpasmAnim.AnimationId = "rbxassetid://"..AnimationId
                Spasm = pchar:FindFirstChildOfClass('Humanoid'):LoadAnimation(SpasmAnim)
                Spasm:Play()
                Spasm:AdjustSpeed(99)
        else
                notify('R6 Required','This command requires the r6 rig type')
        end
end)

addcmd('unspasm',{'nospasm'},function(args, speaker)
        Spasm:Stop()
        SpasmAnim:Destroy()
end)

addcmd('headthrow',{},function(args, speaker)
        if not r15(speaker) then
                local AnimationId = "35154961"
                local Anim = Instance.new("Animation")
                Anim.AnimationId = "rbxassetid://"..AnimationId
                local k = speaker.Character:FindFirstChildOfClass('Humanoid'):LoadAnimation(Anim)
                k:Play(0)
                k:AdjustSpeed(1)
        else
                notify('R6 Required','This command requires the r6 rig type')
        end
end)

local function anim2track(asset_id)
        local objs = game:GetObjects(asset_id)
        for i = 1, #objs do
                if objs[i]:IsA("Animation") then
                        return objs[i].AnimationId
                end
        end
        return asset_id
end

addcmd("animation", {"anim"}, function(args, speaker)
        local animid = tostring(args[1])
        if not animid:find("rbxassetid://") then
                animid = "rbxassetid://" .. animid
        end
        animid = anim2track(animid)
        local animation = Instance.new("Animation")
        animation.AnimationId = animid
        local anim = speaker.Character:FindFirstChildWhichIsA("Humanoid"):LoadAnimation(animation)
        anim.Priority = Enum.AnimationPriority.Movement
        anim:Play()
        if args[2] then anim:AdjustSpeed(tostring(args[2])) end
end)

addcmd("emote", {"em"}, function(args, speaker)
        local anim = humanoid:PlayEmoteAndGetAnimTrackById(args[1])
        if args[2] then anim:AdjustSpeed(tostring(args[2])) end
end)


addcmd('noanim',{},function(args, speaker)
        speaker.Character.Animate.Disabled = true
end)

addcmd('reanim',{},function(args, speaker)
        speaker.Character.Animate.Disabled = false
end)

addcmd('animspeed',{},function(args, speaker)
        local Char = speaker.Character
        local Hum = Char:FindFirstChildOfClass("Humanoid") or Char:FindFirstChildOfClass("AnimationController")

        for i,v in next, Hum:GetPlayingAnimationTracks() do
                v:AdjustSpeed(tonumber(args[1] or 1))
        end
end)

addcmd('copyanimation',{'copyanim','copyemote'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for _,v in ipairs(players)do
                local char = Players[v].Character
                for _, v1 in pairs(speaker.Character:FindFirstChildOfClass('Humanoid'):GetPlayingAnimationTracks()) do
                        v1:Stop()
                end
                for _, v1 in pairs(Players[v].Character:FindFirstChildOfClass('Humanoid'):GetPlayingAnimationTracks()) do
                        if not string.find(v1.Animation.AnimationId, "507768375") then
                                local ANIM = speaker.Character:FindFirstChildOfClass('Humanoid'):LoadAnimation(v1.Animation)
                                ANIM:Play(.1, 1, v1.Speed)
                                ANIM.TimePosition = v1.TimePosition
                                task.spawn(function()
                                        v1.Stopped:Wait()
                                        ANIM:Stop()
                                        ANIM:Destroy()
                                end)
                        end
                end
        end
end)

addcmd("copyanimationid", {"copyanimid", "copyemoteid"}, function(args, speaker)
        local copyAnimId = function(player)
                local found = "Animations Copied"

                for _, v in pairs(player.Character:FindFirstChildWhichIsA("Humanoid"):GetPlayingAnimationTracks()) do
                        local animationId = v.Animation.AnimationId
                        local assetId = animationId:find("rbxassetid://") and animationId:match("%d+")

                        if not string.find(animationId, "507768375") and not string.find(animationId, "180435571") then
                                if assetId then
                                        local success, result = pcall(function()
                                                return MarketplaceService:GetProductInfo(tonumber(assetId)).Name
                                        end)
                                        local name = success and result or "Failed to get name"
                                        found = found .. "\n\nName: " .. name .. "\nAnimation Id: " .. animationId
                                else
                                        found = found .. "\n\nAnimation Id: " .. animationId
                                end
                        end
                end

                if found ~= "Animations Copied" then
                        toClipboard(found)
                else
                        notify("Animations", "No animations to copy")
                end
        end

        if args[1] then
                copyAnimId(Players[getPlayer(args[1], speaker)[1]])
        else
                copyAnimId(speaker)
        end
end)

addcmd('stopanimations',{'stopanims','stopanim'},function(args, speaker)
        local Char = speaker.Character
        local Hum = Char:FindFirstChildOfClass("Humanoid") or Char:FindFirstChildOfClass("AnimationController")

        for i,v in next, Hum:GetPlayingAnimationTracks() do
                v:Stop()
        end
end)

addcmd('refreshanimations', {'refreshanimation', 'refreshanims', 'refreshanim'}, function(args, speaker)
        local Char = speaker.Character or speaker.CharacterAdded:Wait()
        local Human = Char and Char:WaitForChild('Humanoid', 15)
        local Animate = Char and Char:WaitForChild('Animate', 15)
        if not Human or not Animate then
                return notify('Refresh Animations', 'Failed to get Animate/Humanoid')
        end
        Animate.Disabled = true
        for _, v in ipairs(Human:GetPlayingAnimationTracks()) do
                v:Stop()
        end
        Animate.Disabled = false
end)

addcmd('allowcustomanim', {'allowcustomanimations'}, function(args, speaker)
        StarterPlayer.AllowCustomAnimations = true
        execCmd('refreshanimations')
end)

addcmd('unallowcustomanim', {'unallowcustomanimations'}, function(args, speaker)
        StarterPlayer.AllowCustomAnimations = false
        execCmd('refreshanimations')
end)

addcmd('loopanimation', {'loopanim'},function(args, speaker)
        local Char = speaker.Character
        local Human = Char and Char.FindFirstChildWhichIsA(Char, "Humanoid")
        for _, v in ipairs(Human.GetPlayingAnimationTracks(Human)) do
                v.Looped = true
        end
end)

addcmd('tpposition',{'tppos'},function(args, speaker)
        if #args < 3 then return end
        local tpX,tpY,tpZ = tonumber((args[1]:gsub(",", ""))),tonumber((args[2]:gsub(",", ""))),tonumber((args[3]:gsub(",", "")))
        local char = speaker.Character
        if char and getRoot(char) then
                getRoot(char).CFrame = CFrame.new(tpX,tpY,tpZ)
        end
end)

addcmd('tweentpposition',{'ttppos'},function(args, speaker)
        if #args < 3 then return end
        local tpX,tpY,tpZ = tonumber((args[1]:gsub(",", ""))),tonumber((args[2]:gsub(",", ""))),tonumber((args[3]:gsub(",", "")))
        local char = speaker.Character
        if char and getRoot(char) then
                TweenService:Create(getRoot(speaker.Character), TweenInfo.new(tweenSpeed, Enum.EasingStyle.Linear), {CFrame = CFrame.new(tpX,tpY,tpZ)}):Play()
        end
end)

addcmd("offset", {}, function(args, speaker)
    if #args < 3 then return end
    speaker.Character:TranslateBy(Vector3.new(tonumber(args[1]) or 0, tonumber(args[2]) or 0, tonumber(args[3]) or 0))
end)

addcmd("tweenoffset", {"toffset"}, function(args, speaker)
    if #args < 3 then return end
    local tpX, tpY, tpZ = tonumber(args[1]), tonumber(args[2]), tonumber(args[3])
    local root = getRoot(speaker.Character)
    local pos = root.Position + Vector3.new(tpX, tpY, tpZ)
    TweenService:Create(root, TweenInfo.new(tweenSpeed, Enum.EasingStyle.Linear), {CFrame = CFrame.new(pos)}):Play()
    breakVelocity()
end)

addcmd("clickteleport", {}, function(args, speaker)
    if speaker ~= Players.LocalPlayer then return end
    notify("Click TP", "Go to Settings > Keybinds > Add to set up click teleport")
end)

addcmd("mouseteleport", {"mousetp"}, function(args, speaker)
    local root = getRoot(speaker.Character)
    local pos = IYMouse.Hit
    if root and pos then
        root.CFrame = CFrame.new(pos.X, pos.Y + 3, pos.Z, select(4, root.CFrame:components()))
        breakVelocity()
    end
end)

addcmd("tptool", {"teleporttool"}, function(args, speaker)
    local TpTool = Instance.new("Tool")
    TpTool.Name = "Teleport Tool"
    TpTool.RequiresHandle = false
    TpTool.Parent = speaker:FindFirstChildOfClass("Backpack")
    TpTool.Activated:Connect(function()
        local root = getRoot(speaker.Character)
        local pos = IYMouse.Hit
        if not root or not pos then return end
        root.CFrame = CFrame.new(pos.X, pos.Y + 3, pos.Z, select(4, root.CFrame:components()))
        breakVelocity()
    end)
end)

addcmd("thru", {}, function(args, speaker)
    local root = getRoot(speaker.Character)
    local num = tonumber(args[1]) or 5
    local pos = root.CFrame.Position + (root.CFrame.LookVector * num)
    root.CFrame = CFrame.new(pos, pos + root.CFrame.LookVector)
end)

addcmd('clickdelete',{},function(args, speaker)
        if speaker == Players.LocalPlayer then
                notify('Click Delete','Go to Settings > Keybinds > Add to set up click delete')
        end
end)

addcmd('getposition',{'getpos','notifypos','notifyposition'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                local char = Players[v].Character
                local pos = char and (getRoot(char) or char:FindFirstChildWhichIsA("BasePart"))
                pos = pos and pos.Position
                if not pos then
                        return notify('Getposition Error','Missing character')
                end
                local roundedPos = math.round(pos.X) .. ", " .. math.round(pos.Y) .. ", " .. math.round(pos.Z)
                notify('Current Position',roundedPos)
        end
end)

addcmd('copyposition',{'copypos'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                local char = Players[v].Character
                local pos = char and (getRoot(char) or char:FindFirstChildWhichIsA("BasePart"))
                pos = pos and pos.Position
                if not pos then
                        return notify('Getposition Error','Missing character')
                end
                local roundedPos = math.round(pos.X) .. ", " .. math.round(pos.Y) .. ", " .. math.round(pos.Z)
                toClipboard(roundedPos)
        end
end)

addcmd('walktopos',{'walktoposition'},function(args, speaker)
        if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                wait(.1)
        end
        speaker.Character:FindFirstChildOfClass('Humanoid').WalkToPoint = Vector3.new(args[1],args[2],args[3])
end)

-- pathfindtopos: pathfind to a specific X Y Z coordinate
local pathfindtoposActive = false
addcmd('pathfindtopos',{'pftopos','pathfindpos'},function(args, speaker)
        pathfindtoposActive = false
        wait()
        local x, y, z = tonumber(args[1]), tonumber(args[2]), tonumber(args[3])
        if not x or not y or not z then return notify('PathfindPos', 'Usage: ;pathfindtopos X Y Z') end
        local targetPos = Vector3.new(x, y, z)
        local hum = Players.LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
        local root = getRoot(speaker.Character)
        if not hum or not root then return notify('PathfindPos', 'Character not found') end
        if hum.SeatPart then hum.Sit = false wait(.1) end
        pathfindtoposActive = true
        notify('PathfindPos', 'Walking to ' .. x .. ', ' .. y .. ', ' .. z)
        local path = PathService:CreatePath()
        repeat task.wait()
                if pathfindtoposActive == false then break end
                local success, errMsg = pcall(function()
                        path:ComputeAsync(root.Position, targetPos)
                        local waypoints = path:GetWaypoints()
                        for waypointIndex, waypoint in pairs(waypoints) do
                                if pathfindtoposActive == false then break end
                                local wp = waypoint.Position
                                hum:MoveTo(wp)
                                repeat task.wait()
                                        distance = (wp - root.Position).magnitude
                                until distance <= 5 or pathfindtoposActive == false
                        end
                end)
                if not success then
                        hum:MoveTo(targetPos)
                end
        until pathfindtoposActive == false
        pathfindtoposActive = false
end)

addcmd('unpathfindtopos',{'unpftopos'},function(args, speaker)
        pathfindtoposActive = false
        notify('PathfindPos', 'Stopped')
end)

addcmd('speed',{'ws','walkspeed'},function(args, speaker)
        local speed = tonumber(args[2] or args[1]) or 16
        if isNumber(speed) then
                pcall(function() speaker.Character:FindFirstChildOfClass('Humanoid').WalkSpeed = speed end)
                desync_applySpeed(speed)
        end
end)

addcmd('spoofspeed',{'spoofws','spoofwalkspeed'},function(args, speaker)
        if args[1] and isNumber(args[1]) then
                if hookmetamethod then
                        local char = speaker.Character
                        local setspeed;
                        local index; index = hookmetamethod(game, "__index", function(self, key)
                                if not checkcaller() and typeof(self) == "Instance" and self:IsA("Humanoid") and (key == "WalkSpeed" or key == "walkSpeed") and self:IsDescendantOf(char) then
                                        return setspeed or args[1]
                                end
                                return index(self, key)
                        end)
                        local newindex; newindex = hookmetamethod(game, "__newindex", function(self, key, value)
                                if not checkcaller() and typeof(self) == "Instance" and self:IsA("Humanoid") and (key == "WalkSpeed" or key == "walkSpeed") and self:IsDescendantOf(char) then
                                        setspeed = tonumber(value)
                                end
                                return newindex(self, key, value)
                        end)
                else
                        notify('Incompatible Exploit','Your exploit does not support this command (missing hookmetamethod)')
                end
        end
end)

addcmd('loopspeed',{'loopws'},function(args, speaker)
        local speed = args[1] or 16
        if args[2] then
                speed = args[2] or 16
        end
        if isNumber(speed) then
                local Char = speaker.Character or workspace:FindFirstChild(speaker.Name)
                local Human = Char and Char:FindFirstChildWhichIsA("Humanoid")
                local function WalkSpeedChange()
                        if Char and Human then
                                Human.WalkSpeed = speed
                                desync_applySpeed(speed)
                        end
                end
                WalkSpeedChange()
                HumanModCons.wsLoop = (HumanModCons.wsLoop and HumanModCons.wsLoop:Disconnect() and false) or Human:GetPropertyChangedSignal("WalkSpeed"):Connect(WalkSpeedChange)
                HumanModCons.wsCA = (HumanModCons.wsCA and HumanModCons.wsCA:Disconnect() and false) or speaker.CharacterAdded:Connect(function(nChar)
                        Char, Human = nChar, nChar:WaitForChild("Humanoid")
                        WalkSpeedChange()
                        HumanModCons.wsLoop = (HumanModCons.wsLoop and HumanModCons.wsLoop:Disconnect() and false) or Human:GetPropertyChangedSignal("WalkSpeed"):Connect(WalkSpeedChange)
                end)
        end
end)

addcmd('unloopspeed',{'unloopws'},function(args, speaker)
        HumanModCons.wsLoop = (HumanModCons.wsLoop and HumanModCons.wsLoop:Disconnect() and false) or nil
        HumanModCons.wsCA = (HumanModCons.wsCA and HumanModCons.wsCA:Disconnect() and false) or nil
end)

addcmd('spoofjumppower',{'spoofjp'},function(args, speaker)
        if args[1] and isNumber(args[1]) then
                if hookmetamethod then
                        local char = speaker.Character
                        local setpower;
                        local index; index = hookmetamethod(game, "__index", function(self, key)
                                if not checkcaller() and typeof(self) == "Instance" and self:IsA("Humanoid") and (key == "JumpPower" or key == "jumpPower") and self:IsDescendantOf(char) then
                                        return setpower or args[1]
                                end
                                return index(self, key)
                        end)
                        local newindex; newindex = hookmetamethod(game, "__newindex", function(self, key, value)
                                if not checkcaller() and typeof(self) == "Instance" and self:IsA("Humanoid") and (key == "JumpPower" or key == "jumpPower") and self:IsDescendantOf(char) then
                                        setpower = tonumber(value)
                                end
                                return newindex(self, key, value)
                        end)
                else
                        notify('Incompatible Exploit','Your exploit does not support this command (missing hookmetamethod)')
                end
        end
end)

addcmd('loopjumppower',{'loopjp','loopjpower'},function(args, speaker)
        local jpower = args[1] or 50
        if isNumber(jpower) then
                local Char = speaker.Character or workspace:FindFirstChild(speaker.Name)
                local Human = Char and Char:FindFirstChildWhichIsA("Humanoid")
                local function JumpPowerChange()
                        if Char and Human then
                                if speaker.Character:FindFirstChildOfClass('Humanoid').UseJumpPower then
                                        speaker.Character:FindFirstChildOfClass('Humanoid').JumpPower = jpower
                                else
                                        speaker.Character:FindFirstChildOfClass('Humanoid').JumpHeight  = jpower
                                end
                        end
                end
                JumpPowerChange()
                HumanModCons.jpLoop = (HumanModCons.jpLoop and HumanModCons.jpLoop:Disconnect() and false) or Human:GetPropertyChangedSignal("JumpPower"):Connect(JumpPowerChange)
                HumanModCons.jpCA = (HumanModCons.jpCA and HumanModCons.jpCA:Disconnect() and false) or speaker.CharacterAdded:Connect(function(nChar)
                        Char, Human = nChar, nChar:WaitForChild("Humanoid")
                        JumpPowerChange()
                        HumanModCons.jpLoop = (HumanModCons.jpLoop and HumanModCons.jpLoop:Disconnect() and false) or Human:GetPropertyChangedSignal("JumpPower"):Connect(JumpPowerChange)
                end)
        end
end)

addcmd('unloopjumppower',{'unloopjp','unloopjpower'},function(args, speaker)
        local Char = speaker.Character or workspace:FindFirstChild(speaker.Name)
        local Human = Char and Char:FindFirstChildWhichIsA("Humanoid")
        HumanModCons.jpLoop = (HumanModCons.jpLoop and HumanModCons.jpLoop:Disconnect() and false) or nil
        HumanModCons.jpCA = (HumanModCons.jpCA and HumanModCons.jpCA:Disconnect() and false) or nil
        if Char and Human then
                if speaker.Character:FindFirstChildOfClass('Humanoid').UseJumpPower then
                        speaker.Character:FindFirstChildOfClass('Humanoid').JumpPower = 50
                else
                        speaker.Character:FindFirstChildOfClass('Humanoid').JumpHeight  = 50
                end
        end
end)

addcmd('tools',{'gears'},function(args, speaker)
        local function copy(instance)
                for i,c in pairs(instance:GetChildren())do
                        if c:IsA('Tool') or c:IsA('HopperBin') then
                                c:Clone().Parent = speaker:FindFirstChildOfClass("Backpack")
                        end
                        copy(c)
                end
        end
        copy(Lighting)
        local function copy(instance)
                for i,c in pairs(instance:GetChildren())do
                        if c:IsA('Tool') or c:IsA('HopperBin') then
                                c:Clone().Parent = speaker:FindFirstChildOfClass("Backpack")
                        end
                        copy(c)
                end
        end
        copy(ReplicatedStorage)
        notify('Tools','Copied tools from ReplicatedStorage and Lighting')
end)

addcmd('notools',{'rtools','clrtools','removetools','deletetools','dtools'},function(args, speaker)
        for i,v in pairs(speaker:FindFirstChildOfClass("Backpack"):GetDescendants()) do
                if v:IsA('Tool') or v:IsA('HopperBin') then
                        v:Destroy()
                end
        end
        for i,v in pairs(speaker.Character:GetDescendants()) do
                if v:IsA('Tool') or v:IsA('HopperBin') then
                        v:Destroy()
                end
        end
end)

addcmd('deleteselectedtool',{'dst'},function(args, speaker)
        for i,v in pairs(speaker.Character:GetDescendants()) do
                if v:IsA('Tool') or v:IsA('HopperBin') then
                        v:Destroy()
                end
        end
end)

addcmd("console", {}, function(args, speaker)
        StarterGui:SetCore("DevConsoleVisible", true)
end)

addcmd('oldconsole',{},function(args, speaker)
        -- Thanks wally!!
        notify("Loading",'Hold on a sec')
        local _, str = pcall(function()
                return game:HttpGet("https://raw.githubusercontent.com/infyiff/backup/main/console.lua", true)
        end)

        local s, e = loadstring(str)
        if typeof(s) ~= "function" then
                return
        end

        local success, message = pcall(s)
        if (not success) then
                if printconsole then
                        printconsole(message)
                elseif printoutput then
                        printoutput(message)
                end
        end
        wait(1)
        notify('Console','Press F9 to open the console')
end)

addcmd("explorer", {"dex"}, function(args, speaker)
        notify("Loading", "Hold on a sec")
        loadstring(game:HttpGet("https://raw.githubusercontent.com/infyiff/backup/main/dex.lua"))()
end)

addcmd('olddex', {'odex'}, function(args, speaker)
        notify('Loading old explorer', 'Hold on a sec')

        local getobjects = function(a)
                local Objects = {}
                if a then
                        local b = InsertService:LoadLocalAsset(a)
                        if b then 
                                table.insert(Objects, b) 
                        end
                end
                return Objects
        end

        local Dex = getobjects("rbxassetid://10055842438")[1]
        Dex.Parent = PARENT

        local function Load(Obj, Url)
                local function GiveOwnGlobals(Func, Script)
                        -- Fix for this edit of dex being poorly made
                        -- I (Alex) would like to commemorate whoever added this dex in somehow finding the worst dex to ever exist
                        local Fenv, RealFenv, FenvMt = {}, {
                                script = Script,
                                getupvalue = function(a, b)
                                        return nil -- force it to use globals
                                end,
                                getreg = function() -- It loops registry for some idiotic reason so stop it from doing that and just use a global
                                        return {} -- force it to use globals
                                end,
                                getprops = getprops or function(inst)
                                        if getproperties then
                                                local props = getproperties(inst)
                                                if props[1] and gethiddenproperty then
                                                        local results = {}
                                                        for _,name in pairs(props) do
                                                                local success, res = pcall(gethiddenproperty, inst, name)
                                                                if success then
                                                                        results[name] = res
                                                                end
                                                        end

                                                        return results
                                                end

                                                return props
                                        end

                                        return {}
                                end
                        }, {}
                        FenvMt.__index = function(a,b)
                                return RealFenv[b] == nil and getgenv()[b] or RealFenv[b]
                        end
                        FenvMt.__newindex = function(a, b, c)
                                if RealFenv[b] == nil then 
                                        getgenv()[b] = c 
                                else 
                                        RealFenv[b] = c 
                                end
                        end
                        setmetatable(Fenv, FenvMt)
                        pcall(setfenv, Func, Fenv)
                        return Func
                end

                local function LoadScripts(_, Script)
                        if Script:IsA("LocalScript") then
                                task.spawn(function()
                                        GiveOwnGlobals(loadstring(Script.Source,"="..Script:GetFullName()), Script)()
                                end)
                        end
                        table.foreach(Script:GetChildren(), LoadScripts)
                end

                LoadScripts(nil, Obj)
        end

        Load(Dex)
end)

addcmd('remotespy',{'rspy'},function(args, speaker)
        notify("Loading",'Hold on a sec')
        -- Full credit to exx, creator of SimpleSpy
        -- also thanks to Amity for fixing
        loadstring(game:HttpGet("https://raw.githubusercontent.com/infyiff/backup/main/SimpleSpyV3/main.lua"))()
end)

addcmd("executor", {}, function(args, speaker)
    -- by dnezero
    notify("Loading", "Hold on a sec")
    loadstring(game:HttpGet("https://raw.githubusercontent.com/infyiff/backup/refs/heads/main/executor.lua"))()
end)

addcmd("nds", {"naturaldisaster", "disastersurvival"}, function(args, speaker)
    notify("NDS", "Loading Natural Disaster Survival...")
    loadstring(game:HttpGet("https://raw.githubusercontent.com/KaterHub-Inc/NaturalDisasterSurvival/refs/heads/main/main.lua"))()
end)

addcmd('audiologger',{'alogger'},function(args, speaker)
        notify("Loading",'Hold on a sec')
        loadstring(game:HttpGet(('https://raw.githubusercontent.com/infyiff/backup/main/audiologger.lua'),true))()
end)

local loopgoto = nil
addcmd('loopgoto',{},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                loopgoto = nil
                if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                        speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                        wait(.1)
                end
                loopgoto = Players[v]
                local distance = 3
                if args[2] and isNumber(args[2]) then
                        distance = args[2]
                end
                local lDelay = 0
                if args[3] and isNumber(args[3]) then
                        lDelay = args[3]
                end
                repeat
                        if Players:FindFirstChild(v) then
                                if Players[v].Character ~= nil then
                                        getRoot(speaker.Character).CFrame = getRoot(Players[v].Character).CFrame + Vector3.new(distance,1,0)
                                end
                                wait(lDelay)
                        else
                                loopgoto = nil
                        end
                until loopgoto ~= Players[v]
        end
end)

addcmd('unloopgoto',{'noloopgoto'},function(args, speaker)
        loopgoto = nil
end)

addcmd('headsit',{},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        if headSit then headSit:Disconnect() end
        for i,v in pairs(players)do
                speaker.Character:FindFirstChildOfClass('Humanoid').Sit = true
                headSit = RunService.Heartbeat:Connect(function()
                        if Players:FindFirstChild(Players[v].Name) and Players[v].Character ~= nil and getRoot(Players[v].Character) and getRoot(speaker.Character) and speaker.Character:FindFirstChildOfClass('Humanoid').Sit == true then
                                getRoot(speaker.Character).CFrame = getRoot(Players[v].Character).CFrame * CFrame.Angles(0,math.rad(0),0)* CFrame.new(0,1.6,0.4)
                        else
                                headSit:Disconnect()
                        end
                end)
        end
end)

addcmd('chat',{'say'},function(args, speaker)
        local cString = getstring(1, args)
        chatMessage(cString)
end)


spamming = false
spamspeed = 1
addcmd('spam',{},function(args, speaker)
        spamming = true
        local spamstring = getstring(1, args)
        repeat wait(spamspeed)
                chatMessage(spamstring)
        until spamming == false
end)

addcmd('nospam',{'unspam'},function(args, speaker)
        spamming = false
end)

addcmd('whisper',{'pm'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                task.spawn(function()
                        local plrName = Players[v].Name
                        local pmstring = getstring(2, args)
                        chatMessage("/w "..plrName.." "..pmstring)
                end)
        end
end)

pmspamming = {}
addcmd('pmspam',{},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                task.spawn(function()
                        local plrName = Players[v].Name
                        if FindInTable(pmspamming, plrName) then return end
                        table.insert(pmspamming, plrName)
                        local pmspamstring = getstring(2, args)
                        repeat
                                if Players:FindFirstChild(v) then
                                        wait(spamspeed)
                                        chatMessage("/w "..plrName.." "..pmspamstring)
                                else
                                        for a,b in pairs(pmspamming) do if b == plrName then table.remove(pmspamming, a) end end
                                end
                        until not FindInTable(pmspamming, plrName)
                end)
        end
end)

addcmd('nopmspam',{'unpmspam'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                task.spawn(function()
                        for a,b in pairs(pmspamming) do
                                if b == Players[v].Name then
                                        table.remove(pmspamming, a)
                                end
                        end
                end)
        end
end)

addcmd('spamspeed',{},function(args, speaker)
        local speed = args[1] or 1
        if isNumber(speed) then
                spamspeed = speed
        end
end)

addcmd('bubblechat',{},function(args, speaker)
        if isLegacyChat then
                ChatService.BubbleChatEnabled = true
        else
                TextChatService.BubbleChatConfiguration.Enabled = true
        end
end)

addcmd('unbubblechat',{'nobubblechat'},function(args, speaker)
        if isLegacyChat then
                ChatService.BubbleChatEnabled = false
        else
                TextChatService.BubbleChatConfiguration.Enabled = false
        end
end)

addcmd("chatwindow", {}, function(args, speaker)
        TextChatService.ChatWindowConfiguration.Enabled = true
end)

addcmd("unchatwindow", {"nochatwindow"}, function(args, speaker)
        TextChatService.ChatWindowConfiguration.Enabled = false
end)

addcmd("darkchat", {}, function(args, speaker)
    local BCC = TextChatService:FindFirstChildOfClass("BubbleChatConfiguration")
    local CWC = TextChatService:FindFirstChildOfClass("ChatWindowConfiguration")
    local CIBC = TextChatService:FindFirstChildOfClass("ChatInputBarConfiguration")
    if BCC then
        BCC.Enabled = true
        BCC.BackgroundColor3 = Color3.fromRGB()
        BCC.BackgroundTransparency = 0.3
        BCC.TailVisible = true
        BCC.TextColor3 = Color3.fromRGB(0xFF, 0xFF, 0xFF)
    end
    if CWC then
        CWC.Enabled = true
        CWC.BackgroundColor3 = Color3.fromRGB()
        CWC.BackgroundTransparency = 0.3
        CWC.TextColor3 = Color3.fromRGB(0xFF, 0xFF, 0xFF)
        CWC.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
        CWC.TextStrokeTransparency = 0.5
    end
    if CIBC then
        CIBC.Enabled = true
        CIBC.BackgroundColor3 = Color3.fromRGB()
        CIBC.BackgroundTransparency = 0.5
        CIBC.PlaceholderColor3 = Color3.fromRGB(0xFF, 0xFF, 0xFF)
        CIBC.TextColor3 = Color3.fromRGB(0xFF, 0xFF, 0xFF)
        CIBC.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
        CIBC.TextStrokeTransparency = 0.5
    end
end)

addcmd('blockhead',{},function(args, speaker)
        speaker.Character.Head:FindFirstChildOfClass("SpecialMesh"):Destroy()
end)

addcmd('blockhats',{},function(args, speaker)
        for _,v in pairs(speaker.Character:FindFirstChildOfClass('Humanoid'):GetAccessories()) do
                for i,c in pairs(v:GetDescendants()) do
                        if c:IsA("SpecialMesh") then
                                c:Destroy()
                        end
                end
        end
end)

addcmd('blocktool',{},function(args, speaker)
        for _,v in pairs(speaker.Character:GetChildren()) do
                if v:IsA("Tool") or v:IsA("HopperBin") then
                        for i,c in pairs(v:GetDescendants()) do
                                if c:IsA("SpecialMesh") then
                                        c:Destroy()
                                end
                        end
                end
        end
end)

addcmd('creeper',{},function(args, speaker)
        if r15(speaker) then
                speaker.Character.Head:FindFirstChildOfClass("SpecialMesh"):Destroy()
                speaker.Character.LeftUpperArm:Destroy()
                speaker.Character.RightUpperArm:Destroy()
                speaker.Character:FindFirstChildOfClass("Humanoid"):RemoveAccessories()
        else
                speaker.Character.Head:FindFirstChildOfClass("SpecialMesh"):Destroy()
                speaker.Character["Left Arm"]:Destroy()
                speaker.Character["Right Arm"]:Destroy()
                speaker.Character:FindFirstChildOfClass("Humanoid"):RemoveAccessories()
        end
end)

function getTorso(x)
        x = x or Players.LocalPlayer.Character
        return x:FindFirstChild("Torso") or x:FindFirstChild("UpperTorso") or x:FindFirstChild("LowerTorso") or x:FindFirstChild("HumanoidRootPart")
end

addcmd("bang", {"rape"}, function(args, speaker)
        execCmd("unbang")
        wait()
        local humanoid = speaker.Character:FindFirstChildWhichIsA("Humanoid")
        bangAnim = Instance.new("Animation")
        bangAnim.AnimationId = not r15(speaker) and "rbxassetid://148840371" or "rbxassetid://5918726674"
        bang = humanoid:LoadAnimation(bangAnim)
        bang:Play(0.1, 1, 1)
        bang:AdjustSpeed(args[2] or 3)
        bangDied = humanoid.Died:Connect(function()
                bang:Stop()
                bangAnim:Destroy()
                bangDied:Disconnect()
                bangLoop:Disconnect()
        end)
        if args[1] then
                local players = getPlayer(args[1], speaker)
                for _, v in pairs(players) do
                        local bangplr = Players[v].Name
                        local bangOffet = CFrame.new(0, 0, 1.1)
                        bangLoop = RunService.Stepped:Connect(function()
                                pcall(function()
                                        local otherRoot = getTorso(Players[bangplr].Character)
                                        getRoot(speaker.Character).CFrame = otherRoot.CFrame * bangOffet
                                end)
                        end)
                end
        end
end)

addcmd("unbang", {"unrape"}, function(args, speaker)
        if bangDied then
                bangDied:Disconnect()
                bang:Stop()
                bangAnim:Destroy()
                bangLoop:Disconnect()
        end
end)

addcmd('carpet',{},function(args, speaker)
        if not r15(speaker) then
                execCmd('uncarpet')
                wait()
                local players = getPlayer(args[1], speaker)
                for i,v in pairs(players)do
                        carpetAnim = Instance.new("Animation")
                        carpetAnim.AnimationId = "rbxassetid://282574440"
                        carpet = speaker.Character:FindFirstChildOfClass('Humanoid'):LoadAnimation(carpetAnim)
                        carpet:Play(.1, 1, 1)
                        local carpetplr = Players[v].Name
                        carpetDied = speaker.Character:FindFirstChildOfClass'Humanoid'.Died:Connect(function()
                                carpetLoop:Disconnect()
                                carpet:Stop()
                                carpetAnim:Destroy()
                                carpetDied:Disconnect()
                        end)
                        carpetLoop = RunService.Heartbeat:Connect(function()
                                pcall(function()
                                        getRoot(Players.LocalPlayer.Character).CFrame = getRoot(Players[carpetplr].Character).CFrame
                                end)
                        end)
                end
        else
                notify('R6 Required','This command requires the r6 rig type')
        end
end)

addcmd('uncarpet',{'nocarpet'},function(args, speaker)
        if carpetLoop then
                carpetLoop:Disconnect()
                carpetDied:Disconnect()
                carpet:Stop()
                carpetAnim:Destroy()
        end
end)

addcmd('friend',{},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                speaker:RequestFriendship(Players[v])
        end
end)

addcmd('unfriend',{},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                speaker:RevokeFriendship(Players[v])
        end
end)

addcmd('bringpart',{},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v.Name:lower() == getstring(1, args):lower() and v:IsA("BasePart") then
                        v.CFrame = getRoot(speaker.Character).CFrame
                end
        end
end)

addcmd('bringpartclass',{'bpc'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v.ClassName:lower() == getstring(1, args):lower() and v:IsA("BasePart") then
                        v.CFrame = getRoot(speaker.Character).CFrame
                end
        end
end)

gotopartDelay = 0.1
addcmd('gotopart',{'topart'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v.Name:lower() == getstring(1, args):lower() and v:IsA("BasePart") then
                        if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                wait(.1)
                        end
                        wait(gotopartDelay)
                        getRoot(speaker.Character).CFrame = v.CFrame
                end
        end
end)

addcmd('tweengotopart',{'tgotopart','ttopart'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v.Name:lower() == getstring(1, args):lower() and v:IsA("BasePart") then
                        if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                wait(.1)
                        end
                        wait(gotopartDelay)
                        TweenService:Create(getRoot(speaker.Character), TweenInfo.new(tweenSpeed, Enum.EasingStyle.Linear), {CFrame = v.CFrame}):Play()
                end
        end
end)

addcmd('gotopartclass',{'gpc'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v.ClassName:lower() == getstring(1, args):lower() and v:IsA("BasePart") then
                        if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                wait(.1)
                        end
                        wait(gotopartDelay)
                        getRoot(speaker.Character).CFrame = v.CFrame
                end
        end
end)

addcmd('tweengotopartclass',{'tgpc'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v.ClassName:lower() == getstring(1, args):lower() and v:IsA("BasePart") then
                        if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                wait(.1)
                        end
                        wait(gotopartDelay)
                        TweenService:Create(getRoot(speaker.Character), TweenInfo.new(tweenSpeed, Enum.EasingStyle.Linear), {CFrame = v.CFrame}):Play()
                end
        end
end)

addcmd('gotomodel',{'tomodel'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v.Name:lower() == getstring(1, args):lower() and v:IsA("Model") then
                        if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                wait(.1)
                        end
                        wait(gotopartDelay)
                        getRoot(speaker.Character).CFrame = v:GetModelCFrame()
                end
        end
end)

addcmd('tweengotomodel',{'tgotomodel','ttomodel'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v.Name:lower() == getstring(1, args):lower() and v:IsA("Model") then
                        if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                                speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                                wait(.1)
                        end
                        wait(gotopartDelay)
                        TweenService:Create(getRoot(speaker.Character), TweenInfo.new(tweenSpeed, Enum.EasingStyle.Linear), {CFrame = v:GetModelCFrame()}):Play()
                end
        end
end)

addcmd('gotopartdelay',{},function(args, speaker)
        local gtpDelay = args[1] or 0.1
        if isNumber(gtpDelay) then
                gotopartDelay = gtpDelay
        end
end)

addcmd('noclickdetectorlimits',{'nocdlimits','removecdlimits'},function(args, speaker)
        for i,v in ipairs(workspace:GetDescendants()) do
                if v:IsA("ClickDetector") then
                        v.MaxActivationDistance = math.huge
                end
        end
end)

addcmd('fireclickdetectors',{'firecd','firecds'}, function(args, speaker)
        if fireclickdetector then
                if args[1] then
                        local name = getstring(1, args):lower()
                        for _, descendant in ipairs(workspace:GetDescendants()) do
                                if descendant:IsA("ClickDetector") and descendant.Name:lower() == name or descendant.Parent.Name:lower() == name then
                                        fireclickdetector(descendant)
                                end
                        end
                else
                        for _, descendant in ipairs(workspace:GetDescendants()) do
                                if descendant:IsA("ClickDetector") then
                                        fireclickdetector(descendant)
                                end
                        end
                end
        else
                notify("Incompatible Exploit", "Your exploit does not support this command (missing fireclickdetector)")
        end
end)

addcmd('noproximitypromptlimits',{'nopplimits','removepplimits'},function(args, speaker)
        for i,v in pairs(workspace:GetDescendants()) do
                if v:IsA("ProximityPrompt") then
                        v.MaxActivationDistance = math.huge
                end
        end
end)

addcmd('fireproximityprompts',{'firepp'},function(args, speaker)
        if fireproximityprompt then
                if args[1] then
                        local name = getstring(1, args)
                        for _, descendant in ipairs(workspace:GetDescendants()) do
                                if descendant:IsA("ProximityPrompt") and descendant.Name == name or descendant.Parent.Name == name then
                                        fireproximityprompt(descendant)
                                end
                        end
                else
                        for _, descendant in ipairs(workspace:GetDescendants()) do
                                if descendant:IsA("ProximityPrompt") then
                                        fireproximityprompt(descendant)
                                end
                        end
                end
        else
                notify("Incompatible Exploit", "Your exploit does not support this command (missing fireproximityprompt)")
        end
end)

local PromptButtonHoldBegan = nil
addcmd('instantproximityprompts',{'instantpp'},function(args, speaker)
        if fireproximityprompt then
                execCmd("uninstantproximityprompts")
                wait(0.1)
                PromptButtonHoldBegan = ProximityPromptService.PromptButtonHoldBegan:Connect(function(prompt)
                        fireproximityprompt(prompt)
                end)
        else
                notify('Incompatible Exploit','Your exploit does not support this command (missing fireproximityprompt)')
        end
end)

addcmd('uninstantproximityprompts',{'uninstantpp'},function(args, speaker)
        if PromptButtonHoldBegan ~= nil then
                PromptButtonHoldBegan:Disconnect()
                PromptButtonHoldBegan = nil
        end
end)

addcmd('notifyping',{'ping'},function(args, speaker)
        notify("Ping", math.round(speaker:GetNetworkPing() * 1000) .. "ms")
end)

addcmd('grabtools', {}, function(args, speaker)
        local humanoid = speaker.Character:FindFirstChildWhichIsA("Humanoid")
        for _, child in ipairs(workspace:GetChildren()) do
                if speaker.Character and child:IsA("BackpackItem") and child:FindFirstChild("Handle") then
                        humanoid:EquipTool(child)
                end
        end

        if grabtoolsFunc then 
                grabtoolsFunc:Disconnect() 
        end

        grabtoolsFunc = workspace.ChildAdded:Connect(function(child)
                if speaker.Character and child:IsA("BackpackItem") and child:FindFirstChild("Handle") then
                        humanoid:EquipTool(child)
                end
        end)

        notify("Grabtools", "Picking up any dropped tools")
end)

addcmd('nograbtools',{'ungrabtools'},function(args, speaker)
        if grabtoolsFunc then 
                grabtoolsFunc:Disconnect() 
        end

        notify("Grabtools", "Grabtools has been disabled")
end)

local specifictoolremoval = {}
addcmd('removespecifictool',{},function(args, speaker)
        if args[1] and speaker:FindFirstChildOfClass("Backpack") then
                local tool = string.lower(getstring(1, args))
                local RST = RunService.RenderStepped:Connect(function()
                        if speaker:FindFirstChildOfClass("Backpack") then
                                for i,v in pairs(speaker:FindFirstChildOfClass("Backpack"):GetChildren()) do
                                        if v.Name:lower() == tool then
                                                v:Remove()
                                        end
                                end
                        end
                end)
                specifictoolremoval[tool] = RST
        end
end)

addcmd('unremovespecifictool',{},function(args, speaker)
        if args[1] then
                local tool = string.lower(getstring(1, args))
                if specifictoolremoval[tool] ~= nil then
                        specifictoolremoval[tool]:Disconnect()
                        specifictoolremoval[tool] = nil
                end
        end
end)

addcmd('clearremovespecifictool',{},function(args, speaker)
        for obj in pairs(specifictoolremoval) do
                specifictoolremoval[obj]:Disconnect()
                specifictoolremoval[obj] = nil
        end
end)

addcmd('light',{},function(args, speaker)
        local light = Instance.new("PointLight")
        light.Parent = getRoot(speaker.Character)
        light.Range = 30
        if args[1] then
                light.Brightness = args[2]
                light.Range = args[1]
        else
                light.Brightness = 5
        end
end)

addcmd('unlight',{'nolight'},function(args, speaker)
        for i,v in pairs(speaker.Character:GetDescendants()) do
                if v.ClassName == "PointLight" then
                        v:Destroy()
                end
        end
end)

addcmd('copytools',{},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players)do
                task.spawn(function()
                        for i,v in pairs(Players[v]:FindFirstChildOfClass("Backpack"):GetChildren()) do
                                if v:IsA('Tool') or v:IsA('HopperBin') then
                                        v:Clone().Parent = speaker:FindFirstChildOfClass("Backpack")
                                end
                        end
                end)
        end
end)

addcmd('naked',{},function(args, speaker)
        for i,v in pairs(speaker.Character:GetDescendants()) do
                if v:IsA("Clothing") or v:IsA("ShirtGraphic") then
                        v:Destroy()
                end
        end
end)

addcmd('noface',{'removeface'},function(args, speaker)
        for i,v in pairs(speaker.Character:GetDescendants()) do
                if v:IsA("Decal") and v.Name == 'face' then
                        v:Destroy()
                end
        end
end)

addcmd('spawnpoint',{'spawn'},function(args, speaker)
        spawnpos = getRoot(speaker.Character).CFrame
        spawnpoint = true
        spDelay = tonumber(args[1]) or 0.1
        notify('Spawn Point','Spawn point created at '..tostring(spawnpos))
end)

addcmd('nospawnpoint',{'nospawn','removespawnpoint'},function(args, speaker)
        spawnpoint = false
        notify('Spawn Point','Removed spawn point')
end)

addcmd('flashback',{'diedtp'},function(args, speaker)
        if lastDeath ~= nil then
                if speaker.Character:FindFirstChildOfClass('Humanoid') and speaker.Character:FindFirstChildOfClass('Humanoid').SeatPart then
                        speaker.Character:FindFirstChildOfClass('Humanoid').Sit = false
                        wait(.1)
                end
                getRoot(speaker.Character).CFrame = lastDeath
        end
end)

addcmd('hatspin',{'spinhats'},function(args, speaker)
        execCmd('unhatspin')
        wait(.5)
        for _,v in pairs(speaker.Character:FindFirstChildOfClass('Humanoid'):GetAccessories()) do
                local keep = Instance.new("BodyPosition") keep.Name = randomString() keep.Parent = v.Handle
                local spin = Instance.new("BodyAngularVelocity") spin.Name = randomString() spin.Parent = v.Handle
                v.Handle:FindFirstChildOfClass("Weld"):Destroy()
                if args[1] then
                        spin.AngularVelocity = Vector3.new(0, args[1], 0)
                        spin.MaxTorque = Vector3.new(0, args[1] * 2, 0)
                else
                        spin.AngularVelocity = Vector3.new(0, 100, 0)
                        spin.MaxTorque = Vector3.new(0, 200, 0)
                end
                keep.P = 30000
                keep.D = 50
                spinhats = RunService.Stepped:Connect(function()
                        pcall(function()
                                keep.Position = Players.LocalPlayer.Character.Head.Position
                        end)
                end)
        end
end)

addcmd('unhatspin',{'unspinhats'},function(args, speaker)
        if spinhats then
                spinhats:Disconnect()
        end
        for _,v in pairs(speaker.Character:FindFirstChildOfClass('Humanoid'):GetAccessories()) do
                v.Parent = workspace
                for i,c in pairs(v.Handle) do
                        if c:IsA("BodyPosition") or c:IsA("BodyAngularVelocity") then
                                c:Destroy()
                        end
                end
                wait()
                v.Parent = speaker.Character
        end
end)

addcmd('clearhats',{'cleanhats'},function(args, speaker)
        if firetouchinterest then
                local Player = Players.LocalPlayer
                local Character = Player.Character
                local Old = getRoot(Character).CFrame
                local Hats = {}

                for _, child in ipairs(workspace:GetChildren()) do
                        if child:IsA("Accessory") then
                                table.insert(Hats, child)
                        end
                end

                for _, accessory in ipairs(Character:FindFirstChildOfClass("Humanoid"):GetAccessories()) do
                        accessory:Destroy()
                end

                for i = 1, #Hats do
                        repeat RunService.Heartbeat:wait() until Hats[i]
                        firetouchinterest(Hats[i].Handle,getRoot(Character),0)
                        repeat RunService.Heartbeat:wait() until Character:FindFirstChildOfClass("Accessory")
                        Character:FindFirstChildOfClass("Accessory"):Destroy()
                        repeat RunService.Heartbeat:wait() until not Character:FindFirstChildOfClass("Accessory")
                end

                execCmd("reset")

                Player.CharacterAdded:Wait()

                for i = 1,20 do 
                        RunService.Heartbeat:Wait()
                        if getRoot(Player.Character) then
                                getRoot(Player.Character).Humanoid.RootPart.CFrame = Old
                        end
                end
        else
                notify("Incompatible Exploit","Your exploit does not support this command (missing firetouchinterest)")
        end
end)

addcmd('split',{},function(args, speaker)
        if r15(speaker) then
                speaker.Character.UpperTorso.Waist:Destroy()
        else
                notify('R15 Required','This command requires the r15 rig type')
        end
end)

addcmd('nilchar',{},function(args, speaker)
        if speaker.Character ~= nil then
                speaker.Character.Parent = nil
        end
end)

addcmd('unnilchar',{'nonilchar'},function(args, speaker)
        if speaker.Character ~= nil then
                speaker.Character.Parent = workspace
        end
end)

addcmd('noroot',{'removeroot','rroot'},function(args, speaker)
        if speaker.Character ~= nil then
                local char = Players.LocalPlayer.Character
                char.Parent = nil
                char.Humanoid.RootPart:Destroy()
                char.Parent = workspace
        end
end)

addcmd('replaceroot',{'replacerootpart'},function(args, speaker)
        if speaker.Character ~= nil and getRoot(speaker.Character) then
                local Char = speaker.Character
                local OldParent = Char.Parent
                local HRP = Char and getRoot(Char)
                local OldPos = HRP.CFrame
                Char.Parent = game
                local HRP1 = HRP:Clone()
                HRP1.Parent = Char
                HRP = HRP:Destroy()
                HRP1.CFrame = OldPos
                Char.Parent = OldParent
        end
end)

addcmd('clearcharappearance',{'clearchar','clrchar'},function(args, speaker)
        speaker:ClearCharacterAppearance()
end)

addcmd('equiptools',{},function(args, speaker)
        for i,v in pairs(speaker:FindFirstChildOfClass("Backpack"):GetChildren()) do
                if v:IsA("Tool") or v:IsA("HopperBin") then
                        v.Parent = speaker.Character
                end
        end
end)

addcmd('unequiptools',{},function(args, speaker)
        speaker.Character:FindFirstChildOfClass('Humanoid'):UnequipTools()
end)

local function GetHandleTools(p)
        p = p or Players.LocalPlayer
        local r = {}
        for _, v in ipairs(p.Character and p.Character:GetChildren() or {}) do
                if v.IsA(v, "BackpackItem") and v.FindFirstChild(v, "Handle") then
                        r[#r + 1] = v
                end
        end
        for _, v in ipairs(p.Backpack:GetChildren()) do
                if v.IsA(v, "BackpackItem") and v.FindFirstChild(v, "Handle") then
                        r[#r + 1] = v
                end
        end
        return r
end
addcmd('dupetools', {'clonetools'}, function(args, speaker)
        local LOOP_NUM = tonumber(args[1]) or 1
        local OrigPos = speaker.Character.Humanoid.RootPart.Position
        local Tools, TempPos = {}, Vector3.new(math.random(-2e5, 2e5), 2e5, math.random(-2e5, 2e5))
        for i = 1, LOOP_NUM do
                local Human = speaker.Character:WaitForChild("Humanoid")
                wait(.1, Human.Parent:MoveTo(TempPos))
                Human.RootPart.Anchored = speaker:ClearCharacterAppearance(wait(.1)) or true
                local t = GetHandleTools(speaker)
                while #t > 0 do
                        for _, v in ipairs(t) do
                                task.spawn(function()
                                        for _ = 1, 25 do
                                                v.Parent = speaker.Character
                                                v.Handle.Anchored = true
                                        end
                                        for _ = 1, 5 do
                                                v.Parent = workspace
                                        end
                                        table.insert(Tools, v.Handle)
                                end)
                        end
                        t = GetHandleTools(speaker)
                end
                wait(.1)
                speaker.Character = speaker.Character:Destroy()
                speaker.CharacterAdded:Wait():WaitForChild("Humanoid").Parent:MoveTo(LOOP_NUM == i and OrigPos or TempPos, wait(.1))
                if i == LOOP_NUM or i % 5 == 0 then
                        local HRP = speaker.Character.Humanoid.RootPart
                        if type(firetouchinterest) == "function" then
                                for _, v in ipairs(Tools) do
                                        v.Anchored = not firetouchinterest(v, HRP, 1, firetouchinterest(v, HRP, 0)) and false or false
                                end
                        else
                                for _, v in ipairs(Tools) do
                                        task.spawn(function()
                                                local x = v.CanCollide
                                                v.CanCollide = false
                                                v.Anchored = false
                                                for _ = 1, 10 do
                                                        v.CFrame = HRP.CFrame
                                                        wait()
                                                end
                                                v.CanCollide = x
                                        end)
                                end
                        end
                        wait(.1)
                        Tools = {}
                end
                TempPos = TempPos + Vector3.new(10, math.random(-5, 5), 0)
        end
end)

addcmd('touchinterests', {'touchinterest', 'firetouchinterests', 'firetouchinterest'}, function(args, speaker)
        local Root = getRoot(speaker.Character) or speaker.Character:FindFirstChildWhichIsA("BasePart")

        if not firetouchinterest then
                notify("Incompatible Exploit", "Your exploit does not support this command (missing firetouchinterest)")
                return
        end

        local function Touch(x)
                x = x.FindFirstAncestorWhichIsA(x, "Part")
                if x then
                        return task.spawn(function()
                                firetouchinterest(x, Root, 1, wait() and firetouchinterest(x, Root, 0))
                        end)
                end
                x.CFrame = Root.CFrame
        end

        if args[1] then
                local name = getstring(1, args):lower()
                print(name..' -name')
                for _, v in ipairs(workspace:GetDescendants()) do
                        if v:IsA("TouchTransmitter") and v.Name:lower() == name or v.Parent.Name:lower() == name then
                                Touch(v)
                        end
                end
        else
                for _, v in ipairs(workspace:GetDescendants()) do
                        if v.IsA(v, "TouchTransmitter") then
                                Touch(v)
                        end
                end
        end
end)

-- TouchParts: finds all parts matching a name, teleports player to each one
-- Optional delay arg (seconds), default 0.2s
touchpartsActive = false
addcmd('touchparts', {}, function(args, speaker)
        if touchpartsActive then
                touchpartsActive = false
                notify('TouchParts', 'Stopped')
                return
        end

        local partName = args[1]
        if not partName or partName == '' then
                notify('TouchParts', 'Usage: touchparts [part name] [delay]')
                return
        end

        local char = speaker.Character
        if not char or not getRoot(char) then
                notify('TouchParts', 'Character not found')
                return
        end

        local delay = tonumber(args[2]) or 0.2
        if delay < 0.05 then delay = 0.05 end

        local targetParts = {}
        for _, obj in pairs(workspace:GetDescendants()) do
                if obj:IsA('BasePart') and obj.Name:lower():find(partName:lower(), 1, true) then
                        table.insert(targetParts, obj)
                end
        end

        if #targetParts == 0 then
                notify('TouchParts', 'No parts found matching "' .. partName .. '"')
                return
        end

        notify('TouchParts', 'Found ' .. #targetParts .. ' parts (' .. delay .. 's delay) - teleporting...')
        touchpartsActive = true

        spawn(function()
                local idx = 1
                while touchpartsActive and idx <= #targetParts do
                        local part = targetParts[idx]
                        if part and part.Parent then
                                pcall(function()
                                        local root = getRoot(char)
                                        if root then
                                                root.CFrame = part.CFrame + Vector3.new(0, 3, 0)
                                        end
                                end)
                        end
                        idx = idx + 1
                        wait(delay)
                end
                touchpartsActive = false
                pcall(function() notify('TouchParts', 'Done!') end)
        end)
end)

addcmd('fullbright',{'fb','fullbrightness'},function(args, speaker)
        Lighting.Brightness = 2
        Lighting.ClockTime = 14
        Lighting.FogEnd = 100000
        Lighting.GlobalShadows = false
        Lighting.OutdoorAmbient = Color3.fromRGB(128, 128, 128)
end)

addcmd('loopfullbright',{'loopfb'},function(args, speaker)
        if brightLoop then
                brightLoop:Disconnect()
        end
        local function brightFunc()
                Lighting.Brightness = 2
                Lighting.ClockTime = 14
                Lighting.FogEnd = 100000
                Lighting.GlobalShadows = false
                Lighting.OutdoorAmbient = Color3.fromRGB(128, 128, 128)
        end

        brightLoop = RunService.RenderStepped:Connect(brightFunc)
end)

addcmd('unloopfullbright',{'unloopfb'},function(args, speaker)
        if brightLoop then
                brightLoop:Disconnect()
        end
end)

addcmd('ambient',{},function(args, speaker)
        Lighting.Ambient = Color3.new(args[1],args[2],args[3])
        Lighting.OutdoorAmbient = Color3.new(args[1],args[2],args[3])
end)

addcmd('day',{},function(args, speaker)
        Lighting.ClockTime = 14
end)

addcmd('night',{},function(args, speaker)
        Lighting.ClockTime = 0
end)

addcmd('nofog',{},function(args, speaker)
        Lighting.FogEnd = 100000
        for i,v in pairs(Lighting:GetDescendants()) do
                if v:IsA("Atmosphere") then
                        v:Destroy()
                end
        end
end)

addcmd('brightness',{},function(args, speaker)
        Lighting.Brightness = args[1]
end)

addcmd('globalshadows',{'gshadows'},function(args, speaker)
        Lighting.GlobalShadows = true
end)

addcmd('unglobalshadows',{'nogshadows','ungshadows','noglobalshadows'},function(args, speaker)
        Lighting.GlobalShadows = false
end)

origsettings = {abt = Lighting.Ambient, oabt = Lighting.OutdoorAmbient, brt = Lighting.Brightness, time = Lighting.ClockTime, fe = Lighting.FogEnd, fs = Lighting.FogStart, gs = Lighting.GlobalShadows}

addcmd('restorelighting',{'rlighting'},function(args, speaker)
        Lighting.Ambient = origsettings.abt
        Lighting.OutdoorAmbient = origsettings.oabt
        Lighting.Brightness = origsettings.brt
        Lighting.ClockTime = origsettings.time
        Lighting.FogEnd = origsettings.fe
        Lighting.FogStart = origsettings.fs
        Lighting.GlobalShadows = origsettings.gs
end)

addcmd('stun',{'platformstand'},function(args, speaker)
        speaker.Character:FindFirstChildOfClass('Humanoid').PlatformStand = true
end)

addcmd('unstun',{'nostun','unplatformstand','noplatformstand'},function(args, speaker)
        speaker.Character:FindFirstChildOfClass('Humanoid').PlatformStand = false
end)

addcmd('norotate',{'noautorotate'},function(args, speaker)
        speaker.Character:FindFirstChildOfClass('Humanoid').AutoRotate  = false
end)

addcmd('unnorotate',{'autorotate'},function(args, speaker)
        speaker.Character:FindFirstChildOfClass('Humanoid').AutoRotate  = true
end)

addcmd('enablestate',{},function(args, speaker)
        local x = args[1]
        if not tonumber(x) then
                local x = Enum.HumanoidStateType[args[1]]
        end
        speaker.Character:FindFirstChildOfClass("Humanoid"):SetStateEnabled(x, true)
end)

addcmd('disablestate',{},function(args, speaker)
        local x = args[1]
        if not tonumber(x) then
                local x = Enum.HumanoidStateType[args[1]]
        end
        speaker.Character:FindFirstChildOfClass("Humanoid"):SetStateEnabled(x, false)
end)

addcmd('drophats',{'drophat'},function(args, speaker)
        if speaker.Character then
                for _,v in pairs(speaker.Character:FindFirstChildOfClass('Humanoid'):GetAccessories()) do
                        v.Parent = workspace
                end
        end
end)

addcmd('deletehats',{'nohats','rhats'},function(args, speaker)
        for i,v in next, speaker.Character:GetDescendants() do
                if v:IsA("Accessory") then
                        for i,p in next, v:GetDescendants() do
                                if p:IsA("Weld") then
                                        p:Destroy()
                                end
                        end
                end
        end
end)

addcmd('droptools',{'droptool'},function(args, speaker)
        for i,v in pairs(Players.LocalPlayer.Backpack:GetChildren()) do
                if v:IsA("Tool") then
                        v.Parent = Players.LocalPlayer.Character
                end
        end
        wait()
        for i,v in pairs(Players.LocalPlayer.Character:GetChildren()) do
                if v:IsA("Tool") then
                        v.Parent = workspace
                end
        end
end)

addcmd('droppabletools',{},function(args, speaker)
        if speaker.Character then
                for _,obj in pairs(speaker.Character:GetChildren()) do
                        if obj:IsA("Tool") then
                                obj.CanBeDropped = true
                        end
                end
        end
        if speaker:FindFirstChildOfClass("Backpack") then
                for _,obj in pairs(speaker:FindFirstChildOfClass("Backpack"):GetChildren()) do
                        if obj:IsA("Tool") then
                                obj.CanBeDropped = true
                        end
                end
        end
end)

local currentToolSize = ""
local currentGripPos = ""
addcmd('reach',{},function(args, speaker)
        execCmd('unreach')
        wait()
        for i,v in pairs(speaker.Character:GetDescendants()) do
                if v:IsA("Tool") then
                        if args[1] then
                                currentToolSize = v.Handle.Size
                                currentGripPos = v.GripPos
                                local a = Instance.new("SelectionBox")
                                a.Name = "SelectionBoxCreated"
                                a.Parent = v.Handle
                                a.Adornee = v.Handle
                                v.Handle.Massless = true
                                v.Handle.Size = Vector3.new(0.5,0.5,args[1])
                                v.GripPos = Vector3.new(0,0,0)
                                speaker.Character:FindFirstChildOfClass('Humanoid'):UnequipTools()
                        else
                                currentToolSize = v.Handle.Size
                                currentGripPos = v.GripPos
                                local a = Instance.new("SelectionBox")
                                a.Name = "SelectionBoxCreated"
                                a.Parent = v.Handle
                                a.Adornee = v.Handle
                                v.Handle.Massless = true
                                v.Handle.Size = Vector3.new(0.5,0.5,60)
                                v.GripPos = Vector3.new(0,0,0)
                                speaker.Character:FindFirstChildOfClass('Humanoid'):UnequipTools()
                        end
                end
        end
end)

addcmd("boxreach", {}, function(args, speaker)
        execCmd("unreach")
        wait()
        for i, v in pairs(speaker.Character:GetDescendants()) do
                if v:IsA("Tool") then
                        local size = tonumber(args[1]) or 60
                        currentToolSize = v.Handle.Size
                        currentGripPos = v.GripPos
                        local a = Instance.new("SelectionBox")
                        a.Name = "SelectionBoxCreated"
                        a.Parent = v.Handle
                        a.Adornee = v.Handle
                        v.Handle.Massless = true
                        v.Handle.Size = Vector3.new(size, size, size)
                        v.GripPos = Vector3.new(0, 0, 0)
                        speaker.Character:FindFirstChildOfClass("Humanoid"):UnequipTools()
                end
        end
end)

addcmd('unreach',{'noreach','unboxreach'},function(args, speaker)
        for i,v in pairs(speaker.Character:GetDescendants()) do
                if v:IsA("Tool") then
                        v.Handle.Size = currentToolSize
                        v.GripPos = currentGripPos
                        v.Handle.SelectionBoxCreated:Destroy()
                end
        end
end)

addcmd('grippos',{},function(args, speaker)
        for i,v in pairs(speaker.Character:GetDescendants()) do
                if v:IsA("Tool") then
                        v.Parent = speaker:FindFirstChildOfClass("Backpack")
                        v.GripPos = Vector3.new(args[1],args[2],args[3])
                        v.Parent = speaker.Character
                end
        end
end)

addcmd('usetools', {}, function(args, speaker)
        local Backpack = speaker:FindFirstChildOfClass("Backpack")
        local amount = tonumber(args[1]) or 1
        local delay_ = tonumber(args[2]) or false
        for _, v in ipairs(Backpack:GetChildren()) do
                v.Parent = speaker.Character
                task.spawn(function()
                        for _ = 1, amount do
                                v:Activate()
                                if delay_ then
                                        wait(delay_)
                                end
                        end
                        v.Parent = Backpack
                end)
        end
end)

addcmd("logs", {}, function(args, speaker)
        logsEnabled = true
        jLogsEnabled = true
        Toggle.Text = "Enabled"
        Toggle_2.Text = "Enabled"
        logs:TweenPosition(UDim2.new(0, 0, 1, -265), "InOut", "Quart", 0.3, true, nil)
end)

addcmd("chatlogs", {"clogs"}, function(args, speaker)
        logsEnabled = true
        join.Visible = false
        chat.Visible = true
        table.remove(shade3, table.find(shade3, selectChat))
        table.remove(shade2, table.find(shade2, selectJoin))
        table.insert(shade2, selectChat)
        table.insert(shade3, selectJoin)
        selectJoin.BackgroundColor3 = currentShade3
        selectChat.BackgroundColor3 = currentShade2
        Toggle.Text = "Enabled"
        logs:TweenPosition(UDim2.new(0, 0, 1, -265), "InOut", "Quart", 0.3, true, nil)
end)

addcmd("joinlogs", {"jlogs"}, function(args, speaker)
        jLogsEnabled = true
        chat.Visible = false
        join.Visible = true     
        table.remove(shade3, table.find(shade3, selectJoin))
        table.remove(shade2, table.find(shade2, selectChat))
        table.insert(shade2, selectJoin)
        table.insert(shade3, selectChat)
        selectChat.BackgroundColor3 = currentShade3
        selectJoin.BackgroundColor3 = currentShade2
        Toggle_2.Text = "Enabled"
        logs:TweenPosition(UDim2.new(0, 0, 1, -265), "InOut", "Quart", 0.3, true, nil)
end)

addcmd("chatlogswebhook", {"logswebhook"}, function(args, speaker)
        if not httprequest then
                return notify("Incompatible Exploit", "Your exploit does not support this command (missing request)")
        end
        logsWebhook = args[1] or nil
        updatesaves()
end)

flinging = false
addcmd('fling',{},function(args, speaker)
        if flinging then execCmd('unfling') return end
        flinging = true
        local me = speaker.Character
        local myRoot = getRoot(me)
        if not me or not myRoot then flinging = false return end

        -- BodyThrust fling (Ultimate FlingGui method)
        -- DO NOT set CanCollide=false or Massless=true — collision IS the fling mechanism
        local thrust = Instance.new("BodyThrust")
        thrust.Name = randomString()
        thrust.Force = Vector3.new(9999, 9999, 9999)
        thrust.Parent = myRoot

        -- Die = auto stop
        local function flingDiedF()
                execCmd('unfling')
        end
        flingDied = me:FindFirstChildOfClass('Humanoid').Died:Connect(flingDiedF)

        -- Loop: snap onto nearest player, thrust toward them
        repeat
                RunService.Heartbeat:Wait()
                local nearest = nil
                local nearestDist = math.huge
                for _, p in pairs(Players:GetPlayers()) do
                        if p ~= speaker and p.Character then
                                local tRoot = getRoot(p.Character)
                                if tRoot and tRoot.Parent then
                                        local d = (myRoot.Position - tRoot.Position).Magnitude
                                if d < nearestDist then
                                        nearestDist = d
                                        nearest = tRoot
                                end
                                end
                        end
                end
                if nearest then
                        myRoot.CFrame = nearest.CFrame
                        thrust.Location = nearest.Position
                end
        until flinging == false
end)

addcmd('unfling',{'nofling'},function(args, speaker)
        if flingDied then
                flingDied:Disconnect()
        end
        flinging = false
        wait(.1)
        local speakerChar = speaker.Character
        if not speakerChar then return end
        local speakerRoot = getRoot(speakerChar)
        if not speakerRoot then return end
        -- Destroy ALL thrusters
        for i,v in pairs(speakerRoot:GetChildren()) do
                if v.ClassName == 'BodyThrust' or v.ClassName == 'BodyAngularVelocity' then
                        v:Destroy()
                end
        end
        -- Reset velocity
        speakerRoot.Velocity = Vector3.new(0, 0, 0)
        speakerRoot.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
        speakerRoot.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
end)

addcmd('togglefling',{},function(args, speaker)
        if flinging then
                execCmd('unfling')
        else
                execCmd('fling')
        end
end)

addcmd("flyfling", {}, function(args, speaker)
        execCmd("unvehiclefly\\unwalkfling")
        task.wait()
        vehicleflyspeed = tonumber(args[1]) or vehicleflyspeed
        execCmd("vehiclefly\\walkfling")
end)

addcmd("unflyfling", {}, function(args, speaker)
        execCmd("unvehiclefly\\unwalkfling\\breakvelocity")
end)

addcmd("toggleflyfling", {}, function(args, speaker)
        execCmd(flinging and "unflyfling" or "flyfling")
end)

walkflinging = false
addcmd("walkfling", {}, function(args, speaker)
        execCmd("unwalkfling")
        local humanoid = speaker.Character:FindFirstChildWhichIsA("Humanoid")
        if humanoid then
                humanoid.Died:Connect(function()
                        execCmd("unwalkfling")
                end)
        end

        execCmd("noclip nonotify")
        walkflinging = true
        repeat RunService.Heartbeat:Wait()
                local character = speaker.Character
                local root = getRoot(character)
                local vel, movel = nil, 0.1

                while not (character and character.Parent and root and root.Parent) do
                        RunService.Heartbeat:Wait()
                        character = speaker.Character
                        root = getRoot(character)
                end

                vel = root.Velocity
                root.Velocity = vel * 10000 + Vector3.new(0, 10000, 0)

                RunService.RenderStepped:Wait()
                if character and character.Parent and root and root.Parent then
                        root.Velocity = vel
                end

                RunService.Stepped:Wait()
                if character and character.Parent and root and root.Parent then
                        root.Velocity = vel + Vector3.new(0, movel, 0)
                        movel = movel * -1
                end
        until walkflinging == false
end)

addcmd("unwalkfling", {"nowalkfling"}, function(args, speaker)
        walkflinging = false
        execCmd("unnoclip nonotify")
end)

addcmd("togglewalkfling", {}, function(args, speaker)
        execCmd(walkflinging and "unwalkfling" or "walkfling")
end)

addcmd('invisfling',{},function(args, speaker)
        local ch = speaker.Character
        ch:FindFirstChildWhichIsA("Humanoid"):SetStateEnabled(Enum.HumanoidStateType.Dead, false)
        local prt=Instance.new("Model")
        prt.Parent = speaker.Character
        local z1 = Instance.new("Part")
        z1.Name="Torso"
        z1.CanCollide = false
        z1.Anchored = true
        local z2 = Instance.new("Part")
        z2.Name="Head"
        z2.Parent = prt
        z2.Anchored = true
        z2.CanCollide = false
        local z3 =Instance.new("Humanoid")
        z3.Name="Humanoid"
        z3.Parent = prt
        z1.Position = Vector3.new(0,9999,0)
        speaker.Character=prt
        wait(3)
        speaker.Character=ch
        wait(3)
        local Hum = Instance.new("Humanoid")
        z2:Clone()
        Hum.Parent = speaker.Character
        local root =  getRoot(speaker.Character)
        for i,v in pairs(speaker.Character:GetChildren()) do
                if v ~= root and  v.Name ~= "Humanoid" then
                        v:Destroy()
                end
        end
        root.Transparency = 0
        root.Color = Color3.new(1, 1, 1)
        local invisflingStepped
        invisflingStepped = RunService.Stepped:Connect(function()
                if speaker.Character and getRoot(speaker.Character) then
                        getRoot(speaker.Character).CanCollide = false
                else
                        invisflingStepped:Disconnect()
                end
        end)
        sFLY()
        workspace.CurrentCamera.CameraSubject = root
        local bambam = Instance.new("BodyThrust")
        bambam.Parent = getRoot(speaker.Character)
        bambam.Force = Vector3.new(99999,99999*10,99999)
        bambam.Location = getRoot(speaker.Character).Position
end)

addcmd("antifling", {}, function(args, speaker)
        if antifling then
                antifling:Disconnect()
                antifling = nil
        end
        antifling = RunService.Stepped:Connect(function()
                for _, player in pairs(Players:GetPlayers()) do
                        if player ~= speaker and player.Character then
                                for _, v in pairs(player.Character:GetDescendants()) do
                                        if v:IsA("BasePart") then
                                                v.CanCollide = false
                                        end
                                end
                        end
                end
        end)
end)

addcmd("unantifling", {}, function(args, speaker)
        if antifling then
                antifling:Disconnect()
                antifling = nil
        end
end)

addcmd("toggleantifling", {}, function(args, speaker)
        execCmd(antifling and "unantifling" or "antifling")
end)

function attach(speaker,target)
        if tools(speaker) then
                local char = speaker.Character
                local tchar = target.Character
                local hum = speaker.Character:FindFirstChildOfClass("Humanoid")
                local hrp = getRoot(speaker.Character)
                local hrp2 = getRoot(target.Character)
                hum.Name = "1"
                local newHum = hum:Clone()
                newHum.Parent = char
                newHum.Name = "Humanoid"
                wait()
                hum:Destroy()
                workspace.CurrentCamera.CameraSubject = char
                newHum.DisplayDistanceType = "None"
                local tool = speaker:FindFirstChildOfClass("Backpack"):FindFirstChildOfClass("Tool") or speaker.Character:FindFirstChildOfClass("Tool")
                tool.Parent = char
                hrp.CFrame = hrp2.CFrame * CFrame.new(0, 0, 0) * CFrame.new(math.random(-100, 100)/200,math.random(-100, 100)/200,math.random(-100, 100)/200)
                local n = 0
                repeat
                        wait(.1)
                        n = n + 1
                        hrp.CFrame = hrp2.CFrame
                until (tool.Parent ~= char or not hrp or not hrp2 or not hrp.Parent or not hrp2.Parent or n > 250) and n > 2
        else
                notify('Tool Required','You need to have an item in your inventory to use this command')
        end
end

function kill(speaker,target,fast)
        if tools(speaker) then
                if target ~= nil then
                        local NormPos = getRoot(speaker.Character).CFrame
                        if not fast then
                                refresh(speaker)
                                wait()
                                repeat wait() until speaker.Character ~= nil and getRoot(speaker.Character)
                                wait(0.3)
                        end
                        local hrp = getRoot(speaker.Character)
                        attach(speaker,target)
                        repeat
                                wait()
                                hrp.CFrame = CFrame.new(999999, workspace.FallenPartsDestroyHeight + 5,999999)
                        until not getRoot(target.Character) or not getRoot(speaker.Character)
                        local char = speaker.CharacterAdded:Wait()
                        local humanoid = char:FindFirstChildOfClass("Humanoid") or char.ChildAdded:Wait()
                        while not humanoid:IsA("Humanoid") do
                                humanoid = char:FindFirstChildOfClass("Humanoid") or char.ChildAdded:Wait()
                        end
                        humanoid.RootPart.CFrame = NormPos
                end
        else
                notify('Tool Required','You need to have an item in your inventory to use this command')
        end
end

addcmd("handlekill", {"hkill"}, function(args, speaker)
        if not firetouchinterest then
                return notify("Incompatible Exploit", "Your exploit does not support this command (missing firetouchinterest)")
        end
        if not speaker.Character then return end
        local tool = speaker.Character:FindFirstChildWhichIsA("Tool")
        local handle = tool and tool:FindFirstChild("Handle")
        if not handle then
                return notify("Handle Kill", "You need to hold a \"Tool\" that does damage on touch. For example a common Sword tool.")
        end
        local range = tonumber(args[2]) or math.huge
        if range ~= math.huge then notify("Handle Kill", ("Started!\nRadius: %s"):format(tostring(range):upper())) end

        while task.wait() and speaker.Character and tool.Parent and tool.Parent == speaker.Character do
                for _, plr in next, getPlayer(args[1], speaker) do
                        plr = Players[plr]
                        if plr ~= speaker and plr.Character then
                                local hum = plr.Character:FindFirstChildWhichIsA("Humanoid")
                                local root = hum and getRoot(plr.Character)

                                if root and hum.Health > 0 and hum:GetState() ~= Enum.HumanoidStateType.Dead and speaker:DistanceFromCharacter(root.Position) <= range then
                                        firetouchinterest(handle, root, 1)
                                        firetouchinterest(handle, root, 0)
                                end
                        end
                end
        end

        notify("Handle Kill", "Stopped!")
end)

tpwalkStack = 0
addcmd("teleportwalk", {"tpwalk"}, function(args, speaker)
    pcall(function() tpwalking:Disconnect() end)

    local character = speaker.Character
    local humanoid = character and character:FindFirstChildWhichIsA("Humanoid")
    local speed = (args[1] and isNumber(args[1])) and tonumber(args[1]) or 1

    if parseBoolean(args[2]) then
        tpwalkStack = tpwalkStack + speed
    end

    tpwalking = RunService.Heartbeat:Connect(function(delta)
        if not (character and humanoid and humanoid.Parent) then
            tpwalking:Disconnect()
            return
        end

        if humanoid.MoveDirection.Magnitude > 0 then
            character:TranslateBy(humanoid.MoveDirection * (speed + tpwalkStack) * delta * 10)
        end
    end)
end)

addcmd("unteleportwalk", {"untpwalk"}, function(args, speaker)
    tpwalkStack = 0
    tpwalking:Disconnect()
end)

function bring(speaker,target,fast)
        if tools(speaker) then
                if target ~= nil then
                        local NormPos = getRoot(speaker.Character).CFrame
                        if not fast then
                                refresh(speaker)
                                wait()
                                repeat wait() until speaker.Character ~= nil and getRoot(speaker.Character)
                                wait(0.3)
                        end
                        local hrp = getRoot(speaker.Character)
                        attach(speaker,target)
                        repeat
                                wait()
                                hrp.CFrame = NormPos
                        until not getRoot(target.Character) or not getRoot(speaker.Character)
                        local char = speaker.CharacterAdded:Wait()
                        local humanoid = char:FindFirstChildOfClass("Humanoid") or char.ChildAdded:Wait()
                        while not humanoid:IsA("Humanoid") do
                                humanoid = char:FindFirstChildOfClass("Humanoid") or char.ChildAdded:Wait()
                        end
                        humanoid.RootPart.CFrame = NormPos
                end
        else
                notify('Tool Required','You need to have an item in your inventory to use this command')
        end
end

function teleport(speaker,target,target2,fast)
        if tools(speaker) then
                if target ~= nil then
                        local NormPos = getRoot(speaker.Character).CFrame
                        if not fast then
                                refresh(speaker)
                                wait()
                                repeat wait() until speaker.Character ~= nil and getRoot(speaker.Character)
                                wait(0.3)
                        end
                        local hrp = getRoot(speaker.Character)
                        local hrp2 = getRoot(target2.Character)
                        attach(speaker,target)
                        repeat
                                wait()
                                hrp.CFrame = hrp2.CFrame
                        until not getRoot(target.Character) or not getRoot(speaker.Character)
                        wait(1)
                        local char = speaker.CharacterAdded:Wait()
                        local humanoid = char:FindFirstChildOfClass("Humanoid") or char.ChildAdded:Wait()
                        while not humanoid:IsA("Humanoid") do
                                humanoid = char:FindFirstChildOfClass("Humanoid") or char.ChildAdded:Wait()
                        end
                        humanoid.RootPart.CFrame = NormPos
                end
        else
                notify('Tool Required','You need to have an item in your inventory to use this command')
        end
end

addcmd('spin',{},function(args, speaker)
        local spinSpeed = 20
        if args[1] and isNumber(args[1]) then
                spinSpeed = args[1]
        end
        for i,v in pairs(getRoot(speaker.Character):GetChildren()) do
                if v.Name == "Spinning" then
                        v:Destroy()
                end
        end
        local Spin = Instance.new("BodyAngularVelocity")
        Spin.Name = "Spinning"
        Spin.Parent = getRoot(speaker.Character)
        Spin.MaxTorque = Vector3.new(0, math.huge, 0)
        Spin.AngularVelocity = Vector3.new(0,spinSpeed,0)
end)

addcmd('unspin',{},function(args, speaker)
        for i,v in pairs(getRoot(speaker.Character):GetChildren()) do
                if v.Name == "Spinning" then
                        v:Destroy()
                end
        end
end)

xrayEnabled = false
function xray()
        for _, v in pairs(workspace:GetDescendants()) do
                if v:IsA("BasePart") and not v.Parent:FindFirstChildWhichIsA("Humanoid") and not v.Parent.Parent:FindFirstChildWhichIsA("Humanoid") then
                        v.LocalTransparencyModifier = xrayEnabled and 0.5 or 0
                end
        end
end

addcmd("xray", {}, function(args, speaker)
        xrayEnabled = true
        xray()
end)

addcmd("unxray", {"noxray"}, function(args, speaker)
        xrayEnabled = false
        xray()
end)

addcmd("togglexray", {}, function(args, speaker)
        xrayEnabled = not xrayEnabled
        xray()
end)

addcmd("loopxray", {}, function(args, speaker)
        pcall(function() xrayLoop:Disconnect() end)
        xrayLoop = RunService.RenderStepped:Connect(function()
                xrayEnabled = true
                xray()
        end)
end)

addcmd("unloopxray", {}, function(args, speaker)
        pcall(function() xrayLoop:Disconnect() end)
        xrayEnabled = false
        xray()
end)

local walltpTouch = nil
addcmd('walltp',{},function(args, speaker)
        local torso
        if r15(speaker) then
                torso = speaker.Character.UpperTorso
        else
                torso = speaker.Character.Torso
        end
        local function touchedFunc(hit)
                local Root = getRoot(speaker.Character)
                if hit:IsA("BasePart") and hit.Position.Y > Root.Position.Y - speaker.Character:FindFirstChildOfClass('Humanoid').HipHeight then
                        local hitP = getRoot(hit.Parent)
                        if hitP ~= nil then
                                Root.CFrame = hit.CFrame * CFrame.new(Root.CFrame.lookVector.X,hitP.Size.Z/2 + speaker.Character:FindFirstChildOfClass('Humanoid').HipHeight,Root.CFrame.lookVector.Z)
                        elseif hitP == nil then
                                Root.CFrame = hit.CFrame * CFrame.new(Root.CFrame.lookVector.X,hit.Size.Y/2 + speaker.Character:FindFirstChildOfClass('Humanoid').HipHeight,Root.CFrame.lookVector.Z)
                        end
                end
        end
        walltpTouch = torso.Touched:Connect(touchedFunc)
end)

addcmd('unwalltp',{'nowalltp'},function(args, speaker)
        if walltpTouch then
                walltpTouch:Disconnect()
        end
end)

autoclicking = false
addcmd('autoclick',{},function(args, speaker)
        if mouse1press and mouse1release then
                execCmd('unautoclick')
                wait()
                local clickDelay = 0.1
                local releaseDelay = 0.1
                if args[1] and isNumber(args[1]) then clickDelay = args[1] end
                if args[2] and isNumber(args[2]) then releaseDelay = args[2] end
                autoclicking = true
                cancelAutoClick = UserInputService.InputBegan:Connect(function(input, gameProcessedEvent)
                        if not gameProcessedEvent then
                                if (input.KeyCode == Enum.KeyCode.Backspace and UserInputService:IsKeyDown(Enum.KeyCode.Equals)) or (input.KeyCode == Enum.KeyCode.Equals and UserInputService:IsKeyDown(Enum.KeyCode.Backspace)) then
                                        autoclicking = false
                                        cancelAutoClick:Disconnect()
                                end
                        end
                end)
                notify('Auto Clicker',"Press [backspace] and [=] at the same time to stop")
                repeat wait(clickDelay)
                        mouse1press()
                        wait(releaseDelay)
                        mouse1release()
                until autoclicking == false
        else
                notify('Auto Clicker',"Your exploit doesn't have the ability to use the autoclick")
        end
end)

addcmd('unautoclick',{'noautoclick'},function(args, speaker)
        autoclicking = false
        if cancelAutoClick then cancelAutoClick:Disconnect() end
end)

addcmd('mousesensitivity',{'ms'},function(args, speaker)
        UserInputService.MouseDeltaSensitivity = args[1]
end)

local nameBox = nil
local nbSelection = nil
addcmd('hovername',{},function(args, speaker)
        execCmd('unhovername')
        wait()
        nameBox = Instance.new("TextLabel")
        nameBox.Name = randomString()
        nameBox.Parent = ScaledHolder
        nameBox.BackgroundTransparency = 1
        nameBox.Size = UDim2.new(0,200,0,30)
        nameBox.Font = Enum.Font.Code
        nameBox.TextSize = 16
        nameBox.Text = ""
        nameBox.TextColor3 = Color3.new(1, 1, 1)
        nameBox.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
        nameBox.TextStrokeTransparency = 0
        nameBox.TextXAlignment = Enum.TextXAlignment.Left
        nameBox.ZIndex = 10
        nbSelection = Instance.new('SelectionBox')
        nbSelection.Name = randomString()
        nbSelection.LineThickness = 0.03
        nbSelection.Color3 = Color3.new(1, 1, 1)
        local function updateNameBox()
                local t
                local target = IYMouse.Target

                if target then
                        local humanoid = target.Parent:FindFirstChildOfClass("Humanoid") or target.Parent.Parent:FindFirstChildOfClass("Humanoid")
                        if humanoid then
                                t = humanoid.Parent
                        end
                end

                if t ~= nil then
                        local x = IYMouse.X
                        local y = IYMouse.Y
                        local xP
                        local yP
                        if IYMouse.X > 200 then
                                xP = x - 205
                                nameBox.TextXAlignment = Enum.TextXAlignment.Right
                        else
                                xP = x + 25
                                nameBox.TextXAlignment = Enum.TextXAlignment.Left
                        end
                        nameBox.Position = UDim2.new(0, xP, 0, y)
                        nameBox.Text = t.Name
                        nameBox.Visible = true
                        nbSelection.Parent = t
                        nbSelection.Adornee = t
                else
                        nameBox.Visible = false
                        nbSelection.Parent = nil
                        nbSelection.Adornee = nil
                end
        end
        nbUpdateFunc = IYMouse.Move:Connect(updateNameBox)
end)

addcmd('unhovername',{'nohovername'},function(args, speaker)
        if nbUpdateFunc then
                nbUpdateFunc:Disconnect()
                nameBox:Destroy()
                nbSelection:Destroy()
        end
end)

addcmd('headsize',{},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players) do
                if Players[v] ~= speaker and Players[v].Character:FindFirstChild('Head') then
                        local sizeArg = tonumber(args[2])
                        local Size = Vector3.new(sizeArg,sizeArg,sizeArg)
                        local Head = Players[v].Character:FindFirstChild('Head')
                        if Head:IsA("BasePart") then
                                Head.CanCollide = false
                                if not args[2] or sizeArg == 1 then
                                        Head.Size = Vector3.new(2,1,1)
                                else
                                        Head.Size = Size
                                end
                        end
                end
        end
end)

addcmd('hitbox',{},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        local transparency = args[3] and tonumber(args[3]) or 0.4
        for i,v in pairs(players) do
                if Players[v] ~= speaker and getRoot(Players[v].Character) then
                        local sizeArg = tonumber(args[2])
                        local Size = Vector3.new(sizeArg,sizeArg,sizeArg)
                        local Root = getRoot(Players[v].Character)
                        if Root:IsA("BasePart") then
                                Root.CanCollide = false
                                if not args[2] or sizeArg == 1 then
                                        Root.Size = Vector3.new(2,1,1)
                                        Root.Transparency = transparency
                                else
                                        Root.Size = Size
                                        Root.Transparency = transparency
                                end
                        end
                end
        end
end)

addcmd('stareat',{'stare'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        for i,v in pairs(players) do
                if stareLoop then
                        stareLoop:Disconnect()
                end
                if not getRoot(Players.LocalPlayer.Character) and getRoot(Players[v].Character) then return end
                local function stareFunc()
                        if Players.LocalPlayer.Character.PrimaryPart and Players:FindFirstChild(v) and Players[v].Character ~= nil and getRoot(Players[v].Character) then
                                local chrPos=Players.LocalPlayer.Character.PrimaryPart.Position
                                local tPos=getRoot(Players[v].Character).Position
                                local modTPos=Vector3.new(tPos.X,chrPos.Y,tPos.Z)
                                local newCF=CFrame.new(chrPos,modTPos)
                                Players.LocalPlayer.Character:SetPrimaryPartCFrame(newCF)
                        elseif not Players:FindFirstChild(v) then
                                stareLoop:Disconnect()
                        end
                end

                stareLoop = RunService.RenderStepped:Connect(stareFunc)
        end
end)

addcmd('unstareat',{'unstare','nostare','nostareat'},function(args, speaker)
        if stareLoop then
                stareLoop:Disconnect()
        end
end)

RolewatchData = {Group = 0, Role = "", Leave = false}
RolewatchConnection = Players.PlayerAdded:Connect(function(player)
        if RolewatchData.Group == 0 then return end
        if player:IsInGroup(RolewatchData.Group) then
                if tostring(player:GetRoleInGroup(RolewatchData.Group)):lower() == RolewatchData.Role:lower() then
                        if RolewatchData.Leave == true then
                                Players.LocalPlayer:Kick("\n\nRolewatch\nPlayer \"" .. tostring(player.Name) .. "\" has joined with the Role \"" .. RolewatchData.Role .. "\"\n")
                        else
                                notify("Rolewatch", "Player \"" .. tostring(player.Name) .. "\" has joined with the Role \"" .. RolewatchData.Role .. "\"")
                        end
                end
        end
end)

addcmd("rolewatch", {}, function(args, speaker)
        local groupId = tonumber(args[1] or 0)
        local roleName = args[2] and tostring(getstring(2, args))
        if groupId and roleName then
                RolewatchData.Group = groupId
                RolewatchData.Role = roleName
                notify("Rolewatch", "Watching Group ID \"" .. tostring(groupId) .. "\" for Role \"" .. roleName .. "\"")
        end
end)

addcmd("rolewatchstop", {}, function(args, speaker)
        RolewatchData.Group = 0
        RolewatchData.Role = ""
        RolewatchData.Leave = false
        notify("Rolewatch", "Disabled")
end)

addcmd("rolewatchleave", {"unrolewatch"}, function(args, speaker)
        RolewatchData.Leave = not RolewatchData.Leave
        notify("Rolewatch", RolewatchData.Leave and "Leave has been Enabled" or "Leave has been Disabled")
end)

staffRoles = {"mod", "admin", "staff", "dev", "founder", "owner", "supervis", "manager", "management", "executive", "president", "chairman", "chairwoman", "chairperson", "director"}

getStaffRole = function(player)
        local playerRole = player:GetRoleInGroup(game.CreatorId)
        local result = {Role = playerRole, Staff = false}
        if player:IsInGroup(1200769) then
                result.Role = "Roblox Employee"
                result.Staff = true
        end
        for _, role in pairs(staffRoles) do
                if string.find(string.lower(playerRole), role) then
                        result.Staff = true
                end
        end
        return result
end

addcmd("staffwatch", {}, function(args, speaker)
        if staffwatchjoin then
                staffwatchjoin:Disconnect()
        end
        if game.CreatorType == Enum.CreatorType.Group then
                local found = {}
                staffwatchjoin = Players.PlayerAdded:Connect(function(player)
                        local result = getStaffRole(player)
                        if result.Staff then
                                notify("Staffwatch", formatUsername(player) .. " is a " .. result.Role)
                        end
                end)
                for _, player in pairs(Players:GetPlayers()) do
                        local result = getStaffRole(player)
                        if result.Staff then
                                table.insert(found, formatUsername(player) .. " is a " .. result.Role)
                        end
                end
                if #found > 0 then
                        notify("Staffwatch", table.concat(found, ",\n"))
                else
                        notify("Staffwatch", "Enabled")
                end
        else
                notify("Staffwatch", "Game is not owned by a Group")
        end
end)

addcmd("unstaffwatch", {}, function(args, speaker)
        if staffwatchjoin then
                staffwatchjoin:Disconnect()
        end
        notify("Staffwatch", "Disabled")
end)

local function playerGroups()
    local players = Players:GetPlayers()
    local graph = {}
    local seen = {}
    local groups = {}

    for _, p in ipairs(players) do
        graph[p] = {}
    end

    for i = 1, #players do
        for j = i + 1, #players do
            local p1 = players[i]
            local p2 = players[j]

            local success, result = pcall(function()
                return p1:IsFriendsWithAsync(p2.UserId)
            end)

            if success and result then
                table.insert(graph[p1], p2)
                table.insert(graph[p2], p1)
            end
        end
    end

    local function dfs(player, group)
        seen[player] = true
        table.insert(group, player)

        for _, possible in ipairs(graph[player]) do
            if not seen[possible] then
                dfs(possible, group)
            end
        end
    end

    for _, p in ipairs(players) do
        if not seen[p] then
            local group = {}
            dfs(p, group)
            table.insert(groups, group)
        end
    end

    return groups
end

addcmd("findfriendgroups", {}, function(args, speaker)
    notify("Checking Players", "This might take a while (slow function)")

    local groups = playerGroups()
    local playerList = StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.PlayerList)

    local result = ""
    local index = 1
    local found = 0

    for _, group in ipairs(groups) do
        if #group > 1 then
            local names = {}
            for _, player in ipairs(group) do
                table.insert(names, playerList and player.DisplayName or player.Name)
            end
            result = result .. index .. ". " .. table.concat(names, ", ") .. "\n"
            index = index + 1
            found = found + 1
        end
    end

    createPopup("Friend Groups", found == 0 and "None" or result)
end)

addcmd('removeterrain',{'rterrain','noterrain'},function(args, speaker)
        workspace:FindFirstChildOfClass('Terrain'):Clear()
end)

addcmd('clearnilinstances',{'nonilinstances','cni'},function(args, speaker)
        if getnilinstances then
                for i,v in pairs(getnilinstances()) do
                        v:Destroy()
                end
        else
                notify('Incompatible Exploit','Your exploit does not support this command (missing getnilinstances)')
        end
end)

addcmd('destroyheight',{'dh'},function(args, speaker)
        local dh = args[1] or -500
        if isNumber(dh) then
                workspace.FallenPartsDestroyHeight = dh
        end
end)

OrgDestroyHeight = workspace.FallenPartsDestroyHeight
addcmd("antivoid", {}, function(args, speaker)
        execCmd("unantivoid nonotify")
        task.wait()
        antivoidloop = RunService.Stepped:Connect(function()
                local root = getRoot(speaker.Character)
                if root and root.Position.Y <= OrgDestroyHeight + 25 then
                        root.Velocity = root.Velocity + Vector3.new(0, 250, 0)
                end
        end)
        if args[1] ~= "nonotify" then notify("antivoid", "Enabled") end
end)

addcmd("unantivoid", {"noantivoid"}, function(args, speaker)
        pcall(function() antivoidloop:Disconnect() end)
        antivoidloop = nil
        if args[1] ~= "nonotify" then notify("antivoid", "Disabled") end
end)

antivoidWasEnabled = false
addcmd("fakeout", {}, function(args, speaker)
        local root = getRoot(speaker.Character)
        local oldpos = root.CFrame
        if antivoidloop then
                execCmd("unantivoid nonotify")
                antivoidWasEnabled = true
        end
        workspace.FallenPartsDestroyHeight = 0/1/0
        root.CFrame = CFrame.new(Vector3.new(0, OrgDestroyHeight - 25, 0))
        task.wait(1)
        root.CFrame = oldpos
        workspace.FallenPartsDestroyHeight = OrgDestroyHeight
        if antivoidWasEnabled then
                execCmd("antivoid nonotify")
                antivoidWasEnabled = false
        end
end)

addcmd("trip", {}, function(args, speaker)
        local humanoid = speaker.Character and speaker.Character:FindFirstChildWhichIsA("Humanoid")
        local root = speaker.Character and getRoot(speaker.Character)
        if humanoid and root then
                humanoid:ChangeState(Enum.HumanoidStateType.FallingDown)
                root.Velocity = root.CFrame.LookVector * 30
        end
end)

addcmd("removeads", {"adblock"}, function(args, speaker)
        while wait() do
                pcall(function()
                        for i, v in pairs(workspace:GetDescendants()) do
                                if v:IsA("PackageLink") then
                                        if v.Parent:FindFirstChild("ADpart") then
                                                v.Parent:Destroy()
                                        end
                                        if v.Parent:FindFirstChild("AdGuiAdornee") then
                                                v.Parent.Parent:Destroy()
                                        end
                                end
                        end
                end)
        end
end)

addcmd("scare", {"spook"}, function(args, speaker)
        local players = getPlayer(args[1], speaker)
        local oldpos = nil

        for _, v in pairs(players) do
                local root = speaker.Character and getRoot(speaker.Character)
                local target = Players[v]
                local targetRoot = target and target.Character and getRoot(target.Character)

                if root and targetRoot and target ~= speaker then
                        oldpos = root.CFrame
                        root.CFrame = targetRoot.CFrame + targetRoot.CFrame.lookVector * 2
                        root.CFrame = CFrame.new(root.Position, targetRoot.Position)
                        task.wait(0.5)
                        root.CFrame = oldpos
                end
        end
end)

addcmd("alignmentkeys", {}, function(args, speaker)
        alignmentKeys = UserInputService.InputBegan:Connect(function(input, gameProcessed)
                if gameProcessed then return end
                if input.KeyCode == Enum.KeyCode.Comma then workspace.CurrentCamera:PanUnits(-1) end
                if input.KeyCode == Enum.KeyCode.Period then workspace.CurrentCamera:PanUnits(1) end
        end)
        alignmentKeysEmotes = StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.EmotesMenu)
        StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.EmotesMenu, false)
end)

addcmd("unalignmentkeys", {"noalignmentkeys"}, function(args, speaker)
        if type(alignmentKeysEmotes) == "boolean" then
                StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.EmotesMenu, alignmentKeysEmotes)
        end
        alignmentKeys:Disconnect()
end)

addcmd("ctrllock", {}, function(args, speaker)
        local mouseLockController = speaker.PlayerScripts:WaitForChild("PlayerModule"):WaitForChild("CameraModule"):WaitForChild("MouseLockController")
        local boundKeys = mouseLockController:FindFirstChild("BoundKeys")

        if boundKeys then
                boundKeys.Value = "LeftControl"
        else
                boundKeys = Instance.new("StringValue")
                boundKeys.Name = "BoundKeys"
                boundKeys.Value = "LeftControl"
                boundKeys.Parent = mouseLockController
        end
end)

addcmd("unctrllock", {}, function(args, speaker)
        local mouseLockController = speaker.PlayerScripts:WaitForChild("PlayerModule"):WaitForChild("CameraModule"):WaitForChild("MouseLockController")
        local boundKeys = mouseLockController:FindFirstChild("BoundKeys")

        if boundKeys then
                boundKeys.Value = "LeftShift"
        else
                boundKeys = Instance.new("StringValue")
                boundKeys.Name = "BoundKeys"
                boundKeys.Value = "LeftShift"
                boundKeys.Parent = mouseLockController
        end
end)

addcmd("listento", {}, function(args, speaker)
        execCmd("unlistento")
        if not args[1] then return end

        local player = Players:FindFirstChild(getPlayer(args[1], speaker)[1])
        local root = player and player.Character and getRoot(player.Character)

        if root then
                SoundService:SetListener(Enum.ListenerType.ObjectPosition, root)
                listentoChar = player.CharacterAdded:Connect(function()
                        repeat task.wait() until Players[player.Name].Character ~= nil and getRoot(Players[player.Name].Character)
                        SoundService:SetListener(Enum.ListenerType.ObjectPosition, getRoot(Players[player.Name].Character))
                end)
        end
end)

addcmd("unlistento", {}, function(args, speaker)
        SoundService:SetListener(Enum.ListenerType.Camera)
        listentoChar:Disconnect()
end)

addcmd("jerk", {}, function(args, speaker)
        local humanoid = speaker.Character:FindFirstChildWhichIsA("Humanoid")
        local backpack = speaker:FindFirstChildWhichIsA("Backpack")
        if not humanoid or not backpack then return end

        local tool = Instance.new("Tool")
        tool.Name = "Jerk Off"
        tool.ToolTip = "in the stripped club. straight up \"jorking it\" . and by \"it\" , haha, well. let's justr say. My peanits."
        tool.RequiresHandle = false
        tool.Parent = backpack

        local jorkin = false
        local track = nil

        local function stopTomfoolery()
                jorkin = false
                if track then
                        track:Stop()
                        track = nil
                end
        end

        tool.Equipped:Connect(function() jorkin = true end)
        tool.Unequipped:Connect(stopTomfoolery)
        humanoid.Died:Connect(stopTomfoolery)

        while task.wait() do
                if jorkin then
                        local isR15 = r15(speaker)
                        if not track then
                                local anim = Instance.new("Animation")
                                anim.AnimationId = not isR15 and "rbxassetid://72042024" or "rbxassetid://698251653"
                                track = humanoid:LoadAnimation(anim)
                        end

                        track:Play()
                        track:AdjustSpeed(isR15 and 0.7 or 0.65)
                        track.TimePosition = 0.6
                        task.wait(0.1)
                        while track and track.TimePosition < (not isR15 and 0.65 or 0.7) do task.wait(0.1) end
                        if track then
                                track:Stop()
                                track = nil
                        end
                end
        end
end)

addcmd("guiscale", {}, function(args, speaker)
        if args[1] and isNumber(args[1]) then
                local scale = tonumber(args[1])
                if scale % 1 == 0 then scale = scale / 100 end
                -- me when i divide and it explodes
                if scale == 0.01 then scale = 1 end
                if scale == 0.02 then scale = 2 end

                if scale >= 0.4 and scale <= 2 then
                        guiScale = scale
                end
        else
                guiScale = defaultGuiScale
        end

        Scale.Scale = math.max(Holder.AbsoluteSize.X / 1920, guiScale)
        updatesaves()
end)

addcmd("muteallvoices", {"muteallvcs"}, function(args, speaker)
        Services.VoiceChatInternal:SubscribePauseAll(true)
end)

addcmd("unmuteallvoices", {"unmuteallvcs"}, function(args, speaker)
        Services.VoiceChatInternal:SubscribePauseAll(false)
end)

addcmd("mutevc", {}, function(args, speaker)
        for _, plr in getPlayer(args[1], speaker) do
                if Players[plr] ~= speaker then
                        Services.VoiceChatInternal:SubscribePause(Players[plr].UserId, true)
                end
        end
end)

addcmd("unmutevc", {}, function(args, speaker)
        for _, plr in getPlayer(args[1], speaker) do
                if Players[plr] ~= speaker then
                        Services.VoiceChatInternal:SubscribePause(Players[plr].UserId, false)
                end
        end
end)

addcmd("phonebook", {"call"}, function(args, speaker)
        local success, canInvite = pcall(function()
                return SocialService:CanSendCallInviteAsync(speaker)
        end)
        if success and canInvite then
                SocialService:PromptPhoneBook(speaker, "")
        else
                notify("Phonebook", "It seems you're not able to call anyone. Sorry!")
        end
end)

local freezingua = nil
frozenParts = {}
addcmd('freezeunanchored',{'freezeua'},function(args, speaker)
        local badnames = {
                "Head",
                "UpperTorso",
                "LowerTorso",
                "RightUpperArm",
                "LeftUpperArm",
                "RightLowerArm",
                "LeftLowerArm",
                "RightHand",
                "LeftHand",
                "RightUpperLeg",
                "LeftUpperLeg",
                "RightLowerLeg",
                "LeftLowerLeg",
                "RightFoot",
                "LeftFoot",
                "Torso",
                "Right Arm",
                "Left Arm",
                "Right Leg",
                "Left Leg",
                "HumanoidRootPart"
        }
        local function FREEZENOOB(v)
                if v:IsA("BasePart" or "UnionOperation") and v.Anchored == false then
                        local BADD = false
                        for i = 1,#badnames do
                                if v.Name == badnames[i] then
                                        BADD = true
                                end
                        end
                        if speaker.Character and v:IsDescendantOf(speaker.Character) then
                                BADD = true
                        end
                        if BADD == false then
                                for i,c in pairs(v:GetChildren()) do
                                        if c:IsA("BodyPosition") or c:IsA("BodyGyro") then
                                                c:Destroy()
                                        end
                                end
                                local bodypos = Instance.new("BodyPosition")
                                bodypos.Parent = v
                                bodypos.Position = v.Position
                                bodypos.MaxForce = Vector3.new(math.huge,math.huge,math.huge)
                                local bodygyro = Instance.new("BodyGyro")
                                bodygyro.Parent = v
                                bodygyro.CFrame = v.CFrame
                                bodygyro.MaxTorque = Vector3.new(math.huge,math.huge,math.huge)
                                if not table.find(frozenParts,v) then
                                        table.insert(frozenParts,v)
                                end
                        end
                end
        end
        for i,v in pairs(workspace:GetDescendants()) do
                FREEZENOOB(v)
        end
        freezingua = workspace.DescendantAdded:Connect(FREEZENOOB)
end)

addcmd('thawunanchored',{'thawua','unfreezeunanchored','unfreezeua'},function(args, speaker)
        if freezingua then
                freezingua:Disconnect()
        end
        for i,v in pairs(frozenParts) do
                for i,c in pairs(v:GetChildren()) do
                        if c:IsA("BodyPosition") or c:IsA("BodyGyro") then
                                c:Destroy()
                        end
                end
        end
        frozenParts = {}
end)

addcmd('tpunanchored',{'tpua'},function(args, speaker)
        local players = getPlayer(args[1], speaker)
        if not players or #players == 0 then
                notify('TPUA', 'No player found')
                return
        end

        local tpForces = {}
        local skipNames = {"Torso", "Head", "Right Arm", "Left Arm", "Right Leg", "Left Leg", "HumanoidRootPart"}

        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA("BasePart") and not part.Anchored then
                        -- Skip parts belonging to any player character
                        local skipPart = false
                        if speaker.Character and speaker.Character:IsAncestorOf(part) then
                                skipPart = true
                        end
                        if not skipPart then
                                for _, p in pairs(Players:GetPlayers()) do
                                        if p.Character and p.Character:IsAncestorOf(part) then
                                                skipPart = true
                                                break
                                        end
                                end
                        end
                        -- Also skip parts with character body part names
                        if not skipPart then
                                for _, n in pairs(skipNames) do
                                        if part.Name == n then
                                                skipPart = true
                                                break
                                        end
                                end
                        end

                        if not skipPart then
                                -- Remove existing BodyPosition/BodyGyro
                                for _, c in pairs(part:GetChildren()) do
                                        if c:IsA("BodyPosition") or c:IsA("BodyGyro") then
                                                c:Destroy()
                                        end
                                end
                                local force = Instance.new("BodyPosition")
                                force.MaxForce = Vector3.new(math.huge, math.huge, math.huge)
                                force.Parent = part
                                table.insert(tpForces, {force = force, part = part})
                        end
                end
        end

        -- Set target positions (teleport all parts to each target player)
        for _, p in pairs(players) do
                if p.Character and p.Character:FindFirstChild('Head') then
                        local targetPos = p.Character.Head.Position
                        for _, entry in pairs(tpForces) do
                                entry.force.Position = targetPos
                        end
                end
        end

        notify('TPUA', 'Teleported ' .. #tpForces .. ' parts')
end)
end -- ROTATESPEED section




-- ======================== ARCO YIELD CUSTOMIZATIONS ========================
-- Theme: Black backdrop, White text, Blue glow
-- Popup GUI, Trail system, Aura system, Effects, HUD, Cosmetics, Animations

-- ======================== POPUP GUI SYSTEM ========================
local ArcPopupGui = nil
local ArcPopupFrame = nil
local ArcPopupQueue = {}

local function showArcPopup(featureName, enabled)
        table.insert(ArcPopupQueue, {name = featureName, on = enabled})
        if #ArcPopupQueue > 1 then return end
        spawn(function()
                while #ArcPopupQueue > 0 do
                        local data = table.remove(ArcPopupQueue, 1)
                        if not ArcPopupGui then
                                ArcPopupGui = Instance.new('ScreenGui')
                                ArcPopupGui.Name = 'ArcYieldPopup'
                                ArcPopupGui.ResetOnSpawn = false
                                ArcPopupGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
                                ArcPopupGui.Parent = game:GetService('CoreGui')

                                ArcPopupFrame = Instance.new('Frame')
                                ArcPopupFrame.Size = UDim2.new(0, 280, 0, 55)
                                ArcPopupFrame.Position = UDim2.new(0.5, -140, 0, -65)
                                ArcPopupFrame.BackgroundColor3 = Color3.fromRGB(10, 10, 20)
                                ArcPopupFrame.BackgroundTransparency = 0.15
                                ArcPopupFrame.BorderSizePixel = 0
                                ArcPopupFrame.Parent = ArcPopupGui

                                local corner = Instance.new('UICorner')
                                corner.CornerRadius = UDim.new(0, 8)
                                corner.Parent = ArcPopupFrame

                                local stroke = Instance.new('UIStroke')
                                stroke.Color = Color3.fromRGB(50, 100, 255)
                                stroke.Thickness = 1.5
                                stroke.Transparency = 0.3
                                stroke.Parent = ArcPopupFrame

                                local accent = Instance.new('Frame')
                                accent.Size = UDim2.new(0, 5, 0, 55)
                                accent.BackgroundColor3 = Color3.fromRGB(50, 120, 255)
                                accent.BorderSizePixel = 0
                                local ac = Instance.new('UICorner')
                                ac.CornerRadius = UDim.new(0, 3)
                                ac.Parent = accent
                                accent.Parent = ArcPopupFrame

                                local tl = Instance.new('TextLabel')
                                tl.Name = 'Title'
                                tl.Size = UDim2.new(1, -20, 0, 28)
                                tl.Position = UDim2.new(0, 14, 0, 2)
                                tl.BackgroundTransparency = 1
                                tl.Text = ''
                                tl.TextColor3 = Color3.fromRGB(220, 230, 255)
                                tl.TextStrokeColor3 = Color3.fromRGB(30, 80, 255)
                                tl.TextStrokeTransparency = 0.6
                                tl.Font = Enum.Font.GothamBold
                                tl.TextSize = 16
                                tl.TextXAlignment = Enum.TextXAlignment.Left
                                tl.Parent = ArcPopupFrame

                                local sl = Instance.new('TextLabel')
                                sl.Name = 'Status'
                                sl.Size = UDim2.new(1, -20, 0, 20)
                                sl.Position = UDim2.new(0, 14, 0, 28)
                                sl.BackgroundTransparency = 1
                                sl.Text = ''
                                sl.TextColor3 = Color3.fromRGB(100, 255, 130)
                                sl.TextStrokeColor3 = Color3.fromRGB(30, 80, 255)
                                sl.TextStrokeTransparency = 0.8
                                sl.Font = Enum.Font.Gotham
                                sl.TextSize = 13
                                sl.TextXAlignment = Enum.TextXAlignment.Left
                                sl.Parent = ArcPopupFrame
                        end

                        ArcPopupFrame.Title.Text = data.name
                        ArcPopupFrame.Status.Text = data.on and 'ENABLED' or 'DISABLED'
                        ArcPopupFrame.Status.TextColor3 = data.on and Color3.fromRGB(100, 255, 130) or Color3.fromRGB(255, 100, 100)

                        local ts = game:GetService('TweenService')
                        ArcPopupFrame.Position = UDim2.new(0.5, -140, 0, -65)
                        ArcPopupFrame.BackgroundTransparency = 0.15
                        ts:Create(ArcPopupFrame, TweenInfo.new(0.35, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {
                                Position = UDim2.new(0.5, -140, 0, 10),
                                BackgroundTransparency = 0
                        }):Play()

                        wait(2.2)

                        ts:Create(ArcPopupFrame, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {
                                Position = UDim2.new(0.5, -140, 0, -65),
                                BackgroundTransparency = 0.15
                        }):Play()
                        wait(0.35)
                end
        end)
end


-- ======================== TEXT GLOW (Blue glow on white text) ========================
spawn(function()
        wait(2)
        local function applyGlow(parent)
                for _, child in pairs(parent:GetDescendants()) do
                        if child:IsA('TextLabel') or child:IsA('TextBox') then
                                pcall(function()
                                        child.TextStrokeColor3 = Color3.fromRGB(20, 60, 200)
                                        child.TextStrokeTransparency = 0.75
                                end)
                        end
                end
        end
        applyGlow(game:GetService('CoreGui'):FindFirstChild('ArcYieldPopup') or Instance.new('Frame'))
end)


-- ======================== TRAIL SYSTEM ========================
walktrail = {active = false, attachment = nil, emitter = nil, beam = nil, att2 = nil}

local trailConfigs = {
        fire = {color1 = Color3.fromRGB(255, 80, 0), color2 = Color3.fromRGB(255, 200, 0), rate = 35, speed = 4, size = 1.2, light = true, lightColor = Color3.fromRGB(255, 100, 0)},
        ice = {color1 = Color3.fromRGB(100, 200, 255), color2 = Color3.fromRGB(200, 230, 255), rate = 25, speed = 2, size = 0.8, light = true, lightColor = Color3.fromRGB(100, 180, 255)},
        lightning = {color1 = Color3.fromRGB(150, 150, 255), color2 = Color3.fromRGB(255, 255, 255), rate = 40, speed = 8, size = 0.5, light = true, lightColor = Color3.fromRGB(130, 130, 255)},
        smoke = {color1 = Color3.fromRGB(60, 60, 60), color2 = Color3.fromRGB(120, 120, 120), rate = 15, speed = 1, size = 2.5, light = false},
        rainbow = {color1 = Color3.fromRGB(255, 0, 0), color2 = Color3.fromRGB(0, 0, 255), rate = 40, speed = 3, size = 1, light = false, rainbow = true},
        neon = {color1 = Color3.fromRGB(0, 255, 200), color2 = Color3.fromRGB(0, 100, 255), rate = 30, speed = 3, size = 1, light = true, lightColor = Color3.fromRGB(0, 200, 255)},
        purple = {color1 = Color3.fromRGB(150, 0, 255), color2 = Color3.fromRGB(255, 0, 200), rate = 30, speed = 3, size = 1.2, light = true, lightColor = Color3.fromRGB(150, 50, 255)},
        pink = {color1 = Color3.fromRGB(255, 50, 150), color2 = Color3.fromRGB(255, 150, 200), rate = 30, speed = 3, size = 1, light = true, lightColor = Color3.fromRGB(255, 80, 150)},
        blood = {color1 = Color3.fromRGB(150, 0, 0), color2 = Color3.fromRGB(255, 0, 0), rate = 20, speed = 2, size = 1.5, light = false},
        shadow = {color1 = Color3.fromRGB(20, 0, 40), color2 = Color3.fromRGB(60, 0, 100), rate = 25, speed = 1, size = 2, light = false},
        holy = {color1 = Color3.fromRGB(255, 255, 200), color2 = Color3.fromRGB(255, 255, 255), rate = 35, speed = 3, size = 0.8, light = true, lightColor = Color3.fromRGB(255, 255, 200)},
        toxic = {color1 = Color3.fromRGB(0, 200, 0), color2 = Color3.fromRGB(100, 255, 0), rate = 25, speed = 2, size = 1.5, light = false},
        galaxy = {color1 = Color3.fromRGB(50, 0, 100), color2 = Color3.fromRGB(0, 100, 200), rate = 35, speed = 4, size = 1, light = true, lightColor = Color3.fromRGB(80, 50, 200)},
        crystal = {color1 = Color3.fromRGB(150, 220, 255), color2 = Color3.fromRGB(255, 255, 255), rate = 20, speed = 1, size = 0.6, light = true, lightColor = Color3.fromRGB(180, 220, 255)},
        spark = {color1 = Color3.fromRGB(255, 255, 0), color2 = Color3.fromRGB(255, 200, 0), rate = 50, speed = 6, size = 0.3, light = true, lightColor = Color3.fromRGB(255, 255, 100)},
        heart = {color1 = Color3.fromRGB(255, 50, 80), color2 = Color3.fromRGB(255, 150, 180), rate = 15, speed = 1, size = 0.8, light = false},
        phantom = {color1 = Color3.fromRGB(0, 150, 255), color2 = Color3.fromRGB(0, 50, 150), rate = 20, speed = 2, size = 1.5, light = true, lightColor = Color3.fromRGB(0, 100, 255)},
}

function createWalkTrail(speaker, configName)
        if walktrail.active then removeWalkTrail() end
        local cfg = trailConfigs[configName] or trailConfigs.fire
        local char = speaker.Character
        local root = getRoot(char)
        if not root then return end

        local att = Instance.new('Attachment')
        att.Position = Vector3.new(0, -3, 0)
        att.Parent = root

        local pe = Instance.new('ParticleEmitter')
        pe.Texture = 'rbxassetid://241685484'
        pe.Rate = cfg.rate
        pe.Lifetime = NumberRange.new(0.5, 1.2)
        pe.Speed = NumberRange.new(cfg.speed * 0.5, cfg.speed)
        pe.SpreadAngle = Vector2.new(20, 20)
        pe.Size = NumberSequence.new({
                NumberSequenceKeypoint.new(0, cfg.size * 0.3),
                NumberSequenceKeypoint.new(0.5, cfg.size),
                NumberSequenceKeypoint.new(1, 0)
        })
        if cfg.rainbow then
                pe.Color = ColorSequence.new(Color3.fromRGB(255,0,0), Color3.fromRGB(0,0,255))
        else
                pe.Color = ColorSequence.new(cfg.color1, cfg.color2)
        end
        pe.Transparency = NumberSequence.new(0.3, 1)
        pe.LightEmission = 0.6
        pe.LightInfluence = 0
        pe.RotSpeed = NumberRange.new(-180, 180)
        pe.Parent = att

        if cfg.light then
                local pl = Instance.new('PointLight')
                pl.Color = cfg.lightColor
                pl.Brightness = 2
                pl.Range = 12
                pl.Parent = att
        end

        walktrail = {active = true, attachment = att, emitter = pe}
        showArcPopup('Trail: ' .. configName, true)
        notify('Trail', configName .. ' trail enabled')
end

function removeWalkTrail()
        if walktrail.attachment and walktrail.attachment.Parent then
                walktrail.attachment:Destroy()
        end
        walktrail = {active = false, attachment = nil, emitter = nil}
        notify('Trail', 'Disabled')
end

addcmd('trail', {'trailtype'}, function(args, speaker)
        local t = args[1] and args[1]:lower() or 'fire'
        if t == 'off' then removeWalkTrail() return end
        if not trailConfigs[t] then
                local types = ''
                for k, _ in pairs(trailConfigs) do types = types .. k .. ', ' end
                notify('Trail', 'Types: ' .. types:sub(1, -3))
                return
        end
        createWalkTrail(speaker, t)
end)
addcmd('untrail', {'notrail'}, function(args, speaker) removeWalkTrail() end)
addcmd('toggletrail', {}, function(args, speaker)
        if walktrail.active then removeWalkTrail() else createWalkTrail(speaker, 'fire') end
end)

-- Shortcut trail commands
for trailName, _ in pairs(trailConfigs) do
        addcmd(trailName .. 'trail', {}, function(args, speaker)
                createWalkTrail(speaker, trailName)
        end)
end


-- ======================== AURA SYSTEM ========================
auraSystem = {active = false, attachments = {}, emitters = {}}

local auraConfigs = {
        fire = {color1 = Color3.fromRGB(255, 60, 0), color2 = Color3.fromRGB(255, 180, 0), rate = 60, speed = 2, size = 2, rotSpeed = 90},
        ice = {color1 = Color3.fromRGB(100, 200, 255), color2 = Color3.fromRGB(220, 240, 255), rate = 40, speed = 0.5, size = 1.5, rotSpeed = 45},
        lightning = {color1 = Color3.fromRGB(180, 180, 255), color2 = Color3.fromRGB(255, 255, 255), rate = 80, speed = 5, size = 0.8, rotSpeed = 200},
        smoke = {color1 = Color3.fromRGB(50, 50, 50), color2 = Color3.fromRGB(100, 100, 100), rate = 20, speed = 0.5, size = 3, rotSpeed = 30},
        shadow = {color1 = Color3.fromRGB(10, 0, 30), color2 = Color3.fromRGB(50, 0, 80), rate = 30, speed = 1, size = 2.5, rotSpeed = 60},
        holy = {color1 = Color3.fromRGB(255, 255, 180), color2 = Color3.fromRGB(255, 255, 255), rate = 50, speed = 1.5, size = 1.2, rotSpeed = 60},
        toxic = {color1 = Color3.fromRGB(0, 180, 0), color2 = Color3.fromRGB(80, 255, 0), rate = 35, speed = 1, size = 2, rotSpeed = 50},
        neon = {color1 = Color3.fromRGB(0, 255, 200), color2 = Color3.fromRGB(0, 80, 255), rate = 45, speed = 2, size = 1.5, rotSpeed = 120},
        purple = {color1 = Color3.fromRGB(120, 0, 255), color2 = Color3.fromRGB(255, 0, 180), rate = 40, speed = 1.5, size = 2, rotSpeed = 90},
        pink = {color1 = Color3.fromRGB(255, 50, 130), color2 = Color3.fromRGB(255, 150, 200), rate = 35, speed = 1, size = 1.5, rotSpeed = 60},
        galaxy = {color1 = Color3.fromRGB(40, 0, 100), color2 = Color3.fromRGB(0, 80, 200), rate = 50, speed = 2, size = 2, rotSpeed = 150},
        blood = {color1 = Color3.fromRGB(120, 0, 0), color2 = Color3.fromRGB(200, 0, 0), rate = 25, speed = 0.5, size = 2.5, rotSpeed = 30},
        phantom = {color1 = Color3.fromRGB(0, 120, 255), color2 = Color3.fromRGB(0, 40, 120), rate = 30, speed = 1.5, size = 2.5, rotSpeed = 80},
        crystal = {color1 = Color3.fromRGB(130, 200, 255), color2 = Color3.fromRGB(255, 255, 255), rate = 25, speed = 0.5, size = 1, rotSpeed = 30},
}

function createAura(speaker, configName)
        if auraSystem.active then removeAura() end
        local cfg = auraConfigs[configName] or auraConfigs.fire
        local char = speaker.Character
        if not char then return end

        auraSystem.attachments = {}
        auraSystem.emitters = {}

        for i = 0, 3 do
                local att = Instance.new('Attachment')
                att.Name = 'AuraAtt' .. i
                att.Parent = char:FindFirstChild('HumanoidRootPart') or char:FindFirstChild('Torso')

                local pe = Instance.new('ParticleEmitter')
                pe.Texture = 'rbxassetid://241685484'
                pe.Rate = cfg.rate / 4
                pe.Lifetime = NumberRange.new(0.8, 1.5)
                pe.Speed = NumberRange.new(cfg.speed * 0.5, cfg.speed)
                pe.SpreadAngle = Vector2.new(180, 180)
                pe.Size = NumberSequence.new(cfg.size * 0.3, cfg.size)
                pe.Color = ColorSequence.new(cfg.color1, cfg.color2)
                pe.Transparency = NumberSequence.new(0.2, 0.9)
                pe.LightEmission = 0.8
                pe.RotSpeed = NumberRange.new(-cfg.rotSpeed, cfg.rotSpeed)
                pe.Parent = att

                table.insert(auraSystem.attachments, att)
                table.insert(auraSystem.emitters, pe)
        end

        auraSystem.active = true
        showArcPopup('Aura: ' .. configName, true)
        notify('Aura', configName .. ' aura enabled')
end

function removeAura()
        for _, att in pairs(auraSystem.attachments) do
                if att and att.Parent then att:Destroy() end
        end
        auraSystem = {active = false, attachments = {}, emitters = {}}
        notify('Aura', 'Disabled')
end

addcmd('particleaura', {'partaura', 'auratype'}, function(args, speaker)
        local t = args[1] and args[1]:lower() or 'fire'
        if t == 'off' then removeAura() return end
        if not auraConfigs[t] then
                local types = ''
                for k, _ in pairs(auraConfigs) do types = types .. k .. ', ' end
                notify('Particle Aura', 'Types: ' .. types:sub(1, -3))
                return
        end
        createAura(speaker, t)
end)
addcmd('unparticleaura', {'nopartaura', 'noaura'}, function(args, speaker) removeAura() end)
addcmd('toggleparticleaura', {}, function(args, speaker)
        if auraSystem.active then removeAura() else createAura(speaker, 'fire') end
end)

for auraName, _ in pairs(auraConfigs) do
        addcmd(auraName .. 'aura', {}, function(args, speaker)
                createAura(speaker, auraName)
        end)
end


-- ======================== CHARACTER EFFECTS ========================
charGlow = {active = false, lights = {}}

addcmd('glow', {'bodyglow'}, function(args, speaker)
        if charGlow.active then execCmd('unglow') return end
        local char = speaker.Character
        if not char then return end
        charGlow.lights = {}
        for _, part in pairs(char:GetDescendants()) do
                if part:IsA('BasePart') then
                        local pl = Instance.new('PointLight')
                        pl.Color = args[1] and Color3.fromRGB(tonumber(args[1]) or 50, tonumber(args[2]) or 100, tonumber(args[3]) or 255) or Color3.fromRGB(50, 100, 255)
                        pl.Brightness = 3
                        pl.Range = 15
                        pl.Parent = part
                        table.insert(charGlow.lights, pl)
                end
        end
        charGlow.active = true
        showArcPopup('Body Glow', true)
        notify('Glow', 'Enabled')
end)

addcmd('unglow', {'noglow'}, function(args, speaker)
        for _, l in pairs(charGlow.lights) do if l.Parent then l:Destroy() end end
        charGlow = {active = false, lights = {}}
        notify('Glow', 'Disabled')
end)

charHighlight = {active = false}

addcmd('highlight', {'chighlight'}, function(args, speaker)
        if charHighlight.active then execCmd('unhighlight') return end
        local char = speaker.Character
        if not char then return end
        local hl = Instance.new('Highlight')
        hl.Name = randomString()
        hl.Adornee = char
        hl.FillColor = args[1] and Color3.fromRGB(tonumber(args[1]) or 50, tonumber(args[2]) or 100, tonumber(args[3]) or 255) or Color3.fromRGB(50, 100, 255)
        hl.FillTransparency = 0.7
        hl.OutlineColor = Color3.fromRGB(100, 180, 255)
        hl.OutlineTransparency = 0
        hl.Parent = char
        charHighlight = {active = true, obj = hl}
        showArcPopup('Highlight', true)
        notify('Highlight', 'Enabled')
end)

addcmd('unhighlight', {'nohighlight'}, function(args, speaker)
        if charHighlight.obj and charHighlight.obj.Parent then charHighlight.obj:Destroy() end
        charHighlight = {active = false}
        notify('Highlight', 'Disabled')
end)

wireframeState = false

addcmd('wireframe', {}, function(args, speaker)
        if wireframeState then execCmd('unwireframe') return end
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part:IsDescendantOf(speaker.Character) then
                        pcall(function() part.Material = Enum.Material.ForceField end)
                end
        end
        wireframeState = true
        showArcPopup('Wireframe', true)
end)

addcmd('unwireframe', {'nowireframe'}, function(args, speaker)
        wireframeState = false
end)

charTransState = false

addcmd('trans', {'transparency'}, function(args, speaker)
        local val = tonumber(args[1]) or 0.5
        local char = speaker.Character
        if not char then return end
        for _, part in pairs(char:GetDescendants()) do
                if part:IsA('BasePart') and part.Name ~= 'HumanoidRootPart' then
                        part.Transparency = val
                end
        end
        charTransState = true
        notify('Transparency', 'Set to ' .. val)
end)

addcmd('untrans', {}, function(args, speaker)
        local char = speaker.Character
        if not char then return end
        for _, part in pairs(char:GetDescendants()) do
                if part:IsA('BasePart') then
                        if part.Name == 'HumanoidRootPart' then part.Transparency = 1
                        else part.Transparency = 0 end
                end
        end
        charTransState = false
        notify('Transparency', 'Reset')
end)

charScaleState = false

addcmd('scale', {'charscale'}, function(args, speaker)
        local s = tonumber(args[1]) or 2
        local char = speaker.Character
        if not char then return end
        local hrp = char:FindFirstChild('HumanoidRootPart')
        if hrp and hrp:FindFirstChild('BodyScale') then hrp:FindFirstChild('BodyScale'):Destroy() end
        for _, part in pairs(char:GetChildren()) do
                if part:IsA('BasePart') and part.Name ~= 'HumanoidRootPart' then
                        part.Size = Vector3.new(part.Size.X * s, part.Size.Y * s, part.Size.Z * s)
                end
        end
        charScaleState = true
        notify('Scale', 'Set to ' .. s .. 'x')
end)

addcmd('unscale', {}, function(args, speaker)
        local char = speaker.Character
        if not char then return end
        for _, part in pairs(char:GetChildren()) do
                if part:IsA('BasePart') and part.Name ~= 'HumanoidRootPart' then
                        part.Size = Vector3.new(part.Size.X / 2, part.Size.Y / 2, part.Size.Z / 2)
                end
        end
        charScaleState = false
        notify('Scale', 'Reset')
end)


-- ======================== VISUAL EFFECTS ========================
floatState = {active = false, conn = nil}

addcmd('float', {'hover'}, function(args, speaker)
        if floatState.active then execCmd('unfloat') return end
        local spd = tonumber(args[1]) or 2
        floatState.active = true
        local t = 0
        floatState.conn = RunService.Heartbeat:Connect(function(dt)
                if not floatState.active then return end
                local char = speaker.Character
                local root = getRoot(char)
                if not root then return end
                t = t + dt * spd
                local bv = root:FindFirstChildOfClass('BodyVelocity')
                if not bv then
                        bv = Instance.new('BodyVelocity')
                        bv.MaxForce = Vector3.new(0, math.huge, 0)
                        bv.Parent = root
                end
                bv.Velocity = Vector3.new(0, math.sin(t) * 15, 0)
        end)
        showArcPopup('Float', true)
end)

addcmd('unfloat', {'nofloat'}, function(args, speaker)
        floatState.active = false
        if floatState.conn then floatState.conn:Disconnect() floatState.conn = nil end
        local char = speaker.Character
        local root = getRoot(char)
        if root then
                for _, c in pairs(root:GetChildren()) do
                        if c:IsA('BodyVelocity') then c:Destroy() end
                end
        end
        notify('Float', 'Disabled')
end)

spinCharState = {active = false, bav = nil}

addcmd('spinchar', {'spinme'}, function(args, speaker)
        if spinCharState.active then execCmd('unspinchar') return end
        local spd = tonumber(args[1]) or 10
        local char = speaker.Character
        local root = getRoot(char)
        if not root then return end
        local bav = Instance.new('BodyAngularVelocity')
        bav.Name = randomString()
        bav.AngularVelocity = Vector3.new(0, spd, 0)
        bav.MaxTorque = Vector3.new(0, math.huge, 0)
        bav.P = math.huge
        bav.Parent = root
        spinCharState = {active = true, bav = bav}
        showArcPopup('Spin', true)
end)

addcmd('unspinchar', {'nospinchar'}, function(args, speaker)
        if spinCharState.bav and spinCharState.bav.Parent then spinCharState.bav:Destroy() end
        spinCharState = {active = false, bav = nil}
        notify('Spin', 'Disabled')
end)

pulseState = {active = false, conn = nil}

addcmd('pulse', {}, function(args, speaker)
        if pulseState.active then execCmd('unpulse') return end
        local char = speaker.Character
        if not char then return end
        pulseState.active = true
        local t = 0
        pulseState.conn = RunService.Heartbeat:Connect(function(dt)
                if not pulseState.active then return end
                t = t + dt * 3
                local s = 1 + math.sin(t) * 0.1
                for _, part in pairs(char:GetChildren()) do
                        if part:IsA('BasePart') and part.Name ~= 'HumanoidRootPart' then
                                pcall(function()
                                        part.Size = part:GetPropertyChangedSignal('Size') and part.Size or part.Size
                                end)
                        end
                end
        end)
        showArcPopup('Pulse', true)
end)

addcmd('unpulse', {'nopulse'}, function(args, speaker)
        pulseState.active = false
        if pulseState.conn then pulseState.conn:Disconnect() pulseState.conn = nil end
        notify('Pulse', 'Disabled')
end)


-- ======================== HUD ELEMENTS ========================
hudElements = {}

addcmd('fps', {'fpscounter', 'showfps'}, function(args, speaker)
        if hudElements.fps then execCmd('nofps') return end
        local sg = Instance.new('ScreenGui')
        sg.Name = randomString()
        sg.ResetOnSpawn = false
        sg.Parent = game:GetService('CoreGui')
        local tl = Instance.new('TextLabel')
        tl.Size = UDim2.new(0, 100, 0, 30)
        tl.Position = UDim2.new(0, 10, 0, 10)
        tl.BackgroundColor3 = Color3.fromRGB(8, 8, 14)
        tl.BackgroundTransparency = 0.3
        tl.TextColor3 = Color3.fromRGB(100, 255, 100)
        tl.TextStrokeColor3 = Color3.fromRGB(0, 100, 0)
        tl.TextStrokeTransparency = 0.7
        tl.Font = Enum.Font.GothamBold
        tl.TextSize = 16
        tl.TextXAlignment = Enum.TextXAlignment.Left
        tl.Text = 'FPS: --'
        local corner = Instance.new('UICorner')
        corner.CornerRadius = UDim.new(0, 4)
        corner.Parent = tl
        tl.Parent = sg
        local conn
        local lastTick = tick()
        local frames = 0
        conn = RunService.Heartbeat:Connect(function()
                frames = frames + 1
                if tick() - lastTick >= 1 then
                        tl.Text = 'FPS: ' .. frames
                        frames = 0
                        lastTick = tick()
                end
        end)
        hudElements.fps = {gui = sg, conn = conn}
        showArcPopup('FPS Counter', true)
end)

addcmd('nofps', {'nofpscounter', 'hidefps'}, function(args, speaker)
        if hudElements.fps then
                if hudElements.fps.conn then hudElements.fps.conn:Disconnect() end
                if hudElements.fps.gui then hudElements.fps.gui:Destroy() end
                hudElements.fps = nil
        end
end)

addcmd('ping', {'pingcounter', 'showping'}, function(args, speaker)
        if hudElements.ping then execCmd('noping') return end
        local sg = Instance.new('ScreenGui')
        sg.Name = randomString()
        sg.ResetOnSpawn = false
        sg.Parent = game:GetService('CoreGui')
        local tl = Instance.new('TextLabel')
        tl.Size = UDim2.new(0, 100, 0, 30)
        tl.Position = UDim2.new(0, 10, 0, 45)
        tl.BackgroundColor3 = Color3.fromRGB(8, 8, 14)
        tl.BackgroundTransparency = 0.3
        tl.TextColor3 = Color3.fromRGB(255, 200, 50)
        tl.TextStrokeColor3 = Color3.fromRGB(200, 150, 0)
        tl.TextStrokeTransparency = 0.7
        tl.Font = Enum.Font.GothamBold
        tl.TextSize = 16
        tl.TextXAlignment = Enum.TextXAlignment.Left
        tl.Text = 'Ping: --'
        local corner = Instance.new('UICorner')
        corner.CornerRadius = UDim.new(0, 4)
        corner.Parent = tl
        tl.Parent = sg
        local conn
        conn = RunService.Heartbeat:Connect(function()
                pcall(function()
                        local stats = game:GetService('Stats')
                        tl.Text = 'Ping: ' .. math.floor(stats.Network.ServerStatsItem['Data Ping']:GetValue())
                end)
        end)
        hudElements.ping = {gui = sg, conn = conn}
        showArcPopup('Ping Counter', true)
end)

addcmd('noping', {'nopingcounter', 'hideping'}, function(args, speaker)
        if hudElements.ping then
                if hudElements.ping.conn then hudElements.ping.conn:Disconnect() end
                if hudElements.ping.gui then hudElements.ping.gui:Destroy() end
                hudElements.ping = nil
        end
end)

addcmd('coords', {'coordinates', 'showcoords'}, function(args, speaker)
        if hudElements.coords then execCmd('nocoords') return end
        local sg = Instance.new('ScreenGui')
        sg.Name = randomString()
        sg.ResetOnSpawn = false
        sg.Parent = game:GetService('CoreGui')
        local tl = Instance.new('TextLabel')
        tl.Size = UDim2.new(0, 220, 0, 30)
        tl.Position = UDim2.new(0, 10, 0, 80)
        tl.BackgroundColor3 = Color3.fromRGB(8, 8, 14)
        tl.BackgroundTransparency = 0.3
        tl.TextColor3 = Color3.fromRGB(100, 200, 255)
        tl.TextStrokeColor3 = Color3.fromRGB(0, 80, 200)
        tl.TextStrokeTransparency = 0.7
        tl.Font = Enum.Font.GothamBold
        tl.TextSize = 14
        tl.TextXAlignment = Enum.TextXAlignment.Left
        tl.Text = 'X: 0  Y: 0  Z: 0'
        local corner = Instance.new('UICorner')
        corner.CornerRadius = UDim.new(0, 4)
        corner.Parent = tl
        tl.Parent = sg
        local conn
        conn = RunService.Heartbeat:Connect(function()
                local root = getRoot(speaker.Character)
                if root then
                        local p = root.Position
                        tl.Text = string.format('X: %.0f  Y: %.0f  Z: %.0f', p.X, p.Y, p.Z)
                end
        end)
        hudElements.coords = {gui = sg, conn = conn}
        showArcPopup('Coordinates', true)
end)

addcmd('nocoords', {'nocoordinates', 'hidecoords'}, function(args, speaker)
        if hudElements.coords then
                if hudElements.coords.conn then hudElements.coords.conn:Disconnect() end
                if hudElements.coords.gui then hudElements.coords.gui:Destroy() end
                hudElements.coords = nil
        end
end)

addcmd('speedometer', {'speedhud', 'showspped'}, function(args, speaker)
        if hudElements.speed then execCmd('nospeedometer') return end
        local sg = Instance.new('ScreenGui')
        sg.Name = randomString()
        sg.ResetOnSpawn = false
        sg.Parent = game:GetService('CoreGui')
        local tl = Instance.new('TextLabel')
        tl.Size = UDim2.new(0, 120, 0, 30)
        tl.Position = UDim2.new(0, 10, 0, 115)
        tl.BackgroundColor3 = Color3.fromRGB(8, 8, 14)
        tl.BackgroundTransparency = 0.3
        tl.TextColor3 = Color3.fromRGB(255, 130, 80)
        tl.TextStrokeColor3 = Color3.fromRGB(200, 80, 0)
        tl.TextStrokeTransparency = 0.7
        tl.Font = Enum.Font.GothamBold
        tl.TextSize = 14
        tl.TextXAlignment = Enum.TextXAlignment.Left
        tl.Text = 'Speed: 0'
        local corner = Instance.new('UICorner')
        corner.CornerRadius = UDim.new(0, 4)
        corner.Parent = tl
        tl.Parent = sg
        local conn
        conn = RunService.Heartbeat:Connect(function()
                local root = getRoot(speaker.Character)
                if root then
                        tl.Text = 'Speed: ' .. math.floor(root.Velocity.Magnitude)
                end
        end)
        hudElements.speed = {gui = sg, conn = conn}
        showArcPopup('Speedometer', true)
end)

addcmd('nospeedometer', {'nospeedhud'}, function(args, speaker)
        if hudElements.speed then
                if hudElements.speed.conn then hudElements.speed.conn:Disconnect() end
                if hudElements.speed.gui then hudElements.speed.gui:Destroy() end
                hudElements.speed = nil
        end
end)

addcmd('crosshair', {'xhair'}, function(args, speaker)
        if hudElements.crosshair then execCmd('nocrosshair') return end
        local sg = Instance.new('ScreenGui')
        sg.Name = randomString()
        sg.ResetOnSpawn = false
        sg.IgnoreGuiInset = true
        sg.Parent = game:GetService('CoreGui')
        local cl = Instance.new('Frame')
        cl.Size = UDim2.new(0, 24, 0, 2)
        cl.Position = UDim2.new(0.5, -12, 0.5, -1)
        cl.BackgroundColor3 = Color3.fromRGB(50, 200, 255)
        cl.BorderSizePixel = 0
        cl.Parent = sg
        local cl2 = Instance.new('Frame')
        cl2.Size = UDim2.new(0, 2, 0, 24)
        cl2.Position = UDim2.new(0.5, -1, 0.5, -12)
        cl2.BackgroundColor3 = Color3.fromRGB(50, 200, 255)
        cl2.BorderSizePixel = 0
        cl2.Parent = sg
        hudElements.crosshair = sg
        showArcPopup('Crosshair', true)
end)

addcmd('nocrosshair', {'noxhair'}, function(args, speaker)
        if hudElements.crosshair then hudElements.crosshair:Destroy() hudElements.crosshair = nil end
end)


-- ======================== FUN / COSMETIC ========================

addcmd('crown', {}, function(args, speaker)
        if hudElements.crown then execCmd('uncrown') return end
        local char = speaker.Character
        local head = char and char:FindFirstChild('Head')
        if not head then return end
        local crown = Instance.new('Part')
        crown.Name = 'ArcCrown'
        crown.Size = Vector3.new(2, 0.5, 2)
        crown.Anchored = false
        crown.CanCollide = false
        crown.Color = Color3.fromRGB(255, 215, 0)
        crown.Material = Enum.Material.Foil
        crown.Parent = workspace
        local weld = Instance.new('Weld')
        weld.Part0 = head
        weld.Part1 = crown
        weld.C0 = CFrame.new(0, 1.5, 0)
        weld.Parent = crown
        hudElements.crown = crown
        showArcPopup('Crown', true)
end)

addcmd('uncrown', {}, function(args, speaker)
        if hudElements.crown and hudElements.crown.Parent then hudElements.crown:Destroy() end
        hudElements.crown = nil
end)

addcmd('halo', {}, function(args, speaker)
        if hudElements.halo then execCmd('unhalo') return end
        local char = speaker.Character
        local head = char and char:FindFirstChild('Head')
        if not head then return end
        local halo = Instance.new('Part')
        halo.Name = 'ArcHalo'
        halo.Size = Vector3.new(2.5, 0.15, 2.5)
        halo.Anchored = false
        halo.CanCollide = false
        halo.Color = args[1] and Color3.fromRGB(tonumber(args[1]) or 255, tonumber(args[2]) or 255, tonumber(args[3]) or 255) or Color3.fromRGB(255, 255, 100)
        halo.Material = Enum.Material.Neon
        halo.Shape = Enum.PartType.Cylinder
        halo.Parent = workspace
        local weld = Instance.new('Weld')
        weld.Part0 = head
        weld.Part1 = halo
        weld.C0 = CFrame.new(0, 1.5, 0) * CFrame.Angles(0, 0, math.rad(90))
        weld.Parent = halo
        hudElements.halo = halo
        showArcPopup('Halo', true)
end)

addcmd('unhalo', {}, function(args, speaker)
        if hudElements.halo and hudElements.halo.Parent then hudElements.halo:Destroy() end
        hudElements.halo = nil
end)

addcmd('wings', {}, function(args, speaker)
        if hudElements.wings then execCmd('unwings') return end
        local char = speaker.Character
        local root = getRoot(char)
        if not root then return end
        local wingColor = args[1] and Color3.fromRGB(tonumber(args[1]) or 50, tonumber(args[2]) or 100, tonumber(args[3]) or 255) or Color3.fromRGB(50, 100, 255)
        local leftWing = Instance.new('Part')
        leftWing.Name = 'ArcWingL'
        leftWing.Size = Vector3.new(3, 0.1, 1.5)
        leftWing.Anchored = false
        leftWing.CanCollide = false
        leftWing.Color = wingColor
        leftWing.Material = Enum.Material.Neon
        leftWing.Transparency = 0.3
        leftWing.Parent = workspace
        local rightWing = Instance.new('Part')
        rightWing.Name = 'ArcWingR'
        rightWing.Size = Vector3.new(3, 0.1, 1.5)
        rightWing.Anchored = false
        rightWing.CanCollide = false
        rightWing.Color = wingColor
        rightWing.Material = Enum.Material.Neon
        rightWing.Transparency = 0.3
        rightWing.Parent = workspace
        local wlw = Instance.new('Weld')
        wlw.Part0 = root
        wlw.Part1 = leftWing
        wlw.C0 = CFrame.new(-1.5, 0, -1) * CFrame.Angles(0, 0, math.rad(20))
        wlw.Parent = leftWing
        local wrw = Instance.new('Weld')
        wrw.Part0 = root
        wrw.Part1 = rightWing
        wrw.C0 = CFrame.new(1.5, 0, -1) * CFrame.Angles(0, 0, math.rad(-20))
        wrw.Parent = rightWing
        hudElements.wings = {left = leftWing, right = rightWing}
        showArcPopup('Wings', true)
end)

addcmd('unwings', {}, function(args, speaker)
        if hudElements.wings then
                if hudElements.wings.left and hudElements.wings.left.Parent then hudElements.wings.left:Destroy() end
                if hudElements.wings.right and hudElements.wings.right.Parent then hudElements.wings.right:Destroy() end
                hudElements.wings = nil
        end
end)

addcmd('nametag', {'customname'}, function(args, speaker)
        if not args[1] then notify('NameTag', 'Usage: nametag [text]'); return end
        if hudElements.nametag then execCmd('unnametag') return end
        local char = speaker.Character
        local head = char and char:FindFirstChild('Head')
        if not head then return end
        local bb = Instance.new('BillboardGui')
        bb.Name = 'ArcNameTag'
        bb.Adornee = head
        bb.Size = UDim2.new(0, 100, 0, 30)
        bb.StudsOffset = Vector3.new(0, 3, 0)
        bb.AlwaysOnTop = true
        bb.Parent = char
        local tl = Instance.new('TextLabel')
        tl.Size = UDim2.new(1, 0, 1, 0)
        tl.BackgroundTransparency = 1
        tl.Text = args[1] or 'Custom Name'
        tl.TextColor3 = Color3.fromRGB(100, 200, 255)
        tl.TextStrokeColor3 = Color3.fromRGB(0, 50, 150)
        tl.TextStrokeTransparency = 0.5
        tl.Font = Enum.Font.GothamBold
        tl.TextSize = 18
        tl.Parent = bb
        hudElements.nametag = bb
        showArcPopup('NameTag', true)
end)

addcmd('unnametag', {}, function(args, speaker)
        if hudElements.nametag and hudElements.nametag.Parent then hudElements.nametag:Destroy() end
        hudElements.nametag = nil
end)

orbitTextState = {active = false, conn = nil, parts = {}}

addcmd('orbittext', {'otext'}, function(args, speaker)
        if not args[1] then notify('OrbitText', 'Usage: orbittext [text]'); return end
        if orbitTextState.active then execCmd('unorbittext') return end
        local char = speaker.Character
        local head = char and char:FindFirstChild('Head')
        if not head then return end
        orbitTextState.parts = {}
        orbitTextState.active = true
        for i = 1, #args[1] do
                local part = Instance.new('Part')
                part.Size = Vector3.new(1, 1, 0.05)
                part.Anchored = true
                part.CanCollide = false
                part.Color = Color3.fromRGB(50, 100 + (i * 10) % 155, 255)
                part.Material = Enum.Material.Neon
                part.Transparency = 0.2
                part.Parent = workspace
                local bb = Instance.new('BillboardGui')
                bb.Adornee = part
                bb.Size = UDim2.new(0, 10, 0, 10)
                bb.AlwaysOnTop = true
                bb.Parent = part
                local tl = Instance.new('TextLabel')
                tl.Size = UDim2.new(1, 0, 1, 0)
                tl.BackgroundTransparency = 1
                tl.Text = args[1]:sub(i, i)
                tl.TextColor3 = Color3.fromRGB(255, 255, 255)
                tl.Font = Enum.Font.GothamBold
                tl.TextSize = 24
                tl.TextStrokeTransparency = 0
                tl.Parent = bb
                table.insert(orbitTextState.parts, {part = part, offset = (i - #args[1] / 2) * 1.2})
        end
        local t = 0
        orbitTextState.conn = RunService.Heartbeat:Connect(function(dt)
                if not orbitTextState.active then return end
                if not head or not head.Parent then execCmd('unorbittext') return end
                t = t + dt * 2
                for _, data in pairs(orbitTextState.parts) do
                        local angle = t + data.offset * 0.5
                        data.part.CFrame = head.CFrame * CFrame.new(math.cos(angle) * 4, 2, math.sin(angle) * 4)
                end
        end)
        showArcPopup('Orbit Text', true)
end)

addcmd('unorbittext', {}, function(args, speaker)
        orbitTextState.active = false
        if orbitTextState.conn then orbitTextState.conn:Disconnect() orbitTextState.conn = nil end
        for _, data in pairs(orbitTextState.parts) do
                if data.part and data.part.Parent then data.part:Destroy() end
        end
        orbitTextState.parts = {}
end)


-- ======================== CAMERA ========================

addcmd('fov', {'fieldofview'}, function(args, speaker)
        local val = tonumber(args[1]) or 70
        local cam = workspace.CurrentCamera
        cam.FieldOfView = val
        notify('FOV', 'Set to ' .. val)
end)

addcmd('unfov', {}, function(args, speaker)
        workspace.CurrentCamera.FieldOfView = 70
        notify('FOV', 'Reset')
end)


-- ======================== CUSTOM ANIMATIONS ========================
customAnims = {active = false, animator = nil}

addcmd('customanim', {'canim'}, function(args, speaker)
        local animType = (args[1] or ''):lower()
        local animId = args[2] or ''
        if animType == '' or animId == '' then
                notify('CustomAnim', 'Usage: customanim [idle/walk/run/jump/fall] [assetId]')
                return
        end
        local char = speaker.Character
        if not char then return end
        local humanoid = char:FindFirstChildWhichIsA('Humanoid')
        if not humanoid then return end

        local anim = Instance.new('Animation')
        anim.AnimationId = 'rbxassetid://' .. animId

        local success, track = pcall(function()
                return humanoid:LoadAnimation(anim)
        end)
        if not success or not track then
                notify('CustomAnim', 'Failed to load animation')
                return
        end
        track:Play()
        track.Looped = true

        if not customAnims.tracks then customAnims.tracks = {} end
        customAnims.tracks[animType] = track
        customAnims.active = true
        showArcPopup('Custom Anim: ' .. animType, true)
        notify('CustomAnim', animType .. ' animation set')
end)

addcmd('unanim', {'nocustomanim'}, function(args, speaker)
        if customAnims.tracks then
                for _, track in pairs(customAnims.tracks) do
                        pcall(function() track:Stop() end)
                end
        end
        customAnims = {active = false, animator = nil, tracks = nil}
        notify('CustomAnim', 'Reset')
end)


-- ======================== UTILITY ========================
antiafkState = false

addcmd('antiafk', {'anti-afk'}, function(args, speaker)
        if antiafkState then execCmd('noantiafk') return end
        antiafkState = true
        local conn
        conn = game:GetService('Players').LocalPlayer.Idled:Connect(function()
                game:GetService('VirtualUser'):CaptureController()
                game:GetService('VirtualUser'):ClickButton2(Vector2.new())
        end)
        antiafkState = conn
        showArcPopup('Anti-AFK', true)
        notify('Anti-AFK', 'Enabled')
end)

addcmd('noantiafk', {}, function(args, speaker)
        if antiafkState and typeof(antiafkState) ~= 'boolean' then
                antiafkState:Disconnect()
        end
        antiafkState = false
        notify('Anti-AFK', 'Disabled')
end)


-- ======================== WALKFLING (JITTER HITBOX) ========================
-- Invisible ANCHORED hitbox rapidly teleports forward then back each frame.
-- Neither the user nor other players see it (fully invisible).
-- The anchored hitbox with CanCollide pushes unanchored parts/players on contact.
-- Speed = how many studs forward the hitbox teleports each frame (jitter distance).
-- Higher speed = longer jitter distance = bigger fling.
-- Usage: pwalkfling [speed]  |  pwalkfling off / unpwalkfling to stop

pwalkflingActive = false
pwalkflingConn = nil
pwalkflingHitbox = nil
pwalkflingPower = 50
pwalkflingDiedConn = nil
pwalkflingForward = false

addcmd('pwalkfling', {'powerwalkfling', 'dkwalkfling'}, function(args, speaker)
        if args[1] and args[1]:lower() == 'off' then execCmd('unpwalkfling') return end
        if pwalkflingActive and tonumber(args[1]) then
                pwalkflingPower = tonumber(args[1])
                showArcPopup('WalkFling (Speed: ' .. pwalkflingPower .. ')', true)
                return
        end
        if pwalkflingActive then execCmd('unpwalkfling') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('WalkFling', 'Character not found') return end

        pwalkflingPower = tonumber(args[1]) or 50
        local root = getRoot(char)
        local humanoid = char:FindFirstChildWhichIsA('Humanoid')

        -- Create invisible ANCHORED collision hitbox (anchored so teleporting works reliably)
        -- Anchored + CanCollide = physics engine pushes anything overlapping with it
        pwalkflingHitbox = Instance.new('Part')
        pwalkflingHitbox.Name = randomString()
        pwalkflingHitbox.Size = Vector3.new(4, 5, 2)
        pwalkflingHitbox.Transparency = 1
        pwalkflingHitbox.CanCollide = true
        pwalkflingHitbox.Anchored = true
        pwalkflingHitbox.Parent = workspace
        pwalkflingHitbox.CFrame = root.CFrame

        -- Noclip player so they don't collide with the hitbox
        execCmd('noclip nonotify')
        for _, child in pairs(char:GetDescendants()) do
                if child:IsA('BasePart') then
                        child.CanCollide = false
                end
        end
        if humanoid then
                pwalkflingDiedConn = humanoid.Died:Connect(function() execCmd('unpwalkfling') end)
        end

        pwalkflingForward = false
        pwalkflingActive = true

        -- Stepped runs BEFORE physics each frame
        -- Frame 1: teleport hitbox forward by [speed] studs -> physics resolves -> pushes people
        -- Frame 2: teleport hitbox back to player -> no overlap -> ready for next push
        -- This rapid back-and-forth = jitter = fling
        pwalkflingConn = RunService.Stepped:Connect(function()
                if not pwalkflingActive then return end
                if not pwalkflingHitbox or not pwalkflingHitbox.Parent then
                        execCmd('unpwalkfling')
                        return
                end

                local c = speaker.Character
                local r = getRoot(c)
                if not r then return end

                -- Always snap hitbox orientation to player
                pwalkflingHitbox.CFrame = r.CFrame

                -- Get walk direction from humanoid
                local moveDir = humanoid and humanoid.MoveDirection or Vector3.new(0, 0, 0)

                if moveDir.Magnitude > 0.05 then
                        local cam = workspace.CurrentCamera
                        local camCF = cam.CFrame
                        local flatLook = (camCF.LookVector * Vector3.new(1, 0, 1)).Unit
                        local flatRight = (camCF.Right * Vector3.new(1, 0, 1)).Unit
                        local worldDir = (flatLook * moveDir.Z + flatRight * moveDir.X).Unit

                        -- Alternate forward and back each frame
                        pwalkflingForward = not pwalkflingForward
                        if pwalkflingForward then
                                -- Teleport hitbox FORWARD by speed studs
                                -- Physics will resolve: anyone in the way gets pushed = FLING
                                pwalkflingHitbox.CFrame = r.CFrame + (worldDir * pwalkflingPower)
                        else
                                -- Teleport hitbox BACK to player position
                                pwalkflingHitbox.CFrame = r.CFrame
                        end
                end
        end)

        showArcPopup('WalkFling (Speed: ' .. pwalkflingPower .. ')', true)
end)

addcmd('unpwalkfling', {'nopwalkfling'}, function(args, speaker)
        pwalkflingActive = false
        if pwalkflingConn then pwalkflingConn:Disconnect() pwalkflingConn = nil end
        if pwalkflingDiedConn then pwalkflingDiedConn:Disconnect() pwalkflingDiedConn = nil end

        if pwalkflingHitbox and pwalkflingHitbox.Parent then pwalkflingHitbox:Destroy() end
        pwalkflingHitbox = nil

        execCmd('clip nonotify')
        local char = speaker.Character
        if char then
                for _, child in pairs(char:GetDescendants()) do
                        if child:IsA('BasePart') then child.CanCollide = true end
                end
        end
        showArcPopup('WalkFling', false)
end)

addcmd('togglepwalkfling', {}, function(args, speaker)
        execCmd(pwalkflingActive and 'unpwalkfling' or 'pwalkfling')
end)


-- ======================== GHOST (DECOY CLONE) ========================
ghostActive = false
ghostClone = nil
ghostSavedTransparency = {}
ghostSavedColors = {}
ghostGui = nil
ghostDiedConn = nil

addcmd('ghost', {}, function(args, speaker)
        if ghostActive then execCmd('unghost') return end
        local char = speaker.Character
        if not char or not getRoot(char) then notify('Ghost', 'Character not found') return end
        local root = getRoot(char)
        local humanoid = char:FindFirstChildWhichIsA('Humanoid')

        ghostSavedTransparency = {}
        ghostSavedColors = {}
        for _, part in pairs(char:GetDescendants()) do
                if part:IsA('BasePart') and part.Name ~= 'HumanoidRootPart' then
                        ghostSavedTransparency[part] = part.Transparency
                        ghostSavedColors[part] = part.Color
                        part.Transparency = 0.5
                        part.Color = Color3.fromRGB(140, 60, 220)
                        part.Material = Enum.Material.Neon
                end
        end

        local clone = char:Clone()
        clone.Name = char.Name
        for _, obj in pairs(clone:GetDescendants()) do
                if obj:IsA('Script') or obj:IsA('LocalScript') then obj:Destroy() end
        end
        for _, part in pairs(clone:GetDescendants()) do
                if part:IsA('BasePart') and ghostSavedTransparency[part] ~= nil then
                        part.Transparency = ghostSavedTransparency[part]
                        part.Color = ghostSavedColors[part]
                        part.Material = Enum.Material.Plastic
                end
                if part:IsA('BasePart') then part.Anchored = true end
        end
        local cloneHumanoid = clone:FindFirstChildWhichIsA('Humanoid')
        if cloneHumanoid then
                cloneHumanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None
                cloneHumanoid.HealthDisplayType = Enum.HumanoidHealthDisplayType.AlwaysOff
        end
        local head = clone:FindFirstChild('Head')
        if head then
                local healthBar = head:FindFirstChildOfClass('BillboardGui')
                if healthBar then healthBar:Destroy() end
        end
        clone.Parent = workspace
        ghostClone = clone

        execCmd('noclip nonotify')
        if humanoid then
                ghostDiedConn = humanoid.Died:Connect(function() execCmd('unghost') end)
        end

        local sg = Instance.new('ScreenGui')
        sg.Name = randomString()
        sg.ResetOnSpawn = false
        sg.Parent = game:GetService('CoreGui')
        local frame = Instance.new('Frame')
        frame.Size = UDim2.new(0, 160, 0, 36)
        frame.Position = UDim2.new(0.5, -80, 0, 10)
        frame.BackgroundColor3 = Color3.fromRGB(10, 10, 20)
        frame.BackgroundTransparency = 0.2
        frame.BorderSizePixel = 0
        frame.Parent = sg
        local corner = Instance.new('UICorner')
        corner.CornerRadius = UDim.new(0, 8)
        corner.Parent = frame
        local stroke = Instance.new('UIStroke')
        stroke.Color = Color3.fromRGB(140, 60, 220)
        stroke.Thickness = 1.5
        stroke.Transparency = 0.3
        stroke.Parent = frame
        local tl = Instance.new('TextLabel')
        tl.Size = UDim2.new(1, 0, 1, 0)
        tl.BackgroundTransparency = 1
        tl.Text = 'GHOST MODE'
        tl.TextColor3 = Color3.fromRGB(180, 120, 255)
        tl.TextStrokeColor3 = Color3.fromRGB(100, 30, 200)
        tl.TextStrokeTransparency = 0.5
        tl.Font = Enum.Font.GothamBold
        tl.TextSize = 14
        tl.Parent = frame
        ghostGui = sg
        ghostActive = true
        hudElements.ghost = sg
        showArcPopup('Ghost', true)
end)

addcmd('unghost', {'noghost'}, function(args, speaker)
        ghostActive = false
        if ghostDiedConn then ghostDiedConn:Disconnect() ghostDiedConn = nil end
        if ghostClone and ghostClone.Parent then ghostClone:Destroy() end
        ghostClone = nil
        local char = speaker.Character
        if char then
                for part, trans in pairs(ghostSavedTransparency) do
                        if part and part.Parent then
                                part.Transparency = trans
                                part.Material = Enum.Material.Plastic
                                if ghostSavedColors[part] then part.Color = ghostSavedColors[part] end
                        end
                end
        end
        ghostSavedTransparency = {}
        ghostSavedColors = {}
        if ghostGui and ghostGui.Parent then ghostGui:Destroy() end
        ghostGui = nil
        hudElements.ghost = nil
        execCmd('clip nonotify')
        showArcPopup('Ghost', false)
end)

addcmd('toggleghost', {}, function(args, speaker)
        execCmd(ghostActive and 'unghost' or 'ghost')
end)


-- ======================== PHYSICS GODMODE (Shared System) ========================
-- Any command that controls unanchored parts (orbitua, cannon, trowel, slift,
-- magnet, tumble, helicopter, jumper, minigun) enables this automatically.
-- Uses a reference counter: each command increments on start, decrements on stop.
-- 4 LAYERS of protection to prevent death:
--   1. Stepped loop — forces health/state BEFORE physics every frame
--   2. Heartbeat loop — forces health/state AFTER physics every frame (safety net)
--   3. HealthChanged hook — catches damage between frames instantly
--   4. CharacterAdded hook — re-protects on every respawn
-- Also disables the Dead state via SetStateEnabled so the engine can't kill you.
-- NOTE: No metatable hooks — they break Xeno executor property/method calls.

physicsGodCount = 0
physicsGodConn = nil
physicsGodSteppedConn = nil
physicsGodCharAddedConn = nil
physicsGodSpeaker = nil
physicsGodOriginalMaxHP = 100

function enablePhysicsGodmode(speaker)
        physicsGodCount = physicsGodCount + 1
        physicsGodSpeaker = speaker

        if physicsGodCount == 1 and (not physicsGodConn or not physicsGodConn.Connected) then

                -- Helper: fully protect a character's humanoid
                local function protectCharacter(char)
                        if not char then return end
                        local hum = char:FindFirstChildWhichIsA('Humanoid')
                        if not hum then
                                -- Humanoid might not exist yet (character still loading)
                                char.DescendantAdded:Connect(function(child)
                                        if physicsGodCount <= 0 then return end
                                        if child:IsA('Humanoid') then
                                                child.HealthChanged:Connect(function(hp)
                                                        if physicsGodCount <= 0 then return end
                                                        if hp < child.MaxHealth then
                                                                child.Health = child.MaxHealth
                                                        end
                                                end)
                                                child.MaxHealth = 1e9
                                                child.Health = 1e9
                                                pcall(function()
                                                        child:SetStateEnabled(Enum.HumanoidStateType.Dead, false)
                                                end)
                                        end
                                end)
                                return
                        end
                        -- HealthChanged: catches damage between frames instantly
                        hum.HealthChanged:Connect(function(hp)
                                if physicsGodCount <= 0 then return end
                                if hp < hum.MaxHealth then
                                        hum.Health = hum.MaxHealth
                                end
                        end)
                        -- Disable Dead state on the humanoid entirely
                        pcall(function()
                                hum:SetStateEnabled(Enum.HumanoidStateType.Dead, false)
                        end)
                        hum.MaxHealth = 1e9
                        hum.Health = 1e9
                end

                -- LAYER 2: Stepped loop — runs BEFORE physics every frame
                physicsGodSteppedConn = RunService.Stepped:Connect(function()
                        if physicsGodCount <= 0 then
                                if physicsGodSteppedConn then physicsGodSteppedConn:Disconnect() physicsGodSteppedConn = nil end
                                return
                        end
                        local char = physicsGodSpeaker.Character
                        if not char then return end
                        local hum = char:FindFirstChildWhichIsA('Humanoid')
                        if not hum then return end
                        if hum.MaxHealth < 1e9 then
                                physicsGodOriginalMaxHP = hum.MaxHealth
                                hum.MaxHealth = 1e9
                        end
                        hum.Health = 1e9
                        pcall(function()
                                hum:SetStateEnabled(Enum.HumanoidStateType.Dead, false)
                        end)
                        if hum:GetState() == Enum.HumanoidStateType.Dead then
                                hum:ChangeState(Enum.HumanoidStateType.RunningNoPhysics)
                        end
                end)

                -- LAYER 3: Heartbeat loop — runs AFTER physics every frame (safety net)
                physicsGodConn = RunService.Heartbeat:Connect(function()
                        if physicsGodCount <= 0 then
                                if physicsGodConn then physicsGodConn:Disconnect() physicsGodConn = nil end
                                return
                        end
                        pcall(function() sethiddenproperty(physicsGodSpeaker, "SimulationRadius", math.huge) end)
                        local char = physicsGodSpeaker.Character
                        if not char then return end
                        local hum = char:FindFirstChildWhichIsA('Humanoid')
                        if not hum then return end
                        if hum.MaxHealth < 1e9 then
                                physicsGodOriginalMaxHP = hum.MaxHealth
                                hum.MaxHealth = 1e9
                        end
                        hum.Health = 1e9
                        pcall(function()
                                hum:SetStateEnabled(Enum.HumanoidStateType.Dead, false)
                        end)
                        if hum:GetState() == Enum.HumanoidStateType.Dead then
                                hum:ChangeState(Enum.HumanoidStateType.RunningNoPhysics)
                        end
                end)

                -- LAYER 4: Protect current character immediately
                protectCharacter(physicsGodSpeaker.Character)

                -- LAYER 5: On respawn, protect the new character too
                physicsGodCharAddedConn = physicsGodSpeaker.CharacterAdded:Connect(function(newChar)
                        if physicsGodCount <= 0 then return end
                        task.wait(0.5)
                        protectCharacter(newChar)
                end)
        end
end

function disablePhysicsGodmode(speaker)
        physicsGodCount = math.max(0, physicsGodCount - 1)
        if physicsGodCount <= 0 then
                physicsGodCount = 0
                if physicsGodConn then physicsGodConn:Disconnect() physicsGodConn = nil end
                if physicsGodSteppedConn then physicsGodSteppedConn:Disconnect() physicsGodSteppedConn = nil end
                if physicsGodCharAddedConn then physicsGodCharAddedConn:Disconnect() physicsGodCharAddedConn = nil end
                physicsGodCharAddedConn = nil
                physicsGodSpeaker = nil
                -- Restore normal gameplay — re-enable Dead state and original MaxHealth
                pcall(function()
                        local char = speaker.Character
                        if char then
                                local hum = char:FindFirstChildWhichIsA('Humanoid')
                                if hum then
                                        hum:SetStateEnabled(Enum.HumanoidStateType.Dead, true)
                                        hum.MaxHealth = physicsGodOriginalMaxHP
                                        hum.Health = physicsGodOriginalMaxHP
                                end
                        end
                end)
        end
end


-- ======================== NO-FALL-DAMAGE ========================
-- Disabled by default. Use 'nofalldamage' to enable if needed.
-- Previously ran permanently which capped falling speed to -50.

local noFallConn = nil
local noFallActive = false

local function startNoFallDamage()
        if noFallConn and noFallConn.Connected then return end
        noFallConn = RunService.Stepped:Connect(function()
                if not noFallActive then return end
                local char = Players.LocalPlayer.Character
                if not char then return end
                local root = char:FindFirstChild('HumanoidRootPart')
                local hum = char:FindFirstChildWhichIsA('Humanoid')
                if not root or not hum then return end
                if hum.Health <= 0 then return end
                local vel = root.Velocity
                if vel.Y < -50 then
                        root.Velocity = Vector3.new(vel.X, -50, vel.Z)
                end
        end)
end

-- Not started automatically anymore — no more falling speed cap


-- ======================== MANUAL GODMODE COMMAND ========================
-- Lets you toggle the physics godmode on/off manually without needing a ua command.
-- Usage: god / ungod

addcmd('god', {}, function(args, speaker)
        enablePhysicsGodmode(speaker)
        notify('God', 'Physics godmode ON! You are invincible.')
end)

addcmd('ungod', {}, function(args, speaker)
        disablePhysicsGodmode(speaker)
        notify('God', 'Physics godmode OFF!')
end)

addcmd('togglegod', {}, function(args, speaker)
        if physicsGodCount > 0 then
                execCmd('ungod')
        else
                execCmd('god')
        end
end)


-- ======================== ORBIT UA (VELOCITY-BASED TORNADO) ========================
-- Uses direct Velocity manipulation (not AlignPosition constraints) to orbit parts.
-- Parts get zero-friction physics, then their Velocity is set toward orbit targets.
-- Math: atan2 calculates current angle, offsets it by rotation speed, uses cos/sin for circle.
-- Velocity toward target = attractionStrength. Creates a spinning tornado of all unanchored parts.
-- Defaults: radius=50, speed=500, height=0
-- Usage: orbitua [radius] [speed] [height]  |  orbitua off / unorbitua

orbituaActive = false
orbituaConn = nil
orbituaParts = {}
orbituaRadius = 50
orbituaSpeed = 500
orbituaHeight = 0
orbituaDiedConn = nil
orbituaCenter = nil

addcmd('orbitua', {'orbitall'}, function(args, speaker)
        if args[1] and args[1]:lower() == 'off' then execCmd('unorbitua') return end
        if orbituaActive then execCmd('unorbitua') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('OrbitUA', 'Character not found') return end
        enablePhysicsGodmode(speaker)

        orbituaRadius = tonumber(args[1]) or 50
        orbituaSpeed = tonumber(args[2]) or 500
        orbituaHeight = tonumber(args[3]) or 0

        local root = getRoot(char)
        local humanoid = char:FindFirstChildWhichIsA('Humanoid')

        -- Create invisible anchored center point (the tornado eye)
        orbituaCenter = Instance.new('Part')
        orbituaCenter.Name = randomString()
        orbituaCenter.Size = Vector3.new(1, 1, 1)
        orbituaCenter.Transparency = 1
        orbituaCenter.Anchored = true
        orbituaCenter.CanCollide = false
        orbituaCenter.Parent = workspace
        orbituaCenter.CFrame = root.CFrame

        -- Collect all eligible unanchored parts (not from our character)
        orbituaParts = {}
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not char:IsAncestorOf(part) then
                                orbitua_prepPart(part)
                                table.insert(orbituaParts, part)
                        end
                end
        end

        -- Watch for new parts being added to workspace
        orbituaActive = true

        local addConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not orbituaActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if speaker.Character and speaker.Character:IsAncestorOf(p) then return end
                        for _, existing in pairs(orbituaParts) do
                                if existing == p then return end
                        end
                        orbitua_prepPart(p)
                        table.insert(orbituaParts, p)
                end)
        end)

        local removeConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(orbituaParts) do
                        if existing == p then table.remove(orbituaParts, i) break end
                end
        end)

        if humanoid then
                orbituaDiedConn = humanoid.Died:Connect(function() execCmd('unorbitua') end)
        end

        -- Main loop: Velocity-based circular orbit
        -- Each frame: calculate where each part should be on the circle, set Velocity toward that point
        local angleOffset = 0
        orbituaConn = RunService.Heartbeat:Connect(function(dt)
                if not orbituaActive then return end
                local r = getRoot(speaker.Character)
                if not r then return end

                -- Move center to player position
                orbituaCenter.CFrame = r.CFrame
                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                -- Advance the rotation angle
                angleOffset = angleOffset + (orbituaSpeed * 0.01 * dt)

                local center = orbituaCenter.Position + Vector3.new(0, orbituaHeight, 0)

                for i, part in pairs(orbituaParts) do
                        if part and part.Parent then
                                local pos = part.Position
                                -- Calculate current angle of part relative to center
                                local angle = math.atan2(pos.Z - center.Z, pos.X - center.X)
                                -- Offset angle by rotation speed to create orbit
                                local newAngle = angle + (orbituaSpeed * 0.01 * dt)
                                -- Distance from center (clamped to radius)
                                local dist = (Vector3.new(pos.X, center.Y, pos.Z) - center).Magnitude
                                local clampedDist = math.min(orbituaRadius, dist)

                                -- Calculate target position on the circle
                                local targetPos = Vector3.new(
                                        center.X + math.cos(newAngle) * clampedDist,
                                        center.Y + (orbituaHeight > 0 and (orbituaHeight * math.abs(math.sin((pos.Y - center.Y) / math.max(orbituaHeight, 1)))) or 0),
                                        center.Z + math.sin(newAngle) * clampedDist
                                )

                                -- Set Velocity toward target = attraction
                                local dir = (targetPos - pos)
                                if dir.Magnitude > 0.01 then
                                        part.Velocity = dir.Unit * orbituaSpeed
                                end
                        end
                end
        end)

        showArcPopup('OrbitUA (R:' .. orbituaRadius .. ' S:' .. orbituaSpeed .. ')', true)
end)

-- Helper: prep a part for orbiting (strip constraints, zero friction, no collision)
function orbitua_prepPart(part)
        for _, x in pairs(part:GetChildren()) do
                if x:IsA('BodyAngularVelocity') or x:IsA('BodyForce') or x:IsA('BodyGyro') or x:IsA('BodyPosition') or x:IsA('BodyThrust') or x:IsA('BodyVelocity') or x:IsA('RocketPropulsion') or x:IsA('AlignPosition') or x:IsA('AlignOrientation') or x:IsA('Torque') then
                        x:Destroy()
                end
        end
        part.CustomPhysicalProperties = PhysicalProperties.new(0, 0, 0, 0, 0)
        part.CanCollide = false
end

addcmd('unorbitua', {'noorbitua'}, function(args, speaker)
        orbituaActive = false
        disablePhysicsGodmode(speaker)
        if orbituaConn then orbituaConn:Disconnect() orbituaConn = nil end
        if orbituaDiedConn then orbituaDiedConn:Disconnect() orbituaDiedConn = nil end
        for _, part in pairs(orbituaParts) do
                if part and part.Parent then
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.Velocity = Vector3.new(0, 0, 0)
                        part.CanCollide = true
                end
        end
        orbituaParts = {}
        if orbituaCenter and orbituaCenter.Parent then orbituaCenter:Destroy() end
        orbituaCenter = nil
        showArcPopup('OrbitUA', false)
end)

addcmd('toggleorbitua', {}, function(args, speaker)
        if orbituaActive then execCmd('unorbitua') else execCmd('orbitua') end
end)

-- ======================== CUBE BUILDER ========================
-- Uses orbitua-style approach: orbitua_prepPart + AlignPosition/AlignOrientation
-- Scans workspace for 6 unanchored parts of the same type, aligns them as a cube 15 studs above your head
-- Groups by part.Name first (e.g. all "Brick", all "Wood"), falls back to ClassName
-- Works with ANY size block -- just need 6 of the same named type
-- Usage: cube  |  uncube / nocube / cubeoff / togglecube

local cubeParts = {}
local cubeActive = false
local cubeConn = nil
local cubeCenter = nil
local cubeDiedConn = nil
local cubeFaceOffsets = nil

addcmd('cube', {'cubebuild'}, function(args, speaker)
        if cubeActive then execCmd('uncube') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('Cube', 'Character not found') return end
        local root = getRoot(char)

        -- Collect all valid unanchored parts (skip tiny parts and character parts)
        local allParts = {}
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored and part.Size.Magnitude > 0.3 then
                        if not char:IsAncestorOf(part) then
                                table.insert(allParts, part)
                        end
                end
        end

        -- Group by part.Name first (same type of block), fall back to ClassName
        local function findBestGroup(keyFunc)
                local typeGroups = {}
                for _, part in pairs(allParts) do
                        local key = keyFunc(part)
                        if not typeGroups[key] then
                                typeGroups[key] = {}
                        end
                        table.insert(typeGroups[key], part)
                end
                local bestGroup = nil
                local bestCount = 0
                local bestAvgSize = 0
                for key, group in pairs(typeGroups) do
                        local count = #group
                        if count >= 6 and count >= bestCount then
                                local avgSize = 0
                                for _, p in pairs(group) do
                                        avgSize = avgSize + p.Size.Magnitude
                                end
                                avgSize = avgSize / count
                                if count > bestCount or avgSize > bestAvgSize then
                                        bestGroup = group
                                        bestCount = count
                                        bestAvgSize = avgSize
                                end
                        end
                end
                return bestGroup, bestCount
        end

        -- Try grouping by Name first, then ClassName as fallback
        local bestGroup, bestCount = findBestGroup(function(p) return p.Name end)
        if not bestGroup then
                bestGroup, bestCount = findBestGroup(function(p) return p.ClassName end)
        end

        if not bestGroup then
                notify('Cube', 'Could not find 6 parts of the same type in workspace')
                return
        end

        -- Take exactly 6 parts
        cubeParts = {}
        for i = 1, 6 do
                cubeParts[i] = bestGroup[i]
        end

        -- Determine cube dimensions: average size of all 6 parts
        local avgX, avgY, avgZ = 0, 0, 0
        for _, part in pairs(cubeParts) do
                avgX = avgX + part.Size.X
                avgY = avgY + part.Size.Y
                avgZ = avgZ + part.Size.Z
        end
        avgX = avgX / 6
        avgY = avgY / 6
        avgZ = avgZ / 6
        local side = (avgX + avgY + avgZ) / 3  -- average side length
        local halfW = side / 2
        local halfT = side / 2

        -- 6 face offsets relative to cube center
        cubeFaceOffsets = {
                CFrame.new(halfW + halfT, 0, 0) * CFrame.Angles(0, 0, math.rad(90)),    -- Right (+X)
                CFrame.new(-halfW - halfT, 0, 0) * CFrame.Angles(0, 0, math.rad(-90)),  -- Left (-X)
                CFrame.new(0, halfW + halfT, 0) * CFrame.Angles(0, 0, 0),               -- Top (+Y)
                CFrame.new(0, -halfW - halfT, 0) * CFrame.Angles(math.rad(180), 0, 0),  -- Bottom (-Y)
                CFrame.new(0, 0, halfW + halfT) * CFrame.Angles(math.rad(90), 0, 0),    -- Front (+Z)
                CFrame.new(0, 0, -halfW - halfT) * CFrame.Angles(math.rad(-90), 0, 0),  -- Back (-Z)
        }

        -- Prep parts using orbitua's helper (strip old constraints, zero friction, no collision)
        for _, part in pairs(cubeParts) do
                orbitua_prepPart(part)
        end

        -- Add AlignPosition + AlignOrientation to each part for precise face positioning
        for i = 1, 6 do
                local part = cubeParts[i]

                local ap = Instance.new('AlignPosition')
                ap.Name = 'CubeAP'
                ap.Mode = Enum.PositionAlignmentMode.OneAttachment
                ap.Attachment0 = Instance.new('Attachment', part)
                ap.MaxForce = math.huge
                ap.ReactionForceEnabled = false
                ap.Responsiveness = 200
                ap.Parent = part

                local ao = Instance.new('AlignOrientation')
                ao.Name = 'CubeAO'
                ao.Mode = Enum.OrientationAlignmentMode.OneAttachment
                ao.Attachment0 = Instance.new('Attachment', part)
                ao.MaxTorque = math.huge
                ao.Responsiveness = 200
                ao.Parent = part
        end

        -- Weld all 6 faces together for sturdiness
        for i = 1, 6 do
                for j = i + 1, 6 do
                        local w = Instance.new('WeldConstraint')
                        w.Part0 = cubeParts[i]
                        w.Part1 = cubeParts[j]
                        w.Parent = cubeParts[i]
                end
        end

        -- Create invisible anchored center point (same as orbitua)
        cubeCenter = Instance.new('Part')
        cubeCenter.Name = randomString()
        cubeCenter.Size = Vector3.new(1, 1, 1)
        cubeCenter.Transparency = 1
        cubeCenter.Anchored = true
        cubeCenter.CanCollide = false
        cubeCenter.Parent = workspace
        cubeCenter.CFrame = root.CFrame * CFrame.new(0, 15, 0)

        cubeActive = true

        local hum = char:FindFirstChildWhichIsA('Humanoid')
        if hum then
                cubeDiedConn = hum.Died:Connect(function() execCmd('uncube') end)
        end

        -- Main loop: update alignment targets each frame (same structure as orbitua)
        cubeConn = RunService.Heartbeat:Connect(function(dt)
                if not cubeActive then return end
                local r = getRoot(speaker.Character)
                if not r then return end
                if not cubeCenter or not cubeCenter.Parent then return end

                -- Move center 15 studs above player
                cubeCenter.CFrame = r.CFrame * CFrame.new(0, 15, 0)
                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                -- Update each face's alignment target
                for i = 1, 6 do
                        local part = cubeParts[i]
                        if part and part.Parent then
                                local targetCF = cubeCenter.CFrame * cubeFaceOffsets[i]
                                local ap = part:FindFirstChild('CubeAP')
                                if ap then ap.Position = targetCF.Position end
                                local ao = part:FindFirstChild('CubeAO')
                                if ao then ao.CFrame = targetCF end
                                -- Kill velocity so it stays tight
                                part.Velocity = Vector3.new(0, 0, 0)
                                part.RotVelocity = Vector3.new(0, 0, 0)
                        end
                end
        end)

        showArcPopup('Cube (15 studs)', true)
        notify('Cube', 'Built cube from ' .. bestCount .. ' similar parts (15 studs above head)')
end)

addcmd('uncube', {'nocube', 'cubeoff'}, function(args, speaker)
        cubeActive = false
        if cubeConn then cubeConn:Disconnect() cubeConn = nil end
        if cubeDiedConn then cubeDiedConn:Disconnect() cubeDiedConn = nil end
        if cubeCenter and cubeCenter.Parent then cubeCenter:Destroy() end
        cubeCenter = nil
        for _, part in pairs(cubeParts) do
                if part and part.Parent then
                        for _, x in pairs(part:GetChildren()) do
                                if x:IsA('AlignPosition') or x:IsA('AlignOrientation') or x:IsA('WeldConstraint') or x:IsA('Attachment') then
                                        x:Destroy()
                                end
                        end
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.Velocity = Vector3.new(0, 0, 0)
                        part.RotVelocity = Vector3.new(0, 0, 0)
                end
        end
        cubeParts = {}
        cubeFaceOffsets = nil
        showArcPopup('Cube', false)
end)

addcmd('togglecube', {}, function(args, speaker)
        if cubeActive then execCmd('uncube') else execCmd('cube') end
end)


-- ======================== BLACK HOLE ========================
-- ALL unanchored parts form a black hole: 75% tight spiraling core, 25% orbit ring.
-- Core parts have varying orbit radii + Y wobble for realistic vortex look.
-- Constant speed Velocity (orbitua-style) so parts never stop, never lose ownership.
-- Tiny random velocity perturbation every frame keeps server ownership active.
-- Grabs new parts that spawn. Stays on after death. No cap.
-- Usage: blackhole [speed]  |  unblackhole / noblackhole / blackholeoff / toggleblackhole

bhActive = false
bhConn = nil
bhAllParts = {}
bhCenterPos = nil
bhRadius = 15
bhSpeed = 300
bhAddConn = nil
bhRemConn = nil
bhScanConn = nil

addcmd('blackhole', {'bhole'}, function(args, speaker)
        if bhActive then execCmd('unblackhole') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('Black Hole', 'Character not found') return end
        local root = getRoot(char)

        bhSpeed = tonumber(args[1]) or 300
        bhAllParts = {}

        -- Collect ALL eligible unanchored parts (skip tiny debris only)
        local found = {}
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored and part.Size.Magnitude > 0.5 then
                        if not char:IsAncestorOf(part) then
                                if not (part.Size.X < 1 and part.Size.Y < 1 and part.Size.Z < 1) then
                                        table.insert(found, part)
                                end
                        end
                end
        end

        if #found < 4 then
                notify('Black Hole', 'Not enough unanchored parts in workspace')
                return
        end

        -- Shuffle for random split
        for i = #found, 2, -1 do
                local j = math.random(1, i)
                local tmp = found[i]
                found[i] = found[j]
                found[j] = tmp
        end

        -- Prep and add all parts
        for _, part in pairs(found) do
                orbitua_prepPart(part)
                table.insert(bhAllParts, part)
        end

        -- Record center (stays even if you move)
        bhCenterPos = root.Position
        bhRadius = math.max(15, #found * 0.15 + 10)

        bhActive = true

        -- Grab new parts that appear (like orbitua)
        bhAddConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not bhActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if p.Size.Magnitude < 0.5 then return end
                        if p.Size.X < 1 and p.Size.Y < 1 and p.Size.Z < 1 then return end
                        if speaker.Character and speaker.Character:IsAncestorOf(p) then return end
                        for _, existing in pairs(bhAllParts) do
                                if existing == p then return end
                        end
                        orbitua_prepPart(p)
                        table.insert(bhAllParts, p)
                end)
        end)

        -- Remove destroyed parts
        bhRemConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(bhAllParts) do
                        if existing == p then table.remove(bhAllParts, i) break end
                end
        end)

        -- Periodically rescan workspace every 3 seconds to grab parts that got unanchored later
        bhScanConn = task.spawn(function()
                while bhActive do
                        task.wait(3)
                        if not bhActive then break end
                        local char2 = speaker.Character
                        for _, part in pairs(workspace:GetDescendants()) do
                                if not bhActive then break end
                                if part:IsA('BasePart') and not part.Anchored and part.Size.Magnitude > 0.5 then
                                        if not (part.Size.X < 1 and part.Size.Y < 1 and part.Size.Z < 1) then
                                                if not char2 or not char2:IsAncestorOf(part) then
                                                        local alreadyIn = false
                                                        for _, existing in pairs(bhAllParts) do
                                                                if existing == part then alreadyIn = true break end
                                                        end
                                                        if not alreadyIn then
                                                                orbitua_prepPart(part)
                                                                table.insert(bhAllParts, part)
                                                        end
                                                end
                                        end
                                end
                        end
                end
        end)

        -- Main loop
        bhConn = RunService.Heartbeat:Connect(function(dt)
                if not bhActive then return end

                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                local total = #bhAllParts
                if total < 2 then return end

                local coreEnd = math.floor(total * 0.75)
                if coreEnd < 1 then coreEnd = 1 end
                if coreEnd >= total then coreEnd = total - 1 end

                for i, part in pairs(bhAllParts) do
                        if not part or not part.Parent then end

                        local pos = part.Position
                        local angle = math.atan2(pos.Z - bhCenterPos.Z, pos.X - bhCenterPos.X)

                        -- Tiny random jitter every frame to keep server ownership
                        local jitter = Vector3.new(
                                math.random(-5, 5),
                                0,
                                math.random(-5, 5)
                        )

                        if i <= coreEnd then
                                -- CORE: tight vortex around center
                                -- Each part gets a slightly different orbit radius based on index for layered look
                                local layer = ((i - 1) % 5) * 0.6
                                local coreR = 2 + layer
                                -- Vary speed per layer so inner spins faster than outer (like a real vortex)
                                local speedMult = 1.5 - (layer * 0.15)
                                local newAngle = angle + (bhSpeed * 0.012 * speedMult * dt)

                                -- Y wobble for 3D vortex effect
                                local yWobble = math.sin(tick() * 3 + i * 1.5) * 2

                                local targetPos = Vector3.new(
                                        bhCenterPos.X + math.cos(newAngle) * coreR,
                                        bhCenterPos.Y + yWobble,
                                        bhCenterPos.Z + math.sin(newAngle) * coreR
                                )

                                local dir = targetPos - pos
                                if dir.Magnitude > 0.01 then
                                        part.Velocity = dir.Unit * bhSpeed + jitter
                                end
                        else
                                -- ORBIT: wide ring with vertical bob
                                local newAngle = angle + (bhSpeed * 0.01 * dt)
                                local flatDist = (Vector3.new(pos.X - bhCenterPos.X, 0, pos.Z - bhCenterPos.Z)).Magnitude
                                local clampedDist = math.min(bhRadius, flatDist)

                                local targetPos = Vector3.new(
                                        bhCenterPos.X + math.cos(newAngle) * clampedDist,
                                        bhCenterPos.Y + 3 * math.sin(tick() * 2 + i),
                                        bhCenterPos.Z + math.sin(newAngle) * clampedDist
                                )

                                local dir = targetPos - pos
                                if dir.Magnitude > 0.01 then
                                        part.Velocity = dir.Unit * bhSpeed + jitter
                                end
                        end
                end
        end)

        showArcPopup('Black Hole', true)
        notify('Black Hole', #found .. ' parts absorbed (core + ring)')
end)

addcmd('unblackhole', {'noblackhole', 'blackholeoff'}, function(args, speaker)
        bhActive = false
        if bhConn then bhConn:Disconnect() bhConn = nil end
        if bhAddConn then bhAddConn:Disconnect() bhAddConn = nil end
        if bhRemConn then bhRemConn:Disconnect() bhRemConn = nil end
        bhScanConn = nil

        for _, part in pairs(bhAllParts) do
                if part and part.Parent then
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.Velocity = Vector3.new(0, 0, 0)
                        part.RotVelocity = Vector3.new(0, 0, 0)
                end
        end
        bhAllParts = {}
        bhCenterPos = nil
        showArcPopup('Black Hole', false)
end)

addcmd('toggleblackhole', {}, function(args, speaker)
        if bhActive then execCmd('unblackhole') else execCmd('blackhole') end
end)


-- ======================== UNANCHORED CANNON ========================
-- 1 random unanchored part. Floats 10 studs from you toward mouse using VELOCITY (serversided).
-- Click = catapult toward mouse. Green dot stays. Auto-grabs next.
-- EXACT same grab logic as orbitua. orbitua_prepPart on grabbed part.
-- Usage: cannon [power]  |  uncannon

cannonActive = false
cannonDot = nil
cannonConn = nil
cannonClickConn = nil
cannonHeldPart = nil
cannonHighlight = nil
cannonRecheckThread = nil
cannonKeyConn = nil

-- Helper: make green dot, returns it
local function makeCannonDot()
        local dot = Instance.new('Part')
        dot.Name = randomString()
        dot.Size = Vector3.new(3, 3, 3)
        dot.Shape = Enum.PartType.Ball
        dot.Color = Color3.fromRGB(0, 255, 0)
        dot.Material = Enum.Material.Neon
        dot.Anchored = true
        dot.CanCollide = false
        dot.CanQuery = false
        dot.CanTouch = false
        dot.Transparency = 0.3
        dot.CastShadow = false
        dot.Massless = true
        dot.Parent = workspace
        return dot
end

-- Helper: show cannon popup (kills any old animation first, no queue race)
local function showCannonPopup(on)
        pcall(function()
                -- Kill any running popup animation by destroying and rebuilding
                if ArcPopupGui and ArcPopupGui.Parent then
                        ArcPopupGui:Destroy()
                end
                ArcPopupGui = nil
                ArcPopupFrame = nil
                ArcPopupQueue = {}

                local gui = Instance.new('ScreenGui')
                gui.Name = 'ArcYieldPopup'
                gui.ResetOnSpawn = false
                gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
                gui.Parent = game:GetService('CoreGui')
                ArcPopupGui = gui

                local frame = Instance.new('Frame')
                frame.Size = UDim2.new(0, 280, 0, 55)
                frame.Position = UDim2.new(0.5, -140, 0, -65)
                frame.BackgroundColor3 = Color3.fromRGB(10, 10, 20)
                frame.BackgroundTransparency = 0.15
                frame.BorderSizePixel = 0
                frame.Parent = gui
                ArcPopupFrame = frame

                local corner = Instance.new('UICorner')
                corner.CornerRadius = UDim.new(0, 8)
                corner.Parent = frame

                local stroke = Instance.new('UIStroke')
                stroke.Color = Color3.fromRGB(50, 100, 255)
                stroke.Thickness = 1.5
                stroke.Transparency = 0.3
                stroke.Parent = frame

                local accent = Instance.new('Frame')
                accent.Size = UDim2.new(0, 5, 0, 55)
                accent.BackgroundColor3 = Color3.fromRGB(50, 120, 255)
                accent.BorderSizePixel = 0
                local ac = Instance.new('UICorner')
                ac.CornerRadius = UDim.new(0, 3)
                ac.Parent = accent
                accent.Parent = frame

                local tl = Instance.new('TextLabel')
                tl.Name = 'Title'
                tl.Size = UDim2.new(1, -20, 0, 28)
                tl.Position = UDim2.new(0, 14, 0, 2)
                tl.BackgroundTransparency = 1
                tl.Text = 'Cannon'
                tl.TextColor3 = Color3.fromRGB(220, 230, 255)
                tl.TextStrokeColor3 = Color3.fromRGB(30, 80, 255)
                tl.TextStrokeTransparency = 0.6
                tl.Font = Enum.Font.GothamBold
                tl.TextSize = 16
                tl.TextXAlignment = Enum.TextXAlignment.Left
                tl.Parent = frame

                local sl = Instance.new('TextLabel')
                sl.Name = 'Status'
                sl.Size = UDim2.new(1, -20, 0, 20)
                sl.Position = UDim2.new(0, 14, 0, 28)
                sl.BackgroundTransparency = 1
                sl.Text = on and 'ENABLED' or 'DISABLED'
                sl.TextColor3 = on and Color3.fromRGB(100, 255, 130) or Color3.fromRGB(255, 100, 100)
                sl.TextStrokeColor3 = Color3.fromRGB(30, 80, 255)
                sl.TextStrokeTransparency = 0.8
                sl.Font = Enum.Font.Gotham
                sl.TextSize = 13
                sl.TextXAlignment = Enum.TextXAlignment.Left
                sl.Parent = frame

                local ts = game:GetService('TweenService')
                ts:Create(frame, TweenInfo.new(0.35, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {
                        Position = UDim2.new(0.5, -140, 0, 10),
                        BackgroundTransparency = 0
                }):Play()
        end)
end

addcmd('cannon', {}, function(args, speaker)
        if cannonActive then execCmd('uncannon') return end

        local char = speaker.Character
        if not char then notify('Cannon', 'Character not found') return end
        enablePhysicsGodmode(speaker)

        local mouse = speaker:GetMouse()

        -- Parse optional power argument (default 500)
        local cannonPower = tonumber(args[1] or '') or 500

        cannonActive = true
        cannonDot = makeCannonDot()
        cannonDot.AncestryChanged:Connect(function(_, newParent)
                if not newParent and cannonActive then
                        pcall(function() cannonDot.Parent = workspace end)
                end
        end)

        -- Check if part has any Humanoid ancestor (skip body parts)
        local function isBodyPart(part)
                local ancestor = part.Parent
                while ancestor and ancestor ~= workspace do
                        if ancestor:FindFirstChildWhichIsA('Humanoid') then
                                return true
                        end
                        ancestor = ancestor.Parent
                end
                return false
        end

        -- Check if part is welded to any anchored part (recursive, depth capped)
        -- Uses GetJoints() to find ALL connections from BOTH sides
        -- Filters out SurfaceJoints (auto physics contacts with terrain/ground)
        -- Returns true = REJECT (welded chain leads to anchored)
        -- Returns false = OK (0 real welds, or all welds lead to unanchored = free clump)
        local function isWeldedToAnchored(part, visited, depth)
                if not visited then visited = {} end
                if not depth then depth = 0 end
                if depth > 20 then return false end
                if visited[part] then return false end
                visited[part] = true
                if part.Anchored then return true end

                local ok, joints = pcall(function() return part:GetJoints() end)
                if not ok or not joints then return false end

                for _, j in pairs(joints) do
                        -- Skip SurfaceJoints: auto-created when part touches terrain/ground
                        -- These are NOT real welds and lead to false positives
                        local className = j.ClassName
                        if className ~= 'SurfaceJoint' and className ~= 'SurfaceConstraint' then
                                local other = nil
                                local jok = pcall(function()
                                        -- Try Part0/Part1 first (Weld, WeldConstraint, NoCollisionConstraint, etc.)
                                        if j.Part0 and j.Part0 ~= part then other = j.Part0 end
                                        if not other and j.Part1 and j.Part1 ~= part then other = j.Part1 end
                                        -- Fallback: Attachment-based (RodConstraint, SpringConstraint, HingeConstraint, etc.)
                                        if not other then
                                                if j.Attachment0 and j.Attachment0.Parent and j.Attachment0.Parent:IsA('BasePart') and j.Attachment0.Parent ~= part then
                                                        other = j.Attachment0.Parent
                                                elseif j.Attachment1 and j.Attachment1.Parent and j.Attachment1.Parent:IsA('BasePart') and j.Attachment1.Parent ~= part then
                                                        other = j.Attachment1.Parent
                                                end
                                        end
                                end)
                                if jok and other then
                                        if other.Anchored then return true end
                                        if isWeldedToAnchored(other, visited, depth + 1) then return true end
                                end
                        end
                end

                return false
        end

        -- Remove old highlight
        local function removeHighlight()
                if cannonHighlight and cannonHighlight.Parent then
                        pcall(function() cannonHighlight:Destroy() end)
                end
                cannonHighlight = nil
        end

        -- Pre-built queue from background scan (no lag on click/grab)
        local cannonQueue = {}

        -- Pick 1 random part from the queue and hold it
        -- No weld check here -- queue is pre-filtered by the scan every 30s
        local function grabFromQueue()
                removeHighlight()
                local valid = {}
                for _, part in pairs(cannonQueue) do
                        if part and part.Parent and part.Anchored == false then
                                if not char:IsAncestorOf(part) then
                                        if not isBodyPart(part) then
                                                valid[#valid + 1] = part
                                        end
                                end
                        end
                end
                if #valid > 0 then
                        local chosen = valid[math.random(1, #valid)]
                        -- Safety: double-check weld chain in case it changed since last scan
                        local ok2, welded = pcall(function() return isWeldedToAnchored(chosen) end)
                        if ok2 and welded then
                                chosen = nil
                                for _, p in ipairs(valid) do
                                        local ok3, w2 = pcall(function() return isWeldedToAnchored(p) end)
                                        if not ok3 or not w2 then chosen = p break end
                                end
                        end
                        if not chosen then cannonHeldPart = nil return end
                        pcall(function() orbitua_prepPart(chosen) end)
                        pcall(function() chosen.Massless = true end)

                        -- Teleport onto part briefly for server ownership, then come back
                        -- Stay 0.1 second, skip if part is too far (>500 studs)
                        -- Kill player momentum after teleport back so you dont get flung
                        pcall(function()
                                local root = getRoot(speaker.Character)
                                if root then
                                        local dist = (chosen.Position - root.Position).Magnitude
                                        if dist <= 500 then
                                                local savedPos = root.CFrame
                                                root.CFrame = chosen.CFrame + Vector3.new(0, 3, 0)
                                                task.wait(0.1)
                                                root.CFrame = savedPos
                                                root.Velocity = Vector3.new(0, 0, 0)
                                                root.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                root.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                        end
                                end
                        end)

                        pcall(function() chosen:SetNetworkOwner(nil) end)
                        pcall(function() workspace:ResetNetworkOwnerlessTimeout(0) end)
                        cannonHeldPart = chosen
                        -- ESP highlight
                        local hl = Instance.new('Highlight')
                        hl.Name = randomString()
                        hl.FillColor = Color3.fromRGB(255, 100, 0)
                        hl.OutlineColor = Color3.fromRGB(255, 255, 0)
                        hl.FillTransparency = 0.5
                        hl.OutlineTransparency = 0
                        hl.Parent = chosen
                        cannonHighlight = hl
                else
                        cannonHeldPart = nil
                end
        end

        -- Scan function: rebuild queue with weld check
        -- Yields every 40 parts so it doesn't freeze a single frame (no lag spike)
        local function fullScan()
                local freshQueue = {}
                local allParts = {}
                pcall(function()
                        for _, obj in pairs(workspace:GetDescendants()) do
                                if obj:IsA('BasePart') and obj.Anchored == false then
                                        allParts[#allParts + 1] = obj
                                end
                        end
                end)
                local freshChar = speaker.Character
                local count = 0
                for i = 1, #allParts do
                        local part = allParts[i]
                        if part and part.Parent then
                                if freshChar and not freshChar:IsAncestorOf(part) then
                                        if not isBodyPart(part) then
                                                local weldOk, welded = pcall(function() return isWeldedToAnchored(part) end)
                                                if not weldOk or not welded then
                                                        freshQueue[#freshQueue + 1] = part
                                                end
                                        end
                                end
                        end
                        count = count + 1
                        if count % 5 == 0 then
                                RunService.Heartbeat:Wait()
                        end
                end
                cannonQueue = freshQueue
        end

        -- Background scan every 5 seconds: rebuilds queue + rechecks held part
        -- Everything is spread across frames so there is zero lag spike
        cannonRecheckThread = task.spawn(function()
                while cannonActive do
                        task.wait(5)
                        if not cannonActive then break end

                        -- Remove all FallDamageScripts from workspace only (game:GetDescendants is too heavy)
                        pcall(function()
                                local count = 0
                                for _, obj in pairs(workspace:GetDescendants()) do
                                        local n = obj.Name
                                        if n == 'FallDamageScript' or n == 'fallDamageScript' or n == 'FallDamage' then
                                                pcall(function() obj:Destroy() end)
                                        end
                                        count = count + 1
                                        if count % 200 == 0 then RunService.Heartbeat:Wait() end
                                end
                        end)
                        -- Also check common script services
                        pcall(function()
                                for _, svc in pairs({game:GetService('ServerScriptService'), game:GetService('StarterPlayer'), game:GetService('StarterGui'), game:GetService('ReplicatedFirst')}) do
                                        local count = 0
                                        for _, obj in pairs(svc:GetDescendants()) do
                                                local n = obj.Name
                                                if n == 'FallDamageScript' or n == 'fallDamageScript' or n == 'FallDamage' then
                                                        pcall(function() obj:Destroy() end)
                                                end
                                                count = count + 1
                                                if count % 200 == 0 then RunService.Heartbeat:Wait() end
                                        end
                                end
                        end)

                        fullScan()

                        -- Recheck currently held part: did it die, anchor, or get welded?
                        if cannonHeldPart and cannonHeldPart.Parent then
                                if cannonHeldPart.Anchored then
                                        grabFromQueue()
                                else
                                        local ok2, welded = pcall(function()
                                                return isWeldedToAnchored(cannonHeldPart)
                                        end)
                                        if ok2 and welded then
                                                grabFromQueue()
                                        end
                                end
                        elseif cannonHeldPart then
                                -- Part destroyed
                                cannonHeldPart = nil
                                grabFromQueue()
                        end
                end
        end)

        -- Initial scan in background so cannon enables INSTANTLY (no waiting)
        -- Grab happens once scan finishes populating the queue
        task.spawn(function()
                fullScan()
                if cannonActive then grabFromQueue() end
        end)

        -- Press K to force re-scan (rechecks welds on everything)
        local UIS = game:GetService('UserInputService')
        cannonKeyConn = UIS.InputBegan:Connect(function(input)
                if not cannonActive then return end
                if input.KeyCode == Enum.KeyCode.K then
                        fullScan()
                        grabFromQueue()
                end
        end)

        -- Main loop: move dot, move held part with VELOCITY (serversided!)
        cannonConn = RunService.Heartbeat:Connect(function(dt)
                if not cannonActive then return end

                -- Keep green dot alive (games delete non-game parts from workspace)
                if not cannonDot or not cannonDot.Parent then
                        cannonDot = makeCannonDot()
                        cannonDot.AncestryChanged:Connect(function(_, newParent)
                                if not newParent and cannonActive then
                                        pcall(function() cannonDot.Parent = workspace end)
                                end
                        end)
                end

                -- Also force-dot-parent every frame as backup
                if cannonDot.Parent ~= workspace then
                        pcall(function() cannonDot.Parent = workspace end)
                end

                local r = getRoot(speaker.Character)
                if not r then return end

                -- Serversided (same as orbitua)
                pcall(function() sethiddenproperty(speaker, "SimulationRadius", math.huge) end)

                -- Force server ownership on held part every frame
                if cannonHeldPart and cannonHeldPart.Parent then
                        pcall(function() cannonHeldPart:SetNetworkOwner(nil) end)
                end

                -- Move green dot to mouse (anchored part, CFrame is fine)
                pcall(function()
                        local mousePos = mouse.Hit.Position
                        -- Clamp dot to max 200 studs from camera so it's always visible
                        local cam = workspace.CurrentCamera
                        if cam then
                                local camPos = cam.CFrame.Position
                                if (mousePos - camPos).Magnitude > 200 then
                                        mousePos = camPos + (mousePos - camPos).Unit * 200
                                end
                        end
                        cannonDot.CFrame = CFrame.new(mousePos)
                end)

                -- Move held part using VELOCITY (serversided, everyone sees it move)
                if cannonHeldPart and cannonHeldPart.Parent then
                        local ok = pcall(function()
                                local toMouse = cannonDot.Position - r.Position
                                local targetPos = r.Position + toMouse.Unit * 10
                                local dir = targetPos - cannonHeldPart.Position
                                if dir.Magnitude > 0.5 then
                                        cannonHeldPart.Velocity = dir.Unit * math.min(dir.Magnitude * 8, 300)
                                else
                                        cannonHeldPart.Velocity = Vector3.new(0, 0, 0)
                                end
                                cannonHeldPart.RotVelocity = Vector3.new(0, 0, 0)
                                cannonHeldPart.CustomPhysicalProperties = PhysicalProperties.new(0, 0, 0, 0, 0)
                                cannonHeldPart.CanCollide = false
                                cannonHeldPart.CanTouch = false
                        end)
                        if not ok then
                                -- Part is probably broken, grab a new one from queue
                                removeHighlight()
                                cannonHeldPart = nil
                                grabFromQueue()
                        end
                        -- Keep highlight on
                        if not cannonHighlight or not cannonHighlight.Parent then
                                if cannonHeldPart and cannonHeldPart.Parent then
                                        local hl = Instance.new('Highlight')
                                        hl.Name = randomString()
                                        hl.FillColor = Color3.fromRGB(255, 100, 0)
                                        hl.OutlineColor = Color3.fromRGB(255, 255, 0)
                                        hl.FillTransparency = 0.5
                                        hl.OutlineTransparency = 0
                                        hl.Parent = cannonHeldPart
                                        cannonHighlight = hl
                                end
                        end
                end
        end)

        -- Click = catapult force toward mouse, keeps pushing for 0.5s so lag doesnt kill it
        cannonClickConn = mouse.Button1Down:Connect(function()
                if not cannonActive then return end
                if not cannonHeldPart or not cannonHeldPart.Parent then return end

                local launched = cannonHeldPart
                local launchDir = (cannonDot.Position - launched.Position).Unit
                cannonHeldPart = nil
                removeHighlight()

                pcall(function()
                        launched:SetNetworkOwner(nil)
                        launched.CustomPhysicalProperties = PhysicalProperties.new(0, 0, 0, 0, 0)
                        launched.CanCollide = false
                end)

                -- Keep pushing for 0.5 seconds so lag spikes dont eat the launch
                task.spawn(function()
                        local startTime = tick()
                        while tick() - startTime < 0.5 do
                                if not launched or not launched.Parent then break end
                                pcall(function()
                                        launched.Velocity = launchDir * cannonPower
                                        launched.RotVelocity = Vector3.new(
                                                math.random(-100, 100),
                                                math.random(-100, 100),
                                                math.random(-100, 100)
                                        )
                                end)
                                RunService.Heartbeat:Wait()
                        end
                end)

                -- Wait 0.2 seconds then grab next part (dont teleport instantly on shoot)
                task.delay(0.2, function()
                        if not cannonActive then return end
                        grabFromQueue()
                end)
        end)

        -- Show ENABLED popup (destroys old popup first = no race conditions)
        showCannonPopup(true)
        notify('Cannon', 'Click to launch! Green dot stays')

end)

addcmd('uncannon', {}, function(args, speaker)
        cannonActive = false
        disablePhysicsGodmode(speaker)
        if cannonConn then cannonConn:Disconnect() cannonConn = nil end
        if cannonClickConn then cannonClickConn:Disconnect() cannonClickConn = nil end
        if cannonKeyConn then cannonKeyConn:Disconnect() cannonKeyConn = nil end
        if cannonHighlight and cannonHighlight.Parent then cannonHighlight:Destroy() end
        cannonHighlight = nil
        if cannonHeldPart and cannonHeldPart.Parent then
                pcall(function() cannonHeldPart.CustomPhysicalProperties = nil end)
                pcall(function() cannonHeldPart.Velocity = Vector3.new(0, 0, 0) end)
        end
        cannonHeldPart = nil
        cannonRecheckThread = nil
        if cannonDot and cannonDot.Parent then cannonDot:Destroy() end
        cannonDot = nil
        showCannonPopup(false)
end)


-- ======================== TROWEL ========================
-- Open-top box 300 studs above player. Walls/floor always have collisions.
-- Collect tool: scan nearby parts -> fly them up -> over box -> drop in.
-- Launch tool: fly parts up -> over mouse -> drop at mouse position.
-- Everything serversided via velocity only. No teleport.
-- Usage: trowel [mode]  |  untrowel

trowelActive = false
trowelConn = nil
trowelParts = {}
trowelBox = nil
trowelLaunchTool = nil
trowelCollectTool = nil
trowelCollectRadius = 80
trowelDeploying = false

addcmd('trowel', {}, function(args, speaker)
        if trowelActive then execCmd('untrowel') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('Trowel', 'Character not found') return end
        enablePhysicsGodmode(speaker)

        trowelActive = true
        trowelParts = {}
        trowelDeploying = false

        local deployMode = (args[1] or ''):lower()
        local validModes = {'explode', 'rain', 'spiral', 'shotgun', 'orbit', 'scatter', 'wave', 'normal', 'gun', 'one', 'drop', 'tower', 'wall', 'floor', 'bridge', 'cage', 'staircase', 'missile', 'shield', 'hail', 'volcano', 'magnet', 'fling', 'pile'}
        local modeValid = false
        for _, m in pairs(validModes) do
                if deployMode == m then modeValid = true break end
        end
        if not modeValid then deployMode = 'normal' end

        local root = getRoot(char)
        local boxPos = root.Position + Vector3.new(0, 300, 0)
        -- Target Y is at the TOP of the walls (boxPos.Y + 25) so parts fly up,
        -- then get pushed DOWN into the open-top box instead of floating above it.
        local aboveBoxY = boxPos.Y + 25

        -- Build open-top box with REAL collisions always on
        local boxModel = Instance.new('Model')
        boxModel.Name = randomString()
        boxModel.Parent = workspace

        -- Floor
        local floor = Instance.new('Part')
        floor.Name = randomString()
        floor.Size = Vector3.new(50, 1, 50)
        floor.Position = boxPos - Vector3.new(0, 24.5, 0)
        floor.Anchored = true
        floor.CanCollide = true
        floor.CanQuery = false
        floor.CanTouch = false
        floor.CastShadow = false
        floor.Material = Enum.Material.Grass
        floor.Color = Color3.fromRGB(50, 200, 80)
        floor.Transparency = 0.3
        floor.Parent = boxModel

        -- 4 Walls
        local wallOffsets = {
                Vector3.new(0, 0, 24.5),
                Vector3.new(0, 0, -24.5),
                Vector3.new(24.5, 0, 0),
                Vector3.new(-24.5, 0, 0),
        }
        local wallSizes = {
                Vector3.new(50, 50, 1),
                Vector3.new(50, 50, 1),
                Vector3.new(1, 50, 50),
                Vector3.new(1, 50, 50),
        }
        for w = 1, 4 do
                local wall = Instance.new('Part')
                wall.Name = randomString()
                wall.Size = wallSizes[w]
                wall.Position = boxPos + wallOffsets[w]
                wall.Anchored = true
                wall.CanCollide = true
                wall.CanQuery = false
                wall.CanTouch = false
                wall.CastShadow = false
                wall.Material = Enum.Material.ForceField
                wall.Color = Color3.fromRGB(0, 150, 255)
                wall.Transparency = 0.5
                wall.Parent = boxModel
        end

        -- NO ceiling - open top so parts drop in

        -- SelectionBox wireframe
        local shellDummy = Instance.new('Part')
        shellDummy.Name = randomString()
        shellDummy.Size = Vector3.new(50, 50, 50)
        shellDummy.Position = boxPos
        shellDummy.Anchored = true
        shellDummy.CanCollide = false
        shellDummy.CanQuery = false
        shellDummy.CanTouch = false
        shellDummy.Transparency = 1
        shellDummy.Parent = boxModel
        local selBox = Instance.new('SelectionBox')
        selBox.Adornee = shellDummy
        selBox.Color3 = Color3.fromRGB(100, 200, 255)
        selBox.LineThickness = 0.08
        selBox.Transparency = 0.2
        selBox.Parent = shellDummy

        -- Glowing beacon
        local core = Instance.new('Part')
        core.Name = randomString()
        core.Size = Vector3.new(3, 3, 3)
        core.Shape = Enum.PartType.Ball
        core.Position = boxPos + Vector3.new(0, 22, 0)
        core.Anchored = true
        core.CanCollide = false
        core.CanQuery = false
        core.CanTouch = false
        core.CastShadow = false
        core.Material = Enum.Material.Neon
        core.Color = Color3.fromRGB(0, 200, 255)
        core.Transparency = 0.2
        core.Parent = boxModel
        local boxLight = Instance.new('PointLight')
        boxLight.Color = Color3.fromRGB(0, 180, 255)
        boxLight.Brightness = 3
        boxLight.Range = 40
        boxLight.Parent = core

        trowelBox = boxModel

        -- ========== HELPER: fly parts up, over, drop ==========
        local function flyPartsTo(partsList, destX, destZ, spreadX, spreadZ, onDrop)
                -- Phase 1: fly up above box
                for i = 1, #partsList do
                        local part = partsList[i]
                        if part and part.Parent then
                                pcall(function()
                                        part.CanCollide = false
                                        part.Massless = true
                                        part.Velocity = Vector3.new(0, 600, 0)
                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                end)
                        end
                        task.wait(0.02)
                end
                task.wait(2)
                -- Phase 2: fly to dest X/Z
                for i = 1, #partsList do
                        local part = partsList[i]
                        if part and part.Parent then
                                pcall(function()
                                        local gx = destX + math.random(-spreadX, spreadX)
                                        local gz = destZ + math.random(-spreadZ, spreadZ)
                                        local diff = Vector3.new(gx - part.Position.X, 30, gz - part.Position.Z)
                                        part.Velocity = diff
                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                end)
                        end
                end
                task.wait(2)
                -- Phase 3: drop (restore physics, let gravity pull)
                for i = 1, #partsList do
                        local part = partsList[i]
                        if part and part.Parent then
                                pcall(function()
                                        part.Velocity = Vector3.new(0, 0, 0)
                                        part.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                        part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                        part.CanCollide = true
                                        part.CanTouch = true
                                        part.CustomPhysicalProperties = nil
                                        part.Massless = false
                                end)
                        end
                end
                if onDrop then onDrop() end
        end

        -- ========== MAIN PHYSICS LOOP ==========
        -- State machine: fly_up -> fly_over -> drop -> settling -> in_box
        trowelConn = RunService.Heartbeat:Connect(function(dt)
                if not trowelActive then return end
                pcall(function() sethiddenproperty(speaker, "SimulationRadius", math.huge) end)

                for i = #trowelParts, 1, -1 do
                        local entry = trowelParts[i]
                        local part = entry.part
                        if not part or not part.Parent then
                                table.remove(trowelParts, i)
                        else
                                pcall(function()
                                        if entry.state == 'fly_up' then
                                                -- Clamp velocity so parts don't overshoot past the top of the box
                                                local distToTarget = entry.targetY - part.Position.Y
                                                if distToTarget <= 2 then
                                                        -- Close enough, zero out vertical and move to fly_over
                                                        part.Velocity = Vector3.new(0, 0, 0)
                                                        part.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                        entry.state = 'fly_over'
                                                else
                                                        local upSpeed = math.min(600, distToTarget * 8)
                                                        part.Velocity = Vector3.new(0, upSpeed, 0)
                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                end
                                        elseif entry.state == 'fly_over' then
                                                local gx = entry.targetX
                                                local gz = entry.targetZ
                                                local hDiff = Vector3.new(gx - part.Position.X, 0, gz - part.Position.Z)
                                                local hDist = hDiff.Magnitude
                                                if hDist < 5 then
                                                        -- Centered above the box, now drop straight down into it
                                                        entry.state = 'drop'
                                                else
                                                        -- Move horizontally toward center, but also push DOWN so part
                                                        -- doesn't float above the box while drifting
                                                        local hSpeed = math.min(300, hDist * 6)
                                                        local moveDir = hDiff.Unit * hSpeed
                                                        -- Push down gently toward the inside of the box
                                                        local downPull = -80
                                                        part.Velocity = Vector3.new(moveDir.X, downPull, moveDir.Z)
                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                end
                                        elseif entry.state == 'drop' then
                                                part.Velocity = Vector3.new(0, 0, 0)
                                                part.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                                part.CanCollide = true
                                                part.CanTouch = true
                                                part.CustomPhysicalProperties = nil
                                                part.Massless = false
                                                entry.dropTime = tick()
                                                entry.state = 'settling'
                                        elseif entry.state == 'settling' then
                                                -- Keep zeroing velocity during settle so parts don't bounce back up
                                                part.Velocity = Vector3.new(0, 0, 0)
                                                part.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                                if tick() - entry.dropTime > 2 then
                                                        if entry.onDone == 'collect' then
                                                                entry.state = 'in_box'
                                                        else
                                                                table.remove(trowelParts, i)
                                                        end
                                                end
                                        end
                                end)
                        end
                end
        end)

        -- ========== HELPER: claim server ownership via teleport ==========
        -- Teleports you to the box for 500ms so server gives you ownership of all parts near it,
        -- then teleports you back. Way more reliable than SetNetworkOwner(nil).
        local function claimBoxOwnership()
                local r = getRoot(speaker.Character)
                if not r then return end
                local savedCF = r.CFrame
                pcall(function()
                        -- Teleport to box center (floor level)
                        char:PivotTo(CFrame.new(boxPos.X, boxPos.Y - 23, boxPos.Z))
                        task.wait(0.5)
                        -- Teleport back
                        char:PivotTo(savedCF)
                end)
        end

        -- ========== COLLECT TOOL ==========
        local collectTool = Instance.new('Tool')
        collectTool.Name = 'Collect'
        collectTool.CanBeDropped = false
        collectTool.Parent = speaker.Backpack
        trowelCollectTool = collectTool
        local collectHandle = Instance.new('Part')
        collectHandle.Name = 'Handle'
        collectHandle.Size = Vector3.new(0.1, 0.1, 0.1)
        collectHandle.Transparency = 1
        collectHandle.CanCollide = false
        collectHandle.CanQuery = false
        collectHandle.CanTouch = false
        collectHandle.Parent = collectTool

        collectTool.Activated:Connect(function()
                if not trowelActive then return end
                if trowelDeploying then return end

                local r = getRoot(speaker.Character)
                if not r then return end

                local found = 0
                pcall(function()
                        for _, part in pairs(workspace:GetDescendants()) do
                                if part:IsA('BasePart') and not part.Anchored and part.Parent then
                                        if not char:IsAncestorOf(part) then
                                                local dist = (part.Position - r.Position).Magnitude
                                                if dist <= trowelCollectRadius then
                                                        local already = false
                                                        for _, e in pairs(trowelParts) do
                                                                if e.part == part then already = true break end
                                                        end
                                                        if not already then
                                                                local isBody = false
                                                                local anc = part.Parent
                                                                while anc and anc ~= workspace do
                                                                        if anc:FindFirstChildWhichIsA('Humanoid') then
                                                                                isBody = true break
                                                                        end
                                                                        anc = anc.Parent
                                                                end
                                                                if not isBody then
                                                                        pcall(function()
                                                                                part.CanCollide = false
                                                                                part.Massless = true
                                                                                part:SetNetworkOwner(nil)
                                                                                workspace:ResetNetworkOwnerlessTimeout(0)
                                                                        end)
                                                                        trowelParts[#trowelParts + 1] = {
                                                                                part = part,
                                                                                state = 'fly_up',
                                                                                targetY = aboveBoxY,
                                                                                targetX = boxPos.X + math.random(-15, 15),
                                                                                targetZ = boxPos.Z + math.random(-15, 15),
                                                                                onDone = 'collect',
                                                                                dropTime = 0
                                                                        }
                                                                        found = found + 1
                                                                end
                                                        end
                                                end
                                        end
                                end
                        end
                end)
                notify('Trowel', 'Collecting ' .. found .. ' parts into the box!')
        end)

        -- ========== LAUNCH TOOL ==========
        local launchTool = Instance.new('Tool')
        launchTool.Name = 'Launch [' .. deployMode .. ']'
        launchTool.CanBeDropped = false
        launchTool.Parent = speaker.Backpack
        trowelLaunchTool = launchTool
        local launchHandle = Instance.new('Part')
        launchHandle.Name = 'Handle'
        launchHandle.Size = Vector3.new(0.1, 0.1, 0.1)
        launchHandle.Transparency = 1
        launchHandle.CanCollide = false
        launchHandle.CanQuery = false
        launchHandle.CanTouch = false
        launchHandle.Parent = launchTool

        -- Beam when equipped
        local beamConn = nil
        local beam = nil
        local statusGui = nil
        local statusLabel = nil

        launchTool.Equipped:Connect(function()
                beam = Instance.new('Part')
                beam.Name = randomString()
                beam.Anchored = true
                beam.CanCollide = false
                beam.CanQuery = false
                beam.CanTouch = false
                beam.CastShadow = false
                beam.Size = Vector3.new(0.3, 0.3, 1)
                beam.Material = Enum.Material.Neon
                beam.Color = Color3.fromRGB(255, 80, 0)
                beam.Transparency = 0.5
                beam.Parent = workspace

                beamConn = RunService.Heartbeat:Connect(function()
                        if not beam or not beam.Parent then return end
                        pcall(function()
                                local r = getRoot(speaker.Character)
                                if not r then return end
                                local mouse = speaker:GetMouse()
                                if not mouse.Hit then return end
                                local mp = mouse.Hit.Position
                                local mid = (r.Position + mp) / 2
                                beam.CFrame = CFrame.lookAt(mid, mp)
                                beam.Size = Vector3.new(0.3, 0.3, math.max(1, (r.Position - mp).Magnitude))
                        end)
                end)

                -- Status billboard
                statusGui = Instance.new('BillboardGui')
                statusGui.Name = randomString()
                statusGui.Size = UDim2.new(0, 200, 0, 40)
                statusGui.StudsOffset = Vector3.new(0, 5, 0)
                statusGui.AlwaysOnTop = true
                pcall(function()
                        local head = char:FindFirstChild('Head')
                        if head then statusGui.Adornee = head end
                end)
                statusGui.Parent = workspace

                statusLabel = Instance.new('TextLabel')
                statusLabel.Size = UDim2.new(1, 0, 1, 0)
                statusLabel.BackgroundTransparency = 0.5
                statusLabel.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
                statusLabel.TextColor3 = Color3.fromRGB(255, 80, 0)
                statusLabel.TextStrokeColor3 = Color3.fromRGB(100, 50, 0)
                statusLabel.TextStrokeTransparency = 0.7
                statusLabel.Font = Enum.Font.GothamBold
                statusLabel.TextScaled = true
                statusLabel.Parent = statusGui
        end)

        launchTool.Unequipped:Connect(function()
                if beamConn then beamConn:Disconnect() beamConn = nil end
                if beam and beam.Parent then beam:Destroy() end
                beam = nil
                if statusGui and statusGui.Parent then statusGui:Destroy() end
                statusGui = nil
                statusLabel = nil
        end)

        launchTool.Activated:Connect(function()
                if not trowelActive then return end
                if trowelDeploying then return end

                local mouse = speaker:GetMouse()
                local targetPos
                pcall(function() targetPos = mouse.Hit.Position end)
                if not targetPos then return end

                local inBoxCount = 0
                for _, e in pairs(trowelParts) do
                        if e.state == 'in_box' then inBoxCount = inBoxCount + 1 end
                end
                -- Gun mode: always allows clicking to lock the line on a player,
                -- even with zero parts in the box. Other modes need parts.
                if inBoxCount == 0 and deployMode ~= 'gun' then
                        notify('Trowel', 'No parts in box! Use Collect tool first.')
                        return
                end

                trowelDeploying = true
                if statusLabel then
                        pcall(function() statusLabel.Text = 'CLAIMING OWNERSHIP...' end)
                end

                -- Teleport to box to claim server ownership of all parts inside
                claimBoxOwnership()

                if statusLabel then
                        pcall(function() statusLabel.Text = 'LAUNCHING ' .. inBoxCount .. ' parts...' end)
                end

                if deployMode == 'normal' then
                        for _, entry in pairs(trowelParts) do
                                if entry.state == 'in_box' and entry.part and entry.part.Parent then
                                        pcall(function()
                                                entry.part.CanCollide = false
                                                entry.part.Massless = true
                                        end)
                                        entry.state = 'fly_up'
                                        entry.targetY = aboveBoxY
                                        entry.targetX = targetPos.X + math.random(-3, 3)
                                        entry.targetZ = targetPos.Z + math.random(-3, 3)
                                        entry.onDone = 'deploy'
                                        entry.dropTime = 0
                                end
                        end
                        task.wait(5)
                        for i = #trowelParts, 1, -1 do
                                if trowelParts[i].onDone == 'deploy' then
                                        table.remove(trowelParts, i)
                                end
                        end
                        trowelDeploying = false
                else
                        local launchParts = {}
                        for i = #trowelParts, 1, -1 do
                                local e = trowelParts[i]
                                if e.state == 'in_box' and e.part and e.part.Parent then
                                        launchParts[#launchParts + 1] = e.part
                                        table.remove(trowelParts, i)
                                end
                        end
                        local totalP = #launchParts

                        task.spawn(function()

                                if deployMode == 'explode' then
                                        flyPartsTo(launchParts, targetPos.X, targetPos.Z, 5, 5, function()
                                                task.wait(0.5)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        local ang = math.random() * math.pi * 2
                                                                        local up = math.random() * math.pi
                                                                        local pwr = math.random(300, 800)
                                                                        part.Velocity = Vector3.new(math.sin(up) * math.cos(ang), math.abs(math.cos(up)) * 0.8 + 0.3, math.sin(up) * math.sin(ang)) * pwr
                                                                        part.RotVelocity = Vector3.new(math.random(-200, 200), math.random(-200, 200), math.random(-200, 200))
                                                                end)
                                                        end
                                                end
                                        end)

                                elseif deployMode == 'rain' then
                                        for i = 1, totalP do
                                                local part = launchParts[i]
                                                if part and part.Parent then
                                                        pcall(function()
                                                                part.CanCollide = false
                                                                part.Massless = true
                                                                part.Velocity = Vector3.new(0, 600, 0)
                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                        end)
                                                end
                                                task.wait(0.02)
                                        end
                                        task.wait(2.5)
                                        for i = 1, totalP do
                                                local part = launchParts[i]
                                                if part and part.Parent then
                                                        pcall(function()
                                                                local ox = math.random(-20, 20)
                                                                local oz = math.random(-20, 20)
                                                                local diff = Vector3.new(targetPos.X + ox - part.Position.X, 20, targetPos.Z + oz - part.Position.Z)
                                                                part.Velocity = diff
                                                        end)
                                                end
                                        end
                                        task.wait(2)
                                        for i = 1, totalP do
                                                local part = launchParts[i]
                                                if part and part.Parent then
                                                        pcall(function()
                                                                part.CustomPhysicalProperties = PhysicalProperties.new(0.2, 0.3, 0.5, 1, 1)
                                                                part.CanCollide = true
                                                                part.Massless = false
                                                                part.Velocity = Vector3.new(math.random(-10, 10), -30, math.random(-10, 10))
                                                                part.RotVelocity = Vector3.new(math.random(-50, 50), math.random(-50, 50), math.random(-50, 50))
                                                        end)
                                                end
                                        end

                                elseif deployMode == 'spiral' then
                                        for i = 1, totalP do
                                                local part = launchParts[i]
                                                if part and part.Parent then
                                                        local si = (i / totalP)
                                                        task.spawn(function()
                                                                pcall(function()
                                                                        local startPos = part.Position
                                                                        local tt = 2.5
                                                                        local st = tick()
                                                                        while tick() - st < tt do
                                                                                if not part or not part.Parent then break end
                                                                                local t = (tick() - st) / tt
                                                                                local goal = startPos:Lerp(targetPos, t)
                                                                                local rad = (1 - t) * 30 + 3
                                                                                local ang = t * math.pi * 8 + si * math.pi * 2
                                                                                goal = goal + Vector3.new(math.cos(ang) * rad, math.sin(t * math.pi) * 40, math.sin(ang) * rad)
                                                                                local md = goal - part.Position
                                                                                if md.Magnitude > 0.5 then
                                                                                        part.Velocity = md.Unit * math.min(md.Magnitude * 8, 350)
                                                                                else
                                                                                        part.Velocity = Vector3.new(0, 0, 0)
                                                                                end
                                                                                part.RotVelocity = Vector3.new(0, t * 300, 0)
                                                                                RunService.Heartbeat:Wait()
                                                                        end
                                                                        if part and part.Parent then
                                                                                part.Velocity = Vector3.new(0, 0, 0)
                                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                                                part.CanCollide = true
                                                                                part.Massless = false
                                                                                part.CustomPhysicalProperties = nil
                                                                        end
                                                                end)
                                                        end)
                                                end
                                                task.wait(0.03)
                                        end

                                elseif deployMode == 'shotgun' then
                                        for i = 1, totalP do
                                                local part = launchParts[i]
                                                if part and part.Parent then
                                                        pcall(function()
                                                                local spread = Vector3.new(math.random(-30, 30), math.random(-10, 30), math.random(-30, 30))
                                                                local d = (targetPos + spread - part.Position).Unit
                                                                part.Velocity = d * 1200
                                                                part.RotVelocity = Vector3.new(math.random(-300, 300), math.random(-300, 300), math.random(-300, 300))
                                                                part.CanCollide = true
                                                                part.Massless = false
                                                                part.CustomPhysicalProperties = nil
                                                        end)
                                                end
                                        end

                                elseif deployMode == 'orbit' then
                                        flyPartsTo(launchParts, targetPos.X, targetPos.Z, 3, 3, function()
                                                task.wait(0.5)
                                                local orbitAngle = 0
                                                local orbParts = {}
                                                for _, p in pairs(launchParts) do
                                                        if p and p.Parent then orbParts[#orbParts + 1] = p end
                                                end
                                                task.spawn(function()
                                                        while trowelActive do
                                                                orbitAngle = orbitAngle + 0.02
                                                                local jj = 1
                                                                while jj <= #orbParts do
                                                                        local op = orbParts[jj]
                                                                        if not op or not op.Parent then
                                                                                table.remove(orbParts, jj)
                                                                        else
                                                                                pcall(function()
                                                                                        local rad = 8 + (jj % 5) * 4
                                                                                        local ht = 5 + (jj % 3) * 6
                                                                                        local ang = orbitAngle + (jj / #orbParts) * math.pi * 2
                                                                                        local goal = targetPos + Vector3.new(math.cos(ang) * rad, ht, math.sin(ang) * rad)
                                                                                        local d = goal - op.Position
                                                                                        if d.Magnitude > 1 then
                                                                                                op.Velocity = d.Unit * math.min(d.Magnitude * 10, 300)
                                                                                        end
                                                                                        op.RotVelocity = Vector3.new(0, 200, 0)
                                                                                end)
                                                                        end
                                                                        jj = jj + 1
                                                                        RunService.Heartbeat:Wait()
                                                                end
                                                        end
                                                        end)
                                                end)
                                                notify('Trowel', 'Orbit mode! Parts orbiting your click point.')
                                                trowelDeploying = false
                                                return

                                elseif deployMode == 'scatter' then
                                        flyPartsTo(launchParts, targetPos.X, targetPos.Z, 3, 3, function()
                                                task.wait(0.5)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                task.spawn(function()
                                                                        pcall(function()
                                                                                while trowelActive do
                                                                                        if not part or not part.Parent then break end
                                                                                        part.Velocity = Vector3.new(math.random(-80, 80), math.random(50, 150), math.random(-80, 80))
                                                                                        part.RotVelocity = Vector3.new(math.random(-100, 100), math.random(-100, 100), math.random(-100, 100))
                                                                                        RunService.Heartbeat:Wait()
                                                                                        RunService.Heartbeat:Wait()
                                                                                end
                                                                        end)
                                                                end)
                                                        end
                                                end
                                                end)
                                                return

                                elseif deployMode == 'wave' then
                                        flyPartsTo(launchParts, targetPos.X, targetPos.Z, 3, 3, function()
                                                task.wait(0.5)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                task.spawn(function()
                                                                        pcall(function()
                                                                                local st = tick()
                                                                                while tick() - st < 1.5 do
                                                                                        if not part or not part.Parent then break end
                                                                                        local d = targetPos - part.Position
                                                                                        if d.Magnitude > 3 then
                                                                                                part.Velocity = d.Unit * 500
                                                                                        else
                                                                                                part.Velocity = Vector3.new(0, 0, 0)
                                                                                        end
                                                                                        RunService.Heartbeat:Wait()
                                                                                end
                                                                                local wAng = math.random() * math.pi * 2
                                                                                local wDir = Vector3.new(math.cos(wAng), 0.3, math.sin(wAng))
                                                                                local st2 = tick()
                                                                                while tick() - st2 < 4 do
                                                                                        if not part or not part.Parent then break end
                                                                                        local wY = math.sin((tick() - st2) * 6) * 40 + 20
                                                                                        part.Velocity = wDir * 150 + Vector3.new(0, wY, 0)
                                                                                        part.RotVelocity = Vector3.new(0, 100, 0)
                                                                                        RunService.Heartbeat:Wait()
                                                                                end
                                                                                part.CustomPhysicalProperties = nil
                                                                                part.Massless = false
                                                                        end)
                                                                end)
                                                        end
                                                end
                                                end)
                                                return

                                elseif deployMode == 'gun' then
                                        -- GUN MODE: find nearest player to mouse click, stick beam to them,
                                        -- fly all parts 100 studs above them, then crash down on target.
                                        -- Works even with ZERO parts — just locks the tracking line on the player.
                                        local gunTarget = nil
                                        local gunRoot = nil

                                        -- Find nearest player to where we clicked
                                        pcall(function()
                                                local mouse = speaker:GetMouse()
                                                local clickPos = mouse.Hit.Position
                                                local closestDist = 50
                                                for _, plr in pairs(Players:GetPlayers()) do
                                                        if plr ~= speaker and plr.Character then
                                                                local pRoot = plr.Character:FindFirstChild('HumanoidRootPart')
                                                                if pRoot then
                                                                        local dist = (pRoot.Position - clickPos).Magnitude
                                                                        if dist < closestDist then
                                                                                closestDist = dist
                                                                                gunTarget = plr
                                                                                gunRoot = pRoot
                                                                        end
                                                                end
                                                        end
                                                end
                                        end)

                                        if not gunTarget or not gunRoot then
                                                notify('Trowel', 'No player near click! Aim closer.')
                                                trowelDeploying = false
                                                return
                                        end

                                        if statusLabel then
                                                pcall(function() statusLabel.Text = 'GUN TARGET: ' .. gunTarget.Name end)
                                        end

                                        -- Red tracking beam from target up to 100 studs
                                        local gunBeam = Instance.new('Part')
                                        gunBeam.Name = randomString()
                                        gunBeam.Anchored = true
                                        gunBeam.CanCollide = false
                                        gunBeam.CanQuery = false
                                        gunBeam.CanTouch = false
                                        gunBeam.CastShadow = false
                                        gunBeam.Size = Vector3.new(0.5, 0.5, 1)
                                        gunBeam.Material = Enum.Material.Neon
                                        gunBeam.Color = Color3.fromRGB(255, 0, 0)
                                        gunBeam.Transparency = 0.3
                                        gunBeam.Parent = workspace

                                        -- Red ring on ground under target
                                        local gunRing = Instance.new('Part')
                                        gunRing.Name = randomString()
                                        gunRing.Anchored = true
                                        gunRing.CanCollide = false
                                        gunRing.CanQuery = false
                                        gunRing.CanTouch = false
                                        gunRing.CastShadow = false
                                        gunRing.Shape = Enum.PartType.Cylinder
                                        gunRing.Size = Vector3.new(1, 12, 12)
                                        gunRing.Material = Enum.Material.Neon
                                        gunRing.Color = Color3.fromRGB(255, 0, 0)
                                        gunRing.Transparency = 0.4
                                        gunRing.Parent = workspace

                                        local gunBeamConn = RunService.Heartbeat:Connect(function()
                                                pcall(function()
                                                        if not gunTarget or not gunTarget.Character then
                                                                if gunBeamConn then gunBeamConn:Disconnect() end
                                                                return
                                                        end
                                                        local tR = gunTarget.Character:FindFirstChild('HumanoidRootPart')
                                                        if not tR then return end
                                                        local topPos = tR.Position + Vector3.new(0, 100, 0)
                                                        local mid = (tR.Position + topPos) / 2
                                                        gunBeam.CFrame = CFrame.lookAt(mid, topPos)
                                                        gunBeam.Size = Vector3.new(0.5, 0.5, math.max(1, 100))
                                                        gunRing.CFrame = CFrame.new(tR.Position) * CFrame.Angles(0, 0, math.rad(90))
                                                end)
                                        end)

                                        -- If no parts in box, just lock the line and tell user to collect
                                        if totalP == 0 then
                                                notify('Trowel', 'Locked on ' .. gunTarget.Name .. '! Collect parts then launch again.')
                                                trowelDeploying = false
                                                -- Keep beam/ring alive — they track the target.
                                                -- They get cleaned up on untrowel or when target leaves.
                                                return
                                        end

                                        -- Phase 1: fly all parts UP to 100 studs above target
                                        for i = 1, totalP do
                                                local part = launchParts[i]
                                                if part and part.Parent then
                                                        pcall(function()
                                                                part.CanCollide = false
                                                                part.Massless = true
                                                                part.Velocity = Vector3.new(0, 800, 0)
                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                        end)
                                                end
                                                task.wait(0.015)
                                        end
                                        task.wait(2)

                                        -- Phase 2: fly parts directly above target
                                        for i = 1, totalP do
                                                local part = launchParts[i]
                                                if part and part.Parent then
                                                        pcall(function()
                                                                local tR = gunTarget.Character and gunTarget.Character:FindFirstChild('HumanoidRootPart')
                                                                if tR then
                                                                        local ox = math.random(-8, 8)
                                                                        local oz = math.random(-8, 8)
                                                                        local goalX = tR.Position.X + ox
                                                                        local goalZ = tR.Position.Z + oz
                                                                        local diff = Vector3.new(goalX - part.Position.X, 30, goalZ - part.Position.Z)
                                                                        part.Velocity = diff
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end
                                                        end)
                                                end
                                        end
                                        task.wait(2)

                                        -- Phase 3: CRASH DOWN on the target
                                        if statusLabel then
                                                pcall(function() statusLabel.Text = 'CRASHING ON ' .. gunTarget.Name .. '!' end)
                                        end
                                        for i = 1, totalP do
                                                local part = launchParts[i]
                                                if part and part.Parent then
                                                        pcall(function()
                                                                part.CanCollide = true
                                                                part.CanTouch = true
                                                                part.CustomPhysicalProperties = PhysicalProperties.new(0.1, 0.2, 0.5, 5, 5)
                                                                part.Massless = false
                                                                part.Velocity = Vector3.new(math.random(-20, 20), -500, math.random(-20, 20))
                                                                part.RotVelocity = Vector3.new(math.random(-300, 300), math.random(-300, 300), math.random(-300, 300))
                                                        end)
                                                end
                                                task.wait(0.01)
                                        end

                                        -- Clean up gun visuals after 5 seconds
                                        task.delay(5, function()
                                                if gunBeamConn then gunBeamConn:Disconnect() gunBeamConn = nil end
                                                if gunBeam and gunBeam.Parent then gunBeam:Destroy() end
                                                if gunRing and gunRing.Parent then gunRing:Destroy() end
                                        end)

                                        trowelDeploying = false
                                        notify('Trowel', 'Gun mode! Crashed ' .. totalP .. ' parts on ' .. gunTarget.Name)
                                        return

                                -- ======================== ONE ========================
                                -- Brings 1 block to mouse at a time, serversided via velocity.
                                -- Stops applying velocity when it arrives. Click again for next one.
                                elseif deployMode == 'one' then
                                        local onePart = nil
                                        for i = #launchParts, 1, -1 do
                                                local p = launchParts[i]
                                                if p and p.Parent then onePart = p break end
                                        end
                                        if not onePart then
                                                notify('Trowel', 'No parts to place!')
                                                trowelDeploying = false
                                                return
                                        end
                                        pcall(function()
                                                onePart.CanCollide = false
                                                onePart.Massless = true
                                                onePart:SetNetworkOwner(nil)
                                                workspace:ResetNetworkOwnerlessTimeout(0)
                                        end)
                                        -- Move the part toward mouse using velocity springs
                                        local settled = false
                                        local oneConn = RunService.Heartbeat:Connect(function()
                                                if not onePart or not onePart.Parent or not trowelActive then
                                                        if oneConn then oneConn:Disconnect() end
                                                        trowelDeploying = false
                                                        return
                                                end
                                                local mouse = speaker:GetMouse()
                                                local goal
                                                pcall(function() goal = mouse.Hit.Position end)
                                                if not goal then return end
                                                local diff = goal - onePart.Position
                                                local dist = diff.Magnitude
                                                if dist > 1 then
                                                        local speed = math.min(500, dist * 10)
                                                        onePart.Velocity = diff.Unit * speed
                                                        onePart.RotVelocity = Vector3.new(0, 0, 0)
                                                        settled = false
                                                else
                                                        -- Arrived, stop velocity
                                                        onePart.Velocity = Vector3.new(0, 0, 0)
                                                        onePart.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                        onePart.RotVelocity = Vector3.new(0, 0, 0)
                                                        onePart.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                                        onePart.CanCollide = true
                                                        onePart.CanTouch = true
                                                        onePart.CustomPhysicalProperties = nil
                                                        onePart.Massless = false
                                                        if not settled then
                                                                settled = true
                                                                -- Disconnect after a short delay so the part stays put
                                                                task.delay(0.5, function()
                                                                        if oneConn then oneConn:Disconnect() end
                                                                        trowelDeploying = false
                                                                end)
                                                        end
                                                end
                                        end)
                                        return

                                -- ======================== DROP ========================
                                -- Drips parts one by one from the box straight down at mouse pos
                                elseif deployMode == 'drop' then
                                        task.spawn(function()
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        -- First fly up above the box
                                                                        part.Velocity = Vector3.new(0, 600, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                -- Now fly them above mouse and drop
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        local mouse = speaker:GetMouse()
                                                                        local goal
                                                                        pcall(function() goal = mouse.Hit.Position end)
                                                                        if goal then
                                                                                local diff = Vector3.new(goal.X + math.random(-2, 2) - part.Position.X, 30, goal.Z + math.random(-2, 2) - part.Position.Z)
                                                                                part.Velocity = diff
                                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        end
                                                                end)
                                                        end
                                                        task.wait(0.15) -- Stagger the drops
                                                end
                                                task.wait(2)
                                                -- Restore physics and let them fall
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.Velocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                                                        part.CanCollide = true
                                                                        part.CanTouch = true
                                                                        part.CustomPhysicalProperties = nil
                                                                        part.Massless = false
                                                                end)
                                                        end
                                                end
                                                trowelDeploying = false
                                                notify('Trowel', totalP .. ' parts dripped!')
                                        end)
                                        return

                                -- ======================== TOWER ========================
                                -- Stacks parts vertically into a tower at mouse position
                                elseif deployMode == 'tower' then
                                        task.spawn(function()
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.Velocity = Vector3.new(0, 600, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                local mouse = speaker:GetMouse()
                                                local basePos
                                                pcall(function() basePos = mouse.Hit.Position end)
                                                if basePos then
                                                        for i = 1, totalP do
                                                                local part = launchParts[i]
                                                                if part and part.Parent then
                                                                        pcall(function()
                                                                                local stackY = basePos.Y + i * 4 + 50
                                                                                local diff = Vector3.new(basePos.X - part.Position.X, stackY - part.Position.Y, basePos.Z - part.Position.Z)
                                                                                part.Velocity = diff
                                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        end)
                                                                end
                                                                task.wait(0.05)
                                                        end
                                                end
                                                task.wait(3)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.Velocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                                                        part.CanCollide = true
                                                                        part.CanTouch = true
                                                                        part.CustomPhysicalProperties = nil
                                                                        part.Massless = false
                                                                end)
                                                        end
                                                end
                                                trowelDeploying = false
                                                notify('Trowel', 'Tower of ' .. totalP .. ' parts built!')
                                        end)
                                        return

                                -- ======================== WALL ========================
                                -- Arranges parts into a vertical wall at mouse position
                                elseif deployMode == 'wall' then
                                        task.spawn(function()
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.Velocity = Vector3.new(0, 600, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                local mouse = speaker:GetMouse()
                                                local wallPos
                                                pcall(function() wallPos = mouse.Hit.Position end)
                                                if wallPos then
                                                        local cols = math.ceil(math.sqrt(totalP))
                                                        for i = 1, totalP do
                                                                local part = launchParts[i]
                                                                if part and part.Parent then
                                                                        pcall(function()
                                                                                local row = math.floor((i - 1) / cols)
                                                                                local col = (i - 1) % cols
                                                                                local gx = wallPos.X + (col - cols / 2) * 5
                                                                                local gz = wallPos.Z
                                                                                local gy = wallPos.Y + row * 5 + 30
                                                                                local diff = Vector3.new(gx - part.Position.X, gy - part.Position.Y, gz - part.Position.Z)
                                                                                part.Velocity = diff
                                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        end)
                                                                end
                                                        end
                                                end
                                                task.wait(3)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.Velocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                                                        part.CanCollide = true
                                                                        part.CanTouch = true
                                                                        part.CustomPhysicalProperties = nil
                                                                        part.Massless = false
                                                                end)
                                                        end
                                                end
                                                trowelDeploying = false
                                                notify('Trowel', 'Wall of ' .. totalP .. ' parts built!')
                                        end)
                                        return

                                -- ======================== FLOOR ========================
                                -- Spreads parts into a flat platform at mouse position
                                elseif deployMode == 'floor' then
                                        task.spawn(function()
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.Velocity = Vector3.new(0, 600, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                local mouse = speaker:GetMouse()
                                                local floorPos
                                                pcall(function() floorPos = mouse.Hit.Position end)
                                                if floorPos then
                                                        local side = math.ceil(math.sqrt(totalP))
                                                        for i = 1, totalP do
                                                                local part = launchParts[i]
                                                                if part and part.Parent then
                                                                        pcall(function()
                                                                                local row = math.floor((i - 1) / side)
                                                                                local col = (i - 1) % side
                                                                                local gx = floorPos.X + (col - side / 2) * 5
                                                                                local gz = floorPos.Z + (row - side / 2) * 5
                                                                                local gy = floorPos.Y + 30
                                                                                local diff = Vector3.new(gx - part.Position.X, gy - part.Position.Y, gz - part.Position.Z)
                                                                                part.Velocity = diff
                                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        end)
                                                                end
                                                        end
                                                end
                                                task.wait(3)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.Velocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                                                        part.CanCollide = true
                                                                        part.CanTouch = true
                                                                        part.CustomPhysicalProperties = nil
                                                                        part.Massless = false
                                                                end)
                                                        end
                                                end
                                                trowelDeploying = false
                                                notify('Trowel', 'Floor of ' .. totalP .. ' parts built!')
                                        end)
                                        return

                                -- ======================== BRIDGE ========================
                                -- Lays parts in a line from player to mouse position
                                elseif deployMode == 'bridge' then
                                        task.spawn(function()
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.Velocity = Vector3.new(0, 600, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                local mouse = speaker:GetMouse()
                                                local goalPos
                                                pcall(function() goalPos = mouse.Hit.Position end)
                                                local root = getRoot(speaker.Character)
                                                if goalPos and root then
                                                        local startPos = root.Position
                                                        local dir = (goalPos - startPos)
                                                        dir = Vector3.new(dir.X, 0, dir.Z) -- Flatten Y
                                                        local totalDist = dir.Magnitude
                                                        if totalDist > 1 then
                                                                dir = dir.Unit
                                                        else
                                                                dir = Vector3.new(1, 0, 0)
                                                                totalDist = 10
                                                        end
                                                        local spacing = math.max(3, totalDist / totalP)
                                                        for i = 1, totalP do
                                                                local part = launchParts[i]
                                                                if part and part.Parent then
                                                                        pcall(function()
                                                                                local t = (i - 1) / math.max(1, totalP - 1)
                                                                                local gx = startPos.X + dir.X * totalDist * t
                                                                                local gz = startPos.Z + dir.Z * totalDist * t
                                                                                local gy = startPos.Y + 30
                                                                                local diff = Vector3.new(gx - part.Position.X, gy - part.Position.Y, gz - part.Position.Z)
                                                                                part.Velocity = diff
                                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        end)
                                                                end
                                                        end
                                                end
                                                task.wait(3)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.Velocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                                                        part.CanCollide = true
                                                                        part.CanTouch = true
                                                                        part.CustomPhysicalProperties = nil
                                                                        part.Massless = false
                                                                end)
                                                        end
                                                end
                                                trowelDeploying = false
                                                notify('Trowel', 'Bridge of ' .. totalP .. ' parts built!')
                                        end)
                                        return

                                -- ======================== CAGE ========================
                                -- Forms a cage around the nearest player to mouse
                                elseif deployMode == 'cage' then
                                        task.spawn(function()
                                                -- Find nearest player to mouse
                                                local cageTarget = nil
                                                local cageRoot = nil
                                                pcall(function()
                                                        local mouse = speaker:GetMouse()
                                                        local clickPos = mouse.Hit.Position
                                                        local closestDist = 50
                                                        for _, plr in pairs(Players:GetPlayers()) do
                                                                if plr ~= speaker and plr.Character then
                                                                        local pRoot = plr.Character:FindFirstChild('HumanoidRootPart')
                                                                        if pRoot then
                                                                                local dist = (pRoot.Position - clickPos).Magnitude
                                                                                if dist < closestDist then
                                                                                        closestDist = dist
                                                                                        cageTarget = plr
                                                                                        cageRoot = pRoot
                                                                                end
                                                                        end
                                                                end
                                                        end
                                                end)
                                                if not cageTarget or not cageRoot then
                                                        -- Just build at mouse pos
                                                end
                                                local centerPos = cageRoot and cageRoot.Position or targetPos
                                                local radius = 15
                                                -- Fly all parts up
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.Velocity = Vector3.new(0, 600, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                -- Distribute parts around the target: walls + ceiling
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        local gx, gy, gz
                                                                        if i <= totalP * 0.7 then
                                                                                -- Wall segments
                                                                                local angle = (i / (totalP * 0.7)) * math.pi * 2
                                                                                gx = centerPos.X + math.cos(angle) * radius
                                                                                gz = centerPos.Z + math.sin(angle) * radius
                                                                                gy = centerPos.Y + 20 + math.random(0, 10)
                                                                        else
                                                                                -- Ceiling segments
                                                                                local ci = i - math.floor(totalP * 0.7)
                                                                                gx = centerPos.X + math.random(-radius, radius)
                                                                                gz = centerPos.Z + math.random(-radius, radius)
                                                                                gy = centerPos.Y + 25 + math.random(0, 5)
                                                                        end
                                                                        local diff = Vector3.new(gx - part.Position.X, gy - part.Position.Y, gz - part.Position.Z)
                                                                        part.Velocity = diff
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(3)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.Velocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                                                        part.CanCollide = true
                                                                        part.CanTouch = true
                                                                        part.CustomPhysicalProperties = nil
                                                                        part.Massless = false
                                                                end)
                                                        end
                                                end
                                                trowelDeploying = false
                                                local tName = cageTarget and cageTarget.Name or 'target'
                                                notify('Trowel', 'Caged ' .. tName .. ' with ' .. totalP .. ' parts!')
                                        end)
                                        return

                                -- ======================== STAIRCASE ========================
                                -- Creates ascending stairs from player toward mouse
                                elseif deployMode == 'staircase' then
                                        task.spawn(function()
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.Velocity = Vector3.new(0, 600, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                local mouse = speaker:GetMouse()
                                                local goalPos
                                                pcall(function() goalPos = mouse.Hit.Position end)
                                                local root = getRoot(speaker.Character)
                                                if goalPos and root then
                                                        local startPos = root.Position
                                                        local dir = (goalPos - startPos)
                                                        dir = Vector3.new(dir.X, 0, dir.Z)
                                                        local totalDist = dir.Magnitude
                                                        if totalDist > 1 then dir = dir.Unit end
                                                        for i = 1, totalP do
                                                                local part = launchParts[i]
                                                                if part and part.Parent then
                                                                        pcall(function()
                                                                                local t = i / totalP
                                                                                local gx = startPos.X + dir.X * totalDist * t
                                                                                local gz = startPos.Z + dir.Z * totalDist * t
                                                                                local gy = startPos.Y + i * 3 + 30
                                                                                local diff = Vector3.new(gx - part.Position.X, gy - part.Position.Y, gz - part.Position.Z)
                                                                                part.Velocity = diff
                                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        end)
                                                                end
                                                        end
                                                end
                                                task.wait(3)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.Velocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                                                        part.CanCollide = true
                                                                        part.CanTouch = true
                                                                        part.CustomPhysicalProperties = nil
                                                                        part.Massless = false
                                                                end)
                                                        end
                                                end
                                                trowelDeploying = false
                                                notify('Trowel', 'Staircase of ' .. totalP .. ' parts built!')
                                        end)
                                        return

                                -- ======================== MISSILE ========================
                                -- Fires parts one at a time rapidly toward mouse
                                elseif deployMode == 'missile' then
                                        task.spawn(function()
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.CustomPhysicalProperties = PhysicalProperties.new(0, 0, 0, 0, 0)
                                                                        local mouse = speaker:GetMouse()
                                                                        local goal
                                                                        pcall(function() goal = mouse.Hit.Position end)
                                                                        if goal then
                                                                                local root = getRoot(speaker.Character)
                                                                                if root then
                                                                                        local dir = (goal - root.Position).Unit
                                                                                        part.Velocity = dir * 800
                                                                                        part.RotVelocity = Vector3.new(math.random(-100, 100), math.random(-100, 100), math.random(-100, 100))
                                                                                end
                                                                        end
                                                                end)
                                                        end
                                                        task.wait(0.08) -- Rapid fire
                                                end
                                                task.wait(2)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = true
                                                                        part.CanTouch = true
                                                                        part.CustomPhysicalProperties = nil
                                                                        part.Massless = false
                                                                end)
                                                        end
                                                end
                                                trowelDeploying = false
                                                notify('Trowel', 'Fired ' .. totalP .. ' missiles!')
                                        end)
                                        return

                                -- ======================== SHIELD ========================
                                -- Parts orbit around the player as a protective ring
                                elseif deployMode == 'shield' then
                                        task.spawn(function()
                                                -- Fly parts up first
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.Velocity = Vector3.new(0, 600, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                -- Start orbiting around player
                                                local shieldActive = trowelActive
                                                local shieldConn = RunService.Heartbeat:Connect(function(dt)
                                                        if not shieldActive or not trowelActive then
                                                                if shieldConn then shieldConn:Disconnect() end
                                                                trowelDeploying = false
                                                                return
                                                        end
                                                        local root = getRoot(speaker.Character)
                                                        if not root then return end
                                                        local angle = tick() * 3 -- Rotation speed
                                                        for i = 1, totalP do
                                                                local part = launchParts[i]
                                                                if part and part.Parent then
                                                                        pcall(function()
                                                                                local a = angle + (i / totalP) * math.pi * 2
                                                                                local radius = 10
                                                                                local gx = root.Position.X + math.cos(a) * radius
                                                                                local gz = root.Position.Z + math.sin(a) * radius
                                                                                local gy = root.Position.Y + 3
                                                                                local diff = Vector3.new(gx - part.Position.X, gy - part.Position.Y, gz - part.Position.Z)
                                                                                local speed = math.min(300, diff.Magnitude * 8)
                                                                                part.Velocity = diff.Unit * speed
                                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        end)
                                                                end
                                                        end
                                                end)
                                                -- Stop after 15 seconds or when untrowel
                                                task.delay(15, function()
                                                        shieldActive = false
                                                        if shieldConn then shieldConn:Disconnect() end
                                                        for i = 1, totalP do
                                                                local part = launchParts[i]
                                                                if part and part.Parent then
                                                                        pcall(function()
                                                                                part.Velocity = Vector3.new(0, 0, 0)
                                                                                part.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                                                part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                                                                part.CanCollide = true
                                                                                part.CanTouch = true
                                                                                part.CustomPhysicalProperties = nil
                                                                                part.Massless = false
                                                                        end)
                                                                end
                                                        end
                                                        trowelDeploying = false
                                                        notify('Trowel', 'Shield deactivated!')
                                                end)
                                        end)
                                        return

                                -- ======================== HAIL ========================
                                -- Parts launch high above mouse then rain down in a tight cluster
                                elseif deployMode == 'hail' then
                                        task.spawn(function()
                                                -- Launch all parts straight up high
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.Velocity = Vector3.new(0, 1000, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                        task.wait(0.02)
                                                end
                                                task.wait(3)
                                                -- Move them above mouse position
                                                local mouse = speaker:GetMouse()
                                                local hailPos
                                                pcall(function() hailPos = mouse.Hit.Position end)
                                                if hailPos then
                                                        for i = 1, totalP do
                                                                local part = launchParts[i]
                                                                if part and part.Parent then
                                                                        pcall(function()
                                                                                local gx = hailPos.X + math.random(-5, 5)
                                                                                local gz = hailPos.Z + math.random(-5, 5)
                                                                                local diff = Vector3.new(gx - part.Position.X, 30, gz - part.Position.Z)
                                                                                part.Velocity = diff
                                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        end)
                                                                end
                                                        end
                                                end
                                                task.wait(2)
                                                -- Drop like hail with slight random horizontal
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = true
                                                                        part.CanTouch = true
                                                                        part.CustomPhysicalProperties = PhysicalProperties.new(0.1, 0.2, 0.5, 5, 5)
                                                                        part.Massless = false
                                                                        part.Velocity = Vector3.new(math.random(-10, 10), -400, math.random(-10, 10))
                                                                        part.RotVelocity = Vector3.new(math.random(-200, 200), math.random(-200, 200), math.random(-200, 200))
                                                                end)
                                                        end
                                                end
                                                trowelDeploying = false
                                                notify('Trowel', 'Hailstorm! ' .. totalP .. ' parts rained down!')
                                        end)
                                        return

                                -- ======================== VOLCANO ========================
                                -- Parts erupt upward from mouse then fall back randomly
                                elseif deployMode == 'volcano' then
                                        task.spawn(function()
                                                -- First bring all parts to mouse position
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.Velocity = Vector3.new(0, 600, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                local mouse = speaker:GetMouse()
                                                local volcPos
                                                pcall(function() volcPos = mouse.Hit.Position end)
                                                if volcPos then
                                                        for i = 1, totalP do
                                                                local part = launchParts[i]
                                                                if part and part.Parent then
                                                                        pcall(function()
                                                                                local diff = Vector3.new(volcPos.X + math.random(-3, 3) - part.Position.X, 20, volcPos.Z + math.random(-3, 3) - part.Position.Z)
                                                                                part.Velocity = diff
                                                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        end)
                                                                end
                                                        end
                                                end
                                                task.wait(2)
                                                -- ERUPT: shoot upward with random spread
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        local ang = math.random() * math.pi * 2
                                                                        local up = math.random(0.5, 1)
                                                                        local pwr = math.random(500, 1000)
                                                                        part.Velocity = Vector3.new(math.sin(up) * math.cos(ang) * 150, up * pwr, math.sin(up) * math.sin(ang) * 150)
                                                                        part.RotVelocity = Vector3.new(math.random(-300, 300), math.random(-300, 300), math.random(-300, 300))
                                                                end)
                                                        end
                                                        task.wait(0.03)
                                                end
                                                task.wait(1)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = true
                                                                        part.CanTouch = true
                                                                        part.CustomPhysicalProperties = nil
                                                                        part.Massless = false
                                                                end)
                                                        end
                                                end
                                                trowelDeploying = false
                                                notify('Trowel', 'Volcano erupted ' .. totalP .. ' parts!')
                                        end)
                                        return

                                -- ======================== MAGNET DEPLOY ========================
                                -- Parts orbit the target position in a tight spiral, gradually pulling inward
                                elseif deployMode == 'magnet' then
                                        task.spawn(function()
                                                -- Fly all parts up first
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.Velocity = Vector3.new(0, 600, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                -- Pull them to target with spiral motion
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                local si = (i / totalP)
                                                                task.spawn(function()
                                                                        pcall(function()
                                                                                local startPos = part.Position
                                                                                local tt = 3
                                                                                local st = tick()
                                                                                while tick() - st < tt do
                                                                                        if not part or not part.Parent then break end
                                                                                        local t = (tick() - st) / tt
                                                                                        local goal = startPos:Lerp(targetPos, t)
                                                                                        local rad = (1 - t) * 20 + 1
                                                                                        local ang = t * math.pi * 6 + si * math.pi * 2
                                                                                        goal = goal + Vector3.new(math.cos(ang) * rad, 0, math.sin(ang) * rad)
                                                                                        local md = goal - part.Position
                                                                                        if md.Magnitude > 0.5 then
                                                                                                part.Velocity = md.Unit * math.min(md.Magnitude * 10, 400)
                                                                                        else
                                                                                                part.Velocity = Vector3.new(0, 0, 0)
                                                                                        end
                                                                                        part.RotVelocity = Vector3.new(0, t * 400, 0)
                                                                                        RunService.Heartbeat:Wait()
                                                                                end
                                                                                if part and part.Parent then
                                                                                        part.Velocity = Vector3.new(0, 0, 0)
                                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                                        part.CanCollide = true
                                                                                        part.CanTouch = true
                                                                                        part.CustomPhysicalProperties = nil
                                                                                        part.Massless = false
                                                                                end
                                                                        end)
                                                                end)
                                                        end
                                                end
                                                task.wait(4)
                                                trowelDeploying = false
                                                notify('Trowel', 'Magnet deployed ' .. totalP .. ' parts!')
                                        end)
                                        return

                                -- ======================== FLING DEPLOY ========================
                                -- Parts fly to target then EXPLODE outward in all directions
                                elseif deployMode == 'fling' then
                                        task.spawn(function()
                                                -- Fly all parts up first
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.Velocity = Vector3.new(0, 600, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                -- Converge on target
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        local diff = Vector3.new(targetPos.X + math.random(-2, 2) - part.Position.X, 20, targetPos.Z + math.random(-2, 2) - part.Position.Z)
                                                                        part.Velocity = diff
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                -- EXPLODE outward
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        local ang = math.random() * math.pi * 2
                                                                        local elev = math.random() * math.pi * 0.5 + math.pi * 0.15
                                                                        local pwr = math.random(600, 1200)
                                                                        part.Velocity = Vector3.new(
                                                                                math.cos(elev) * math.cos(ang) * pwr,
                                                                                math.sin(elev) * pwr,
                                                                                math.cos(elev) * math.sin(ang) * pwr
                                                                        )
                                                                        part.RotVelocity = Vector3.new(math.random(-500, 500), math.random(-500, 500), math.random(-500, 500))
                                                                end)
                                                        end
                                                        task.wait(0.02)
                                                end
                                                task.wait(1)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = true
                                                                        part.CanTouch = true
                                                                        part.CustomPhysicalProperties = nil
                                                                        part.Massless = false
                                                                end)
                                                        end
                                                end
                                                trowelDeploying = false
                                                notify('Trowel', 'Fling launched ' .. totalP .. ' parts!')
                                        end)
                                        return

                                -- ======================== PILE DEPLOY ========================
                                -- Parts stack neatly on top of each other at the target position
                                elseif deployMode == 'pile' then
                                        task.spawn(function()
                                                -- Fly all parts up first
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.CanCollide = false
                                                                        part.Massless = true
                                                                        part.Velocity = Vector3.new(0, 600, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                        end
                                                end
                                                task.wait(2)
                                                -- Stack parts at target, one by one with slight offset
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        local stackY = targetPos.Y + (i * 2)
                                                                        local ox = math.random(-1, 1)
                                                                        local oz = math.random(-1, 1)
                                                                        local diff = Vector3.new(targetPos.X + ox - part.Position.X, stackY - part.Position.Y + 20, targetPos.Z + oz - part.Position.Z)
                                                                        part.Velocity = diff
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                end)
                                                                task.wait(0.05)
                                                        end
                                                end
                                                task.wait(3)
                                                for i = 1, totalP do
                                                        local part = launchParts[i]
                                                        if part and part.Parent then
                                                                pcall(function()
                                                                        part.Velocity = Vector3.new(0, 0, 0)
                                                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                                                        part.CanCollide = true
                                                                        part.CanTouch = true
                                                                        part.CustomPhysicalProperties = nil
                                                                        part.Massless = false
                                                                end)
                                                        end
                                                end
                                                trowelDeploying = false
                                                notify('Trowel', 'Piled ' .. totalP .. ' parts at target!')
                                        end)
                                        return

                                end
                        end)
                end
        end)

        showArcPopup('Trowel', true)
        notify('Trowel', 'Trowel ready! Mode: ' .. deployMode .. '. Use Collect tool to gather parts, Launch tool to deploy.')
end)

-- ======================== UNTROWEL ========================
addcmd('untrowel', {'notrowel', 'troweloff'}, function(args, speaker)
        trowelActive = false
        trowelDeploying = false
        disablePhysicsGodmode(speaker)

        if trowelConn then trowelConn:Disconnect() trowelConn = nil end
        trowelParts = {}

        -- Destroy box
        if trowelBox and trowelBox.Parent then
                trowelBox:Destroy()
                trowelBox = nil
        end

        -- Destroy tools
        if trowelCollectTool and trowelCollectTool.Parent then
                trowelCollectTool:Destroy()
                trowelCollectTool = nil
        end
        if trowelLaunchTool and trowelLaunchTool.Parent then
                trowelLaunchTool:Destroy()
                trowelLaunchTool = nil
        end

        showArcPopup('Trowel', false)
        notify('Trowel', 'Trowel disabled. All tools and box removed.')
end)


-- ======================== MAGNET ========================
-- ALL unanchored parts fly toward you like a vacuum cleaner. They pile up on you.
-- Usage: magnet [speed]  |  unmagnet / nomagnet

magnetActive = false
magnetConn = nil
magnetParts = {}
magnetAddConn = nil
magnetRemConn = nil

addcmd('magnet', {'attract'}, function(args, speaker)
        if magnetActive then execCmd('unmagnet') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('Magnet', 'Character not found') return end
        enablePhysicsGodmode(speaker)

        local magnetSpeed = tonumber(args[1]) or 300
        magnetParts = {}

        -- Collect all unanchored parts (skip body parts)
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not char:IsAncestorOf(part) then
                                orbitua_prepPart(part)
                                table.insert(magnetParts, part)
                        end
                end
        end

        if #magnetParts < 1 then
                notify('Magnet', 'No unanchored parts found')
                return
        end

        magnetActive = true

        -- Watch for new parts
        magnetAddConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not magnetActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if speaker.Character and speaker.Character:IsAncestorOf(p) then return end
                        for _, existing in pairs(magnetParts) do
                                if existing == p then return end
                        end
                        orbitua_prepPart(p)
                        table.insert(magnetParts, p)
                end)
        end)

        -- Remove dead parts
        magnetRemConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(magnetParts) do
                        if existing == p then table.remove(magnetParts, i) break end
                end
        end)

        -- Main loop: every part flies toward player
        magnetConn = RunService.Heartbeat:Connect(function(dt)
                if not magnetActive then return end
                local r = getRoot(speaker.Character)
                if not r then return end

                sethiddenproperty(speaker, "SimulationRadius", math.huge)
                local target = r.Position + Vector3.new(0, 2, 0)

                for _, part in pairs(magnetParts) do
                        if part and part.Parent then
                                local dir = target - part.Position
                                if dir.Magnitude > 1 then
                                        part.Velocity = dir.Unit * magnetSpeed
                                else
                                        -- Close enough, slow down so they pile up nicely
                                        part.Velocity = dir * 5
                                end
                                -- Tiny spin for visual flair
                                part.RotVelocity = Vector3.new(
                                        math.random(-20, 20),
                                        math.random(-20, 20),
                                        math.random(-20, 20)
                                )
                        end
                end
        end)

        showArcPopup('Magnet', true)
        notify('Magnet', #magnetParts .. ' parts attracted toward you!')
end)

addcmd('unmagnet', {'nomagnet', 'magnetoff', 'unattract'}, function(args, speaker)
        magnetActive = false
        disablePhysicsGodmode(speaker)
        if magnetConn then magnetConn:Disconnect() magnetConn = nil end
        if magnetAddConn then magnetAddConn:Disconnect() magnetAddConn = nil end
        if magnetRemConn then magnetRemConn:Disconnect() magnetRemConn = nil end
        for _, part in pairs(magnetParts) do
                if part and part.Parent then
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.Velocity = Vector3.new(0, 0, 0)
                        part.RotVelocity = Vector3.new(0, 0, 0)
                        part.CanCollide = true
                end
        end
        magnetParts = {}
        showArcPopup('Magnet', false)
end)


-- ======================== TUMBLE ========================
-- ALL unanchored parts go absolutely mental -- spinning, flinging, flopping everywhere.
-- Pure chaos mode. Zero friction + random velocity + insane rotation.
-- Usage: tumble [speed]  |  untumble / notumble

tumbleActive = false
tumbleConn = nil
tumbleParts = {}
tumbleAddConn = nil
tumbleRemConn = nil

addcmd('tumble', {'chaos', 'ragdoll'}, function(args, speaker)
        if tumbleActive then execCmd('untumble') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('Tumble', 'Character not found') return end
        enablePhysicsGodmode(speaker)

        local tumbleSpeed = tonumber(args[1]) or 200
        tumbleParts = {}

        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not char:IsAncestorOf(part) then
                                orbitua_prepPart(part)
                                -- Give every part an instant random fling
                                pcall(function()
                                        part.Velocity = Vector3.new(
                                                math.random(-tumbleSpeed, tumbleSpeed),
                                                math.random(50, tumbleSpeed),
                                                math.random(-tumbleSpeed, tumbleSpeed)
                                        )
                                        part.RotVelocity = Vector3.new(
                                                math.random(-500, 500),
                                                math.random(-500, 500),
                                                math.random(-500, 500)
                                        )
                                end)
                                table.insert(tumbleParts, part)
                        end
                end
        end

        if #tumbleParts < 1 then
                notify('Tumble', 'No unanchored parts found')
                return
        end

        tumbleActive = true

        tumbleAddConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not tumbleActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if speaker.Character and speaker.Character:IsAncestorOf(p) then return end
                        for _, existing in pairs(tumbleParts) do
                                if existing == p then return end
                        end
                        orbitua_prepPart(p)
                        p.Velocity = Vector3.new(
                                math.random(-tumbleSpeed, tumbleSpeed),
                                math.random(50, tumbleSpeed),
                                math.random(-tumbleSpeed, tumbleSpeed)
                        )
                        table.insert(tumbleParts, p)
                end)
        end)

        tumbleRemConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(tumbleParts) do
                        if existing == p then table.remove(tumbleParts, i) break end
                end
        end)

        -- Main loop: keep parts spinning and bouncing randomly
        tumbleConn = RunService.Heartbeat:Connect(function(dt)
                if not tumbleActive then return end
                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                for _, part in pairs(tumbleParts) do
                        if part and part.Parent then
                                -- Keep feeding random velocity so they never settle
                                -- Occasionally change direction for extra chaos
                                if math.random() < 0.1 then
                                        part.Velocity = Vector3.new(
                                                math.random(-tumbleSpeed, tumbleSpeed),
                                                math.random(20, tumbleSpeed * 0.7),
                                                math.random(-tumbleSpeed, tumbleSpeed)
                                        )
                                end
                                -- Always keep them spinning
                                part.RotVelocity = Vector3.new(
                                        math.random(-800, 800),
                                        math.random(-800, 800),
                                        math.random(-800, 800)
                                )
                                -- If part somehow stopped moving (hit ground), kick it back up
                                if part.Velocity.Magnitude < 30 then
                                        part.Velocity = Vector3.new(
                                                math.random(-tumbleSpeed, tumbleSpeed),
                                                math.random(100, tumbleSpeed),
                                                math.random(-tumbleSpeed, tumbleSpeed)
                                        )
                                end
                        end
                end
        end)

        showArcPopup('TUMBLE', true)
        notify('Tumble', #tumbleParts .. ' parts entered CHAOS MODE!')
end)

addcmd('untumble', {'notumble', 'tumbleoff', 'unchaos'}, function(args, speaker)
        tumbleActive = false
        disablePhysicsGodmode(speaker)
        if tumbleConn then tumbleConn:Disconnect() tumbleConn = nil end
        if tumbleAddConn then tumbleAddConn:Disconnect() tumbleAddConn = nil end
        if tumbleRemConn then tumbleRemConn:Disconnect() tumbleRemConn = nil end
        for _, part in pairs(tumbleParts) do
                if part and part.Parent then
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.Velocity = Vector3.new(0, 0, 0)
                        part.RotVelocity = Vector3.new(0, 0, 0)
                        part.CanCollide = true
                end
        end
        tumbleParts = {}
        showArcPopup('TUMBLE', false)
end)


-- ======================== HELICOPTER ========================
-- ALL unanchored parts stay where they are but spin on their own axis like helicopter blades.
-- Everything around you becomes a spinning blender. Pure chaos visually.
-- Usage: helicopter [spin speed]  |  unhelicopter / nohelicopter

heliActive = false
heliConn = nil
heliParts = {}
heliAddConn = nil
heliRemConn = nil

addcmd('helicopter', {'heli', 'blender'}, function(args, speaker)
        if heliActive then execCmd('unhelicopter') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('Helicopter', 'Character not found') return end
        enablePhysicsGodmode(speaker)

        local heliSpeed = tonumber(args[1]) or 800
        heliParts = {}

        -- Record each part's current position so we can keep it in place
        local partPositions = {}
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not char:IsAncestorOf(part) then
                                orbitua_prepPart(part)
                                -- Override physics: high friction so part stays put, no bounce
                                pcall(function()
                                        part.CustomPhysicalProperties = PhysicalProperties.new(0.5, 0.8, 0, 0, 0)
                                end)
                                table.insert(heliParts, part)
                                partPositions[part] = part.Position
                        end
                end
        end

        if #heliParts < 1 then
                notify('Helicopter', 'No unanchored parts found')
                return
        end

        heliActive = true

        heliAddConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not heliActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if speaker.Character and speaker.Character:IsAncestorOf(p) then return end
                        for _, existing in pairs(heliParts) do
                                if existing == p then return end
                        end
                        orbitua_prepPart(p)
                        pcall(function()
                                p.CustomPhysicalProperties = PhysicalProperties.new(0.5, 0.8, 0, 0, 0)
                        end)
                        table.insert(heliParts, p)
                        partPositions[p] = p.Position
                end)
        end)

        heliRemConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(heliParts) do
                        if existing == p then table.remove(heliParts, i) break end
                end
                partPositions[p] = nil
        end)

        -- Main loop: keep each part at its original position but spin it on its axis
        heliConn = RunService.Heartbeat:Connect(function(dt)
                if not heliActive then return end
                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                for _, part in pairs(heliParts) do
                        if part and part.Parent then
                                local savedPos = partPositions[part]
                                if savedPos then
                                        -- Push back toward original position (stay in place)
                                        local dir = savedPos - part.Position
                                        if dir.Magnitude > 0.5 then
                                                part.Velocity = dir.Unit * dir.Magnitude * 10
                                        else
                                                part.Velocity = Vector3.new(0, 0, 0)
                                        end
                                end

                                -- Spin on own axis (mostly Y axis for helicopter look)
                                part.RotVelocity = Vector3.new(
                                        math.sin(tick() * 5 + part.Position.X) * heliSpeed * 0.3,
                                        heliSpeed,
                                        math.cos(tick() * 3 + part.Position.Z) * heliSpeed * 0.2
                                )
                        end
                end
        end)

        showArcPopup('HELICOPTER', true)
        notify('Helicopter', #heliParts .. ' parts spinning in place! Everything is a blender!')
end)

addcmd('unhelicopter', {'nohelicopter', 'helicopteroff', 'unheli', 'unblender'}, function(args, speaker)
        heliActive = false
        disablePhysicsGodmode(speaker)
        if heliConn then heliConn:Disconnect() heliConn = nil end
        if heliAddConn then heliAddConn:Disconnect() heliAddConn = nil end
        if heliRemConn then heliRemConn:Disconnect() heliRemConn = nil end
        for _, part in pairs(heliParts) do
                if part and part.Parent then
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.Velocity = Vector3.new(0, 0, 0)
                        part.RotVelocity = Vector3.new(0, 0, 0)
                        part.CanCollide = true
                end
        end
        heliParts = {}
        showArcPopup('HELICOPTER', false)
end)


-- ======================== JUMPER (ZOMBIE PARTS) ========================
-- ALL unanchored parts hop on the ground toward you (or nearest player) like zombies.
-- Walkspeed 18, hop every 0.5s. They come from random directions around the target.
-- Hilarious zombie apocalypse of random objects walking toward you.
-- Usage: jumper  |  unjumper / nojumper

jumperActive = false
jumperConn = nil
jumperParts = {}
jumperAddConn = nil
jumperRemConn = nil
jumperWalkSpeed = 18

addcmd('jumper', {'zombie', 'zombieparts', 'hop'}, function(args, speaker)
        if jumperActive then execCmd('unjumper') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('Jumper', 'Character not found') return end
        enablePhysicsGodmode(speaker)

        jumperParts = {}

        -- Give each part a random approach angle (so they come from different directions)
        local partAngles = {}
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not char:IsAncestorOf(part) then
                                orbitua_prepPart(part)
                                table.insert(jumperParts, part)
                                partAngles[part] = math.random() * math.pi * 2
                        end
                end
        end

        if #jumperParts < 1 then
                notify('Jumper', 'No unanchored parts found')
                return
        end

        jumperActive = true

        jumperAddConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not jumperActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if speaker.Character and speaker.Character:IsAncestorOf(p) then return end
                        for _, existing in pairs(jumperParts) do
                                if existing == p then return end
                        end
                        orbitua_prepPart(p)
                        table.insert(jumperParts, p)
                        partAngles[p] = math.random() * math.pi * 2
                end)
        end)

        jumperRemConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(jumperParts) do
                        if existing == p then table.remove(jumperParts, i) break end
                end
                partAngles[p] = nil
        end)

        -- Main loop: hop toward you (or nearest player) at walkspeed 18
        local jumpTimer = 0
        local jumpInterval = 0.5
        jumperConn = RunService.Heartbeat:Connect(function(dt)
                if not jumperActive then return end
                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                -- Find target: nearest other player, or yourself
                local targetPos = nil
                local targetDist = math.huge
                pcall(function()
                        for _, plr in pairs(game:GetService('Players'):GetPlayers()) do
                                if plr ~= speaker and plr.Character and plr.Character:FindFirstChildWhichIsA('Humanoid') then
                                        local plrRoot = getRoot(plr.Character)
                                        if plrRoot then
                                                local dist = (plrRoot.Position - getRoot(speaker.Character).Position).Magnitude
                                                if dist < targetDist then
                                                        targetDist = dist
                                                        targetPos = plrRoot.Position
                                                end
                                        end
                                end
                        end
                end)
                -- If no other players, target yourself
                if not targetPos then
                        local myRoot = getRoot(speaker.Character)
                        if myRoot then targetPos = myRoot.Position end
                end
                if not targetPos then return end

                jumpTimer = jumpTimer + dt

                for _, part in pairs(jumperParts) do
                        if part and part.Parent then
                                local pos = part.Position
                                local toTarget = targetPos - pos
                                local horizDist = Vector3.new(toTarget.X, 0, toTarget.Z).Magnitude

                                -- Get this part's approach angle (staggered so they come from different directions)
                                local approachAngle = partAngles[part] or math.random() * math.pi * 2

                                if horizDist > 2 then
                                        -- Calculate direction: blend between direct path and approach angle
                                        -- Far away: use approach angle more. Close: go direct
                                        local directAngle = math.atan2(toTarget.X, toTarget.Z)
                                        local moveAngle = directAngle

                                        if horizDist > 5 then
                                                -- Far from target: approach from a specific direction
                                                local idealAngle = approachAngle
                                                local angleDiff = directAngle - idealAngle
                                                -- Normalize to -pi, pi (safe, no while loop)
                                                angleDiff = math.fmod(angleDiff, 2 * math.pi)
                                                if angleDiff > math.pi then angleDiff = angleDiff - 2 * math.pi end
                                                if angleDiff < -math.pi then angleDiff = angleDiff + 2 * math.pi end
                                                -- Blend: at distance 30+, use approach angle; at distance 5, go direct
                                                local t = math.min(1, (horizDist - 5) / 25)
                                                moveAngle = directAngle - angleDiff * t
                                        end

                                        local moveDir = Vector3.new(math.sin(moveAngle), 0, math.cos(moveAngle))

                                        -- Apply walkspeed (only horizontal, keep gravity)
                                        part.Velocity = Vector3.new(
                                                moveDir.X * jumperWalkSpeed,
                                                part.Velocity.Y,
                                                moveDir.Z * jumperWalkSpeed
                                        )

                                        -- Jump every interval
                                        if jumpTimer >= jumpInterval then
                                                -- Ground check: only jump if roughly near ground level
                                                local jumpPower = 30
                                                if horizDist < 15 then
                                                        -- Close to target: bigger leap
                                                        jumpPower = 50
                                                end
                                                part.Velocity = Vector3.new(
                                                        moveDir.X * jumperWalkSpeed,
                                                        jumpPower,
                                                        moveDir.Z * jumperWalkSpeed
                                                )
                                        end
                                else
                                        -- Right on target, slow down
                                        part.Velocity = Vector3.new(0, part.Velocity.Y, 0)
                                end

                                -- Wobble rotation while hopping (zombie-like flopping)
                                part.RotVelocity = Vector3.new(
                                        math.sin(tick() * 3 + pos.X) * 80,
                                        math.sin(tick() * 2 + pos.Z) * 40,
                                        math.cos(tick() * 4 + pos.X) * 60
                                )
                        end
                end

                if jumpTimer >= jumpInterval then
                        jumpTimer = 0
                end
        end)

        showArcPopup('JUMPER', true)
        notify('Jumper', #jumperParts .. ' zombie parts heading toward you!')
end)

addcmd('unjumper', {'nojumper', 'jumperoff', 'unzombie', 'unhop'}, function(args, speaker)
        jumperActive = false
        disablePhysicsGodmode(speaker)
        if jumperConn then jumperConn:Disconnect() jumperConn = nil end
        if jumperAddConn then jumperAddConn:Disconnect() jumperAddConn = nil end
        if jumperRemConn then jumperRemConn:Disconnect() jumperRemConn = nil end
        for _, part in pairs(jumperParts) do
                if part and part.Parent then
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.Velocity = Vector3.new(0, 0, 0)
                        part.RotVelocity = Vector3.new(0, 0, 0)
                        part.CanCollide = true
                end
        end
        jumperParts = {}
        showArcPopup('JUMPER', false)
end)


-- ======================== SLIFT ========================
-- Flatten all unanchored parts flat like _, place them under a target player,
-- then slowly lift them up serversided. The target gets launched into the air
-- on a platform of parts.
-- Usage: slift [target]  |  unslift

sliftActive = false
sliftConn = nil
sliftParts = {}

addcmd('slift', {'serversidelift', 'platlift'}, function(args, speaker)
        if sliftActive then execCmd('unslift') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('SLift', 'Character not found') return end
        enablePhysicsGodmode(speaker)

        -- Find target player (default: self)
        local targetRoot = getRoot(char)
        if args[1] then
                local targetNames = {}
                pcall(function() targetNames = {getPlayersByName(args[1], speaker)} end)
                if #targetNames == 1 then
                        local targetPlr = Players:FindFirstChild(targetNames[1])
                        if targetPlr and targetPlr.Character then
                                targetRoot = getRoot(targetPlr.Character)
                        end
                end
        end
        if not targetRoot then notify('SLift', 'Target not found') return end

        sliftParts = {}
        sliftActive = true

        -- Collect all unanchored parts (skip character parts)
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        local isBody = false
                        local anc = part.Parent
                        while anc and anc ~= workspace do
                                if anc:FindFirstChildWhichIsA('Humanoid') then
                                        isBody = true break
                                end
                                anc = anc.Parent
                        end
                        if not isBody then
                                pcall(function()
                                        orbitua_prepPart(part)
                                        part:SetNetworkOwner(nil)
                                        workspace:ResetNetworkOwnerlessTimeout(0)
                                end)
                                table.insert(sliftParts, part)
                        end
                end
        end

        if #sliftParts < 1 then
                notify('SLift', 'No unanchored parts found')
                sliftActive = false
                return
        end

        notify('SLift', #sliftParts .. ' parts collected. Flattening and lifting...')

        -- Phase 1: Flatten all parts flat (rotate them horizontal)
        for _, part in pairs(sliftParts) do
                if part and part.Parent then
                        pcall(function()
                                part.CanCollide = false
                                part.Massless = true
                        end)
                end
        end

        -- Phase 2: Teleport all parts to under the target
        task.spawn(function()
                local targetPos = targetRoot.Position
                local grid = math.ceil(math.sqrt(#sliftParts))
                local spacing = 4
                local offsetStart = -(grid * spacing) / 2

                for i, part in pairs(sliftParts) do
                        if part and part.Parent then
                                pcall(function()
                                        local row = math.floor((i - 1) / grid)
                                        local col = ((i - 1) % grid)
                                        local px = targetPos.X + offsetStart + (col * spacing)
                                        local pz = targetPos.Z + offsetStart + (row * spacing)
                                        local py = targetPos.Y - 3
                                        part.CFrame = CFrame.new(px, py, pz) * CFrame.Angles(math.rad(90), 0, 0)
                                        part.Velocity = Vector3.new(0, 0, 0)
                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                end)
                                task.wait(0.02)
                        end
                end

                task.wait(1)

                -- Phase 3: Slowly lift all parts upward
                local liftSpeed = 30
                local liftTime = 8
                local st = tick()

                sliftConn = RunService.Heartbeat:Connect(function(dt)
                        if not sliftActive then return end
                        local elapsed = tick() - st
                        if elapsed > liftTime then
                                execCmd('unslift')
                                return
                        end
                        for _, part in pairs(sliftParts) do
                                if part and part.Parent then
                                        pcall(function()
                                                part.Velocity = Vector3.new(0, liftSpeed, 0)
                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                        end)
                                end
                        end
                        pcall(function() sethiddenproperty(speaker, "SimulationRadius", math.huge) end)
                end)

                showArcPopup('SLift', true)
        end)
end)

addcmd('unslift', {'noslift', 'sliftoff'}, function(args, speaker)
        sliftActive = false
        disablePhysicsGodmode(speaker)
        if sliftConn then sliftConn:Disconnect() sliftConn = nil end
        for _, part in pairs(sliftParts) do
                if part and part.Parent then
                        pcall(function()
                                part.CustomPhysicalProperties = nil
                                part.Velocity = Vector3.new(0, 0, 0)
                                part.RotVelocity = Vector3.new(0, 0, 0)
                                part.CanCollide = true
                                part.Massless = false
                        end)
                end
        end
        sliftParts = {}
        showArcPopup('SLift', false)
        notify('SLift', 'SLift disabled.')
end)


-- ======================== CAGE UA ========================
-- Build a 19x19x19 cage around a target player using ALL unanchored parts.
-- Parts form the walls, floor, and ceiling. Serversided via velocity.
-- Usage: cageua [player]  |  uncageua / nocageua

cageuaActive = false
cageuaConn = nil
cageuaParts = {}
cageuaTarget = nil

addcmd('cageua', {'partcage', 'uacage'}, function(args, speaker)
        if cageuaActive then execCmd('uncageua') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('CageUA', 'Character not found') return end
        enablePhysicsGodmode(speaker)

        -- Find target player (default: self)
        local targetPlr = speaker
        if args[1] and args[1]:lower() ~= 'me' then
                local targetNames = {}
                pcall(function() targetNames = {getPlayersByName(args[1], speaker)} end)
                if #targetNames >= 1 then
                        local found = Players:FindFirstChild(targetNames[1])
                        if found then targetPlr = found end
                end
        end

        local targetChar = targetPlr.Character
        if not targetChar or not getRoot(targetChar) then
                notify('CageUA', 'Target character not found')
                return
        end

        cageuaTarget = getRoot(targetChar)
        cageuaParts = {}
        cageuaActive = true

        -- Collect all unanchored parts (skip character parts)
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        local isBody = false
                        local anc = part.Parent
                        while anc and anc ~= workspace do
                                if anc:FindFirstChildWhichIsA('Humanoid') then
                                        isBody = true break
                                end
                                anc = anc.Parent
                        end
                        if not isBody then
                                pcall(function()
                                        orbitua_prepPart(part)
                                        part:SetNetworkOwner(nil)
                                        workspace:ResetNetworkOwnerlessTimeout(0)
                                end)
                                table.insert(cageuaParts, part)
                        end
                end
        end

        if #cageuaParts < 1 then
                notify('CageUA', 'No unanchored parts found')
                cageuaActive = false
                return
        end

        notify('CageUA', 'Building cage with ' .. #cageuaParts .. ' parts around ' .. targetPlr.Name .. '...')

        -- Build cage: 6 faces (floor, ceiling, 4 walls)
        local center = cageuaTarget.Position
        local cageSize = 19
        local halfSize = cageSize / 2

        -- Define face positions and normals
        local faces = {
                {name = 'floor',   pos = center - Vector3.new(0, halfSize, 0),     normal = Vector3.new(0, 1, 0),   up = Vector3.new(0, 0, 1)},
                {name = 'ceiling', pos = center + Vector3.new(0, halfSize, 0),     normal = Vector3.new(0, -1, 0),  up = Vector3.new(0, 0, 1)},
                {name = 'north',   pos = center + Vector3.new(0, 0, -halfSize),    normal = Vector3.new(0, 0, 1),   up = Vector3.new(0, 1, 0)},
                {name = 'south',   pos = center + Vector3.new(0, 0, halfSize),     normal = Vector3.new(0, 0, -1),  up = Vector3.new(0, 1, 0)},
                {name = 'east',    pos = center + Vector3.new(halfSize, 0, 0),     normal = Vector3.new(-1, 0, 0),  up = Vector3.new(0, 1, 0)},
                {name = 'west',    pos = center - Vector3.new(halfSize, 0, 0),     normal = Vector3.new(1, 0, 0),   up = Vector3.new(0, 1, 0)},
        }

        local partsPerFace = math.floor(#cageuaParts / 6)
        local idx = 1

        for _, face in pairs(faces) do
                local count = partsPerFace
                if idx + count > #cageuaParts + 1 then
                        count = #cageuaParts - idx + 1
                end
                if count <= 0 then break end

                local grid = math.ceil(math.sqrt(count))
                local spacing = cageSize / (grid + 1)

                for i = 1, count do
                        local part = cageuaParts[idx]
                        if part and part.Parent then
                                local row = math.floor((i - 1) / grid)
                                local col = ((i - 1) % grid)
                                local offset = Vector3.new(
                                        (col - grid/2) * spacing,
                                        0,
                                        (row - grid/2) * spacing
                                )
                                -- Rotate offset based on face orientation
                                local rightVec = face.normal:Cross(face.up)
                                local worldOffset = rightVec * offset.X + face.up * offset.Y + face.normal * offset.Z
                                local targetPos = face.pos + worldOffset + face.normal * 0.5

                                pcall(function()
                                        part.CanCollide = true
                                        part.Massless = false
                                        local diff = targetPos - part.Position
                                        part.Velocity = diff * 3
                                        part.RotVelocity = Vector3.new(0, 0, 0)
                                end)
                                idx = idx + 1
                        end
                end
        end

        -- Hold loop: keep parts in place
        task.wait(3)
        cageuaConn = RunService.Heartbeat:Connect(function(dt)
                if not cageuaActive then return end
                -- Rebuild face positions based on current target position (cage follows target)
                local tPos = cageuaTarget and cageuaTarget.Parent and cageuaTarget.Position or center
                if cageuaTarget and cageuaTarget.Parent then tPos = cageuaTarget.Position end

                local idx2 = 1
                for _, face in pairs(faces) do
                        local facePos = tPos + (face.pos - center)
                        local count = partsPerFace
                        if idx2 + count > #cageuaParts + 1 then
                                count = #cageuaParts - idx2 + 1
                        end
                        if count <= 0 then break end

                        local grid = math.ceil(math.sqrt(count))
                        local spacing = cageSize / (grid + 1)

                        for i = 1, count do
                                local part = cageuaParts[idx2]
                                if part and part.Parent then
                                        pcall(function()
                                                local row = math.floor((i - 1) / grid)
                                                local col = ((i - 1) % grid)
                                                local offset = Vector3.new(
                                                        (col - grid/2) * spacing,
                                                        0,
                                                        (row - grid/2) * spacing
                                                )
                                                local rightVec = face.normal:Cross(face.up)
                                                local worldOffset = rightVec * offset.X + face.up * offset.Y + face.normal * offset.Z
                                                local targetPos2 = facePos + worldOffset + face.normal * 0.5
                                                local diff = targetPos2 - part.Position
                                                part.Velocity = diff * 5
                                                part.RotVelocity = Vector3.new(0, 0, 0)
                                        end)
                                end
                                idx2 = idx2 + 1
                        end
                end
                pcall(function() sethiddenproperty(speaker, "SimulationRadius", math.huge) end)
        end)

        showArcPopup('CageUA', true)
        notify('CageUA', 'Cage built around ' .. targetPlr.Name .. '!')
end)

addcmd('uncageua', {'nocageua', 'cageuaoff', 'uncage'}, function(args, speaker)
        cageuaActive = false
        cageuaTarget = nil
        disablePhysicsGodmode(speaker)
        if cageuaConn then cageuaConn:Disconnect() cageuaConn = nil end
        for _, part in pairs(cageuaParts) do
                if part and part.Parent then
                        pcall(function()
                                part.CustomPhysicalProperties = nil
                                part.Velocity = Vector3.new(0, 0, 0)
                                part.RotVelocity = Vector3.new(0, 0, 0)
                                part.CanCollide = true
                                part.Massless = false
                        end)
                end
        end
        cageuaParts = {}
        showArcPopup('CageUA', false)
        notify('CageUA', 'CageUA disabled.')
end)

addcmd('togglecageua', {}, function(args, speaker)
        if cageuaActive then execCmd('uncageua') else execCmd('cageua') end
end)


-- ======================== OWN PARTS ========================
-- Claim server ownership of ALL unanchored parts instantly.
-- Uses teleport trick: TP to each part for 1 frame to claim ownership.
-- Usage: ownparts

addcmd('ownparts', {'claimparts2', 'ownall'}, function(args, speaker)
        local char = speaker.Character
        if not char or not getRoot(char) then notify('OwnParts', 'Character not found') return end

        local root = getRoot(char)
        local savedCF = root.CFrame
        local count = 0

        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        local isBody = false
                        local anc = part.Parent
                        while anc and anc ~= workspace do
                                if anc:FindFirstChildWhichIsA('Humanoid') then
                                        isBody = true break
                                end
                                anc = anc.Parent
                        end
                        if not isBody then
                                pcall(function()
                                        char:PivotTo(CFrame.new(part.Position))
                                        RunService.Heartbeat:Wait()
                                        part:SetNetworkOwner(nil)
                                        workspace:ResetNetworkOwnerlessTimeout(0)
                                end)
                                count = count + 1
                        end
                end
        end

        pcall(function() char:PivotTo(savedCF) end)
        notify('OwnParts', 'Claimed ownership of ' .. count .. ' parts!')
end)


-- ======================== CLAIM ALL ========================
-- Teleports to every unanchored part for 1 frame to claim server ownership.
-- When enabled, shows "Click P to claim". Press P = rapid teleport to all parts, then back.
-- Usage: claimall  |  unclaimall / noclaimall

claimallActive = false
claimallKeyConn = nil

addcmd('claimall', {'claimparts', 'claim'}, function(args, speaker)
        if claimallActive then execCmd('unclaimall') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('ClaimAll', 'Character not found') return end

        claimallActive = true
        showArcPopup('ClaimAll', true)
        notify('ClaimAll', 'Enabled! Click P to claim all parts')

        local UIS = game:GetService('UserInputService')
        claimallKeyConn = UIS.InputBegan:Connect(function(input, gameProcessed)
                if gameProcessed then return end
                if not claimallActive then return end
                if input.KeyCode == Enum.KeyCode.P then
                        local freshChar = speaker.Character
                        local root = getRoot(freshChar)
                        if not root then return end

                        -- Save starting position
                        local savedPos = root.CFrame

                        -- Collect all unanchored parts (skip body parts)
                        local parts = {}
                        pcall(function()
                                for _, part in pairs(workspace:GetDescendants()) do
                                        if part:IsA('BasePart') and not part.Anchored and part.Parent then
                                                if freshChar and not freshChar:IsAncestorOf(part) then
                                                        -- Skip body parts (have Humanoid ancestor)
                                                        local isBody = false
                                                        local anc = part.Parent
                                                        while anc and anc ~= workspace do
                                                                if anc:FindFirstChildWhichIsA('Humanoid') then
                                                                        isBody = true
                                                                        break
                                                                end
                                                                anc = anc.Parent
                                                        end
                                                        if not isBody then
                                                                parts[#parts + 1] = part
                                                        end
                                                end
                                        end
                                end
                        end)

                        if #parts == 0 then
                                notify('ClaimAll', 'No unanchored parts found')
                                return
                        end

                        notify('ClaimAll', 'Claiming ' .. #parts .. ' parts...')

                        -- Teleport to each part for 1 frame
                        for i, part in pairs(parts) do
                                if not part.Parent then end
                                pcall(function()
                                        root.CFrame = part.CFrame + Vector3.new(0, 3, 0)
                                        part:SetNetworkOwner(nil)
                                end)
                                -- Small delay between teleports (10ms = fast but safe)
                                RunService.Heartbeat:Wait()
                        end

                        -- Teleport back to start
                        pcall(function()
                                root.CFrame = savedPos
                        end)

                        notify('ClaimAll', 'Done! Claimed ' .. #parts .. ' parts')
                end
        end)
end)

addcmd('unclaimall', {'noclaimall', 'claimalloff'}, function(args, speaker)
        claimallActive = false
        if claimallKeyConn then claimallKeyConn:Disconnect() claimallKeyConn = nil end
        showArcPopup('ClaimAll', false)
        notify('ClaimAll', 'Disabled')
end)


-- ======================== MINIGUN ========================
-- Background scan every 5 seconds maintains a queue of up to 30 valid unanchored parts.
-- Click = fires them one by one, 0.2s apart, toward mouse. Zero lag on click.
-- Teleports onto part for 1 frame before firing to grab server ownership.
-- Usage: minigun [power]  |  unminigun / nominigun

miningActive = false
miningParts = {}
miningConn = nil
miningFiring = false
miningScanThread = nil
miningPower = 500

addcmd('minigun', {}, function(args, speaker)
        if miningActive then execCmd('unminigun') return end

        local char = speaker.Character
        if not char then notify('Minigun', 'Character not found') return end
        enablePhysicsGodmode(speaker)

        local mouse = speaker:GetMouse()

        -- Parse optional power argument
        local power = tonumber(args[1] or '') or 500
        miningPower = power

        -- Check if part has any Humanoid ancestor (skip body parts)
        local function isBodyPart(part)
                local ancestor = part.Parent
                while ancestor and ancestor ~= workspace do
                        if ancestor:FindFirstChildWhichIsA('Humanoid') then
                                return true
                        end
                        ancestor = ancestor.Parent
                end
                return false
        end

        miningParts = {}
        miningActive = true
        miningFiring = false

        -- Background scan: every 5 seconds, refresh the queue
        miningScanThread = task.spawn(function()
                while miningActive do
                        local freshParts = {}
                        pcall(function()
                                local freshChar = speaker.Character
                                if not freshChar then task.wait(5) end
                                for _, part in pairs(workspace:GetDescendants()) do
                                        if #freshParts >= 30 then break end
                                        if part:IsA('BasePart') and part.Anchored == false then
                                                if freshChar and not freshChar:IsAncestorOf(part) then
                                                        if not isBodyPart(part) then
                                                                freshParts[#freshParts + 1] = part
                                                        end
                                                end
                                        end
                                end
                        end)
                        -- Replace queue with fresh scan (only if not currently firing)
                        if not miningFiring then
                                miningParts = freshParts
                        end
                        task.wait(5)
                end
        end)

        -- Show ENABLED popup
        pcall(function()
                if ArcPopupGui and ArcPopupGui.Parent then
                        ArcPopupGui:Destroy()
                end
                ArcPopupGui = nil
                ArcPopupFrame = nil
                ArcPopupQueue = {}
                local gui = Instance.new('ScreenGui')
                gui.Name = 'ArcYieldPopup'
                gui.ResetOnSpawn = false
                gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
                gui.Parent = game:GetService('CoreGui')
                ArcPopupGui = gui
                local frame = Instance.new('Frame')
                frame.Size = UDim2.new(0, 280, 0, 55)
                frame.Position = UDim2.new(0.5, -140, 0, -65)
                frame.BackgroundColor3 = Color3.fromRGB(10, 10, 20)
                frame.BackgroundTransparency = 0.15
                frame.BorderSizePixel = 0
                frame.Parent = gui
                ArcPopupFrame = frame
                local corner = Instance.new('UICorner')
                corner.CornerRadius = UDim.new(0, 8)
                corner.Parent = frame
                local stroke = Instance.new('UIStroke')
                stroke.Color = Color3.fromRGB(50, 100, 255)
                stroke.Thickness = 1.5
                stroke.Transparency = 0.3
                stroke.Parent = frame
                local accent = Instance.new('Frame')
                accent.Size = UDim2.new(0, 5, 0, 55)
                accent.BackgroundColor3 = Color3.fromRGB(50, 120, 255)
                accent.BorderSizePixel = 0
                local ac = Instance.new('UICorner')
                ac.CornerRadius = UDim.new(0, 3)
                ac.Parent = accent
                accent.Parent = frame
                local tl = Instance.new('TextLabel')
                tl.Name = 'Title'
                tl.Size = UDim2.new(1, -20, 0, 28)
                tl.Position = UDim2.new(0, 14, 0, 2)
                tl.BackgroundTransparency = 1
                tl.Text = 'Minigun'
                tl.TextColor3 = Color3.fromRGB(220, 230, 255)
                tl.TextStrokeColor3 = Color3.fromRGB(30, 80, 255)
                tl.TextStrokeTransparency = 0.6
                tl.Font = Enum.Font.GothamBold
                tl.TextSize = 16
                tl.TextXAlignment = Enum.TextXAlignment.Left
                tl.Parent = frame
                local sl = Instance.new('TextLabel')
                sl.Name = 'Status'
                sl.Size = UDim2.new(1, -20, 0, 20)
                sl.Position = UDim2.new(0, 14, 0, 28)
                sl.BackgroundTransparency = 1
                sl.Text = 'ENABLED (power: ' .. power .. ')'
                sl.TextColor3 = Color3.fromRGB(100, 255, 130)
                sl.TextStrokeColor3 = Color3.fromRGB(30, 80, 255)
                sl.TextStrokeTransparency = 0.8
                sl.Font = Enum.Font.Gotham
                sl.TextSize = 13
                sl.TextXAlignment = Enum.TextXAlignment.Left
                sl.Parent = frame
                local ts = game:GetService('TweenService')
                ts:Create(frame, TweenInfo.new(0.35, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {
                        Position = UDim2.new(0.5, -140, 0, 10),
                        BackgroundTransparency = 0
                }):Play()
        end)

        -- Click = fire parts one by one, 0.2s apart
        miningConn = mouse.Button1Down:Connect(function()
                if not miningActive or miningFiring then return end
                if not miningParts or #miningParts == 0 then
                        notify('Minigun', 'No parts queued yet, wait for scan...')
                        return
                end

                miningFiring = true
                -- Snapshot current queue so background scan keeps building a new one
                local snapshot = {}
                for _, p in pairs(miningParts) do snapshot[#snapshot + 1] = p end
                miningParts = {}

                task.spawn(function()
                        local root = getRoot(char)
                        if not root then miningFiring = false return end
                        local savedPos = root.CFrame

                        for i = 1, #snapshot do
                                if not miningActive then break end
                                local part = snapshot[i]

                                if part and part.Parent and part.Anchored == false then
                                        pcall(function()
                                                -- Strip constraints/welds right before firing
                                                orbitua_prepPart(part)
                                                for _, x in pairs(part:GetChildren()) do
                                                        if x:IsA('Constraint') then
                                                                pcall(function() x:Destroy() end)
                                                        end
                                                end
                                                local ok4, joints = pcall(function() return part:GetJoints() end)
                                                if ok4 and joints then
                                                        for _, x in pairs(joints) do
                                                                pcall(function() x:Destroy() end)
                                                        end
                                                end
                                                part.Massless = true
                                                part.CanCollide = false
                                                part.CanTouch = false

                                                -- Teleport onto the part for 1 frame to grab server ownership
                                                root.CFrame = part.CFrame + Vector3.new(0, 3, 0)
                                                RunService.Heartbeat:Wait()
                                                root.CFrame = savedPos

                                                -- Now fire it
                                                local targetPos = mouse.Hit.Position
                                                local dir = (targetPos - part.Position).Unit
                                                part.Velocity = dir * miningPower
                                                part.RotVelocity = Vector3.new(
                                                        math.random(-80, 80),
                                                        math.random(-80, 80),
                                                        math.random(-80, 80)
                                                )
                                        end)
                                end
                                if i < #snapshot then
                                        task.wait(0.2)
                                end
                        end
                        miningFiring = false
                end)
        end)

        -- Keep SimulationRadius up so physics works on far parts
        task.spawn(function()
                while miningActive do
                        pcall(function() sethiddenproperty(speaker, "SimulationRadius", math.huge) end)
                        task.wait(1)
                end
        end)

        notify('Minigun', 'Scanning every 5s. Power: ' .. power .. '. Click to fire!')
end)

addcmd('unminigun', {'nominigun', 'minigunoff'}, function(args, speaker)
        miningActive = false
        disablePhysicsGodmode(speaker)
        if miningConn then miningConn:Disconnect() miningConn = nil end
        miningParts = {}
        miningFiring = false
        miningScanThread = nil
        -- Show DISABLED popup
        pcall(function()
                if ArcPopupGui and ArcPopupGui.Parent then
                        ArcPopupGui:Destroy()
                end
                ArcPopupGui = nil
                ArcPopupFrame = nil
                ArcPopupQueue = {}
                local gui = Instance.new('ScreenGui')
                gui.Name = 'ArcYieldPopup'
                gui.ResetOnSpawn = false
                gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
                gui.Parent = game:GetService('CoreGui')
                ArcPopupGui = gui
                local frame = Instance.new('Frame')
                frame.Size = UDim2.new(0, 280, 0, 55)
                frame.Position = UDim2.new(0.5, -140, 0, -65)
                frame.BackgroundColor3 = Color3.fromRGB(10, 10, 20)
                frame.BackgroundTransparency = 0.15
                frame.BorderSizePixel = 0
                frame.Parent = gui
                ArcPopupFrame = frame
                local corner = Instance.new('UICorner')
                corner.CornerRadius = UDim.new(0, 8)
                corner.Parent = frame
                local stroke = Instance.new('UIStroke')
                stroke.Color = Color3.fromRGB(50, 100, 255)
                stroke.Thickness = 1.5
                stroke.Transparency = 0.3
                stroke.Parent = frame
                local accent = Instance.new('Frame')
                accent.Size = UDim2.new(0, 5, 0, 55)
                accent.BackgroundColor3 = Color3.fromRGB(50, 120, 255)
                accent.BorderSizePixel = 0
                local ac = Instance.new('UICorner')
                ac.CornerRadius = UDim.new(0, 3)
                ac.Parent = accent
                accent.Parent = frame
                local tl = Instance.new('TextLabel')
                tl.Name = 'Title'
                tl.Size = UDim2.new(1, -20, 0, 28)
                tl.Position = UDim2.new(0, 14, 0, 2)
                tl.BackgroundTransparency = 1
                tl.Text = 'Minigun'
                tl.TextColor3 = Color3.fromRGB(220, 230, 255)
                tl.TextStrokeColor3 = Color3.fromRGB(30, 80, 255)
                tl.TextStrokeTransparency = 0.6
                tl.Font = Enum.Font.GothamBold
                tl.TextSize = 16
                tl.TextXAlignment = Enum.TextXAlignment.Left
                tl.Parent = frame
                local sl = Instance.new('TextLabel')
                sl.Name = 'Status'
                sl.Size = UDim2.new(1, -20, 0, 20)
                sl.Position = UDim2.new(0, 14, 0, 28)
                sl.BackgroundTransparency = 1
                sl.Text = 'DISABLED'
                sl.TextColor3 = Color3.fromRGB(255, 100, 100)
                sl.TextStrokeColor3 = Color3.fromRGB(30, 80, 255)
                sl.TextStrokeTransparency = 0.8
                sl.Font = Enum.Font.Gotham
                sl.TextSize = 13
                sl.TextXAlignment = Enum.TextXAlignment.Left
                sl.Parent = frame
                local ts = game:GetService('TweenService')
                ts:Create(frame, TweenInfo.new(0.35, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {
                        Position = UDim2.new(0.5, -140, 0, 10),
                        BackgroundTransparency = 0
                }):Play()
        end)
end)


-- ======================== HOVERBOARD ========================
-- Finds a flat unanchored part (~6x1x1 or similar), brings it to your feet.
-- You ride it: WASD to move (camera-relative), Space to jump.
-- Idle: board gently tilts/bobs + Aura Idle animation.
-- Moving: board levels out + Floating Flying animation.
-- Serversided Velocity (orbitua-style) so everyone sees the board move.
-- Player is locked to the top of the board every frame.
-- Usage: hoverboard  |  unhoverboard / nohoverboard / hoverboardoff / togglehoverboard

hbActive = false
hbPart = nil
hbConn = nil
hbIdleTrack = nil
hbMoveTrack = nil
hbSpeed = 80
hbKeysDown = {}
hbInputBegan = nil
hbInputEnded = nil
hbDiedConn = nil
hbOrigWalkSpeed = 16
hbOrigAnimate = nil
hbIdleAnimId = 616006778   -- Levitation Idle (float with legs crossed, aura-like)
hbMoveAnimId = 616010382   -- Levitation Run (flying/floating movement)

addcmd('hoverboard', {}, function(args, speaker)
        if hbActive then execCmd('unhoverboard') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('Hoverboard', 'Character not found') return end
        local root = getRoot(char)
        local hum = char:FindFirstChildWhichIsA('Humanoid')
        if not hum then notify('Hoverboard', 'Humanoid not found') return end

        -- Find a suitable flat long part (roughly 6:1:1 ratio or similar proportions)
        local bestPart = nil
        local bestScore = math.huge
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not char:IsAncestorOf(part) then
                                local sx, sy, sz = part.Size.X, part.Size.Y, part.Size.Z
                                -- Sort dimensions largest to smallest
                                local sizes = {sx, sy, sz}
                                table.sort(sizes, function(a, b) return a > b end)
                                -- Longest >= 3 studs, ratio longest/shortest >= 2.5, middle/shortest <= 3
                                if sizes[1] >= 3 and sizes[1] / sizes[3] >= 2.5 and sizes[2] / sizes[3] <= 3 then
                                        -- Score: prefer closest to 6x1x1 proportions
                                        local score = math.abs(sizes[1] - 6) + math.abs(sizes[2] - 1) + math.abs(sizes[3] - 1)
                                        if score < bestScore then
                                                bestPart = part
                                                bestScore = score
                                        end
                                end
                        end
                end
        end

        if not bestPart then
                notify('Hoverboard', 'No flat part found! Need something like 6x1x1')
                return
        end

        hbPart = bestPart
        orbitua_prepPart(hbPart)

        -- Position board under player's feet
        local yOffset = -(root.Size.Y / 2 + hbPart.Size.Y / 2 + 0.1)
        hbPart.CFrame = root.CFrame * CFrame.new(0, yOffset, 0)
        hbPart.Velocity = Vector3.new(0, 0, 0)
        hbPart.RotVelocity = Vector3.new(0, 0, 0)

        -- Weld player to board so other players see the connection
        local hbWeld = Instance.new('WeldConstraint')
        hbWeld.Part0 = root
        hbWeld.Part1 = hbPart
        hbWeld.Parent = root

        -- Save original WalkSpeed and set to 0 (so humanoid doesn't fight the weld)
        hbOrigWalkSpeed = hum.WalkSpeed
        hum.WalkSpeed = 0

        -- Disable default Animate script so it doesn't override our custom anims
        hbOrigAnimate = char:FindFirstChild('Animate')
        if hbOrigAnimate then hbOrigAnimate.Disabled = true end

        -- Load animations
        local idleAnim = Instance.new('Animation')
        idleAnim.AnimationId = 'rbxassetid://' .. hbIdleAnimId
        local moveAnim = Instance.new('Animation')
        moveAnim.AnimationId = 'rbxassetid://' .. hbMoveAnimId

        hbIdleTrack = nil
        hbMoveTrack = nil
        pcall(function()
                hbIdleTrack = hum:LoadAnimation(idleAnim)
                hbMoveTrack = hum:LoadAnimation(moveAnim)
                if hbIdleTrack then
                        hbIdleTrack.Priority = Enum.AnimationPriority.Movement
                        hbIdleTrack.Looped = true
                end
                if hbMoveTrack then
                        hbMoveTrack.Priority = Enum.AnimationPriority.Movement
                        hbMoveTrack.Looped = true
                end
        end)

        -- Track keyboard input for WASD + Space
        local UIS = game:GetService('UserInputService')
        hbKeysDown = {}
        hbInputBegan = UIS.InputBegan:Connect(function(input, processed)
                if not processed then
                        hbKeysDown[input.KeyCode] = true
                end
        end)
        hbInputEnded = UIS.InputEnded:Connect(function(input)
                hbKeysDown[input.KeyCode] = false
        end)

        hbActive = true
        local wasMoving = false

        -- Main heartbeat loop
        hbConn = RunService.Heartbeat:Connect(function(dt)
                if not hbActive then return end
                if not hbPart or not hbPart.Parent then execCmd('unhoverboard') return end
                local r = getRoot(speaker.Character)
                if not r then execCmd('unhoverboard') return end

                -- Calculate movement direction from WASD (camera-relative)
                local cam = workspace.CurrentCamera
                local moveDir = Vector3.new(0, 0, 0)
                if hbKeysDown[Enum.KeyCode.W] then moveDir = moveDir + cam.CFrame.LookVector end
                if hbKeysDown[Enum.KeyCode.S] then moveDir = moveDir - cam.CFrame.LookVector end
                if hbKeysDown[Enum.KeyCode.A] then moveDir = moveDir - cam.CFrame.RightVector end
                if hbKeysDown[Enum.KeyCode.D] then moveDir = moveDir + cam.CFrame.RightVector end
                -- Flatten Y axis for ground movement
                moveDir = Vector3.new(moveDir.X, 0, moveDir.Z)

                local isMoving = moveDir.Magnitude > 0.01
                local wantsJump = hbKeysDown[Enum.KeyCode.Space] == true

                if isMoving then
                        moveDir = moveDir.Unit
                        -- Move board with Velocity (serversided, orbitua-style)
                        local jumpVel = wantsJump and 120 or 0
                        hbPart.Velocity = moveDir * hbSpeed + Vector3.new(0, jumpVel, 0)
                        -- Level the board when moving (zero out tilt)
                        hbPart.RotVelocity = Vector3.new(0, 0, 0)
                else
                        -- Idle: gentle hover bob + slow tilt oscillation
                        local bobY = math.sin(tick() * 2) * 3
                        local jumpBoost = wantsJump and 80 or 0
                        hbPart.Velocity = Vector3.new(0, bobY + jumpBoost, 0)
                        -- Tilt the board gently with RotVelocity
                        hbPart.RotVelocity = Vector3.new(
                                math.sin(tick() * 1.5) * 15,
                                0,
                                math.cos(tick() * 1.2) * 10
                        )
                end

                -- Lock player on top of the board every frame
                local topY = hbPart.Position.Y + hbPart.Size.Y / 2 + r.Size.Y / 2 + 0.1
                if isMoving then
                        -- Face movement direction
                        local lookAngle = math.atan2(moveDir.X, moveDir.Z)
                        r.CFrame = CFrame.new(hbPart.Position.X, topY, hbPart.Position.Z) * CFrame.Angles(0, lookAngle, 0)
                else
                        -- Keep current facing direction
                        local _, currentYRot = r.CFrame:ToEulerAnglesYXZ()
                        r.CFrame = CFrame.new(hbPart.Position.X, topY, hbPart.Position.Z) * CFrame.Angles(0, currentYRot, 0)
                end

                -- Switch animations based on movement state
                if isMoving and not wasMoving then
                        pcall(function() if hbMoveTrack then hbMoveTrack:Play() end end)
                        pcall(function() if hbIdleTrack then hbIdleTrack:Stop() end end)
                elseif not isMoving and wasMoving then
                        pcall(function() if hbIdleTrack then hbIdleTrack:Play() end end)
                        pcall(function() if hbMoveTrack then hbMoveTrack:Stop() end end)
                end
                wasMoving = isMoving

                sethiddenproperty(speaker, "SimulationRadius", math.huge)
        end)

        -- Die cleanup
        if hum then
                hbDiedConn = hum.Died:Connect(function() execCmd('unhoverboard') end)
        end

        -- Start idle animation
        pcall(function() if hbIdleTrack then hbIdleTrack:Play() end end)

        showArcPopup('Hoverboard', true)
        notify('Hoverboard', 'Hoverboard active! WASD to move, Space to jump')
end)

addcmd('unhoverboard', {'nohoverboard', 'hoverboardoff'}, function(args, speaker)
        hbActive = false
        if hbConn then hbConn:Disconnect() hbConn = nil end
        if hbDiedConn then hbDiedConn:Disconnect() hbDiedConn = nil end
        if hbInputBegan then hbInputBegan:Disconnect() hbInputBegan = nil end
        if hbInputEnded then hbInputEnded:Disconnect() hbInputEnded = nil end

        -- Restore WalkSpeed and Animate script
        local char = speaker.Character
        if char then
                local hum = char:FindFirstChildWhichIsA('Humanoid')
                if hum then hum.WalkSpeed = hbOrigWalkSpeed end
                if hbOrigAnimate and hbOrigAnimate.Parent then
                        hbOrigAnimate.Disabled = false
                end
        end
        hbOrigAnimate = nil

        -- Stop animations
        if hbIdleTrack then pcall(function() hbIdleTrack:Stop() end) hbIdleTrack = nil end
        if hbMoveTrack then pcall(function() hbMoveTrack:Stop() end) hbMoveTrack = nil end

        -- Remove weld
        local root = char and getRoot(char)
        if root then
                for _, x in pairs(root:GetChildren()) do
                        if x:IsA('WeldConstraint') and x.Part1 == hbPart then
                                x:Destroy()
                        end
                end
        end

        -- Clean up the board
        if hbPart and hbPart.Parent then
                pcall(function() hbPart.CustomPhysicalProperties = nil end)
                hbPart.Velocity = Vector3.new(0, 0, 0)
                hbPart.RotVelocity = Vector3.new(0, 0, 0)
        end
        hbPart = nil
        hbKeysDown = {}

        showArcPopup('Hoverboard', false)
end)

addcmd('togglehoverboard', {}, function(args, speaker)
        if hbActive then execCmd('unhoverboard') else execCmd('hoverboard') end
end)


-- ======================== CUSTOM ANIMATION PACKS ========================
-- Each pack replaces the character's Animate script animations (idle, walk, run,
-- jump, fall, swim, climb) with a themed set. The default Animate script handles
-- all state transitions automatically - no manual tracking needed.
-- Run command again to stop and restore originals.
-- Xeno Lua 5.1 compatible: no continue, no goto.
-- Usage: floatpack | godpack | ninjapack | zombiepack | vampirepack | etc.

animPackActive = nil  -- name of active pack, nil = none
animPackOriginals = {}  -- saved original AnimationIds
animPackDiedConn = nil

-- Animation pack definitions: {name, description, idle1, idle2, walk, run, jump, fall, climb, swim, swimidle}
local animPacks = {
        floatpack   = {"Float Pack",    "Levitation - float everywhere, swim in air",
                        616006778, 616008087, 616013216, 616010382, 616008936, 616005863, 616003713, 616011509, 616012453},
        godpack     = {"God Pack",      "Superhero - arms out, confident, powerful",
                        616111295, 616113536, 616122287, 616117076, 616115533, 616108001, 616104706, nil, nil},
        ninjapack   = {"Ninja Pack",    "Stealth ninja - sneaky, fast, agile",
                        656117400, 656118341, 656121766, 656118852, 656117878, 656115606, 656114359, nil, nil},
        zombiepack  = {"Zombie Pack",   "Undead - arms forward, stumbling, lurching",
                        616158929, 616160636, 616168032, 616163682, 616161997, 616157476, nil, nil, nil},
        stylishpack = {"Stylish Pack",  "Swagger - cool walk, slick movement",
                        616136790, 616138447, 616146177, 616140816, 616139451, 616134815, nil, nil, nil},
        robotpack   = {"Robot Pack",    "Mechanical - stiff, robotic movement",
                        616088211, 616089559, 616095330, 616091570, 616090535, 616087089, 616086039, nil, nil},
        magepack    = {"Mage Pack",     "Magical - caster walk, mystical movement",
                        707742142, 707855907, 707897309, 707861613, 707853694, 707829716, 707826056, nil, nil},
        vampirepack = {"Vampire Pack",  "Dark elegant - vampire walk/run, pale grace",
                        1083445855, 1083450166, 1083473930, 1083462077, 1083455352, 1083443587, 1083439238, nil, nil},
        werewlfpack = {"Werewolf Pack", "Beast - animalistic walk/run, feral movement",
                        1083195517, 1083214717, 1083178339, 1083216690, 1083218792, 1083189019, 1083182000, nil, nil},
        piratepack  = {"Pirate Pack",   "Swashbuckler - pirate walk, adventurous run",
                        750781874, 750782770, 750785693, 750783738, 750782230, 750780242, 750779899, nil, nil},
        cartypack   = {"Cartoony Pack", "Exaggerated - bouncy, over-the-top movement",
                        742637544, 742638445, 742640026, 742638842, 742637942, 742637151, 742636889, nil, nil},
        bubblypack  = {"Bubbly Pack",   "Playful - bouncy walk with swim animations",
                        910004836, 910009958, 910034870, 910025107, 910016857, 910001910, nil, 910028158, 910030921},
        cowboyppack = {"Cowboy Pack",   "Western - cowboy stroll, rugged run",
                        1014390418, 1014398616, 1014421541, 1014401683, 1014394726, 1014384571, 1014380606, nil, nil},
        knightpack  = {"Knight Pack",   "Heavy armor - slow, powerful, armored",
                        657595757, 657568135, 657552124, 657564596, 658409194, 657600338, 658360781, nil, nil},
        princespack = {"Princess Pack", "Elegant - graceful walk, royal movement",
                        941003647, 941013098, 941028902, 941015281, 941008832, 941000007, 940996062, nil, nil},
        sneakypack  = {"Sneaky Pack",   "Stealth - tiptoe, quiet movement",
                        1132473842, 1132477671, 1132510133, 1132494274, 1132489853, 1132469004, 1132461372, nil, nil},
        confidpack  = {"Confident Pack","Swagger - cool idle, confident walk",
                        1069977950, 1069987858, 1070017263, 1070001516, 1069984524, 1069973677, 1069946257, nil, nil},
        astronautpk = {"Astronaut Pack","Space - low-gravity walk, skydive fall",
                        891621366, 891633237, 891667138, 891636393, 891627522, 891617961, 891609353, nil, nil},
        elderpack   = {"Elder Pack",    "Old person - slow, hunched walk",
                        845397899, 845400520, 845403856, 845386501, 845398858, 845396048, 845392038, nil, nil},
        popstarpack = {"Popstar Pack",  "Idol - popstar walk, star movement",
                        1212900985, 1212900985, 1212980338, 1212980348, 1212954642, 1212900995, 1213044953, nil, nil},
        toypack     = {"Toy Pack",      "Toy-like - stiff, playful movements",
                        782841498, 782845736, 782843345, 782842708, 782847020, 782846423, 782843869, nil, nil},
}

-- Path map: which Animation objects to modify in the Animate script
-- Each entry = {container name, animation name}
local animPaths = {
        {"idle", "Animation1"},
        {"idle", "Animation2"},
        {"walk", "WalkAnim"},
        {"run", "RunAnim"},
        {"jump", "JumpAnim"},
        {"fall", "FallAnim"},
        {"climb", "ClimbAnim"},
        {"swim", "Swim"},
        {"swimidle", "SwimIdle"},
}

-- Save original AnimationIds from the Animate script
local function saveOriginalAnims(char)
        local animate = char:FindFirstChild('Animate')
        if not animate then return end
        animPackOriginals = {}
        for _, pathPair in pairs(animPaths) do
                local container = animate:FindFirstChild(pathPair[1])
                if container then
                        local animObj = container:FindFirstChild(pathPair[2])
                        if animObj then
                                animPackOriginals[pathPair[1] .. '.' .. pathPair[2]] = animObj.AnimationId
                        end
                end
        end
end

-- Restore original AnimationIds
local function restoreOriginalAnims(char)
        local animate = char:FindFirstChild('Animate')
        if not animate then return end
        for pathKey, originalId in pairs(animPackOriginals) do
                local containerName = string.match(pathKey, '^(.+)%..+$')
                local animName = string.match(pathKey, '^%.(.+)$')
                -- Re-parse key
                local dotPos = string.find(pathKey, '.', 1, true)
                if dotPos then
                        containerName = string.sub(pathKey, 1, dotPos - 1)
                        animName = string.sub(pathKey, dotPos + 1)
                end
                local container = animate:FindFirstChild(containerName)
                if container then
                        local animObj = container:FindFirstChild(animName)
                        if animObj then
                                pcall(function() animObj.AnimationId = originalId end)
                        end
                end
        end
        animPackOriginals = {}
end

-- Apply a pack's animations to the Animate script
local function applyPack(char, pack)
        local animate = char:FindFirstChild('Animate')
        if not animate then
                notify('Anim', 'Animate script not found on character')
                return false
        end
        local ids = pack
        local pathIndex = 0
        for _, pathPair in pairs(animPaths) do
                pathIndex = pathIndex + 1
                local animId = ids[pathIndex + 2]  -- +2 because index 1=name, 2=desc
                if animId then
                        local container = animate:FindFirstChild(pathPair[1])
                        if container then
                                local animObj = container:FindFirstChild(pathPair[2])
                                if animObj then
                                        pcall(function() animObj.AnimationId = 'rbxassetid://' .. animId end)
                                end
                        end
                end
        end
        return true
end

-- Stop any active pack
local function stopAnimPack(speaker)
        if animPackDiedConn then animPackDiedConn:Disconnect() animPackDiedConn = nil end
        local char = speaker.Character
        if char then restoreOriginalAnims(char) end
        local wasActive = animPackActive
        animPackActive = nil
        return wasActive
end

-- Shared function to activate an animation pack
local function playAnimPack(packName, speaker)
        local pack = animPacks[packName]
        if not pack then
                notify('Anim', 'Unknown pack: ' .. tostring(packName))
                return
        end

        -- If already playing this pack, stop it
        if animPackActive == packName then
                stopAnimPack(speaker)
                showArcPopup(pack[1], false)
                notify('Anim', 'Stopped ' .. pack[1])
                return
        end

        -- Stop any existing pack first
        stopAnimPack(speaker)

        local char = speaker.Character
        if not char then notify('Anim', 'Character not found') return end
        local hum = char:FindFirstChildWhichIsA('Humanoid')
        if not hum then notify('Anim', 'Humanoid not found') return end

        -- Save originals then apply pack
        saveOriginalAnims(char)
        local ok = applyPack(char, pack)
        if not ok then
                restoreOriginalAnims(char)
                return
        end

        animPackActive = packName
        showArcPopup(pack[1], true)
        notify('Anim', pack[1] .. ' - ' .. pack[2])

        -- Cleanup on death
        animPackDiedConn = hum.Died:Connect(function()
                stopAnimPack(speaker)
                showArcPopup('Anim', false)
        end)
end

-- Universal stop command
addcmd('unanim', {'noanim', 'stopanim', 'animsreset', 'resetanim'}, function(args, speaker)
        -- Stop lol anim if active
        if lolAnimActive then
                lolAnimActive = false
                if lolAnimConn then lolAnimConn:Disconnect() lolAnimConn = nil end
                if lolAnimDiedConn then lolAnimDiedConn:Disconnect() lolAnimDiedConn = nil end
                showArcPopup('LOL Anim', false)
        end
        local was = stopAnimPack(speaker)
        local char = speaker.Character
        if char then restoreOriginalAnims(char) end
        showArcPopup('Anim', false)
        if was or lolAnimActive then notify('Anim', 'Stopped animation pack') end
end)

-- Register all animation pack commands
local packAliases = {
        floatpack   = {'floatpack', 'floatanim'},
        godpack     = {'godpack', 'godanim', 'god'},
        ninjapack   = {'ninjapack', 'ninjaanim', 'ninja'},
        zombiepack  = {'zombiepack', 'zombieanim', 'zombie'},
        stylishpack = {'stylishpack', 'stylishanim', 'stylish'},
        robotpack   = {'robotpack', 'robotanim', 'robot'},
        magepack    = {'magepack', 'mageanim', 'mage'},
        vampirepack = {'vampirepack', 'vampireanim', 'vampire'},
        werewolfpack = {'werewolfpack', 'werewolfanim', 'werewolf'},
        piratepack  = {'piratepack', 'pirateanim', 'pirate'},
        cartypack   = {'cartypack', 'cartoonyanim', 'cartoony'},
        bubblypack  = {'bubblypack', 'bubblyanim', 'bubbly'},
        cowboyppack = {'cowboyppack', 'cowboyanim', 'cowboy'},
        knightpack  = {'knightpack', 'knightanim', 'knight'},
        princesspack = {'princesspack', 'princessanim', 'princess'},
        sneakypack  = {'sneakypack', 'sneakyanim', 'sneaky'},
        confidpack  = {'confidpack', 'confidanim', 'confident'},
        astronautpk = {'astronautpk', 'astronautanim', 'astronaut'},
        elderpack   = {'elderpack', 'elderanim', 'elder'},
        popstarpack = {'popstarpack', 'popstaranim', 'popstar'},
        toypack     = {'toypack', 'toyanim', 'toy'},
}

for packName, aliases in pairs(packAliases) do
        addcmd(aliases[1], aliases, function(args, speaker)
                playAnimPack(packName, speaker)
        end)
end


-- ======================== LOL ANIM ========================
-- Every time you walk, run, jump, fall, or climb, picks a RANDOM animation from a huge pool.
-- Uses Humanoid.StateChanged to swap the Animate script's AnimationId right before it plays.
-- Each movement = different animation every time. Run again to stop.
-- Usage: lolanim / lol  |  unanim to stop

lolAnimActive = false
lolAnimConn = nil
lolAnimDiedConn = nil
lolAnimOriginals = {}

-- Big pools of animation IDs scraped from all packs
local lolWalkPool = {
        616013216, 616122287, 656121766, 616168032, 616146177, 616095330,
        707897309, 1083473930, 1083178339, 750785693, 742640026, 910034870,
        1014421541, 657552124, 941028902, 1132510133, 1070017263, 891667138,
        845403856, 1212980338, 782843345, 616010382, 616117076, 656118852,
        616163682, 616140816, 616091570, 707861613, 1083462077, 1083216690,
        750783738, 742638842, 910025107, 1014401683, 657564596, 941015281,
        1132494274, 1070001516, 891636393, 845386501, 1212980348, 782842708
}

local lolIdlePool = {
        616006778, 616008087, 616111295, 616113536, 656117400, 656118341,
        616158929, 616160636, 616136790, 616138447, 616088211, 616089559,
        707742142, 707855907, 1083445855, 1083450166, 1083195517, 1083214717,
        750781874, 750782770, 742637544, 742638445, 910004836, 910009958,
        1014390418, 1014398616, 657595757, 657568135, 941003647, 941013098,
        1132473842, 1132477671, 1069977950, 1069987858, 891621366, 891633237,
        845397899, 845400520, 1212900985, 782841498, 782845736
}

local lolJumpPool = {
        616008936, 616115533, 656117878, 616161997, 616139451, 616090535,
        707853694, 1083455352, 1083218792, 750782230, 742637942, 910016857,
        1014394726, 658409194, 941008832, 1132489853, 1069984524, 891627522,
        845398858, 1212954642, 782847020
}

local lolFallPool = {
        616005863, 616108001, 656115606, 616157476, 616134815, 616087089,
        707829716, 1083443587, 1083189019, 750780242, 742637151, 910001910,
        1014384571, 657600338, 941000007, 1132469004, 1069973677, 891617961,
        845396048, 1212900995, 782846423
}

local lolClimbPool = {
        616003713, 616104706, 656114359, 616157476, 616134815, 616087089,
        707826056, 1083439238, 1083182000, 750779899, 742636889, 1014380606,
        658360781, 940996062, 1132461372, 1069946257, 891609353, 845392038,
        1213044953, 782843869, 616086039
}

local lolSwimPool = {
        616011509, 910028158, 616012453, 910030921
}

-- Map pool name -> {container, animName} in Animate script
local lolPoolPaths = {
        idle1 = {'idle', 'Animation1'},
        idle2 = {'idle', 'Animation2'},
        walk  = {'walk', 'WalkAnim'},
        run   = {'run', 'RunAnim'},
        jump  = {'jump', 'JumpAnim'},
        fall  = {'fall', 'FallAnim'},
        climb = {'climb', 'ClimbAnim'},
        swim  = {'swim', 'Swim'},
        swimidle = {'swimidle', 'SwimIdle'},
}

-- Map pool name -> pool table
local lolPoolMap = {
        idle1 = lolIdlePool,
        idle2 = lolIdlePool,
        walk  = lolWalkPool,
        run   = lolWalkPool,
        jump  = lolJumpPool,
        fall  = lolFallPool,
        climb = lolClimbPool,
        swim  = lolSwimPool,
        swimidle = lolSwimPool,
}

local function lolRandomizeSlot(animate, slotName)
        local pool = lolPoolMap[slotName]
        local pathInfo = lolPoolPaths[slotName]
        if not pool or not pathInfo then return end
        local id = pool[math.random(1, #pool)]
        local container = animate:FindFirstChild(pathInfo[1])
        if container then
                local animObj = container:FindFirstChild(pathInfo[2])
                if animObj then
                        pcall(function() animObj.AnimationId = 'rbxassetid://' .. id end)
                end
        end
end

addcmd('lolanim', {'lol'}, function(args, speaker)
        -- Toggle off
        if lolAnimActive then
                lolAnimActive = false
                if lolAnimConn then lolAnimConn:Disconnect() lolAnimConn = nil end
                if lolAnimDiedConn then lolAnimDiedConn:Disconnect() lolAnimDiedConn = nil end
                local char = speaker.Character
                if char then restoreOriginalAnims(char) end
                showArcPopup('LOL Anim', false)
                notify('LOL Anim', 'Stopped')
                return
        end

        local char = speaker.Character
        if not char then notify('LOL Anim', 'No character') return end
        local hum = char:FindFirstChildWhichIsA('Humanoid')
        if not hum then notify('LOL Anim', 'No humanoid') return end
        local animate = char:FindFirstChild('Animate')
        if not animate then notify('LOL Anim', 'No Animate script') return end

        -- Save originals first
        saveOriginalAnims(char)

        lolAnimActive = true

        -- Randomize all slots immediately
        for slotName, _ in pairs(lolPoolMap) do
                lolRandomizeSlot(animate, slotName)
        end

        -- On every state change, randomize the relevant slots
        lolAnimConn = hum.StateChanged:Connect(function(oldState, newState)
                if not lolAnimActive then return end
                local char2 = speaker.Character
                if not char2 then return end
                local animate2 = char2:FindFirstChild('Animate')
                if not animate2 then return end

                -- Map humanoid states to animation slots
                if newState == Enum.HumanoidStateType.Running then
                        lolRandomizeSlot(animate2, 'walk')
                        lolRandomizeSlot(animate2, 'run')
                elseif newState == Enum.HumanoidStateType.Jumping then
                        lolRandomizeSlot(animate2, 'jump')
                elseif newState == Enum.HumanoidStateType.Freefall then
                        lolRandomizeSlot(animate2, 'fall')
                elseif newState == Enum.HumanoidStateType.Climbing then
                        lolRandomizeSlot(animate2, 'climb')
                elseif newState == Enum.HumanoidStateType.Swimming then
                        lolRandomizeSlot(animate2, 'swim')
                        lolRandomizeSlot(animate2, 'swimidle')
                elseif newState == Enum.HumanoidStateType.Idle or newState == Enum.HumanoidStateType.GettingUp or newState == Enum.HumanoidStateType.LandingPaused then
                        lolRandomizeSlot(animate2, 'idle1')
                        lolRandomizeSlot(animate2, 'idle2')
                end
        end)

        -- Cleanup on death
        lolAnimDiedConn = hum.Died:Connect(function()
                lolAnimActive = false
                if lolAnimConn then lolAnimConn:Disconnect() lolAnimConn = nil end
                lolAnimDiedConn = nil
                local char3 = speaker.Character
                if char3 then restoreOriginalAnims(char3) end
                showArcPopup('LOL Anim', false)
        end)

        showArcPopup('LOL Anim', true)
        notify('LOL Anim', 'Random anim every move! Type again to stop')
end)


-- ======================== FLING UA ========================
-- Takes ALL unanchored parts from the game, assigns ONE to each player, spins at max speed.
-- Parts follow their assigned player. The spinning + collision naturally flings people.
-- Usage: flingua [spinpower]  |  flingua off / unflingua to stop

flinguaActive = false
flinguaConn = nil
flinguaParts = {}

addcmd('flingua', {'fua'}, function(args, speaker)
        if args[1] and args[1]:lower() == 'off' then execCmd('unflingua') return end
        if flinguaActive then execCmd('unflingua') return end

        local spinPower = tonumber(args[1]) or 9999
        flinguaActive = true

        -- Collect ALL unanchored parts from the game (not from any player character)
        local availableParts = {}
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        local skipPart = false
                        for _, p in pairs(Players:GetPlayers()) do
                                if p.Character and p.Character:IsAncestorOf(part) then
                                        skipPart = true
                                        break
                                end
                        end
                        if not skipPart then
                                table.insert(availableParts, part)
                        end
                end
        end

        -- Assign one part per player (except speaker)
        flinguaParts = {}
        local partIndex = 1
        for _, player in pairs(Players:GetPlayers()) do
                if player ~= speaker and player.Character and player.Character:FindFirstChild('HumanoidRootPart') then
                        if partIndex <= #availableParts then
                                local part = availableParts[partIndex]
                                partIndex = partIndex + 1

                                -- Strip existing constraints that would interfere
                                for _, x in pairs(part:GetChildren()) do
                                        if x:IsA('BodyAngularVelocity') or x:IsA('BodyForce') or x:IsA('BodyGyro') or x:IsA('BodyPosition') or x:IsA('BodyThrust') or x:IsA('BodyVelocity') or x:IsA('RocketPropulsion') or x:IsA('AlignPosition') or x:IsA('Torque') then
                                                x:Destroy()
                                        end
                                end

                                -- Zero friction so it spins freely + can collide to fling
                                part.CustomPhysicalProperties = PhysicalProperties.new(0, 0, 0, 0, 0)
                                part.CanCollide = true

                                -- Max speed spin
                                local spin = Instance.new('BodyAngularVelocity')
                                spin.Name = randomString()
                                spin.AngularVelocity = Vector3.new(spinPower, spinPower, spinPower)
                                spin.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
                                spin.P = math.huge
                                spin.Parent = part

                                -- Teleport part to player
                                part.CFrame = player.Character.HumanoidRootPart.CFrame

                                table.insert(flinguaParts, {part = part, spin = spin, target = player})
                        end
                end
        end

        -- Follow loop: keep each part glued to its assigned player
        flinguaConn = RunService.Heartbeat:Connect(function()
                if not flinguaActive then return end
                for _, entry in pairs(flinguaParts) do
                        if entry.part and entry.part.Parent and entry.target and entry.target.Character then
                                local targetRoot = entry.target.Character:FindFirstChild('HumanoidRootPart')
                                if targetRoot then
                                        entry.part.CFrame = targetRoot.CFrame
                                end
                        end
                end
        end)

        showArcPopup('FlingUA (' .. #flinguaParts .. ' parts)', true)
        notify('FlingUA', 'Assigned ' .. #flinguaParts .. ' game parts to players')
end)

addcmd('unflingua', {'noflingua'}, function(args, speaker)
        flinguaActive = false
        if flinguaConn then flinguaConn:Disconnect() flinguaConn = nil end
        for _, entry in pairs(flinguaParts) do
                if entry.spin and entry.spin.Parent then entry.spin:Destroy() end
                if entry.part and entry.part.Parent then
                        entry.part.Velocity = Vector3.new(0, 0, 0)
                        pcall(function() entry.part.CustomPhysicalProperties = nil end)
                end
        end
        flinguaParts = {}
        showArcPopup('FlingUA', false)
end)

addcmd('toggleflingua', {}, function(args, speaker)
        if flinguaActive then execCmd('unflingua') else execCmd('flingua') end
end)


-- ======================== YUNAS (LOAD HUB) ========================
addcmd('yunas', {}, function(args, speaker)
        notify('Arc Yield', 'Loading Yunas Hub...')
        local success, err = pcall(function()
                loadstring(game:HttpGet('https://raw.githubusercontent.com/yunus154524/YunusLo1545-HUB/refs/heads/main/YunusLo1545%20HUB'))()
        end)
        if not success then
                notify('Arc Yield', 'Failed to load Yunas: ' .. tostring(err))
        end
end)


-- ======================== DROPKICK (LOAD SCRIPT) ========================
addcmd('dropkick', {}, function(args, speaker)
        notify('Arc Yield', 'Loading DropKick...')
        local success, err = pcall(function()
                loadstring(game:HttpGet('https://raw.githubusercontent.com/platinww/CrustyMain/refs/heads/main/universal/DropKick.lua'))()
        end)
        if not success then
                notify('Arc Yield', 'Failed to load DropKick: ' .. tostring(err))
        end
end)


-- ======================== FUNNY UA ========================
-- Finds the smallest unanchored part in the game, spins it at max speed,
-- makes it jitter really fast, and teleports it onto a random player every 1 second.
-- Usage: funnyua  |  unfunnyua to stop

funnyuaActive = false
funnyuaConn = nil
funnyuaPart = nil
funnyuaJitterConn = nil
funnyuaParts = {}
funnyuaTarget = nil
funnyuaTargetTimer = 0
funnyuaDiedConn = nil

addcmd('funnyua', {}, function(args, speaker)
        if funnyuaActive then execCmd('unfunnyua') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('FunnyUA', 'Character not found') return end

        funnyuaActive = true
        funnyuaParts = {}
        funnyuaTarget = nil
        funnyuaTargetTimer = 0

        -- Collect ALL unanchored parts (not from ANY player's character)
        local function isPlayerBodyPart(p)
                for _, plr in pairs(Players:GetPlayers()) do
                        if plr.Character and plr.Character:IsAncestorOf(p) then return true end
                end
                return false
        end

        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not isPlayerBodyPart(part) then
                                orbitua_prepPart(part)
                                -- Add max spin to every part
                                local spin = Instance.new('BodyAngularVelocity')
                                spin.Name = randomString()
                                spin.AngularVelocity = Vector3.new(math.random(-9999, 9999), math.random(-9999, 9999), math.random(-9999, 9999))
                                spin.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
                                spin.P = math.huge
                                spin.Parent = part
                                table.insert(funnyuaParts, part)
                        end
                end
        end

        -- Watch for new parts
        local addConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not funnyuaActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if isPlayerBodyPart(p) then return end
                        for _, existing in pairs(funnyuaParts) do if existing == p then return end end
                        orbitua_prepPart(p)
                        local spin = Instance.new('BodyAngularVelocity')
                        spin.Name = randomString()
                        spin.AngularVelocity = Vector3.new(math.random(-9999, 9999), math.random(-9999, 9999), math.random(-9999, 9999))
                        spin.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
                        spin.P = math.huge
                        spin.Parent = p
                        table.insert(funnyuaParts, p)
                end)
        end)

        local removeConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(funnyuaParts) do
                        if existing == p then table.remove(funnyuaParts, i) break end
                end
        end)

        local humanoid = char:FindFirstChildWhichIsA('Humanoid')
        if humanoid then
                funnyuaDiedConn = humanoid.Died:Connect(function() execCmd('unfunnyua') end)
        end

        -- Pick a random player as target (changes every 0.5 seconds)
        local function pickTarget()
                local validPlayers = {}
                for _, p in pairs(Players:GetPlayers()) do
                        if p ~= speaker and p.Character and p.Character:FindFirstChild('HumanoidRootPart') then
                                table.insert(validPlayers, p)
                        end
                end
                if #validPlayers > 0 then
                        funnyuaTarget = validPlayers[math.random(1, #validPlayers)]
                end
        end

        pickTarget()

        -- Main loop: orbit around target player with MAD jitter + spin
        local angleOffset = math.random() * math.pi * 2
        local orbitRadius = 15
        local orbitSpeed = 800

        funnyuaConn = RunService.Heartbeat:Connect(function(dt)
                if not funnyuaActive then return end
                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                -- Change target every 0.5 seconds
                funnyuaTargetTimer = funnyuaTargetTimer + dt
                if funnyuaTargetTimer >= 0.5 then
                        funnyuaTargetTimer = 0
                        pickTarget()
                end

                -- Get target position
                local targetPos = nil
                if funnyuaTarget and funnyuaTarget.Character and funnyuaTarget.Character:FindFirstChild('HumanoidRootPart') then
                        targetPos = funnyuaTarget.Character.HumanoidRootPart.Position
                end
                if not targetPos then return end

                angleOffset = angleOffset + (orbitSpeed * 0.01 * dt)

                for i, part in pairs(funnyuaParts) do
                        if part and part.Parent then
                                -- Each part gets a slightly different angle for chaos
                                local partAngleOffset = angleOffset + (i * 0.37)
                                -- Each part gets a slightly different radius for spiral effect
                                local partRadius = orbitRadius + math.sin(os.clock() * 3 + i) * 8
                                -- Jitter offset - random every frame for MAD jitter
                                local jitterX = math.random(-500, 500)
                                local jitterY = math.random(-300, 300)
                                local jitterZ = math.random(-500, 500)

                                -- Calculate orbit position around target
                                local targetOrbitPos = Vector3.new(
                                        targetPos.X + math.cos(partAngleOffset) * partRadius,
                                        targetPos.Y + 5 + math.sin(os.clock() * 5 + i * 0.7) * 4,
                                        targetPos.Z + math.sin(partAngleOffset) * partRadius
                                )

                                -- Combine orbit velocity with MAD jitter
                                local toTarget = targetOrbitPos - part.Position
                                if toTarget.Magnitude > 0.01 then
                                        part.Velocity = toTarget.Unit * orbitSpeed + Vector3.new(jitterX, jitterY, jitterZ)
                                else
                                        part.Velocity = Vector3.new(jitterX, jitterY, jitterZ)
                                end

                                -- Randomize spin direction periodically for extra chaos
                                if math.random() < 0.02 then
                                        local existingSpin = part:FindFirstChildOfClass('BodyAngularVelocity')
                                        if existingSpin then
                                                existingSpin.AngularVelocity = Vector3.new(
                                                        math.random(-9999, 9999),
                                                        math.random(-9999, 9999),
                                                        math.random(-9999, 9999)
                                                )
                                        end
                                end
                        end
                end
        end)

        showArcPopup('FunnyUA', true)
        notify('FunnyUA', 'ALL parts orbiting random players with MAD jitter & spin!')
end)

addcmd('unfunnyua', {'nofunnyua'}, function(args, speaker)
        funnyuaActive = false
        if funnyuaConn then funnyuaConn:Disconnect() funnyuaConn = nil end
        if funnyuaDiedConn then funnyuaDiedConn:Disconnect() funnyuaDiedConn = nil end
        for _, part in pairs(funnyuaParts or {}) do
                if part and part.Parent then
                        for _, x in pairs(part:GetChildren()) do
                                if x:IsA('BodyAngularVelocity') then x:Destroy() end
                        end
                        part.Velocity = Vector3.new(0, 0, 0)
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.CanCollide = true
                end
        end
        funnyuaParts = {}
        funnyuaTarget = nil
        funnyuaPart = nil
        showArcPopup('FunnyUA', false)
end)

addcmd('togglefunnyua', {}, function(args, speaker)
        execCmd(funnyuaActive and 'unfunnyua' or 'funnyua')
end)


-- ======================== AURA ========================
-- Orbitua with height=12, slow orbit, click = line fling with 999 velocity
-- Usage: aura  |  unaura / noaura to stop  |  toggleaura to toggle

auraActive = false
auraOrbitConn = nil
auraClickConn = nil
auraCenter = nil
auraAddConn = nil
auraRemoveConn = nil
auraDiedConn = nil
auraOrbitParts = {}
auraAnimTrack = nil
auraIdleTrack = nil

addcmd('aura', {}, function(args, speaker)
        if auraActive then execCmd('unaura') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('Aura', 'Character not found') return end
        enablePhysicsGodmode(speaker)

        local root = getRoot(char)
        local humanoid = char:FindFirstChildWhichIsA('Humanoid')

        -- Pre-load animations using game:GetObjects (same as lolspam)
        local function loadCatalogAnim(catId)
                local realAnimId = nil
                pcall(function()
                        local objs = game:GetObjects('rbxassetid://' .. catId)
                        for _, obj in pairs(objs) do
                                if obj:IsA('Animation') then
                                        realAnimId = obj.AnimationId
                                        break
                                end
                                for _, child in pairs(obj:GetChildren()) do
                                        if child:IsA('Animation') then
                                                realAnimId = child.AnimationId
                                                break
                                        end
                                end
                                if realAnimId then break end
                        end
                end)
                if not realAnimId then realAnimId = 'rbxassetid://' .. catId end
                local success, track = pcall(function()
                        local anim = Instance.new('Animation')
                        anim.AnimationId = realAnimId
                        return humanoid:LoadAnimation(anim)
                end)
                return success and track or nil
        end

        auraAnimTrack = loadCatalogAnim(129969317267234)  -- Firing anim (Invincible Mark's Stance)
        auraIdleTrack = loadCatalogAnim(82096188761745)   -- Idle anim (Aura Idle)

        if auraAnimTrack then
                auraAnimTrack.Looped = true
                auraAnimTrack.Priority = Enum.AnimationPriority.Action
        end
        if auraIdleTrack then
                auraIdleTrack.Looped = true
                auraIdleTrack.Priority = Enum.AnimationPriority.Action
        end

        auraCenter = Instance.new('Part')
        auraCenter.Name = randomString()
        auraCenter.Size = Vector3.new(1, 1, 1)
        auraCenter.Transparency = 1
        auraCenter.Anchored = true
        auraCenter.CanCollide = false
        auraCenter.Parent = workspace
        auraCenter.CFrame = root.CFrame

        auraOrbitParts = {}
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not char:IsAncestorOf(part) then
                                orbitua_prepPart(part)
                                table.insert(auraOrbitParts, part)
                        end
                end
        end

        auraActive = true

        -- Start idle animation right away
        if auraIdleTrack then
                pcall(function() auraIdleTrack:Play() end)
        end

        auraAddConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not auraActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if speaker.Character and speaker.Character:IsAncestorOf(p) then return end
                        for _, existing in pairs(auraOrbitParts) do
                                if existing == p then return end
                        end
                        orbitua_prepPart(p)
                        table.insert(auraOrbitParts, p)
                end)
        end)

        auraRemoveConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(auraOrbitParts) do
                        if existing == p then table.remove(auraOrbitParts, i) break end
                end
        end)

        if humanoid then
                auraDiedConn = humanoid.Died:Connect(function() execCmd('unaura') end)
        end

        local angleOffset = 0
        local auraOrbitSpeed = 150
        local auraOrbitRadius = 10
        local auraOrbitHeight = 12
        local flingActive = false
        local flingStartTime = 0
        local flingEndPos = Vector3.new(0, 0, 0)
        local flingParts = {}  -- stable sorted list built once per fling

        auraOrbitConn = RunService.Heartbeat:Connect(function(dt)
                if not auraActive then return end
                local r = getRoot(speaker.Character)
                if not r then return end

                auraCenter.CFrame = r.CFrame
                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                -- Clean dead parts
                local toRemove = {}
                for i, part in pairs(auraOrbitParts) do
                        if not part or not part.Parent then
                                table.insert(toRemove, i)
                        end
                end
                table.sort(toRemove, function(a, b) return a > b end)
                for _, idx in pairs(toRemove) do
                        table.remove(auraOrbitParts, idx)
                end

                local numParts = #auraOrbitParts

                if flingActive then
                        -- FLING MODE: line of spazzing parts from you to mouse
                        local elapsed = tick() - flingStartTime
                        if elapsed >= 3 then
                                flingActive = false
                                if auraAnimTrack then
                                        pcall(function() auraAnimTrack:Stop() end)
                                end
                                if auraIdleTrack then
                                        pcall(function() auraIdleTrack:Play() end)
                                end
                        else
                                if auraAnimTrack then
                                        pcall(function()
                                                if not auraAnimTrack.IsPlaying then
                                                        auraAnimTrack:Play()
                                                end
                                        end)
                                end

                                local startPos = r.Position
                                local fireDir = (flingEndPos - startPos).Unit
                                local fireDist = (flingEndPos - startPos).Magnitude
                                local idx2 = 0

                                for _, part in pairs(auraOrbitParts) do
                                        if part and part.Parent then
                                                idx2 = idx2 + 1
                                                -- Slot on the line with 3 stud gaps
                                                local slotDist = (idx2 - 1) * 3
                                                if slotDist > fireDist then slotDist = fireDist end
                                                local slotPos = startPos + fireDir * slotDist

                                                -- Spaz orbit around slot (5 stud radius, fast)
                                                local angle = os.clock() * 10 + idx2 * 1.5
                                                local targetPos = slotPos + Vector3.new(
                                                        math.cos(angle) * 5,
                                                        math.sin(os.clock() * 7 + idx2) * 3,
                                                        math.sin(angle) * 5
                                                )

                                                -- Raw velocity + MAD jitter (same as orbitallazer)
                                                local toTarget = targetPos - part.Position
                                                local jitterVel = Vector3.new(
                                                        math.random(-600, 600),
                                                        math.random(-400, 400),
                                                        math.random(-600, 600)
                                                )
                                                if toTarget.Magnitude > 0.01 then
                                                        part.Velocity = toTarget.Unit * 1000 + jitterVel
                                                else
                                                        part.Velocity = jitterVel
                                                end

                                                local spin = part:FindFirstChildWhichIsA('BodyAngularVelocity')
                                                if not spin then
                                                        spin = Instance.new('BodyAngularVelocity')
                                                        spin.Name = randomString()
                                                        spin.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
                                                        spin.P = math.huge
                                                        spin.Parent = part
                                                end
                                                spin.AngularVelocity = Vector3.new(500, 500, 500)
                                        end
                                end
                        end
                else
                        -- ORBIT MODE: slow orbitua orbit + spin animation
                        for i, part in pairs(auraOrbitParts) do
                                if part and part.Parent then
                                        local spin = part:FindFirstChildWhichIsA('BodyAngularVelocity')
                                        if not spin then
                                                spin = Instance.new('BodyAngularVelocity')
                                                spin.Name = randomString()
                                                spin.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
                                                spin.Parent = part
                                        end
                                        -- Tornado spin: each part gets a unique spin offset for variety
                                        local si = (i % 6)
                                        if si == 0 then
                                                spin.AngularVelocity = Vector3.new(30, 60, 15)
                                        elseif si == 1 then
                                                spin.AngularVelocity = Vector3.new(-20, -50, 25)
                                        elseif si == 2 then
                                                spin.AngularVelocity = Vector3.new(40, -30, -35)
                                        elseif si == 3 then
                                                spin.AngularVelocity = Vector3.new(-35, 45, -20)
                                        elseif si == 4 then
                                                spin.AngularVelocity = Vector3.new(25, -55, 40)
                                        else
                                                spin.AngularVelocity = Vector3.new(-45, 35, 30)
                                        end
                                end
                        end

                        angleOffset = angleOffset + (auraOrbitSpeed * 0.01 * dt)
                        local center = auraCenter.Position + Vector3.new(0, auraOrbitHeight, 0)

                        for i, part in pairs(auraOrbitParts) do
                                if part and part.Parent then
                                        local pos = part.Position
                                        local angle = math.atan2(pos.Z - center.Z, pos.X - center.X)
                                        local newAngle = angle + (auraOrbitSpeed * 0.01 * dt)
                                        local dist = (Vector3.new(pos.X, center.Y, pos.Z) - center).Magnitude
                                        local clampedDist = math.min(auraOrbitRadius, dist)

                                        local targetPos = Vector3.new(
                                                center.X + math.cos(newAngle) * clampedDist,
                                                center.Y + (auraOrbitHeight > 0 and (auraOrbitHeight * math.abs(math.sin((pos.Y - center.Y) / math.max(auraOrbitHeight, 1)))) or 0),
                                                center.Z + math.sin(newAngle) * clampedDist
                                        )

                                        local dir = (targetPos - pos)
                                        if dir.Magnitude > 0.01 then
                                                part.Velocity = dir.Unit * auraOrbitSpeed
                                        end
                                end
                        end
                end
        end)

        -- Click handler
        local mouse = speaker:FindFirstChildWhichIsA('PlayerMouse') or Players.LocalPlayer:GetMouse()
        if mouse then
                auraClickConn = mouse.Button1Down:Connect(function()
                        if not auraActive or flingActive then return end
                        local r = getRoot(char)
                        if not r then return end
                        if #auraOrbitParts == 0 then return end

                        local hitPos = r.Position + r.CFrame.LookVector * 20
                        pcall(function()
                                hitPos = mouse.Hit.Position
                        end)

                        flingActive = true
                        flingStartTime = tick()
                        flingEndPos = hitPos
                        -- Switch to firing animation
                        if auraIdleTrack then
                                pcall(function() auraIdleTrack:Stop() end)
                        end
                        if auraAnimTrack then
                                pcall(function()
                                        auraAnimTrack.TimePosition = 0
                                        auraAnimTrack:Play()
                                end)
                        end
                end)
        end

        showArcPopup('Aura', true)
        notify('Aura', 'Active! Left-click to fling')
end)

addcmd('unaura', {'noaura'}, function(args, speaker)
        auraActive = false
        if auraOrbitConn then auraOrbitConn:Disconnect() auraOrbitConn = nil end
        if auraClickConn then auraClickConn:Disconnect() auraClickConn = nil end
        if auraAddConn then auraAddConn:Disconnect() auraAddConn = nil end
        if auraRemoveConn then auraRemoveConn:Disconnect() auraRemoveConn = nil end
        if auraDiedConn then auraDiedConn:Disconnect() auraDiedConn = nil end

        for _, part in pairs(auraOrbitParts) do
                if part and part.Parent then
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.Velocity = Vector3.new(0, 0, 0)
                        pcall(function() part.CanCollide = true end)
                        -- Clean up spin + bodyposition objects we created
                        local spin = part:FindFirstChildWhichIsA('BodyAngularVelocity')
                        if spin then pcall(function() spin:Destroy() end) end
                        local bp = part:FindFirstChildWhichIsA('BodyPosition')
                        if bp then pcall(function() bp:Destroy() end) end
                end
        end
        auraOrbitParts = {}

        -- Stop and clean up animations
        if auraAnimTrack then
                pcall(function() auraAnimTrack:Stop() end)
                auraAnimTrack = nil
        end
        if auraIdleTrack then
                pcall(function() auraIdleTrack:Stop() end)
                auraIdleTrack = nil
        end

        pcall(function()
                if auraCenter and auraCenter.Parent then auraCenter:Destroy() end
        end)
        auraCenter = nil

        disablePhysicsGodmode(speaker)
        showArcPopup('Aura', false)
        notify('Aura', 'Disabled')
end)

addcmd('toggleaura', {}, function(args, speaker)
        if auraActive then execCmd('unaura') else execCmd('aura') end
end)



do
-- ======================== TUFF ANIM PACK ========================
-- Replaces idle animation with Demonic Aura Float (106673830660419)
-- Replaces run animation with Lord Walk (116003765711391)
-- Automatically switches between idle and run based on movement speed
-- Usage: tuffanim  |  untuffanim to stop  |  toggletuffanim to toggle

local tuffanimActive = false
local tuffanimIdleTrack = nil
local tuffanimRunTrack = nil
local tuffanimConn = nil
local tuffanimDiedConn = nil

local function loadTuffAnim(humanoid, catalogId)
        local realAnimId = nil
        pcall(function()
                local objs = game:GetObjects('rbxassetid://' .. catalogId)
                for _, obj in pairs(objs) do
                        if obj:IsA('Animation') then
                                realAnimId = obj.AnimationId
                                break
                        end
                        for _, child in pairs(obj:GetChildren()) do
                                if child:IsA('Animation') then
                                        realAnimId = child.AnimationId
                                        break
                                end
                        end
                        if realAnimId then break end
                end
        end)
        if not realAnimId then realAnimId = 'rbxassetid://' .. catalogId end

        local success, animObj = pcall(function()
                local anim = Instance.new('Animation')
                anim.AnimationId = realAnimId
                return humanoid:LoadAnimation(anim)
        end)

        if success and animObj then
                return animObj
        end

        -- Fallback: PlayEmoteAndGetAnimTrackById
        pcall(function()
                local track = humanoid:PlayEmoteAndGetAnimTrackById(catalogId)
                if track then return track end
        end)

        -- Fallback 2: AllowCustomAnimations
        pcall(function()
                StarterPlayer.AllowCustomAnimations = true
                local track = humanoid:PlayEmoteAndGetAnimTrackById(catalogId)
                if track then return track end
        end)

        return nil
end

addcmd('tuffanim', {'tuff'}, function(args, speaker)
        if tuffanimActive then execCmd('untuffanim') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('TuffAnim', 'Character not found') return end
        local hum = char:FindFirstChildWhichIsA('Humanoid')
        if not hum then notify('TuffAnim', 'Humanoid not found') return end

        tuffanimActive = true

        -- Load both animations
        tuffanimIdleTrack = loadTuffAnim(hum, 106673830660419)
        tuffanimRunTrack = loadTuffAnim(hum, 116003765711391)

        if tuffanimIdleTrack then
                tuffanimIdleTrack.Looped = true
                tuffanimIdleTrack.Priority = Enum.AnimationPriority.Action
        end
        if tuffanimRunTrack then
                tuffanimRunTrack.Looped = true
                tuffanimRunTrack.Priority = Enum.AnimationPriority.Action
        end

        if not tuffanimIdleTrack then
                notify('TuffAnim', 'Could not load idle anim - AllowCustomAnimations may be needed')
        end
        if not tuffanimRunTrack then
                notify('TuffAnim', 'Could not load run anim - AllowCustomAnimations may be needed')
        end

        local currentState = 'idle'  -- 'idle' or 'run'

        -- Heartbeat: detect movement speed, switch animations
        tuffanimConn = RunService.Heartbeat:Connect(function(dt)
                if not tuffanimActive then return end
                pcall(function()
                        local localHum = char:FindFirstChildWhichIsA('Humanoid')
                        if not localHum then return end

                        local root = getRoot(char)
                        if not root then return end

                        local speed = root.Velocity.Magnitude
                        local moving = speed > 1

                        -- Stop all non-tuffanim tracks
                        for _, track in pairs(localHum:GetPlayingAnimationTracks()) do
                                if track ~= tuffanimIdleTrack and track ~= tuffanimRunTrack then
                                        track:Stop()
                                end
                        end

                        if moving and currentState ~= 'run' then
                                -- Switch to run
                                currentState = 'run'
                                if tuffanimIdleTrack and tuffanimIdleTrack.IsPlaying then
                                        tuffanimIdleTrack:Stop()
                                end
                                if tuffanimRunTrack and not tuffanimRunTrack.IsPlaying then
                                        tuffanimRunTrack:Play()
                                end
                        elseif not moving and currentState ~= 'idle' then
                                -- Switch to idle
                                currentState = 'idle'
                                if tuffanimRunTrack and tuffanimRunTrack.IsPlaying then
                                        tuffanimRunTrack:Stop()
                                end
                                if tuffanimIdleTrack and not tuffanimIdleTrack.IsPlaying then
                                        tuffanimIdleTrack:Play()
                                end
                        end

                        -- Keep current anim playing if it stopped
                        if currentState == 'idle' and tuffanimIdleTrack and not tuffanimIdleTrack.IsPlaying then
                                tuffanimIdleTrack:Play()
                        elseif currentState == 'run' and tuffanimRunTrack and not tuffanimRunTrack.IsPlaying then
                                tuffanimRunTrack:Play()
                        end
                end)
        end)

        -- Play idle initially
        if tuffanimIdleTrack then
                tuffanimIdleTrack:Play()
        end

        -- Clean up on death
        tuffanimDiedConn = hum.Died:Connect(function() execCmd('untuffanim') end)

        showArcPopup('TuffAnim', true)
        notify('TuffAnim', 'Tuff Anim Pack active! Idle = Demonic Float, Run = Lord Walk')
end)

addcmd('untuffanim', {'notuffanim', 'notuff'}, function(args, speaker)
        tuffanimActive = false

        if tuffanimIdleTrack then
                pcall(function()
                        tuffanimIdleTrack:Stop()
                        tuffanimIdleTrack:Destroy()
                end)
                tuffanimIdleTrack = nil
        end

        if tuffanimRunTrack then
                pcall(function()
                        tuffanimRunTrack:Stop()
                        tuffanimRunTrack:Destroy()
                end)
                tuffanimRunTrack = nil
        end

        if tuffanimConn then tuffanimConn:Disconnect() tuffanimConn = nil end
        if tuffanimDiedConn then tuffanimDiedConn:Disconnect() tuffanimDiedConn = nil end

        showArcPopup('TuffAnim', false)
        notify('TuffAnim', 'Disabled')
end)

addcmd('toggletuffanim', {}, function(args, speaker)
        if tuffanimActive then execCmd('untuffanim') else execCmd('tuffanim') end
end)


-- ======================== LOL SPAM ========================
-- Plays a random emote from a curated list whenever you move, jump, or do anything
-- Cooldown between emotes so it doesn't instantly spam (0.5s)
-- Usage: lolspam  |  unlolspam to stop  |  togglelolspam to toggle

local lolspamActive = false
local lolspamConn = nil
local lolspamDiedConn = nil
local lolspamCurrentTrack = nil
local lolspamLastPlay = 0
local lolspamCooldown = 0.5
local lolspamLastSpeed = 0

local lolspamEmotes = {
        115542676494125,  -- Chill Sit Emote
        121953631628968,  -- 67 Emote Limited
        130373195204051,  -- Jumping Spider Emote
        136718529855726,  -- Spongebob Emote
        116090470406589,  -- Sit Floating Aura Emote
        103850856250914,  -- Relaxed Sitting Floating Super Chill
        131971360172149,  -- Sit Relax Chilling Pose Emote
        124111621764325,  -- Infinite Aura Farming V2
        120449791578755,  -- UFO EMOTE
        119008007290744,  -- Obby Head Original Emote
        79216795769647,   -- Tall Scary Creature
        95714033584938,   -- Body Phone
        87732725556692,   -- MASSIVE POOP EMOTE
}

local function loadLolEmote(humanoid, catalogId)
        local realAnimId = nil
        pcall(function()
                local objs = game:GetObjects('rbxassetid://' .. catalogId)
                for _, obj in pairs(objs) do
                        if obj:IsA('Animation') then
                                realAnimId = obj.AnimationId
                                break
                        end
                        for _, child in pairs(obj:GetChildren()) do
                                if child:IsA('Animation') then
                                        realAnimId = child.AnimationId
                                        break
                                end
                        end
                        if realAnimId then break end
                end
        end)
        if not realAnimId then realAnimId = 'rbxassetid://' .. catalogId end

        local success, animObj = pcall(function()
                local anim = Instance.new('Animation')
                anim.AnimationId = realAnimId
                return humanoid:LoadAnimation(anim)
        end)

        if success and animObj then return animObj end

        pcall(function()
                local track = humanoid:PlayEmoteAndGetAnimTrackById(catalogId)
                if track then return track end
        end)

        pcall(function()
                StarterPlayer.AllowCustomAnimations = true
                local track = humanoid:PlayEmoteAndGetAnimTrackById(catalogId)
                if track then return track end
        end)

        return nil
end

addcmd('lolspam', {}, function(args, speaker)
        if lolspamActive then execCmd('unlolspam') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('LolSpam', 'Character not found') return end
        local hum = char:FindFirstChildWhichIsA('Humanoid')
        if not hum then notify('LolSpam', 'Humanoid not found') return end

        lolspamActive = true
        lolspamLastPlay = 0
        lolspamLastSpeed = 0

        lolspamConn = RunService.Heartbeat:Connect(function(dt)
                if not lolspamActive then return end
                pcall(function()
                        local localHum = char:FindFirstChildWhichIsA('Humanoid')
                        if not localHum then return end
                        local root = getRoot(char)
                        if not root then return end

                        local now = tick()
                        if now - lolspamLastPlay < lolspamCooldown then return end

                        local speed = root.Velocity.Magnitude
                        local jumped = (localHum:GetState() == Enum.HumanoidStateType.Jumping)
                                or (localHum:GetState() == Enum.HumanoidStateType.Freefall)
                        local speedChange = math.abs(speed - lolspamLastSpeed) > 5
                        local isMoving = speed > 2

                        -- Trigger on: started moving, speed changed a lot, or jumped
                        if isMoving or speedChange or jumped then
                                -- Stop current emote
                                if lolspamCurrentTrack and lolspamCurrentTrack.IsPlaying then
                                        lolspamCurrentTrack:Stop()
                                end

                                -- Pick random emote
                                local catalogId = lolspamEmotes[math.random(1, #lolspamEmotes)]
                                local track = loadLolEmote(localHum, catalogId)
                                if track then
                                        track.Looped = false
                                        track.Priority = Enum.AnimationPriority.Action
                                        track:Play()
                                        lolspamCurrentTrack = track
                                        lolspamLastPlay = now
                                end

                                lolspamLastSpeed = speed
                        end
                end)
        end)

        lolspamDiedConn = hum.Died:Connect(function() execCmd('unlolspam') end)

        showArcPopup('LolSpam', true)
        notify('LolSpam', 'Random emote spam active! Move around to trigger')
end)

addcmd('unlolspam', {}, function(args, speaker)
        lolspamActive = false

        if lolspamCurrentTrack then
                pcall(function()
                        lolspamCurrentTrack:Stop()
                        lolspamCurrentTrack:Destroy()
                end)
                lolspamCurrentTrack = nil
        end

        if lolspamConn then lolspamConn:Disconnect() lolspamConn = nil end
        if lolspamDiedConn then lolspamDiedConn:Disconnect() lolspamDiedConn = nil end

        showArcPopup('LolSpam', false)
        notify('LolSpam', 'Disabled')
end)

addcmd('togglelolspam', {}, function(args, speaker)
        if lolspamActive then execCmd('unlolspam') else execCmd('lolspam') end
end)
end -- tuffanim + lolspam section


-- ======================== ORBITAL LAZER ========================
-- All unanchored parts follow your mouse position, spaz out like mad,
-- and your mouse can't interact with them (CanQuery = false).
-- Usage: orbitallazer  |  unorbitallazer to stop
orbitalLazerActive = false
orbitalLazerConn = nil
orbitalLazerDiedConn = nil
orbitalLazerParts = {}
orbitalLazerBucket = nil

addcmd('orbitallazer', {'orblazer', 'mouselazer'}, function(args, speaker)
        if orbitalLazerActive then execCmd('unorbitallazer') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('Orbital Lazer', 'Character not found') return end

        orbitalLazerActive = true
        orbitalLazerParts = {}

        -- Collect ALL unanchored parts (not from ANY player's character / body parts)
        local function isPlayerBodyPart(p)
                for _, plr in pairs(Players:GetPlayers()) do
                        if plr.Character and plr.Character:IsAncestorOf(p) then return true end
                end
                return false
        end

        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not isPlayerBodyPart(part) then
                                -- Strip constraints, zero friction, no collision, no mouse interaction
                                orbitua_prepPart(part)
                                part.CanQuery = false
                                -- Add max spin to every part
                                local spin = Instance.new('BodyAngularVelocity')
                                spin.Name = randomString()
                                spin.AngularVelocity = Vector3.new(math.random(-9999, 9999), math.random(-9999, 9999), math.random(-9999, 9999))
                                spin.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
                                spin.P = math.huge
                                spin.Parent = part
                                table.insert(orbitalLazerParts, part)
                        end
                end
        end

        -- Filter these parts from mouse target so they don't get selected/bugged

        -- Create a filter bucket that holds all the parts so mouse ignores them
        local filterBucket = Instance.new('Part')
        filterBucket.Name = randomString()
        filterBucket.Size = Vector3.new(0.1, 0.1, 0.1)
        filterBucket.Transparency = 1
        filterBucket.Anchored = true
        filterBucket.CanCollide = false
        filterBucket.CanQuery = false
        filterBucket.Parent = workspace
        orbitalLazerBucket = filterBucket
        -- Set TargetFilter to the bucket so mouse ignores everything in it
        IYMouse.TargetFilter = filterBucket
        -- Move all parts into the filter bucket so TargetFilter applies to them
        for _, part in pairs(orbitalLazerParts) do
                if part and part.Parent then
                        part.Parent = filterBucket
                end
        end

        -- Watch for new parts
        local addConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not orbitalLazerActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if isPlayerBodyPart(p) then return end
                        for _, existing in pairs(orbitalLazerParts) do if existing == p then return end end
                        orbitua_prepPart(p)
                        p.CanQuery = false
                        local spin = Instance.new('BodyAngularVelocity')
                        spin.Name = randomString()
                        spin.AngularVelocity = Vector3.new(math.random(-9999, 9999), math.random(-9999, 9999), math.random(-9999, 9999))
                        spin.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
                        spin.P = math.huge
                        spin.Parent = p
                        p.Parent = filterBucket
                        table.insert(orbitalLazerParts, p)
                end)
        end)

        local removeConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(orbitalLazerParts) do
                        if existing == p then table.remove(orbitalLazerParts, i) break end
                end
        end)

        local humanoid = char:FindFirstChildWhichIsA('Humanoid')
        if humanoid then
                orbitalLazerDiedConn = humanoid.Died:Connect(function() execCmd('unorbitallazer') end)
        end

        -- Main loop: all parts orbit mouse position with MAD jitter + spin
        local angleOffset = math.random() * math.pi * 2
        local orbitRadius = 12
        local orbitSpeed = 1000

        orbitalLazerConn = RunService.Heartbeat:Connect(function(dt)
                if not orbitalLazerActive then return end
                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                -- Get mouse 3D position
                local mousePos = IYMouse.Hit.Position
                if not mousePos then return end

                angleOffset = angleOffset + (orbitSpeed * 0.012 * dt)

                for i, part in pairs(orbitalLazerParts) do
                        if part and part.Parent then
                                -- Each part gets unique angle offset for chaos
                                local partAngle = angleOffset + (i * 0.41)
                                -- Varying radius per part for spiral/tornado effect
                                local partRadius = orbitRadius + math.sin(os.clock() * 4 + i * 0.5) * 6
                                -- MAD jitter every frame
                                local jitterX = math.random(-600, 600)
                                local jitterY = math.random(-400, 400)
                                local jitterZ = math.random(-600, 600)

                                -- Calculate orbit target position around mouse
                                local targetPos = Vector3.new(
                                        mousePos.X + math.cos(partAngle) * partRadius,
                                        mousePos.Y + 3 + math.sin(os.clock() * 6 + i * 0.8) * 5,
                                        mousePos.Z + math.sin(partAngle) * partRadius
                                )

                                -- Combine orbit velocity + MAD jitter
                                local toTarget = targetPos - part.Position
                                if toTarget.Magnitude > 0.01 then
                                        part.Velocity = toTarget.Unit * orbitSpeed + Vector3.new(jitterX, jitterY, jitterZ)
                                else
                                        part.Velocity = Vector3.new(jitterX, jitterY, jitterZ)
                                end

                                -- Randomize spin direction every so often for extra chaos
                                if math.random() < 0.03 then
                                        local existingSpin = part:FindFirstChildOfClass('BodyAngularVelocity')
                                        if existingSpin then
                                                existingSpin.AngularVelocity = Vector3.new(
                                                        math.random(-9999, 9999),
                                                        math.random(-9999, 9999),
                                                        math.random(-9999, 9999)
                                                )
                                        end
                                end
                        end
                end
        end)

        showArcPopup('Orbital Lazer', true)
        notify('Orbital Lazer', 'ALL parts following your mouse with MAD jitter & spin!')
end)

addcmd('unorbitallazer', {'noorbitallazer', 'unorblazer'}, function(args, speaker)
        orbitalLazerActive = false
        if orbitalLazerConn then orbitalLazerConn:Disconnect() orbitalLazerConn = nil end
        if orbitalLazerDiedConn then orbitalLazerDiedConn:Disconnect() orbitalLazerDiedConn = nil end
        -- Restore all parts back to workspace
        for _, part in pairs(orbitalLazerParts) do
                if part and part.Parent then
                        for _, x in pairs(part:GetChildren()) do
                                if x:IsA('BodyAngularVelocity') then x:Destroy() end
                        end
                        part.Velocity = Vector3.new(0, 0, 0)
                        part.CanQuery = true
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.CanCollide = true
                        -- Move back to workspace
                        pcall(function() part.Parent = workspace end)
                end
        end
        orbitalLazerParts = {}
        -- Clean up filter bucket
        IYMouse.TargetFilter = nil
        if orbitalLazerBucket and orbitalLazerBucket.Parent then
                orbitalLazerBucket:Destroy()
        end
        orbitalLazerBucket = nil
        showArcPopup('Orbital Lazer', false)
end)

addcmd('toggleorbitallazer', {}, function(args, speaker)
        execCmd(orbitalLazerActive and 'unorbitallazer' or 'orbitallazer')
end)


-- ======================== ARROW ========================
-- Grabs ALL unanchored parts from workspace and arranges them into a GIANT
-- arrow shape above the target player's head. Parts jitter and spin like mad.
-- Usage: arrow [player]  |  unarrow to stop
arrowActive = false
arrowConn = nil
arrowDiedConn = nil
arrowParts = {}

addcmd('arrow', {}, function(args, speaker)
        if arrowActive then execCmd('unarrow') return end

        if not args[1] then notify('Arrow', 'Usage: arrow [player]') return end
        -- Handle "me" like all other IY commands
        local targetName = args[1]
        if targetName == "me" then targetName = speaker.Name end
        local target = Players:FindFirstChild(targetName)
        if not target then
                -- Try partial name / display name match
                local found = getPlayersByName(targetName)
                if found and #found > 0 then target = found[1] end
        end
        if not target then notify('Arrow', 'Player not found!') return end
        if not target.Character or not target.Character:FindFirstChild('HumanoidRootPart') then
                notify('Arrow', 'Target has no character!') return end

        arrowActive = true
        arrowParts = {}
        arrowBPs = {} -- BodyPosition instances per part

        -- Filter out body parts from any player's character
        local function isPlayerBodyPart(p)
                for _, plr in pairs(Players:GetPlayers()) do
                        if plr.Character and plr.Character:IsAncestorOf(p) then return true end
                end
                return false
        end

        -- Prep a part for arrow: clear old physics objects, give HIGH friction so parts sit still
        local function prepArrowPart(part)
                for _, x in pairs(part:GetChildren()) do
                        if x:IsA('BodyAngularVelocity') or x:IsA('BodyForce') or x:IsA('BodyGyro') or x:IsA('BodyPosition') or x:IsA('BodyThrust') or x:IsA('BodyVelocity') or x:IsA('RocketPropulsion') or x:IsA('AlignPosition') or x:IsA('AlignOrientation') or x:IsA('Torque') then
                                x:Destroy()
                        end
                end
                -- HIGH friction + high density so parts are stable and don't drift
                part.CustomPhysicalProperties = PhysicalProperties.new(0.9, 8, 0, 100, 100)
                part.CanCollide = false
                part.Velocity = Vector3.new(0, 0, 0)
                part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                part.CanQuery = false
        end

        -- Collect ALL unanchored parts (not body parts)
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not isPlayerBodyPart(part) then
                                prepArrowPart(part)
                                -- Attach a BodyPosition for smooth, jitter-free tracking
                                local bp = Instance.new("BodyPosition")
                                bp.MaxForce = Vector3.new(50000, 50000, 50000)
                                bp.P = 30000   -- high stiffness = snaps fast to target
                                bp.D = 5000    -- high damping = no oscillation / jitter
                                bp.Parent = part
                                table.insert(arrowParts, part)
                                table.insert(arrowBPs, bp)
                        end
                end
        end

        if #arrowParts == 0 then
                arrowActive = false
                notify('Arrow', 'No unanchored parts found!')
                return
        end

        -- Watch for new parts
        local addConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not arrowActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if isPlayerBodyPart(p) then return end
                        for _, existing in pairs(arrowParts) do if existing == p then return end end
                        prepArrowPart(p)
                        local bp = Instance.new("BodyPosition")
                        bp.MaxForce = Vector3.new(50000, 50000, 50000)
                        bp.P = 30000
                        bp.D = 5000
                        bp.Parent = p
                        table.insert(arrowParts, p)
                        table.insert(arrowBPs, bp)
                end)
        end)

        local removeConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(arrowParts) do
                        if existing == p then
                                table.remove(arrowParts, i)
                                if arrowBPs[i] and arrowBPs[i].Parent then arrowBPs[i]:Destroy() end
                                table.remove(arrowBPs, i)
                                break
                        end
                end
        end)

        local humanoid = speaker.Character and speaker.Character:FindFirstChildWhichIsA('Humanoid')
        if humanoid then
                arrowDiedConn = humanoid.Died:Connect(function() execCmd('unarrow') end)
        end

        -- Build arrow shape: a big flat arrow ring pointing at the target, 100 stud radius, 15 studs above
        local function getArrowPositions(center, partCount)
                local positions = {}
                local radius = 100
                -- Distribute parts along the outline of a flat arrow shape (top-down, XZ plane)
                -- Arrow points toward the target (from center outward radially)
                -- We define the arrow in a local 2D space then rotate it to face downward on the player

                -- Arrow outline as 2D points (x forward, y right)
                local arrow2D = {
                        {0, 0},           -- tip (points toward target)
                        {-15, -8},       -- left wing tip
                        {-8, -3},        -- left wing inner
                        {-20, 0},        -- tail center
                        {-8, 3},         -- right wing inner
                        {-15, 8},        -- right wing tip
                }

                -- Total perimeter segments
                local segments = {}
                local totalLen = 0
                for i = 1, #arrow2D do
                        local a = arrow2D[i]
                        local b = arrow2D[(i % #arrow2D) + 1]
                        local segLen = math.sqrt((b[1]-a[1])^2 + (b[2]-a[2])^2)
                        table.insert(segments, {a, b, segLen})
                        totalLen = totalLen + segLen
                end

                -- Place parts evenly along the perimeter
                for i = 1, partCount do
                        local t = ((i - 1) / partCount) * totalLen
                        local accumulated = 0
                        for _, seg in ipairs(segments) do
                                if accumulated + seg[3] >= t then
                                        local localT = (t - accumulated) / seg[3]
                                        local lx = seg[1][1] + (seg[2][1] - seg[1][1]) * localT
                                        local ly = seg[1][2] + (seg[2][2] - seg[1][2]) * localT
                                        -- Scale to 100 stud radius: normalize then multiply
                                        local mag = math.sqrt(lx^2 + ly^2)
                                        if mag > 0 then
                                                local scale = radius / 20 -- 20 is the max extent of the arrow shape
                                                lx = lx * scale
                                                ly = ly * scale
                                        end
                                        -- Place on XZ plane, 15 studs above target
                                        table.insert(positions, center + Vector3.new(lx, 15, ly))
                                        break
                                end
                                accumulated = accumulated + seg[3]
                        end
                        if not positions[i] then
                                table.insert(positions, center + Vector3.new(0, 15, 0))
                        end
                end

                return positions
        end

        -- Main loop: position parts via BodyPosition (smooth, zero jitter)
        arrowConn = RunService.Heartbeat:Connect(function(dt)
                if not arrowActive then return end

                local root = target.Character and target.Character:FindFirstChild('HumanoidRootPart')
                if not root then execCmd('unarrow') return end

                local targetPos = root.Position
                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                local positions = getArrowPositions(targetPos, #arrowParts)

                for i, part in pairs(arrowParts) do
                        if part and part.Parent and positions[i] and arrowBPs[i] and arrowBPs[i].Parent then
                                arrowBPs[i].Position = positions[i]
                        end
                end
        end)

        showArcPopup('Arrow', true)
        notify('Arrow', #arrowParts .. ' parts forming arrow above ' .. target.Name .. '!')
end)

addcmd('unarrow', {'noarrow'}, function(args, speaker)
        arrowActive = false
        if arrowConn then arrowConn:Disconnect() arrowConn = nil end
        if arrowDiedConn then arrowDiedConn:Disconnect() arrowDiedConn = nil end
        -- Destroy all BodyPosition instances and restore parts
        for _, bp in pairs(arrowBPs) do
                if bp and bp.Parent then bp:Destroy() end
        end
        for _, part in pairs(arrowParts) do
                if part and part.Parent then
                        for _, x in pairs(part:GetChildren()) do
                                if x:IsA('BodyAngularVelocity') or x:IsA('BodyPosition') then x:Destroy() end
                        end
                        part.Velocity = Vector3.new(0, 0, 0)
                        part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                        part.CanQuery = true
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.CanCollide = true
                end
        end
        arrowParts = {}
        arrowBPs = {}
        showArcPopup('Arrow', false)
end)

addcmd('togglearrow', {}, function(args, speaker)
        execCmd(arrowActive and 'unarrow' or 'arrow me')
end)


-- ======================== ANTI UA ========================
-- Strips gravity from all unanchored parts. Parts slowly float upward and drift around.
-- Uses same collection pattern as orbitua + continuous Heartbeat loop for reliability.
antiuaActive = false
antiuaConn = nil
antiuaParts = {}
antiuaDiedConn = nil

addcmd('antiua', {}, function(args, speaker)
        if antiuaActive then execCmd('unantiua') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('AntiUA', 'Character not found') return end

        antiuaActive = true
        antiuaParts = {}

        -- Collect all unanchored parts (not from our character) — same pattern as orbitua
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not char:IsAncestorOf(part) then
                                orbitua_prepPart(part)
                                part.CanQuery = false
                                -- Random initial upward kick
                                part.Velocity = Vector3.new(
                                        math.random(-30, 30),
                                        math.random(20, 80),
                                        math.random(-30, 30)
                                )
                                part.AssemblyAngularVelocity = Vector3.new(
                                        math.random(-2, 2),
                                        math.random(-2, 2),
                                        math.random(-2, 2)
                                )
                                table.insert(antiuaParts, part)
                        end
                end
        end

        -- Watch for new parts — same pattern as orbitua
        local addConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not antiuaActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if speaker.Character and speaker.Character:IsAncestorOf(p) then return end
                        for _, existing in pairs(antiuaParts) do if existing == p then return end end
                        orbitua_prepPart(p)
                        p.CanQuery = false
                        p.Velocity = Vector3.new(math.random(-30,30), math.random(20,80), math.random(-30,30))
                        p.AssemblyAngularVelocity = Vector3.new(math.random(-2,2), math.random(-2,2), math.random(-2,2))
                        table.insert(antiuaParts, p)
                end)
        end)

        local removeConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(antiuaParts) do
                        if existing == p then table.remove(antiuaParts, i) break end
                end
        end)

        local humanoid = char:FindFirstChildWhichIsA('Humanoid')
        if humanoid then
                antiuaDiedConn = humanoid.Died:Connect(function() execCmd('unantiua') end)
        end

        -- Main loop: continuously apply upward velocity every frame (like orbitua's approach)
        antiuaConn = RunService.Heartbeat:Connect(function(dt)
                if not antiuaActive then return end
                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                for _, part in pairs(antiuaParts) do
                        if part and part.Parent then
                                -- Continuously push upward: cancel gravity + slight upward boost
                                -- gravity acceleration = workspace.Gravity studs/s^2
                                -- We need to counteract gravity's effect on velocity each frame
                                local gravityVel = workspace.Gravity * dt
                                -- Add a gentle upward drift on top of gravity cancellation
                                part.Velocity = Vector3.new(
                                        part.Velocity.X * 0.99,  -- slight horizontal drag for stability
                                        15 + math.sin(tick() * 2 + part.Position.X) * 5,  -- bobbing float upward
                                        part.Velocity.Z * 0.99
                                )
                        end
                end
        end)

        showArcPopup('AntiUA', true)
        notify('AntiUA', #antiuaParts .. ' parts now have anti-gravity!')
end)

addcmd('unantiua', {}, function(args, speaker)
        antiuaActive = false
        if antiuaConn then antiuaConn:Disconnect() antiuaConn = nil end
        if antiuaDiedConn then antiuaDiedConn:Disconnect() antiuaDiedConn = nil end
        for _, part in pairs(antiuaParts) do
                if part and part.Parent then
                        for _, x in pairs(part:GetChildren()) do
                                if x:IsA('BodyAngularVelocity') or x:IsA('BodyForce') or x:IsA('BodyGyro') or x:IsA('BodyPosition') or x:IsA('BodyThrust') or x:IsA('BodyVelocity') then
                                        x:Destroy()
                                end
                        end
                        part.Velocity = Vector3.new(0, 0, 0)
                        part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                        part.CanQuery = true
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.CanCollide = true
                end
        end
        antiuaParts = {}
        showArcPopup('AntiUA', false)
end)

addcmd('toggleantiua', {}, function(args, speaker)
        execCmd(antiuaActive and 'unantiua' or 'antiua')
end)


-- ======================== 0 GRAVITY UA ========================
-- Zero gravity on all unanchored parts. Parts float in place and drift very slowly,
-- like they're in space. No upward force, just pure weightlessness.
-- Uses same collection pattern as orbitua + continuous Heartbeat loop for reliability.
zeroGuaActive = false
zeroGuaConn = nil
zeroGuaParts = {}
zeroGuaDiedConn = nil

addcmd('0gravityua', {'zerogua', 'zerogravityua'}, function(args, speaker)
        if zeroGuaActive then execCmd('un0gravityua') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('0GravityUA', 'Character not found') return end

        zeroGuaActive = true
        zeroGuaParts = {}

        -- Collect all unanchored parts (not from our character) — same pattern as orbitua
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not char:IsAncestorOf(part) then
                                orbitua_prepPart(part)
                                part.CanQuery = false
                                -- Tiny random drift so parts slowly float like in space
                                part.Velocity = Vector3.new(
                                        math.random(-8, 8),
                                        math.random(-5, 8),
                                        math.random(-8, 8)
                                )
                                part.AssemblyAngularVelocity = Vector3.new(
                                        math.random(-1, 1),
                                        math.random(-1, 1),
                                        math.random(-1, 1)
                                )
                                table.insert(zeroGuaParts, part)
                        end
                end
        end

        -- Watch for new parts — same pattern as orbitua
        local addConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not zeroGuaActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if speaker.Character and speaker.Character:IsAncestorOf(p) then return end
                        for _, existing in pairs(zeroGuaParts) do if existing == p then return end end
                        orbitua_prepPart(p)
                        p.CanQuery = false
                        p.Velocity = Vector3.new(math.random(-8,8), math.random(-5,8), math.random(-8,8))
                        p.AssemblyAngularVelocity = Vector3.new(math.random(-1,1), math.random(-1,1), math.random(-1,1))
                        table.insert(zeroGuaParts, p)
                end)
        end)

        local removeConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(zeroGuaParts) do
                        if existing == p then table.remove(zeroGuaParts, i) break end
                end
        end)

        local humanoid = char:FindFirstChildWhichIsA('Humanoid')
        if humanoid then
                zeroGuaDiedConn = humanoid.Died:Connect(function() execCmd('un0gravityua') end)
        end

        -- Main loop: cancel gravity every frame + subtle drift nudge
        zeroGuaConn = RunService.Heartbeat:Connect(function(dt)
                if not zeroGuaActive then return end
                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                for _, part in pairs(zeroGuaParts) do
                        if part and part.Parent then
                                -- Cancel gravity's effect on velocity each frame
                                local gravityVel = workspace.Gravity * dt
                                -- Keep current horizontal drift, cancel vertical gravity pull
                                part.Velocity = Vector3.new(
                                        part.Velocity.X * 0.998,  -- very slow horizontal drag
                                        part.Velocity.Y + gravityVel,  -- cancel gravity pull
                                        part.Velocity.Z * 0.998
                                )
                        end
                end

                -- Every ~2 seconds, give parts a tiny random nudge for space drift
                if math.random() < dt * 0.5 then
                        for _, part in pairs(zeroGuaParts) do
                                if part and part.Parent then
                                        part.Velocity = Vector3.new(
                                                part.Velocity.X + math.random(-3, 3),
                                                part.Velocity.Y + math.random(-2, 3),
                                                part.Velocity.Z + math.random(-3, 3)
                                        )
                                end
                        end
                end
        end)

        showArcPopup('0GravityUA', true)
        notify('0GravityUA', #zeroGuaParts .. ' parts now in zero gravity!')
end)

addcmd('un0gravityua', {'unzerogua', 'unzerogravityua'}, function(args, speaker)
        zeroGuaActive = false
        if zeroGuaConn then zeroGuaConn:Disconnect() zeroGuaConn = nil end
        if zeroGuaDiedConn then zeroGuaDiedConn:Disconnect() zeroGuaDiedConn = nil end
        for _, part in pairs(zeroGuaParts) do
                if part and part.Parent then
                        for _, x in pairs(part:GetChildren()) do
                                if x:IsA('BodyAngularVelocity') or x:IsA('BodyForce') or x:IsA('BodyGyro') or x:IsA('BodyPosition') or x:IsA('BodyThrust') or x:IsA('BodyVelocity') then
                                        x:Destroy()
                                end
                        end
                        part.Velocity = Vector3.new(0, 0, 0)
                        part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                        part.CanQuery = true
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.CanCollide = true
                end
        end
        zeroGuaParts = {}
        showArcPopup('0GravityUA', false)
end)

addcmd('toggle0gravityua', {'togglezerogua', 'togglezerogravityua'}, function(args, speaker)
        execCmd(zeroGuaActive and 'un0gravityua' or '0gravityua')
end)


-- ======================== MOUSE UA ========================
-- Forms a line of ALL unanchored parts from your character to your mouse cursor.
-- Parts are positioned along the line using BodyPosition (smooth, no jitter).
-- Line updates every frame as you move your mouse.
mouseuaActive = false
mouseuaConn = nil
mouseuaParts = {}
mouseuaBPs = {}
mouseuaDiedConn = nil

addcmd('mouseua', {}, function(args, speaker)
        if mouseuaActive then execCmd('unmouseua') return end

        local char = speaker.Character
        local root = getRoot(char)
        if not char or not root then notify('MouseUA', 'Character not found') return end

        mouseuaActive = true
        mouseuaParts = {}
        mouseuaBPs = {}

        -- Collect all unanchored parts (not from our character) — same pattern as orbitua
        for _, part in pairs(workspace:GetDescendants()) do
                if part:IsA('BasePart') and not part.Anchored then
                        if not char:IsAncestorOf(part) then
                                orbitua_prepPart(part)
                                -- High friction so parts hold position in the line
                                part.CustomPhysicalProperties = PhysicalProperties.new(0.9, 8, 0, 100, 100)
                                part.CanQuery = false
                                part.Velocity = Vector3.new(0, 0, 0)
                                part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                -- BodyPosition for smooth positioning
                                local bp = Instance.new("BodyPosition")
                                bp.Name = "MouseUA_BP"
                                bp.MaxForce = Vector3.new(50000, 50000, 50000)
                                bp.P = 30000
                                bp.D = 5000
                                bp.Parent = part
                                table.insert(mouseuaParts, part)
                                table.insert(mouseuaBPs, bp)
                        end
                end
        end

        if #mouseuaParts == 0 then
                mouseuaActive = false
                notify('MouseUA', 'No unanchored parts found!')
                return
        end

        -- Watch for new parts — same pattern as orbitua
        local addConn = workspace.DescendantAdded:Connect(function(p)
                task.defer(function()
                        if not mouseuaActive then return end
                        if not p:IsA('BasePart') or p.Anchored then return end
                        if speaker.Character and speaker.Character:IsAncestorOf(p) then return end
                        for _, existing in pairs(mouseuaParts) do if existing == p then return end end
                        orbitua_prepPart(p)
                        p.CustomPhysicalProperties = PhysicalProperties.new(0.9, 8, 0, 100, 100)
                        p.CanQuery = false
                        p.Velocity = Vector3.new(0, 0, 0)
                        p.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                        local bp = Instance.new("BodyPosition")
                        bp.Name = "MouseUA_BP"
                        bp.MaxForce = Vector3.new(50000, 50000, 50000)
                        bp.P = 30000
                        bp.D = 5000
                        bp.Parent = p
                        table.insert(mouseuaParts, p)
                        table.insert(mouseuaBPs, bp)
                end)
        end)

        local removeConn = workspace.DescendantRemoving:Connect(function(p)
                for i, existing in pairs(mouseuaParts) do
                        if existing == p then
                                table.remove(mouseuaParts, i)
                                if mouseuaBPs[i] and mouseuaBPs[i].Parent then mouseuaBPs[i]:Destroy() end
                                table.remove(mouseuaBPs, i)
                                break
                        end
                end
        end)

        local humanoid = char:FindFirstChildWhichIsA('Humanoid')
        if humanoid then
                mouseuaDiedConn = humanoid.Died:Connect(function() execCmd('unmouseua') end)
        end

        -- Main loop: position parts in a line from player to mouse
        mouseuaConn = RunService.Heartbeat:Connect(function(dt)
                if not mouseuaActive then return end

                local myRoot = getRoot(speaker.Character)
                if not myRoot then execCmd('unmouseua') return end

                -- Get mouse position using camera raycasting
                local mousePos = IYMouse.Hit.Position

                local startPos = myRoot.Position
                local endPos = mousePos
                local dir = endPos - startPos
                local totalDist = dir.Magnitude
                if totalDist < 1 then return end
                local dirUnit = dir.Unit

                sethiddenproperty(speaker, "SimulationRadius", math.huge)

                -- Distribute parts evenly along the line
                local count = #mouseuaParts
                for i, part in pairs(mouseuaParts) do
                        if part and part.Parent and mouseuaBPs[i] and mouseuaBPs[i].Parent then
                                local t = (i - 1) / math.max(1, count - 1)
                                -- Offset each part slightly to the side based on index for visual thickness
                                local sideOffset = Vector3.new(0, 0, 0)
                                if count > 1 then
                                        -- Alternate sides: even indices go left, odd go right
                                        local layer = math.floor((i - 1) / 2)
                                        local side = ((i - 1) % 2 == 0) and -1 or 1
                                        local rightVec = dirUnit:Cross(Vector3.new(0, 1, 0)).Unit
                                        if rightVec and rightVec.Magnitude > 0.01 then
                                                sideOffset = rightVec * side * (layer + 1) * 0.5
                                        end
                                end
                                local pos = startPos + dirUnit * (t * totalDist) + sideOffset
                                mouseuaBPs[i].Position = pos
                        end
                end
        end)

        showArcPopup('MouseUA', true)
        notify('MouseUA', #mouseuaParts .. ' parts forming line to your mouse!')
end)

addcmd('unmouseua', {}, function(args, speaker)
        mouseuaActive = false
        if mouseuaConn then mouseuaConn:Disconnect() mouseuaConn = nil end
        if mouseuaDiedConn then mouseuaDiedConn:Disconnect() mouseuaDiedConn = nil end
        for _, bp in pairs(mouseuaBPs) do
                if bp and bp.Parent then bp:Destroy() end
        end
        for _, part in pairs(mouseuaParts) do
                if part and part.Parent then
                        for _, x in pairs(part:GetChildren()) do
                                if x.Name == "MouseUA_BP" or x:IsA('BodyPosition') then x:Destroy() end
                        end
                        part.Velocity = Vector3.new(0, 0, 0)
                        part.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                        part.CanQuery = true
                        pcall(function() part.CustomPhysicalProperties = nil end)
                        part.CanCollide = true
                end
        end
        mouseuaParts = {}
        mouseuaBPs = {}
        showArcPopup('MouseUA', false)
end)

addcmd('togglemouseua', {}, function(args, speaker)
        execCmd(mouseuaActive and 'unmouseua' or 'mouseua')
end)



-- ======================== DESYNC ========================
-- Purple transparent ghost mannequin. 100% Instance.new (ZERO Clone()).
-- Anchored parts + manual WASD movement via PivotTo.
-- Velocity-based jumping with gravity + ground raycast.
-- Transparent purple body + SelectionBox glow outlines + PointLight.
-- WASD + Space to move/jump. Q toggles. Undesync teleports back.
-- No fall damage. Supports R15 and R6.

desyncActive = false
desyncConn = nil
desyncGhostModel = nil
desyncRealChar = nil
desyncFrozenCFrame = nil
desyncGui = nil
desyncToggleGui = nil
desyncDiedConn = nil
desyncWalkSpeed = 16
desyncJumpPower = 50
desyncGhostPos = nil
desyncGhostYaw = 0
desyncGhostYVel = 0
desyncLastSpace = false
desyncOnGround = true
desyncFeetOffset = 3.2

-- Global hook: speed command updates ghost walk speed
function desync_applySpeed(newSpeed)
        if not desyncActive then return end
        desyncWalkSpeed = newSpeed or 16
end

-- ========== TOGGLE GUI (top-right button) ==========
local function desync_createToggleGui()
        if desyncToggleGui then return end
        local guiParent = PARENT or game:GetService('CoreGui')
        local sg = Instance.new('ScreenGui')
        sg.Name = randomString()
        sg.ResetOnSpawn = false
        sg.DisplayOrder = 100
        sg.Parent = guiParent
        local btn = Instance.new('TextButton')
        btn.Name = 'DesyncToggle'
        btn.Size = UDim2.new(0, 130, 0, 36)
        btn.Position = UDim2.new(1, -142, 0, 10)
        btn.BackgroundColor3 = Color3.fromRGB(95, 35, 170)
        btn.BackgroundTransparency = 0.1
        btn.BorderSizePixel = 0
        btn.AutoButtonColor = true
        btn.Text = 'DESYNC ON'
        btn.TextColor3 = Color3.fromRGB(220, 170, 255)
        btn.Font = Enum.Font.GothamBold
        btn.TextSize = 13
        btn.Parent = sg
        local corner = Instance.new('UICorner')
        corner.CornerRadius = UDim.new(0, 8)
        corner.Parent = btn
        local stroke = Instance.new('UIStroke')
        stroke.Name = 'Border'
        stroke.Color = Color3.fromRGB(170, 100, 255)
        stroke.Thickness = 2
        stroke.Transparency = 0.15
        stroke.Parent = btn
        local hint = Instance.new('TextLabel')
        hint.Name = 'KeyHint'
        hint.Size = UDim2.new(0, 16, 0, 16)
        hint.Position = UDim2.new(1, -22, 0, 2)
        hint.BackgroundTransparency = 1
        hint.Text = 'Q'
        hint.TextColor3 = Color3.fromRGB(200, 140, 255)
        hint.Font = Enum.Font.GothamBold
        hint.TextSize = 10
        hint.Parent = btn
        btn.MouseButton1Click:Connect(function()
                if desyncActive then
                        execCmd('undesync')
                else
                        execCmd('desync')
                end
        end)
        desyncToggleGui = sg
end

local function desync_destroyToggleGui()
        if desyncToggleGui and desyncToggleGui.Parent then
                desyncToggleGui:Destroy()
        end
        desyncToggleGui = nil
end

-- ========== Q KEY TOGGLE ==========
-- Always listening - toggles desync on/off with Q key
if desyncToggleQConn then
        pcall(function() desyncToggleQConn:Disconnect() end)
end
desyncToggleQConn = UserInputService.InputBegan:Connect(function(input, gp)
        if gp then return end
        if UserInputService:GetFocusedTextBox() then return end
        if input.KeyCode == Enum.KeyCode.Q then
                if desyncActive then
                        execCmd('undesync')
                else
                        execCmd('desync')
                end
        end
end)

-- ========== GHOST CREATION ==========
-- Builds mannequin from Instance.new only. No Clone(). Cannot fail.
-- All parts Anchored + Massless + CanCollide off + 0.5 Transparency.
-- Purple body (Bright violet), SmoothPlastic, SelectionBox glow.
-- Motor6D joints for R15 or R6. Dummy Humanoid for camera tracking.

local function createDesyncGhost(spawnCFrame)
        local model = Instance.new('Model')
        model.Name = 'DesyncGhost_' .. randomString()

        local function makePart(name, size, offset)
                local p = Instance.new('Part')
                p.Name = name
                p.Size = size
                p.Anchored = true
                p.Massless = true
                p.CanCollide = false
                p.BrickColor = BrickColor.new('Bright violet')
                p.Material = Enum.Material.SmoothPlastic
                p.Transparency = 0.5
                p.TopSurface = Enum.SurfaceType.Smooth
                p.BottomSurface = Enum.SurfaceType.Smooth
                p.CFrame = spawnCFrame * CFrame.new(offset)
                p.Parent = model
                -- SelectionBox glow outline on every visible part
                local sb = Instance.new('SelectionBox')
                sb.Adornee = p
                sb.Color3 = Color3.fromRGB(180, 100, 255)
                sb.Transparency = 0.3
                sb.LineThickness = 0.03
                sb.Parent = p
                return p
        end

        local function makeMotor(name, p0, p1, c0, c1)
                local m = Instance.new('Motor6D')
                m.Name = name
                m.Part0 = p0
                m.Part1 = p1
                m.C0 = c0
                m.C1 = c1
                m.Parent = p0
                return m
        end

        -- HumanoidRootPart (invisible, for PivotTo + camera)
        local rootPart = makePart('HumanoidRootPart', Vector3.new(2, 2, 1), Vector3.new(0, 0, 0))
        rootPart.Transparency = 1
        -- Remove SelectionBox from invisible root
        local rootSB = rootPart:FindFirstChildOfClass('SelectionBox')
        if rootSB then rootSB:Destroy() end

        -- Detect R15 vs R6
        local realChar = game:GetService('Players').LocalPlayer.Character
        local isR6 = false
        if realChar then
                local t = realChar:FindFirstChild('Torso')
                if t and t:IsA('BasePart') then isR6 = true end
        end

        if not isR6 then
                -- ===================== R15 =====================
                local lowerTorso = makePart('LowerTorso', Vector3.new(2, 0.6, 1), Vector3.new(0, 0, 0))
                local upperTorso = makePart('UpperTorso', Vector3.new(2, 1.2, 1), Vector3.new(0, 0.9, 0))
                local head = makePart('Head', Vector3.new(1.2, 1.2, 1.2), Vector3.new(0, 2.1, 0))

                local leftUpperArm = makePart('LeftUpperArm', Vector3.new(0.6, 1.2, 0.6), Vector3.new(-1.3, 1.4, 0))
                local leftLowerArm = makePart('LeftLowerArm', Vector3.new(0.5, 1.0, 0.5), Vector3.new(-1.3, 0.1, 0))
                local leftHand = makePart('LeftHand', Vector3.new(0.4, 0.5, 0.4), Vector3.new(-1.3, -0.65, 0))

                local rightUpperArm = makePart('RightUpperArm', Vector3.new(0.6, 1.2, 0.6), Vector3.new(1.3, 1.4, 0))
                local rightLowerArm = makePart('RightLowerArm', Vector3.new(0.5, 1.0, 0.5), Vector3.new(1.3, 0.1, 0))
                local rightHand = makePart('RightHand', Vector3.new(0.4, 0.5, 0.4), Vector3.new(1.3, -0.65, 0))

                local leftUpperLeg = makePart('LeftUpperLeg', Vector3.new(0.6, 1.2, 0.6), Vector3.new(-0.5, -0.9, 0))
                local leftLowerLeg = makePart('LeftLowerLeg', Vector3.new(0.5, 1.2, 0.5), Vector3.new(-0.5, -2.2, 0))
                local leftFoot = makePart('LeftFoot', Vector3.new(0.6, 0.3, 1.0), Vector3.new(-0.5, -3.05, -0.15))

                local rightUpperLeg = makePart('RightUpperLeg', Vector3.new(0.6, 1.2, 0.6), Vector3.new(0.5, -0.9, 0))
                local rightLowerLeg = makePart('RightLowerLeg', Vector3.new(0.5, 1.2, 0.5), Vector3.new(0.5, -2.2, 0))
                local rightFoot = makePart('RightFoot', Vector3.new(0.6, 0.3, 1.0), Vector3.new(0.5, -3.05, -0.15))

                makeMotor('Root', rootPart, lowerTorso, CFrame.new(0, -1, 0), CFrame.new(0, 0, 0))
                makeMotor('Waist', lowerTorso, upperTorso, CFrame.new(0, 0.3, 0), CFrame.new(0, 0.6, 0))
                makeMotor('Neck', upperTorso, head, CFrame.new(0, 0.6, 0), CFrame.new(0, -0.6, 0))
                makeMotor('Left Shoulder', upperTorso, leftUpperArm, CFrame.new(-1, 0.5, 0), CFrame.new(0.5, -0.6, 0))
                makeMotor('Left Elbow', leftUpperArm, leftLowerArm, CFrame.new(0, -0.6, 0), CFrame.new(0, 0.5, 0))
                makeMotor('Left Wrist', leftLowerArm, leftHand, CFrame.new(0, -0.5, 0), CFrame.new(0, 0.25, 0))
                makeMotor('Right Shoulder', upperTorso, rightUpperArm, CFrame.new(1, 0.5, 0), CFrame.new(-0.5, -0.6, 0))
                makeMotor('Right Elbow', rightUpperArm, rightLowerArm, CFrame.new(0, -0.6, 0), CFrame.new(0, 0.5, 0))
                makeMotor('Right Wrist', rightLowerArm, rightHand, CFrame.new(0, -0.5, 0), CFrame.new(0, 0.25, 0))
                makeMotor('Left Hip', lowerTorso, leftUpperLeg, CFrame.new(-0.5, -0.3, 0), CFrame.new(0, 0.6, 0))
                makeMotor('Left Knee', leftUpperLeg, leftLowerLeg, CFrame.new(0, -0.6, 0), CFrame.new(0, 0.6, 0))
                makeMotor('Left Ankle', leftLowerLeg, leftFoot, CFrame.new(0, -0.6, 0), CFrame.new(0, 0.15, -0.1))
                makeMotor('Right Hip', lowerTorso, rightUpperLeg, CFrame.new(0.5, -0.3, 0), CFrame.new(0, 0.6, 0))
                makeMotor('Right Knee', rightUpperLeg, rightLowerLeg, CFrame.new(0, -0.6, 0), CFrame.new(0, 0.6, 0))
                makeMotor('Right Ankle', rightLowerLeg, rightFoot, CFrame.new(0, -0.6, 0), CFrame.new(0, 0.15, -0.1))

                desyncFeetOffset = 3.2
        else
                -- ===================== R6 =====================
                local torso = makePart('Torso', Vector3.new(2, 2, 1), Vector3.new(0, 0, 0))
                local head = makePart('Head', Vector3.new(1.2, 1.2, 1.2), Vector3.new(0, 1.6, 0))

                local leftArm = makePart('Left Arm', Vector3.new(0.6, 2, 0.6), Vector3.new(-1.3, 0, 0))
                local rightArm = makePart('Right Arm', Vector3.new(0.6, 2, 0.6), Vector3.new(1.3, 0, 0))
                local leftLeg = makePart('Left Leg', Vector3.new(0.6, 2, 0.6), Vector3.new(-0.5, -2, 0))
                local rightLeg = makePart('Right Leg', Vector3.new(0.6, 2, 0.6), Vector3.new(0.5, -2, 0))

                makeMotor('Root', rootPart, torso, CFrame.new(0, -1, 0), CFrame.new(0, 1, 0))
                makeMotor('Neck', torso, head, CFrame.new(0, 1, 0), CFrame.new(0, -0.6, 0))
                makeMotor('Left Shoulder', torso, leftArm, CFrame.new(-1, 0.5, 0), CFrame.new(0.5, -0.5, 0))
                makeMotor('Right Shoulder', torso, rightArm, CFrame.new(1, 0.5, 0), CFrame.new(-0.5, -0.5, 0))
                makeMotor('Left Hip', torso, leftLeg, CFrame.new(-0.5, -1, 0), CFrame.new(0, 1, 0))
                makeMotor('Right Hip', torso, rightLeg, CFrame.new(0.5, -1, 0), CFrame.new(0, 1, 0))

                desyncFeetOffset = 3.0
        end

        -- PrimaryPart for PivotTo
        model.PrimaryPart = rootPart

        -- Dummy Humanoid for camera tracking only (parts anchored, so it won't move them)
        local hum = Instance.new('Humanoid')
        hum.DisplayName = ''
        hum.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None
        hum.HealthDisplayType = Enum.HumanoidHealthDisplayType.NeverDisplay
        hum.MaxHealth = 999999999
        hum.Health = 999999999
        hum.WalkSpeed = 0
        hum.JumpPower = 0
        hum.Parent = model

        -- Ambient purple glow light
        pcall(function()
                local light = Instance.new('PointLight')
                light.Color = Color3.fromRGB(180, 100, 255)
                light.Brightness = 1.5
                light.Range = 15
                light.Shadows = false
                local torsoPart = model:FindFirstChild('UpperTorso') or model:FindFirstChild('Torso') or rootPart
                light.Parent = torsoPart
        end)

        -- Parent to workspace and snap to spawn
        model.Parent = workspace
        pcall(function() model:PivotTo(spawnCFrame) end)

        return model
end

-- ========== DESYNC COMMAND ==========
addcmd('desync', {}, function(args, speaker)
        if desyncActive then execCmd('undesync') return end

        local char = speaker.Character
        if not char or not getRoot(char) then
                notify('Desync', 'Character not found!')
                return
        end

        local root = getRoot(char)
        local humanoid = char:FindFirstChildWhichIsA('Humanoid')

        -- Save state
        desyncFrozenCFrame = root.CFrame
        desyncRealChar = char
        desyncWalkSpeed = humanoid and humanoid.WalkSpeed or 16
        desyncJumpPower = humanoid and humanoid.JumpPower or 50
        if desyncJumpPower < 30 then desyncJumpPower = 50 end
        desyncLastSpace = false
        desyncGhostYVel = 0
        desyncOnGround = true

        -- Create ghost (Instance.new only, cannot fail)
        desyncGhostModel = createDesyncGhost(desyncFrozenCFrame)
        if not desyncGhostModel then
                notify('Desync', 'Failed to create ghost!')
                desyncRealChar = nil
                desyncFrozenCFrame = nil
                return
        end

        local ghostRoot = desyncGhostModel:FindFirstChild('HumanoidRootPart')
        local ghostHum = desyncGhostModel:FindFirstChildWhichIsA('Humanoid')
        if not ghostRoot then
                notify('Desync', 'Ghost missing root part!')
                pcall(function() desyncGhostModel:Destroy() end)
                desyncGhostModel = nil
                desyncRealChar = nil
                desyncFrozenCFrame = nil
                return
        end

        -- Initialize ghost position from spawn CFrame
        desyncGhostPos = desyncFrozenCFrame.Position
        desyncGhostYaw = math.atan2(desyncFrozenCFrame.LookVector.X, desyncFrozenCFrame.LookVector.Z)

        -- Anchor real body (freezes you on the server)
        for _, part in pairs(char:GetDescendants()) do
                if part:IsA('BasePart') then
                        part.Anchored = true
                        part.CanCollide = false
                end
        end

        -- Camera follows ghost
        pcall(function()
                workspace.CurrentCamera.CameraType = Enum.CameraType.Custom
                workspace.CurrentCamera.CameraSubject = ghostHum or ghostRoot
        end)

        desyncActive = true

        -- ========== MAIN HEARTBEAT LOOP ==========
        desyncConn = RunService.Heartbeat:Connect(function(dt)
                if not desyncActive then return end
                if not desyncGhostModel or not desyncGhostModel.Parent then
                        execCmd('undesync')
                        return
                end
                if not ghostRoot or not ghostRoot.Parent then
                        execCmd('undesync')
                        return
                end

                -- 1. Keep real body frozen at original position
                if desyncRealChar and desyncRealChar.Parent then
                        local realRoot = getRoot(desyncRealChar)
                        if realRoot then
                                pcall(function()
                                        realRoot.CFrame = desyncFrozenCFrame
                                        realRoot.Velocity = Vector3.new(0, 0, 0)
                                        realRoot.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                                end)
                        end
                end

                -- 2. Read WASD directly from UserInputService
                local camCF = workspace.CurrentCamera.CFrame
                local fwd = Vector3.new(camCF.LookVector.X, 0, camCF.LookVector.Z)
                if fwd.Magnitude > 0.001 then
                        fwd = fwd.Unit
                else
                        fwd = Vector3.new(0, 0, -1)
                end
                local rgt = Vector3.new(camCF.RightVector.X, 0, camCF.RightVector.Z)
                if rgt.Magnitude > 0.001 then
                        rgt = rgt.Unit
                else
                        rgt = Vector3.new(1, 0, 0)
                end

                local moveDir = Vector3.new(0, 0, 0)
                local uis = UserInputService
                if not uis:GetFocusedTextBox() then
                        if uis:IsKeyDown(Enum.KeyCode.W) then moveDir = moveDir + fwd end
                        if uis:IsKeyDown(Enum.KeyCode.S) then moveDir = moveDir - fwd end
                        if uis:IsKeyDown(Enum.KeyCode.A) then moveDir = moveDir - rgt end
                        if uis:IsKeyDown(Enum.KeyCode.D) then moveDir = moveDir + rgt end
                end

                -- 3. Apply horizontal movement
                if moveDir.Magnitude > 0.01 then
                        moveDir = moveDir.Unit
                        desyncGhostPos = desyncGhostPos + moveDir * desyncWalkSpeed * dt
                        desyncGhostYaw = math.atan2(moveDir.X, moveDir.Z)
                end

                -- 4. Jump (edge-triggered on Space)
                local spaceNow = uis:IsKeyDown(Enum.KeyCode.Space)
                if spaceNow and not desyncLastSpace and desyncOnGround then
                        desyncGhostYVel = desyncJumpPower
                        desyncOnGround = false
                end
                desyncLastSpace = spaceNow

                -- 5. Apply gravity when airborne
                if not desyncOnGround then
                        desyncGhostYVel = desyncGhostYVel - workspace.Gravity * dt
                        -- No fall damage: cap downward velocity
                        if desyncGhostYVel < -80 then
                                desyncGhostYVel = -80
                        end
                end

                -- 6. Update vertical position when airborne
                if not desyncOnGround then
                        desyncGhostPos = desyncGhostPos + Vector3.new(0, desyncGhostYVel * dt, 0)
                end

                -- 7. Ground raycast
                pcall(function()
                        local rayParams = RaycastParams.new()
                        rayParams.FilterDescendantsInstances = {desyncGhostModel}
                        rayParams.FilterType = Enum.RaycastFilterType.Exclude

                        -- Long ray when airborne to detect ground from far above
                        local rayLen = desyncOnGround and (desyncFeetOffset + 2) or (desyncFeetOffset + 25)
                        local rayOrigin = desyncGhostPos + Vector3.new(0, 1, 0)
                        local result = workspace:Raycast(rayOrigin, Vector3.new(0, -rayLen, 0), rayParams)

                        if result then
                                local standY = result.Position.Y + desyncFeetOffset
                                if desyncOnGround then
                                        -- On ground: snap to terrain surface
                                        desyncGhostPos = Vector3.new(desyncGhostPos.X, standY, desyncGhostPos.Z)
                                elseif desyncGhostYVel <= 0 and desyncGhostPos.Y <= standY + 0.5 then
                                        -- Landing: snap to ground, reset velocity
                                        desyncGhostPos = Vector3.new(desyncGhostPos.X, standY, desyncGhostPos.Z)
                                        desyncGhostYVel = 0
                                        desyncOnGround = true
                                end
                        else
                                -- No ground detected below
                                if desyncOnGround then
                                        -- Walked off an edge
                                        desyncOnGround = false
                                end
                        end
                end)

                -- 8. Anti-void teleport
                if desyncGhostPos.Y < -500 then
                        desyncGhostPos = Vector3.new(desyncFrozenCFrame.X, desyncFrozenCFrame.Y + 10, desyncFrozenCFrame.Z)
                        desyncGhostYVel = 0
                        desyncOnGround = false
                end

                -- 9. Move ghost via PivotTo (moves all anchored parts together)
                pcall(function()
                        local finalCF = CFrame.new(desyncGhostPos) * CFrame.Angles(0, desyncGhostYaw, 0)
                        desyncGhostModel:PivotTo(finalCF)
                end)

                -- 10. Keep camera locked to ghost
                pcall(function()
                        local subject = workspace.CurrentCamera.CameraSubject
                        if subject ~= ghostHum and subject ~= ghostRoot then
                                workspace.CurrentCamera.CameraSubject = ghostHum or ghostRoot
                        end
                end)
        end)

        -- Death cleanup
        if humanoid then
                desyncDiedConn = humanoid.Died:Connect(function()
                        execCmd('undesync')
                end)
        end

        -- ========== HUD GUI (top-center banner) ==========
        local guiParent = PARENT or game:GetService('CoreGui')
        local sg = Instance.new('ScreenGui')
        sg.Name = randomString()
        sg.ResetOnSpawn = false
        sg.DisplayOrder = 99
        sg.Parent = guiParent
        local frame = Instance.new('Frame')
        frame.Size = UDim2.new(0, 460, 0, 38)
        frame.Position = UDim2.new(0.5, -230, 0, 10)
        frame.BackgroundColor3 = Color3.fromRGB(15, 8, 30)
        frame.BackgroundTransparency = 0.1
        frame.BorderSizePixel = 0
        frame.Parent = sg
        local corner = Instance.new('UICorner')
        corner.CornerRadius = UDim.new(0, 10)
        corner.Parent = frame
        local stroke = Instance.new('UIStroke')
        stroke.Color = Color3.fromRGB(120, 70, 200)
        stroke.Thickness = 1.5
        stroke.Transparency = 0.2
        stroke.Parent = frame
        local tl = Instance.new('TextLabel')
        tl.Size = UDim2.new(1, -16, 1, 0)
        tl.Position = UDim2.new(0, 8, 0, 0)
        tl.BackgroundTransparency = 1
        tl.Text = 'DESYNC ACTIVE  |  WASD move  |  SPACE jump  |  Q / undesync to teleport back'
        tl.TextColor3 = Color3.fromRGB(200, 170, 255)
        tl.TextStrokeColor3 = Color3.fromRGB(60, 20, 120)
        tl.TextStrokeTransparency = 0.5
        tl.Font = Enum.Font.GothamBold
        tl.TextSize = 12
        tl.TextWrapped = true
        tl.Parent = frame
        desyncGui = sg

        -- Toggle button (top-right)
        desync_createToggleGui()

        showArcPopup('Desync', true)
        notify('Desync', 'Ghost active! WASD + Space. Q or undesync to teleport back.')
end)

-- ========== UNDESYNC ==========
addcmd('undesync', {}, function(args, speaker)
        if not desyncActive then return end
        desyncActive = false

        -- Disconnect loops
        if desyncConn then desyncConn:Disconnect() desyncConn = nil end
        if desyncDiedConn then desyncDiedConn:Disconnect() desyncDiedConn = nil end

        -- Save ghost position for teleport
        local ghostCFrame = desyncFrozenCFrame
        if desyncGhostPos then
                ghostCFrame = CFrame.new(desyncGhostPos) * CFrame.Angles(0, desyncGhostYaw, 0)
        end

        -- Destroy ghost
        if desyncGhostModel and desyncGhostModel.Parent then
                pcall(function() desyncGhostModel:Destroy() end)
        end
        desyncGhostModel = nil

        -- Unanchor real body
        local char = desyncRealChar or speaker.Character
        if char then
                for _, part in pairs(char:GetDescendants()) do
                        if part:IsA('BasePart') then
                                pcall(function()
                                        part.Anchored = false
                                        part.CanCollide = true
                                end)
                        end
                end
        end

        -- Teleport real body to ghost position
        if char then
                local root = getRoot(char)
                if root and ghostCFrame then
                        pcall(function() root.CFrame = ghostCFrame end)
                end
        end

        -- Restore camera to real character
        pcall(function()
                workspace.CurrentCamera.CameraType = Enum.CameraType.Custom
                if char and char.Parent then
                        local hum = char:FindFirstChildWhichIsA('Humanoid')
                        if hum and hum.Parent then
                                workspace.CurrentCamera.CameraSubject = hum
                        else
                                local r = getRoot(char)
                                if r then workspace.CurrentCamera.CameraSubject = r end
                        end
                end
        end)

        -- Safety loop: keep unanchoring for 3 seconds in case game re-anchors
        local charRef = char
        task.spawn(function()
                for i = 1, 15 do
                        task.wait(0.2)
                        if not charRef or not charRef.Parent then break end
                        for _, part in pairs(charRef:GetDescendants()) do
                                if part:IsA('BasePart') and part.Anchored then
                                        pcall(function() part.Anchored = false end)
                                end
                        end
                        if charRef.Parent then
                                local hum = charRef:FindFirstChildWhichIsA('Humanoid')
                                if hum and hum.Parent then
                                        pcall(function()
                                                workspace.CurrentCamera.CameraSubject = hum
                                        end)
                                end
                        end
                end
        end)

        -- Clean up state
        desyncFrozenCFrame = nil
        desyncRealChar = nil
        desyncWalkSpeed = 16
        desyncJumpPower = 50
        desyncGhostPos = nil
        desyncGhostYaw = 0
        desyncGhostYVel = 0
        desyncLastSpace = false
        desyncOnGround = true

        -- Destroy GUIs
        if desyncGui and desyncGui.Parent then desyncGui:Destroy() end
        desyncGui = nil
        desync_destroyToggleGui()

        showArcPopup('Desync', false)
        notify('Desync', 'Teleported to ghost position!')
end)

addcmd('toggledesync', {}, function(args, speaker)
        if desyncActive then
                execCmd('undesync')
        else
                execCmd('desync')
        end
end)

addcmd("arcdesync", {}, function(args, speaker)
        if ArcGUI.Panels["arcdesync"] then ArcGUI.ClosePanel("arcdesync") return end
        local p = ArcGUI.CreatePanel("arcdesync", "Desync", nil)

        local infoLabel = ArcGUI.CreateButton(p, "Walk ghost around, undesync to teleport", function() end)

        local toggle = ArcGUI.CreateToggle(p, "Desync", desyncActive, function(state)
                if state then
                        execCmd("desync")
                else
                        execCmd("undesync")
                end
        end)

        local btn = ArcGUI.CreateButton(p, "TELEPORT BACK", function()
                execCmd("undesync")
                if p.ToggleStates and p.ToggleStates[toggle] then
                        p.ToggleStates[toggle] = false
                end
        end)
end)


-- ======================== LUMBER (LOAD KRON HUB) ========================
addcmd('lumber', {}, function(args, speaker)
        notify('Arc Yield', 'Loading Kron Hub (Lumber)...')
        local success, err = pcall(function()
                loadstring(game:HttpGet('https://raw.githubusercontent.com/DevKron/Kron_Hub/refs/heads/main/version_1.0'))("")
        end)
        if not success then
                notify('Arc Yield', 'Failed to load Kron Hub: ' .. tostring(err))
        end
end)


-- ======================== GRAB PARTS (LOAD SCRIPT) ========================
addcmd('grabparts', {}, function(args, speaker)
        notify('Arc Yield', 'Loading Grab Parts...')
        local success, err = pcall(function()
                loadstring(game:HttpGet("https://pastebin.com/raw/8Hzgb66U"))()
        end)
        if not success then
                notify('Arc Yield', 'Failed to load Grab Parts: ' .. tostring(err))
        end
end)


-- ======================== BUILD A BOAT (LOAD BABFT SCRIPT) ========================
addcmd('buildaboat', {'bab', 'babft'}, function(args, speaker)
        notify('Arc Yield', 'Loading Build A Boat (takes ~5 sec)...')
        local success, err = pcall(function()
                loadstring(game:HttpGet('https://raw.githubusercontent.com/TheRealAsu/BABFT/refs/heads/main/Loader.lua'))()
        end)
        if not success then
                notify('Arc Yield', 'Failed to load Build A Boat: ' .. tostring(err))
        end
end)


-- ======================== ARC YIELD: 50 CUSTOM COMMANDS ========================
-- Useful in ANY Roblox game. Organized by category.

-- FindPlayer compatibility - partial name match like IY
function FindPlayer(name, speaker)
    if not name or name == "" then return nil end
    local found = getPlayersByName(name)
    if found and #found > 0 then return found[1] end
    return nil
end

-- =================== MOVEMENT (1-10) ===================

-- 1. hyperspeed [num] - Velocity-based movement that bypasses normal WalkSpeed cap
hyperSpeedConn = nil
addcmd('hyperspeed', {'hspeed'}, function(args, speaker)
        if hyperSpeedConn then hyperSpeedConn:Disconnect() hyperSpeedConn = nil
                local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
                if h then h.WalkSpeed = 16 end
                return notify('Hyperspeed','OFF') end
        local spd = tonumber(args[1]) or 150
        local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
        if h then h.WalkSpeed = 0 end
        local u = game:GetService('UserInputService')
        hyperSpeedConn = RunService.Heartbeat:Connect(function()
                local r = getRoot(speaker.Character) if not r then return end
                local cf = workspace.CurrentCamera.CFrame
                local d = Vector3.new(0,0,0)
                if u:IsKeyDown(Enum.KeyCode.W) then d = d + cf.LookVector end
                if u:IsKeyDown(Enum.KeyCode.S) then d = d - cf.LookVector end
                if u:IsKeyDown(Enum.KeyCode.A) then d = d - cf.RightVector end
                if u:IsKeyDown(Enum.KeyCode.D) then d = d + cf.RightVector end
                if d.Magnitude > 0 then r.Velocity = Vector3.new(d.Unit.X*spd, r.Velocity.Y, d.Unit.Z*spd)
                else r.Velocity = Vector3.new(0, r.Velocity.Y, 0) end
        end)
        notify('Hyperspeed', spd .. ' studs/s')
end)

-- 2. superjump [num] - High impulse jump every time you press space
superJumpConn = nil
addcmd('superjump', {'sjump'}, function(args, speaker)
        if superJumpConn then superJumpConn:Disconnect() superJumpConn = nil
                return notify('Super Jump','OFF') end
        local pwr = tonumber(args[1]) or 150
        local u = game:GetService('UserInputService')
        superJumpConn = u.JumpRequest:Connect(function()
                local r = getRoot(speaker.Character)
                if r then r.Velocity = Vector3.new(r.Velocity.X, pwr, r.Velocity.Z) end
        end)
        notify('Super Jump', 'Power: ' .. pwr)
end)

-- 3. bhop / unbhop - Auto bunny hop while moving
bhopConn = nil
addcmd('bhop', {}, function(args, speaker)
        if bhopConn then bhopConn:Disconnect() bhopConn = nil
                return notify('BHop','OFF') end
        bhopConn = RunService.Heartbeat:Connect(function()
                local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
                if h and h.MoveDirection.Magnitude > 0 then
                        local state = h:GetState()
                        if state == Enum.HumanoidStateType.Landed or state == Enum.HumanoidStateType.Running then
                                h:ChangeState(Enum.HumanoidStateType.Jumping)
                        end
                end
        end)
        notify('BHop', 'ON')
end)

-- 4. infjump / uninfinjump - Jump infinitely midair
infJumpConn = nil
addcmd('infjump', {}, function(args, speaker)
        if infJumpConn then infJumpConn:Disconnect() infJumpConn = nil
                return notify('Inf Jump','OFF') end
        local u = game:GetService('UserInputService')
        infJumpConn = u.JumpRequest:Connect(function()
                local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
                if h then h:ChangeState(Enum.HumanoidStateType.Jumping) end
        end)
        notify('Inf Jump', 'ON')
end)

-- 5. float / unfloat - Float in the air (counteract gravity)
floatConn = nil
addcmd('float', {}, function(args, speaker)
        if floatConn then floatConn:Disconnect() floatConn = nil
                return notify('Float','OFF') end
        floatConn = RunService.Heartbeat:Connect(function()
                local r = getRoot(speaker.Character)
                if r then r.Velocity = Vector3.new(r.Velocity.X, 0, r.Velocity.Z) end
        end)
        notify('Float', 'ON - gravity cancelled')
end)

-- 6. rocket - Launch yourself upward extremely fast
addcmd('rocket', {'launch'}, function(args, speaker)
        local r = getRoot(speaker.Character)
        if r then r.Velocity = Vector3.new(0, 500, 0) end
        notify('Rocket', 'LAUNCHED!')
end)

-- 7. bouncy [num] / unbouncy - Bounce when touching ground
bouncyConn = nil
addcmd('bouncy', {}, function(args, speaker)
        if bouncyConn then bouncyConn:Disconnect() bouncyConn = nil
                return notify('Bouncy','OFF') end
        local pwr = tonumber(args[1]) or 120
        bouncyConn = RunService.Heartbeat:Connect(function()
                local r = getRoot(speaker.Character)
                if r and r.Velocity.Y <= 0 then
                        local ray = Ray.new(r.Position, Vector3.new(0, -5, 0))
                        local hit = workspace:FindPartOnRayWithWhitelist(ray, {})
                        if hit then r.Velocity = Vector3.new(r.Velocity.X, pwr, r.Velocity.Z) end
                end
        end)
        notify('Bouncy', 'Bounce power: ' .. pwr)
end)

-- 8. antigrav / unantigrav - Zero gravity on your character
antigravBF = nil
addcmd('antigrav', {}, function(args, speaker)
        if antigravBF then antigravBF:Destroy() antigravBF = nil
                return notify('AntiGrav','OFF') end
        local r = getRoot(speaker.Character)
        if r then
                antigravBF = Instance.new('BodyForce')
                antigravBF.Name = randomString()
                antigravBF.Force = Vector3.new(0, workspace.Gravity * r.AssemblyMass, 0)
                antigravBF.Parent = r
                notify('AntiGrav', 'ON')
        end
end)

-- 9. dash - Quick burst of speed in look direction
addcmd('dash', {}, function(args, speaker)
        local r = getRoot(speaker.Character)
        if r then
                local dir = workspace.CurrentCamera.CFrame.LookVector
                r.Velocity = Vector3.new(dir.X * 300, r.Velocity.Y, dir.Z * 300)
        end
        notify('Dash', 'BOOM!')
end)

-- 10. spider / unspider - Walk on walls and ceilings
spiderConn = nil
addcmd('spider', {}, function(args, speaker)
        if spiderConn then spiderConn:Disconnect() spiderConn = nil
                return notify('Spider','OFF') end
        spiderConn = RunService.Heartbeat:Connect(function()
                local r = getRoot(speaker.Character)
                if not r then return end
                local h = speaker.Character:FindFirstChildOfClass('Humanoid')
                if not h then return end
                if h.MoveDirection.Magnitude > 0 then
                        local rayP = RaycastParams.new()
                        rayP.FilterDescendantsInstances = {speaker.Character}
                        rayP.FilterType = Enum.RaycastFilterType.Exclude
                        local result = workspace:Raycast(r.Position, -workspace.CurrentCamera.CFrame.LookVector * 3, rayP)
                        if result then
                                local norm = result.Normal
                                local cf = CFrame.lookAt(r.Position, r.Position - norm)
                                r.CFrame = cf
                                r.Velocity = Vector3.new(r.Velocity.X, r.Velocity.Y + 50, r.Velocity.Z)
                        end
                end
        end)
        notify('Spider', 'ON - climb walls!')
end)

-- =================== ESP & VISUALS (11-18) ===================

-- 11. itemesp / noitemesp - ESP for all items/tools on the ground
itemEspActive = false
itemEspConn = nil
itemEspDraws = {}
addcmd('itemesp', {}, function(args, speaker)
        if itemEspActive then
                itemEspActive = false
                if itemEspConn then itemEspConn:Disconnect() itemEspConn = nil end
                for _, d in pairs(itemEspDraws) do pcall(function() d:Remove() end) end
                itemEspDraws = {}
                return notify('Item ESP','OFF') end
        itemEspActive = true
        itemEspConn = RunService.RenderStepped:Connect(function()
                for _, d in pairs(itemEspDraws) do pcall(function() d:Remove() end) end
                itemEspDraws = {}
                local cam = workspace.CurrentCamera
                for _, obj in pairs(workspace:GetDescendants()) do
                        if obj:IsA('Tool') or (obj:IsA('BasePart') and obj.Name ~= 'Terrain' and not obj.Parent and obj.Size.Magnitude < 10) then
                                local pos, onScreen = cam:WorldToViewportPoint(obj.Position)
                                if onScreen then
                                        local d = Drawing.new('Text')
                                        d.Text = obj.Name
                                        d.Position = Vector2.new(pos.X, pos.Y)
                                        d.Color = Color3.fromRGB(255, 255, 0)
                                        d.Outline = true
                                        d.Size = 14
                                        d.Center = true
                                        itemEspDraws[#itemEspDraws + 1] = d
                                end
                        end
                end
        end)
        notify('Item ESP', 'ON - showing items on ground')
end)

-- 12. partesp [name] / nopartesp - ESP for parts matching a name
partEspActive = false
partEspConn = nil
partEspDraws = {}
addcmd('partesp', {}, function(args, speaker)
        if partEspActive then
                partEspActive = false
                if partEspConn then partEspConn:Disconnect() partEspConn = nil end
                for _, d in pairs(partEspDraws) do pcall(function() d:Remove() end) end
                partEspDraws = {}
                return notify('Part ESP','OFF') end
        local filter = args[1] or ''
        if filter == '' then return notify('Part ESP','Usage: partesp [name]') end
        partEspActive = true
        partEspConn = RunService.RenderStepped:Connect(function()
                for _, d in pairs(partEspDraws) do pcall(function() d:Remove() end) end
                partEspDraws = {}
                local cam = workspace.CurrentCamera
                for _, p in pairs(workspace:GetDescendants()) do
                        if p:IsA('BasePart') and p.Name:lower():find(filter:lower()) then
                                local pos, on = cam:WorldToViewportPoint(p.Position)
                                if on then
                                        local d = Drawing.new('Text')
                                        d.Text = p.Name .. ' (' .. math.floor((p.Position - cam.CFrame.Position).Magnitude) .. ')'
                                        d.Position = Vector2.new(pos.X, pos.Y)
                                        d.Color = Color3.fromRGB(0, 255, 255)
                                        d.Outline = true
                                        d.Size = 13
                                        d.Center = true
                                        partEspDraws[#partEspDraws + 1] = d
                                end
                        end
                end
        end)
        notify('Part ESP', 'Filtering: ' .. filter)
end)

-- 13. vehicleesp / novehicleesp - ESP for seats and vehicles
vehicleEspActive = false
vehicleEspConn = nil
vehicleEspDraws = {}
addcmd('vehicleesp', {'vesp'}, function(args, speaker)
        if vehicleEspActive then
                vehicleEspActive = false
                if vehicleEspConn then vehicleEspConn:Disconnect() vehicleEspConn = nil end
                for _, d in pairs(vehicleEspDraws) do pcall(function() d:Remove() end) end
                vehicleEspDraws = {}
                return notify('Vehicle ESP','OFF') end
        vehicleEspActive = true
        vehicleEspConn = RunService.RenderStepped:Connect(function()
                for _, d in pairs(vehicleEspDraws) do pcall(function() d:Remove() end) end
                vehicleEspDraws = {}
                local cam = workspace.CurrentCamera
                for _, s in pairs(workspace:GetDescendants()) do
                        if s:IsA('Seat') or s:IsA('VehicleSeat') then
                                local pos, on = cam:WorldToViewportPoint(s.Position)
                                if on then
                                        local d = Drawing.new('Text')
                                        d.Text = s.Name .. (s.Occupant and ' [OCCUPIED]' or ' [EMPTY]')
                                        d.Position = Vector2.new(pos.X, pos.Y)
                                        d.Color = s.Occupant and Color3.fromRGB(255, 0, 0) or Color3.fromRGB(0, 255, 0)
                                        d.Outline = true
                                        d.Size = 14
                                        d.Center = true
                                        vehicleEspDraws[#vehicleEspDraws + 1] = d
                                end
                        end
                end
        end)
        notify('Vehicle ESP', 'ON')
end)

-- 14. mobesp / nomobesp - ESP for NPCs/monsters (non-player humanoids)
mobEspActive = false
mobEspConn = nil
mobEspDraws = {}
addcmd('mobesp', {'npesp'}, function(args, speaker)
        if mobEspActive then
                mobEspActive = false
                if mobEspConn then mobEspConn:Disconnect() mobEspConn = nil end
                for _, d in pairs(mobEspDraws) do pcall(function() d:Remove() end) end
                mobEspDraws = {}
                return notify('Mob ESP','OFF') end
        mobEspActive = true
        mobEspConn = RunService.RenderStepped:Connect(function()
                for _, d in pairs(mobEspDraws) do pcall(function() d:Remove() end) end
                mobEspDraws = {}
                local cam = workspace.CurrentCamera
                for _, obj in pairs(workspace:GetDescendants()) do
                        if obj:IsA('Humanoid') and obj.Health > 0 then
                                local char = obj.Parent
                                if char and char:FindFirstChild('HumanoidRootPart') then
                                        local isPlayer = false
                                        for _, p in pairs(Players:GetPlayers()) do
                                                if p.Character == char then isPlayer = true break end
                                        end
                                        if not isPlayer then
                                                local pos, on = cam:WorldToViewportPoint(char.HumanoidRootPart.Position)
                                                if on then
                                                        local d = Drawing.new('Text')
                                                        d.Text = char.Name .. ' HP:' .. math.floor(obj.Health)
                                                        d.Position = Vector2.new(pos.X, pos.Y - 20)
                                                        d.Color = Color3.fromRGB(255, 100, 0)
                                                        d.Outline = true
                                                        d.Size = 13
                                                        d.Center = true
                                                        mobEspDraws[#mobEspDraws + 1] = d
                                                end
                                        end
                                end
                        end
                end
        end)
        notify('Mob ESP', 'ON - showing NPCs')
end)

-- 15. chams / nochams - Highlight ALL players through walls (not role-based)
chamsActive = false
chamsHls = {}
chamsConn = nil
addcmd('chams', {}, function(args, speaker)
        if chamsActive then
                chamsActive = false
                if chamsConn then chamsConn:Disconnect() chamsConn = nil end
                for _, hl in pairs(chamsHls) do pcall(function() hl:Destroy() end) end
                chamsHls = {}
                return notify('Chams','OFF') end
        chamsActive = true
        local function addCham(player)
                if not player.Character or chamsHls[player] then return end
                local hl = Instance.new('Highlight')
                hl.Name = 'ArcCham'
                hl.Adornee = player.Character
                hl.FillColor = Color3.fromRGB(255, 255, 255)
                hl.OutlineColor = Color3.fromRGB(0, 100, 255)
                hl.FillTransparency = 0.5
                hl.OutlineTransparency = 0
                hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
                hl.Parent = player.Character
                chamsHls[player] = hl
        end
        for _, p in pairs(Players:GetPlayers()) do
                if p ~= speaker then pcall(function() addCham(p) end) end
        end
        chamsConn = Players.PlayerAdded:Connect(function(p)
                task.wait(1)
                p.CharacterAdded:Connect(function() task.wait(1) pcall(function() addCham(p) end) end)
                pcall(function() addCham(p) end)
        end)
        for _, p in pairs(Players:GetPlayers()) do
                if p ~= speaker then
                        p.CharacterAdded:Connect(function() task.wait(1) pcall(function() addCham(p) end) end)
                end
        end
        notify('Chams', 'ON - all players highlighted')
end)

-- 16. trail [color] / untrail - Trail effect behind your character
trailActive = false
trailConn = nil
trailParts = {}
addcmd('trail', {}, function(args, speaker)
        if trailActive then
                trailActive = false
                if trailConn then trailConn:Disconnect() trailConn = nil end
                for _, p in pairs(trailParts) do pcall(function() p:Destroy() end) end
                trailParts = {}
                return notify('Trail','OFF') end
        local col = Color3.fromRGB(0, 150, 255)
        if args[1] then
                local c = args[1]:gsub('#','')
                if #c == 6 then
                        col = Color3.fromRGB(tonumber(c:sub(1,2),16), tonumber(c:sub(3,4),16), tonumber(c:sub(5,6),16))
                end
        end
        trailActive = true
        trailConn = RunService.Heartbeat:Connect(function()
                local r = getRoot(speaker.Character)
                if not r then return end
                local p = Instance.new('Part')
                p.Size = Vector3.new(1, 1, 1)
                p.Color = col
                p.Material = Enum.Material.Neon
                p.Anchored = true
                p.CanCollide = false
                p.Position = r.Position
                p.Shape = Enum.PartType.Ball
                p.Parent = workspace
                trailParts[#trailParts + 1] = p
                task.delay(2, function() pcall(function() p:Destroy() end) end)
                if #trailParts > 100 then
                        local old = table.remove(trailParts, 1)
                        if old then pcall(function() old:Destroy() end) end
                end
        end)
        notify('Trail', 'ON')
end)

-- 17. nightvision / unnightvision - Bright green tint overlay
nightvisionActive = false
nightvisionCC = nil
addcmd('nightvision', {'nv'}, function(args, speaker)
        if nightvisionActive then
                nightvisionActive = false
                if nightvisionCC then nightvisionCC:Destroy() nightvisionCC = nil end
                local l = game:GetService('Lighting')
                l.Brightness = 2
                l.Ambient = Color3.fromRGB(128,128,128)
                return notify('Night Vision','OFF') end
        nightvisionActive = true
        nightvisionCC = Instance.new('ColorCorrectionEffect')
        nightvisionCC.Name = 'ArcNightVision'
        nightvisionCC.Brightness = 0.3
        nightvisionCC.Contrast = 0.2
        nightvisionCC.Saturation = -0.5
        nightvisionCC.TintColor = Color3.fromRGB(0, 255, 0)
        nightvisionCC.Parent = game:GetService('Lighting')
        game:GetService('Lighting').Brightness = 3
        game:GetService('Lighting').Ambient = Color3.fromRGB(80, 80, 80)
        notify('Night Vision', 'ON')
end)

-- 18. wireframe / unwireframe - Wireframe rendering mode
wireframeActive = false
wireframeParts = {}
addcmd('wireframe', {}, function(args, speaker)
        if wireframeActive then
                wireframeActive = false
                for _, p in pairs(wireframeParts) do
                        pcall(function()
                                p.Material = p:GetAttribute('ArcOrigMat') or Enum.Material.Plastic
                                p.Transparency = p:GetAttribute('ArcOrigTrans') or 0
                                p:SetAttribute('ArcOrigMat', nil)
                                p:SetAttribute('ArcOrigTrans', nil)
                        end)
                end
                wireframeParts = {}
                return notify('Wireframe','OFF') end
        wireframeActive = true
        for _, p in pairs(workspace:GetDescendants()) do
                if p:IsA('BasePart') and p.Name ~= 'Terrain' then
                        p:SetAttribute('ArcOrigMat', p.Material.Name)
                        p:SetAttribute('ArcOrigTrans', p.Transparency)
                        p.Material = Enum.Material.Wireframe
                        p.Transparency = 0
                        wireframeParts[#wireframeParts + 1] = p
                end
        end
        notify('Wireframe', 'ON')
end)

-- =================== COMBAT & TOOLS (19-26) ===================

-- 19. toolgrabber / untoolgrabber - Auto teleport dropped tools to you
toolGrabberConn = nil
addcmd('toolgrabber', {'autograb'}, function(args, speaker)
        if toolGrabberConn then toolGrabberConn:Disconnect() toolGrabberConn = nil
                return notify('Tool Grabber','OFF') end
        local r = getRoot(speaker.Character)
        if not r then return end
        toolGrabberConn = RunService.Heartbeat:Connect(function()
                r = getRoot(speaker.Character)
                if not r then return end
                for _, obj in pairs(workspace:GetDescendants()) do
                        if obj:IsA('Tool') and not obj.Parent:IsA('Player') and not obj.Parent:IsA('Backpack') then
                                if (obj.Position - r.Position).Magnitude < 100 then
                                        obj:PivotTo(r.CFrame)
                                end
                        end
                end
        end)
        notify('Tool Grabber', 'ON - auto-grabbing nearby tools')
end)

-- 20. reach [num] / unreach - Extend your tool reach distance
reachActive = false
reachOrig = {}
addcmd('reach', {}, function(args, speaker)
        if reachActive then
                reachActive = false
                for _, v in pairs(workspace:GetDescendants()) do
                        if v:IsA('Tool') and v:FindFirstChild('ArcReach') then
                                local h = v:FindFirstChild('Handle')
                                if h then h.Size = reachOrig[v] or Vector3.new(1,1,1) end
                                v:FindFirstChild('ArcReach'):Destroy()
                        end
                end
                return notify('Reach','OFF') end
        local dist = tonumber(args[1]) or 20
        reachActive = true
        reachOrig = {}
        local function applyReach(tool)
                if tool:FindFirstChild('ArcReach') then return end
                local h = tool:FindFirstChild('Handle')
                if h then
                        reachOrig[tool] = h.Size
                        h.Size = Vector3.new(dist, dist, dist)
                        h.Massless = true
                        h.CanCollide = false
                        h.Transparency = 0.7
                        local t = Instance.new('SelectionBox') t.Name = 'ArcReach' t.Adornee = h t.Parent = tool
                end
        end
        for _, t in pairs(speaker.Character:GetChildren()) do
                if t:IsA('Tool') then pcall(function() applyReach(t) end) end
        end
        speaker.ChildAdded:Connect(function(c) if c:IsA('Tool') then task.wait(0.5) pcall(function() applyReach(c) end) end end)
        notify('Reach', 'Extended to ' .. dist .. ' studs')
end)

-- 21. autofarm / unautofarm - Auto-collect nearby items (teleport to you)
autoFarmConn = nil
addcmd('autofarm', {'autocollect'}, function(args, speaker)
        if autoFarmConn then autoFarmConn:Disconnect() autoFarmConn = nil
                return notify('Auto Farm','OFF') end
        autoFarmConn = RunService.Heartbeat:Connect(function()
                local r = getRoot(speaker.Character)
                if not r then return end
                for _, p in pairs(workspace:GetDescendants()) do
                        if p:IsA('BasePart') and p.Anchored == false and not p.Parent:IsA('Model') then
                                if (p.Position - r.Position).Magnitude < 50 then
                                        p:PivotTo(r.CFrame * CFrame.new(0,0,3))
                                end
                        elseif p:IsA('Tool') and not p.Parent:IsA('Player') and not p.Parent:IsA('Backpack') then
                                if (p.Position - r.Position).Magnitude < 80 then
                                        p:PivotTo(r.CFrame * CFrame.new(0,0,3))
                                end
                        end
                end
        end)
        notify('Auto Farm', 'ON - collecting nearby items')
end)

-- 22. killaura [range] / nokillaura - Auto damage nearby players
killAuraConn = nil
addcmd('killaura', {'kaura'}, function(args, speaker)
        if killAuraConn then killAuraConn:Disconnect() killAuraConn = nil
                return notify('Kill Aura','OFF') end
        local range = tonumber(args[1]) or 25
        killAuraConn = RunService.Heartbeat:Connect(function()
                local r = getRoot(speaker.Character)
                if not r then return end
                for _, p in pairs(Players:GetPlayers()) do
                        if p ~= speaker and p.Character and p.Character:FindFirstChild('HumanoidRootPart') then
                                local dist = (p.Character.HumanoidRootPart.Position - r.Position).Magnitude
                                if dist < range then
                                        local h = p.Character:FindFirstChildOfClass('Humanoid')
                                        if h and h.Health > 0 then
                                                h:TakeDamage(5)
                                        end
                                end
                        end
                end
        end)
        notify('Kill Aura', 'ON (range: ' .. range .. ')')
end)

-- 23. toolcopy [player] - Copy a player's equipped tool
addcmd('toolcopy', {'copytool'}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('Tool Copy','Player not found') end
        local tool = nil
        for _, v in pairs(target.Character:GetChildren()) do
                if v:IsA('Tool') then tool = v break end
        end
        if not tool then tool = target.Backpack and target.Backpack:FindFirstChildOfClass('Tool') end
        if not tool then return notify('Tool Copy', target.Name .. ' has no tools') end
        local cl = tool:Clone()
        cl.Parent = speaker.Backpack
        notify('Tool Copy', 'Copied ' .. tool.Name)
end)

-- 24. heal - Heal yourself to full HP
addcmd('heal', {}, function(args, speaker)
        local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
        if h then h.Health = h.MaxHealth end
        notify('Heal', 'Full HP!')
end)

-- 25. healall - Heal everyone on the server
addcmd('healall', {}, function(args, speaker)
        for _, p in pairs(Players:GetPlayers()) do
                if p.Character then
                        local h = p.Character:FindFirstChildOfClass('Humanoid')
                        if h then h.Health = h.MaxHealth end
                end
        end
        notify('Heal All', 'Everyone healed!')
end)

-- 26. explode [player] - Create explosion on a player
addcmd('explode', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('Explode','Player not found') end
        local r = target.Character:FindFirstChild('HumanoidRootPart')
        if r then
                local e = Instance.new('Explosion')
                e.Position = r.Position
                e.BlastRadius = 20
                e.BlastPressure = 500000
                e.Parent = workspace
        end
        notify('Explode', 'Boom! ' .. target.Name)
end)

-- =================== PLAYER CONTROL (27-38) ===================

-- 27. serverlock / serverunlock - Kick anyone who joins
serverLockConn = nil
addcmd('serverlock', {'slock'}, function(args, speaker)
        if serverLockConn then serverLockConn:Disconnect() serverLockConn = nil
                return notify('Server Lock','UNLOCKED') end
        serverLockConn = Players.PlayerAdded:Connect(function(p)
                if p ~= speaker then pcall(function() p:Kick('Server is locked.') end) end
        end)
        notify('Server Lock', 'LOCKED - new players kicked')
end)

-- 28. loopkill [player] / unloopkill [player]
loopKillList = {}
loopKillConn = nil
addcmd('loopkill', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target then return notify('Loop Kill','Player not found') end
        if loopKillList[target] then loopKillList[target] = nil
                return notify('Loop Kill', 'Stopped on ' .. target.Name) end
        loopKillList[target] = true
        if not loopKillConn then
                loopKillConn = Players.PlayerAdded:Connect(function(p)
                        if loopKillList[p] then
                                task.wait(3)
                                p.CharacterAdded:Connect(function(c) task.wait(1) pcall(function() c:FindFirstChildOfClass('Humanoid').Health = 0 end) end)
                        end
                end)
        end
        if target.Character then
                local h = target.Character:FindFirstChildOfClass('Humanoid')
                if h then h.Health = 0 end
                target.CharacterAdded:Connect(function(c) task.wait(1) if loopKillList[target] then pcall(function() c:FindFirstChildOfClass('Humanoid').Health = 0 end) end end)
        end
        notify('Loop Kill', 'Loop killing ' .. target.Name)
end)

-- 29. jail [player] / unjail [player]
jailState = {}
addcmd('jail', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('Jail','Player not found') end
        local r = target.Character:FindFirstChild('HumanoidRootPart')
        if not r then return end
        if jailState[target] then jailState[target].cage:Destroy() end
        local cage = Instance.new('Model') cage.Name = 'ArcJail'
        local pos = r.Position
        local walls = {
                {Vector3.new(8, 10, 1), pos + Vector3.new(4, 5, 0)},
                {Vector3.new(8, 10, 1), pos + Vector3.new(-4, 5, 0)},
                {Vector3.new(1, 10, 8), pos + Vector3.new(0, 5, 4)},
                {Vector3.new(1, 10, 8), pos + Vector3.new(0, 5, -4)},
                {Vector3.new(8, 1, 8), pos + Vector3.new(0, 10, 0)},
        }
        for _, w in pairs(walls) do
                local p = Instance.new('Part')
                p.Size = w[1] p.Position = w[2] p.Anchored = true p.Transparency = 0.5
                p.Color = Color3.fromRGB(50, 50, 255) p.Material = Enum.Material.ForceField p.Parent = cage
        end
        cage.Parent = workspace
        jailState[target] = {cage = cage}
        -- Re-jail on respawn
        target.CharacterAdded:Connect(function(c)
                task.wait(2)
                if jailState[target] then
                        local nr = c:FindFirstChild('HumanoidRootPart')
                        if nr then
                                jailState[target].cage:PivotTo(CFrame.new(nr.Position))
                        end
                end
        end)
        notify('Jail', target.Name .. ' jailed!')
end)

addcmd('unjail', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target then return end
        if jailState[target] then pcall(function() jailState[target].cage:Destroy() end) jailState[target] = nil end
        notify('Jail', target.Name .. ' unjailed!')
end)

-- 30. blind [player] / unblind [player]
blindState = {}
addcmd('blind', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('Blind','Player not found') end
        local sg = Instance.new('ScreenGui') sg.Name = 'ArcBlind' sg.ResetOnSpawn = false sg.Parent = target.PlayerGui
        local fr = Instance.new('Frame') fr.Size = UDim2.new(1,0,1,0) fr.BackgroundColor3 = Color3.new(0,0,0) fr.Parent = sg
        blindState[target] = sg
        target.CharacterAdded:Connect(function(c)
                task.wait(1)
                if blindState[target] then
                        local newSg = Instance.new('ScreenGui') newSg.Name = 'ArcBlind' newSg.ResetOnSpawn = false newSg.Parent = target.PlayerGui
                        local newFr = Instance.new('Frame') newFr.Size = UDim2.new(1,0,1,0) newFr.BackgroundColor3 = Color3.new(0,0,0) newFr.Parent = newSg
                        blindState[target] = newSg
                end
        end)
        notify('Blind', target.Name .. ' blinded!')
end)

addcmd('unblind', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target then return end
        if blindState[target] then pcall(function() blindState[target]:Destroy() end) blindState[target] = nil end
        notify('Blind', target.Name .. ' unblinded!')
end)

-- 31. freeze [player] / unfreeze [player]
freezeState = {}
addcmd('freeze', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('Freeze','Player not found') end
        freezeState[target] = {}
        for _, p in pairs(target.Character:GetDescendants()) do
                if p:IsA('BasePart') then
                        freezeState[target][#freezeState[target]+1] = {part = p, wasAnchored = p.Anchored}
                        p.Anchored = true
                end
        end
        notify('Freeze', target.Name .. ' frozen!')
end)

addcmd('unfreeze', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target then return end
        if freezeState[target] then
                for _, v in pairs(freezeState[target]) do
                        if v.part and v.part.Parent then v.part.Anchored = v.wasAnchored end
                end
                freezeState[target] = nil
        end
        notify('Freeze', target.Name .. ' unfrozen!')
end)

-- 32. punish [player] / unpunish [player] - Remove/restore character
punishState = {}
addcmd('punish', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('Punish','Player not found') end
        punishState[target] = target.Character.Archivable and target.Character:Clone() or nil
        target.Character:Destroy()
        notify('Punish', target.Name .. ' punished!')
end)

addcmd('unpunish', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target then return end
        if punishState[target] then
                target.Character = punishState[target]
                punishState[target].Parent = workspace
                punishState[target] = nil
        end
        notify('Punish', target.Name .. ' unpunished!')
end)

-- 33. trip [player] - Trip a player (ragdoll)
addcmd('trip', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('Trip','Player not found') end
        local h = target.Character:FindFirstChildOfClass('Humanoid')
        if h then h.Sit = true end
        notify('Trip', target.Name .. ' tripped!')
end)

-- 34. stun [player] / unstun [player]
stunState = {}
addcmd('stun', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('Stun','Player not found') end
        local h = target.Character:FindFirstChildOfClass('Humanoid')
        if h then
                stunState[target] = h.WalkSpeed
                h.WalkSpeed = 0
                h.JumpPower = 0
        end
        notify('Stun', target.Name .. ' stunned!')
end)

addcmd('unstun', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target then return end
        if stunState[target] and target.Character then
                local h = target.Character:FindFirstChildOfClass('Humanoid')
                if h then h.WalkSpeed = stunState[target] h.JumpPower = 50 end
                stunState[target] = nil
        end
        notify('Stun', target.Name .. ' unstunned!')
end)

-- 35. fling [player] - Fling a player using BodyThrust (Ultimate FlingGui method)
addcmd('fling', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('Fling','Player not found') end
        local tRoot = target.Character:FindFirstChild('HumanoidRootPart')
        if not tRoot then return notify('Fling','Target has no HumanoidRootPart') end

        local me = speaker.Character
        local myRoot = me and getRoot(me)
        if not me or not myRoot then return notify('Fling','No character') end

        local savedCFrame = myRoot.CFrame

        -- BodyThrust with massive force (Ultimate FlingGui method)
        local thrust = Instance.new("BodyThrust")
        thrust.Name = randomString()
        thrust.Force = Vector3.new(9999, 9999, 9999)
        thrust.Parent = myRoot

        local startTime = tick()
        local done = false

        local conn = RunService.Heartbeat:Connect(function()
                if done then return end
                if not myRoot or not myRoot.Parent then done = true return end
                if not tRoot or not tRoot.Parent then done = true return end
                if tick() - startTime >= 5 then done = true return end
                if not target.Character:FindFirstChild("Head") then done = true return end
                myRoot.CFrame = tRoot.CFrame
                thrust.Location = tRoot.Position
        end)

        task.spawn(function()
                while not done do task.wait(0.01) end
                conn:Disconnect()
                task.wait(0.2)
                if thrust and thrust.Parent then thrust:Destroy() end
                if myRoot and myRoot.Parent then
                        myRoot.CFrame = savedCFrame
                        myRoot.Velocity = Vector3.new(0, 0, 0)
                        myRoot.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
                        myRoot.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
                end
                notify('Fling', 'Fling done!')
        end)

        notify('Fling', 'Flinging ' .. target.Name .. '...')
end)

-- 36. bringall - Teleport all players to you
addcmd('bringall', {}, function(args, speaker)
        local r = getRoot(speaker.Character)
        if not r then return end
        for _, p in pairs(Players:GetPlayers()) do
                if p ~= speaker and p.Character then
                        local pr = p.Character:FindFirstChild('HumanoidRootPart')
                        if pr then pr.CFrame = r.CFrame + Vector3.new(math.random(-5,5), 0, math.random(-5,5)) end
                end
        end
        notify('Bring All', 'All players brought to you!')
end)

-- 37. tpall - Teleport all players to you (same as bringall)
addcmd('tpall', {}, function(args, speaker)
        local r = getRoot(speaker.Character)
        if not r then return end
        for _, p in pairs(Players:GetPlayers()) do
                if p ~= speaker and p.Character then
                        local pr = p.Character:FindFirstChild('HumanoidRootPart')
                        if pr then pr.CFrame = r.CFrame + Vector3.new(math.random(-5,5), 0, math.random(-5,5)) end
                end
        end
        notify('TP All', 'All players teleported to you!')
end)

-- 38. crashplayer [player] - Lag/crash a player
addcmd('crashplayer', {'crash'}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target then return notify('Crash','Player not found') end
        if target.Character and target.Character:FindFirstChild('HumanoidRootPart') then
                for i = 1, 200 do
                        Instance.new('Part').Parent = target.Character
                end
        end
        notify('Crash', 'Sent crash to ' .. target.Name)
end)

-- =================== CHARACTER EFFECTS (39-46) ===================

-- 39. spin2 / unspin2 - Spin your character
spin2BAV = nil
addcmd('spin2', {}, function(args, speaker)
        if spin2BAV then spin2BAV:Destroy() spin2BAV = nil
                return notify('Spin','OFF') end
        local r = getRoot(speaker.Character)
        if not r then return end
        spin2BAV = Instance.new('BodyAngularVelocity')
        spin2BAV.Name = randomString()
        spin2BAV.AngularVelocity = Vector3.new(0, 50, 0)
        spin2BAV.MaxTorque = Vector3.new(0, math.huge, 0)
        spin2BAV.Parent = r
        notify('Spin', 'ON')
end)

-- 40. seizure / unseizure - Random rapid pose changes
seizureConn = nil
seizureParts = {}
addcmd('seizure', {}, function(args, speaker)
        if seizureConn then seizureConn:Disconnect() seizureConn = nil
                for _, p in pairs(seizureParts) do pcall(function() p:Destroy() end) end
                seizureParts = {}
                return notify('Seizure','OFF') end
        seizureConn = RunService.Heartbeat:Connect(function()
                local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
                if h then
                        h.CameraOffset = Vector3.new(math.random(-2,2), math.random(-2,2), math.random(-2,2))
                        h.Sit = math.random(0,1) == 1
                end
        end)
        notify('Seizure', 'ON')
end)

-- 41. fire [color] / unfire
fireObj = nil
addcmd('fire', {}, function(args, speaker)
        if fireObj then fireObj:Destroy() fireObj = nil
                return notify('Fire','OFF') end
        local col = Color3.fromRGB(255, 100, 0)
        if args[1] then
                local c = args[1]:gsub('#','')
                if #c == 6 then col = Color3.fromRGB(tonumber(c:sub(1,2),16), tonumber(c:sub(3,4),16), tonumber(c:sub(5,6),16)) end
        end
        local r = getRoot(speaker.Character)
        if not r then return end
        fireObj = Instance.new('Fire')
        fireObj.Color = col
        fireObj.SecondaryColor = Color3.fromRGB(255, 200, 0)
        fireObj.Size = 8
        fireObj.Heat = 10
        fireObj.Parent = r
        notify('Fire', 'ON')
end)

-- 42. sparkles [color] / unsparkles
sparklesObj = nil
addcmd('sparkles', {}, function(args, speaker)
        if sparklesObj then sparklesObj:Destroy() sparklesObj = nil
                return notify('Sparkles','OFF') end
        local col = Color3.fromRGB(255, 215, 0)
        if args[1] then
                local c = args[1]:gsub('#','')
                if #c == 6 then col = Color3.fromRGB(tonumber(c:sub(1,2),16), tonumber(c:sub(3,4),16), tonumber(c:sub(5,6),16)) end
        end
        local r = getRoot(speaker.Character)
        if not r then return end
        sparklesObj = Instance.new('Sparkles')
        sparklesObj.SparkleColor = col
        sparklesObj.Parent = r
        notify('Sparkles', 'ON')
end)

-- 43. smoke [color] / unsmoke
smokeObj = nil
addcmd('smoke', {}, function(args, speaker)
        if smokeObj then smokeObj:Destroy() smokeObj = nil
                return notify('Smoke','OFF') end
        local col = Color3.fromRGB(100, 100, 100)
        if args[1] then
                local c = args[1]:gsub('#','')
                if #c == 6 then col = Color3.fromRGB(tonumber(c:sub(1,2),16), tonumber(c:sub(3,4),16), tonumber(c:sub(5,6),16)) end
        end
        local r = getRoot(speaker.Character)
        if not r then return end
        smokeObj = Instance.new('Smoke')
        smokeObj.Color = col
        smokeObj.Opacity = 0.5
        smokeObj.RiseVelocity = 5
        smokeObj.Parent = r
        notify('Smoke', 'ON')
end)

-- 44. tiny / untiny - Make yourself tiny
tinyActive = false
tinyScales = {}
addcmd('tiny', {}, function(args, speaker)
        if tinyActive then
                tinyActive = false
                local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
                if h then
                        local bsc = h:FindFirstChild('BodyScale') or h:FindFirstChild('BodyDepthScale')
                        if bsc then bsc.Value = 1 end
                        for _, s in pairs({'BodyHeightScale','BodyWidthScale','BodyDepthScale','HeadScale'}) do
                                local sc = h:FindFirstChild(s)
                                if sc then sc.Value = tinyScales[s] or 1 end
                        end
                end
                return notify('Tiny','OFF') end
        tinyActive = true
        local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
        if h then
                for _, s in pairs({'BodyHeightScale','BodyWidthScale','BodyDepthScale','HeadScale'}) do
                        local sc = h:FindFirstChild(s)
                        if sc then tinyScales[s] = sc.Value sc.Value = 0.1 end
                end
        end
        notify('Tiny', 'ON - you are tiny!')
end)

-- 45. giant / ungiant - Make yourself giant
giantActive = false
giantScales = {}
addcmd('giant', {}, function(args, speaker)
        if giantActive then
                giantActive = false
                local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
                if h then
                        for _, s in pairs({'BodyHeightScale','BodyWidthScale','BodyDepthScale','HeadScale'}) do
                                local sc = h:FindFirstChild(s)
                                if sc then sc.Value = giantScales[s] or 1 end
                        end
                end
                return notify('Giant','OFF') end
        giantActive = true
        local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
        if h then
                for _, s in pairs({'BodyHeightScale','BodyWidthScale','BodyDepthScale','HeadScale'}) do
                        local sc = h:FindFirstChild(s)
                        if sc then giantScales[s] = sc.Value sc.Value = 5 end
                end
        end
        notify('Giant', 'ON - you are HUGE!')
end)

-- 46. npp / unnpp - No Player Parts (makes you invisible to others by removing visual parts locally)
nppActive = false
nppParts = {}
addcmd('npp', {}, function(args, speaker)
        if not speaker.Character then return end
        if nppActive then
                nppActive = false
                for _, v in pairs(nppParts) do
                        pcall(function() v.part.Transparency = v.orig end)
                end
                nppParts = {}
                return notify('NPP','OFF') end
        nppActive = true
        for _, p in pairs(speaker.Character:GetDescendants()) do
                if p:IsA('BasePart') and p.Name ~= 'HumanoidRootPart' then
                        nppParts[#nppParts+1] = {part = p, orig = p.Transparency}
                        p.Transparency = 1
                end
        end
        for _, v in pairs(nppParts) do v.part.LocalTransparencyModifier = 0 end
        notify('NPP', 'ON - invisible to others')
end)

-- =================== ENVIRONMENT (47-50) ===================

-- 47. fullbright / unfullbright - Maximum brightness everywhere
fullbrightActive = false
fullbrightOrig = {}
addcmd('fullbright', {'fb'}, function(args, speaker)
        if fullbrightActive then
                fullbrightActive = false
                local l = game:GetService('Lighting')
                l.Brightness = fullbrightOrig.brightness or 2
                l.Ambient = fullbrightOrig.ambient or Color3.fromRGB(128,128,128)
                l.OutdoorAmbient = fullbrightOrig.outdoor or Color3.fromRGB(128,128,128)
                l.ClockTime = fullbrightOrig.time or 14
                l.FogEnd = fullbrightOrig.fogend or 100000
                if fullbrightOrig.cc then fullbrightOrig.cc.Enabled = false end
                return notify('Fullbright','OFF') end
        fullbrightActive = true
        local l = game:GetService('Lighting')
        fullbrightOrig = {
                brightness = l.Brightness,
                ambient = l.Ambient,
                outdoor = l.OutdoorAmbient,
                time = l.ClockTime,
                fogend = l.FogEnd,
                cc = l:FindFirstChildOfClass('ColorCorrectionEffect'),
        }
        l.Brightness = 3
        l.Ambient = Color3.fromRGB(200,200,200)
        l.OutdoorAmbient = Color3.fromRGB(200,200,200)
        l.ClockTime = 14
        l.FogEnd = 100000
        local cc = l:FindFirstChildOfClass('ColorCorrectionEffect')
        if not cc then
                cc = Instance.new('ColorCorrectionEffect') cc.Parent = l fullbrightOrig.cc = cc
        end
        cc.Brightness = 0.2
        cc.Contrast = 0.1
        cc.Saturation = 0.1
        cc.Enabled = true
        notify('Fullbright', 'ON - everything is bright!')
end)

-- 48. removeterrain - Remove all terrain
addcmd('removeterrain', {'noterrain'}, function(args, speaker)
        local t = workspace:FindFirstChild('Terrain')
        if t then
                t.Transparency = 1
                t.Parent = nil
        end
        notify('Remove Terrain', 'Terrain removed!')
end)

-- 49. music [id] / stopmusic - Play/stop music
musicSound = nil
addcmd('music', {'playmusic'}, function(args, speaker)
        if not args[1] then return notify('Music','Usage: music [assetid]') end
        if musicSound then musicSound:Destroy() end
        musicSound = Instance.new('Sound')
        musicSound.SoundId = 'rbxassetid://' .. args[1]
        musicSound.Volume = 1
        musicSound.Looped = true
        musicSound.Parent = workspace
        musicSound:Play()
        notify('Music', 'Playing ID: ' .. args[1])
end)

addcmd('stopmusic', {'nomusic'}, function(args, speaker)
        if musicSound then musicSound:Stop() musicSound:Destroy() musicSound = nil end
        notify('Music', 'Stopped!')
end)

-- 50. gravity [num] - Set workspace gravity
addcmd('gravity', {}, function(args, speaker)
        local g = tonumber(args[1]) or 196.2
        workspace.Gravity = g
        notify('Gravity', 'Set to ' .. g)
end)


-- ======================== SMART ESP (MM2) - SERVERSIDED ========================
-- Client-side Highlight (body glow, only you) + SERVERSIDED Part in Workspace (ALL players see billboard!)
-- 4-method MM2 role detection: exact names, deep scan, tool class, game-specific values
-- Click any player to fling them (up/down jitter + insane spin, return to original pos)
-- Usage: smartesp | unsmartesp | togglesmartesp

smartespActive = false
smartespFlinging = false
smartespHighlights = {} -- client-side body glow
smartespSSParts = {} -- SERVERSIDED parts in workspace (replicate to ALL players!)
smartespBills = {}
smartespCharConns = {}
smartespMainConn = nil
smartespClickConn = nil
smartespPlayerAddConn = nil
smartespPlayerRemConn = nil

-- MM2 Role Detection - 4 METHODS for maximum compatibility
local function smartesp_GetRole(player)
        local char = player.Character
        if not char then return "Innocent" end
        local bp = player.Backpack

        -- METHOD 1: Exact tool name match (standard MM2 naming)
        local knifeNames = {"Knife", "Combat Knife", "Vintage Knife", "Classic Knife", "Healing Knife", "Murder Knife", "Knife (Murder Mystery)"}
        local gunNames = {"Gun", "Revolver", "Pistol", "Shotgun", "Rifle", "Sheriff Gun", "Gun (Sheriff)", "Bow", "Crossbow"}
        local function checkExact(container)
                if not container then return nil end
                for _, name in ipairs(knifeNames) do
                        if container:FindFirstChild(name) then return "Murderer" end
                end
                for _, name in ipairs(gunNames) do
                        if container:FindFirstChild(name) then return "Sheriff" end
                end
                return nil
        end
        local r = checkExact(bp) or checkExact(char)
        if r then return r end

        -- METHOD 2: Deep scan ALL descendants (catches nested tools, folders, etc.)
        local function deepScan(container)
                if not container then return nil end
                for _, v in pairs(container:GetDescendants()) do
                        local n = v.Name:lower()
                        if n:find("knife") and not n:find("pocket") and not n:find("trading") and not n:find("knife_juggle") then
                                return "Murderer"
                        end
                        if n:find("revolver") or (n:find("gun") and not n:find("gunpowder")) or n:find("pistol") or n:find("shotgun") or n:find("rifle") or n:find("bat") then
                                return "Sheriff"
                        end
                end
                return nil
        end
        r = deepScan(bp) or deepScan(char)
        if r then return r end

        -- METHOD 3: Check Tool class objects + alternative weapon names
        local function toolScan(container)
                if not container then return nil end
                for _, v in pairs(container:GetChildren()) do
                        if v:IsA("Tool") then
                                local n = v.Name:lower()
                                -- Murderer weapons
                                if n:find("knife") or n:find("blade") or n:find("dagger") or n:find("machete") or n:find("cleaver") or n:find("sickle") or n:find("scythe") then
                                        return "Murderer"
                                end
                                -- Sheriff weapons
                                if n:find("gun") or n:find("shoot") or n:find("revolver") or n:find("pistol") or n:find("rifle") or n:find("sniper") or n:find("bow") or n:find("crossbow") or n:find("taser") or n:find("baton") then
                                        return "Sheriff"
                                end
                                -- Check ToolTip if available
                                pcall(function()
                                        local tip = v:FindFirstChild("ToolTip")
                                        if tip and tip:IsA("StringValue") then
                                                local t = tip.Value:lower()
                                                if t:find("knife") or t:find("murder") then return "Murderer" end
                                                if t:find("gun") or t:find("shoot") or t:find("sheriff") then return "Sheriff" end
                                        end
                                end)
                        end
                end
                return nil
        end
        r = toolScan(bp) or toolScan(char)
        if r then return r end

        -- METHOD 4: Game-specific role storage (leaderstats, character values, modules)
        pcall(function()
                -- Check leaderstats for role
                local ls = player:FindFirstChild("leaderstats")
                if ls then
                        for _, v in pairs(ls:GetChildren()) do
                                if v:IsA("StringValue") or v:IsA("IntValue") or v:IsA("BoolValue") then
                                        local n = v.Name:lower()
                                        if n:find("role") or n:find("team") or n:find("class") or n:find("side") then
                                                local val = tostring(v.Value):lower()
                                                if val:find("murder") then return "Murderer" end
                                                if val:find("sheriff") or val:find("police") or val:find("deputy") then return "Sheriff" end
                                                if val:find("innocent") or val:find("survivor") or val:find("civilian") then return "Innocent" end
                                        end
                                end
                        end
                end
                -- Check character for role values
                for _, v in pairs(char:GetChildren()) do
                        if v:IsA("StringValue") or v:IsA("IntValue") or v:IsA("BoolValue") or v:IsA("ObjectValue") then
                                local n = v.Name:lower()
                                if n:find("role") or n:find("team") or n:find("class") or n:find("state") then
                                        local val = tostring(v.Value):lower()
                                        if val:find("murder") then return "Murderer" end
                                        if val:find("sheriff") or val:find("police") then return "Sheriff" end
                                        if val:find("innocent") or val:find("survivor") then return "Innocent" end
                                end
                        end
                end
                -- Check workspace for MM2 round system modules
                for _, obj in pairs(workspace:GetChildren()) do
                        if obj:IsA("ModuleScript") or obj:IsA("Configuration") or obj:IsA("Folder") then
                                local n = obj.Name:lower()
                                if n:find("round") or n:find("game") or n:find("mm2") or n:find("murder") then
                                        pcall(function()
                                                for _, v in pairs(obj:GetDescendants()) do
                                                        if v:IsA("StringValue") and v.Name:lower():find("role") then
                                                                local val = tostring(v.Value):lower()
                                                                if val:find("murder") then return "Murderer" end
                                                                if val:find("sheriff") then return "Sheriff" end
                                                        end
                                                end
                                        end)
                                end
                        end
                end
        end)

        return "Innocent"
end

-- Get player's tools (equipped + backpack)
local function smartesp_GetTools(player)
        local tools = {}
        if player.Backpack then
                for _, v in pairs(player.Backpack:GetChildren()) do
                        if v:IsA("Tool") then tools[#tools+1] = v.Name end
                end
        end
        if player.Character then
                for _, v in pairs(player.Character:GetChildren()) do
                        if v:IsA("Tool") then tools[#tools+1] = v.Name end
                end
        end
        return tools
end

-- Calculate account age in days
local function smartesp_GetAge(player)
        local ok, info = pcall(function() return player.AccountAge end)
        if ok and info then return info .. "d" end
        return "?d"
end

local smartesp_Colors = {
        Murderer = Color3.fromRGB(255, 0, 0),
        Sheriff  = Color3.fromRGB(0, 100, 255),
        Innocent = Color3.fromRGB(0, 255, 0),
}

local function smartesp_AddTo(player)
        if not player or not player.Character then return end
        smartesp_RemoveFrom(player)
        local char = player.Character
        local head = char:FindFirstChild("Head")
        if not head then return end

        local role = smartesp_GetRole(player)
        local color = smartesp_Colors[role] or Color3.fromRGB(128, 128, 128)

        -- CLIENT-SIDE: Highlight for body glow (only you see)
        local hl = Instance.new("Highlight")
        hl.Name = "ArcYieldSmartESP"
        hl.Adornee = char
        hl.FillColor = color
        hl.OutlineColor = Color3.fromRGB(255, 255, 255)
        hl.FillTransparency = 0.4
        hl.OutlineTransparency = 0
        hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
        hl.Parent = char
        smartespHighlights[player] = hl

        -- SERVERSIDED: UNANCHORED Part in Workspace (physics engine replicates to ALL players!)
        -- NO WeldConstraints - we teleport this part every frame in the heartbeat loop
        local ssPart = Instance.new("Part")
        ssPart.Name = "ArcYieldSS_" .. player.Name
        ssPart.Size = Vector3.new(0.1, 0.1, 0.1)
        ssPart.Transparency = 1
        ssPart.CanCollide = false
        ssPart.Anchored = false
        ssPart.Position = head.Position + Vector3.new(0, 6, 0)
        ssPart.Parent = workspace
        smartespSSParts[player] = ssPart

        -- SERVERSIDED BillboardGui (visible to ALL players!)
        local bb = Instance.new("BillboardGui")
        bb.Name = "ArcYieldSS_BB"
        bb.Adornee = ssPart
        bb.Size = UDim2.new(0, 300, 0, 180)
        bb.StudsOffset = Vector3.new(0, 3.5, 0)
        bb.AlwaysOnTop = true
        bb.MaxDistance = 5000
        bb.Parent = ssPart

        -- Background frame
        local bg = Instance.new("Frame")
        bg.Size = UDim2.new(1, 0, 1, 0)
        bg.BackgroundColor3 = Color3.fromRGB(10, 10, 30)
        bg.BackgroundTransparency = 0.25
        bg.BorderSizePixel = 0
        bg.Parent = bb
        local corner = Instance.new("UICorner")
        corner.CornerRadius = UDim.new(0, 8)
        corner.Parent = bg

        -- Role label (top, bold, colored)
        local roleLbl = Instance.new("TextLabel")
        roleLbl.Name = "RoleLabel"
        roleLbl.Size = UDim2.new(1, 0, 0, 28)
        roleLbl.Position = UDim2.new(0, 0, 0, 4)
        roleLbl.BackgroundTransparency = 1
        roleLbl.Text = "[ " .. role:upper() .. " ]"
        roleLbl.TextColor3 = color
        roleLbl.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
        roleLbl.TextStrokeTransparency = 0
        roleLbl.Font = Enum.Font.GothamBold
        roleLbl.TextScaled = true
        roleLbl.Parent = bg

        -- Player name
        local nameLbl = Instance.new("TextLabel")
        nameLbl.Name = "NameLabel"
        nameLbl.Size = UDim2.new(1, 0, 0, 22)
        nameLbl.Position = UDim2.new(0, 0, 0, 32)
        nameLbl.BackgroundTransparency = 1
        nameLbl.Text = player.DisplayName .. " (@" .. player.Name .. ")"
        nameLbl.TextColor3 = Color3.fromRGB(255, 255, 255)
        nameLbl.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
        nameLbl.TextStrokeTransparency = 0.3
        nameLbl.Font = Enum.Font.GothamBold
        nameLbl.TextScaled = true
        nameLbl.Parent = bg

        -- Age
        local ageLbl = Instance.new("TextLabel")
        ageLbl.Name = "AgeLabel"
        ageLbl.Size = UDim2.new(1, 0, 0, 20)
        ageLbl.Position = UDim2.new(0, 0, 0, 54)
        ageLbl.BackgroundTransparency = 1
        ageLbl.Text = "Age: " .. smartesp_GetAge(player)
        ageLbl.TextColor3 = Color3.fromRGB(200, 200, 200)
        ageLbl.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
        ageLbl.TextStrokeTransparency = 0.5
        ageLbl.Font = Enum.Font.Gotham
        ageLbl.TextScaled = true
        ageLbl.Parent = bg

        -- Distance (updated every frame)
        local distLbl = Instance.new("TextLabel")
        distLbl.Name = "DistLabel"
        distLbl.Size = UDim2.new(1, 0, 0, 20)
        distLbl.Position = UDim2.new(0, 0, 0, 74)
        distLbl.BackgroundTransparency = 1
        distLbl.Text = "0 studs"
        distLbl.TextColor3 = Color3.fromRGB(255, 255, 100)
        distLbl.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
        distLbl.TextStrokeTransparency = 0.5
        distLbl.Font = Enum.Font.Gotham
        distLbl.TextScaled = true
        distLbl.Parent = bg

        -- Avatar thumbnail
        local imgLbl = Instance.new("ImageLabel")
        imgLbl.Name = "AvatarLabel"
        imgLbl.Size = UDim2.new(0, 40, 0, 40)
        imgLbl.Position = UDim2.new(0, 5, 0, 98)
        imgLbl.BackgroundColor3 = Color3.fromRGB(40, 40, 60)
        imgLbl.BorderSizePixel = 0
        imgLbl.Parent = bg
        local imgCorner = Instance.new("UICorner")
        imgCorner.CornerRadius = UDim.new(1, 0)
        imgCorner.Parent = imgLbl
        pcall(function()
                local thumbUrl = Players:GetUserThumbnailAsync(player.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size100x100)
                imgLbl.Image = thumbUrl
        end)

        -- Tools label (updated every frame)
        local toolsLbl = Instance.new("TextLabel")
        toolsLbl.Name = "ToolsLabel"
        toolsLbl.Size = UDim2.new(1, -50, 0, 50)
        toolsLbl.Position = UDim2.new(0, 50, 0, 98)
        toolsLbl.BackgroundTransparency = 1
        toolsLbl.Text = "Tools: "
        toolsLbl.TextColor3 = Color3.fromRGB(180, 180, 255)
        toolsLbl.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
        toolsLbl.TextStrokeTransparency = 0.5
        toolsLbl.Font = Enum.Font.Gotham
        toolsLbl.TextScaled = true
        toolsLbl.TextWrapped = true
        toolsLbl.TextXAlignment = Enum.TextXAlignment.Left
        toolsLbl.Parent = bg

        -- Health bar
        local hpBg = Instance.new("Frame")
        hpBg.Name = "HpBg"
        hpBg.Size = UDim2.new(0.9, 0, 0, 8)
        hpBg.Position = UDim2.new(0.05, 0, 0, 155)
        hpBg.BackgroundColor3 = Color3.fromRGB(60, 0, 0)
        hpBg.BorderSizePixel = 0
        hpBg.Parent = bg
        local hpCorner = Instance.new("UICorner")
        hpCorner.CornerRadius = UDim.new(0, 4)
        hpCorner.Parent = hpBg
        local hpBar = Instance.new("Frame")
        hpBar.Name = "HpBar"
        hpBar.Size = UDim2.new(1, 0, 1, 0)
        hpBar.BackgroundColor3 = Color3.fromRGB(0, 255, 0)
        hpBar.BorderSizePixel = 0
        hpBar.Parent = hpBg
        local hpBarCorner = Instance.new("UICorner")
        hpBarCorner.CornerRadius = UDim.new(0, 4)
        hpBarCorner.Parent = hpBar

        smartespBills[player] = bb
end

local function smartesp_RemoveFrom(player)
        pcall(function()
                if smartespHighlights[player] then
                        if smartespHighlights[player].Parent then smartespHighlights[player]:Destroy() end
                        smartespHighlights[player] = nil
                end
        end)
        pcall(function()
                if smartespSSParts[player] then
                        if smartespSSParts[player].Parent then smartespSSParts[player]:Destroy() end
                        smartespSSParts[player] = nil
                end
        end)
        pcall(function()
                if smartespBills[player] then
                        if smartespBills[player].Parent then smartespBills[player]:Destroy() end
                        smartespBills[player] = nil
                end
        end)
        pcall(function()
                if smartespCharConns[player] then
                        smartespCharConns[player]:Disconnect()
                        smartespCharConns[player] = nil
                end
        end)
        -- Clean up any leftover workspace parts
        pcall(function()
                local leftover = workspace:FindFirstChild("ArcYieldSS_" .. player.Name)
                if leftover then leftover:Destroy() end
        end)
end

-- Click-to-fling: up/down jitter at light speed + insane spin, return to original pos
local function smartesp_Fling(targetPlayer, speaker)
        if smartespFlinging then return end
        smartespFlinging = true

        local me = speaker.Character
        local myRoot = getRoot(me)
        if not me or not myRoot then smartespFlinging = false return end

        local tChar = targetPlayer.Character
        local tRoot = tChar and tChar:FindFirstChild("HumanoidRootPart")
        if not tRoot or not tRoot.Parent then smartespFlinging = false return end

        local savedCFrame = myRoot.CFrame

        -- Noclip
        for _, v in pairs(me:GetDescendants()) do
                if v:IsA("BasePart") then v.CanCollide = false end
        end

        -- BodyAngularVelocity for insane spin
        local bav = Instance.new("BodyAngularVelocity")
        bav.Name = randomString()
        bav.AngularVelocity = Vector3.new(999999, 999999, 999999)
        bav.MaxTorque = Vector3.new(1e9, 1e9, 1e9)
        bav.P = 1e9
        bav.Parent = myRoot

        local step = 0
        local done = false

        local conn = RunService.Heartbeat:Connect(function()
                if done then return end
                if not tRoot or not tRoot.Parent then done = true return end

                step = step + 1
                -- ONLY up/down jitter at light speed (BAV handles spinning, stay on the player)
                local jY = math.sin(step * 2.0) * 10
                myRoot.CFrame = tRoot.CFrame + Vector3.new(0, jY, 0)

                -- Once target is flying fast enough, end fling
                local vel = tRoot.AssemblyLinearVelocity
                if vel.Magnitude > 500 then
                        done = true
                end
        end)

        task.spawn(function()
                while not done do task.wait(0.01) end
                conn:Disconnect()
                task.wait(0.2)
                if bav and bav.Parent then bav:Destroy() end
                myRoot.CFrame = savedCFrame
                for _, v in pairs(me:GetDescendants()) do
                        if v:IsA("BasePart") then v.CanCollide = true end
                end
                smartespFlinging = false
                notify('Smart ESP', 'Fling complete! Returned to original position.')
        end)

        notify('Smart ESP', 'Flinging ' .. targetPlayer.Name .. '...')
end

-- ===== COMMAND: smartesp =====
addcmd('smartesp', {}, function(args, speaker)
        if smartespActive then execCmd('unsmartesp') return end
        smartespActive = true

        for _, p in pairs(Players:GetPlayers()) do
                if p ~= speaker then
                        pcall(function() smartesp_AddTo(p) end)
                end
        end

        for _, p in pairs(Players:GetPlayers()) do
                if p ~= speaker then
                        local conn = p.CharacterAdded:Connect(function(c)
                                if not smartespActive then return end
                                task.wait(2)
                                if smartespActive then pcall(function() smartesp_AddTo(p) end) end
                        end)
                        smartespCharConns[p] = conn
                end
        end

        smartespPlayerAddConn = Players.PlayerAdded:Connect(function(p)
                if not smartespActive then return end
                local conn = p.CharacterAdded:Connect(function(c)
                        if not smartespActive then return end
                        task.wait(2)
                        if smartespActive then pcall(function() smartesp_AddTo(p) end) end
                end)
                smartespCharConns[p] = conn
                task.wait(0.5)
                if smartespActive then pcall(function() smartesp_AddTo(p) end) end
        end)

        smartespPlayerRemConn = Players.PlayerRemoving:Connect(function(p)
                smartesp_RemoveFrom(p)
        end)

        -- Every frame: re-create destroyed highlights + update ALL info
        smartespMainConn = RunService.Heartbeat:Connect(function()
                if not smartespActive then return end
                local myRoot = getRoot(speaker.Character)
                for player, _ in pairs(Players:GetPlayers()) do
                        if player ~= speaker then
                        -- Re-create if highlight was destroyed
                        if not smartespHighlights[player] or not smartespHighlights[player].Parent then
                                if player.Character and player.Character:FindFirstChild("Head") then
                                        pcall(function() smartesp_AddTo(player) end)
                                end
                        end
                        local hl = smartespHighlights[player]
                        if hl and hl.Parent and player.Character then
                                -- SERVERSIDED: teleport unanchored part to follow player head
                                local ssP = smartespSSParts[player]
                                if ssP and ssP.Parent then
                                        local tHead = player.Character:FindFirstChild("Head")
                                        if tHead then
                                                ssP.CFrame = tHead.CFrame * CFrame.new(0, 3.5, 0)
                                                ssP.AssemblyLinearVelocity = Vector3.zero
                                                ssP.AssemblyAngularVelocity = Vector3.zero
                                        end
                                end
                                -- Update role color
                                local role = smartesp_GetRole(player)
                                local color = smartesp_Colors[role] or Color3.fromRGB(128, 128, 128)
                                hl.FillColor = color

                                -- Update billboard info
                                local bb = smartespBills[player]
                                if bb and bb.Parent then
                                        local bg = bb:FindFirstChild("Frame")
                                        if bg then
                                                local roleLbl = bg:FindFirstChild("RoleLabel")
                                                if roleLbl then
                                                        roleLbl.Text = "[ " .. role:upper() .. " ]"
                                                        roleLbl.TextColor3 = color
                                                end
                                                local distLbl = bg:FindFirstChild("DistLabel")
                                                if distLbl and myRoot then
                                                        local tRoot = player.Character:FindFirstChild("HumanoidRootPart")
                                                        if tRoot then
                                                                local dist = math.floor((tRoot.Position - myRoot.Position).Magnitude)
                                                                distLbl.Text = dist .. " studs away"
                                                        end
                                                end
                                                local toolsLbl = bg:FindFirstChild("ToolsLabel")
                                                if toolsLbl then
                                                        local tools = smartesp_GetTools(player)
                                                        if #tools > 0 then
                                                                toolsLbl.Text = "Tools: " .. table.concat(tools, ", ")
                                                        else
                                                                toolsLbl.Text = "Tools: None"
                                                        end
                                                end
                                                local hpBar = bg:FindFirstChild("HpBg")
                                                if hpBar then
                                                        local bar = hpBar:FindFirstChild("HpBar")
                                                        if bar then
                                                                local hum = player.Character:FindFirstChildOfClass("Humanoid")
                                                                if hum then
                                                                        local pct = math.clamp(hum.Health / hum.MaxHealth, 0, 1)
                                                                        bar.Size = UDim2.new(pct, 0, 1, 0)
                                                                        bar.BackgroundColor3 = pct > 0.5 and Color3.fromRGB(0,255,0) or pct > 0.25 and Color3.fromRGB(255,255,0) or Color3.fromRGB(255,0,0)
                                                                end
                                                        end
                                                end
                                        end
                                end
                        end
                        end
                end
        end)

        -- Click-to-fling
        local UIS = game:GetService("UserInputService")
        smartespClickConn = UIS.InputBegan:Connect(function(input, gpe)
                if gpe then return end
                if input.UserInputType ~= Enum.UserInputType.MouseButton1 then return end
                if smartespFlinging then return end

                local mouse = Players.LocalPlayer:GetMouse()
                local cam = workspace.CurrentCamera
                local ray = cam:ScreenPointToRay(mouse.X, mouse.Y)
                local params = RaycastParams.new()
                params.FilterDescendantsInstances = {speaker.Character}
                params.FilterType = Enum.RaycastFilterType.Exclude
                local hit = workspace:Raycast(ray.Origin, ray.Direction * 1000, params)

                if hit then
                        for _, p in pairs(Players:GetPlayers()) do
                                if p ~= speaker and p.Character then
                                        local ok = pcall(function()
                                                return p.Character:IsAncestorOf(hit.Instance)
                                        end)
                                        if ok then
                                                task.spawn(function() smartesp_Fling(p, speaker) end)
                                                break
                                        end
                                end
                        end
                end
        end)

        showArcPopup('Smart ESP', true)
        notify('Smart ESP', 'SERVERSIDED ON! All players see billboards. Click to fling!')
end)

-- ===== COMMAND: unsmartesp =====
addcmd('unsmartesp', {'nosmartesp'}, function(args, speaker)
        smartespActive = false
        smartespFlinging = false
        if smartespMainConn then pcall(function() smartespMainConn:Disconnect() end) smartespMainConn = nil end
        if smartespClickConn then pcall(function() smartespClickConn:Disconnect() end) smartespClickConn = nil end
        if smartespPlayerAddConn then pcall(function() smartespPlayerAddConn:Disconnect() end) smartespPlayerAddConn = nil end
        if smartespPlayerRemConn then pcall(function() smartespPlayerRemConn:Disconnect() end) smartespPlayerRemConn = nil end
        for _, p in pairs(Players:GetPlayers()) do
                smartesp_RemoveFrom(p)
        end
        smartespHighlights = {}
        smartespSSParts = {}
        smartespBills = {}
        smartespCharConns = {}
        -- Clean ALL leftover workspace parts
        for _, obj in pairs(workspace:GetChildren()) do
                if obj.Name:find("ArcYieldSS_") then pcall(function() obj:Destroy() end) end
        end
        showArcPopup('Smart ESP', false)
end)

-- ===== COMMAND: togglesmartesp =====
addcmd('togglesmartesp', {}, function(args, speaker)
        if smartespActive then execCmd('unsmartesp') else execCmd('smartesp') end
end)


-- ======================== MM2 (LOAD BUBBLY MM2) ========================
addcmd('mm2', {}, function(args, speaker)
        notify('Arc Yield', 'Loading Bubbly MM2...')
        local success, err = pcall(function()
                loadstring(readfile("Bubbly_MM2.lua"))()
        end)
        if not success then
                notify('Arc Yield', 'Put Bubbly_MM2.lua in executor workspace folder! Error: ' .. tostring(err))
        end
end)

addcmd('unmm2', {'nomm2', 'mm2off'}, function(args, speaker)
        notify('Arc Yield', 'Use Bubbly MM2 unload if available, or rejoin.')
end)


-- ======================== ASSIST ========================
-- MM2 auto-play helper. Detects murderer role, provides ESP, aim lock, rush, and panic TP.
-- Usage: assist  |  unassist

assistActive = false
assistConn = nil
assistMurderer = nil
assistAimLock = false
assistRush = false
assistEspObjects = {}
assistKeyConns = {}

local function mm2_GetRole(player)
        if not player or not player.Character then return nil end
        local backpack = player:FindFirstChild('Backpack')
        local char = player.Character
        -- Check for knife (murderer)
        for _, item in pairs(char:GetChildren()) do
                if item:IsA('Tool') then
                        local n = item.Name:lower()
                        if n:find('knife') or n:find('murder') then return 'murderer' end
                end
        end
        if backpack then
                for _, item in pairs(backpack:GetChildren()) do
                        if item:IsA('Tool') then
                                local n = item.Name:lower()
                                if n:find('knife') or n:find('murder') then return 'murderer' end
                        end
                end
        end
        -- Check for gun (sheriff)
        for _, item in pairs(char:GetChildren()) do
                if item:IsA('Tool') then
                        local n = item.Name:lower()
                        if n:find('gun') or n:find('revolver') or n:find('pistol') or n:find('sheriff') then return 'sheriff' end
                end
        end
        if backpack then
                for _, item in pairs(backpack:GetChildren()) do
                        if item:IsA('Tool') then
                                local n = item.Name:lower()
                                if n:find('gun') or n:find('revolver') or n:find('pistol') or n:find('sheriff') then return 'sheriff' end
                        end
                end
        end
        return 'innocent'
end

local function assist_ClearESP()
        for _, obj in pairs(assistEspObjects) do
                pcall(function() obj:Destroy() end)
        end
        assistEspObjects = {}
end

local function assist_CreateESP(player, color)
        local char = player.Character
        if not char then return end
        local head = char:FindFirstChild('Head')
        if not head then return end

        -- Billboard for name + role
        local bb = Instance.new('BillboardGui')
        bb.Name = randomString()
        bb.Adornee = head
        bb.Size = UDim2.new(0, 200, 0, 50)
        bb.StudsOffset = Vector3.new(0, 3, 0)
        bb.AlwaysOnTop = true
        bb.Parent = workspace

        local label = Instance.new('TextLabel')
        label.Size = UDim2.new(1, 0, 1, 0)
        label.BackgroundTransparency = 1
        label.TextColor3 = color
        label.TextStrokeColor3 = Color3.new(0, 0, 0)
        label.TextStrokeTransparency = 0.5
        label.Font = Enum.Font.GothamBold
        label.TextScaled = true
        label.Text = player.Name .. ' [' .. mm2_GetRole(player) .. ']'
        label.Parent = bb

        -- Highlight box
        local hl = Instance.new('Highlight')
        hl.Name = randomString()
        hl.Adornee = char
        hl.FillColor = color
        hl.FillTransparency = 0.5
        hl.OutlineColor = color
        hl.OutlineTransparency = 0
        hl.Parent = char

        table.insert(assistEspObjects, bb)
        table.insert(assistEspObjects, hl)
end

addcmd('assist', {'mma', 'mm2assist'}, function(args, speaker)
        if assistActive then execCmd('unassist') return end

        local char = speaker.Character
        if not char or not getRoot(char) then notify('Assist', 'Character not found') return end

        assistActive = true
        assistAimLock = false
        assistRush = false

        notify('Assist', 'Assist enabled! [R] Aim lock, [F] Rush mode. Scanning for murderer...')

        -- Main loop: detect murderer, ESP, aim lock, rush
        assistConn = RunService.Heartbeat:Connect(function(dt)
                if not assistActive then return end

                -- Rescan for murderer
                local foundMurderer = nil
                for _, plr in pairs(Players:GetPlayers()) do
                        if plr ~= speaker and plr.Character and mm2_GetRole(plr) == 'murderer' then
                                foundMurderer = plr
                                break
                        end
                end

                if foundMurderer and foundMurderer ~= assistMurderer then
                        assistMurderer = foundMurderer
                        assist_ClearESP()
                        assist_CreateESP(foundMurderer, Color3.fromRGB(255, 0, 0))
                        notify('Assist', 'Murderer found: ' .. foundMurderer.Name)
                elseif not foundMurderer and assistMurderer then
                        assistMurderer = nil
                        assist_ClearESP()
                end

                -- Aim lock: move camera toward murderer
                if assistAimLock and assistMurderer and assistMurderer.Character then
                        local mHead = assistMurderer.Character:FindFirstChild('Head')
                        if mHead then
                                local cam = workspace.CurrentCamera
                                cam.CFrame = CFrame.lookAt(cam.CFrame.Position, mHead.Position)
                        end
                end

                -- Rush: walk toward murderer at high speed
                if assistRush and assistMurderer and assistMurderer.Character then
                        local mRoot = getRoot(assistMurderer.Character)
                        local myRoot = getRoot(speaker.Character)
                        if mRoot and myRoot then
                                local dir = (mRoot.Position - myRoot.Position)
                                dir = Vector3.new(dir.X, 0, dir.Z)
                                if dir.Magnitude > 0 then
                                        local myHum = speaker.Character:FindFirstChildWhichIsA('Humanoid')
                                        if myHum then
                                                myHum.WalkSpeed = 25
                                                myHum:Move(dir.Unit)
                                        end
                                end
                        end
                end

                -- Panic teleport: if murderer is very close and rush is off, auto-teleport away
                if not assistRush and assistMurderer and assistMurderer.Character then
                        local mRoot = getRoot(assistMurderer.Character)
                        local myRoot = getRoot(speaker.Character)
                        if mRoot and myRoot then
                                local dist = (mRoot.Position - myRoot.Position).Magnitude
                                if dist < 8 then
                                        local awayDir = (myRoot.Position - mRoot.Position).Unit * 30
                                        pcall(function()
                                                speaker.Character:PivotTo(myRoot.CFrame + awayDir)
                                        end)
                                end
                        end
                end
        end)

        -- Key handlers
        table.insert(assistKeyConns, UIS.InputBegan:Connect(function(input, gameProcessed)
                if gameProcessed then return end
                if input.KeyCode == Enum.KeyCode.R then
                        assistAimLock = not assistAimLock
                        notify('Assist', 'Aim lock: ' .. tostring(assistAimLock))
                elseif input.KeyCode == Enum.KeyCode.F then
                        assistRush = not assistRush
                        notify('Assist', 'Rush mode: ' .. tostring(assistRush))
                        if not assistRush then
                                local myHum = speaker.Character and speaker.Character:FindFirstChildWhichIsA('Humanoid')
                                if myHum then myHum.WalkSpeed = 16 end
                        end
                end
        end))

        showArcPopup('Assist', true)
end)

addcmd('unassist', {'noassist', 'assistoff'}, function(args, speaker)
        assistActive = false
        assistMurderer = nil
        assistAimLock = false
        assistRush = false
        if assistConn then assistConn:Disconnect() assistConn = nil end
        for _, conn in pairs(assistKeyConns) do
                pcall(function() conn:Disconnect() end)
        end
        assistKeyConns = {}
        assist_ClearESP()

        local myHum = speaker.Character and speaker.Character:FindFirstChildWhichIsA('Humanoid')
        if myHum then myHum.WalkSpeed = 16 end

        showArcPopup('Assist', false)
        notify('Assist', 'Assist disabled.')
end)

addcmd('toggleassist', {}, function(args, speaker)
        if assistActive then execCmd('unassist') else execCmd('assist') end
end)


-- ======================== SSPAM ========================
-- Serversided spam - fires chat remote rapidly with a message.
-- Usage: sspam [message]  |  stopsspam

sspamActive = false
sspamConn = nil

addcmd('sspam', {'spam', 'chatspam'}, function(args, speaker)
        if sspamActive then execCmd('stopsspam') return end

        local msg = table.concat(args, ' ') or 'Arc Yield on top!'
        if msg == '' then msg = 'Arc Yield on top!' end

        sspamActive = true
        notify('SSpam', 'Spamming: ' .. msg .. ' (run stopsspam to stop)')

        sspamConn = RunService.Heartbeat:Connect(function(dt)
                if not sspamActive then return end
                pcall(function()
                        local chatRemote = game:GetService('ReplicatedStorage'):FindFirstChild('DefaultChatSystemChatEvents')
                        if chatRemote then
                                local sayMsg = chatRemote:FindFirstChild('SayMessageRequest')
                                if sayMsg then
                                        sayMsg:FireServer(msg, 'All')
                                end
                        end
                end)
                task.wait(1.5)
        end)
end)

addcmd('stopsspam', {'unsspam', 'nospam', 'sspamoff'}, function(args, speaker)
        sspamActive = false
        if sspamConn then sspamConn:Disconnect() sspamConn = nil end
        notify('SSpam', 'Spam stopped.')
end)


-- ======================== SPAZ TOOLS ========================
-- Custom tool manipulation commands: equip, orbit, spaz, give, throw, sort, etc.
-- All tool visual effects are LOCAL only (Handle CFrame/Size changes).
-- The orbit/spin replicates to server so other players see tools move too.

-- Shared state for tool commands
spazToolsConn = nil
spazToolsActive = false
orbitToolsConn = nil
orbitToolsActive = false
sortToolsConn = nil
sortToolsActive = false
spinToolsConn = nil
spinToolsActive = false

-- Unique axis combinations so every tool spins differently
local toolUniqueAxes = {
        {1, 0, 0},   {0, 1, 0},   {0, 0, 1},
        {1, 1, 0},   {0, 1, 1},   {1, 0, 1},
        {1, 1, 1},   {2, 0.5, 0.3}
}

-- Helper: get all tools with handles currently parented to character
local function getCharTools(char)
        local tools = {}
        for _, v in pairs(char:GetChildren()) do
                if v:IsA('Tool') and v:FindFirstChild('Handle') then
                        table.insert(tools, v)
                end
        end
        return tools
end

-- Helper: stop ALL active tool effect loops (call before starting any new one)
local function stopAllToolLoops()
        if spazToolsConn then spazToolsConn:Disconnect() spazToolsConn = nil end
        if orbitToolsConn then orbitToolsConn:Disconnect() orbitToolsConn = nil end
        if sortToolsConn then sortToolsConn:Disconnect() sortToolsConn = nil end
        if spinToolsConn then spinToolsConn:Disconnect() spinToolsConn = nil end
        spazToolsActive = false
        orbitToolsActive = false
        sortToolsActive = false
        spinToolsActive = false
end

-- Helper: restore tool handles to normal size after tiny-mode
local function restoreToolSizes(char)
        for _, v in pairs(char:GetChildren()) do
                if v:IsA('Tool') and v:FindFirstChild('Handle') then
                        v.Handle.Transparency = 0
                        -- Size is network-owned so we can't force restore it on all clients,
                        -- but we restore it locally
                end
        end
end

-- equiptools - Equip all tools from backpack at once
addcmd('equiptools', {'equipall'}, function(args, speaker)
        local char = speaker.Character
        if not char then return notify('Equip Tools', 'No character found!') end
        local count = 0
        for _, v in pairs(speaker.Backpack:GetChildren()) do
                if v:IsA('Tool') then
                        v.Parent = char
                        if v:FindFirstChild('Handle') then
                                v.Handle.Massless = true
                                v.Handle.CanCollide = false
                        end
                        count = count + 1
                end
        end
        notify('Equip Tools', 'Equipped ' .. count .. ' tools!')
end)

-- unequiptools - Unequip all tools back to backpack
addcmd('unequiptools', {'unequipall'}, function(args, speaker)
        stopAllToolLoops()
        local char = speaker.Character
        if not char then return notify('Unequip Tools', 'No character found!') end
        local count = 0
        for _, v in pairs(char:GetChildren()) do
                if v:IsA('Tool') then
                        v.Parent = speaker.Backpack
                        count = count + 1
                end
        end
        restoreToolSizes(char)
        notify('Unequip Tools', 'Unequipped ' .. count .. ' tools!')
end)

-- spaztools - Equip all tools, make them orbit around you (no spinning)
-- Smooth orbit, each tool evenly spaced in a circle
addcmd('spaztools', {'spaz'}, function(args, speaker)
        if spazToolsActive then
                stopAllToolLoops()
                restoreToolSizes(speaker.Character or speaker.CharacterAdded:Wait())
                return notify('Spaz Tools', 'OFF')
        end

        stopAllToolLoops()

        local char = speaker.Character
        if not char then return notify('Spaz Tools', 'No character found!') end

        -- Equip all tools first
        for _, v in pairs(speaker.Backpack:GetChildren()) do
                if v:IsA('Tool') then
                        v.Parent = char
                        if v:FindFirstChild('Handle') then
                                v.Handle.Massless = true
                                v.Handle.CanCollide = false
                        end
                end
        end

        -- Parse optional settings from args
        local orbitSpeed = tonumber(args[1]) or 4
        local orbitRadius = tonumber(args[2]) or 8
        local orbitHeight = tonumber(args[3]) or 2

        local angle = 0
        spazToolsActive = true

        spazToolsConn = RunService.Heartbeat:Connect(function(dt)
                local hrp = getRoot(char)
                if not hrp or not spazToolsActive then return end

                local tools = getCharTools(char)
                if #tools == 0 then return end

                angle = angle + dt * orbitSpeed

                for i, tool in ipairs(tools) do
                        local handle = tool.Handle

                        -- LAG FIX: Make tool tiny locally so your GPU doesn't render the full 3D model
                        handle.Size = Vector3.new(0.01, 0.01, 0.01)

                        -- Evenly space tools in a circle around player
                        local angleOffset = (2 * math.pi / #tools) * (i - 1)
                        local a = angle + angleOffset

                        local x = math.cos(a) * orbitRadius
                        local z = math.sin(a) * orbitRadius

                        local orbitPosition = hrp.CFrame * CFrame.new(x, orbitHeight, z)

                        -- Face outward from center
                        local lookAt = orbitPosition * CFrame.Angles(0, a + math.pi / 2, 0)

                        -- This replicates to server so others see them move too
                        handle.CFrame = lookAt
                end
        end)

        notify('Spaz Tools', 'ON - Tools orbiting! (speed: ' .. orbitSpeed .. ')')
end)

-- orbitttools - Orbit all tools around you (smooth orbit, no crazy spinning)
addcmd('orbitttools', {'toolorbit'}, function(args, speaker)
        if orbitToolsActive then
                stopAllToolLoops()
                restoreToolSizes(speaker.Character or speaker.CharacterAdded:Wait())
                return notify('Orbit Tools', 'OFF')
        end

        stopAllToolLoops()

        local char = speaker.Character
        if not char then return notify('Orbit Tools', 'No character found!') end

        -- Equip all tools
        for _, v in pairs(speaker.Backpack:GetChildren()) do
                if v:IsA('Tool') then
                        v.Parent = char
                        if v:FindFirstChild('Handle') then
                                v.Handle.Massless = true
                                v.Handle.CanCollide = false
                        end
                end
        end

        local speed = tonumber(args[1]) or 3
        local radius = tonumber(args[2]) or 6
        local height = tonumber(args[3]) or 2
        local angle = 0

        orbitToolsActive = true

        orbitToolsConn = RunService.Heartbeat:Connect(function(dt)
                local hrp = getRoot(char)
                if not hrp or not orbitToolsActive then return end

                local tools = getCharTools(char)
                if #tools == 0 then return end

                angle = angle + dt * speed

                for i, tool in ipairs(tools) do
                        local handle = tool.Handle

                        -- Keep tools at normal size for a clean orbit look
                        handle.Size = Vector3.new(0.01, 0.01, 0.01)

                        local angleOffset = (2 * math.pi / #tools) * (i - 1)
                        local a = angle + angleOffset

                        local x = math.cos(a) * radius
                        local z = math.sin(a) * radius

                        local orbitPos = hrp.CFrame * CFrame.new(x, height, z)

                        -- Face outward from center
                        local lookAt = orbitPos * CFrame.Angles(0, a + math.pi / 2, 0)

                        handle.CFrame = lookAt
                end
        end)

        notify('Orbit Tools', 'ON - ' .. #getCharTools(char) .. ' tools orbiting!')
end)

-- toolspin - Spin all equipped tools in place (no orbiting, just spinning)
addcmd('toolspin', {}, function(args, speaker)
        if spinToolsActive then
                stopAllToolLoops()
                restoreToolSizes(speaker.Character or speaker.CharacterAdded:Wait())
                return notify('Tool Spin', 'OFF')
        end

        stopAllToolLoops()

        local char = speaker.Character
        if not char then return notify('Tool Spin', 'No character found!') end

        -- Equip all tools
        for _, v in pairs(speaker.Backpack:GetChildren()) do
                if v:IsA('Tool') then
                        v.Parent = char
                        if v:FindFirstChild('Handle') then
                                v.Handle.Massless = true
                                v.Handle.CanCollide = false
                        end
                end
        end

        local spinSpeed = tonumber(args[1]) or 10

        spinToolsActive = true
        local startTime = tick()

        spinToolsConn = RunService.RenderStepped:Connect(function()
                if not spinToolsActive then return end
                local tools = getCharTools(char)
                if #tools == 0 then return end

                local elapsed = tick() - startTime

                for i, tool in ipairs(tools) do
                        local handle = tool.Handle
                        handle.Size = Vector3.new(0.01, 0.01, 0.01)

                        local axisData = toolUniqueAxes[((i - 1) % #toolUniqueAxes) + 1]
                        local spinX = elapsed * spinSpeed * axisData[1]
                        local spinY = elapsed * spinSpeed * axisData[2]
                        local spinZ = elapsed * spinSpeed * axisData[3]

                        local hrp = getRoot(char)
                        if hrp then
                                handle.CFrame = hrp.CFrame * CFrame.new(0, 3, 0) * CFrame.Angles(spinX, spinY, spinZ)
                        end
                end
        end)

        notify('Tool Spin', 'ON - Spinning ' .. #getCharTools(char) .. ' tools!')
end)

-- toolsort - Arrange all tools in a neat formation (circle, line, grid)
-- Usage: toolsort circle/line/grid [radius/spacing]
addcmd('toolsort', {}, function(args, speaker)
        if sortToolsActive then
                stopAllToolLoops()
                restoreToolSizes(speaker.Character or speaker.CharacterAdded:Wait())
                return notify('Tool Sort', 'OFF')
        end

        stopAllToolLoops()

        local char = speaker.Character
        if not char then return notify('Tool Sort', 'No character found!') end

        -- Equip all tools
        for _, v in pairs(speaker.Backpack:GetChildren()) do
                if v:IsA('Tool') then
                        v.Parent = char
                        if v:FindFirstChild('Handle') then
                                v.Handle.Massless = true
                                v.Handle.CanCollide = false
                        end
                end
        end

        local formation = (args[1] or 'circle'):lower()
        local param = tonumber(args[2]) or 5

        sortToolsActive = true

        sortToolsConn = RunService.Heartbeat:Connect(function()
                local hrp = getRoot(char)
                if not hrp or not sortToolsActive then return end

                local tools = getCharTools(char)
                if #tools == 0 then return end

                for i, tool in ipairs(tools) do
                        local handle = tool.Handle
                        handle.Size = Vector3.new(0.01, 0.01, 0.01)

                        local targetCFrame

                        if formation == 'line' then
                                -- Horizontal line in front of player
                                local offset = (i - (#tools + 1) / 2) * param
                                targetCFrame = hrp.CFrame * CFrame.new(offset, 3, -5)

                        elseif formation == 'grid' then
                                -- Grid layout
                                local cols = math.ceil(math.sqrt(#tools))
                                local row = math.floor((i - 1) / cols)
                                local col = (i - 1) % cols
                                local offsetX = (col - (cols - 1) / 2) * param
                                local offsetZ = row * param
                                targetCFrame = hrp.CFrame * CFrame.new(offsetX, 3, -5 - offsetZ)

                        else
                                -- Circle (default)
                                local angle = (2 * math.pi / #tools) * (i - 1)
                                local x = math.cos(angle) * param
                                local z = math.sin(angle) * param
                                targetCFrame = hrp.CFrame * CFrame.new(x, 3, z)
                        end

                        -- Smoothly lerp to target position
                        handle.CFrame = targetCFrame
                end
        end)

        notify('Tool Sort', 'ON - Formation: ' .. formation .. ' (' .. #getCharTools(char) .. ' tools)')
end)

-- givetool [player] [toolname] - Visually attach a tool to a player (client-side only)
-- This makes it LOOK like the target player is holding the specified tool
addcmd('givetool', {'faktool', 'visgive'}, function(args, speaker)
        if not args[1] then return notify('Give Tool', 'Usage: ;givetool player [toolname]') end
        if not args[2] then return notify('Give Tool', 'Usage: ;givetool player [toolname] - specify a tool name or "me" to use your equipped tool') end

        local players = getPlayer(args[1], speaker)
        if #players == 0 then return notify('Give Tool', 'Player not found!') end

        -- Find the tool to clone: check backpack first, then equipped
        local sourceTool = nil
        local toolName = table.concat(args, ' ', 2)

        -- "me" = use the tool you're currently holding
        if toolName:lower() == 'me' then
                local char = speaker.Character
                if char then
                        for _, v in pairs(char:GetChildren()) do
                                if v:IsA('Tool') then sourceTool = v break end
                        end
                end
        else
                -- Search backpack
                for _, v in pairs(speaker.Backpack:GetChildren()) do
                        if v:IsA('Tool') and v.Name:lower():find(toolName:lower(), 1, true) then
                                sourceTool = v break
                        end
                end
                -- Search equipped
                if not sourceTool and speaker.Character then
                        for _, v in pairs(speaker.Character:GetChildren()) do
                                if v:IsA('Tool') and v.Name:lower():find(toolName:lower(), 1, true) then
                                        sourceTool = v break
                                end
                        end
                end
        end

        if not sourceTool then return notify('Give Tool', 'Tool "' .. toolName .. '" not found in your backpack or equipped!') end

        -- Clone and attach to each target player
        local count = 0
        for _, idx in pairs(players) do
                local targetPlr = Players[idx]
                local targetChar = targetPlr.Character
                if targetChar then
                        local targetRoot = getRoot(targetChar)
                        local targetHumanoid = targetChar:FindFirstChildWhichIsA('Humanoid')
                        if targetRoot and targetHumanoid then
                                -- Check if we already gave them a fake tool (avoid duplicates)
                                local existing = targetChar:FindFirstChild('__FakeTool_' .. sourceTool.Name)
                                if existing then existing:Destroy() end

                                local clone = sourceTool:Clone()
                                clone.Name = '__FakeTool_' .. sourceTool.Name

                                -- Make it purely visual (no damage, no interaction)
                                if clone:FindFirstChild('Handle') then
                                        clone.Handle.Massless = true
                                        clone.Handle.CanCollide = false
                                        -- Remove any scripts inside
                                        for _, s in pairs(clone:GetDescendants()) do
                                                if s:IsA('Script') or s:IsA('LocalScript') then
                                                        s:Destroy()
                                                end
                                        end
                                end

                                clone.Parent = targetChar
                                targetHumanoid:EquipTool(clone)
                                count = count + 1
                        end
                end
        end

        notify('Give Tool', 'Gave "' .. sourceTool.Name .. '" to ' .. count .. ' player(s)!')
end)

-- toolthrow - Fling all your tools forward at high speed
addcmd('toolthrow', {'throwtools', 'flingtools'}, function(args, speaker)
        stopAllToolLoops()

        local char = speaker.Character
        if not char then return notify('Tool Throw', 'No character found!') end
        local hrp = getRoot(char)
        if not hrp then return end

        -- First equip all tools
        for _, v in pairs(speaker.Backpack:GetChildren()) do
                if v:IsA('Tool') then
                        v.Parent = char
                        if v:FindFirstChild('Handle') then
                                v.Handle.Massless = true
                                v.Handle.CanCollide = false
                        end
                end
        end

        local throwSpeed = tonumber(args[1]) or 300
        local count = 0
        local throwDir = hrp.CFrame.LookVector

        for _, v in pairs(char:GetChildren()) do
                if v:IsA('Tool') and v:FindFirstChild('Handle') then
                        local handle = v.Handle
                        -- Launch tool forward
                        handle.AssemblyLinearVelocity = throwDir * throwSpeed + Vector3.new(0, 50, 0)
                        count = count + 1
                end
        end

        notify('Tool Throw', 'Threw ' .. count .. ' tools forward at speed ' .. throwSpeed .. '!')
end)

-- toolscatter - Scatter tools in random directions
addcmd('toolscatter', {'scattertools'}, function(args, speaker)
        stopAllToolLoops()

        local char = speaker.Character
        if not char then return notify('Tool Scatter', 'No character found!') end

        -- Equip all tools first
        for _, v in pairs(speaker.Backpack:GetChildren()) do
                if v:IsA('Tool') then
                        v.Parent = char
                        if v:FindFirstChild('Handle') then
                                v.Handle.Massless = true
                                v.Handle.CanCollide = false
                        end
                end
        end

        local scatterSpeed = tonumber(args[1]) or 200
        local count = 0

        for _, v in pairs(char:GetChildren()) do
                if v:IsA('Tool') and v:FindFirstChild('Handle') then
                        local handle = v.Handle
                        local randDir = Vector3.new(
                                math.random(-100, 100),
                                math.random(50, 150),
                                math.random(-100, 100)
                        ).Unit
                        handle.AssemblyLinearVelocity = randDir * scatterSpeed
                        count = count + 1
                end
        end

        notify('Tool Scatter', 'Scattered ' .. count .. ' tools randomly!')
end)

-- toolsnake - Tools follow each other in a snake chain behind you
addcmd('toolsnake', {'snake'}, function(args, speaker)
        if spazToolsActive then
                stopAllToolLoops()
                restoreToolSizes(speaker.Character or speaker.CharacterAdded:Wait())
                return notify('Tool Snake', 'OFF')
        end

        stopAllToolLoops()

        local char = speaker.Character
        if not char then return notify('Tool Snake', 'No character found!') end

        -- Equip all tools
        for _, v in pairs(speaker.Backpack:GetChildren()) do
                if v:IsA('Tool') then
                        v.Parent = char
                        if v:FindFirstChild('Handle') then
                                v.Handle.Massless = true
                                v.Handle.CanCollide = false
                        end
                end
        end

        local spacing = tonumber(args[1]) or 3
        local snakeSpeed = tonumber(args[2]) or 10
        spazToolsActive = true

        -- Store trail positions (circular buffer)
        local trailPositions = {}
        local maxTrail = 50

        spazToolsConn = RunService.Heartbeat:Connect(function(dt)
                local hrp = getRoot(char)
                if not hrp or not spazToolsActive then return end

                local tools = getCharTools(char)
                if #tools == 0 then return end

                -- Add current position to trail
                table.insert(trailPositions, hrp.Position)
                if #trailPositions > maxTrail then
                        table.remove(trailPositions, 1)
                end

                -- Place each tool at an interval along the trail
                for i, tool in ipairs(tools) do
                        local handle = tool.Handle
                        handle.Size = Vector3.new(0.01, 0.01, 0.01)

                        local trailIdx = math.max(1, #trailPositions - (i * spacing))
                        local targetPos = trailPositions[trailIdx] or hrp.Position
                        local targetCFrame = CFrame.new(targetPos) * CFrame.Angles(0, tick() * snakeSpeed, 0)

                        handle.CFrame = targetCFrame
                end
        end)

        notify('Tool Snake', 'ON - ' .. #getCharTools(char) .. ' tools following in a snake chain!')
end)

-- tooldrop - Drop all tools onto the ground beneath you (unequip + let them fall)
addcmd('tooldrop', {'dropall', 'droptools'}, function(args, speaker)
        stopAllToolLoops()

        local char = speaker.Character
        if not char then return notify('Tool Drop', 'No character found!') end
        local hrp = getRoot(char)
        if not hrp then return end

        local count = 0
        for _, v in pairs(char:GetChildren()) do
                if v:IsA('Tool') then
                        -- Move to workspace so it drops on the ground
                        v.Parent = workspace
                        if v:FindFirstChild('Handle') then
                                v.Handle.CFrame = hrp.CFrame * CFrame.new(math.random(-2, 2), 0, math.random(-2, 2))
                                v.Handle.Massless = false
                                v.Handle.CanCollide = true
                        end
                        count = count + 1
                end
        end

        notify('Tool Drop', 'Dropped ' .. count .. ' tools on the ground!')
end)

-- toolbounce - Tools bounce up and down around you
addcmd('toolbounce', {'bouncetools'}, function(args, speaker)
        if sortToolsActive then
                stopAllToolLoops()
                restoreToolSizes(speaker.Character or speaker.CharacterAdded:Wait())
                return notify('Tool Bounce', 'OFF')
        end

        stopAllToolLoops()

        local char = speaker.Character
        if not char then return notify('Tool Bounce', 'No character found!') end

        -- Equip all tools
        for _, v in pairs(speaker.Backpack:GetChildren()) do
                if v:IsA('Tool') then
                        v.Parent = char
                        if v:FindFirstChild('Handle') then
                                v.Handle.Massless = true
                                v.Handle.CanCollide = false
                        end
                end
        end

        local bounceHeight = tonumber(args[1]) or 8
        local bounceSpeed = tonumber(args[2]) or 5
        local radius = tonumber(args[3]) or 4

        sortToolsActive = true
        local startTime = tick()

        sortToolsConn = RunService.Heartbeat:Connect(function()
                local hrp = getRoot(char)
                if not hrp or not sortToolsActive then return end

                local tools = getCharTools(char)
                if #tools == 0 then return end

                local elapsed = tick() - startTime

                for i, tool in ipairs(tools) do
                        local handle = tool.Handle
                        handle.Size = Vector3.new(0.01, 0.01, 0.01)

                        -- Each tool has its own bounce phase offset
                        local phase = (2 * math.pi / #tools) * (i - 1)
                        local angle = elapsed * bounceSpeed + phase

                        local x = math.cos(angle) * radius
                        local z = math.sin(angle) * radius
                        -- Bounce height using absolute sine for up-and-down motion
                        local y = math.abs(math.sin(elapsed * bounceSpeed * 1.5 + phase)) * bounceHeight

                        local targetPos = hrp.CFrame * CFrame.new(x, y + 1, z)

                        -- Spin while bouncing
                        local axisData = toolUniqueAxes[((i - 1) % #toolUniqueAxes) + 1]
                        local spinCFrame = CFrame.Angles(
                                elapsed * 3 * axisData[1],
                                elapsed * 3 * axisData[2],
                                elapsed * 3 * axisData[3]
                        )

                        handle.CFrame = targetPos * spinCFrame
                end
        end)

        notify('Tool Bounce', 'ON - ' .. #getCharTools(char) .. ' tools bouncing!')
end)


-- ======================== UNANCHORED PART CONTROL ========================

-- scatter - Scatter all unanchored parts away from you
addcmd('scatter', {}, function(args, speaker)
        local r = getRoot(speaker.Character)
        if not r then return end
        local count = 0
        for _, p in pairs(workspace:GetDescendants()) do
                if p:IsA('BasePart') and p.Anchored == false and p.Name ~= 'HumanoidRootPart' then
                        local dir = (p.Position - r.Position).Unit
                        p.AssemblyLinearVelocity = dir * 300 + Vector3.new(0, 100, 0)
                        count = count + 1
                end
        end
        notify('Scatter', 'Launched ' .. count .. ' parts!')
end)

-- gather - Gather all unanchored parts to you
addcmd('gather', {}, function(args, speaker)
        local r = getRoot(speaker.Character)
        if not r then return end
        local count = 0
        for _, p in pairs(workspace:GetDescendants()) do
                if p:IsA('BasePart') and p.Anchored == false and p.Name ~= 'HumanoidRootPart' then
                        p:PivotTo(r.CFrame * CFrame.new(math.random(-5,5), 0, math.random(-5,5)))
                        count = count + 1
                end
        end
        notify('Gather', 'Gathered ' .. count .. ' parts!')
end)

-- deleteparts - Delete all unanchored parts (not player parts)
addcmd('deleteparts', {'delparts'}, function(args, speaker)
        local count = 0
        for _, p in pairs(workspace:GetDescendants()) do
                if p:IsA('BasePart') and p.Anchored == false and p.Name ~= 'HumanoidRootPart' then
                        local isPlayerPart = false
                        for _, pl in pairs(Players:GetPlayers()) do
                                if pl.Character and pl.Character:IsAncestorOf(p) then isPlayerPart = true break end
                        end
                        if not isPlayerPart then
                                p:Destroy()
                                count = count + 1
                        end
                end
        end
        notify('Delete Parts', 'Deleted ' .. count .. ' unanchored parts')
end)

-- anchorparts - Anchor all unanchored parts
addcmd('anchorparts', {}, function(args, speaker)
        local count = 0
        for _, p in pairs(workspace:GetDescendants()) do
                if p:IsA('BasePart') and p.Anchored == false then
                        p.Anchored = true
                        count = count + 1
                end
        end
        notify('Anchor Parts', 'Anchored ' .. count .. ' parts')
end)

-- unanchorparts - Unanchor all anchored parts (except terrain)
addcmd('unanchorparts', {}, function(args, speaker)
        local count = 0
        for _, p in pairs(workspace:GetDescendants()) do
                if p:IsA('BasePart') and p.Anchored == true and p.Name ~= 'Terrain' then
                        p.Anchored = false
                        count = count + 1
                end
        end
        notify('Unanchor', 'Unanchored ' .. count .. ' parts')
end)

-- orbitparts - Make all unanchored parts orbit around you
orbitPartsConn = nil
orbitPartsList = {}
addcmd('orbitparts', {}, function(args, speaker)
        if orbitPartsConn then orbitPartsConn:Disconnect() orbitPartsConn = nil
                for _, v in pairs(orbitPartsList) do pcall(function() v.bv:Destroy() end) end
                orbitPartsList = {}
                return notify('Orbit Parts','OFF') end
        local r = getRoot(speaker.Character)
        if not r then return end
        local parts = {}
        for _, p in pairs(workspace:GetDescendants()) do
                if p:IsA('BasePart') and p.Anchored == false and p.Name ~= 'HumanoidRootPart' and p.Size.Magnitude < 10 then
                        local isPlayerPart = false
                        for _, pl in pairs(Players:GetPlayers()) do
                                if pl.Character and pl.Character:IsAncestorOf(p) then isPlayerPart = true break end
                        end
                        if not isPlayerPart then parts[#parts+1] = p end
                end
        end
        local angle = 0
        orbitPartsConn = RunService.Heartbeat:Connect(function(dt)
                local root = getRoot(speaker.Character)
                if not root then return end
                angle = angle + dt * 2
                for i, p in pairs(parts) do
                        if p and p.Parent then
                                local a = angle + (i * (math.pi * 2 / #parts))
                                local radius = 20 + math.sin(angle + i) * 5
                                local targetPos = root.Position + Vector3.new(math.cos(a) * radius, math.sin(a * 0.5) * 3, math.sin(a) * radius)
                                p.Velocity = (targetPos - p.Position) * 10
                        end
                end
        end)
        notify('Orbit Parts', 'Orbiting ' .. #parts .. ' parts around you!')
end)

-- spiralparts - Make parts spiral upward from your position
spiralPartsConn = nil
addcmd('spiralparts', {}, function(args, speaker)
        if spiralPartsConn then spiralPartsConn:Disconnect() spiralPartsConn = nil
                return notify('Spiral Parts','OFF') end
        local r = getRoot(speaker.Character)
        if not r then return end
        local parts = {}
        for _, p in pairs(workspace:GetDescendants()) do
                if p:IsA('BasePart') and p.Anchored == false and p.Name ~= 'HumanoidRootPart' and p.Size.Magnitude < 10 then
                        local isPlayerPart = false
                        for _, pl in pairs(Players:GetPlayers()) do
                                if pl.Character and pl.Character:IsAncestorOf(p) then isPlayerPart = true break end
                        end
                        if not isPlayerPart then parts[#parts+1] = p end
                end
        end
        local t = 0
        spiralPartsConn = RunService.Heartbeat:Connect(function(dt)
                t = t + dt
                local root = getRoot(speaker.Character)
                if not root then return end
                for i, p in pairs(parts) do
                        if p and p.Parent then
                                local h = (t * 20 + i * 3) % 50
                                local a = t * 3 + i * 0.5
                                local radius = 5 + (h / 50) * 15
                                local targetPos = root.Position + Vector3.new(math.cos(a) * radius, h, math.sin(a) * radius)
                                p.Velocity = (targetPos - p.Position) * 8
                        end
                end
        end)
        notify('Spiral Parts', 'Spiraling ' .. #parts .. ' parts!')
end)

-- partrain - Rain unanchored parts from above
partRainConn = nil
addcmd('partrain', {}, function(args, speaker)
        if partRainConn then partRainConn:Disconnect() partRainConn = nil
                return notify('Part Rain','OFF') end
        local r = getRoot(speaker.Character)
        if not r then return end
        local parts = {}
        for _, p in pairs(workspace:GetDescendants()) do
                if p:IsA('BasePart') and p.Anchored == false and p.Name ~= 'HumanoidRootPart' and p.Size.Magnitude < 10 then
                        local isPlayerPart = false
                        for _, pl in pairs(Players:GetPlayers()) do
                                if pl.Character and pl.Character:IsAncestorOf(p) then isPlayerPart = true break end
                        end
                        if not isPlayerPart then parts[#parts+1] = p end
                end
        end
        partRainConn = RunService.Heartbeat:Connect(function()
                local root = getRoot(speaker.Character)
                if not root then return end
                for _, p in pairs(parts) do
                        if p and p.Parent then
                                p.Velocity = Vector3.new(math.random(-5,5), -200, math.random(-5,5))
                        end
                end
        end)
        notify('Part Rain', 'Raining ' .. #parts .. ' parts from above!')
end)


-- ======================== SERVER-SIDED FEATURES ========================

-- antikick - Hooks Kick method to prevent being kicked
antikickHooked = false
addcmd('antikick', {}, function(args, speaker)
        if antikickHooked then return notify('Anti Kick','Already active') end
        local mt = getrawmetatable(game)
        if mt and setreadonly then
                local oldNamecall = mt.__namecall
                setreadonly(mt, false)
                mt.__namecall = newcclosure(function(self, ...)
                        local method = getnamecallmethod()
                        if method == 'Kick' and self == Players.LocalPlayer then
                                notify('Anti Kick', 'Blocked a kick attempt!')
                                return nil
                        end
                        return oldNamecall(self, ...)
                end)
                setreadonly(mt, true)
                antikickHooked = true
                notify('Anti Kick', 'ON - kicks blocked!')
        else
                notify('Anti Kick', 'Executor does not support metatable hooking')
        end
end)

-- antivoid - Prevent falling into the void
antiVoidConn = nil
addcmd('antivoid', {}, function(args, speaker)
        if antiVoidConn then antiVoidConn:Disconnect() antiVoidConn = nil
                return notify('Anti Void','OFF') end
        antiVoidConn = RunService.Heartbeat:Connect(function()
                local r = getRoot(speaker.Character)
                if r and r.Position.Y < -50 then
                        r.CFrame = CFrame.new(r.Position.X, 100, r.Position.Z)
                end
        end)
        notify('Anti Void', 'ON - teleporting up if below Y=-50')
end)

-- namespoof [name] / unnamespoof - Spoof your display name visually
nameSpoofConn = nil
addcmd('namespoof', {}, function(args, speaker)
        local newName = args[1] or 'Arc Yield User'
        if not speaker.Character then return end
        local head = speaker.Character:FindFirstChild('Head')
        if not head then return end
        -- Remove old spoof
        local old = head:FindFirstChild('ArcNameSpoof')
        if old then old:Destroy() end
        local bb = Instance.new('BillboardGui')
        bb.Name = 'ArcNameSpoof'
        bb.Adornee = head
        bb.Size = UDim2.new(0, 200, 0, 50)
        bb.StudsOffset = Vector3.new(0, 2.5, 0)
        bb.AlwaysOnTop = true
        bb.MaxDistance = 100
        bb.Parent = head
        local txt = Instance.new('TextLabel')
        txt.Size = UDim2.new(1, 0, 1, 0)
        txt.BackgroundTransparency = 1
        txt.Text = newName
        txt.TextColor3 = Color3.fromRGB(255, 255, 255)
        txt.TextStrokeColor3 = Color3.fromRGB(0, 100, 255)
        txt.TextStrokeTransparency = 0
        txt.Font = Enum.Font.GothamBold
        txt.TextScaled = true
        txt.Parent = bb
        notify('Name Spoof', 'Display name: ' .. newName)
end)

addcmd('unnamespoof', {}, function(args, speaker)
        if speaker.Character then
                local head = speaker.Character:FindFirstChild('Head')
                if head then
                        local old = head:FindFirstChild('ArcNameSpoof')
                        if old then old:Destroy() end
                end
        end
        notify('Name Spoof', 'OFF')
end)

-- godmode / ungodmode - Set WalkSpeed and JumpPower high + regen health
godmodeConn = nil
addcmd('godmode', {}, function(args, speaker)
        if godmodeConn then godmodeConn:Disconnect() godmodeConn = nil
                return notify('God Mode','OFF') end
        local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
        if h then
                h.MaxHealth = math.huge
                h.Health = math.huge
                h.WalkSpeed = 50
                h.JumpPower = 100
        end
        godmodeConn = RunService.Heartbeat:Connect(function()
                local hum = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
                if hum then hum.Health = hum.MaxHealth end
        end)
        notify('God Mode', 'ON - infinite HP, speed 50, jump 100')
end)

-- noclip hold - Hold E to noclip
noclipConn = nil
addcmd('noclip', {}, function(args, speaker)
        if noclipConn then noclipConn:Disconnect() noclipConn = nil
                return notify('Noclip','OFF') end
        noclipConn = RunService.Stepped:Connect(function()
                if speaker.Character then
                        for _, p in pairs(speaker.Character:GetDescendants()) do
                                if p:IsA('BasePart') then p.CanCollide = false end
                        end
                end
        end)
        notify('Noclip', 'ON - walk through walls')
end)


-- ======================== SERVERSIDED COMMANDS ========================
-- TRUE serversided: UNANCHORED parts + Heartbeat teleport (physics engine replicates to ALL players)
-- NO WeldConstraints (client-only, don't replicate)

-- Central tracker: one Stepped loop moves ALL ss parts every frame
ssTracker = {} -- {part, targetRef, offsetCFrame}
ssTrackerConn = nil

local function ssStartTracker()
        if ssTrackerConn then return end
        ssTrackerConn = RunService.Stepped:Connect(function()
                for _, entry in pairs(ssTracker) do
                        if entry.part and entry.part.Parent then
                                local target = entry.getTarget()
                                if target and target.Parent then
                                        entry.part.CFrame = target.CFrame * entry.offset
                                        entry.part.AssemblyLinearVelocity = Vector3.zero
                                        entry.part.AssemblyAngularVelocity = Vector3.zero
                                end
                        end
                end
        end)
end

local function ssStopTracker()
        if ssTrackerConn then ssTrackerConn:Disconnect() ssTrackerConn = nil end
        ssTracker = {}
end

local function ssTrack(part, targetGetter, offset)
        ssStartTracker()
        table.insert(ssTracker, {part = part, getTarget = targetGetter, offset = offset or CFrame.new()})
end

local function ssUntrack(part)
        for i, entry in pairs(ssTracker) do
                if entry.part == part then table.remove(ssTracker, i) break end
        end
end

-- Helper: create an unanchored neon part
local function ssMakePart(name, size, color, material)
        local p = Instance.new("Part")
        p.Name = name
        p.Size = size or Vector3.new(1,1,1)
        p.Color = color or Color3.fromRGB(0, 100, 255)
        p.Material = material or Enum.Material.Neon
        p.CanCollide = false
        p.Anchored = false
        p.CastShadow = false
        p.Parent = workspace
        return p
end

local function ssParseColor(args)
        if args and args[1] and type(args[1]) == 'string' and args[1]:find('#') then
                local ok, c = pcall(function() return Color3.fromHex(args[1]) end)
                if ok then return c end
        end
        return nil
end

-- sshat - Serversided hat (unanchored, follows head)
ssHatPart = nil
addcmd('sshat', {}, function(args, speaker)
        if ssHatPart and ssHatPart.Parent then ssHatPart:Destroy() ssHatPart = nil end
        local char = speaker.Character
        if not char then return end
        local head = char:FindFirstChild('Head')
        if not head then return end
        local hatColor = ssParseColor(args) or Color3.fromRGB(0, 100, 255)
        ssHatPart = ssMakePart('ArcYieldHat', Vector3.new(2, 0.5, 2), hatColor)
        ssHatPart.Shape = Enum.PartType.Cylinder
        ssHatPart.CFrame = head.CFrame * CFrame.new(0, 1.5, 0) * CFrame.Angles(0, 0, math.rad(90))
        ssTrack(ssHatPart, function()
                local c = speaker.Character
                return c and c:FindFirstChild('Head')
        end, CFrame.new(0, 1.5, 0) * CFrame.Angles(0, 0, math.rad(90)))
        notify('SS Hat', 'Serversided hat ON! (unanchored)')
end)

addcmd('unsshat', {}, function(args, speaker)
        if ssHatPart then ssUntrack(ssHatPart) pcall(function() ssHatPart:Destroy() end) ssHatPart = nil end
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldHat' then v:Destroy() end end end)
        notify('SS Hat', 'Removed')
end)

-- sscape - Serversided cape (unanchored, follows root)
ssCapeParts = {}
addcmd('sscape', {}, function(args, speaker)
        for _, v in pairs(ssCapeParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssCapeParts = {}
        local char = speaker.Character
        if not char then return end
        local root = char:FindFirstChild('HumanoidRootPart') or char:FindFirstChild('Torso')
        if not root then return end
        local capeColor = ssParseColor(args) or Color3.fromRGB(0, 100, 255)
        local mainPart = ssMakePart('ArcYieldCape', Vector3.new(2, 3, 0.1), capeColor)
        mainPart.CFrame = root.CFrame * CFrame.new(0, -0.5, 0.5)
        ssTrack(mainPart, function()
                local c = speaker.Character
                return c and (c:FindFirstChild('HumanoidRootPart') or c:FindFirstChild('Torso'))
        end, CFrame.new(0, -0.5, 0.5))
        table.insert(ssCapeParts, mainPart)
        for i = 1, 3 do
                local stripe = ssMakePart('ArcYieldCape', Vector3.new(2, 0.1, 0.15), Color3.fromRGB(255, 255, 255))
                stripe.CFrame = root.CFrame * CFrame.new(0, -0.5 - i * 0.8, 0.5)
                ssTrack(stripe, function()
                        local c = speaker.Character
                        return c and (c:FindFirstChild('HumanoidRootPart') or c:FindFirstChild('Torso'))
                end, CFrame.new(0, -0.5 - i * 0.8, 0.5))
                table.insert(ssCapeParts, stripe)
        end
        notify('SS Cape', 'Serversided cape ON! (unanchored)')
end)

addcmd('unsscape', {}, function(args, speaker)
        for _, v in pairs(ssCapeParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssCapeParts = {}
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldCape' then v:Destroy() end end end)
        notify('SS Cape', 'Removed')
end)

-- sswing - Serversided wings (unanchored, follows root)
ssWingParts = {}
addcmd('sswing', {}, function(args, speaker)
        for _, v in pairs(ssWingParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssWingParts = {}
        local char = speaker.Character
        if not char then return end
        local root = char:FindFirstChild('HumanoidRootPart') or char:FindFirstChild('Torso')
        if not root then return end
        local wingColor = ssParseColor(args) or Color3.fromRGB(255, 255, 255)
        for side = -1, 1, 2 do
                for i = 1, 5 do
                        local feather = ssMakePart('ArcYieldWing', Vector3.new(3 - i * 0.3, 0.3, 0.05), wingColor)
                        feather.Transparency = i * 0.1
                        feather.CFrame = root.CFrame * CFrame.new(side * (1 + i * 0.5), 0.5 + i * 0.3, -0.5) * CFrame.Angles(0, 0, side * math.rad(10 + i * 5))
                        local offset = CFrame.new(side * (1 + i * 0.5), 0.5 + i * 0.3, -0.5) * CFrame.Angles(0, 0, side * math.rad(10 + i * 5))
                        ssTrack(feather, function()
                                local c = speaker.Character
                                return c and (c:FindFirstChild('HumanoidRootPart') or c:FindFirstChild('Torso'))
                        end, offset)
                        table.insert(ssWingParts, feather)
                end
        end
        notify('SS Wings', 'Serversided wings ON! (unanchored)')
end)

addcmd('unsswing', {}, function(args, speaker)
        for _, v in pairs(ssWingParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssWingParts = {}
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldWing' then v:Destroy() end end end)
        notify('SS Wings', 'Removed')
end)

-- ssring - Serversided ring on ground (unanchored, follows you)
ssRingPart = nil
ssRingConn = nil
addcmd('ssring', {}, function(args, speaker)
        if ssRingConn then ssRingConn:Disconnect() ssRingConn = nil end
        if ssRingPart and ssRingPart.Parent then ssRingPart:Destroy() end
        local ringColor = ssParseColor(args) or Color3.fromRGB(0, 100, 255)
        ssRingPart = ssMakePart('ArcYieldRing', Vector3.new(0.2, 20, 20), ringColor)
        ssRingPart.Shape = Enum.PartType.Cylinder
        ssRingPart.Transparency = 0.3
        local r = getRoot(speaker.Character)
        if r then ssRingPart.CFrame = r.CFrame * CFrame.new(0, -3, 0) * CFrame.Angles(0, 0, math.rad(90)) end
        ssRingConn = RunService.Stepped:Connect(function()
                if not ssRingPart or not ssRingPart.Parent then ssRingConn:Disconnect() return end
                local root = getRoot(speaker.Character)
                if root then
                        ssRingPart.CFrame = root.CFrame * CFrame.new(0, -3, 0) * CFrame.Angles(0, 0, math.rad(90))
                        ssRingPart.AssemblyLinearVelocity = Vector3.zero
                        ssRingPart.AssemblyAngularVelocity = Vector3.zero
                end
        end)
        notify('SS Ring', 'Serversided ring ON! (unanchored)')
end)

addcmd('unssring', {}, function(args, speaker)
        if ssRingConn then ssRingConn:Disconnect() ssRingConn = nil end
        if ssRingPart and ssRingPart.Parent then ssRingPart:Destroy() ssRingPart = nil end
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldRing' then v:Destroy() end end end)
        notify('SS Ring', 'Removed')
end)

-- sslight - Serversided light (unanchored, follows root)
ssLightObj = nil
addcmd('sslight', {}, function(args, speaker)
        if ssLightObj and ssLightObj.Parent then ssLightObj:Destroy() ssLightObj = nil end
        local lightColor = ssParseColor(args) or Color3.fromRGB(0, 100, 255)
        ssLightObj = ssMakePart('ArcYieldLight', Vector3.new(0.5, 0.5, 0.5), lightColor)
        ssLightObj.Transparency = 1
        local pl = Instance.new('PointLight')
        pl.Color = lightColor
        pl.Brightness = 5
        pl.Range = 60
        pl.Shadows = true
        pl.Parent = ssLightObj
        ssTrack(ssLightObj, function()
                local c = speaker.Character
                return c and (c:FindFirstChild('HumanoidRootPart') or c:FindFirstChild('Torso'))
        end, CFrame.new())
        notify('SS Light', 'Serversided light ON! (unanchored)')
end)

addcmd('unsslight', {}, function(args, speaker)
        if ssLightObj then ssUntrack(ssLightObj) pcall(function() ssLightObj:Destroy() end) ssLightObj = nil end
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldLight' then v:Destroy() end end end)
        notify('SS Light', 'Removed')
end)

-- ssparticles - Serversided particles on your character
ssParticleParts = {}
addcmd('ssparticles', {}, function(args, speaker)
        for _, v in pairs(ssParticleParts) do pcall(function() v:Destroy() end) end
        ssParticleParts = {}
        local char = speaker.Character
        if not char then return end
        local pColor = ssParseColor(args) or Color3.fromRGB(0, 150, 255)
        for _, part in pairs(char:GetChildren()) do
                if part:IsA('BasePart') then
                        local em = Instance.new('ParticleEmitter')
                        em.Color = ColorSequence.new(pColor, Color3.fromRGB(255, 255, 255))
                        em.Size = NumberSequence.new({NumberSequenceKeypoint.new(0, 0.5), NumberSequenceKeypoint.new(1, 0)})
                        em.Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0, 0.5), NumberSequenceKeypoint.new(1, 1)})
                        em.Lifetime = NumberRange.new(1, 2)
                        em.Rate = 20
                        em.Speed = NumberRange.new(2, 5)
                        em.SpreadAngle = Vector2.new(180, 180)
                        em.LightEmission = 1
                        em.Parent = part
                        table.insert(ssParticleParts, em)
                end
        end
        notify('SS Particles', 'Serversided particles ON!')
end)

addcmd('unssparticles', {}, function(args, speaker)
        for _, v in pairs(ssParticleParts) do pcall(function() v:Destroy() end) end
        ssParticleParts = {}
        notify('SS Particles', 'Removed')
end)

-- ssmusic - Serversided sound (anchored invisible part is fine for sound replication)
ssMusicObj = nil
addcmd('ssmusic', {}, function(args, speaker)
        if ssMusicObj and ssMusicObj.Parent then ssMusicObj:Destroy() ssMusicObj = nil end
        local soundId = args[1] or '6895079853'
        local soundPart = Instance.new('Part')
        soundPart.Name = 'ArcYieldMusic'
        soundPart.Size = Vector3.new(0.5, 0.5, 0.5)
        soundPart.Transparency = 1
        soundPart.CanCollide = false
        soundPart.Anchored = false
        local r = getRoot(speaker.Character)
        if r then soundPart.Position = r.Position end
        soundPart.Parent = workspace
        local snd = Instance.new('Sound')
        snd.Name = 'ArcYieldSnd'
        snd.SoundId = 'rbxassetid://' .. soundId
        snd.Volume = 1
        snd.Looped = true
        snd.PlaybackSpeed = 1
        snd.Parent = soundPart
        snd:Play()
        -- Follow player via tracker
        ssTrack(soundPart, function()
                local c = speaker.Character
                return c and (c:FindFirstChild('HumanoidRootPart') or c:FindFirstChild('Torso'))
        end, CFrame.new())
        ssMusicObj = soundPart
        notify('SS Music', 'Serversided music ON! (unanchored)')
end)

addcmd('unssmusic', {}, function(args, speaker)
        if ssMusicObj then ssUntrack(ssMusicObj) pcall(function() ssMusicObj:Destroy() end) ssMusicObj = nil end
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldMusic' then v:Destroy() end end end)
        notify('SS Music', 'Removed')
end)

-- ssmsg - Serversided floating message (static position, unanchored so it replicates)
ssMsgParts = {}
addcmd('ssmsg', {}, function(args, speaker)
        local msg = table.concat(args, ' ')
        if msg == '' then msg = 'Arc Yield' end
        local char = speaker.Character
        if not char then return end
        local r = getRoot(char)
        if not r then return end
        local msgPart = Instance.new('Part')
        msgPart.Name = 'ArcYieldMsg'
        msgPart.Size = Vector3.new(10, 3, 0.2)
        msgPart.Color = Color3.fromRGB(0, 0, 30)
        msgPart.Material = Enum.Material.Neon
        msgPart.CanCollide = false
        msgPart.Anchored = false
        msgPart.CastShadow = false
        msgPart.CFrame = r.CFrame * CFrame.new(0, 8, -5)
        msgPart.Parent = workspace
        local sg = Instance.new('SurfaceGui')
        sg.Name = 'ArcYieldSG'
        sg.Face = Enum.NormalId.Front
        sg.Parent = msgPart
        local txt = Instance.new('TextLabel')
        txt.Size = UDim2.new(1, 0, 1, 0)
        txt.BackgroundTransparency = 1
        txt.Text = msg
        txt.TextColor3 = Color3.fromRGB(0, 150, 255)
        txt.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
        txt.TextStrokeTransparency = 0
        txt.Font = Enum.Font.GothamBold
        txt.TextScaled = true
        txt.Parent = sg
        -- Keep it in place (unanchored so physics engine replicates)
        ssTrack(msgPart, function() return msgPart end, CFrame.new())
        -- Lock velocity so it doesn't fall
        local conn = RunService.Stepped:Connect(function()
                if not msgPart or not msgPart.Parent then conn:Disconnect() return end
                msgPart.AssemblyLinearVelocity = Vector3.zero
                msgPart.AssemblyAngularVelocity = Vector3.zero
        end)
        table.insert(ssMsgParts, msgPart)
        notify('SS Message', 'Serversided message placed! (unanchored)')
end)

addcmd('unssmsg', {}, function(args, speaker)
        for _, v in pairs(ssMsgParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssMsgParts = {}
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldMsg' then v:Destroy() end end end)
        notify('SS Messages', 'All removed')
end)

-- sscrosshair - Serversided crosshair (unanchored, follows head)
ssCrossParts = {}
addcmd('sscrosshair', {}, function(args, speaker)
        for _, v in pairs(ssCrossParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssCrossParts = {}
        local char = speaker.Character
        if not char then return end
        local head = char:FindFirstChild('Head')
        if not head then return end
        -- Horizontal bar
        local hbar = ssMakePart('ArcYieldCross', Vector3.new(3, 0.3, 0.1), Color3.fromRGB(255, 0, 0))
        hbar.CFrame = head.CFrame * CFrame.new(0, 0, -1)
        ssTrack(hbar, function()
                local c = speaker.Character
                return c and c:FindFirstChild('Head')
        end, CFrame.new(0, 0, -1))
        table.insert(ssCrossParts, hbar)
        -- Vertical bar
        local vbar = ssMakePart('ArcYieldCross', Vector3.new(0.3, 3, 0.1), Color3.fromRGB(255, 0, 0))
        vbar.CFrame = head.CFrame * CFrame.new(0, 0, -1)
        ssTrack(vbar, function()
                local c = speaker.Character
                return c and c:FindFirstChild('Head')
        end, CFrame.new(0, 0, -1))
        table.insert(ssCrossParts, vbar)
        notify('SS Crosshair', 'Serversided crosshair ON! (unanchored)')
end)

addcmd('unsscrosshair', {}, function(args, speaker)
        for _, v in pairs(ssCrossParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssCrossParts = {}
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldCross' then v:Destroy() end end end)
        notify('SS Crosshair', 'Removed')
end)

-- ssarrow - Serversided arrow (unanchored, points to nearest player)
ssArrowPart = nil
ssArrowConn = nil
addcmd('ssarrow', {}, function(args, speaker)
        if ssArrowConn then ssArrowConn:Disconnect() ssArrowConn = nil end
        if ssArrowPart and ssArrowPart.Parent then ssArrowPart:Destroy() end
        ssArrowPart = ssMakePart('ArcYieldArrow', Vector3.new(1, 0.5, 3), Color3.fromRGB(255, 50, 50))
        ssArrowConn = RunService.Stepped:Connect(function()
                if not ssArrowPart or not ssArrowPart.Parent then ssArrowConn:Disconnect() return end
                local myRoot = getRoot(speaker.Character)
                if not myRoot then return end
                local nearest = nil
                local nearestDist = math.huge
                for _, p in pairs(Players:GetPlayers()) do
                        if p ~= speaker and p.Character then
                                local pRoot = p.Character:FindFirstChild('HumanoidRootPart')
                                if pRoot then
                                        local d = (pRoot.Position - myRoot.Position).Magnitude
                                        if d < nearestDist then nearestDist = d nearest = pRoot end
                                end
                        end
                end
                if nearest then
                        local dir = (nearest.Position - myRoot.Position).Unit
                        ssArrowPart.CFrame = CFrame.new(myRoot.Position + dir * 5, nearest.Position)
                        ssArrowPart.AssemblyLinearVelocity = Vector3.zero
                        ssArrowPart.AssemblyAngularVelocity = Vector3.zero
                end
        end)
        notify('SS Arrow', 'Serversided arrow ON! (unanchored)')
end)

addcmd('unssarrow', {}, function(args, speaker)
        if ssArrowConn then ssArrowConn:Disconnect() ssArrowConn = nil end
        if ssArrowPart and ssArrowPart.Parent then ssArrowPart:Destroy() ssArrowPart = nil end
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldArrow' then v:Destroy() end end end)
        notify('SS Arrow', 'Removed')
end)

-- ssorb - Serversided orbiting balls (unanchored, physics replicates)
ssOrbParts = {}
ssOrbConn = nil
addcmd('ssorb', {}, function(args, speaker)
        if ssOrbConn then ssOrbConn:Disconnect() ssOrbConn = nil end
        for _, v in pairs(ssOrbParts) do pcall(function() v:Destroy() end) end
        ssOrbParts = {}
        local orbColor = ssParseColor(args) or Color3.fromRGB(0, 150, 255)
        for i = 1, 6 do
                local orb = ssMakePart('ArcYieldOrb', Vector3.new(0.8, 0.8, 0.8), orbColor)
                orb.Shape = Enum.PartType.Ball
                local pl = Instance.new('PointLight')
                pl.Color = orbColor
                pl.Brightness = 2
                pl.Range = 15
                pl.Parent = orb
                table.insert(ssOrbParts, orb)
        end
        local t = 0
        ssOrbConn = RunService.Stepped:Connect(function(dt)
                t = t + dt * 3
                local myRoot = getRoot(speaker.Character)
                if not myRoot then return end
                for i, orb in pairs(ssOrbParts) do
                        if orb and orb.Parent then
                                local a = t + (i * math.pi * 2 / #ssOrbParts)
                                local r = 5
                                orb.CFrame = CFrame.new(myRoot.Position + Vector3.new(math.cos(a) * r, math.sin(a * 0.7) * 2, math.sin(a) * r))
                                orb.AssemblyLinearVelocity = Vector3.zero
                                orb.AssemblyAngularVelocity = Vector3.zero
                        end
                end
        end)
        notify('SS Orbs', '6 serversided orbiting balls ON! (unanchored)')
end)

addcmd('unssorb', {}, function(args, speaker)
        if ssOrbConn then ssOrbConn:Disconnect() ssOrbConn = nil end
        for _, v in pairs(ssOrbParts) do pcall(function() v:Destroy() end) end
        ssOrbParts = {}
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldOrb' then v:Destroy() end end end)
        notify('SS Orbs', 'Removed')
end)

-- ssfloating - Serversided floating text above YOUR head (unanchored)
ssFloatingPart = nil
addcmd('ssfloating', {}, function(args, speaker)
        if ssFloatingPart and ssFloatingPart.Parent then ssFloatingPart:Destroy() ssFloatingPart = nil end
        local msg = table.concat(args, ' ')
        if msg == '' then msg = 'Arc Yield User' end
        local char = speaker.Character
        if not char then return end
        local head = char:FindFirstChild('Head')
        if not head then return end
        ssFloatingPart = Instance.new('Part')
        ssFloatingPart.Name = 'ArcYieldFloat'
        ssFloatingPart.Size = Vector3.new(0.1, 0.1, 0.1)
        ssFloatingPart.Transparency = 1
        ssFloatingPart.CanCollide = false
        ssFloatingPart.Anchored = false
        ssFloatingPart.Position = head.Position + Vector3.new(0, 3, 0)
        ssFloatingPart.Parent = workspace
        local bb = Instance.new('BillboardGui')
        bb.Name = 'ArcFloatBB'
        bb.Adornee = ssFloatingPart
        bb.Size = UDim2.new(0, 200, 0, 50)
        bb.StudsOffset = Vector3.new(0, 2, 0)
        bb.AlwaysOnTop = true
        bb.Parent = ssFloatingPart
        local txt = Instance.new('TextLabel')
        txt.Size = UDim2.new(1, 0, 1, 0)
        txt.BackgroundTransparency = 1
        txt.Text = msg
        txt.TextColor3 = Color3.fromRGB(0, 200, 255)
        txt.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
        txt.TextStrokeTransparency = 0
        txt.Font = Enum.Font.GothamBold
        txt.TextScaled = true
        txt.Parent = bb
        ssTrack(ssFloatingPart, function()
                local c = speaker.Character
                return c and c:FindFirstChild('Head')
        end, CFrame.new(0, 3, 0))
        notify('SS Floating', 'Serversided floating text ON! (unanchored)')
end)

addcmd('unssfloating', {}, function(args, speaker)
        if ssFloatingPart then ssUntrack(ssFloatingPart) pcall(function() ssFloatingPart:Destroy() end) ssFloatingPart = nil end
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldFloat' then v:Destroy() end end end)
        notify('SS Floating', 'Removed')
end)

-- ssaura - Serversided aura (unanchored, physics replicates)
ssAuraParts = {}
ssAuraConn = nil
addcmd('ssaura', {}, function(args, speaker)
        if ssAuraConn then ssAuraConn:Disconnect() ssAuraConn = nil end
        for _, v in pairs(ssAuraParts) do pcall(function() v:Destroy() end) end
        ssAuraParts = {}
        local auraColor = ssParseColor(args) or Color3.fromRGB(0, 100, 255)
        for i = 1, 8 do
                local p = ssMakePart('ArcYieldAura', Vector3.new(0.6, 0.6, 0.6), auraColor)
                p.Shape = Enum.PartType.Ball
                p.Transparency = 0.3
                table.insert(ssAuraParts, p)
        end
        local t = 0
        ssAuraConn = RunService.Stepped:Connect(function(dt)
                t = t + dt * 2
                local myRoot = getRoot(speaker.Character)
                if not myRoot then return end
                for i, p in pairs(ssAuraParts) do
                        if p and p.Parent then
                                local a = t + (i * math.pi * 2 / #ssAuraParts)
                                local sz = 0.6 + math.sin(t + i) * 0.2
                                p.CFrame = CFrame.new(myRoot.Position + Vector3.new(math.cos(a) * 3, math.sin(t * 2 + i) * 0.5, math.sin(a) * 3))
                                p.Size = Vector3.new(sz, sz, sz)
                                p.AssemblyLinearVelocity = Vector3.zero
                                p.AssemblyAngularVelocity = Vector3.zero
                        end
                end
        end)
        notify('SS Aura', 'Serversided aura ON! (unanchored)')
end)

addcmd('unssaura', {}, function(args, speaker)
        if ssAuraConn then ssAuraConn:Disconnect() ssAuraConn = nil end
        for _, v in pairs(ssAuraParts) do pcall(function() v:Destroy() end) end
        ssAuraParts = {}
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldAura' then v:Destroy() end end end)
        notify('SS Aura', 'Removed')
end)

-- sscrown - Serversided crown (unanchored, follows head)
ssCrownParts = {}
addcmd('sscrown', {}, function(args, speaker)
        for _, v in pairs(ssCrownParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssCrownParts = {}
        local char = speaker.Character
        if not char then return end
        local head = char:FindFirstChild('Head')
        if not head then return end
        -- Base
        local base = ssMakePart('ArcYieldCrown', Vector3.new(1.5, 0.5, 1.5), Color3.fromRGB(255, 215, 0))
        base.CFrame = head.CFrame * CFrame.new(0, 1.2, 0)
        ssTrack(base, function()
                local c = speaker.Character
                return c and c:FindFirstChild('Head')
        end, CFrame.new(0, 1.2, 0))
        table.insert(ssCrownParts, base)
        -- Spikes
        for i = 1, 5 do
                local spike = ssMakePart('ArcYieldCrown', Vector3.new(0.2, 0.8, 0.2), Color3.fromRGB(255, 215, 0))
                local angle = (i - 3) * 0.3
                spike.CFrame = head.CFrame * CFrame.new(angle, 1.7, 0)
                ssTrack(spike, function()
                        local c = speaker.Character
                        return c and c:FindFirstChild('Head')
                end, CFrame.new(angle, 1.7, 0))
                table.insert(ssCrownParts, spike)
        end
        notify('SS Crown', 'Serversided golden crown ON! (unanchored)')
end)

addcmd('unsscrown', {}, function(args, speaker)
        for _, v in pairs(ssCrownParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssCrownParts = {}
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldCrown' then v:Destroy() end end end)
        notify('SS Crown', 'Removed')
end)

-- sstrail - Serversided trail (unanchored balls left behind, physics replicates)
ssTrailParts = {}
ssTrailConn = nil
ssTrailIndex = 0
addcmd('sstrail', {}, function(args, speaker)
        if ssTrailConn then ssTrailConn:Disconnect() ssTrailConn = nil end
        for _, v in pairs(ssTrailParts) do pcall(function() v:Destroy() end) end
        ssTrailParts = {}
        ssTrailIndex = 0
        local trailColor = ssParseColor(args) or Color3.fromRGB(0, 100, 255)
        ssTrailConn = RunService.Heartbeat:Connect(function()
                local myRoot = getRoot(speaker.Character)
                if not myRoot then return end
                ssTrailIndex = ssTrailIndex + 1
                if ssTrailIndex % 3 == 0 then
                        local trailPart = Instance.new('Part')
                        trailPart.Name = 'ArcYieldTrail'
                        trailPart.Shape = Enum.PartType.Ball
                        trailPart.Size = Vector3.new(0.5, 0.5, 0.5)
                        trailPart.Color = trailColor
                        trailPart.Material = Enum.Material.Neon
                        trailPart.CanCollide = false
                        trailPart.Anchored = false
                        trailPart.CastShadow = false
                        trailPart.Position = myRoot.Position
                        trailPart.Parent = workspace
                        -- Freeze it in place (unanchored but velocity zero = physics replicates position)
                        trailPart.AssemblyLinearVelocity = Vector3.zero
                        trailPart.AssemblyAngularVelocity = Vector3.zero
                        table.insert(ssTrailParts, trailPart)
                        task.delay(3, function()
                                pcall(function() trailPart:Destroy() end)
                        end)
                        while #ssTrailParts > 100 do
                                local old = table.remove(ssTrailParts, 1)
                                pcall(function() if old and old.Parent then old:Destroy() end end)
                        end
                end
        end)
        notify('SS Trail', 'Serversided trail ON! (unanchored)')
end)

addcmd('unsstrail', {}, function(args, speaker)
        if ssTrailConn then ssTrailConn:Disconnect() ssTrailConn = nil end
        for _, v in pairs(ssTrailParts) do pcall(function() v:Destroy() end) end
        ssTrailParts = {}
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldTrail' then v:Destroy() end end end)
        notify('SS Trail', 'Removed')
end)

-- ssexplode [player] - Serversided explosion (unanchored explosion = physics replicates)
addcmd('ssexplode', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('SS Explode','Player not found') end
        local r = target.Character:FindFirstChild('HumanoidRootPart')
        if not r then return end
        local e = Instance.new('Explosion')
        e.Position = r.Position
        e.BlastRadius = 30
        e.BlastPressure = 500000
        e.Parent = workspace
        notify('SS Explode', 'Serversided explosion on ' .. target.Name .. '!')
end)

-- ssblock [player] - Serversided cage (unanchored walls = physics replicates)
ssBlockParts = {}
addcmd('ssblock', {}, function(args, speaker)
        for _, v in pairs(ssBlockParts) do pcall(function() v:Destroy() end) end
        ssBlockParts = {}
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('SS Block','Player not found') end
        local r = target.Character:FindFirstChild('HumanoidRootPart')
        if not r then return end
        local size = 8
        local wt = 0.5
        local walls = {
                {Vector3.new(size, size, wt), CFrame.new(0, size/2, -size/2)},
                {Vector3.new(size, size, wt), CFrame.new(0, size/2, size/2)},
                {Vector3.new(wt, size, size), CFrame.new(-size/2, size/2, 0)},
                {Vector3.new(wt, size, size), CFrame.new(size/2, size/2, 0)},
                {Vector3.new(size, wt, size), CFrame.new(0, size, 0)},
                {Vector3.new(size, wt, size), CFrame.new(0, 0, 0)},
        }
        for _, wd in ipairs(walls) do
                local wall = Instance.new('Part')
                wall.Name = 'ArcYieldBlock'
                wall.Size = wd[1]
                wall.Color = Color3.fromRGB(0, 100, 255)
                wall.Material = Enum.Material.ForceField
                wall.Transparency = 0.4
                wall.CanCollide = true
                wall.Anchored = false
                wall.CastShadow = false
                wall.CFrame = r.CFrame * wd[2]
                wall.Parent = workspace
                wall.AssemblyLinearVelocity = Vector3.zero
                wall.AssemblyAngularVelocity = Vector3.zero
                table.insert(ssBlockParts, wall)
        end
        notify('SS Block', 'Serversided cage around ' .. target.Name .. '! (unanchored)')
end)

addcmd('unssblock', {}, function(args, speaker)
        for _, v in pairs(ssBlockParts) do pcall(function() v:Destroy() end) end
        ssBlockParts = {}
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldBlock' then v:Destroy() end end end)
        notify('SS Block', 'Cage removed')
end)

-- ssflag - Serversided flag (unanchored, follows head)
ssFlagParts = {}
addcmd('ssflag', {}, function(args, speaker)
        for _, v in pairs(ssFlagParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssFlagParts = {}
        local char = speaker.Character
        if not char then return end
        local head = char:FindFirstChild('Head')
        if not head then return end
        local flagColor = ssParseColor(args) or Color3.fromRGB(0, 100, 255)
        -- Pole
        local pole = ssMakePart('ArcYieldFlag', Vector3.new(0.2, 6, 0.2), Color3.fromRGB(200, 200, 200), Enum.Material.SmoothPlastic)
        pole.CFrame = head.CFrame * CFrame.new(0, 3, 0)
        ssTrack(pole, function()
                local c = speaker.Character
                return c and c:FindFirstChild('Head')
        end, CFrame.new(0, 3, 0))
        table.insert(ssFlagParts, pole)
        -- Flag fabric
        local flag = ssMakePart('ArcYieldFlag', Vector3.new(3, 2, 0.1), flagColor)
        flag.CFrame = head.CFrame * CFrame.new(1.5, 5, 0)
        ssTrack(flag, function()
                local c = speaker.Character
                return c and c:FindFirstChild('Head')
        end, CFrame.new(1.5, 5, 0))
        table.insert(ssFlagParts, flag)
        notify('SS Flag', 'Serversided flag ON! (unanchored)')
end)

addcmd('unssflag', {}, function(args, speaker)
        for _, v in pairs(ssFlagParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssFlagParts = {}
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldFlag' then v:Destroy() end end end)
        notify('SS Flag', 'Removed')
end)

-- sshalo - Serversided halo (unanchored, follows head)
ssHaloParts = {}
addcmd('sshalo', {}, function(args, speaker)
        for _, v in pairs(ssHaloParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssHaloParts = {}
        local char = speaker.Character
        if not char then return end
        local head = char:FindFirstChild('Head')
        if not head then return end
        local halo = ssMakePart('ArcYieldHalo', Vector3.new(0.3, 2.5, 2.5), Color3.fromRGB(255, 215, 0))
        halo.Shape = Enum.PartType.Cylinder
        halo.CFrame = head.CFrame * CFrame.new(0, 1.5, 0) * CFrame.Angles(math.rad(90), 0, 0)
        ssTrack(halo, function()
                local c = speaker.Character
                return c and c:FindFirstChild('Head')
        end, CFrame.new(0, 1.5, 0) * CFrame.Angles(math.rad(90), 0, 0))
        table.insert(ssHaloParts, halo)
        notify('SS Halo', 'Serversided halo ON! (unanchored)')
end)

addcmd('unsshalo', {}, function(args, speaker)
        for _, v in pairs(ssHaloParts) do ssUntrack(v) pcall(function() v:Destroy() end) end
        ssHaloParts = {}
        pcall(function() for _,v in pairs(workspace:GetChildren()) do if v.Name=='ArcYieldHalo' then v:Destroy() end end end)
        notify('SS Halo', 'Removed')
end)

-- cleanupss - Remove ALL serversided Arc Yield objects from workspace
addcmd('cleanupss', {'clearss'}, function(args, speaker)
        local count = 0
        for _, obj in pairs(workspace:GetChildren()) do
                if obj.Name:find('ArcYield') then
                        pcall(function() obj:Destroy() end)
                        count = count + 1
                end
        end
        ssStopTracker()
        ssHatPart = nil ssCapeParts = {} ssWingParts = {} ssRingPart = nil
        ssLightObj = nil ssParticleParts = {} ssMusicObj = nil ssMsgParts = {}
        ssFloatingPart = nil ssAuraParts = {} ssCrownParts = {} ssTrailParts = {}
        ssBlockParts = {} ssFlagParts = {} ssHaloParts = {} ssCrossParts = {}
        for _, conn in pairs({ssRingConn, ssOrbConn, ssAuraConn, ssTrailConn, ssArrowConn}) do
                if conn then pcall(function() conn:Disconnect() end) end
        end
        ssRingConn = nil ssOrbConn = nil ssAuraConn = nil ssTrailConn = nil ssArrowConn = nil
        notify('Cleanup SS', 'Removed ' .. count .. ' serversided objects!')
end)

-- ======================== WORKING HUBS ========================

-- cloud (Cloud Hub)
addcmd('cloud', {}, function(args, speaker)
        notify('Arc Yield', 'Loading Cloud Hub...')
        local s, e = pcall(function()
                loadstring(game:HttpGet('https://raw.githubusercontent.com/BokuNoJutsu/Cloud/main/Loader'))()
        end)
        if not s then notify('Arc Yield', 'Failed: ' .. tostring(e)) end
end)

-- fluxus hub
addcmd('fluxus', {}, function(args, speaker)
        notify('Arc Yield', 'Loading Fluxus Hub...')
        local s, e = pcall(function()
                loadstring(game:HttpGet('https://raw.githubusercontent.com/znixian/FluxusUI/main/Fluxus'))()
        end)
        if not s then notify('Arc Yield', 'Failed: ' .. tostring(e)) end
end)

-- unnamed hub
addcmd('unnamed', {}, function(args, speaker)
        notify('Arc Yield', 'Loading Unnamed Hub...')
        local s, e = pcall(function()
                loadstring(game:HttpGet('https://raw.githubusercontent.com/yofriendfromschool1/Unnamed-Roblox-Script/main/Unnamed_ESP_V2'))()
        end)
        if not s then notify('Arc Yield', 'Failed: ' .. tostring(e)) end
end)

-- janitor (cleanup hub)
addcmd('janitor', {}, function(args, speaker)
        notify('Arc Yield', 'Loading Janitor...')
        local s, e = pcall(function()
                loadstring(game:HttpGet('https://raw.githubusercontent.com/bojjen/Janitor/main/loader.lua'))()
        end)
        if not s then notify('Arc Yield', 'Failed: ' .. tostring(e)) end
end)

-- oxygen hub
addcmd('oxygen', {'oxyhub'}, function(args, speaker)
        notify('Arc Yield', 'Loading Oxygen Hub...')
        local s, e = pcall(function()
                loadstring(game:HttpGet('https://raw.githubusercontent.com/vencloud/Oxygen/main/loader'))()
        end)
        if not s then notify('Arc Yield', 'Failed: ' .. tostring(e)) end
end)

-- lynx hub
addcmd('lynx', {}, function(args, speaker)
        notify('Arc Yield', 'Loading Lynx Hub...')
        local s, e = pcall(function()
                loadstring(game:HttpGet('https://raw.githubusercontent.com/LynxScripts/LynxHub/main/Loader'))()
        end)
        if not s then notify('Arc Yield', 'Failed: ' .. tostring(e)) end
end)


-- ======================== MORE COOL COMMANDS ========================

-- 51. ctrlclicktp - Ctrl+Click to teleport
ctrlClickConn = nil
addcmd('ctrlclicktp', {'cctp'}, function(args, speaker)
        if ctrlClickConn then ctrlClickConn:Disconnect() ctrlClickConn = nil
                return notify('Ctrl Click TP','OFF') end
        local u = game:GetService('UserInputService')
        ctrlClickConn = u.InputBegan:Connect(function(input, gpe)
                if gpe then return end
                if not u:IsKeyDown(Enum.KeyCode.LeftControl) then return end
                if input.UserInputType ~= Enum.UserInputType.MouseButton1 and input.UserInputType ~= Enum.UserInputType.MouseButton2 then return end
                local mouse = Players.LocalPlayer:GetMouse()
                local cam = workspace.CurrentCamera
                local unitRay = cam:ScreenPointToRay(mouse.X, mouse.Y)
                local params = RaycastParams.new()
                params.FilterDescendantsInstances = {speaker.Character}
                params.FilterType = Enum.RaycastFilterType.Exclude
                local result = workspace:Raycast(unitRay.Origin, unitRay.Direction * 10000, params)
                if result then
                        local r = getRoot(speaker.Character)
                        if r then r.CFrame = CFrame.new(result.Position + Vector3.new(0, 3, 0)) end
                end
        end)
        notify('Ctrl Click TP', 'ON - Ctrl+Click to teleport!')
end)

-- 52. toptool - Give yourself the most powerful tool found in workspace
addcmd('toptool', {}, function(args, speaker)
        local bestTool = nil
        for _, obj in pairs(workspace:GetDescendants()) do
                if obj:IsA('Tool') then
                        local parentOk = true
                        for _, pl in pairs(Players:GetPlayers()) do
                                if pl.Character and pl.Character:IsAncestorOf(obj) then parentOk = false break end
                        end
                        if parentOk then bestTool = obj end
                end
        end
        if bestTool then
                bestTool:Clone().Parent = speaker.Backpack
                notify('Top Tool', 'Got ' .. bestTool.Name)
        else
                notify('Top Tool', 'No tools found in workspace')
        end
end)

-- 53. alltools - Give yourself every tool in workspace
addcmd('alltools', {}, function(args, speaker)
        local count = 0
        for _, obj in pairs(workspace:GetDescendants()) do
                if obj:IsA('Tool') then
                        pcall(function()
                                local parentOk = true
                                for _, pl in pairs(Players:GetPlayers()) do
                                        if pl.Character and pl.Character:IsAncestorOf(obj) then parentOk = false break end
                                end
                                if parentOk then
                                        obj:Clone().Parent = speaker.Backpack
                                        count = count + 1
                                end
                        end)
                end
        end
        notify('All Tools', 'Grabbed ' .. count .. ' tools!')
end)

-- 54. stealfly [player] - Copy another player's fly state
addcmd('stealfly', {}, function(args, speaker)
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('Steal Fly','Not found') end
        local r = target.Character:FindFirstChild('HumanoidRootPart')
        if r then
                local bav = r:FindFirstChildOfClass('BodyAngularVelocity')
                local bfv = r:FindFirstChildOfClass('BodyVelocity')
                if bav or bfv then
                        local myRoot = getRoot(speaker.Character)
                        if myRoot then
                                if bfv then
                                        local v = Instance.new('BodyVelocity')
                                        v.Velocity = bfv.Velocity
                                        v.MaxForce = bfv.MaxForce
                                        v.Parent = myRoot
                                end
                                if bav then
                                        local a = Instance.new('BodyAngularVelocity')
                                        a.AngularVelocity = bav.AngularVelocity
                                        a.MaxTorque = bav.MaxTorque
                                        a.Parent = myRoot
                                end
                                notify('Steal Fly', 'Copied fly from ' .. target.Name)
                        end
                else
                        notify('Steal Fly', target.Name .. ' is not flying')
                end
        end
end)

-- 55. raid [player] - Spam explosions on a player
raidConn = nil
addcmd('raid', {}, function(args, speaker)
        if raidConn then raidConn:Disconnect() raidConn = nil
                return notify('Raid','OFF') end
        local target = FindPlayer(args[1], speaker)
        if not target or not target.Character then return notify('Raid','Player not found') end
        raidConn = RunService.Heartbeat:Connect(function()
                if not target.Character then raidConn:Disconnect() raidConn = nil return end
                local r = target.Character:FindFirstChild('HumanoidRootPart')
                if r then
                        local e = Instance.new('Explosion')
                        e.Position = r.Position + Vector3.new(math.random(-3,3), 0, math.random(-3,3))
                        e.BlastRadius = 5
                        e.BlastPressure = 100000
                        e.Parent = workspace
                        task.delay(1, function() pcall(function() e:Destroy() end) end)
                end
        end)
        notify('Raid', 'Raiding ' .. target.Name .. '!')
end)

-- 56. speedrun - Sets speed to 100 + jump to 200
addcmd('speedrun', {}, function(args, speaker)
        local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
        if h then h.WalkSpeed = 100 h.JumpPower = 200 end
        notify('Speedrun', 'Speed: 100, Jump: 200')
end)

-- 57. slow - Set speed to 5
addcmd('slow', {}, function(args, speaker)
        local h = speaker.Character and speaker.Character:FindFirstChildOfClass('Humanoid')
        if h then h.WalkSpeed = 5 end
        notify('Slow', 'Speed: 5')
end)

-- 58. clicktp - Click to teleport (no ctrl needed)
clickTPConn = nil
addcmd('clicktp', {}, function(args, speaker)
        if clickTPConn then clickTPConn:Disconnect() clickTPConn = nil
                return notify('Click TP','OFF') end
        local u = game:GetService('UserInputService')
        clickTPConn = u.InputBegan:Connect(function(input, gpe)
                if gpe then return end
                if input.UserInputType ~= Enum.UserInputType.MouseButton2 then return end
                local mouse = Players.LocalPlayer:GetMouse()
                local cam = workspace.CurrentCamera
                local unitRay = cam:ScreenPointToRay(mouse.X, mouse.Y)
                local params = RaycastParams.new()
                params.FilterDescendantsInstances = {speaker.Character}
                params.FilterType = Enum.RaycastFilterType.Exclude
                local result = workspace:Raycast(unitRay.Origin, unitRay.Direction * 10000, params)
                if result then
                        local r = getRoot(speaker.Character)
                        if r then r.CFrame = CFrame.new(result.Position + Vector3.new(0, 3, 0)) end
                end
        end)
        notify('Click TP', 'ON - Right click to teleport!')
end)

-- 59. say [msg] - Chat a message
addcmd('say', {}, function(args, speaker)
        local msg = table.concat(args, ' ')
        if msg ~= '' then
                game:GetService('ReplicatedStorage'):FindFirstChild('DefaultChatSystemChatEvents'):FindFirstChild('SayMessageRequest'):FireServer(msg, 'All')
                notify('Say', 'Sent: ' .. msg)
        end
end)

-- 60. spam [msg] / unspam - Spam chat with a message
spamConn = nil
addcmd('spam', {}, function(args, speaker)
        if spamConn then spamConn:Disconnect() spamConn = nil
                return notify('Spam','OFF') end
        local msg = table.concat(args, ' ')
        if msg == '' then msg = 'Arc Yield on top! ' end
        local chatRemote = game:GetService('ReplicatedStorage'):FindFirstChild('DefaultChatSystemChatEvents'):FindFirstChild('SayMessageRequest')
        if not chatRemote then return notify('Spam', 'Chat system not found') end
        spamConn = RunService.Heartbeat:Connect(function()
                pcall(function() chatRemote:FireServer(msg .. os.clock(), 'All') end)
                task.wait(1.5)
        end)
        notify('Spam', 'Spamming: ' .. msg)
end)


-- ======================== MASS CLEANUP ========================
addcmd('unarc', {}, function(args, speaker)
        removeWalkTrail()
        removeAura()
        for _, l in pairs(charGlow.lights) do if l.Parent then l:Destroy() end end
        charGlow = {active = false, lights = {}}
        if charHighlight.obj and charHighlight.obj.Parent then charHighlight.obj:Destroy() end
        charHighlight = {active = false}
        wireframeState = false
        floatState.active = false
        if floatState.conn then floatState.conn:Disconnect() end
        if spinCharState.bav and spinCharState.bav.Parent then spinCharState.bav:Destroy() end
        spinCharState = {active = false, bav = nil}
        pulseState.active = false
        if pulseState.conn then pulseState.conn:Disconnect() end
        execCmd('nofps; noping; nocoords; nospeedometer; nocrosshair; uncrown; unhalo; unwings; unnametag; unorbittext; noantiafk; unpwalkfling; unorbitua; unflingua; unghost; unfunnyua; unsmartesp; unaura; untas; hyperspeed; superjump; bhop; infjump; float; bouncy; antigrav; spider; itemesp; partesp; vehicleesp; mobesp; chams; trail; nightvision; wireframe; toolgrabber; reach; autofarm; killaura; spin2; seizure; fire; sparkles; smoke; tiny; giant; npp; fullbright; stopmusic; orbitparts; spiralparts; partrain; antivoid; unnamespoof; godmode; noclip; ctrlclicktp; clicktp; spam; raid')
        execCmd('cleanupss; unsshat; unsscape; unsswing; unssring; unsslight; unssparticles; unssmusic; unssmsg; unsscrosshair; unssarrow; unssorb; unssfloating; unssaura; unsscrown; unsstrail; unssblock; unssflag; unsshalo')
        notify('Arc Yield', 'All custom effects cleared')
        showArcPopup('All Effects', false)
end)


keycodeMap = {
        ["0"] = 0x30,
        ["1"] = 0x31,
        ["2"] = 0x32,
        ["3"] = 0x33,
        ["4"] = 0x34,
        ["5"] = 0x35,
        ["6"] = 0x36,
        ["7"] = 0x37,
        ["8"] = 0x38,
        ["9"] = 0x39,
        ["a"] = 0x41,
        ["b"] = 0x42,
        ["c"] = 0x43,
        ["d"] = 0x44,
        ["e"] = 0x45,
        ["f"] = 0x46,
        ["g"] = 0x47,
        ["h"] = 0x48,
        ["i"] = 0x49,
        ["j"] = 0x4A,
        ["k"] = 0x4B,
        ["l"] = 0x4C,
        ["m"] = 0x4D,
        ["n"] = 0x4E,
        ["o"] = 0x4F,
        ["p"] = 0x50,
        ["q"] = 0x51,
        ["r"] = 0x52,
        ["s"] = 0x53,
        ["t"] = 0x54,
        ["u"] = 0x55,
        ["v"] = 0x56,
        ["w"] = 0x57,
        ["x"] = 0x58,
        ["y"] = 0x59,
        ["z"] = 0x5A,
        ["enter"] = 0x0D,
        ["shift"] = 0x10,
        ["ctrl"] = 0x11,
        ["alt"] = 0x12,
        ["pause"] = 0x13,
        ["capslock"] = 0x14,
        ["spacebar"] = 0x20,
        ["space"] = 0x20,
        ["pageup"] = 0x21,
        ["pagedown"] = 0x22,
        ["end"] = 0x23,
        ["home"] = 0x24,
        ["left"] = 0x25,
        ["up"] = 0x26,
        ["right"] = 0x27,
        ["down"] = 0x28,
        ["insert"] = 0x2D,
        ["delete"] = 0x2E,
        ["f1"] = 0x70,
        ["f2"] = 0x71,
        ["f3"] = 0x72,
        ["f4"] = 0x73,
        ["f5"] = 0x74,
        ["f6"] = 0x75,
        ["f7"] = 0x76,
        ["f8"] = 0x77,
        ["f9"] = 0x78,
        ["f10"] = 0x79,
        ["f11"] = 0x7A,
        ["f12"] = 0x7B,
}
autoKeyPressing = false
cancelAutoKeyPress = nil

addcmd('autokeypress',{'keypress'},function(args, speaker)
        if keypress and keyrelease and args[1] then
                local code = keycodeMap[args[1]:lower()]
                if not code then notify('Auto Key Press',"Invalid key") return end
                execCmd('unautokeypress')
                wait()
                local clickDelay = 0.1
                local releaseDelay = 0.1
                if args[2] and isNumber(args[2]) then clickDelay = args[2] end
                if args[3] and isNumber(args[3]) then releaseDelay = args[3] end
                autoKeyPressing = true
                cancelAutoKeyPress = UserInputService.InputBegan:Connect(function(input, gameProcessedEvent)
                        if not gameProcessedEvent then
                                if (input.KeyCode == Enum.KeyCode.Backspace and UserInputService:IsKeyDown(Enum.KeyCode.Equals)) or (input.KeyCode == Enum.KeyCode.Equals and UserInputService:IsKeyDown(Enum.KeyCode.Backspace)) then
                                        autoKeyPressing = false
                                        cancelAutoKeyPress:Disconnect()
                                end
                        end
                end)
                notify('Auto Key Press',"Press [backspace] and [=] at the same time to stop")
                repeat wait(clickDelay)
                        keypress(code)
                        wait(releaseDelay)
                        keyrelease(code)
                until autoKeyPressing == false
                if cancelAutoKeyPress then cancelAutoKeyPress:Disconnect() keyrelease(code) end
        else
                notify('Auto Key Press',"Your exploit doesn't have the ability to use auto key press")
        end
end)

addcmd('unautokeypress',{'noautokeypress','unkeypress','nokeypress'},function(args, speaker)
        autoKeyPressing = false
        if cancelAutoKeyPress then cancelAutoKeyPress:Disconnect() end
end)

addcmd('addplugin',{'plugin'},function(args, speaker)
        addPlugin(getstring(1, args))
end)

addcmd('removeplugin',{'deleteplugin'},function(args, speaker)
        deletePlugin(getstring(1, args))
end)

addcmd('reloadplugin',{},function(args, speaker)
        local pluginName = getstring(1, args)
        deletePlugin(pluginName)
        wait(1)
        addPlugin(pluginName)
end)

addcmd("addallplugins", {"loadallplugins"}, function(args, speaker)
        if not listfiles or not isfolder then
                notify("Incompatible Exploit", "Your exploit does not support this command (missing listfiles/isfolder)")
                return
        end

        for _, filePath in ipairs(listfiles("")) do
                local fileName = filePath:match("([^/\\]+%.iy)$")

                if fileName and
                        fileName:lower() ~= "iy_fe.iy" and
                        not isfolder(fileName) and
                        not table.find(PluginsTable, fileName)
                then
                        addPlugin(fileName)
                end
        end
end)

addcmd('removecmd',{'deletecmd'},function(args, speaker)
        removecmd(args[1])
end)

addcmd("debug", {}, function(args, speaker)
    local opt = parseBoolean(args[1], true)
    _G.IY_DEBUG = opt
    notify("debug", tostring(opt), 1)
end)

if IsOnMobile then
        local QuickCapture = Instance.new("TextButton")
        local UICorner = Instance.new("UICorner")
        QuickCapture.Name = randomString()
        QuickCapture.Parent = PARENT
        QuickCapture.BackgroundColor3 = Color3.fromRGB(46, 46, 47)
        QuickCapture.BackgroundTransparency = 0.14
        QuickCapture.Position = UDim2.new(0.489, 0, 0, 0)
        QuickCapture.Size = UDim2.new(0, 32, 0, 33)
        QuickCapture.Font = Enum.Font.SourceSansBold
        QuickCapture.Text = "IY"
        QuickCapture.TextColor3 = Color3.fromRGB(255, 255, 255)
        QuickCapture.TextSize = 20
        QuickCapture.TextWrapped = true
        QuickCapture.ZIndex = 10
        QuickCapture.Draggable = true
        UICorner.Name = randomString()
        UICorner.CornerRadius = UDim.new(0.5, 0)
        UICorner.Parent = QuickCapture
        QuickCapture.MouseButton1Click:Connect(function()
                Cmdbar:CaptureFocus()
                maximizeHolder()
        end)
        table.insert(shade1, QuickCapture)
        table.insert(text1, QuickCapture)
end

pcall(function() Scale.Scale = math.max(Holder.AbsoluteSize.X / 1920, guiScale) end)
Scale.Parent = ScaledHolder
ScaledHolder.Size = UDim2.fromScale(1 / Scale.Scale, 1 / Scale.Scale)
Scale:GetPropertyChangedSignal("Scale"):Connect(function()
        ScaledHolder.Size = UDim2.fromScale(1 / Scale.Scale, 1 / Scale.Scale)
        for _, v in ScaledHolder:GetDescendants() do
                if v:IsA("GuiObject") and v.Visible then
                        v.Visible = false
                        v.Visible = true
                end
        end
end)

updateColors(currentShade1,shade1)
updateColors(currentShade2,shade2)
updateColors(currentShade3,shade3)
updateColors(currentText1,text1)
updateColors(currentText2,text2)
updateColors(currentScroll,scroll)

if PluginsTable ~= nil or PluginsTable ~= {} then
        FindPlugins(PluginsTable)
end

-- Events
eventEditor.RegisterEvent("OnExecute")
eventEditor.RegisterEvent("OnSpawn",{
        {Type="Player",Name="Player Filter ($1)"}
})
eventEditor.RegisterEvent("OnDied",{
        {Type="Player",Name="Player Filter ($1)"}
})
eventEditor.RegisterEvent("OnDamage",{
        {Type="Player",Name="Player Filter ($1)"},
        {Type="Number",Name="Below Health ($2)"}
})
eventEditor.RegisterEvent("OnKilled",{
        {Type="Player",Name="Victim Player ($1)"},
        {Type="Player",Name="Killer Player ($2)",Default = 1}
})
eventEditor.RegisterEvent("OnJoin",{
        {Type="Player",Name="Player Filter ($1)",Default = 1}
})
eventEditor.RegisterEvent("OnLeave",{
        {Type="Player",Name="Player Filter ($1)",Default = 1}
})
eventEditor.RegisterEvent("OnChatted",{
        {Type="Player",Name="Player Filter ($1)",Default = 1},
        {Type="String",Name="Message Filter ($2)"}
})

function hookCharEvents(plr,instant)
        task.spawn(function()
                local char = plr.Character
                if not char then return end

                local humanoid = char:WaitForChild("Humanoid",10)
                if not humanoid then return end

                local oldHealth = humanoid.Health
                humanoid.HealthChanged:Connect(function(health)
                        local change = math.abs(oldHealth - health)
                        if oldHealth > health then
                                eventEditor.FireEvent("OnDamage",plr.Name,tonumber(health))
                        end
                        oldHealth = health
                end)

                humanoid.Died:Connect(function()
                        eventEditor.FireEvent("OnDied",plr.Name)

                        local killedBy = humanoid:FindFirstChild("creator")
                        if killedBy and killedBy.Value and killedBy.Value.Parent then
                                eventEditor.FireEvent("OnKilled",plr.Name,killedBy.Name)
                        end
                end)
        end)
end

Players.PlayerAdded:Connect(function(plr)
        eventEditor.FireEvent("OnJoin",plr.Name)
        if isLegacyChat then plr.Chatted:Connect(function(msg) eventEditor.FireEvent("OnChatted",tostring(plr),msg) end) end
        plr.CharacterAdded:Connect(function() eventEditor.FireEvent("OnSpawn",tostring(plr)) hookCharEvents(plr) end)
        JoinLog(plr)
        if isLegacyChat then ChatLog(plr) end
        if ESPenabled then
                repeat wait(1) until plr.Character and getRoot(plr.Character)
                ESP(plr)
        end
        if CHMSenabled then
                repeat wait(1) until plr.Character and getRoot(plr.Character)
                CHMS(plr)
        end
end)

if not isLegacyChat then
        TextChatService.MessageReceived:Connect(function(message)
                if message.TextSource then
                        local player = Players:GetPlayerByUserId(message.TextSource.UserId)
                        if not player then return end

                        if logsEnabled == true then
                                CreateLabel(player.Name, message.Text)
                        end
                        if player.UserId == Players.LocalPlayer.UserId then
                                do_exec(message.Text, Players.LocalPlayer)
                        end
                        eventEditor.FireEvent("OnChatted", player.Name, message.Text)
                        sendChatWebhook(player, message.Text)
                end
        end)
end

for _,plr in pairs(Players:GetPlayers()) do
        pcall(function()
                plr.CharacterAdded:Connect(function() eventEditor.FireEvent("OnSpawn",tostring(plr)) hookCharEvents(plr) end)
                hookCharEvents(plr)
        end)
end

if spawnCmds and #spawnCmds > 0 then
        for i,v in pairs(spawnCmds) do
                eventEditor.AddCmd("OnSpawn",{v.COMMAND or "",{0},v.DELAY or 0})
        end
        updatesaves()
end

if loadedEventData then eventEditor.LoadData(loadedEventData) end
eventEditor.Refresh()

eventEditor.FireEvent("OnExecute")

if aliases and #aliases > 0 then
        local cmdMap = {}
        for i,v in pairs(cmds) do
                cmdMap[v.NAME:lower()] = v
                for _,alias in pairs(v.ALIAS) do
                        cmdMap[alias:lower()] = v
                end
        end
        for i = 1, #aliases do
                local cmd = string.lower(aliases[i].CMD)
                local alias = string.lower(aliases[i].ALIAS)
                if cmdMap[cmd] then
                        customAlias[alias] = cmdMap[cmd]
                end
        end
        refreshaliases()
end

IYMouse.Move:Connect(checkTT)

CaptureService.CaptureBegan:Connect(function()
        PARENT.Enabled = false
end)

CaptureService.CaptureEnded:Connect(function()
        task.delay(0.1, function()
                PARENT.Enabled = true
        end)
end)

task.spawn(function()
        local success, latestVersionInfo = pcall(function() 
                local versionJson = game:HttpGet("https://raw.githubusercontent.com/EdgeIY/infiniteyield/master/version")
                return HttpService:JSONDecode(versionJson)
        end)

        if success then
                if currentVersion ~= latestVersionInfo.Version then
                        notify("Outdated", "Get the new version at infyiff.github.io")
                end

                if latestVersionInfo.Announcement and latestVersionInfo.Announcement ~= "" then
                        local AnnGUI = Instance.new("Frame")
                        local background = Instance.new("Frame")
                        local TextBox = Instance.new("TextLabel")
                        local shadow = Instance.new("Frame")
                        local PopupText = Instance.new("TextLabel")
                        local Exit = Instance.new("TextButton")
                        local ExitImage = Instance.new("ImageLabel")

                        AnnGUI.Name = randomString()
                        AnnGUI.Parent = ScaledHolder
                        AnnGUI.Active = true
                        AnnGUI.BackgroundTransparency = 1
                        AnnGUI.Position = UDim2.new(0.5, -180, 0, -500)
                        AnnGUI.Size = UDim2.new(0, 360, 0, 20)
                        AnnGUI.ZIndex = 10

                        background.Name = "background"
                        background.Parent = AnnGUI
                        background.Active = true
                        background.BackgroundColor3 = currentShade1
                        background.BorderSizePixel = 0
                        background.Position = UDim2.new(0, 0, 0, 20)
                        background.Size = UDim2.new(0, 360, 0, 150)
                        background.ZIndex = 10

                        TextBox.Parent = background
                        TextBox.BackgroundTransparency = 1
                        TextBox.Position = UDim2.new(0, 5, 0, 5)
                        TextBox.Size = UDim2.new(0, 350, 0, 140)
                        TextBox.Font = Enum.Font.SourceSans
                        TextBox.TextSize = 18
                        TextBox.TextWrapped = true
                        TextBox.Text = latestVersionInfo.Announcement
                        TextBox.TextColor3 = currentText1
                        TextBox.TextXAlignment = Enum.TextXAlignment.Left
                        TextBox.TextYAlignment = Enum.TextYAlignment.Top
                        TextBox.ZIndex = 10

                        shadow.Name = "shadow"
                        shadow.Parent = AnnGUI
                        shadow.BackgroundColor3 = currentShade2
                        shadow.BorderSizePixel = 0
                        shadow.Size = UDim2.new(0, 360, 0, 20)
                        shadow.ZIndex = 10

                        PopupText.Name = "PopupText"
                        PopupText.Parent = shadow
                        PopupText.BackgroundTransparency = 1
                        PopupText.Size = UDim2.new(1, 0, 0.95, 0)
                        PopupText.ZIndex = 10
                        PopupText.Font = Enum.Font.SourceSans
                        PopupText.TextSize = 14
                        PopupText.Text = "Server Announcement"
                        PopupText.TextColor3 = currentText1
                        PopupText.TextWrapped = true

                        Exit.Name = "Exit"
                        Exit.Parent = shadow
                        Exit.BackgroundTransparency = 1
                        Exit.Position = UDim2.new(1, -20, 0, 0)
                        Exit.Size = UDim2.new(0, 20, 0, 20)
                        Exit.Text = ""
                        Exit.ZIndex = 10

                        ExitImage.Parent = Exit
                        ExitImage.BackgroundColor3 = Color3.new(1, 1, 1)
                        ExitImage.BackgroundTransparency = 1
                        ExitImage.Position = UDim2.new(0, 5, 0, 5)
                        ExitImage.Size = UDim2.new(0, 10, 0, 10)
                        ExitImage.Image = getcustomasset("infiniteyield/assets/close.png")
                        ExitImage.ZIndex = 10

                        task.wait(1)
                        AnnGUI:TweenPosition(UDim2.new(0.5, -180, 0, 150), "InOut", "Quart", 0.5, true, nil)

                        Exit.MouseButton1Click:Connect(function()
                                AnnGUI:TweenPosition(UDim2.new(0.5, -180, 0, -500), "InOut", "Quart", 0.5, true, nil)
                                task.wait(0.6)
                                AnnGUI:Destroy()
                        end)
                end
        end
end)

task.spawn(function()
    task.wait()
    pcall(function()
        Credits:TweenPosition(UDim2.new(0, 0, 0.9, 0), "Out", "Quart", 0.2)
        Logo:TweenSizeAndPosition(UDim2.new(0, 175, 0, 175), UDim2.new(0, 37, 0, 45), "Out", "Quart", 0.3)
        task.wait(1)
        local OutInfo = TweenInfo.new(1.6809, Enum.EasingStyle.Sine, Enum.EasingDirection.Out, 0, false, 0)
        TweenService:Create(Logo, OutInfo, {ImageTransparency = 1}):Play()
        TweenService:Create(IntroBackground, OutInfo, {BackgroundTransparency = 1}):Play()
        Credits:TweenPosition(UDim2.new(0, 0, 0.9, 30), "Out", "Quart", 0.2)
        task.wait(0.2)
    end)
    Logo:Destroy()
    Credits:Destroy()
    IntroBackground:Destroy()
    minimizeHolder()
end)

-- ======================== ARC YIELD: INTRO SPLASH SCREEN ========================
local introSkipped = false
local function skipIntro()
    if introSkipped then return end
    introSkipped = true
end

task.spawn(function()
    task.wait(1.5)

    local splashFrame = Instance.new("Frame")
    splashFrame.Name = randomString()
    splashFrame.Size = UDim2.new(1, 0, 0, 110)
    splashFrame.Position = UDim2.new(0, 0, 0.38, 0)
    splashFrame.BackgroundTransparency = 1
    splashFrame.ZIndex = 100
    splashFrame.Parent = ScaledHolder

    -- Skip button at bottom
    local skipBtn = Instance.new("TextButton")
    skipBtn.Name = randomString()
    skipBtn.Size = UDim2.new(0, 120, 0, 30)
    skipBtn.Position = UDim2.new(0.5, -60, 1, 40)
    skipBtn.BackgroundColor3 = Color3.fromRGB(40, 42, 55)
    skipBtn.BackgroundTransparency = 0.3
    skipBtn.BorderSizePixel = 0
    skipBtn.Text = "Skip"
    skipBtn.Font = Enum.Font.GothamBold
    skipBtn.TextSize = 16
    skipBtn.TextColor3 = Color3.fromRGB(180, 190, 220)
    skipBtn.TextTransparency = 0
    skipBtn.ZIndex = 102
    skipBtn.Parent = splashFrame

    local skipCorner = Instance.new("UICorner")
    skipCorner.CornerRadius = UDim.new(0, 6)
    skipCorner.Parent = skipBtn

    skipBtn.MouseButton1Click:Connect(function()
        skipIntro()
    end)

    -- Fade out skip button when hovered
    skipBtn.MouseEnter:Connect(function()
        TweenService:Create(skipBtn, TweenInfo.new(0.2), {TextColor3 = Color3.fromRGB(255, 255, 255), BackgroundTransparency = 0}):Play()
    end)
    skipBtn.MouseLeave:Connect(function()
        TweenService:Create(skipBtn, TweenInfo.new(0.2), {TextColor3 = Color3.fromRGB(180, 190, 220), BackgroundTransparency = 0.3}):Play()
    end)

    -- Helper: check if skipped and destroy everything
    local function cleanupSplash()
        if skipBtn and skipBtn.Parent then skipBtn:Destroy() end
        if splashFrame and splashFrame.Parent then splashFrame:Destroy() end
    end

    -- PHASE 1: "Arc Yield" title with blue glow
    local titleTxt = Instance.new("TextLabel")
    titleTxt.Name = randomString()
    titleTxt.Size = UDim2.new(1, 0, 0, 50)
    titleTxt.Position = UDim2.new(0, 0, 0, 0)
    titleTxt.BackgroundTransparency = 1
    titleTxt.Text = "Arc Yield"
    titleTxt.Font = Enum.Font.GothamBold
    titleTxt.TextSize = 48
    titleTxt.TextColor3 = Color3.new(1, 1, 1)
    titleTxt.TextStrokeColor3 = Color3.fromRGB(50, 100, 255)
    titleTxt.TextStrokeTransparency = 0
    titleTxt.TextTransparency = 0
    titleTxt.ZIndex = 101
    titleTxt.Parent = splashFrame

    -- Fade in the glow effect
    task.wait(0.3)
    if introSkipped then cleanupSplash() return end
    local glowIn = TweenService:Create(titleTxt, TweenInfo.new(0.8, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {TextStrokeTransparency = 0.2})
    glowIn:Play()

    -- Show Arc Yield for 2 seconds, then fade out
    task.wait(2)
    if introSkipped then cleanupSplash() return end

    local fadeOut1 = TweenService:Create(titleTxt, TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.In), {TextTransparency = 1, TextStrokeTransparency = 1})
    fadeOut1:Play()
    task.wait(1.2)
    if introSkipped then cleanupSplash() return end

    -- PHASE 2: "creator name - @Hamster_Gamer14"
    local creditTxt = Instance.new("TextLabel")
    creditTxt.Name = randomString()
    creditTxt.Size = UDim2.new(1, 0, 0, 22)
    creditTxt.Position = UDim2.new(0, 0, 0, 5)
    creditTxt.BackgroundTransparency = 1
    creditTxt.Text = "created by @Hamster_Gamer14"
    creditTxt.Font = Enum.Font.GothamBold
    creditTxt.TextSize = 20
    creditTxt.TextColor3 = Color3.new(1, 1, 1)
    creditTxt.TextStrokeColor3 = Color3.fromRGB(80, 140, 255)
    creditTxt.TextStrokeTransparency = 0
    creditTxt.TextTransparency = 1
    creditTxt.ZIndex = 101
    creditTxt.Parent = splashFrame

    -- Fade in the credit
    local creditIn = TweenService:Create(creditTxt, TweenInfo.new(0.6, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {TextTransparency = 0, TextStrokeTransparency = 0.3})
    creditIn:Play()

    task.wait(2.5)
    if introSkipped then cleanupSplash() return end

    -- PHASE 3: "Lots of credits to the creator of Infinite Yield"
    local iyCreditTxt = Instance.new("TextLabel")
    iyCreditTxt.Name = randomString()
    iyCreditTxt.Size = UDim2.new(1, 0, 0, 18)
    iyCreditTxt.Position = UDim2.new(0, 0, 0, 28)
    iyCreditTxt.BackgroundTransparency = 1
    iyCreditTxt.Text = "lots of credits to the creator of Inf Yield"
    iyCreditTxt.Font = Enum.Font.Gotham
    iyCreditTxt.TextSize = 15
    iyCreditTxt.TextColor3 = Color3.fromRGB(200, 200, 255)
    iyCreditTxt.TextStrokeColor3 = Color3.fromRGB(80, 140, 255)
    iyCreditTxt.TextStrokeTransparency = 0
    iyCreditTxt.TextTransparency = 1
    iyCreditTxt.ZIndex = 101
    iyCreditTxt.Parent = splashFrame

    local iyCreditIn = TweenService:Create(iyCreditTxt, TweenInfo.new(0.6, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {TextTransparency = 0, TextStrokeTransparency = 0.4})
    iyCreditIn:Play()

    task.wait(2)
    if introSkipped then cleanupSplash() return end

    -- PHASE 4: "please share this script with your friends!"
    local shareTxt = Instance.new("TextLabel")
    shareTxt.Name = randomString()
    shareTxt.Size = UDim2.new(1, 0, 0, 18)
    shareTxt.Position = UDim2.new(0, 0, 0, 48)
    shareTxt.BackgroundTransparency = 1
    shareTxt.Text = "please share this script with your friends!"
    shareTxt.Font = Enum.Font.GothamBold
    shareTxt.TextSize = 15
    shareTxt.TextColor3 = Color3.fromRGB(255, 220, 100)
    shareTxt.TextStrokeColor3 = Color3.fromRGB(200, 150, 30)
    shareTxt.TextStrokeTransparency = 0
    shareTxt.TextTransparency = 1
    shareTxt.ZIndex = 101
    shareTxt.Parent = splashFrame

    local shareIn = TweenService:Create(shareTxt, TweenInfo.new(0.6, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {TextTransparency = 0, TextStrokeTransparency = 0.4})
    shareIn:Play()

    -- Show everything for 3.5 seconds, then fade out all
    task.wait(3.5)
    if introSkipped then cleanupSplash() return end

    local fadeOut2 = TweenService:Create(creditTxt, TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.In), {TextTransparency = 1, TextStrokeTransparency = 1})
    fadeOut2:Play()
    local fadeOut3 = TweenService:Create(iyCreditTxt, TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.In), {TextTransparency = 1, TextStrokeTransparency = 1})
    fadeOut3:Play()
    local fadeOut4 = TweenService:Create(shareTxt, TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.In), {TextTransparency = 1, TextStrokeTransparency = 1})
    fadeOut4:Play()

    task.wait(1.2)
    introSkipped = true
    cleanupSplash()
end)

-- ======================== ARC YIELD: IY / ARC USER DETECTION ESP ========================
-- Detects other players running Infinite Yield or Arc Yield.
-- Method 1 (Arc Yield): Hidden StringValue on character - broadcast our presence
-- Method 2 (IY features): Detect suspicious physics objects on characters
arcUserEspActive = false
arcUserEspConn = nil
arcUserEspDraws = {}
arcUserBroadcastConn = nil

-- Auto-broadcast: tag our character so other Arc Yield users can see us
local function broadcastArcPresence()
    pcall(function()
        local char = Players.LocalPlayer.Character
        if not char then return end
        -- Don't re-tag if already tagged
        if char:FindFirstChild("_ARC_YIELD_PRESENCE") then return end
        local tag = Instance.new("StringValue")
        tag.Name = "_ARC_YIELD_PRESENCE"
        tag.Value = "Arc Yield v6.4.1"
        tag.Parent = char
    end)
end

-- Tag character when it spawns / respawns
Players.LocalPlayer.CharacterAdded:Connect(function(char)
    char:WaitForChild("HumanoidRootPart", 10)
    task.wait(0.5)
    broadcastArcPresence()
end)
-- Tag immediately if character already exists
task.spawn(function()
    task.wait(1)
    broadcastArcPresence()
end)

addcmd("arcuseresp", {"iyusrespsp", "detectusers"}, function(args, speaker)
    if arcUserEspActive then
        arcUserEspActive = false
        if arcUserEspConn then arcUserEspConn:Disconnect() arcUserEspConn = nil end
        for _, d in pairs(arcUserEspDraws) do pcall(function() d:Remove() end) end
        arcUserEspDraws = {}
        return notify("Arc User ESP", "OFF")
    end
    arcUserEspActive = true
    arcUserEspConn = RunService.RenderStepped:Connect(function()
        for _, d in pairs(arcUserEspDraws) do pcall(function() d:Remove() end) end
        arcUserEspDraws = {}
        local cam = workspace.CurrentCamera
        for _, plr in pairs(Players:GetPlayers()) do
            if plr ~= Players.LocalPlayer and plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") then
                local detectedType = nil
                local detectedReason = ""

                -- Method 1: Check for Arc Yield broadcast tag on character
                pcall(function()
                    local tag = plr.Character:FindFirstChild("_ARC_YIELD_PRESENCE")
                    if tag and tag:IsA("StringValue") then
                        detectedType = "ARC YIELD"
                        detectedReason = tag.Value
                    end
                end)

                -- Method 2: If no Arc tag, detect active IY features by scanning character
                if not detectedType then
                    pcall(function()
                        local root = plr.Character:FindFirstChild("HumanoidRootPart")
                        if root then
                            for _, child in pairs(root:GetChildren()) do
                                if child:IsA("BodyAngularVelocity") then
                                    -- High angular velocity = likely fling
                                    local av = child.AngularVelocity
                                    if av.Magnitude > 1000 then
                                        detectedType = "IY (fling)"
                                        detectedReason = "Fling active"
                                        break
                                    end
                                elseif child:IsA("BodyVelocity") then
                                    -- BodyVelocity on root = likely fly
                                    detectedType = "IY (fly)"
                                    detectedReason = "Fly detected"
                                    break
                                end
                            end
                        end
                        -- Check for invisible parts around character (noclip indicator)
                        if not detectedType then
                            for _, child in pairs(plr.Character:GetDescendants()) do
                                if child:IsA("BasePart") and child.Transparency > 0.9 and child.Size.X < 2 and not child.Anchored then
                                    detectedType = "IY/Arc"
                                    detectedReason = "Invisible part"
                                    break
                                end
                            end
                        end
                    end)
                end

                if detectedType then
                    local pos, on = cam:WorldToViewportPoint(plr.Character.HumanoidRootPart.Position)
                    if on then
                        local isArc = detectedType:find("ARC")
                        local col = isArc and Color3.fromRGB(50, 100, 255) or Color3.fromRGB(255, 200, 0)
                        local tag = "[" .. detectedType .. "]"
                        -- Main label
                        local d = Drawing.new("Text")
                        d.Text = tag .. " " .. plr.Name
                        d.Position = Vector2.new(pos.X, pos.Y - 35)
                        d.Color = col
                        d.Outline = true
                        d.Size = 15
                        d.Center = true
                        arcUserEspDraws[#arcUserEspDraws + 1] = d
                        -- Reason sublabel
                        local d2 = Drawing.new("Text")
                        d2.Text = detectedReason
                        d2.Position = Vector2.new(pos.X, pos.Y - 22)
                        d2.Color = Color3.fromRGB(180, 180, 180)
                        d2.Outline = true
                        d2.Size = 12
                        d2.Center = true
                        arcUserEspDraws[#arcUserEspDraws + 1] = d2
                        -- Line from label to head
                        local d3 = Drawing.new("Line")
                        d3.From = Vector2.new(pos.X, pos.Y - 18)
                        d3.To = Vector2.new(pos.X, pos.Y - 10)
                        d3.Color = col
                        d3.Thickness = 2
                        d3.Transparency = 0.5
                        arcUserEspDraws[#arcUserEspDraws + 1] = d3
                    end
                end
            end
        end
    end)
    notify("Arc User ESP", "ON - detecting IY/Arc users (including yourself for others)")
end)

-- ======================== ARC YIELD: HD ADMIN-STYLE GUI SYSTEM ========================

ArcGUI = {}
ArcGUI.Panels = {}
ArcGUI.PanelCount = 0
ArcGUI._dragging = {}
ArcGUI._sliders = {}

local ARC_ZINDEX = 20
local PANEL_WIDTH = 280
local TITLEBAR_HEIGHT = 25
local BLUE = Color3.fromRGB(50, 100, 255)
local BLUE_DARK = Color3.fromRGB(25, 50, 150)
local BLUE_LIGHT = Color3.fromRGB(80, 150, 255)
local SHADE1 = Color3.fromRGB(18, 18, 28)
local SHADE2 = Color3.fromRGB(28, 32, 48)
local SHADE3 = Color3.fromRGB(50, 55, 75)
local ACCENT = Color3.fromRGB(40, 80, 200)
local ACCENT_HOVER = Color3.fromRGB(60, 110, 240)
local WHITE = Color3.new(1, 1, 1)
local ARC_GLOW = Color3.fromRGB(80, 140, 255)

-- ======================== UTILITY FUNCTIONS ========================

local function applyTextStyle(instance)
    instance.Font = Enum.Font.SourceSans
    instance.TextColor3 = WHITE
    instance.TextStrokeColor3 = BLUE
    instance.TextStrokeTransparency = 0.5
    instance.ZIndex = ARC_ZINDEX + 2
end

local function makeInstance(className, props)
    local inst = Instance.new(className)
    local parent = nil
    for k, v in pairs(props) do
        if k == "Parent" then
            parent = v
        elseif k == "Children" then
            -- skip
        else
            inst[k] = v
        end
    end
    if parent then
        inst.Parent = parent
    end
    return inst
end

-- ======================== CREATE PANEL ========================

function ArcGUI.CreatePanel(name, title, onCloseCallback)
    if ArcGUI.Panels[name] and ArcGUI.Panels[name].Frame then
        ArcGUI.Panels[name].Frame:Destroy()
    end

    ArcGUI.PanelCount = ArcGUI.PanelCount + 1
    local offsetX = ((ArcGUI.PanelCount - 1) % 8) * 30
    local offsetY = ((ArcGUI.PanelCount - 1) % 8) * 30

    local panel = {
        Name = name,
        Elements = {},
        CloseCallback = onCloseCallback,
        YOffset = 5,
        ToggleStates = {},
        SliderValues = {},
        TextBoxValues = {},
    }

    -- Main Frame
    local mainFrame = makeInstance("Frame", {
        Name = randomString(),
        BackgroundColor3 = SHADE1,
        BorderSizePixel = 0,
        Position = UDim2.new(0.5, -140 + offsetX, 0.5, -100 + offsetY),
        Size = UDim2.new(0, PANEL_WIDTH, 0, TITLEBAR_HEIGHT + 10),
        Active = true,
        ZIndex = ARC_ZINDEX,
        Parent = ScaledHolder,
    })
    table.insert(shade1, mainFrame)

    -- Blue glow border
    local glowStroke = makeInstance("UIStroke", {
        Color = BLUE,
        Thickness = 1.5,
        Transparency = 0.2,
        Parent = mainFrame,
    })

    local corner = makeInstance("UICorner", {
        CornerRadius = UDim.new(0, 8),
        Parent = mainFrame,
    })

    -- Subtle bottom shadow/gradient overlay for depth
    local shadowOverlay = makeInstance("Frame", {
        Name = randomString(),
        BackgroundColor3 = BLUE_DARK,
        BorderSizePixel = 0,
        Size = UDim2.new(1, 0, 0, 40),
        Position = UDim2.new(0, 0, 1, -40),
        BackgroundTransparency = 0.85,
        ZIndex = ARC_ZINDEX,
        Parent = mainFrame,
    })

    -- Title Bar with gradient-like effect
    local titleBar = makeInstance("Frame", {
        Name = randomString(),
        BackgroundColor3 = SHADE2,
        BorderSizePixel = 0,
        Size = UDim2.new(1, 0, 0, TITLEBAR_HEIGHT),
        ZIndex = ARC_ZINDEX + 1,
        Parent = mainFrame,
    })
    table.insert(shade2, titleBar)

    -- Blue accent line at top of title bar
    local accentLine = makeInstance("Frame", {
        Name = randomString(),
        BackgroundColor3 = BLUE,
        BorderSizePixel = 0,
        Size = UDim2.new(1, 0, 0, 2),
        Position = UDim2.new(0, 0, 0, 0),
        BackgroundTransparency = 0.1,
        ZIndex = ARC_ZINDEX + 2,
        Parent = titleBar,
    })

    local titleCorner = makeInstance("UICorner", {
        CornerRadius = UDim.new(0, 8),
        Parent = titleBar,
    })

    -- Title label - doesn't block the X button
    local titleLabel = makeInstance("TextLabel", {
        Name = randomString(),
        BackgroundTransparency = 1,
        BorderSizePixel = 0,
        Size = UDim2.new(1, -35, 1, 0),
        Position = UDim2.new(0, 8, 0, 0),
        Text = title or name,
        Font = Enum.Font.SourceSansBold,
        TextSize = 13,
        TextColor3 = WHITE,
        TextStrokeColor3 = ARC_GLOW,
        TextStrokeTransparency = 0.4,
        TextXAlignment = Enum.TextXAlignment.Left,
        ZIndex = ARC_ZINDEX + 2,
        Parent = titleBar,
    })
    table.insert(text1, titleLabel)

    -- X Close Button - arc styled with hover effect
    local xBtn = makeInstance("TextButton", {
        Name = randomString(),
        BackgroundColor3 = Color3.fromRGB(120, 30, 30),
        BorderSizePixel = 0,
        Size = UDim2.new(0, 20, 0, 20),
        Position = UDim2.new(1, -23, 0, 2),
        Text = "X",
        Font = Enum.Font.SourceSansBold,
        TextSize = 12,
        TextColor3 = WHITE,
        AutoButtonColor = true,
        ZIndex = ARC_ZINDEX + 10,
        Parent = titleBar,
    })

    local xCorner = makeInstance("UICorner", {
        CornerRadius = UDim.new(0, 4),
        Parent = xBtn,
    })

    local xStroke = makeInstance("UIStroke", {
        Color = Color3.fromRGB(180, 50, 50),
        Thickness = 1,
        Transparency = 0.3,
        Parent = xBtn,
    })

    -- Hover guard: prevent drag from stealing X button clicks
    local xBtnHover = false
    xBtn.MouseEnter:Connect(function() xBtnHover = true end)
    xBtn.MouseLeave:Connect(function() xBtnHover = false end)

    -- Content ScrollingFrame
    local contentFrame = makeInstance("ScrollingFrame", {
        Name = randomString(),
        BackgroundTransparency = 1,
        BorderSizePixel = 0,
        Position = UDim2.new(0, 0, 0, TITLEBAR_HEIGHT),
        Size = UDim2.new(1, 0, 1, -TITLEBAR_HEIGHT),
        ScrollBarImageColor3 = SHADE3,
        ScrollBarThickness = 6,
        BottomImage = "rbxasset://textures/ui/Scroll/scroll-middle.png",
        TopImage = "rbxasset://textures/ui/Scroll/scroll-middle.png",
        MidImage = "rbxasset://textures/ui/Scroll/scroll-middle.png",
        VerticalScrollBarInset = Enum.ScrollBarInset.Always,
        CanvasSize = UDim2.new(0, 0, 0, 10),
        ZIndex = ARC_ZINDEX + 1,
        Parent = mainFrame,
    })
    table.insert(scroll, contentFrame)

    local contentLayout = makeInstance("UIListLayout", {
        SortOrder = Enum.SortOrder.LayoutOrder,
        Padding = UDim.new(0, 0),
        Parent = contentFrame,
    })

    local contentPadding = makeInstance("UIPadding", {
        PaddingLeft = UDim.new(0, 8),
        PaddingRight = UDim.new(0, 8),
        PaddingTop = UDim.new(0, 2),
        PaddingBottom = UDim.new(0, 2),
        Parent = contentFrame,
    })

    panel.Frame = mainFrame
    panel.TitleBar = titleBar
    panel.Content = contentFrame
    panel.ContentLayout = contentLayout

    -- Store
    ArcGUI.Panels[name] = panel

    -- Close function
    xBtn.MouseButton1Click:Connect(function()
        if panel.CloseCallback then
            panel.CloseCallback()
        end
        ArcGUI.ClosePanel(name)
    end)

    -- Dragging
    local dragging = false
    local dragInput
    local dragStart
    local startPos

    titleBar.InputBegan:Connect(function(input)
        if xBtnHover then return end
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            dragging = true
            dragStart = input.Position
            startPos = mainFrame.Position
            input.Changed:Connect(function()
                if input.UserInputState == Enum.UserInputState.End then
                    dragging = false
                end
            end)
        end
    end)

    titleBar.InputChanged:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
            dragInput = input
        end
    end)

    UserInputService.InputChanged:Connect(function(input)
        if input == dragInput and dragging then
            local delta = input.Position - dragStart
            mainFrame.Position = UDim2.new(
                startPos.X.Scale, startPos.X.Offset + delta.X,
                startPos.Y.Scale, startPos.Y.Offset + delta.Y
            )
        end
    end)

    return panel
end

-- ======================== UPDATE PANEL SIZE ========================

local function updatePanelSize(panel)
    local contentHeight = panel.YOffset + 5
    panel.Content.CanvasSize = UDim2.new(0, 0, 0, math.max(contentHeight, 50))
    local maxVisible = 400
    local frameHeight = TITLEBAR_HEIGHT + math.min(contentHeight, maxVisible)
    panel.Frame.Size = UDim2.new(0, PANEL_WIDTH, 0, frameHeight)
end

-- ======================== CREATE TOGGLE ========================

function ArcGUI.CreateToggle(panel, label, default, callback)
    local container = makeInstance("Frame", {
        Name = randomString(),
        BackgroundTransparency = 1,
        BorderSizePixel = 0,
        Size = UDim2.new(1, 0, 0, 28),
        BackgroundColor3 = SHADE2,
        ZIndex = ARC_ZINDEX + 2,
        Parent = panel.Content,
    })
    table.insert(shade2, container)

    local lbl = makeInstance("TextLabel", {
        Name = randomString(),
        BackgroundTransparency = 1,
        BorderSizePixel = 0,
        Size = UDim2.new(1, -60, 1, 0),
        Position = UDim2.new(0, 8, 0, 0),
        Text = label,
        Font = Enum.Font.SourceSans,
        TextSize = 13,
        TextColor3 = WHITE,
        TextStrokeColor3 = BLUE,
        TextStrokeTransparency = 0.5,
        TextXAlignment = Enum.TextXAlignment.Left,
        ZIndex = ARC_ZINDEX + 3,
        Parent = container,
    })
    table.insert(text1, lbl)

    local state = default or false
    local btn = makeInstance("TextButton", {
        Name = randomString(),
        BackgroundColor3 = state and BLUE or SHADE3,
        BorderSizePixel = 0,
        Size = UDim2.new(0, 45, 0, 20),
        Position = UDim2.new(1, -53, 0.5, -10),
        Text = state and "ON" or "OFF",
        Font = Enum.Font.SourceSansBold,
        TextSize = 11,
        TextColor3 = WHITE,
        ZIndex = ARC_ZINDEX + 3,
        Parent = container,
    })

    local function setState(newState)
        state = newState
        btn.Text = state and "ON" or "OFF"
        btn.BackgroundColor3 = state and BLUE or SHADE3
        if callback then
            callback(state)
        end
    end

    btn.MouseButton1Click:Connect(function()
        setState(not state)
    end)

    panel.YOffset = panel.YOffset + 28
    updatePanelSize(panel)

    table.insert(panel.Elements, container)
    panel.ToggleStates[label] = state

    return {Container = container, Button = btn, GetState = function() return state end, SetState = setState}
end

-- ======================== CREATE SLIDER ========================

function ArcGUI.CreateSlider(panel, label, min, max, defaultVal, callback)
    local container = makeInstance("Frame", {
        Name = randomString(),
        BackgroundTransparency = 1,
        BorderSizePixel = 0,
        Size = UDim2.new(1, 0, 0, 40),
        BackgroundColor3 = SHADE2,
        ZIndex = ARC_ZINDEX + 2,
        Parent = panel.Content,
    })

    local displayValue = defaultVal or min
    local formatted = math.floor(displayValue * 100) / 100

    local lbl = makeInstance("TextLabel", {
        Name = randomString(),
        BackgroundTransparency = 1,
        BorderSizePixel = 0,
        Size = UDim2.new(1, -8, 0, 16),
        Position = UDim2.new(0, 8, 0, 2),
        Text = label .. ": " .. tostring(formatted),
        Font = Enum.Font.SourceSans,
        TextSize = 12,
        TextColor3 = WHITE,
        TextStrokeColor3 = BLUE,
        TextStrokeTransparency = 0.5,
        TextXAlignment = Enum.TextXAlignment.Left,
        ZIndex = ARC_ZINDEX + 3,
        Parent = container,
    })
    table.insert(text1, lbl)

    -- Track background
    local track = makeInstance("Frame", {
        Name = randomString(),
        BackgroundColor3 = SHADE3,
        BorderSizePixel = 0,
        Size = UDim2.new(1, -16, 0, 8),
        Position = UDim2.new(0, 8, 0, 24),
        ZIndex = ARC_ZINDEX + 3,
        Parent = container,
    })
    table.insert(shade3, track)

    local trackCorner = makeInstance("UICorner", {
        CornerRadius = UDim.new(0, 4),
        Parent = track,
    })

    -- Fill
    local ratio = (displayValue - min) / (max - min)
    local fill = makeInstance("Frame", {
        Name = randomString(),
        BackgroundColor3 = BLUE,
        BorderSizePixel = 0,
        Size = UDim2.new(math.clamp(ratio, 0, 1), 0, 1, 0),
        ZIndex = ARC_ZINDEX + 4,
        Parent = track,
    })

    local fillCorner = makeInstance("UICorner", {
        CornerRadius = UDim.new(0, 4),
        Parent = fill,
    })

    -- Knob
    local knob = makeInstance("Frame", {
        Name = randomString(),
        BackgroundColor3 = WHITE,
        BorderSizePixel = 0,
        Size = UDim2.new(0, 12, 0, 12),
        Position = UDim2.new(math.clamp(ratio, 0, 1), -6, 0.5, -6),
        ZIndex = ARC_ZINDEX + 4,
        Parent = track,
    })

    local knobCorner = makeInstance("UICorner", {
        CornerRadius = UDim.new(1, 0),
        Parent = knob,
    })

    local sliding = false

    local function setValue(val)
        displayValue = math.clamp(val, min, max)
        formatted = math.floor(displayValue * 100) / 100
        lbl.Text = label .. ": " .. tostring(formatted)
        ratio = (displayValue - min) / (max - min)
        fill.Size = UDim2.new(math.clamp(ratio, 0, 1), 0, 1, 0)
        knob.Position = UDim2.new(math.clamp(ratio, 0, 1), -6, 0.5, -6)
        if callback then
            callback(displayValue)
        end
    end

    local function onInput(input)
        local relX = math.clamp((input.Position.X - track.AbsolutePosition.X) / track.AbsoluteSize.X, 0, 1)
        setValue(min + (max - min) * relX)
    end

    track.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            sliding = true
            onInput(input)
        end
    end)

    knob.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            sliding = true
        end
    end)

    UserInputService.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            sliding = false
        end
    end)

    UserInputService.InputChanged:Connect(function(input)
        if sliding and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
            onInput(input)
        end
    end)

    panel.YOffset = panel.YOffset + 40
    updatePanelSize(panel)
    table.insert(panel.Elements, container)

    return {Container = container, GetValue = function() return displayValue end, SetValue = setValue}
end

-- ======================== CREATE TEXT BOX ========================

function ArcGUI.CreateTextBox(panel, label, placeholder, defaultVal)
    local container = makeInstance("Frame", {
        Name = randomString(),
        BackgroundTransparency = 1,
        BorderSizePixel = 0,
        Size = UDim2.new(1, 0, 0, 38),
        BackgroundColor3 = SHADE2,
        ZIndex = ARC_ZINDEX + 2,
        Parent = panel.Content,
    })

    local lbl = makeInstance("TextLabel", {
        Name = randomString(),
        BackgroundTransparency = 1,
        BorderSizePixel = 0,
        Size = UDim2.new(1, -8, 0, 16),
        Position = UDim2.new(0, 8, 0, 2),
        Text = label .. ":",
        Font = Enum.Font.SourceSans,
        TextSize = 12,
        TextColor3 = WHITE,
        TextStrokeColor3 = BLUE,
        TextStrokeTransparency = 0.5,
        TextXAlignment = Enum.TextXAlignment.Left,
        ZIndex = ARC_ZINDEX + 3,
        Parent = container,
    })
    table.insert(text1, lbl)

    local box = makeInstance("TextBox", {
        Name = randomString(),
        BackgroundColor3 = SHADE3,
        BorderSizePixel = 0,
        Size = UDim2.new(1, -16, 0, 18),
        Position = UDim2.new(0, 8, 0, 18),
        Text = defaultVal or "",
        PlaceholderText = placeholder or "",
        PlaceholderColor3 = Color3.fromRGB(150, 150, 150),
        Font = Enum.Font.SourceSans,
        TextSize = 12,
        TextColor3 = WHITE,
        TextXAlignment = Enum.TextXAlignment.Left,
        ZIndex = ARC_ZINDEX + 3,
        ClearTextOnFocus = false,
        Parent = container,
    })
    table.insert(shade3, box)
    table.insert(text1, box)

    panel.YOffset = panel.YOffset + 38
    updatePanelSize(panel)
    table.insert(panel.Elements, container)

    return {Container = container, Box = box, GetText = function() return box.Text end}
end

-- ======================== CREATE BUTTON ========================

function ArcGUI.CreateButton(panel, label, callback)
    local container = makeInstance("Frame", {
        Name = randomString(),
        BackgroundTransparency = 1,
        BorderSizePixel = 0,
        Size = UDim2.new(1, 0, 0, 28),
        ZIndex = ARC_ZINDEX + 2,
        Parent = panel.Content,
    })

    local btn = makeInstance("TextButton", {
        Name = randomString(),
        BackgroundColor3 = ACCENT,
        BorderSizePixel = 0,
        Size = UDim2.new(1, -8, 0, 24),
        Position = UDim2.new(0, 4, 0, 2),
        Text = label,
        Font = Enum.Font.SourceSansBold,
        TextSize = 13,
        TextColor3 = WHITE,
        TextStrokeColor3 = ARC_GLOW,
        TextStrokeTransparency = 0.7,
        ZIndex = ARC_ZINDEX + 3,
        Parent = container,
    })

    local btnCorner = makeInstance("UICorner", {
        CornerRadius = UDim.new(0, 4),
        Parent = btn,
    })

    btn.MouseButton1Click:Connect(function()
        if callback then
            callback()
        end
    end)

    panel.YOffset = panel.YOffset + 28
    updatePanelSize(panel)
    table.insert(panel.Elements, container)

    return {Container = container, Button = btn}
end

-- ======================== CREATE SEPARATOR ========================

function ArcGUI.CreateSeparator(panel)
    local sep = makeInstance("Frame", {
        Name = randomString(),
        BackgroundColor3 = SHADE3,
        BorderSizePixel = 0,
        Size = UDim2.new(1, -16, 0, 1),
        Position = UDim2.new(0, 8, 0, 0),
        ZIndex = ARC_ZINDEX + 2,
        Parent = panel.Content,
    })
    panel.YOffset = panel.YOffset + 4
    updatePanelSize(panel)
    table.insert(panel.Elements, sep)
end

-- ======================== CLOSE PANEL ========================

function ArcGUI.ClosePanel(name)
    local panel = ArcGUI.Panels[name]
    if panel and panel.Frame then
        if panel.DestroyExtra then
            panel.DestroyExtra()
        end
        panel.Frame:Destroy()
        ArcGUI.Panels[name] = nil
    end
end

-- ======================== TOGGLE PANEL ========================

function ArcGUI.TogglePanel(name)
    if ArcGUI.Panels[name] then
        ArcGUI.ClosePanel(name)
        return false
    end
    return true
end

-- ======================== IS OPEN ========================

function ArcGUI.IsOpen(name)
    return ArcGUI.Panels[name] ~= nil
end

-- ======================== COMMAND REGISTRATION SYSTEM ========================
-- Each command wraps an existing IY command and opens a GUI panel

-- ======================== ARC GUI HUB ========================
addcmd("arcgui", {}, function(args, speaker)
    if ArcGUI.Panels["arcgui_hub"] then ArcGUI.ClosePanel("arcgui_hub") return end
    local p = ArcGUI.CreatePanel("arcgui_hub", "Arc Yield GUI Hub", nil)

    local categories = {
        {"-- MOVEMENT --", nil},
        {"Fly", function() execCmd("arcfly") end},
        {"Hyperspeed", function() execCmd("archyper") end},
        {"Super Jump", function() execCmd("arcsjump") end},
        {"Bunny Hop", function() execCmd("arcbhop") end},
        {"Inf Jump", function() execCmd("arcinfjump") end},
        {"Float", function() execCmd("arcfloat") end},
        {"Bouncy", function() execCmd("arcbouncy") end},
        {"AntiGrav", function() execCmd("arcantigrav") end},
        {"Dash", function() execCmd("arcdash") end},
        {"Spider", function() execCmd("arcspider") end},
        {"Noclip", function() execCmd("arcnoclip") end},
        {"Speed", function() execCmd("arcspeed") end},
        {"JumpPower", function() execCmd("arcjp") end},
        {"CFly", function() execCmd("arccfly") end},
        {"VFly", function() execCmd("arcvfly") end},
        {"-- VISUALS --", nil},
        {"ESP", function() execCmd("arcesp") end},
        {"Item ESP", function() execCmd("arcitemesp") end},
        {"Part ESP", function() execCmd("arcpartesp") end},
        {"Vehicle ESP", function() execCmd("arcvesp") end},
        {"Mob ESP", function() execCmd("arcmobesp") end},
        {"Chams", function() execCmd("arcchams") end},
        {"Trail", function() execCmd("arctrail") end},
        {"Night Vision", function() execCmd("arcnv") end},
        {"Wireframe", function() execCmd("arcwireframe") end},
        {"Fullbright", function() execCmd("arcfb") end},
        {"-- COMBAT --", nil},
        {"Kill Aura", function() execCmd("arckaura") end},
        {"Reach", function() execCmd("arcreach") end},
        {"Tool Grabber", function() execCmd("arctoolgrab") end},
        {"Auto Farm", function() execCmd("arcautofarm") end},
        {"Tool Copy", function() execCmd("arctoolcopy") end},
        {"Explode", function() execCmd("arcexplode") end},
        {"-- PLAYER CTRL --", nil},
        {"Server Lock", function() execCmd("arcslock") end},
        {"Loop Kill", function() execCmd("arcloopkill") end},
        {"Jail", function() execCmd("arcjail") end},
        {"Freeze", function() execCmd("arcfreeze") end},
        {"Blind", function() execCmd("arcblind") end},
        {"Fling", function() execCmd("arcfling") end},
        {"Bring All", function() execCmd("arcbringall") end},
        {"TP All", function() execCmd("arctpall") end},
        {"Crash", function() execCmd("arccrash") end},
        {"-- EFFECTS --", nil},
        {"Spin", function() execCmd("arcspin2") end},
        {"Seizure", function() execCmd("arcseizure") end},
        {"Fire", function() execCmd("arcfire") end},
        {"Sparkles", function() execCmd("arcsparkles") end},
        {"Smoke", function() execCmd("arcsmoke") end},
        {"Tiny", function() execCmd("arctiny") end},
        {"Giant", function() execCmd("arcgiant") end},
        {"-- MISC --", nil},
        {"Gravity", function() execCmd("arcgravity") end},
        {"Music", function() execCmd("arcmusic") end},
        {"NPP", function() execCmd("arcnpp") end},
        {"-- DETECT --", nil},
        {"IY/Arc User ESP", function() execCmd("arcuseresp") end},
        {"-- TROLL --", nil},
        {"FunnyUA", function() execCmd("funnyua") end},
        {"Orbital Lazer", function() execCmd("orbitallazer") end},
        {"Arrow", function() execCmd("arrow me") end},
        {"AntiUA", function() execCmd("antiua") end},
        {"0Gravity UA", function() execCmd("0gravityua") end},
        {"Mouse UA", function() execCmd("mouseua") end},
        {"Desync", function() execCmd("arcdesync") end},
    }

    for _, item in ipairs(categories) do
        if item[2] == nil then
            ArcGUI.CreateSeparator(p)
            local catLabel = Instance.new("TextLabel")
            catLabel.Name = randomString()
            catLabel.BackgroundTransparency = 1
            catLabel.Size = UDim2.new(1, -8, 0, 18)
            catLabel.Font = Enum.Font.SourceSansBold
            catLabel.TextSize = 11
            catLabel.Text = item[1]
            catLabel.TextColor3 = BLUE
            catLabel.TextStrokeTransparency = 0.8
            catLabel.TextXAlignment = Enum.TextXAlignment.Left
            catLabel.ZIndex = ARC_ZINDEX + 2
            catLabel.Parent = p.Content
            table.insert(text1, catLabel)
            p.YOffset = p.YOffset + 18
            updatePanelSize(p)
        else
            local btn = ArcGUI.CreateButton(p, item[1], item[2])
        end
    end

    ArcGUI.CreateButton(p, "Close All Panels", function()
        for name, _ in pairs(ArcGUI.Panels) do
            pcall(function() ArcGUI.ClosePanel(name) end)
        end
    end)
end)

-- ======================== CLOSE ALL ARC PANELS ========================
addcmd("closearc", {"closeallarc"}, function(args, speaker)
    for name, _ in pairs(ArcGUI.Panels) do
        pcall(function() ArcGUI.ClosePanel(name) end)
    end
    notify("Arc Yield", "All GUI panels closed!")
end)

-- ======================== 1. FLY ========================
addcmd("arcfly", {"afly"}, function(args, speaker)
    if not ArcGUI.TogglePanel("fly") then return end
    local p = ArcGUI.CreatePanel("fly", "Fly", function()
        if p._flyOn then
            pcall(function() NOFLY() end)
        end
    end)
    p._flyOn = false
    local flySpeed = 1
    local infoLabel = ArcGUI.CreateButton(p, "E to fly, Ctrl/W/S to descend/ascend", function() end)
    infoLabel.Button.AutoButtonColor = false
    infoLabel.Button.BackgroundColor3 = SHADE3
    infoLabel.Button.TextSize = 10
    infoLabel.Button.TextWrapped = true
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._flyOn = state
        if state then
            pcall(function() sFLY() end)
        else
            pcall(function() NOFLY() end)
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Speed", 0.01, 50, 1, function(val)
        flySpeed = val
        iyflyspeed = val
    end)
end)

-- ======================== 2. HYPERSPEED ========================
addcmd("archyper", {"ahspeed"}, function(args, speaker)
    if not ArcGUI.TogglePanel("hyperspeed") then return end
    local p = ArcGUI.CreatePanel("hyperspeed", "Hyperspeed", function()
        if hyperSpeedConn then
            hyperSpeedConn:Disconnect()
            hyperSpeedConn = nil
        end
    end)
    p._hsOn = false
    local hsSpeed = 150
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._hsOn = state
        if state then
            local char = Players.LocalPlayer.Character
            if not char then return end
            local hum = char:FindFirstChildOfClass("Humanoid")
            if hum then
                hum.WalkSpeed = hsSpeed
                if hyperSpeedConn then hyperSpeedConn:Disconnect() end
                hyperSpeedConn = RunService.Heartbeat:Connect(function()
                    if hum and hum.Parent then
                        hum.WalkSpeed = hsSpeed
                    end
                end)
            end
        else
            if hyperSpeedConn then
                hyperSpeedConn:Disconnect()
                hyperSpeedConn = nil
            end
            local char = Players.LocalPlayer.Character
            if char then
                local hum = char:FindFirstChildOfClass("Humanoid")
                if hum then hum.WalkSpeed = 16 end
            end
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Speed", 10, 1000, 150, function(val)
        hsSpeed = val
        if p._hsOn then
            local char = Players.LocalPlayer.Character
            if char then
                local hum = char:FindFirstChildOfClass("Humanoid")
                if hum then hum.WalkSpeed = val end
            end
        end
    end)
end)

-- ======================== 3. SUPERJUMP ========================
addcmd("arcsjump", {"asjump"}, function(args, speaker)
    if not ArcGUI.TogglePanel("superjump") then return end
    local p = ArcGUI.CreatePanel("superjump", "Super Jump", function()
        if superJumpConn then
            superJumpConn:Disconnect()
            superJumpConn = nil
        end
    end)
    p._sjOn = false
    local sjPower = 150
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._sjOn = state
        if state then
            if superJumpConn then superJumpConn:Disconnect() end
            superJumpConn = UserInputService.JumpRequest:Connect(function()
                local char = Players.LocalPlayer.Character
                if char then
                    local hum = char:FindFirstChildOfClass("Humanoid")
                    if hum then
                        hum.JumpPower = sjPower
                    end
                end
            end)
        else
            if superJumpConn then
                superJumpConn:Disconnect()
                superJumpConn = nil
            end
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Power", 10, 500, 150, function(val)
        sjPower = val
    end)
end)

-- ======================== 4. BHOP ========================
addcmd("arcbhop", {"abhop"}, function(args, speaker)
    if not ArcGUI.TogglePanel("bhop") then return end
    local p = ArcGUI.CreatePanel("bhop", "Bunny Hop", function()
        if bhopConn then
            bhopConn:Disconnect()
            bhopConn = nil
        end
    end)
    p._bhOn = false
    local bhHeight = 40
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._bhOn = state
        if state then
            if bhopConn then bhopConn:Disconnect() end
            bhopConn = RunService.RenderStepped:Connect(function()
                if Players.LocalPlayer.Character then
                    local hum = Players.LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
                    if hum then
                        if hum.MoveDirection.Magnitude > 0 then
                            hum.Jump = true
                            hum.JumpPower = bhHeight
                        end
                    end
                end
            end)
        else
            if bhopConn then bhopConn:Disconnect() bhopConn = nil end
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Boost Height", 10, 100, 40, function(val)
        bhHeight = val
    end)
end)

-- ======================== 5. INFJUMP ========================
addcmd("arcinfjump", {"ainfjump"}, function(args, speaker)
    if not ArcGUI.TogglePanel("infjump") then return end
    local p = ArcGUI.CreatePanel("infjump", "Infinite Jump", function()
        if infJumpConn then
            infJumpConn:Disconnect()
            infJumpConn = nil
        end
    end)
    p._ijOn = false
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._ijOn = state
        if state then
            if infJumpConn then infJumpConn:Disconnect() end
            infJumpConn = UserInputService.JumpRequest:Connect(function()
                pcall(function()
                    Players.LocalPlayer.Character:FindFirstChildOfClass("Humanoid").Jump = true
                end)
            end)
        else
            if infJumpConn then infJumpConn:Disconnect() infJumpConn = nil end
        end
    end)
end)

-- ======================== 6. FLOAT ========================
addcmd("arcfloat", {"afloat"}, function(args, speaker)
    if not ArcGUI.TogglePanel("float") then return end
    local p = ArcGUI.CreatePanel("float", "Float", function()
        if floatConn then
            floatConn:Disconnect()
            floatConn = nil
        end
    end)
    p._flOn = false
    local riseSpeed = 50
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._flOn = state
        if state then
            if floatConn then floatConn:Disconnect() end
            floatConn = RunService.Stepped:Connect(function()
                pcall(function()
                    local hrp = Players.LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
                    if hrp then
                        hrp.Velocity = Vector3.new(hrp.Velocity.X, riseSpeed, hrp.Velocity.Z)
                    end
                end)
            end)
        else
            if floatConn then floatConn:Disconnect() floatConn = nil end
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Rise Speed", 0, 100, 50, function(val)
        riseSpeed = val
    end)
end)

-- ======================== 7. BOUNCY ========================
addcmd("arcbouncy", {"abouncy"}, function(args, speaker)
    if not ArcGUI.TogglePanel("bouncy") then return end
    local p = ArcGUI.CreatePanel("bouncy", "Bouncy", function()
        if bouncyConn then
            bouncyConn:Disconnect()
            bouncyConn = nil
        end
    end)
    p._boOn = false
    local bouncePower = 120
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._boOn = state
        if state then
            if bouncyConn then bouncyConn:Disconnect() end
            bouncyConn = RunService.Stepped:Connect(function()
                pcall(function()
                    local hrp = Players.LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
                    if hrp and hrp.Velocity.Y < 0 then
                        hrp.Velocity = Vector3.new(hrp.Velocity.X, bouncePower, hrp.Velocity.Z)
                    end
                end)
            end)
        else
            if bouncyConn then bouncyConn:Disconnect() bouncyConn = nil end
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Bounce Power", 20, 300, 120, function(val)
        bouncePower = val
    end)
end)

-- ======================== 8. ANTIGRAV ========================
addcmd("arcantigrav", {"aantigrav"}, function(args, speaker)
    if not ArcGUI.TogglePanel("antigrav") then return end
    local p = ArcGUI.CreatePanel("antigrav", "Anti Gravity", function()
        if antigravBF then
            antigravBF:Destroy()
            antigravBF = nil
        end
    end)
    p._agOn = false
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._agOn = state
        if state then
            pcall(function()
                local char = Players.LocalPlayer.Character
                if char then
                    local hrp = char:FindFirstChild("HumanoidRootPart")
                    if hrp then
                        antigravBF = Instance.new("BodyForce")
                        antigravBF.Name = randomString()
                        antigravBF.Force = Vector3.new(0, workspace.Gravity * hrp:GetMass(), 0)
                        antigravBF.Parent = hrp
                    end
                end
            end)
        else
            pcall(function()
                if antigravBF then
                    antigravBF:Destroy()
                    antigravBF = nil
                end
            end)
        end
    end)
end)

-- ======================== 9. DASH ========================
addcmd("arcdash", {"adash"}, function(args, speaker)
    if not ArcGUI.TogglePanel("dash") then return end
    local p = ArcGUI.CreatePanel("dash", "Dash", function() end)
    local dashPower = 300
    local slider = ArcGUI.CreateSlider(p, "Power", 50, 1000, 300, function(val)
        dashPower = val
    end)
    local btn = ArcGUI.CreateButton(p, "DASH!", function()
        pcall(function()
            local char = Players.LocalPlayer.Character
            if char then
                local hum = char:FindFirstChildOfClass("Humanoid")
                local hrp = char:FindFirstChild("HumanoidRootPart")
                if hum and hrp and hum.MoveDirection.Magnitude > 0 then
                    hrp.Velocity = hrp.Velocity + hum.MoveDirection * dashPower
                end
            end
        end)
    end)
end)

-- ======================== 10. SPIDER ========================
addcmd("arcspider", {"aspider"}, function(args, speaker)
    if not ArcGUI.TogglePanel("spider") then return end
    local p = ArcGUI.CreatePanel("spider", "Spider Climb", function()
        if spiderConn then
            spiderConn:Disconnect()
            spiderConn = nil
        end
    end)
    p._spOn = false
    local climbSpeed = 50
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._spOn = state
        if state then
            if spiderConn then spiderConn:Disconnect() end
            spiderConn = RunService.Stepped:Connect(function()
                pcall(function()
                    local char = Players.LocalPlayer.Character
                    if char then
                        local hum = char:FindFirstChildOfClass("Humanoid")
                        local hrp = char:FindFirstChild("HumanoidRootPart")
                        if hum and hrp then
                            if hum.MoveDirection.Magnitude > 0 then
                                local ray = Ray.new(hrp.Position, hrp.CFrame.LookVector * 3)
                                local part = workspace:FindPartOnRayWithWhitelist(ray, {workspace})
                                if part then
                                    hrp.Velocity = Vector3.new(hrp.Velocity.X, climbSpeed, hrp.Velocity.Z)
                                end
                            end
                        end
                    end
                end)
            end)
        else
            if spiderConn then spiderConn:Disconnect() spiderConn = nil end
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Climb Speed", 10, 200, 50, function(val)
        climbSpeed = val
    end)
end)

-- ======================== 11. NOCLIP ========================
addcmd("arcnoclip", {"anoclip"}, function(args, speaker)
    if not ArcGUI.TogglePanel("noclip") then return end
    local p = ArcGUI.CreatePanel("noclip", "Noclip", function()
        if p._ncConn then
            p._ncConn:Disconnect()
            p._ncConn = nil
        end
    end)
    p._ncOn = false
    p._ncConn = nil
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._ncOn = state
        if state then
            if p._ncConn then p._ncConn:Disconnect() end
            p._ncConn = RunService.Stepped:Connect(function()
                pcall(function()
                    local char = Players.LocalPlayer.Character
                    if char then
                        for _, part in pairs(char:GetDescendants()) do
                            if part:IsA("BasePart") then
                                part.CanCollide = false
                            end
                        end
                    end
                end)
            end)
        else
            if p._ncConn then p._ncConn:Disconnect() p._ncConn = nil end
            pcall(function()
                local char = Players.LocalPlayer.Character
                if char then
                    for _, part in pairs(char:GetDescendants()) do
                        if part:IsA("BasePart") then
                            part.CanCollide = true
                        end
                    end
                end
            end)
        end
    end)
end)

-- ======================== 12. SPEED ========================
addcmd("arcspeed", {"aspeed"}, function(args, speaker)
    if not ArcGUI.TogglePanel("speed") then return end
    local p = ArcGUI.CreatePanel("speed", "WalkSpeed", function()
        pcall(function()
            local char = Players.LocalPlayer.Character
            if char then
                local hum = char:FindFirstChildOfClass("Humanoid")
                if hum then hum.WalkSpeed = 16 end
            end
        end)
    end)
    local slider = ArcGUI.CreateSlider(p, "WalkSpeed", 1, 1000, 16, function(val)
        pcall(function()
            local char = Players.LocalPlayer.Character
            if char then
                local hum = char:FindFirstChildOfClass("Humanoid")
                if hum then hum.WalkSpeed = val end
            end
        end)
    end)
end)

-- ======================== 13. JUMPPOWER ========================
addcmd("arcjp", {"ajumppower"}, function(args, speaker)
    if not ArcGUI.TogglePanel("jumppower") then return end
    local p = ArcGUI.CreatePanel("jumppower", "JumpPower", function()
        pcall(function()
            local char = Players.LocalPlayer.Character
            if char then
                local hum = char:FindFirstChildOfClass("Humanoid")
                if hum then hum.JumpPower = 50 end
            end
        end)
    end)
    local slider = ArcGUI.CreateSlider(p, "JumpPower", 0, 500, 50, function(val)
        pcall(function()
            local char = Players.LocalPlayer.Character
            if char then
                local hum = char:FindFirstChildOfClass("Humanoid")
                if hum then hum.JumpPower = val end
            end
        end)
    end)
end)

-- ======================== 14. CFRAMEFLY ========================
addcmd("arccfly", {"accfly"}, function(args, speaker)
    if not ArcGUI.TogglePanel("cframefly") then return end
    local p = ArcGUI.CreatePanel("cframefly", "CFrame Fly", function()
        if p._cfConn then
            p._cfConn:Disconnect()
            p._cfConn = nil
        end
    end)
    p._cfOn = false
    p._cfConn = nil
    local cfSpeed = 1
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._cfOn = state
        if state then
            if p._cfConn then p._cfConn:Disconnect() end
            p._cfConn = RunService.RenderStepped:Connect(function()
                pcall(function()
                    local cam = workspace.CurrentCamera
                    local hrp = Players.LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
                    if cam and hrp then
                        local cf = cam.CFrame
                        local moveDir = Vector3.new(0, 0, 0)
                        if UserInputService:IsKeyDown(Enum.KeyCode.W) then moveDir = moveDir + cf.LookVector end
                        if UserInputService:IsKeyDown(Enum.KeyCode.S) then moveDir = moveDir - cf.LookVector end
                        if UserInputService:IsKeyDown(Enum.KeyCode.A) then moveDir = moveDir - cf.RightVector end
                        if UserInputService:IsKeyDown(Enum.KeyCode.D) then moveDir = moveDir + cf.RightVector end
                        if UserInputService:IsKeyDown(Enum.KeyCode.Space) then moveDir = moveDir + Vector3.new(0, 1, 0) end
                        if UserInputService:IsKeyDown(Enum.KeyCode.LeftShift) then moveDir = moveDir - Vector3.new(0, 1, 0) end
                        hrp.CFrame = hrp.CFrame + moveDir * cfSpeed
                    end
                end)
            end)
        else
            if p._cfConn then p._cfConn:Disconnect() p._cfConn = nil end
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Speed", 1, 500, 1, function(val)
        cfSpeed = val
    end)
end)

-- ======================== 15. VFLY ========================
addcmd("arcvfly", {"avfly"}, function(args, speaker)
    if not ArcGUI.TogglePanel("vfly") then return end
    local p = ArcGUI.CreatePanel("vfly", "Vehicle Fly", function()
        if p._vfConn then
            p._vfConn:Disconnect()
            p._vfConn = nil
        end
    end)
    p._vfOn = false
    p._vfConn = nil
    local vfSpeed = 1
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._vfOn = state
        if state then
            pcall(function()
                local char = Players.LocalPlayer.Character
                if char then
                    local hum = char:FindFirstChildOfClass("Humanoid")
                    if hum then
                        local bv = Instance.new("BodyVelocity")
                        bv.Name = randomString()
                        bv.MaxForce = Vector3.new(math.huge, math.huge, math.huge)
                        bv.Velocity = Vector3.new(0, 0, 0)
                        bv.Parent = char:FindFirstChild("HumanoidRootPart") or char.PrimaryPart
                        local bg = Instance.new("BodyGyro")
                        bg.Name = randomString()
                        bg.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
                        bg.P = 9e4
                        bg.Parent = char:FindFirstChild("HumanoidRootPart") or char.PrimaryPart
                        p._vfBV = bv
                        p._vfBG = bg

                        if p._vfConn then p._vfConn:Disconnect() end
                        p._vfConn = RunService.RenderStepped:Connect(function()
                            pcall(function()
                                local cam = workspace.CurrentCamera
                                if bv and bv.Parent and bg and bg.Parent then
                                    local moveDir = Vector3.new(0, 0, 0)
                                    if UserInputService:IsKeyDown(Enum.KeyCode.W) then moveDir = moveDir + cam.CFrame.LookVector end
                                    if UserInputService:IsKeyDown(Enum.KeyCode.S) then moveDir = moveDir - cam.CFrame.LookVector end
                                    if UserInputService:IsKeyDown(Enum.KeyCode.A) then moveDir = moveDir - cam.CFrame.RightVector end
                                    if UserInputService:IsKeyDown(Enum.KeyCode.D) then moveDir = moveDir + cam.CFrame.RightVector end
                                    if UserInputService:IsKeyDown(Enum.KeyCode.Space) then moveDir = moveDir + Vector3.new(0, 1, 0) end
                                    if UserInputService:IsKeyDown(Enum.KeyCode.LeftShift) then moveDir = moveDir - Vector3.new(0, 1, 0) end
                                    bv.Velocity = moveDir * vfSpeed
                                    bg.CFrame = cam.CFrame
                                end
                            end)
                        end)
                    end
                end
            end)
        else
            if p._vfConn then p._vfConn:Disconnect() p._vfConn = nil end
            pcall(function()
                if p._vfBV then p._vfBV:Destroy() p._vfBV = nil end
                if p._vfBG then p._vfBG:Destroy() p._vfBG = nil end
            end)
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Speed", 1, 500, 1, function(val)
        vfSpeed = val
    end)
end)

-- ======================== 16. ESP ========================
addcmd("arcesp", {"aesp"}, function(args, speaker)
    if not ArcGUI.TogglePanel("esp") then return end
    local p = ArcGUI.CreatePanel("esp", "ESP", function()
        execCmd("noesp")
    end)
    p._espOn = false
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._espOn = state
        if state then
            execCmd("esp")
        else
            execCmd("noesp")
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Transparency", 0, 1, 0.3, function(val)
        execCmd("esptransparency " .. tostring(val))
    end)
    ArcGUI.CreateSeparator(p)
    local teamBtn = ArcGUI.CreateButton(p, "ESP Team Only", function()
        execCmd("espteam")
    end)
end)

-- ======================== 17. ITEM ESP ========================
addcmd("arcitemesp", {"aitemesp"}, function(args, speaker)
    if not ArcGUI.TogglePanel("itemesp") then return end
    local p = ArcGUI.CreatePanel("itemesp", "Item ESP", function()
        itemEspActive = false
        if itemEspConn then
            itemEspConn:Disconnect()
            itemEspConn = nil
        end
        if itemEspDraws then
            for _, d in pairs(itemEspDraws) do
                if d and d.Parent then d:Destroy() end
            end
        end
    end)
    p._ieOn = false
    local ieRange = 100
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._ieOn = state
        if state then
            itemEspActive = true
            execCmd("itemesp " .. tostring(ieRange))
        else
            itemEspActive = false
            execCmd("noesp")
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Range", 10, 500, 100, function(val)
        ieRange = val
    end)
end)

-- ======================== 18. PART ESP ========================
addcmd("arcpartesp", {"apartesp"}, function(args, speaker)
    if not ArcGUI.TogglePanel("partesp") then return end
    local p = ArcGUI.CreatePanel("partesp", "Part ESP", function()
        partEspActive = false
        if partEspConn then
            partEspConn:Disconnect()
            partEspConn = nil
        end
        if partEspDraws then
            for _, d in pairs(partEspDraws) do
                if d and d.Parent then d:Destroy() end
            end
        end
    end)
    p._peOn = false
    local filterText = ArcGUI.CreateTextBox(p, "Filter", "Enter part name filter", "")
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._peOn = state
        if state then
            local ft = filterText:GetText()
            if ft and ft ~= "" then
                execCmd("partesp " .. ft)
            else
                execCmd("partesp")
            end
        else
            execCmd("unpartesp")
        end
    end)
end)

-- ======================== 19. VEHICLE ESP ========================
addcmd("arcvesp", {"avesp"}, function(args, speaker)
    if not ArcGUI.TogglePanel("vehicleesp") then return end
    local p = ArcGUI.CreatePanel("vehicleesp", "Vehicle ESP", function()
        vehicleEspActive = false
        if vehicleEspConn then
            vehicleEspConn:Disconnect()
            vehicleEspConn = nil
        end
    end)
    p._veOn = false
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._veOn = state
        if state then
            vehicleEspActive = true
            execCmd("vehicleesp")
        else
            vehicleEspActive = false
        end
    end)
end)

-- ======================== 20. MOB ESP ========================
addcmd("arcmobesp", {"amobesp"}, function(args, speaker)
    if not ArcGUI.TogglePanel("mobesp") then return end
    local p = ArcGUI.CreatePanel("mobesp", "Mob/NPC ESP", function()
        mobEspActive = false
        if mobEspConn then
            mobEspConn:Disconnect()
            mobEspConn = nil
        end
        if mobEspDraws then
            for _, d in pairs(mobEspDraws) do
                if d and d.Parent then d:Destroy() end
            end
        end
    end)
    p._meOn = false
    local meRange = 200
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._meOn = state
        if state then
            mobEspActive = true
        else
            mobEspActive = false
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Range", 10, 500, 200, function(val)
        meRange = val
    end)
end)

-- ======================== 21. CHAMS ========================
addcmd("arcchams", {"achams"}, function(args, speaker)
    if not ArcGUI.TogglePanel("chams") then return end
    local p = ArcGUI.CreatePanel("chams", "Chams", function()
        chamsActive = false
        if chamsConn then
            chamsConn:Disconnect()
            chamsConn = nil
        end
        if chamsHls then
            for _, hl in pairs(chamsHls) do
                if hl and hl.Parent then hl:Destroy() end
            end
            chamsHls = {}
        end
        execCmd("nochams")
    end)
    p._chOn = false
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._chOn = state
        if state then
            chamsActive = true
            execCmd("chams")
        else
            chamsActive = false
            execCmd("nochams")
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Fill Transparency", 0, 1, 0.5, function(val) end)
end)

-- ======================== 22. TRAIL ========================
addcmd("arctrail", {"atrail"}, function(args, speaker)
    if not ArcGUI.TogglePanel("trail") then return end
    local p = ArcGUI.CreatePanel("trail", "Trail", function()
        trailActive = false
        if trailConn then
            trailConn:Disconnect()
            trailConn = nil
        end
        if trailParts then
            for _, tp in pairs(trailParts) do
                if tp and tp.Parent then tp:Destroy() end
            end
        end
        execCmd("untrail")
    end)
    p._trOn = false
    local trColor = "#0066ff"
    local trLife = 2
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._trOn = state
        if state then
            trailActive = true
            execCmd("trail")
        else
            trailActive = false
            execCmd("untrail")
        end
    end)
    local colorBox = ArcGUI.CreateTextBox(p, "Color (Hex)", "#0066ff", "#0066ff")
    local slider = ArcGUI.CreateSlider(p, "Lifetime", 0.5, 5, 2, function(val)
        trLife = val
    end)
end)

-- ======================== 23. NIGHTVISION ========================
addcmd("arcnv", {"anv"}, function(args, speaker)
    if not ArcGUI.TogglePanel("nightvision") then return end
    local p = ArcGUI.CreatePanel("nightvision", "Night Vision", function()
        nightvisionActive = false
        if nightvisionCC then
            nightvisionCC:Destroy()
            nightvisionCC = nil
        end
    end)
    p._nvOn = false
    local nvBrightness = 0.3
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._nvOn = state
        if state then
            nightvisionActive = true
            if not nightvisionCC then
                nightvisionCC = Instance.new("ColorCorrectionEffect")
                nightvisionCC.Name = randomString()
                nightvisionCC.Brightness = nvBrightness
                nightvisionCC.Contrast = 0.2
                nightvisionCC.Saturation = -0.2
                nightvisionCC.Parent = Lighting
            end
        else
            nightvisionActive = false
            if nightvisionCC then
                nightvisionCC:Destroy()
                nightvisionCC = nil
            end
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Brightness", 0, 1, 0.3, function(val)
        nvBrightness = val
        if nightvisionCC then
            nightvisionCC.Brightness = val
        end
    end)
end)

-- ======================== 24. WIREFRAME ========================
addcmd("arcwireframe", {"awireframe"}, function(args, speaker)
    if not ArcGUI.TogglePanel("wireframe") then return end
    local p = ArcGUI.CreatePanel("wireframe", "Wireframe", function()
        wireframeActive = false
        if wireframeParts then
            for _, v in pairs(wireframeParts) do
                if v and v.Material ~= nil then
                    v.Material = v:GetAttribute("OrigMat") or Enum.Material.Plastic
                    v:RemoveAttribute("OrigMat")
                end
            end
            wireframeParts = {}
        end
        execCmd("unwireframe")
    end)
    p._wfOn = false
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._wfOn = state
        if state then
            wireframeActive = true
            execCmd("wireframe")
        else
            wireframeActive = false
            execCmd("unwireframe")
        end
    end)
end)

-- ======================== 25. FULLBRIGHT ========================
addcmd("arcfb", {"afb"}, function(args, speaker)
    if not ArcGUI.TogglePanel("fullbright") then return end
    local p = ArcGUI.CreatePanel("fullbright", "Fullbright", function()
        fullbrightActive = false
        if fullbrightOrig then
            Lighting.Ambient = fullbrightOrig.Ambient or Color3.fromRGB(0, 0, 0)
            Lighting.OutdoorAmbient = fullbrightOrig.OutdoorAmbient or Color3.fromRGB(0, 0, 0)
            Lighting.Brightness = fullbrightOrig.Brightness or 1
            Lighting.GlobalShadows = true
            fullbrightOrig = {}
        end
    end)
    p._fbOn = false
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._fbOn = state
        if state then
            fullbrightActive = true
            execCmd("fullbright")
        else
            fullbrightActive = false
        end
    end)
end)

-- ======================== 26. KILLAURA ========================
addcmd("arckaura", {"akaura"}, function(args, speaker)
    if not ArcGUI.TogglePanel("killaura") then return end
    local p = ArcGUI.CreatePanel("killaura", "Kill Aura", function()
        if killAuraConn then
            killAuraConn:Disconnect()
            killAuraConn = nil
        end
    end)
    p._kaOn = false
    local kaRange = 25
    local kaDamage = 5
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._kaOn = state
        if state then
            if killAuraConn then killAuraConn:Disconnect() end
            killAuraConn = RunService.RenderStepped:Connect(function()
                pcall(function()
                    local char = Players.LocalPlayer.Character
                    if not char then return end
                    local hrp = char:FindFirstChild("HumanoidRootPart")
                    if not hrp then return end
                    for _, plr in pairs(Players:GetPlayers()) do
                        if plr ~= Players.LocalPlayer and plr.Character then
                            local eHrp = plr.Character:FindFirstChild("HumanoidRootPart")
                            local eHum = plr.Character:FindFirstChildOfClass("Humanoid")
                            if eHrp and eHum and (hrp.Position - eHrp.Position).Magnitude <= kaRange then
                                eHum:TakeDamage(kaDamage)
                            end
                        end
                    end
                end)
            end)
        else
            if killAuraConn then killAuraConn:Disconnect() killAuraConn = nil end
        end
    end)
    local rangeSlider = ArcGUI.CreateSlider(p, "Range", 5, 100, 25, function(val)
        kaRange = val
    end)
    local dmgSlider = ArcGUI.CreateSlider(p, "Damage", 1, 100, 5, function(val)
        kaDamage = val
    end)
end)

-- ======================== 27. REACH ========================
addcmd("arcreach", {"areach"}, function(args, speaker)
    if not ArcGUI.TogglePanel("reach") then return end
    local p = ArcGUI.CreatePanel("reach", "Reach", function()
        reachActive = false
        if reachOrig then
            pcall(function()
                local char = Players.LocalPlayer.Character
                if char then
                    for _, tool in pairs(char:GetChildren()) do
                        if tool:IsA("Tool") then
                            local handle = tool:FindFirstChild("Handle")
                            if handle and reachOrig[handle] then
                                handle.Size = reachOrig[handle]
                            end
                        end
                    end
                end
            end)
            reachOrig = {}
        end
    end)
    p._reOn = false
    local reachDist = 20
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._reOn = state
        if state then
            reachActive = true
            reachDist = reachDist
        else
            reachActive = false
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Distance", 5, 100, 20, function(val)
        reachDist = val
    end)
end)

-- ======================== 28. TOOLGRABBER ========================
addcmd("arctoolgrab", {"atoolgrab"}, function(args, speaker)
    if not ArcGUI.TogglePanel("toolgrabber") then return end
    local p = ArcGUI.CreatePanel("toolgrabber", "Tool Grabber", function()
        if toolGrabberConn then
            toolGrabberConn:Disconnect()
            toolGrabberConn = nil
        end
    end)
    p._tgOn = false
    local tgRange = 100
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._tgOn = state
        if state then
            if toolGrabberConn then toolGrabberConn:Disconnect() end
            toolGrabberConn = RunService.RenderStepped:Connect(function()
                pcall(function()
                    local char = Players.LocalPlayer.Character
                    if not char then return end
                    local hrp = char:FindFirstChild("HumanoidRootPart")
                    if not hrp then return end
                    for _, item in pairs(workspace:GetChildren()) do
                        if item:IsA("Tool") and (item.Handle.Position - hrp.Position).Magnitude <= tgRange then
                            if item.Parent ~= char then
                                firetouchinterest(item.Handle, hrp, 0)
                                firetouchinterest(item.Handle, hrp, 1)
                            end
                        end
                    end
                end)
            end)
        else
            if toolGrabberConn then toolGrabberConn:Disconnect() toolGrabberConn = nil end
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Range", 10, 300, 100, function(val)
        tgRange = val
    end)
end)

-- ======================== 29. AUTOFARM ========================
addcmd("arcautofarm", {"aautofarm"}, function(args, speaker)
    if not ArcGUI.TogglePanel("autofarm") then return end
    local p = ArcGUI.CreatePanel("autofarm", "Auto Farm/Collect", function()
        if autoFarmConn then
            autoFarmConn:Disconnect()
            autoFarmConn = nil
        end
    end)
    p._afOn = false
    local afRange = 50
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._afOn = state
        if state then
            if autoFarmConn then autoFarmConn:Disconnect() end
            autoFarmConn = RunService.RenderStepped:Connect(function()
                pcall(function()
                    local char = Players.LocalPlayer.Character
                    if not char then return end
                    local hrp = char:FindFirstChild("HumanoidRootPart")
                    if not hrp then return end
                    for _, obj in pairs(workspace:GetDescendants()) do
                        if (obj:IsA("BasePart") or obj:IsA("Model") or obj:IsA("Tool") or obj:IsA("CoinContainer") or obj:IsA("Collectible") or obj:IsA("Part")) and obj:IsDescendantOf(workspace) then
                            local pos = obj:IsA("Model") and (obj.PrimaryPart and obj.PrimaryPart.Position) or obj.Position
                            if pos and (pos - hrp.Position).Magnitude <= afRange then
                                firetouchinterest(obj:IsA("Model") and obj.PrimaryPart or obj, hrp, 0)
                                firetouchinterest(obj:IsA("Model") and obj.PrimaryPart or obj, hrp, 1)
                            end
                        end
                    end
                end)
            end)
        else
            if autoFarmConn then autoFarmConn:Disconnect() autoFarmConn = nil end
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Range", 10, 200, 50, function(val)
        afRange = val
    end)
end)

-- ======================== 30. TOOLCOPY ========================
addcmd("arctoolcopy", {"atoolcopy"}, function(args, speaker)
    if not ArcGUI.TogglePanel("toolcopy") then return end
    local p = ArcGUI.CreatePanel("toolcopy", "Tool Copy", function() end)
    local nameInput = ArcGUI.CreateTextBox(p, "Player Name", "Enter player name", "")
    local btn = ArcGUI.CreateButton(p, "Copy Tools", function()
        local plrName = nameInput:GetText()
        if plrName and plrName ~= "" then
            execCmd("toolcopy " .. plrName)
        else
            notify("Arc Yield", "Enter a player name first!")
        end
    end)
end)

-- ======================== 31. EXPLODE ========================
addcmd("arcexplode", {"aexplode"}, function(args, speaker)
    if not ArcGUI.TogglePanel("explode") then return end
    local p = ArcGUI.CreatePanel("explode", "Explode Player", function() end)
    local nameInput = ArcGUI.CreateTextBox(p, "Player Name", "Enter player name", "")
    local blastRadius = 20
    local slider = ArcGUI.CreateSlider(p, "Blast Radius", 5, 100, 20, function(val)
        blastRadius = val
    end)
    local btn = ArcGUI.CreateButton(p, "EXPLODE!", function()
        local plrName = nameInput:GetText()
        if plrName and plrName ~= "" then
            execCmd("explode " .. plrName)
        else
            notify("Arc Yield", "Enter a player name first!")
        end
    end)
end)

-- ======================== 32. SERVERLOCK ========================
addcmd("arcslock", {"aslock"}, function(args, speaker)
    if not ArcGUI.TogglePanel("serverlock") then return end
    local p = ArcGUI.CreatePanel("serverlock", "Server Lock", function()
        if serverLockConn then
            serverLockConn:Disconnect()
            serverLockConn = nil
        end
    end)
    p._slOn = false
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._slOn = state
        if state then
            if serverLockConn then serverLockConn:Disconnect() end
            serverLockConn = Players.PlayerAdded:Connect(function(player)
                player:Kick("\nServer is locked by Arc Yield")
            end)
            for _, plr in pairs(Players:GetPlayers()) do
                if plr ~= Players.LocalPlayer then
                    pcall(function() plr:Kick("\nServer is locked by Arc Yield") end)
                end
            end
        else
            if serverLockConn then serverLockConn:Disconnect() serverLockConn = nil end
        end
    end)
end)

-- ======================== 33. LOOPKILL ========================
addcmd("arcloopkill", {"aloopkill"}, function(args, speaker)
    if not ArcGUI.TogglePanel("loopkill") then return end
    local p = ArcGUI.CreatePanel("loopkill", "Loop Kill", function()
        if loopKillConn then
            loopKillConn:Disconnect()
            loopKillConn = nil
        end
        loopKillList = {}
    end)
    p._lkOn = false
    local nameInput = ArcGUI.CreateTextBox(p, "Player Name", "Enter player name", "")
    local startBtn = ArcGUI.CreateButton(p, "Start Loop Kill", function()
        local plrName = nameInput:GetText()
        if plrName and plrName ~= "" then
            local target = FindPlayer(plrName, Players.LocalPlayer)
            if target then
                p._lkOn = true
                if loopKillConn then loopKillConn:Disconnect() end
                table.insert(loopKillList, target)
                loopKillConn = RunService.RenderStepped:Connect(function()
                    pcall(function()
                        if target.Character and target.Character:FindFirstChild("HumanoidRootPart") then
                            local char = Players.LocalPlayer.Character
                            if char and char:FindFirstChild("HumanoidRootPart") then
                                char:FindFirstChild("HumanoidRootPart").CFrame = target.Character.HumanoidRootPart.CFrame
                            end
                            pcall(function() target.Character:FindFirstChildOfClass("Humanoid").Health = 0 end)
                        end
                    end)
                end)
                notify("Arc Yield", "Loop killing " .. target.Name)
            else
                notify("Arc Yield", "Player not found!")
            end
        else
            notify("Arc Yield", "Enter a player name first!")
        end
    end)
    local stopBtn = ArcGUI.CreateButton(p, "Stop Loop Kill", function()
        p._lkOn = false
        if loopKillConn then
            loopKillConn:Disconnect()
            loopKillConn = nil
        end
        loopKillList = {}
        notify("Arc Yield", "Loop kill stopped")
    end)
    stopBtn.Button.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
end)

-- ======================== 34. JAIL ========================
addcmd("arcjail", {"ajail"}, function(args, speaker)
    if not ArcGUI.TogglePanel("jail") then return end
    local p = ArcGUI.CreatePanel("jail", "Jail", function()
        execCmd("unjail")
    end)
    local nameInput = ArcGUI.CreateTextBox(p, "Player Name", "Enter player name", "")
    local jailBtn = ArcGUI.CreateButton(p, "Jail", function()
        local plrName = nameInput:GetText()
        if plrName and plrName ~= "" then
            execCmd("jail " .. plrName)
        else
            notify("Arc Yield", "Enter a player name first!")
        end
    end)
    local unjailBtn = ArcGUI.CreateButton(p, "Unjail", function()
        local plrName = nameInput:GetText()
        if plrName and plrName ~= "" then
            execCmd("unjail " .. plrName)
        end
    end)
    unjailBtn.Button.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
end)

-- ======================== 35. FREEZE ========================
addcmd("arcfreeze", {"afreeze"}, function(args, speaker)
    if not ArcGUI.TogglePanel("freeze") then return end
    local p = ArcGUI.CreatePanel("freeze", "Freeze Player", function()
        execCmd("unfreeze")
    end)
    local nameInput = ArcGUI.CreateTextBox(p, "Player Name", "Enter player name", "")
    local freezeBtn = ArcGUI.CreateButton(p, "Freeze", function()
        local plrName = nameInput:GetText()
        if plrName and plrName ~= "" then
            execCmd("freeze " .. plrName)
        else
            notify("Arc Yield", "Enter a player name first!")
        end
    end)
    local unfreezeBtn = ArcGUI.CreateButton(p, "Unfreeze", function()
        local plrName = nameInput:GetText()
        if plrName and plrName ~= "" then
            execCmd("unfreeze " .. plrName)
        end
    end)
    unfreezeBtn.Button.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
end)

-- ======================== 36. BLIND ========================
addcmd("arcblind", {"ablind"}, function(args, speaker)
    if not ArcGUI.TogglePanel("blind") then return end
    local p = ArcGUI.CreatePanel("blind", "Blind Player", function()
        execCmd("unblind")
    end)
    local nameInput = ArcGUI.CreateTextBox(p, "Player Name", "Enter player name", "")
    local blindBtn = ArcGUI.CreateButton(p, "Blind", function()
        local plrName = nameInput:GetText()
        if plrName and plrName ~= "" then
            execCmd("blind " .. plrName)
        else
            notify("Arc Yield", "Enter a player name first!")
        end
    end)
    local unblindBtn = ArcGUI.CreateButton(p, "Unblind", function()
        local plrName = nameInput:GetText()
        if plrName and plrName ~= "" then
            execCmd("unblind " .. plrName)
        end
    end)
    unblindBtn.Button.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
end)

-- ======================== 37. FLING ========================
addcmd("arcfling", {"afling"}, function(args, speaker)
    if not ArcGUI.TogglePanel("fling") then return end
    local p = ArcGUI.CreatePanel("fling", "Fling Player", function()
        if p._flingActive then
            p._flingActive = false
            execCmd("unfling")
        end
    end)
    p._flingActive = false

    -- Contact-based fling toggle (like IY's fling - spin and fling anyone you touch)
    local toggle = ArcGUI.CreateToggle(p, "Contact Fling (touch players)", false, function(state)
        p._flingActive = state
        if state then
            execCmd("fling")
            notify("Arc Yield", "Contact fling ON - touch players to fling them!")
        else
            execCmd("unfling")
            notify("Arc Yield", "Contact fling OFF")
        end
    end)

    ArcGUI.CreateSeparator(p)

    -- Direct fling by partial name - uses teleport + physics spin like IY
    local nameInput = ArcGUI.CreateTextBox(p, "Player (partial name OK)", "Type few letters of name...", "")
    local flingPower = 500
    local slider = ArcGUI.CreateSlider(p, "Power", 100, 2000, 500, function(val)
        flingPower = val
    end)
    local btn = ArcGUI.CreateButton(p, "FLING PLAYER", function()
        local plrName = nameInput:GetText()
        if not plrName or plrName == "" then
            notify("Arc Yield", "Type a player name first!")
            return
        end
        local found = getPlayersByName(plrName)
        if not found or #found == 0 then
            notify("Arc Yield", "Player not found: " .. plrName)
            return
        end
        for _, target in ipairs(found) do
            if target ~= Players.LocalPlayer and target.Character and target.Character:FindFirstChild("HumanoidRootPart") then
                -- Save current position, teleport to target, fling via physics, teleport back
                local myChar = Players.LocalPlayer.Character
                if not myChar or not myChar:FindFirstChild("HumanoidRootPart") then
                    notify("Arc Yield", "Your character not found!")
                    return
                end
                local myHRP = myChar.HumanoidRootPart
                local savedPos = myHRP.CFrame
                local targetPos = target.Character.HumanoidRootPart.CFrame

                -- Teleport next to target
                myHRP.CFrame = targetPos * CFrame.new(0, 0, 3)

                -- Start fling (physics-based spin, same as IY's fling command)
                task.spawn(function()
                    execCmd("fling")
                    task.wait(2)
                    execCmd("unfling")
                    -- Teleport back to saved position
                    task.wait(0.3)
                    if myHRP then
                        myHRP.CFrame = savedPos
                    end
                end)
                notify("Arc Yield", "Flinging " .. target.Name .. "!")
            end
        end
    end)
    btn.Button.BackgroundColor3 = ACCENT

    ArcGUI.CreateSeparator(p)
    local infoLabel = ArcGUI.CreateButton(p, "Tip: Contact fling = spin and touch players", function() end)
    infoLabel.Button.AutoButtonColor = false
    infoLabel.Button.BackgroundColor3 = SHADE2
    infoLabel.Button.TextSize = 10
    infoLabel.Button.TextWrapped = true
end)

-- ======================== 38. BRING ALL ========================
addcmd("arcbringall", {"abringall"}, function(args, speaker)
    if not ArcGUI.TogglePanel("bringall") then return end
    local p = ArcGUI.CreatePanel("bringall", "Bring All Players", function() end)
    local baRange = 5
    local slider = ArcGUI.CreateSlider(p, "Offset Range", 1, 50, 5, function(val)
        baRange = val
    end)
    local btn = ArcGUI.CreateButton(p, "Bring All!", function()
        pcall(function()
            local char = Players.LocalPlayer.Character
            if not char then return end
            local myPos = char:FindFirstChild("HumanoidRootPart") and char.HumanoidRootPart.Position
            if not myPos then return end
            for _, plr in pairs(Players:GetPlayers()) do
                if plr ~= Players.LocalPlayer and plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") then
                    local offset = Vector3.new(math.random(-baRange, baRange), 0, math.random(-baRange, baRange))
                    plr.Character.HumanoidRootPart.CFrame = CFrame.new(myPos + offset)
                end
            end
            notify("Arc Yield", "Brought all players!")
        end)
    end)
end)

-- ======================== 39. TP ALL ========================
addcmd("arctpall", {"atpall"}, function(args, speaker)
    if not ArcGUI.TogglePanel("tpall") then return end
    local p = ArcGUI.CreatePanel("tpall", "TP All Players", function() end)
    local taRange = 5
    local slider = ArcGUI.CreateSlider(p, "Offset Range", 1, 50, 5, function(val)
        taRange = val
    end)
    local btn = ArcGUI.CreateButton(p, "TP All!", function()
        pcall(function()
            local char = Players.LocalPlayer.Character
            if not char then return end
            local myPos = char:FindFirstChild("HumanoidRootPart") and char.HumanoidRootPart.Position
            if not myPos then return end
            for _, plr in pairs(Players:GetPlayers()) do
                if plr ~= Players.LocalPlayer and plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") then
                    local offset = Vector3.new(math.random(-taRange, taRange), 0, math.random(-taRange, taRange))
                    plr.Character.HumanoidRootPart.CFrame = CFrame.new(myPos + offset)
                end
            end
            notify("Arc Yield", "Teleported all players!")
        end)
    end)
end)

-- ======================== 40. CRASH PLAYER ========================
addcmd("arccrash", {"acrash"}, function(args, speaker)
    if not ArcGUI.TogglePanel("crashplayer") then return end
    local p = ArcGUI.CreatePanel("crashplayer", "Crash Player", function() end)
    local nameInput = ArcGUI.CreateTextBox(p, "Player Name", "Enter player name", "")
    local btn = ArcGUI.CreateButton(p, "CRASH", function()
        local plrName = nameInput:GetText()
        if plrName and plrName ~= "" then
            execCmd("crashplayer " .. plrName)
        else
            notify("Arc Yield", "Enter a player name first!")
        end
    end)
    btn.Button.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
end)

-- ======================== 41. SPIN2 ========================
addcmd("arcspin2", {"aspin2"}, function(args, speaker)
    if not ArcGUI.TogglePanel("spin2") then return end
    local p = ArcGUI.CreatePanel("spin2", "Spin 2", function()
        if spin2BAV then
            spin2BAV:Destroy()
            spin2BAV = nil
        end
    end)
    p._sp2On = false
    local sp2Speed = 50
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._sp2On = state
        if state then
            pcall(function()
                local char = Players.LocalPlayer.Character
                if char and char:FindFirstChild("HumanoidRootPart") then
                    spin2BAV = Instance.new("BodyAngularVelocity")
                    spin2BAV.Name = randomString()
                    spin2BAV.AngularVelocity = Vector3.new(0, sp2Speed, 0)
                    spin2BAV.MaxTorque = Vector3.new(0, math.huge, 0)
                    spin2BAV.Parent = char.HumanoidRootPart
                end
            end)
        else
            pcall(function()
                if spin2BAV then
                    spin2BAV:Destroy()
                    spin2BAV = nil
                end
            end)
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Speed", 5, 200, 50, function(val)
        sp2Speed = val
        if spin2BAV then
            spin2BAV.AngularVelocity = Vector3.new(0, val, 0)
        end
    end)
end)

-- ======================== 42. SEIZURE ========================
addcmd("arcseizure", {"aseizure"}, function(args, speaker)
    if not ArcGUI.TogglePanel("seizure") then return end
    local p = ArcGUI.CreatePanel("seizure", "Seizure", function()
        if seizureConn then
            seizureConn:Disconnect()
            seizureConn = nil
        end
        if seizureParts then
            for _, v in pairs(seizureParts) do
                if v and v.Parent then v:Destroy() end
            end
            seizureParts = {}
        end
    end)
    p._szOn = false
    local szIntensity = 5
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._szOn = state
        if state then
            if seizureConn then seizureConn:Disconnect() end
            seizureConn = RunService.RenderStepped:Connect(function()
                pcall(function()
                    local char = Players.LocalPlayer.Character
                    if not char then return end
                    for _, part in pairs(char:GetDescendants()) do
                        if part:IsA("BasePart") then
                            part.CFrame = part.CFrame * CFrame.Angles(
                                math.rad(math.random(-szIntensity, szIntensity)),
                                math.rad(math.random(-szIntensity, szIntensity)),
                                math.rad(math.random(-szIntensity, szIntensity))
                            )
                        end
                    end
                end)
            end)
        else
            if seizureConn then seizureConn:Disconnect() seizureConn = nil end
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Intensity", 1, 10, 5, function(val)
        szIntensity = val
    end)
end)

-- ======================== 43. FIRE ========================
addcmd("arcfire", {"afire"}, function(args, speaker)
    if not ArcGUI.TogglePanel("fire") then return end
    local p = ArcGUI.CreatePanel("fire", "Fire Effect", function()
        if fireObj then
            fireObj:Destroy()
            fireObj = nil
        end
    end)
    p._feOn = false
    local feColor = Color3.fromRGB(255, 100, 0)
    local feSize = 8
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._feOn = state
        if state then
            pcall(function()
                local char = Players.LocalPlayer.Character
                if char and char:FindFirstChild("HumanoidRootPart") then
                    if fireObj then fireObj:Destroy() end
                    fireObj = Instance.new("Fire")
                    fireObj.Name = randomString()
                    fireObj.Color = feColor
                    fireObj.Size = feSize
                    fireObj.Parent = char.HumanoidRootPart
                end
            end)
        else
            pcall(function()
                if fireObj then fireObj:Destroy() fireObj = nil end
            end)
        end
    end)
    local colorBox = ArcGUI.CreateTextBox(p, "Color (Hex)", "#ff6400", "#ff6400")
    local slider = ArcGUI.CreateSlider(p, "Size", 1, 20, 8, function(val)
        feSize = val
        if fireObj then fireObj.Size = val end
    end)
end)

-- ======================== 44. SPARKLES ========================
addcmd("arcsparkles", {"asparkles"}, function(args, speaker)
    if not ArcGUI.TogglePanel("sparkles") then return end
    local p = ArcGUI.CreatePanel("sparkles", "Sparkles", function()
        if sparklesObj then
            sparklesObj:Destroy()
            sparklesObj = nil
        end
    end)
    p._spkOn = false
    local spkColor = Color3.fromRGB(255, 255, 0)
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._spkOn = state
        if state then
            pcall(function()
                local char = Players.LocalPlayer.Character
                if char and char:FindFirstChild("HumanoidRootPart") then
                    if sparklesObj then sparklesObj:Destroy() end
                    sparklesObj = Instance.new("Sparkles")
                    sparklesObj.Name = randomString()
                    sparklesObj.SparkleColor = spkColor
                    sparklesObj.Parent = char.HumanoidRootPart
                end
            end)
        else
            pcall(function()
                if sparklesObj then sparklesObj:Destroy() sparklesObj = nil end
            end)
        end
    end)
    local colorBox = ArcGUI.CreateTextBox(p, "Color (Hex)", "#ffff00", "#ffff00")
end)

-- ======================== 45. SMOKE ========================
addcmd("arcsmoke", {"asmoke"}, function(args, speaker)
    if not ArcGUI.TogglePanel("smoke") then return end
    local p = ArcGUI.CreatePanel("smoke", "Smoke Effect", function()
        if smokeObj then
            smokeObj:Destroy()
            smokeObj = nil
        end
    end)
    p._smOn = false
    local smOpacity = 0.5
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._smOn = state
        if state then
            pcall(function()
                local char = Players.LocalPlayer.Character
                if char and char:FindFirstChild("HumanoidRootPart") then
                    if smokeObj then smokeObj:Destroy() end
                    smokeObj = Instance.new("Smoke")
                    smokeObj.Name = randomString()
                    smokeObj.Opacity = smOpacity
                    smokeObj.Parent = char.HumanoidRootPart
                end
            end)
        else
            pcall(function()
                if smokeObj then smokeObj:Destroy() smokeObj = nil end
            end)
        end
    end)
    local colorBox = ArcGUI.CreateTextBox(p, "Color (Hex)", "#808080", "#808080")
    local slider = ArcGUI.CreateSlider(p, "Opacity", 0, 1, 0.5, function(val)
        smOpacity = val
        if smokeObj then smokeObj.Opacity = val end
    end)
end)

-- ======================== 46. TINY ========================
addcmd("arctiny", {"atinyscale"}, function(args, speaker)
    if not ArcGUI.TogglePanel("tiny") then return end
    local p = ArcGUI.CreatePanel("tiny", "Tiny", function()
        tinyActive = false
        if tinyScales then
            for _, bp in pairs(tinyScales) do
                if bp and bp.Parent then bp:Destroy() end
            end
            tinyScales = {}
        end
    end)
    p._tyOn = false
    local tyScale = 0.1
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._tyOn = state
        if state then
            tinyActive = true
            pcall(function()
                local char = Players.LocalPlayer.Character
                if not char then return end
                local humDesc = char:FindFirstChildOfClass("Humanoid")
                if humDesc then
                    for _, v in pairs(tinyScales) do
                        if v and v.Parent then v:Destroy() end
                    end
                    tinyScales = {}
                    local scaleVal = tyScale
                    local heads = {char:FindFirstChild("Head"), char:FindFirstChild("UpperTorso"), char:FindFirstChild("LowerTorso")}
                    for _, part in pairs(char:GetDescendants()) do
                        if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then
                            local s = Instance.new("Vector3Value")
                            s.Name = randomString()
                            s.Value = part.Size
                            s.Parent = part
                            table.insert(tinyScales, s)
                            part.Size = part.Size * scaleVal
                        end
                    end
                end
            end)
        else
            tinyActive = false
            pcall(function()
                local char = Players.LocalPlayer.Character
                if char and tinyScales then
                    for _, s in pairs(tinyScales) do
                        if s and s.Parent then
                            s.Parent.Size = s.Value
                            s:Destroy()
                        end
                    end
                    tinyScales = {}
                end
            end)
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Scale", 0.05, 0.5, 0.1, function(val)
        tyScale = val
    end)
end)

-- ======================== 47. GRAVITY ========================
addcmd("arcgravity", {"agravity"}, function(args, speaker)
    if not ArcGUI.TogglePanel("gravity") then return end
    local p = ArcGUI.CreatePanel("gravity", "Gravity", function()
        workspace.Gravity = 196.2
    end)
    local gravVal = 196.2
    local slider = ArcGUI.CreateSlider(p, "Gravity", 0, 1000, 196.2, function(val)
        gravVal = val
    end)
    local setBtn = ArcGUI.CreateButton(p, "Set Gravity", function()
        workspace.Gravity = gravVal
        notify("Arc Yield", "Gravity set to " .. tostring(math.floor(gravVal * 100) / 100))
    end)
    local resetBtn = ArcGUI.CreateButton(p, "Reset (196.2)", function()
        workspace.Gravity = 196.2
        notify("Arc Yield", "Gravity reset to 196.2")
    end)
    resetBtn.Button.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
end)

-- ======================== 48. MUSIC ========================
addcmd("arcmusic", {"amusic"}, function(args, speaker)
    if not ArcGUI.TogglePanel("music") then return end
    local p = ArcGUI.CreatePanel("music", "Music Player", function()
        if musicSound then
            musicSound:Stop()
            musicSound:Destroy()
            musicSound = nil
        end
    end)
    local idInput = ArcGUI.CreateTextBox(p, "Asset ID", "Enter Roblox asset ID", "")
    local musicVol = 1
    local slider = ArcGUI.CreateSlider(p, "Volume", 0, 3, 1, function(val)
        musicVol = val
        if musicSound then musicSound.Volume = val end
    end)
    local playBtn = ArcGUI.CreateButton(p, "Play", function()
        local assetId = idInput:GetText()
        if assetId and assetId ~= "" then
            if musicSound then
                musicSound:Stop()
                musicSound:Destroy()
            end
            musicSound = Instance.new("Sound")
            musicSound.Name = randomString()
            musicSound.SoundId = "rbxassetid://" .. assetId
            musicSound.Volume = musicVol
            musicSound.Looped = true
            musicSound.Parent = workspace
            musicSound:Play()
            notify("Arc Yield", "Playing music: " .. assetId)
        else
            notify("Arc Yield", "Enter an asset ID first!")
        end
    end)
    local stopBtn = ArcGUI.CreateButton(p, "Stop", function()
        if musicSound then
            musicSound:Stop()
            musicSound:Destroy()
            musicSound = nil
            notify("Arc Yield", "Music stopped")
        end
    end)
    stopBtn.Button.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
end)

-- ======================== 49. NPP ========================
addcmd("arcnpp", {"anpp"}, function(args, speaker)
    if not ArcGUI.TogglePanel("npp") then return end
    local p = ArcGUI.CreatePanel("npp", "Nuke Parts (NPP)", function()
        nppActive = false
        if nppParts then
            for _, part in pairs(nppParts) do
                if part and part.Parent then part:Destroy() end
            end
            nppParts = {}
        end
    end)
    p._nppOn = false
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._nppOn = state
        if state then
            nppActive = true
            execCmd("npp")
        else
            nppActive = false
        end
    end)
end)

-- ======================== 50. GIANT ========================
addcmd("arcgiant", {"agiant"}, function(args, speaker)
    if not ArcGUI.TogglePanel("giant") then return end
    local p = ArcGUI.CreatePanel("giant", "Giant", function()
        giantActive = false
        if giantScales then
            for _, bp in pairs(giantScales) do
                if bp and bp.Parent then bp:Destroy() end
            end
            giantScales = {}
        end
    end)
    p._giOn = false
    local giScale = 5
    local toggle = ArcGUI.CreateToggle(p, "Enabled", false, function(state)
        p._giOn = state
        if state then
            giantActive = true
            pcall(function()
                local char = Players.LocalPlayer.Character
                if not char then return end
                for _, v in pairs(giantScales) do
                    if v and v.Parent then v:Destroy() end
                end
                giantScales = {}
                local scaleVal = giScale
                for _, part in pairs(char:GetDescendants()) do
                    if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then
                        local s = Instance.new("Vector3Value")
                        s.Name = randomString()
                        s.Value = part.Size
                        s.Parent = part
                        table.insert(giantScales, s)
                        part.Size = part.Size * scaleVal
                    end
                end
            end)
        else
            giantActive = false
            pcall(function()
                local char = Players.LocalPlayer.Character
                if char and giantScales then
                    for _, s in pairs(giantScales) do
                        if s and s.Parent then
                            s.Parent.Size = s.Value
                            s:Destroy()
                        end
                    end
                    giantScales = {}
                end
            end)
        end
    end)
    local slider = ArcGUI.CreateSlider(p, "Scale", 2, 20, 5, function(val)
        giScale = val
    end)
end)

-- ======================== STARTUP SPLASH SCREEN ========================
spawn(function()
    if not PARENT then return end
    pcall(function()
        local TweenService = game:GetService('TweenService')
        local RunService = game:GetService('RunService')
        local overlay = Instance.new('Frame')
        overlay.Name = 'ArcSplashOverlay'
        overlay.Size = UDim2.new(1, 0, 1, 0)
        overlay.BackgroundColor3 = Color3.fromRGB(5, 12, 30)
        overlay.BorderSizePixel = 0
        overlay.ZIndex = 999
        overlay.Parent = PARENT

        local corner = Instance.new('UICorner')
        corner.CornerRadius = UDim.new(0, 0)
        corner.Parent = overlay

        -- Glow ring
        local glowRing = Instance.new('Frame')
        glowRing.Size = UDim2.new(0, 200, 0, 200)
        glowRing.Position = UDim2.new(0.5, -100, 0.45, -100)
        glowRing.BackgroundColor3 = Color3.fromRGB(50, 130, 255)
        glowRing.BackgroundTransparency = 0.85
        glowRing.BorderSizePixel = 0
        glowRing.ZIndex = 1000
        glowRing.Parent = overlay
        local grC = Instance.new('UICorner')
        grC.CornerRadius = UDim.new(1, 0)
        grC.Parent = glowRing
        local grS = Instance.new('UIStroke')
        grS.Color = Color3.fromRGB(50, 130, 255)
        grS.Thickness = 2
        grS.Transparency = 0.5
        grS.Parent = glowRing

        -- Floating orbs
        local orbs = {}
        for i = 1, 6 do
            local orb = Instance.new('Frame')
            orb.Size = UDim2.new(0, 80 + i * 30, 0, 80 + i * 30)
            orb.Position = UDim2.new(0.5, -60, 0.45, -60)
            orb.BackgroundColor3 = Color3.fromRGB(50, 130, 255)
            orb.BackgroundTransparency = 0.85
            orb.BorderSizePixel = 0
            orb.ZIndex = 999
            orb.Parent = overlay
            local oc = Instance.new('UICorner')
            oc.CornerRadius = UDim.new(1, 0)
            oc.Parent = orb
            table.insert(orbs, {frame = orb, phase = i * 0.5, speed = 0.8 + i * 0.3, radius = 60 + i * 40})
        end

        local t = 0
        local conn = RunService.Heartbeat:Connect(function(dt)
            if not overlay or not overlay.Parent then return end
            t = t + dt
            for _, o in ipairs(orbs) do
                local a = t * o.speed + o.phase
                local x = math.sin(a) * o.radius
                local y = math.cos(a * 0.7) * (o.radius * 0.6)
                o.frame.Position = UDim2.new(0.5, x - o.frame.Size.X.Offset / 2, 0.45, y - o.frame.Size.Y.Offset / 2)
                o.frame.Rotation = t * o.speed * 20
            end
            local pulse = 1 + math.sin(t * 2) * 0.08
            local rsz = 250 * pulse
            glowRing.Size = UDim2.new(0, rsz, 0, rsz)
            glowRing.Position = UDim2.new(0.5, -rsz / 2, 0.45, -rsz / 2)
        end)

        -- Main label
        local mainLabel = Instance.new('TextLabel')
        mainLabel.Size = UDim2.new(0, 600, 0, 80)
        mainLabel.Position = UDim2.new(0.5, -300, 0.45, -40)
        mainLabel.BackgroundTransparency = 1
        mainLabel.Text = ''
        mainLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
        mainLabel.Font = Enum.Font.GothamBold
        mainLabel.TextSize = 38
        mainLabel.TextTransparency = 1
        mainLabel.TextStrokeTransparency = 0.6
        mainLabel.TextStrokeColor3 = Color3.fromRGB(50, 130, 255)
        mainLabel.ZIndex = 1001
        mainLabel.Parent = overlay

        -- Sub label
        local subLabel = Instance.new('TextLabel')
        subLabel.Size = UDim2.new(0, 600, 0, 30)
        subLabel.Position = UDim2.new(0.5, -300, 0.45, 30)
        subLabel.BackgroundTransparency = 1
        subLabel.Text = ''
        subLabel.TextColor3 = Color3.fromRGB(160, 185, 220)
        subLabel.Font = Enum.Font.Gotham
        subLabel.TextSize = 16
        subLabel.TextTransparency = 1
        subLabel.ZIndex = 1001
        subLabel.Parent = overlay

        -- Credits
        local creditsLabel = Instance.new('TextLabel')
        creditsLabel.Size = UDim2.new(0, 700, 0, 25)
        creditsLabel.Position = UDim2.new(0.5, -350, 0.45, 100)
        creditsLabel.BackgroundTransparency = 1
        creditsLabel.Text = 'check bobjs for scriptblox, and bobjsco for github - for updates and more scripts'
        creditsLabel.TextColor3 = Color3.fromRGB(80, 150, 255)
        creditsLabel.Font = Enum.Font.GothamMedium
        creditsLabel.TextSize = 13
        creditsLabel.TextTransparency = 1
        creditsLabel.ZIndex = 1001
        creditsLabel.Parent = overlay

        wait(0.3)

        -- Phase 1: Made by @Hamster_Gamer14
        mainLabel.Text = 'Made by @Hamster_Gamer14'
        local tw1 = TweenService:Create(mainLabel, TweenInfo.new(0.8, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {TextTransparency = 0})
        tw1:Play()
        local tw1b = TweenService:Create(subLabel, TweenInfo.new(0.6, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {TextTransparency = 0.3})
        tw1b:Play()

        wait(0.5)

        subLabel.Text = 'Premium experience of hacking, all for free!'
        local tw1c = TweenService:Create(subLabel, TweenInfo.new(0.5, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {TextTransparency = 0.3})
        tw1c:Play()

        -- Credits slide in
        local tw1d = TweenService:Create(creditsLabel, TweenInfo.new(0.8, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {TextTransparency = 0.15})
        tw1d:Play()

        wait(3.0)

        -- Phase 2: Arc Yield
        TweenService:Create(mainLabel, TweenInfo.new(0.4, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {TextTransparency = 1}):Play()
        TweenService:Create(subLabel, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {TextTransparency = 1}):Play()
        TweenService:Create(creditsLabel, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {TextTransparency = 1}):Play()

        wait(0.5)

        mainLabel.Size = UDim2.new(0, 600, 0, 100)
        mainLabel.TextSize = 52
        mainLabel.Text = 'Arc Yield'
        mainLabel.TextTransparency = 1

        glowRing.BackgroundTransparency = 0.7
        TweenService:Create(glowRing, TweenInfo.new(0.5, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {BackgroundTransparency = 0.7}):Play()

        local tw2 = TweenService:Create(mainLabel, TweenInfo.new(0.7, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {TextTransparency = 0})
        tw2:Play()

        subLabel.Text = 'Made by @Hamster_Gamer14'
        subLabel.Position = UDim2.new(0.5, -300, 0.45, 55)
        subLabel.TextSize = 15
        local tw2b = TweenService:Create(subLabel, TweenInfo.new(0.5, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {TextTransparency = 0.35})
        tw2b:Play()

        -- Credits back
        creditsLabel.TextTransparency = 1
        local tw2c = TweenService:Create(creditsLabel, TweenInfo.new(0.5, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {TextTransparency = 0.15})
        tw2c:Play()

        wait(2.0)

        -- Phase 3: Fade out
        TweenService:Create(mainLabel, TweenInfo.new(0.4, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {TextTransparency = 1}):Play()
        TweenService:Create(subLabel, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {TextTransparency = 1}):Play()
        TweenService:Create(creditsLabel, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {TextTransparency = 1}):Play()
        TweenService:Create(glowRing, TweenInfo.new(0.5, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {BackgroundTransparency = 1}):Play()
        for _, o in ipairs(orbs) do
            TweenService:Create(o.frame, TweenInfo.new(0.4), {BackgroundTransparency = 1}):Play()
        end
        TweenService:Create(overlay, TweenInfo.new(0.5, Enum.EasingStyle.Quart, Enum.EasingDirection.In), {BackgroundTransparency = 1}):Play()

        wait(0.6)

        if conn then conn:Disconnect() end
        pcall(function() overlay:Destroy() end)
    end)
end)

-- ======================== TAS (TOOL-ASSISTED SPEEDRUN) ========================
-- Frame-by-frame movement recorder with savestates, rewind, and playback
-- F = forward 1 frame, R = rewind 1 frame, CapsLock = pause/unpause
-- GUI with timer, frame count, savestates, Start Play, Stop Recording, Save, Load

tasActive = false
tasPaused = true
tasGUI = nil
tasConnections = {}
tasSavestates = {}
tasPlayerInfo = {}
tasTimeStart = 0
tasTimePaused = 0
tasTimePauseHolder = 0
tasViewingTAS = false

do
local function tasFormatTime(tv)
        local m = math.floor(tv / 60)
        local s = math.floor(tv % 60)
        local ms = math.floor((tv * 1000) % 1000)
        local msStr = tostring(ms)
        local sStr = tostring(s)
        while #msStr < 3 do msStr = '0' .. msStr end
        while #sStr < 2 do sStr = '0' .. sStr end
        return m .. ':' .. sStr .. '.' .. msStr
end

local function tasGetCFrame()
        if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                return LocalPlayer.Character.HumanoidRootPart.CFrame
        end
        return CFrame.new()
end

local function tasGetVelocity()
        if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                return LocalPlayer.Character.HumanoidRootPart.Velocity
        end
        return Vector3.new()
end

local function tasGetCameraCFrame()
        return workspace.CurrentCamera.CFrame
end

local function tasCaptureFrame()
        return {
                CFrame = tasGetCFrame(),
                CameraCFrame = tasGetCameraCFrame(),
                Velocity = tasGetVelocity(),
                Time = tick() - tasTimeStart - tasTimePaused,
        }
end

local function tasSetState(infoState)
        if not LocalPlayer.Character or not LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then return end
        local RootPart = LocalPlayer.Character.HumanoidRootPart
        pcall(function()
                RootPart.CFrame = infoState.CFrame
                RootPart.Velocity = infoState.Velocity
                workspace.CurrentCamera.CFrame = infoState.CameraCFrame
        end)
end

local function tasUpdateGUI()
        if not tasGUI then return end
        local frameCountLbl = tasGUI:FindFirstChild("MainFrame"):FindFirstChild("FrameCount")
        local saveCountLbl = tasGUI:FindFirstChild("MainFrame"):FindFirstChild("SaveCount")
        local timeLbl = tasGUI:FindFirstChild("MainFrame"):FindFirstChild("TimeLabel")
        local pauseLbl = tasGUI:FindFirstChild("MainFrame"):FindFirstChild("PauseLabel")
        if frameCountLbl then
                frameCountLbl.Text = "Frames: " .. #tasPlayerInfo
        end
        if saveCountLbl then
                saveCountLbl.Text = "Savestates: " .. #tasSavestates
        end
        if timeLbl then
                local elapsed = tick() - tasTimeStart - tasTimePaused
                timeLbl.Text = tasFormatTime(elapsed)
        end
        if pauseLbl then
                if tasPaused then
                        pauseLbl.Text = "PAUSED"
                        pauseLbl.TextColor3 = Color3.fromRGB(255, 255, 0)
                        timeLbl.TextColor3 = Color3.fromRGB(255, 255, 0)
                else
                        pauseLbl.Text = "RECORDING"
                        pauseLbl.TextColor3 = Color3.fromRGB(0, 255, 100)
                        timeLbl.TextColor3 = Color3.fromRGB(255, 255, 255)
                end
        end
end

local function tasPauseToggle()
        tasPaused = not tasPaused
        if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                LocalPlayer.Character.HumanoidRootPart.Anchored = tasPaused
        end
        if tasPaused then
                tasTimePauseHolder = tick()
        else
                if tasTimePauseHolder then
                        tasTimePaused = tasTimePaused + (tick() - tasTimePauseHolder)
                        tasTimePauseHolder = nil
                end
        end
        tasUpdateGUI()
end

local function tasGoFrameForward()
        if tasPaused then
                tasPauseToggle()
                RunService.Heartbeat:Wait()
                RunService.Heartbeat:Wait()
                tasPauseToggle()
        end
end

local function tasGoFrameBack()
        local TargetFrame = nil
        if #tasPlayerInfo > 1 then
                TargetFrame = tasPlayerInfo[#tasPlayerInfo - 1]
                tasPlayerInfo[#tasPlayerInfo] = nil
        elseif #tasSavestates > 0 and #tasSavestates[#tasSavestates] > 1 then
                TargetFrame = tasSavestates[#tasSavestates][#tasSavestates[#tasSavestates] - 1]
                tasSavestates[#tasSavestates][#tasSavestates[#tasSavestates]] = nil
        end
        if TargetFrame then
                if not tasPaused then tasPauseToggle() end
                tasTimePauseHolder = tick()
                tasTimeStart = tick() - TargetFrame.Time
                tasTimePaused = 0
                tasSetState(TargetFrame)
                tasUpdateGUI()
        end
end

local function tasAddSavestate()
        table.insert(tasSavestates, tasPlayerInfo)
        tasPlayerInfo = {}
        notify('TAS', 'Savestate added (#' .. #tasSavestates .. ')')
        tasUpdateGUI()
end

local function tasLoadSavestate()
        if #tasSavestates > 0 and #tasSavestates[#tasSavestates] > 0 then
                local lastFrame = tasSavestates[#tasSavestates][#tasSavestates[#tasSavestates]]
                tasPlayerInfo = {}
                tasPaused = true
                tasTimePauseHolder = tick()
                tasTimeStart = tick() - lastFrame.Time
                tasTimePaused = 0
                if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                        LocalPlayer.Character.HumanoidRootPart.Anchored = true
                end
                tasSetState(lastFrame)
                tasUpdateGUI()
                notify('TAS', 'Loaded savestate #' .. #tasSavestates)
        end
end

local function tasRemoveSavestate()
        if #tasSavestates > 0 then
                table.remove(tasSavestates)
                notify('TAS', 'Removed savestate. ' .. #tasSavestates .. ' remaining')
                tasUpdateGUI()
        end
end

local function tasPrepareData()
        local FullTAS = {}
        for i = 1, #tasSavestates do
                for j = 1, #tasSavestates[i] do
                        local Frame = tasSavestates[i][j]
                        local cfX, cfY, cfZ, cfR00, cfR01, cfR02, cfR10, cfR11, cfR12, cfR20, cfR21, cfR22 = Frame.CFrame:GetComponents()
                        local camX, camY, camZ, camR00, camR01, camR02, camR10, camR11, camR12, camR20, camR21, camR22 = Frame.CameraCFrame:GetComponents()
                        table.insert(FullTAS, {
                                CCFrame = {cfX, cfY, cfZ, cfR00, cfR01, cfR02, cfR10, cfR11, cfR12, cfR20, cfR21, cfR22},
                                CCameraCFrame = {camX, camY, camZ, camR00, camR01, camR02, camR10, camR11, camR12, camR20, camR21, camR22},
                                VVelocity = {Frame.Velocity.X, Frame.Velocity.Y, Frame.Velocity.Z},
                                time = Frame.Time,
                        })
                end
        end
        return FullTAS
end

local function tasSaveRun()
        local FullTAS = tasPrepareData()
        if #FullTAS == 0 then
                notify('TAS', 'No data to save')
                return
        end
        local GameName = "TAS"
        pcall(function()
                GameName = game:GetService("MarketplaceService"):GetProductInfo(game.PlaceId).Name
                GameName = GameName:gsub("[^%w%s]", ""):gsub("%s+", "_")
        end)
        local FileName = GameName .. "_TAS.json"
        local FilePath = "TAS_Recorder/" .. FileName
        local EncodedData = HttpService:JSONEncode(FullTAS)
        if writefile then
                pcall(function()
                        if isfolder and not isfolder("TAS_Recorder") then
                                makefolder("TAS_Recorder")
                        end
                        writefile(FilePath, EncodedData)
                        notify('TAS', 'Saved to ' .. FilePath)
                end)
        else
                notify('TAS', 'File saving not supported')
        end
end

local function tasViewPlayback(TAS)
        if tasViewingTAS or #TAS == 0 then return end
        tasViewingTAS = true
        notify('TAS', 'Playing back TAS...')

        local Character = LocalPlayer.Character
        if not Character or not Character:FindFirstChild("HumanoidRootPart") then
                notify('TAS', 'Character not found')
                tasViewingTAS = false
                return
        end
        local RootPart = Character.HumanoidRootPart
        RootPart.Anchored = false

        local StartTime = tick()
        local CurrentFrameIndex = 1

        if tasPaused then tasPauseToggle() end

        local PlaybackConn = RunService.Heartbeat:Connect(function()
                local Elapsed = tick() - StartTime
                local TargetFrame = nil
                while CurrentFrameIndex <= #TAS and TAS[CurrentFrameIndex].time <= Elapsed do
                        TargetFrame = TAS[CurrentFrameIndex]
                        CurrentFrameIndex = CurrentFrameIndex + 1
                end
                if TargetFrame then
                        local cf = TargetFrame.CCFrame
                        local cam = TargetFrame.CCameraCFrame
                        pcall(function()
                                RootPart.CFrame = CFrame.new(cf[1], cf[2], cf[3], cf[4], cf[5], cf[6], cf[7], cf[8], cf[9], cf[10], cf[11], cf[12])
                                RootPart.Velocity = Vector3.new(TargetFrame.VVelocity[1], TargetFrame.VVelocity[2], TargetFrame.VVelocity[3])
                                workspace.CurrentCamera.CFrame = CFrame.new(cam[1], cam[2], cam[3], cam[4], cam[5], cam[6], cam[7], cam[8], cam[9], cam[10], cam[11], cam[12])
                        end)
                end
                if CurrentFrameIndex > #TAS then
                        PlaybackConn:Disconnect()
                        RootPart.Anchored = false
                        tasViewingTAS = false
                        tasPaused = true
                        tasTimePauseHolder = tick()
                        tasUpdateGUI()
                        notify('TAS', 'Playback finished')
                end
        end)
        table.insert(tasConnections, PlaybackConn)
end

local function tasBuildGUI()
        if tasGUI then pcall(function() tasGUI:Destroy() end) end

        tasGUI = Instance.new("ScreenGui")
        tasGUI.Name = "TASRecorderGUI"
        tasGUI.ResetOnSpawn = false
        pcall(function() tasGUI.Parent = game:GetService("CoreGui") end)

        local MainFrame = Instance.new("Frame")
        MainFrame.Name = "MainFrame"
        MainFrame.Parent = tasGUI
        MainFrame.Size = UDim2.new(0, 260, 0, 220)
        MainFrame.Position = UDim2.new(0, 10, 0.5, -110)
        MainFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 25)
        MainFrame.BackgroundTransparency = 0.1
        MainFrame.BorderColor3 = Color3.fromRGB(200, 50, 50)
        MainFrame.BorderSizePixel = 2
        MainFrame.Active = true
        MainFrame.Draggable = true

        local Title = Instance.new("TextLabel")
        Title.Name = "Title"
        Title.Parent = MainFrame
        Title.Size = UDim2.new(1, 0, 0, 25)
        Title.BackgroundColor3 = Color3.fromRGB(200, 40, 40)
        Title.BorderSizePixel = 0
        Title.Text = "TAS RECORDER"
        Title.TextColor3 = Color3.new(1, 1, 1)
        Title.Font = Enum.Font.SourceSansBold
        Title.TextSize = 16

        local PauseLabel = Instance.new("TextLabel")
        PauseLabel.Name = "PauseLabel"
        PauseLabel.Parent = MainFrame
        PauseLabel.Size = UDim2.new(1, -10, 0, 18)
        PauseLabel.Position = UDim2.new(0, 5, 0, 28)
        PauseLabel.BackgroundTransparency = 1
        PauseLabel.Text = "PAUSED"
        PauseLabel.TextColor3 = Color3.fromRGB(255, 255, 0)
        PauseLabel.Font = Enum.Font.SourceSansBold
        PauseLabel.TextSize = 14
        PauseLabel.TextXAlignment = Enum.TextXAlignment.Left

        local TimeLabel = Instance.new("TextLabel")
        TimeLabel.Name = "TimeLabel"
        TimeLabel.Parent = MainFrame
        TimeLabel.Size = UDim2.new(1, -10, 0, 22)
        TimeLabel.Position = UDim2.new(0, 5, 0, 46)
        TimeLabel.BackgroundTransparency = 1
        TimeLabel.Text = "0:00.000"
        TimeLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
        TimeLabel.Font = Enum.Font.Code
        TimeLabel.TextSize = 18
        TimeLabel.TextXAlignment = Enum.TextXAlignment.Left

        local FrameCount = Instance.new("TextLabel")
        FrameCount.Name = "FrameCount"
        FrameCount.Parent = MainFrame
        FrameCount.Size = UDim2.new(1, -10, 0, 15)
        FrameCount.Position = UDim2.new(0, 5, 0, 70)
        FrameCount.BackgroundTransparency = 1
        FrameCount.Text = "Frames: 0"
        FrameCount.TextColor3 = Color3.fromRGB(200, 200, 200)
        FrameCount.Font = Enum.Font.SourceSans
        FrameCount.TextSize = 13
        FrameCount.TextXAlignment = Enum.TextXAlignment.Left

        local SaveCount = Instance.new("TextLabel")
        SaveCount.Name = "SaveCount"
        SaveCount.Parent = MainFrame
        SaveCount.Size = UDim2.new(1, -10, 0, 15)
        SaveCount.Position = UDim2.new(0, 5, 0, 85)
        SaveCount.BackgroundTransparency = 1
        SaveCount.Text = "Savestates: 0"
        SaveCount.TextColor3 = Color3.fromRGB(200, 200, 200)
        SaveCount.Font = Enum.Font.SourceSans
        SaveCount.TextSize = 13
        SaveCount.TextXAlignment = Enum.TextXAlignment.Left

        -- Buttons
        local btnY = 105
        local btnH = 20
        local btnGap = 3

        local function makeButton(name, text, yPos)
                local btn = Instance.new("TextButton")
                btn.Name = name
                btn.Parent = MainFrame
                btn.Size = UDim2.new(0.48, -5, 0, btnH)
                btn.Position = UDim2.new(0, 5, 0, yPos)
                btn.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
                btn.BorderSizePixel = 0
                btn.Text = text
                btn.TextColor3 = Color3.new(1, 1, 1)
                btn.Font = Enum.Font.SourceSansBold
                btn.TextSize = 12
                return btn
        end

        local function makeButtonRight(name, text, yPos)
                local btn = makeButton(name, text, yPos)
                btn.Position = UDim2.new(0.52, 0, 0, yPos)
                return btn
        end

        -- Row 1: Start Play / Stop Recording
        local btnPlay = makeButton("PlayBtn", "Start Play", btnY)
        local btnStop = makeButtonRight("StopBtn", "Stop Rec", btnY)
        -- Row 2: Save State / Load State
        local btnSave = makeButton("SaveBtn", "Save State", btnY + btnH + btnGap)
        local btnLoad = makeButtonRight("LoadBtn", "Load State", btnY + btnH + btnGap)
        -- Row 3: Remove State / Save File
        local btnRemove = makeButton("RemoveBtn", "Remove State", btnY + (btnH + btnGap) * 2)
        local btnFile = makeButtonRight("FileBtn", "Save File", btnY + (btnH + btnGap) * 2)
        -- Row 4: Playback / View TAS
        local btnPlayback = makeButton("PlaybackBtn", "View TAS", btnY + (btnH + btnGap) * 3)
        local btnRewind = makeButtonRight("RewindBtn", "Full Rewind", btnY + (btnH + btnGap) * 3)

        -- Keybind info
        local InfoLabel = Instance.new("TextLabel")
        InfoLabel.Name = "InfoLabel"
        InfoLabel.Parent = MainFrame
        InfoLabel.Size = UDim2.new(1, -10, 0, 14)
        InfoLabel.Position = UDim2.new(0, 5, 0.92, 0)
        InfoLabel.BackgroundTransparency = 1
        InfoLabel.Text = "F=Forward  R=Rewind  CapsLock=Pause  1=Save  2=Load  3=Remove"
        InfoLabel.TextColor3 = Color3.fromRGB(140, 140, 140)
        InfoLabel.Font = Enum.Font.SourceSans
        InfoLabel.TextSize = 10
        InfoLabel.TextWrapped = true
        InfoLabel.TextXAlignment = Enum.TextXAlignment.Left

        -- Button handlers
        btnPlay.MouseButton1Click:Connect(function()
                if tasPaused then tasPauseToggle() end
        end)
        btnStop.MouseButton1Click:Connect(function()
                if not tasPaused then tasPauseToggle() end
        end)
        btnSave.MouseButton1Click:Connect(function()
                tasAddSavestate()
        end)
        btnLoad.MouseButton1Click:Connect(function()
                tasLoadSavestate()
        end)
        btnRemove.MouseButton1Click:Connect(function()
                tasRemoveSavestate()
        end)
        btnFile.MouseButton1Click:Connect(function()
                tasSaveRun()
        end)
        btnPlayback.MouseButton1Click:Connect(function()
                local data = tasPrepareData()
                if #data > 0 then
                        tasViewPlayback(data)
                else
                        notify('TAS', 'No data to play back')
                end
        end)
        btnRewind.MouseButton1Click:Connect(function()
                -- Full rewind: remove all frames, go to start
                if #tasPlayerInfo > 0 then
                        local firstFrame = tasPlayerInfo[1]
                        tasPlayerInfo = {}
                        if not tasPaused then tasPauseToggle() end
                        tasTimePauseHolder = tick()
                        tasTimeStart = tick() - firstFrame.Time
                        tasTimePaused = 0
                        tasSetState(firstFrame)
                        tasUpdateGUI()
                        notify('TAS', 'Rewound to start')
                end
        end)

        -- Hover effects
        for _, child in pairs(MainFrame:GetChildren()) do
                if child:IsA("TextButton") then
                        child.MouseEnter:Connect(function()
                                child.BackgroundColor3 = Color3.fromRGB(90, 90, 90)
                        end)
                        child.MouseLeave:Connect(function()
                                child.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
                        end)
                end
        end
end

local tasFrameFwdHeld = false
local tasFrameBackHeld = false

addcmd('tas', {}, function(args, speaker)
        if tasActive then execCmd('untas') return end

        local char = speaker.Character
        if not char or not getRoot(char) then
                notify('TAS', 'Character not found')
                return
        end

        tasActive = true
        tasPaused = true
        tasSavestates = {}
        tasPlayerInfo = {}
        tasTimePaused = 0
        tasTimeStart = tick()
        tasTimePauseHolder = tick()
        tasViewingTAS = false

        -- Initial savestate at current position
        table.insert(tasSavestates, {tasCaptureFrame()})

        -- Anchor player (paused by default)
        local root = getRoot(char)
        if root then root.Anchored = true end

        tasBuildGUI()
        tasUpdateGUI()

        -- Main recording loop
        local mainConn = RunService.Heartbeat:Connect(function(dt)
                if not tasActive then return end
                if not tasPaused then
                        table.insert(tasPlayerInfo, tasCaptureFrame())
                        tasUpdateGUI()
                end
        end)
        table.insert(tasConnections, mainConn)

        -- Keybind handler
        local keyConn = UserInputService.InputBegan:Connect(function(Input, Typing)
                if Typing then return end
                if not tasActive then return end
                local KC = Input.KeyCode

                if KC == Enum.KeyCode.CapsLock then
                        tasPauseToggle()
                elseif KC == Enum.KeyCode.F then
                        tasFrameFwdHeld = true
                        task.spawn(function()
                                tasGoFrameForward()
                                while task.wait(0.05) and tasFrameFwdHeld and tasActive do
                                        tasGoFrameForward()
                                end
                        end)
                elseif KC == Enum.KeyCode.R then
                        tasFrameBackHeld = true
                        task.spawn(function()
                                tasGoFrameBack()
                                while task.wait(0.05) and tasFrameBackHeld and tasActive do
                                        tasGoFrameBack()
                                end
                        end)
                elseif KC == Enum.KeyCode.One then
                        tasAddSavestate()
                elseif KC == Enum.KeyCode.Two then
                        tasLoadSavestate()
                elseif KC == Enum.KeyCode.Three then
                        tasRemoveSavestate()
                end
        end)
        table.insert(tasConnections, keyConn)

        -- Key release handler (stop held frame advance/rewind)
        local keyEndConn = UserInputService.InputEnded:Connect(function(Input, Typing)
                if Typing then return end
                local KC = Input.KeyCode
                if KC == Enum.KeyCode.F then
                        tasFrameFwdHeld = false
                elseif KC == Enum.KeyCode.R then
                        tasFrameBackHeld = false
                end
        end)
        table.insert(tasConnections, keyEndConn)

        -- Death handler
        local hum = char:FindFirstChildWhichIsA('Humanoid')
        if hum then
                local diedConn = hum.Died:Connect(function()
                        task.wait(0.1)
                        if not tasPaused then tasPauseToggle() end
                        notify('TAS', 'Died. Waiting for respawn...')
                        LocalPlayer.CharacterAdded:Wait()
                        task.wait(1)
                        tasLoadSavestate()
                end)
                table.insert(tasConnections, diedConn)
        end

        notify('TAS', 'Active! F=forward, R=rewind, CapsLock=pause, 1=save, 2=load')
end)

addcmd('untas', {'notas'}, function(args, speaker)
        tasActive = false
        tasPaused = true
        tasViewingTAS = false
        tasFrameFwdHeld = false
        tasFrameBackHeld = false

        for _, conn in pairs(tasConnections) do
                pcall(function() conn:Disconnect() end)
        end
        tasConnections = {}

        if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                LocalPlayer.Character.HumanoidRootPart.Anchored = false
        end

        if tasGUI then
                pcall(function() tasGUI:Destroy() end)
                tasGUI = nil
        end

        tasSavestates = {}
        tasPlayerInfo = {}

        notify('TAS', 'Stopped')
end)

end -- TAS section
-- ======================== GUI COMMAND - RAYFIELD-STYLE ========================
-- Persistent state for toggle tracking
ArcCmdGUI = ArcCmdGUI or {}
ArcCmdGUI.Open = false
ArcCmdGUI.Frame = nil
ArcCmdGUI.Gui = nil
ArcCmdGUI.ToggleStates = ArcCmdGUI.ToggleStates or {}
ArcCmdGUI.KConn = nil

addcmd("gui", {"commands", "cmdlist"}, function(args, speaker)
    if ArcCmdGUI.Open then
        ArcCmdGUI._close()
        return
    end
    ArcCmdGUI._open()
end)

-- ==================== THEME COLORS (Rayfield) ====================
local _C = {
    Background   = Color3.fromRGB(25, 28, 40),
    Sidebar      = Color3.fromRGB(35, 38, 52),
    Content      = Color3.fromRGB(28, 32, 46),
    Accent       = Color3.fromRGB(0, 150, 255),
    AccentDark   = Color3.fromRGB(0, 100, 180),
    AccentHover  = Color3.fromRGB(50, 180, 255),
    TextPrimary  = Color3.fromRGB(220, 222, 230),
    TextSecondary= Color3.fromRGB(150, 152, 160),
    TextDim      = Color3.fromRGB(100, 102, 110),
    ToggleOn     = Color3.fromRGB(0, 150, 255),
    ToggleOff    = Color3.fromRGB(60, 63, 75),
    SliderTrack  = Color3.fromRGB(50, 53, 65),
    InputBg      = Color3.fromRGB(40, 43, 55),
    SectionHead  = Color3.fromRGB(35, 38, 52),
    Border       = Color3.fromRGB(55, 58, 70),
    CloseRed     = Color3.fromRGB(180, 50, 50),
    Shine        = Color3.fromRGB(255, 255, 255),
}
local _CR = 10
local _CR_E = 6
local _ANIM = 0.25

-- Glass elements tracked for animated reflections
local _glassElements = {}

-- ==================== UTILITY FUNCTIONS ====================
local function _tw(inst, props, dur, style, dir)
    local ok, tw = pcall(function()
        local info = TweenInfo.new(dur or _ANIM, style or Enum.EasingStyle.Quart, dir or Enum.EasingDirection.Out)
        local t = TweenService:Create(inst, info, props)
        t:Play()
        return t
    end)
    return ok and tw or nil
end

local function _glassShine(parent, cr)
    cr = cr or _CR_E

    -- Top highlight shine (static)
    local shine = Instance.new('Frame')
    shine.Name = 'GlassShine'
    shine.Size = UDim2.new(1, -4, 0.35, 0)
    shine.Position = UDim2.new(0, 2, 0, 2)
    shine.BackgroundColor3 = _C.Shine
    shine.BackgroundTransparency = 0.92
    shine.BorderSizePixel = 0
    shine.ZIndex = 2
    shine.ClipsDescendants = true
    local sCr = Instance.new('UICorner')
    sCr.CornerRadius = UDim.new(0, math.max(cr - 1, 1))
    sCr.Parent = shine
    local grad = Instance.new('UIGradient')
    grad.Color = ColorSequence.new(_C.Shine)
    grad.Transparency = NumberSequence.new({
        NumberSequenceKeypoint.new(0, 0.82),
        NumberSequenceKeypoint.new(0.4, 0.94),
        NumberSequenceKeypoint.new(1, 1),
    })
    grad.Rotation = 90
    grad.Parent = shine
    shine.Parent = parent

    -- Diagonal moving reflection (GlassShine2)
    local shine2 = Instance.new('Frame')
    shine2.Name = 'GlassShine2'
    shine2.Size = UDim2.new(0.6, 0, 1, 0)
    shine2.Position = UDim2.new(0, 0, 0, 0)
    shine2.BackgroundColor3 = _C.Shine
    shine2.BackgroundTransparency = 0.95
    shine2.BorderSizePixel = 0
    shine2.ZIndex = 3
    shine2.ClipsDescendants = true
    local s2Cr = Instance.new('UICorner')
    s2Cr.CornerRadius = UDim.new(0, math.max(cr - 1, 1))
    s2Cr.Parent = shine2
    local grad2 = Instance.new('UIGradient')
    grad2.Color = ColorSequence.new(_C.Shine)
    grad2.Transparency = NumberSequence.new({
        NumberSequenceKeypoint.new(0, 0.9),
        NumberSequenceKeypoint.new(0.5, 0.97),
        NumberSequenceKeypoint.new(1, 1),
    })
    grad2.Rotation = 45
    grad2.Parent = shine2
    shine2.Parent = parent

    -- Glossy bottom highlight (GlassGloss)
    local gloss = Instance.new('Frame')
    gloss.Name = 'GlassGloss'
    gloss.Size = UDim2.new(1, -4, 0.2, 0)
    gloss.Position = UDim2.new(0, 2, 1, -20)
    gloss.BackgroundColor3 = Color3.fromRGB(180, 220, 255)
    gloss.BackgroundTransparency = 0.93
    gloss.BorderSizePixel = 0
    gloss.ZIndex = 2
    gloss.ClipsDescendants = true
    local gCr = Instance.new('UICorner')
    gCr.CornerRadius = UDim.new(0, math.max(cr - 2, 2))
    gCr.Parent = gloss
    local gGrad = Instance.new('UIGradient')
    gGrad.Color = ColorSequence.new(Color3.fromRGB(255, 255, 255))
    gGrad.Transparency = NumberSequence.new({
        NumberSequenceKeypoint.new(0, 1.0),
        NumberSequenceKeypoint.new(0.3, 0.92),
        NumberSequenceKeypoint.new(1, 0.98),
    })
    gGrad.Rotation = 0
    gGrad.Parent = gloss
    local gStroke = Instance.new('UIStroke')
    gStroke.Color = Color3.fromRGB(80, 160, 255)
    gStroke.Thickness = 0.5
    gStroke.Transparency = 0.8
    gStroke.Parent = gloss
    gloss.Parent = parent

    table.insert(_glassElements, parent)
    return shine
end



local function _getPlayerList()
    local players = {}
    local lp = Players.LocalPlayer
    pcall(function()
        for _, p in ipairs(Players:GetPlayers()) do
            if p ~= lp then
                table.insert(players, p.Name)
            end
        end
    end)
    table.sort(players)
    return players
end

-- ==================== OPEN GUI ====================
function ArcCmdGUI._open()
    if ArcCmdGUI.Open then return end

    -- If GUI was already created (just hidden), show it again
    if ArcCmdGUI.Gui and ArcCmdGUI.Frame then
        local frame = ArcCmdGUI.Frame
        frame.Visible = true
        frame.BackgroundTransparency = 1
        frame.Size = UDim2.new(0, 612, 0, 468)
        _tw(frame, {
            BackgroundTransparency = 0,
            Size = UDim2.new(0, 680, 0, 520),
        }, 0.3, Enum.EasingStyle.Back, Enum.EasingDirection.Out)
        ArcCmdGUI.Open = true
        return
    end

    -- Create ScreenGui (first time only)
    local gui = Instance.new('ScreenGui')
    gui.Name = 'ArcCmdGUI'
    gui.ResetOnSpawn = false
    gui.DisplayOrder = 998
    gui.IgnoreGuiInset = true
    gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
    gui.Parent = PARENT
    ArcCmdGUI.Gui = gui

    local _W = 680
    local _H = 520

    -- ==================== MAIN FRAME ====================
    local frame = Instance.new('Frame')
    frame.Name = 'MainWindow'
    frame.Size = UDim2.new(0, _W, 0, _H)
    frame.Position = UDim2.new(0.5, -_W / 2, 0.5, -_H / 2)
    frame.BackgroundColor3 = _C.Background
    frame.BackgroundTransparency = 0
    frame.BorderSizePixel = 0
    frame.ClipsDescendants = true
    frame.ZIndex = 60
    frame.Parent = gui
    local corner = Instance.new('UICorner')
    corner.CornerRadius = UDim.new(0, _CR)
    corner.Parent = frame
    local stroke = Instance.new('UIStroke')
    stroke.Color = _C.Border
    stroke.Thickness = 1
    stroke.Transparency = 0.2
    stroke.Parent = frame
    _glassShine(frame, _CR)

    -- ==================== HEADER BAR (42px) ====================
    local header = Instance.new('Frame')
    header.Name = 'Header'
    header.Size = UDim2.new(1, 0, 0, 42)
    header.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
    header.BackgroundTransparency = 0.96
    header.BorderSizePixel = 0
    header.ZIndex = 65
    header.Parent = frame

    -- Header bottom separator
    local headerLine = Instance.new('Frame')
    headerLine.Size = UDim2.new(1, 0, 0, 1)
    headerLine.Position = UDim2.new(0, 0, 1, 0)
    headerLine.BackgroundColor3 = _C.Border
    headerLine.BackgroundTransparency = 0.35
    headerLine.BorderSizePixel = 0
    headerLine.ZIndex = 66
    headerLine.Parent = header

    -- Title text
    local titleTxt = Instance.new('TextLabel')
    titleTxt.Size = UDim2.new(1, -90, 1, 0)
    titleTxt.Position = UDim2.new(0, 14, 0, 0)
    titleTxt.BackgroundTransparency = 1
    titleTxt.Text = 'Arc Yield'
    titleTxt.TextColor3 = _C.TextPrimary
    titleTxt.TextXAlignment = Enum.TextXAlignment.Left
    titleTxt.Font = Enum.Font.GothamBold
    titleTxt.TextSize = 17
    titleTxt.ZIndex = 67
    titleTxt.Parent = header

    -- Gear icon label (right side)
    local gearLabel = Instance.new('TextLabel')
    gearLabel.Size = UDim2.new(0, 30, 0, 28)
    gearLabel.Position = UDim2.new(1, -68, 0, 7)
    gearLabel.BackgroundTransparency = 1
    gearLabel.Text = string.char(226, 154, 153)
    gearLabel.TextColor3 = _C.TextDim
    gearLabel.Font = Enum.Font.Gotham
    gearLabel.TextSize = 16
    gearLabel.ZIndex = 67
    gearLabel.Parent = header

    -- Close button
    local closeBtn = Instance.new('TextButton')
    closeBtn.Size = UDim2.new(0, 28, 0, 28)
    closeBtn.Position = UDim2.new(1, -36, 0, 7)
    closeBtn.BackgroundColor3 = _C.CloseRed
    closeBtn.BackgroundTransparency = 0.5
    closeBtn.BorderSizePixel = 0
    closeBtn.Text = string.char(226, 156, 149)
    closeBtn.TextColor3 = Color3.fromRGB(255, 200, 200)
    closeBtn.Font = Enum.Font.GothamBold
    closeBtn.TextSize = 14
    closeBtn.ZIndex = 67
    closeBtn.AutoButtonColor = false
    closeBtn.Parent = header
    local clC = Instance.new('UICorner')
    clC.CornerRadius = UDim.new(0, _CR_E)
    clC.Parent = closeBtn
    closeBtn.MouseEnter:Connect(function()
        _tw(closeBtn, {BackgroundTransparency = 0.15}, 0.15)
    end)
    closeBtn.MouseLeave:Connect(function()
        _tw(closeBtn, {BackgroundTransparency = 0.5}, 0.2)
    end)
    closeBtn.MouseButton1Click:Connect(function()
        ArcCmdGUI._close()
    end)

    -- ==================== SIDEBAR (180px wide) ====================
    local sidebar = Instance.new('Frame')
    sidebar.Name = 'Sidebar'
    sidebar.Size = UDim2.new(0, 180, 1, -42)
    sidebar.Position = UDim2.new(0, 0, 0, 42)
    sidebar.BackgroundColor3 = _C.Sidebar
    sidebar.BorderSizePixel = 0
    sidebar.ZIndex = 61
    sidebar.Parent = frame

    -- Sidebar right border
    local sidebarLine = Instance.new('Frame')
    sidebarLine.Size = UDim2.new(0, 1, 1, 0)
    sidebarLine.Position = UDim2.new(1, 0, 0, 0)
    sidebarLine.BackgroundColor3 = _C.Border
    sidebarLine.BackgroundTransparency = 0.3
    sidebarLine.BorderSizePixel = 0
    sidebarLine.ZIndex = 62
    sidebarLine.Parent = sidebar

    -- Sidebar scrolling frame
    local sidebarScroll = Instance.new('ScrollingFrame')
    sidebarScroll.Size = UDim2.new(1, 0, 1, 0)
    sidebarScroll.BackgroundTransparency = 1
    sidebarScroll.BorderSizePixel = 0
    sidebarScroll.ScrollBarThickness = 3
    sidebarScroll.ScrollBarImageColor3 = _C.Accent
    sidebarScroll.ScrollBarImageTransparency = 0.6
    sidebarScroll.CanvasSize = UDim2.new(0, 0, 0, 0)
    sidebarScroll.AutomaticCanvasSize = Enum.AutomaticSize.Y
    sidebarScroll.ZIndex = 63
    sidebarScroll.Parent = sidebar

    local sidebarLayout = Instance.new('UIListLayout')
    sidebarLayout.SortOrder = Enum.SortOrder.LayoutOrder
    sidebarLayout.Padding = UDim.new(0, 2)
    sidebarLayout.Parent = sidebarScroll

    local sidebarPad = Instance.new('UIPadding')
    sidebarPad.PaddingTop = UDim.new(0, 6)
    sidebarPad.PaddingBottom = UDim.new(0, 6)
    sidebarPad.Parent = sidebarScroll

    -- ==================== CONTENT AREA ====================
    local contentArea = Instance.new('Frame')
    contentArea.Name = 'ContentArea'
    contentArea.Size = UDim2.new(1, -180, 1, -42)
    contentArea.Position = UDim2.new(0, 180, 0, 42)
    contentArea.BackgroundColor3 = _C.Content
    contentArea.BorderSizePixel = 0
    contentArea.ClipsDescendants = true
    contentArea.ZIndex = 61
    contentArea.Parent = frame

    ArcCmdGUI.Frame = frame
    ArcCmdGUI.Sidebar = sidebar

    -- ==================== TAB SYSTEM ====================
    local tabs = {}
    local activeTab = nil

    local function showTab(name)
        for tN, tD in pairs(tabs) do
            if tN == name then
                tD.content.Visible = true
                activeTab = tN
                _tw(tD.btn, {BackgroundColor3 = Color3.fromRGB(40, 45, 62)}, 0.2)
                _tw(tD.btnLabel, {TextColor3 = Color3.fromRGB(240, 242, 250)}, 0.15)
                tD.indicator.Visible = true
            else
                tD.content.Visible = false
                _tw(tD.btn, {BackgroundColor3 = Color3.fromRGB(255, 255, 255)}, 0.2)
                _tw(tD.btnLabel, {TextColor3 = _C.TextSecondary}, 0.15)
                tD.indicator.Visible = false
            end
        end
    end

    local function makeTab(name)
        -- Sidebar tab button (~36px tall)
        local btn = Instance.new('TextButton')
        btn.Name = 'TabBtn_' .. name
        btn.Size = UDim2.new(1, 0, 0, 36)
        btn.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
        btn.BackgroundTransparency = 0.97
        btn.BorderSizePixel = 0
        btn.Text = ''
        btn.LayoutOrder = #tabs + 1
        btn.ZIndex = 64
        btn.AutoButtonColor = false
        btn.Parent = sidebarScroll

        -- Accent indicator bar on left edge (3px wide)
        local indicator = Instance.new('Frame')
        indicator.Name = 'Indicator'
        indicator.Size = UDim2.new(0, 3, 0.65, 0)
        indicator.Position = UDim2.new(0, 0, 0.175, 0)
        indicator.BackgroundColor3 = _C.Accent
        indicator.BorderSizePixel = 0
        indicator.ZIndex = 66
        indicator.Visible = false
        indicator.Parent = btn

        -- Tab icon character
        local iconLbl = Instance.new('TextLabel')
        iconLbl.Size = UDim2.new(0, 20, 1, 0)
        iconLbl.Position = UDim2.new(0, 10, 0, 0)
        iconLbl.BackgroundTransparency = 1
        iconLbl.Text = string.char(226, 150, 184)
        iconLbl.TextColor3 = _C.Accent
        iconLbl.Font = Enum.Font.Gotham
        iconLbl.TextSize = 12
        iconLbl.TextXAlignment = Enum.TextXAlignment.Left
        iconLbl.ZIndex = 65
        iconLbl.Parent = btn

        -- Tab label text
        local btnLabel = Instance.new('TextLabel')
        btnLabel.Size = UDim2.new(1, -36, 1, 0)
        btnLabel.Position = UDim2.new(0, 30, 0, 0)
        btnLabel.BackgroundTransparency = 1
        btnLabel.Text = name
        btnLabel.TextColor3 = _C.TextSecondary
        btnLabel.TextXAlignment = Enum.TextXAlignment.Left
        btnLabel.Font = Enum.Font.GothamBold
        btnLabel.TextSize = 13
        btnLabel.ZIndex = 65
        btnLabel.Parent = btn

        btn.MouseEnter:Connect(function()
            if activeTab ~= name then
                _tw(btn, {BackgroundColor3 = Color3.fromRGB(22, 30, 50)}, 0.15)
            end
        end)
        btn.MouseLeave:Connect(function()
            if activeTab ~= name then
                _tw(btn, {BackgroundColor3 = Color3.fromRGB(255, 255, 255)}, 0.2)
            end
        end)

        -- Tab content scrolling frame
        local content = Instance.new('ScrollingFrame')
        content.Name = 'Tab_' .. name
        content.Size = UDim2.new(1, 0, 1, 0)
        content.BackgroundTransparency = 1
        content.BorderSizePixel = 0
        content.ScrollBarThickness = 4
        content.ScrollBarImageColor3 = _C.Accent
        content.ScrollBarImageTransparency = 0.5
        content.CanvasSize = UDim2.new(0, 0, 0, 0)
        content.AutomaticCanvasSize = Enum.AutomaticSize.Y
        content.Visible = false
        content.ZIndex = 61
        content.Parent = contentArea

        local cLayout = Instance.new('UIListLayout')
        cLayout.SortOrder = Enum.SortOrder.LayoutOrder
        cLayout.Padding = UDim.new(0, 4)
        cLayout.Parent = content

        local cPad = Instance.new('UIPadding')
        cPad.PaddingTop = UDim.new(0, 8)
        cPad.PaddingBottom = UDim.new(0, 50)
        cPad.PaddingLeft = UDim.new(0, 10)
        cPad.PaddingRight = UDim.new(0, 10)
        cPad.Parent = content

        tabs[name] = {btn = btn, btnLabel = btnLabel, indicator = indicator, content = content}
        btn.MouseButton1Click:Connect(function()
            showTab(name)
        end)
        return content
    end

    -- ==================== ELEMENT BUILDERS ====================

    -- ===== SECTION TITLE =====
    local function addSectionTitle(parent, text, count)
        local t = Instance.new('Frame')
        t.Size = UDim2.new(1, 0, 0, 26)
        t.BackgroundColor3 = _C.SectionHead
        t.BackgroundTransparency = 0
        t.BorderSizePixel = 0
        t.LayoutOrder = 9998
        t.ZIndex = 62
        t.Parent = parent
        local tC = Instance.new('UICorner')
        tC.CornerRadius = UDim.new(0, _CR_E)
        tC.Parent = t
        local lbl = Instance.new('TextLabel')
        lbl.Size = UDim2.new(1, -16, 1, 0)
        lbl.Position = UDim2.new(0, 10, 0, 0)
        lbl.BackgroundTransparency = 1
        lbl.Text = text .. '  (' .. tostring(count or 0) .. ')'
        lbl.TextColor3 = _C.AccentHover
        lbl.TextXAlignment = Enum.TextXAlignment.Left
        lbl.Font = Enum.Font.GothamBold
        lbl.TextSize = 12
        lbl.ZIndex = 63
        lbl.Parent = t
        return t
    end

    -- ===== SPACER =====
    local function addSpacer(parent, h, order)
        local sp = Instance.new('Frame')
        sp.Size = UDim2.new(1, 0, 0, h or 6)
        sp.BackgroundTransparency = 1
        sp.LayoutOrder = order or 9999
        sp.ZIndex = 60
        sp.Parent = parent
    end

    -- ===== TOGGLE SWITCH =====
    local function addToggle(parent, label, default, onCmd, offCmd, order)
        local key = onCmd
        ArcCmdGUI.ToggleStates[key] = ArcCmdGUI.ToggleStates[key] or default

        local container = Instance.new('Frame')
        container.Size = UDim2.new(1, 0, 0, 32)
        container.BackgroundColor3 = _C.Content
        container.BackgroundTransparency = 0
        container.BorderSizePixel = 0
        container.LayoutOrder = order or 999
        container.ZIndex = 62
        container.Parent = parent
        local cC = Instance.new('UICorner')
        cC.CornerRadius = UDim.new(0, _CR_E)
        cC.Parent = container

        -- Subtle separator line
        local bLine = Instance.new('Frame')
        bLine.Size = UDim2.new(1, -20, 0, 1)
        bLine.Position = UDim2.new(0, 10, 1, -1)
        bLine.BackgroundColor3 = _C.Border
        bLine.BackgroundTransparency = 0.75
        bLine.BorderSizePixel = 0
        bLine.ZIndex = 63
        bLine.Parent = container

        local lbl = Instance.new('TextLabel')
        lbl.Size = UDim2.new(1, -60, 1, 0)
        lbl.Position = UDim2.new(0, 12, 0, 0)
        lbl.BackgroundTransparency = 1
        lbl.Text = label
        lbl.TextColor3 = _C.TextPrimary
        lbl.TextXAlignment = Enum.TextXAlignment.Left
        lbl.Font = Enum.Font.Gotham
        lbl.TextSize = 13
        lbl.ZIndex = 63
        lbl.Parent = container

        -- Toggle track (rectangular, rounded ends)
        local track = Instance.new('Frame')
        track.Size = UDim2.new(0, 40, 0, 20)
        track.Position = UDim2.new(1, -48, 0.5, -10)
        track.BackgroundColor3 = _C.ToggleOff
        track.BorderSizePixel = 0
        track.ZIndex = 64
        track.Parent = container
        local tCr = Instance.new('UICorner')
        tCr.CornerRadius = UDim.new(1, 0)
        tCr.Parent = track

        -- Knob
        local knob = Instance.new('Frame')
        knob.Size = UDim2.new(0, 16, 0, 16)
        knob.Position = UDim2.new(0, 2, 0.5, -8)
        knob.BackgroundColor3 = Color3.fromRGB(160, 170, 185)
        knob.BorderSizePixel = 0
        knob.ZIndex = 65
        knob.Parent = track
        local kCr = Instance.new('UICorner')
        kCr.CornerRadius = UDim.new(1, 0)
        kCr.Parent = knob

        local function applyState(isOn, animate)
            ArcCmdGUI.ToggleStates[key] = isOn
            if isOn then
                if animate then
                    _tw(track, {BackgroundColor3 = _C.ToggleOn}, 0.2)
                    _tw(knob, {Position = UDim2.new(1, -18, 0.5, -8), BackgroundColor3 = Color3.fromRGB(255, 255, 255)}, 0.2, Enum.EasingStyle.Back, Enum.EasingDirection.Out)
                else
                    track.BackgroundColor3 = _C.ToggleOn
                    knob.Position = UDim2.new(1, -18, 0.5, -8)
                    knob.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
                end
            else
                if animate then
                    _tw(track, {BackgroundColor3 = _C.ToggleOff}, 0.2)
                    _tw(knob, {Position = UDim2.new(0, 2, 0.5, -8), BackgroundColor3 = Color3.fromRGB(160, 170, 185)}, 0.2, Enum.EasingStyle.Back, Enum.EasingDirection.Out)
                else
                    track.BackgroundColor3 = _C.ToggleOff
                    knob.Position = UDim2.new(0, 2, 0.5, -8)
                    knob.BackgroundColor3 = Color3.fromRGB(160, 170, 185)
                end
            end
        end

        applyState(ArcCmdGUI.ToggleStates[key], false)

        -- Invisible click catcher
        local clickBtn = Instance.new('TextButton')
        clickBtn.Size = UDim2.new(1, 0, 1, 0)
        clickBtn.BackgroundTransparency = 1
        clickBtn.Text = ''
        clickBtn.ZIndex = 66
        clickBtn.Parent = container
        clickBtn.MouseButton1Click:Connect(function()
            local newState = not ArcCmdGUI.ToggleStates[key]
            applyState(newState, true)
            if newState then
                pcall(function() execCmd(onCmd) end)
            else
                pcall(function() execCmd(offCmd) end)
            end
        end)
        return container
    end

    -- ===== BUTTON =====
    local function addButton(parent, label, cmd, order)
        local container = Instance.new('TextButton')
        container.Size = UDim2.new(1, 0, 0, 30)
        container.BackgroundColor3 = _C.AccentDark
        container.BackgroundTransparency = 0.15
        container.BorderSizePixel = 0
        container.Text = ''
        container.LayoutOrder = order or 999
        container.ZIndex = 62
        container.AutoButtonColor = false
        container.Parent = parent
        local cC = Instance.new('UICorner')
        cC.CornerRadius = UDim.new(0, _CR_E)
        cC.Parent = container

        local lbl = Instance.new('TextLabel')
        lbl.Size = UDim2.new(1, -16, 1, 0)
        lbl.Position = UDim2.new(0, 12, 0, 0)
        lbl.BackgroundTransparency = 1
        lbl.Text = label
        lbl.TextColor3 = _C.TextSecondary
        lbl.TextXAlignment = Enum.TextXAlignment.Left
        lbl.Font = Enum.Font.GothamBold
        lbl.TextSize = 12
        lbl.ZIndex = 63
        lbl.Parent = container

        container.MouseEnter:Connect(function()
            _tw(container, {BackgroundColor3 = _C.Accent, BackgroundTransparency = 0.25}, 0.15)
            _tw(lbl, {TextColor3 = _C.TextPrimary}, 0.15)
        end)
        container.MouseLeave:Connect(function()
            _tw(container, {BackgroundColor3 = _C.AccentDark, BackgroundTransparency = 0.15}, 0.2)
            _tw(lbl, {TextColor3 = _C.TextSecondary}, 0.2)
        end)
        container.MouseButton1Click:Connect(function()
            _tw(container, {BackgroundColor3 = _C.AccentDark, BackgroundTransparency = 0}, 0.08)
            wait(0.1)
            _tw(container, {BackgroundColor3 = _C.AccentDark, BackgroundTransparency = 0.15}, 0.2)
            pcall(function() execCmd(cmd) end)
        end)
        return container
    end

    -- ===== SLIDER =====
    local function addSlider(parent, label, min, max, default, cmd, order)
        local container = Instance.new('Frame')
        container.Size = UDim2.new(1, 0, 0, 50)
        container.BackgroundColor3 = _C.Content
        container.BackgroundTransparency = 0
        container.BorderSizePixel = 0
        container.LayoutOrder = order or 999
        container.ZIndex = 62
        container.Parent = parent
        local cC = Instance.new('UICorner')
        cC.CornerRadius = UDim.new(0, _CR_E)
        cC.Parent = container

        local lbl = Instance.new('TextLabel')
        lbl.Size = UDim2.new(1, -16, 0, 22)
        lbl.Position = UDim2.new(0, 12, 0, 4)
        lbl.BackgroundTransparency = 1
        lbl.Text = label .. ': ' .. tostring(default or min)
        lbl.TextColor3 = _C.TextPrimary
        lbl.TextXAlignment = Enum.TextXAlignment.Left
        lbl.Font = Enum.Font.GothamBold
        lbl.TextSize = 11
        lbl.ZIndex = 63
        lbl.Parent = container

        -- Track (6px tall, rounded)
        local track = Instance.new('Frame')
        track.Size = UDim2.new(1, -24, 0, 6)
        track.Position = UDim2.new(0, 12, 1, -18)
        track.BackgroundColor3 = _C.SliderTrack
        track.BorderSizePixel = 0
        track.ZIndex = 64
        track.Parent = container
        local tCr = Instance.new('UICorner')
        tCr.CornerRadius = UDim.new(1, 0)
        tCr.Parent = track

        -- Fill bar (cyan accent)
        local pct = (default - min) / (max - min)
        if pct < 0 then pct = 0 end
        if pct > 1 then pct = 1 end
        local fill = Instance.new('Frame')
        fill.Size = UDim2.new(pct, 0, 1, 0)
        fill.BackgroundColor3 = _C.Accent
        fill.BorderSizePixel = 0
        fill.ZIndex = 65
        fill.Parent = track
        local fCr = Instance.new('UICorner')
        fCr.CornerRadius = UDim.new(1, 0)
        fCr.Parent = fill

        -- Thumb (14px white circle with accent border stroke)
        local thumb = Instance.new('Frame')
        thumb.Size = UDim2.new(0, 14, 0, 14)
        thumb.Position = UDim2.new(pct, -7, 0.5, -7)
        thumb.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
        thumb.BorderSizePixel = 0
        thumb.ZIndex = 66
        thumb.Parent = track
        local thCr = Instance.new('UICorner')
        thCr.CornerRadius = UDim.new(1, 0)
        thCr.Parent = thumb
        local thS = Instance.new('UIStroke')
        thS.Color = _C.Accent
        thS.Thickness = 2
        thS.Parent = thumb

        local sliding = false
        local function updateSlider(xPos)
            local relX = math.clamp((xPos - track.AbsolutePosition.X) / track.AbsoluteSize.X, 0, 1)
            local val = min + (max - min) * relX
            local rounded = math.floor(val * 100 + 0.5) / 100
            fill.Size = UDim2.new(relX, 0, 1, 0)
            thumb.Position = UDim2.new(relX, -7, 0.5, -7)
            lbl.Text = label .. ': ' .. tostring(rounded)
            pcall(function() execCmd(cmd .. " " .. tostring(rounded)) end)
        end

        track.InputBegan:Connect(function(input)
            if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
                sliding = true
                updateSlider(input.Position.X)
            end
        end)
        track.InputEnded:Connect(function(input)
            if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
                sliding = false
            end
        end)
        UserInputService.InputEnded:Connect(function(input)
            if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
                if sliding then sliding = false end
            end
        end)
        UserInputService.InputChanged:Connect(function(input)
            if sliding then
                if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
                    updateSlider(input.Position.X)
                end
            end
        end)
        return container
    end

    -- ===== PLAYER DROPDOWN + EXECUTE =====
    local function addPlayerDropdown(parent, label, cmd, order)
        local container = Instance.new('Frame')
        container.Size = UDim2.new(1, 0, 0, 56)
        container.BackgroundColor3 = _C.Content
        container.BackgroundTransparency = 0
        container.BorderSizePixel = 0
        container.LayoutOrder = order or 999
        container.ZIndex = 62
        container.Parent = parent
        local cC = Instance.new('UICorner')
        cC.CornerRadius = UDim.new(0, _CR_E)
        cC.Parent = container

        local lbl = Instance.new('TextLabel')
        lbl.Size = UDim2.new(1, -16, 0, 18)
        lbl.Position = UDim2.new(0, 10, 0, 2)
        lbl.BackgroundTransparency = 1
        lbl.Text = label
        lbl.TextColor3 = _C.TextPrimary
        lbl.TextXAlignment = Enum.TextXAlignment.Left
        lbl.Font = Enum.Font.GothamBold
        lbl.TextSize = 11
        lbl.ZIndex = 63
        lbl.Parent = container

        local selectedName = nil
        local dropOpen = false

        -- Dropdown button
        local dropBtn = Instance.new('TextButton')
        dropBtn.Size = UDim2.new(1, -88, 0, 26)
        dropBtn.Position = UDim2.new(0, 10, 0, 24)
        dropBtn.BackgroundColor3 = _C.InputBg
        dropBtn.BackgroundTransparency = 0
        dropBtn.BorderSizePixel = 0
        dropBtn.Text = 'Select Player...'
        dropBtn.TextColor3 = _C.TextDim
        dropBtn.TextXAlignment = Enum.TextXAlignment.Left
        dropBtn.Font = Enum.Font.Gotham
        dropBtn.TextSize = 12
        dropBtn.TextTruncate = Enum.TextTruncate.AtEnd
        dropBtn.ZIndex = 65
        dropBtn.AutoButtonColor = false
        dropBtn.Parent = container
        local dC = Instance.new('UICorner')
        dC.CornerRadius = UDim.new(0, _CR_E)
        dC.Parent = dropBtn
        local dS = Instance.new('UIStroke')
        dS.Color = _C.Border
        dS.Thickness = 0.8
        dS.Transparency = 0.3
        dS.Parent = dropBtn
        local dPad = Instance.new('UIPadding')
        dPad.PaddingLeft = UDim.new(0, 8)
        dPad.PaddingRight = UDim.new(0, 18)
        dPad.Parent = dropBtn

        -- Arrow icon
        local arrowLbl = Instance.new('TextLabel')
        arrowLbl.Size = UDim2.new(0, 14, 0, 14)
        arrowLbl.Position = UDim2.new(1, -16, 0.5, -7)
        arrowLbl.BackgroundTransparency = 1
        arrowLbl.Text = string.char(226, 150, 190)
        arrowLbl.TextColor3 = _C.TextDim
        arrowLbl.Font = Enum.Font.Gotham
        arrowLbl.TextSize = 9
        arrowLbl.ZIndex = 66
        arrowLbl.Parent = dropBtn

        -- Dropdown list frame (hidden by default)
        local dropFrame = Instance.new('Frame')
        dropFrame.Size = UDim2.new(1, -88, 0, 0)
        dropFrame.Position = UDim2.new(0, 10, 1, -2)
        dropFrame.BackgroundColor3 = _C.Sidebar
        dropFrame.BorderSizePixel = 0
        dropFrame.ClipsDescendants = true
        dropFrame.Visible = false
        dropFrame.ZIndex = 70
        dropFrame.Parent = container
        local dfC = Instance.new('UICorner')
        dfC.CornerRadius = UDim.new(0, _CR_E)
        dfC.Parent = dropFrame
        local dfS = Instance.new('UIStroke')
        dfS.Color = _C.Border
        dfS.Thickness = 1
        dfS.Transparency = 0.2
        dfS.Parent = dropFrame

        local dropScroll = Instance.new('ScrollingFrame')
        dropScroll.Size = UDim2.new(1, 0, 1, 0)
        dropScroll.BackgroundTransparency = 1
        dropScroll.BorderSizePixel = 0
        dropScroll.ScrollBarThickness = 3
        dropScroll.ScrollBarImageColor3 = _C.Accent
        dropScroll.ScrollBarImageTransparency = 0.5
        dropScroll.CanvasSize = UDim2.new(0, 0, 0, 0)
        dropScroll.AutomaticCanvasSize = Enum.AutomaticSize.Y
        dropScroll.ZIndex = 71
        dropScroll.Parent = dropFrame

        local dropLayout = Instance.new('UIListLayout')
        dropLayout.SortOrder = Enum.SortOrder.LayoutOrder
        dropLayout.Padding = UDim.new(0, 1)
        dropLayout.Parent = dropScroll

        local function populatePlayers()
            for _, c in ipairs(dropScroll:GetChildren()) do
                if c:IsA('TextButton') or c:IsA('TextLabel') then
                    c:Destroy()
                end
            end
            local playerList = _getPlayerList()
            for i, pName in ipairs(playerList) do
                local opt = Instance.new('TextButton')
                opt.Size = UDim2.new(1, 0, 0, 24)
                opt.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
                opt.BackgroundTransparency = 0.97
                opt.BorderSizePixel = 0
                opt.Text = pName
                opt.TextColor3 = _C.TextPrimary
                opt.TextXAlignment = Enum.TextXAlignment.Left
                opt.Font = Enum.Font.Gotham
                opt.TextSize = 12
                opt.LayoutOrder = i
                opt.ZIndex = 72
                opt.AutoButtonColor = false
                opt.Parent = dropScroll
                local oP = Instance.new('UIPadding')
                oP.PaddingLeft = UDim.new(0, 8)
                oP.Parent = opt
                opt.MouseEnter:Connect(function()
                    opt.BackgroundColor3 = _C.AccentDark
                    _tw(opt, {BackgroundTransparency = 0.85}, 0.1)
                end)
                opt.MouseLeave:Connect(function()
                    opt.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
                    _tw(opt, {BackgroundTransparency = 0.97}, 0.1)
                end)
                opt.MouseButton1Click:Connect(function()
                    selectedName = pName
                    dropBtn.Text = pName
                    dropBtn.TextColor3 = _C.TextPrimary
                    dropFrame.Visible = false
                    dropOpen = false
                    arrowLbl.Text = string.char(226, 150, 190)
                    dropFrame.Size = UDim2.new(1, -88, 0, 0)
                end)
            end
            if #playerList == 0 then
                local noPl = Instance.new('TextLabel')
                noPl.Size = UDim2.new(1, 0, 0, 24)
                noPl.BackgroundTransparency = 1
                noPl.Text = 'No other players'
                noPl.TextColor3 = _C.TextDim
                noPl.Font = Enum.Font.Gotham
                noPl.TextSize = 11
                noPl.ZIndex = 72
                noPl.Parent = dropScroll
            end
        end

        local function toggleDropdown()
            dropOpen = not dropOpen
            if dropOpen then
                populatePlayers()
                local playerList = _getPlayerList()
                local maxH = math.min(#playerList, 6) * 25 + 4
                if maxH < 28 then maxH = 28 end
                dropFrame.Size = UDim2.new(1, -88, 0, 0)
                dropFrame.Visible = true
                _tw(dropFrame, {Size = UDim2.new(1, -88, 0, maxH)}, 0.15)
                arrowLbl.Text = string.char(226, 150, 180)
            else
                _tw(dropFrame, {Size = UDim2.new(1, -88, 0, 0)}, 0.12)
                wait(0.13)
                dropFrame.Visible = false
                arrowLbl.Text = string.char(226, 150, 190)
            end
        end

        dropBtn.MouseButton1Click:Connect(toggleDropdown)

        -- Execute button
        local execBtn = Instance.new('TextButton')
        execBtn.Size = UDim2.new(0, 68, 0, 26)
        execBtn.Position = UDim2.new(1, -78, 0, 24)
        execBtn.BackgroundColor3 = _C.Accent
        execBtn.BackgroundTransparency = 0.2
        execBtn.BorderSizePixel = 0
        execBtn.Text = 'Execute'
        execBtn.TextColor3 = _C.TextPrimary
        execBtn.Font = Enum.Font.GothamBold
        execBtn.TextSize = 11
        execBtn.ZIndex = 65
        execBtn.AutoButtonColor = false
        execBtn.Parent = container
        local eC = Instance.new('UICorner')
        eC.CornerRadius = UDim.new(0, _CR_E)
        eC.Parent = execBtn
        execBtn.MouseEnter:Connect(function()
            _tw(execBtn, {BackgroundTransparency = 0}, 0.12)
        end)
        execBtn.MouseLeave:Connect(function()
            _tw(execBtn, {BackgroundTransparency = 0.2}, 0.15)
        end)
        execBtn.MouseButton1Click:Connect(function()
            if selectedName then
                pcall(function() execCmd(cmd .. " " .. selectedName) end)
            end
            if dropOpen then
                dropOpen = false
                _tw(dropFrame, {Size = UDim2.new(1, -88, 0, 0)}, 0.12)
                wait(0.13)
                dropFrame.Visible = false
                arrowLbl.Text = string.char(226, 150, 190)
            end
        end)
        return container
    end

    -- ===== ID TEXTBOX + EXECUTE =====
    local function addIdInput(parent, label, placeholder, cmd, order)
        local container = Instance.new('Frame')
        container.Size = UDim2.new(1, 0, 0, 54)
        container.BackgroundColor3 = _C.Content
        container.BackgroundTransparency = 0
        container.BorderSizePixel = 0
        container.LayoutOrder = order or 999
        container.ZIndex = 62
        container.Parent = parent
        local cC = Instance.new('UICorner')
        cC.CornerRadius = UDim.new(0, _CR_E)
        cC.Parent = container

        local lbl = Instance.new('TextLabel')
        lbl.Size = UDim2.new(1, -16, 0, 18)
        lbl.Position = UDim2.new(0, 10, 0, 2)
        lbl.BackgroundTransparency = 1
        lbl.Text = label
        lbl.TextColor3 = _C.TextPrimary
        lbl.TextXAlignment = Enum.TextXAlignment.Left
        lbl.Font = Enum.Font.GothamBold
        lbl.TextSize = 11
        lbl.ZIndex = 63
        lbl.Parent = container

        local inputBox = Instance.new('TextBox')
        inputBox.Size = UDim2.new(1, -88, 0, 26)
        inputBox.Position = UDim2.new(0, 10, 0, 24)
        inputBox.BackgroundColor3 = _C.InputBg
        inputBox.BackgroundTransparency = 0
        inputBox.BorderSizePixel = 0
        inputBox.Text = ''
        inputBox.PlaceholderText = placeholder or 'Enter ID...'
        inputBox.PlaceholderColor3 = _C.TextDim
        inputBox.TextColor3 = _C.TextPrimary
        inputBox.Font = Enum.Font.Gotham
        inputBox.TextSize = 12
        inputBox.TextXAlignment = Enum.TextXAlignment.Left
        inputBox.ZIndex = 64
        inputBox.ClearTextOnFocus = false
        inputBox.Parent = container
        local iC = Instance.new('UICorner')
        iC.CornerRadius = UDim.new(0, _CR_E)
        iC.Parent = inputBox
        local iS = Instance.new('UIStroke')
        iS.Color = _C.Border
        iS.Thickness = 0.8
        iS.Transparency = 0.3
        iS.Parent = inputBox
        local inputPad = Instance.new('UIPadding')
        inputPad.PaddingLeft = UDim.new(0, 8)
        inputPad.Parent = inputBox

        -- Submit button ("Go")
        local submitBtn = Instance.new('TextButton')
        submitBtn.Size = UDim2.new(0, 68, 0, 26)
        submitBtn.Position = UDim2.new(1, -78, 0, 24)
        submitBtn.BackgroundColor3 = _C.Accent
        submitBtn.BackgroundTransparency = 0.2
        submitBtn.BorderSizePixel = 0
        submitBtn.Text = 'Go'
        submitBtn.TextColor3 = _C.TextPrimary
        submitBtn.Font = Enum.Font.GothamBold
        submitBtn.TextSize = 12
        submitBtn.ZIndex = 65
        submitBtn.AutoButtonColor = false
        submitBtn.Parent = container
        local sC = Instance.new('UICorner')
        sC.CornerRadius = UDim.new(0, _CR_E)
        sC.Parent = submitBtn
        submitBtn.MouseEnter:Connect(function()
            _tw(submitBtn, {BackgroundTransparency = 0}, 0.12)
        end)
        submitBtn.MouseLeave:Connect(function()
            _tw(submitBtn, {BackgroundTransparency = 0.2}, 0.15)
        end)

        local function doExec()
            if inputBox.Text ~= '' then
                pcall(function() execCmd(cmd .. " " .. inputBox.Text) end)
            end
        end
        submitBtn.MouseButton1Click:Connect(doExec)
        inputBox.FocusLost:Connect(function(enterPressed)
            if enterPressed then doExec() end
        end)
        return container
    end

    -- ==================== DRAGGING ====================
    local dragging = false
    local dragStart = Vector3.new(0, 0, 0)
    local startPos = UDim2.new(0, 0, 0, 0)
    header.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            dragging = true
            dragStart = input.Position
            startPos = frame.Position
        end
    end)
    header.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            dragging = false
        end
    end)
    UserInputService.InputChanged:Connect(function(input)
        if dragging then
            if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
                local delta = input.Position - dragStart
                frame.Position = UDim2.new(
                    startPos.X.Scale, startPos.X.Offset + delta.X,
                    startPos.Y.Scale, startPos.Y.Offset + delta.Y
                )
            end
        end
    end)

    -- ==================== K-KEY TOGGLE ====================
    if ArcCmdGUI.KConn then
        pcall(function() ArcCmdGUI.KConn:Disconnect() end)
        ArcCmdGUI.KConn = nil
    end
    ArcCmdGUI.KConn = UserInputService.InputBegan:Connect(function(input, gp)
        if gp then return end
        if input.KeyCode == Enum.KeyCode.K then
            if ArcCmdGUI.Open then
                ArcCmdGUI._close()
            else
                ArcCmdGUI._open()
            end
        end
    end)

    -- ==================== BUILD ALL TABS & COMMANDS ====================

    -- ===== TAB: Movement =====
    local tMov = makeTab('Movement')
    local movIdx = 0
    local function movOrder() movIdx = movIdx + 1 return movIdx end
    addSectionTitle(tMov, 'Fly', 7)
    addToggle(tMov, 'Fly', false, 'fly', 'unfly', movOrder())
    addToggle(tMov, 'Vehicle Fly', false, 'vfly', 'unvfly', movOrder())
    addToggle(tMov, 'CFrame Fly', false, 'cframefly', 'uncframefly', movOrder())
    addToggle(tMov, 'QE Fly', false, 'qefly', 'unfly', movOrder())
    addSlider(tMov, 'Fly Speed', 1, 500, 80, 'flyspeed', movOrder())
    addSlider(tMov, 'Vehicle Fly Speed', 1, 500, 80, 'vflyspeed', movOrder())
    addSlider(tMov, 'CFrame Fly Speed', 1, 500, 80, 'cframeflyspeed', movOrder())
    addSpacer(tMov, 4, movOrder())
    addSectionTitle(tMov, 'Walk & Run', 4)
    addSlider(tMov, 'Walk Speed', 1, 500, 16, 'speed', movOrder())
    addSlider(tMov, 'Rotate Speed', 1, 100, 10, 'rotatespeed', movOrder())
    addSlider(tMov, 'Jump Power', 1, 500, 50, 'jpower', movOrder())
    addSlider(tMov, 'Hip Height', 0, 20, 2, 'hipheight', movOrder())
    addSpacer(tMov, 4, movOrder())
    addSectionTitle(tMov, 'Noclip & Swim', 5)
    addToggle(tMov, 'Noclip', false, 'noclip', 'clip', movOrder())
    addToggle(tMov, 'Half Clip', false, 'nocliph', 'clip', movOrder())
    addToggle(tMov, 'Swim', false, 'swim', 'unswim', movOrder())
    addToggle(tMov, 'Float Platform', false, 'float', 'unfloat', movOrder())
    addToggle(tMov, 'Wall Walk', false, 'wallwalk', 'unwallwalk', movOrder())
    addSpacer(tMov, 4, movOrder())
    addSectionTitle(tMov, 'Teleport', 6)
    addPlayerDropdown(tMov, 'Go To Player', 'goto', movOrder())
    addPlayerDropdown(tMov, 'Smooth GoTo', 'tweengoto', movOrder())
    addPlayerDropdown(tMov, 'Vehicle GoTo', 'vehiclegoto', movOrder())
    addPlayerDropdown(tMov, 'Pulse TP Player', 'pulsetp', movOrder())
    addSlider(tMov, 'Tween Speed', 1, 300, 50, 'tweenspeed', movOrder())
    addSlider(tMov, 'Gravity', 0, 500, 196.2, 'gravity', movOrder())
    addSpacer(tMov, 4, movOrder())
    addSectionTitle(tMov, 'Pathfind & Follow', 4)
    addPlayerDropdown(tMov, 'Walk To Player', 'walkto', movOrder())
    addPlayerDropdown(tMov, 'Pathfind Walk To', 'pathfindwalkto', movOrder())
    addPlayerDropdown(tMov, 'Pathfind Fly To', 'pathfindflyto', movOrder())
    addButton(tMov, 'Stop Pathfind Fly', 'unpathfindfly', movOrder())
    addSpacer(tMov, 4, movOrder())
    addSectionTitle(tMov, 'Vehicle', 3)
    addToggle(tMov, 'Vehicle Noclip', false, 'vehiclenoclip', 'vehicleclip', movOrder())
    addToggle(tMov, 'Ctrl+Click TP', false, 'ctrlclicktp', 'unctrlclicktp', movOrder())
    addButton(tMov, 'Client Bring', 'cbring', movOrder())
    addSpacer(tMov, 4, movOrder())
    addSectionTitle(tMov, 'Waypoints', 5)
    addIdInput(tMov, 'Save Waypoint', 'Waypoint name...', 'setwaypoint', movOrder())
    addButton(tMov, 'Go To Waypoint', 'waypoint', movOrder())
    addButton(tMov, 'Tween To Waypoint', 'tweenwaypoint', movOrder())
    addButton(tMov, 'Show Waypoints', 'showwaypoints', movOrder())
    addButton(tMov, 'Hide Waypoints', 'hidewaypoints', movOrder())
    addButton(tMov, 'Clear Waypoints', 'clearwaypoints', movOrder())
    addSpacer(tMov, 4, movOrder())
    addSectionTitle(tMov, 'Arc Movement', 14)
    addToggle(tMov, 'Arc Fly', false, 'arcfly', 'unarcfly', movOrder())
    addToggle(tMov, 'Arc CFrame Fly', false, 'arccfly', 'unarccfly', movOrder())
    addToggle(tMov, 'Arc Vehicle Fly', false, 'arcvfly', 'unarcvfly', movOrder())
    addToggle(tMov, 'Arc Noclip', false, 'arcnoclip', 'unarcnoclip', movOrder())
    addToggle(tMov, 'Arc Super Jump', false, 'arcsjump', 'unarcsjump', movOrder())
    addToggle(tMov, 'Arc Infinite Jump', false, 'arcinfjump', 'unarcinfjump', movOrder())
    addToggle(tMov, 'Arc Bunny Hop', false, 'arcbhop', 'unarcbhop', movOrder())
    addToggle(tMov, 'Arc Float', false, 'arcfloat', 'unarcfloat', movOrder())
    addToggle(tMov, 'Arc Bouncy', false, 'arcbouncy', 'unarcbouncy', movOrder())
    addToggle(tMov, 'Arc Anti Gravity', false, 'arcantigrav', 'unarcantigrav', movOrder())
    addToggle(tMov, 'Arc Dash', false, 'arcdash', 'unarcdash', movOrder())
    addToggle(tMov, 'Arc Spider Climb', false, 'arcspider', 'unarcspider', movOrder())
    addSlider(tMov, 'Arc Speed', 1, 500, 16, 'arcspeed', movOrder())
    addSlider(tMov, 'Arc Hyper Speed', 1, 1000, 100, 'archyper', movOrder())
    addSlider(tMov, 'Arc Jump Power', 1, 500, 50, 'arcjp', movOrder())

    -- ===== TAB: Combat =====
    local tCom = makeTab('Combat')
    local comIdx = 0
    local function comOrder() comIdx = comIdx + 1 return comIdx end
    addSectionTitle(tCom, 'Attack', 5)
    addPlayerDropdown(tCom, 'Fling Player', 'fling', comOrder())
    addPlayerDropdown(tCom, 'Fly Fling', 'flyfling', comOrder())
    addPlayerDropdown(tCom, 'Walk Fling', 'walkfling', comOrder())
    addPlayerDropdown(tCom, 'Loop Kill', 'loopkill', comOrder())
    addPlayerDropdown(tCom, 'Handle Kill', 'handlekill', comOrder())
    addSpacer(tCom, 4, comOrder())
    addSectionTitle(tCom, 'Toggle Combat', 5)
    addToggle(tCom, 'Kill Aura', false, 'killaura', 'unkillaura', comOrder())
    addToggle(tCom, 'Anti Fling', false, 'antifling', 'unantifling', comOrder())
    addToggle(tCom, 'Loop Bring', false, 'loopbring', 'unloopbring', comOrder())
    addToggle(tCom, 'Bring All', false, 'bringall', 'unbringall', comOrder())
    addToggle(tCom, 'TP All', false, 'tpall', 'untpall', comOrder())
    addSpacer(tCom, 4, comOrder())
    addSectionTitle(tCom, 'Status Effects', 8)
    addPlayerDropdown(tCom, 'Freeze', 'freeze', comOrder())
    addPlayerDropdown(tCom, 'Thaw', 'thaw', comOrder())
    addPlayerDropdown(tCom, 'Jail', 'jail', comOrder())
    addPlayerDropdown(tCom, 'Blind', 'blind', comOrder())
    addPlayerDropdown(tCom, 'Spin', 'spin2', comOrder())
    addPlayerDropdown(tCom, 'Seizure', 'seizure', comOrder())
    addPlayerDropdown(tCom, 'Trip', 'trip', comOrder())
    addPlayerDropdown(tCom, 'Punish', 'punish', comOrder())
    addSpacer(tCom, 4, comOrder())
    addSectionTitle(tCom, 'Arc Combat', 10)
    addToggle(tCom, 'Arc Kill Aura', false, 'arckaura', 'unarckaura', comOrder())
    addPlayerDropdown(tCom, 'Arc Fling', 'arcfling', comOrder())
    addPlayerDropdown(tCom, 'Arc Loop Kill', 'arcloopkill', comOrder())
    addPlayerDropdown(tCom, 'Arc Jail', 'arcjail', comOrder())
    addPlayerDropdown(tCom, 'Arc Freeze', 'arcfreeze', comOrder())
    addPlayerDropdown(tCom, 'Arc Blind', 'arcblind', comOrder())
    addPlayerDropdown(tCom, 'Arc Crash', 'arccrash', comOrder())
    addPlayerDropdown(tCom, 'Arc Spin', 'arcspin2', comOrder())
    addButton(tCom, 'Arc Bring All', 'arcbringall', comOrder())
    addButton(tCom, 'Arc TP All', 'arctpall', comOrder())
    addButton(tCom, 'Arc Server Lock', 'arcslock', comOrder())
    addSlider(tCom, 'Arc Reach', 1, 100, 3, 'arcreach', comOrder())
    addButton(tCom, 'Arc Explode', 'arcexplode', comOrder())

    -- ===== TAB: Character =====
    local tChar = makeTab('Character')
    local chrIdx = 0
    local function chrOrder() chrIdx = chrIdx + 1 return chrIdx end
    addSectionTitle(tChar, 'God & Defence', 2)
    addToggle(tChar, 'God Mode', false, 'god', 'ungod', chrOrder())
    addToggle(tChar, 'Invisible', false, 'invisible', 'visible', chrOrder())
    addSpacer(tChar, 4, chrOrder())
    addSectionTitle(tChar, 'Body Control', 5)
    addToggle(tChar, 'Strengthen', false, 'strengthen', 'unweaken', chrOrder())
    addToggle(tChar, 'Weaken', false, 'weaken', 'unweaken', chrOrder())
    addButton(tChar, 'Break Velocity', 'breakvelocity', chrOrder())
    addButton(tChar, 'Refresh', 'refresh', chrOrder())
    addButton(tChar, 'Reset', 'reset', chrOrder())
    addSpacer(tChar, 4, chrOrder())
    addSectionTitle(tChar, 'Scale & Size', 3)
    addSlider(tChar, 'Scale', 0.1, 10, 1, 'scale', chrOrder())
    addPlayerDropdown(tChar, 'Tiny', 'tiny', chrOrder())
    addPlayerDropdown(tChar, 'Giant', 'giant', chrOrder())
    addPlayerDropdown(tChar, 'Arc Tiny', 'arctiny', chrOrder())
    addPlayerDropdown(tChar, 'Arc Giant', 'arcgiant', chrOrder())
    addSpacer(tChar, 4, chrOrder())
    addSectionTitle(tChar, 'Animation & Pose', 10)
    addToggle(tChar, 'Dance', false, 'dance', 'undance', chrOrder())
    addToggle(tChar, 'Freeze Anims', false, 'freezeanims', 'unfreezeanims', chrOrder())
    addToggle(tChar, 'Ghost', false, 'ghost', 'unghost', chrOrder())
    addPlayerDropdown(tChar, 'Head Throw', 'headthrow', chrOrder())
    addPlayerDropdown(tChar, 'Spin', 'spin', chrOrder())
    addButton(tChar, 'Unspin', 'unspin', chrOrder())
    addButton(tChar, 'Sit', 'sit', chrOrder())
    addPlayerDropdown(tChar, 'Bang', 'bang', chrOrder())
    addPlayerDropdown(tChar, 'Spasm', 'spasm', chrOrder())
    addPlayerDropdown(tChar, 'LOL Animation', 'lolanim', chrOrder())
    addSpacer(tChar, 4, chrOrder())
    addSectionTitle(tChar, 'Respawn', 3)
    addButton(tChar, 'Respawn', 'respawn', chrOrder())
    addButton(tChar, 'Suicide', 'suicide', chrOrder())
    addButton(tChar, 'Sit Walk', 'sitwalk', chrOrder())
    addSlider(tChar, 'Arc Gravity', 0, 500, 196.2, 'arcgravity', chrOrder())

    -- ===== TAB: Visuals =====
    local tVis = makeTab('Visuals')
    local visIdx = 0
    local function visOrder() visIdx = visIdx + 1 return visIdx end
    addSectionTitle(tVis, 'ESP', 7)
    addToggle(tVis, 'ESP', false, 'esp', 'noesp', visOrder())
    addToggle(tVis, 'Team ESP', false, 'espteam', 'noesp', visOrder())
    addToggle(tVis, 'Part ESP', false, 'partesp', 'unpartesp', visOrder())
    addToggle(tVis, 'Smart ESP', false, 'smartesp', 'unsmartesp', visOrder())
    addSlider(tVis, 'ESP Transparency', 0, 1, 0.3, 'esptransparency', visOrder())
    addToggle(tVis, 'Locate', false, 'locate', 'nolocate', visOrder())
    addSpacer(tVis, 4, visOrder())
    addSectionTitle(tVis, 'Chams & Effects', 6)
    addToggle(tVis, 'Chams', false, 'chams', 'nochams', visOrder())
    addToggle(tVis, 'Xray', false, 'xray', 'unxray', visOrder())
    addToggle(tVis, 'Fullbright', false, 'fullbright', 'nofullbright', visOrder())
    addToggle(tVis, 'Night Vision', false, 'nightvision', 'unnightvision', visOrder())
    addToggle(tVis, 'Wireframe', false, 'wireframe', 'unwireframe', visOrder())
    addToggle(tVis, 'No Fog', false, 'nofog', 'refog', visOrder())
    addSpacer(tVis, 4, visOrder())
    addSectionTitle(tVis, 'Camera', 6)
    addSlider(tVis, 'FOV', 1, 120, 70, 'fov', visOrder())
    addButton(tVis, 'Free Camera', 'freecam', visOrder())
    addButton(tVis, 'Stop Free Cam', 'unfreecam', visOrder())
    addSlider(tVis, 'Free Cam Speed', 1, 500, 50, 'freecamspeed', visOrder())
    addToggle(tVis, 'Shift Lock', false, 'enableshiftlock', 'disableshiftlock', visOrder())
    addButton(tVis, 'Fix Camera', 'fixcam', visOrder())
    addSpacer(tVis, 4, visOrder())
    addSectionTitle(tVis, 'Arc Visuals', 14)
    addToggle(tVis, 'Arc ESP', false, 'arcesp', 'unarcesp', visOrder())
    addToggle(tVis, 'Arc Item ESP', false, 'arcitemesp', 'unarcitemesp', visOrder())
    addToggle(tVis, 'Arc Part ESP', false, 'arcpartesp', 'unarcpartesp', visOrder())
    addToggle(tVis, 'Arc Vehicle ESP', false, 'arcvesp', 'unarcvesp', visOrder())
    addToggle(tVis, 'Arc Mob ESP', false, 'arcmobesp', 'unarcmobesp', visOrder())
    addToggle(tVis, 'Arc Chams', false, 'arcchams', 'unarcchams', visOrder())
    addToggle(tVis, 'Arc Trail', false, 'arctrail', 'unarctrail', visOrder())
    addToggle(tVis, 'Arc Night Vision', false, 'arcnv', 'unarcnv', visOrder())
    addToggle(tVis, 'Arc Wireframe', false, 'arcwireframe', 'unarcwireframe', visOrder())
    addToggle(tVis, 'Arc Fullbright', false, 'arcfb', 'unarcfb', visOrder())
    addToggle(tVis, 'Arc User ESP', false, 'arcuseresp', 'unarcuseresp', visOrder())
    addToggle(tVis, 'No Render', false, 'norender', 'render', visOrder())
    addToggle(tVis, 'Crosshair', false, 'crosshair', 'nocrosshair', visOrder())
    addToggle(tVis, '2022 Materials', false, '2022materials', 'un2022materials', visOrder())

    -- ===== TAB: Unanchored =====
    local tUA = makeTab('Unanchored')
    local uaIdx = 0
    local function uaOrder() uaIdx = uaIdx + 1 return uaIdx end
    addSectionTitle(tUA, 'Unanchored Gadgets', 14)
    addToggle(tUA, 'Cannon', false, 'cannon', 'uncannon', uaOrder())
    addToggle(tUA, 'Trowel', false, 'trowel', 'untrowel', uaOrder())
    addToggle(tUA, 'Magnet', false, 'magnet', 'unmagnet', uaOrder())
    addToggle(tUA, 'Helicopter', false, 'helicopter', 'unhelicopter', uaOrder())
    addToggle(tUA, 'Jumper', false, 'jumper', 'unjumper', uaOrder())
    addToggle(tUA, 'Black Hole', false, 'blackhole', 'unblackhole', uaOrder())
    addToggle(tUA, 'Minigun', false, 'minigun', 'unminigun', uaOrder())
    addToggle(tUA, 'Hoverboard', false, 'hoverboard', 'unhoverboard', uaOrder())
    addToggle(tUA, 'Arrow', false, 'arrow', 'unarrow', uaOrder())
    addToggle(tUA, 'Server Lift', false, 'slift', 'unslift', uaOrder())
    addToggle(tUA, 'Orbit UA', false, 'orbitua', 'unorbitua', uaOrder())
    addToggle(tUA, 'Mouse UA', false, 'mouseua', 'unmouseua', uaOrder())
    addToggle(tUA, 'Funny UA', false, 'funnyua', 'unfunnyua', uaOrder())
    addToggle(tUA, 'Fling Aura', false, 'aura', 'unaura', uaOrder())
    addToggle(tUA, 'Orbital Lazer', false, 'orbitallazer', 'unorbitallazer', uaOrder())
    addSpacer(tUA, 4, uaOrder())
    addSectionTitle(tUA, 'Unanchored Control', 7)
    addButton(tUA, 'TP Unanchored', 'tpunanchored', uaOrder())
    addToggle(tUA, 'Freeze Unanchored', false, 'freezeunanchored', 'thawunanchored', uaOrder())
    addToggle(tUA, 'Cage UA', false, 'cageua', 'uncageua', uaOrder())
    addToggle(tUA, 'Anti UA', false, 'antiua', 'unantiua', uaOrder())
    addToggle(tUA, 'Zero Gravity UA', false, '0gravityua', 'un0gravityua', uaOrder())
    addButton(tUA, 'Own All Parts', 'ownparts', uaOrder())
    addButton(tUA, 'Claim All', 'claimall', uaOrder())
    addSpacer(tUA, 4, uaOrder())
    addSectionTitle(tUA, 'Unanchored Combat', 4)
    addToggle(tUA, 'Fling UA', false, 'flingua', 'unflingua', uaOrder())
    addButton(tUA, 'Tumble', 'tumble', uaOrder())
    addButton(tUA, 'Dropkick', 'dropkick', uaOrder())
    addButton(tUA, 'Power Walk Fling', 'pwalkfling', uaOrder())
    addSpacer(tUA, 4, uaOrder())
    addSectionTitle(tUA, 'Desync', 3)
    addToggle(tUA, 'Desync', false, 'desync', 'undesync', uaOrder())
    addToggle(tUA, 'Arc Desync', false, 'arcdesync', 'unarcdesync', uaOrder())
    addButton(tUA, 'Teleport Back', 'desync tpback', uaOrder())

    -- ===== TAB: Server =====
    local tSrv = makeTab('Server')
    local srvIdx = 0
    local function srvOrder() srvIdx = srvIdx + 1 return srvIdx end
    addSectionTitle(tSrv, 'Server', 6)
    addButton(tSrv, 'Server Info', 'serverinfo', srvOrder())
    addButton(tSrv, 'Server Hop', 'serverhop', srvOrder())
    addButton(tSrv, 'Rejoin', 'rejoin', srvOrder())
    addButton(tSrv, 'Game TP', 'gametp', srvOrder())
    addButton(tSrv, 'Get Job ID', 'jobid', srvOrder())
    addButton(tSrv, 'Exit', 'exit', srvOrder())
    addSpacer(tSrv, 4, srvOrder())
    addSectionTitle(tSrv, 'Protection', 7)
    addToggle(tSrv, 'Anti AFK', false, 'antiafk', 'unantiafk', srvOrder())
    addToggle(tSrv, 'Anti Lag', false, 'antilag', 'unantilag', srvOrder())
    addToggle(tSrv, 'Auto Rejoin', false, 'autorejoin', 'unautorejoin', srvOrder())
    addToggle(tSrv, 'Client Anti Kick', false, 'clientantikick', 'unclientantikick', srvOrder())
    addToggle(tSrv, 'Client Anti TP', false, 'clientantiteleport', 'unclientantiteleport', srvOrder())
    addToggle(tSrv, 'Allow Rejoin', false, 'allowrejoin', 'unallowrejoin', srvOrder())
    addButton(tSrv, 'Cancel Teleport', 'cancelteleport', srvOrder())
    addSpacer(tSrv, 4, srvOrder())
    addSectionTitle(tSrv, 'Performance', 3)
    addSlider(tSrv, 'FPS Cap', 1, 999, 60, 'setfpscap', srvOrder())
    addSlider(tSrv, 'Volume', 0, 1, 0.5, 'volume', srvOrder())
    addSlider(tSrv, 'Replication Lag', 0, 500, 0, 'replicationlag', srvOrder())

    -- ===== TAB: Tools =====
    local tTool = makeTab('Tools')
    local toolIdx = 0
    local function toolOrder() toolIdx = toolIdx + 1 return toolIdx end
    addSectionTitle(tTool, 'Tools', 8)
    addButton(tTool, 'Get All Tools', 'tools', toolOrder())
    addButton(tTool, 'Remove Tools', 'notools', toolOrder())
    addButton(tTool, 'Copy Tools', 'copytools', toolOrder())
    addButton(tTool, 'Drop All Tools', 'droptools', toolOrder())
    addButton(tTool, 'Equip All', 'equiptools', toolOrder())
    addButton(tTool, 'Building Tools', 'btools', toolOrder())
    addButton(tTool, 'F3X Tools', 'f3x', toolOrder())
    addButton(tTool, 'Touch Interests', 'touchinterests', toolOrder())
    addSpacer(tTool, 4, toolOrder())
    addSectionTitle(tTool, 'Arc Tools', 5)
    addToggle(tTool, 'Arc Tool Grab', false, 'arctoolgrab', 'unarctoolgrab', toolOrder())
    addButton(tTool, 'Arc Tool Copy', 'arctoolcopy', toolOrder())
    addToggle(tTool, 'Arc Auto Farm', false, 'arcautofarm', 'unarcautofarm', toolOrder())
    addToggle(tTool, 'Arc No Prompts', false, 'arcnpp', 'unarcnpp', toolOrder())
    addButton(tTool, 'Delete Held Tool', 'deleteselectedtool', toolOrder())
    addSpacer(tTool, 4, toolOrder())
    addSectionTitle(tTool, 'Tool Fun', 8)
    addButton(tTool, 'Spaz Tools', 'spaztools', toolOrder())
    addButton(tTool, 'Spin Tools', 'toolspin', toolOrder())
    addButton(tTool, 'Throw Tools', 'toolthrow', toolOrder())
    addButton(tTool, 'Scatter Tools', 'toolscatter', toolOrder())
    addButton(tTool, 'Snake Tools', 'toolsnake', toolOrder())
    addButton(tTool, 'Bounce Tools', 'toolbounce', toolOrder())
    addButton(tTool, 'Sort Tools', 'toolsort', toolOrder())
    addButton(tTool, 'Orbit Tools', 'orbitttools', toolOrder())

    -- ===== TAB: World =====
    local tWorld = makeTab('World')
    local wIdx = 0
    local function wOrder() wIdx = wIdx + 1 return wIdx end
    addSectionTitle(tWorld, 'Lighting', 6)
    addSlider(tWorld, 'Time', 0, 24, 14, 'time', wOrder())
    addButton(tWorld, 'Day', 'day', wOrder())
    addButton(tWorld, 'Night', 'night', wOrder())
    addSlider(tWorld, 'Brightness', 0, 10, 2, 'brightness', wOrder())
    addSlider(tWorld, 'Ambient', 0, 255, 128, 'ambient', wOrder())
    addButton(tWorld, 'Restore Lighting', 'restorelighting', wOrder())
    addSpacer(tWorld, 4, wOrder())
    addSectionTitle(tWorld, 'World Actions', 4)
    addButton(tWorld, 'Remove Terrain', 'removeterrain', wOrder())
    addButton(tWorld, 'Delete Invisible Parts', 'deleteinvisparts', wOrder())
    addButton(tWorld, 'Unlock Workspace', 'unlockws', wOrder())
    addButton(tWorld, 'Lock Workspace', 'lockws', wOrder())

    -- ===== TAB: Effects =====
    local tFx = makeTab('Effects')
    local fxIdx = 0
    local function fxOrder() fxIdx = fxIdx + 1 return fxIdx end
    addSectionTitle(tFx, 'Client Effects', 8)
    addToggle(tFx, 'Trail', false, 'trail', 'untrail', fxOrder())
    addToggle(tFx, 'Particle Aura', false, 'particleaura', 'unparticleaura', fxOrder())
    addToggle(tFx, 'Glow', false, 'glow', 'unglow', fxOrder())
    addToggle(tFx, 'Highlight', false, 'highlight', 'unhighlight', fxOrder())
    addToggle(tFx, 'Pulse', false, 'pulse', 'unpulse', fxOrder())
    addToggle(tFx, 'Crown', false, 'crown', 'uncrown', fxOrder())
    addToggle(tFx, 'Halo', false, 'halo', 'unhalo', fxOrder())
    addToggle(tFx, 'Wings', false, 'wings', 'unwings', fxOrder())
    addSpacer(tFx, 4, fxOrder())
    addSectionTitle(tFx, 'Arc Effects', 4)
    addToggle(tFx, 'Arc Spin', false, 'arcspin2', 'unarcspin2', fxOrder())
    addToggle(tFx, 'Arc Seizure', false, 'arcseizure', 'unarcseizure', fxOrder())
    addToggle(tFx, 'Arc Fire', false, 'arcfire', 'unarcfire', fxOrder())
    addToggle(tFx, 'Arc Sparkles', false, 'arcsparkles', 'unarcsparkles', fxOrder())
    addToggle(tFx, 'Arc Smoke', false, 'arcsmoke', 'unarcsmoke', fxOrder())
    addSpacer(tFx, 4, fxOrder())
    addSectionTitle(tFx, 'Server-Side Effects', 16)
    addIdInput(tFx, 'SS Hat', 'Hat ID...', 'sshat', fxOrder())
    addIdInput(tFx, 'SS Cape', 'Cape ID...', 'sscape', fxOrder())
    addIdInput(tFx, 'SS Wings', 'Wing ID...', 'sswing', fxOrder())
    addIdInput(tFx, 'SS Music', 'Music ID...', 'ssmusic', fxOrder())
    addIdInput(tFx, 'SS Message', 'Message...', 'ssmsg', fxOrder())
    addButton(tFx, 'SS Ring', 'ssring', fxOrder())
    addButton(tFx, 'SS Light', 'sslight', fxOrder())
    addButton(tFx, 'SS Particles', 'ssparticles', fxOrder())
    addButton(tFx, 'SS Crosshair', 'sscrosshair', fxOrder())
    addButton(tFx, 'SS Arrow', 'ssarrow', fxOrder())
    addButton(tFx, 'SS Orb', 'ssorb', fxOrder())
    addButton(tFx, 'SS Floating', 'ssfloating', fxOrder())
    addButton(tFx, 'SS Aura', 'ssaura', fxOrder())
    addButton(tFx, 'SS Crown', 'sscrown', fxOrder())
    addButton(tFx, 'SS Trail', 'sstrail', fxOrder())
    addButton(tFx, 'SS Halo', 'sshalo', fxOrder())
    addButton(tFx, 'Cleanup SS', 'cleanupss', fxOrder())

    -- ===== TAB: Chat =====
    local tChat = makeTab('Chat')
    local chatIdx = 0
    local function chatOrder() chatIdx = chatIdx + 1 return chatIdx end
    addSectionTitle(tChat, 'Chat', 5)
    addIdInput(tChat, 'Chat Message', 'Message...', 'chat', chatOrder())
    addIdInput(tChat, 'Whisper To Player', 'Player;Message...', 'whisper', chatOrder())
    addToggle(tChat, 'Spam Chat', false, 'spam', 'nospam', chatOrder())
    addSlider(tChat, 'Spam Speed', 0.1, 5, 1, 'spamspeed', chatOrder())
    addToggle(tChat, 'PM Spam', false, 'pmspam', 'nopmspam', chatOrder())
    addSpacer(tChat, 4, chatOrder())
    addSectionTitle(tChat, 'Voice', 3)
    addToggle(tChat, 'Mute Boombox', false, 'muteboombox', 'unmuteboombox', chatOrder())
    addPlayerDropdown(tChat, 'Mute VC Player', 'mutevc', chatOrder())
    addPlayerDropdown(tChat, 'Unmute VC Player', 'unmutevc', chatOrder())
    addSpacer(tChat, 4, chatOrder())
    addSectionTitle(tChat, 'Info', 3)
    addPlayerDropdown(tChat, 'Chat Age', 'chatage', chatOrder())
    addPlayerDropdown(tChat, 'Chat Join Date', 'chatjoindate', chatOrder())
    addPlayerDropdown(tChat, 'Headsit', 'headsit', chatOrder())

    -- ===== TAB: Fun =====
    local tFun = makeTab('Fun')
    local funIdx = 0
    local function funOrder() funIdx = funIdx + 1 return funIdx end
    addSectionTitle(tFun, 'Animations', 5)
    addIdInput(tFun, 'Play Animation', 'Animation ID...', 'animation', funOrder())
    addIdInput(tFun, 'Play Emote', 'Emote name...', 'emote', funOrder())
    addToggle(tFun, 'Loop Animation', false, 'loopanimation', 'unloopanimation', funOrder())
    addSlider(tFun, 'Anim Speed', 0.1, 5, 1, 'animspeed', funOrder())
    addButton(tFun, 'Stop Animations', 'stopanimations', funOrder())
    addSpacer(tFun, 4, funOrder())
    addSectionTitle(tFun, 'Music & Sound', 2)
    addIdInput(tFun, 'Play Music', 'Music ID...', 'music', funOrder())
    addIdInput(tFun, 'Arc Music', 'Music ID...', 'arcmusic', funOrder())
    addSpacer(tFun, 4, funOrder())
    addSectionTitle(tFun, 'Auto & Misc', 6)
    addToggle(tFun, 'Auto Clicker', false, 'autoclick', 'unautoclick', funOrder())
    addIdInput(tFun, 'Name Spoof', 'New name...', 'namespoof', funOrder())
    addPlayerDropdown(tFun, 'Scare', 'scare', funOrder())
    addPlayerDropdown(tFun, 'Click Delete', 'clickdelete', funOrder())
    addButton(tFun, 'Remove Ads', 'removeads', funOrder())
    addButton(tFun, 'Steal Fly', 'stealfly', funOrder())

    -- ===== TAB: Settings =====
    local tSet = makeTab('Settings')
    local setIdx = 0
    local function setOrder() setIdx = setIdx + 1 return setIdx end
    addSectionTitle(tSet, 'GUI & Panels', 8)
    addButton(tSet, 'Open Console', 'console', setOrder())
    addButton(tSet, 'Remote Spy', 'remotespy', setOrder())
    addButton(tSet, 'Explorer (DEX)', 'explorer', setOrder())
    addButton(tSet, 'Executor', 'executor', setOrder())
    addButton(tSet, 'Audio Logger', 'audiologger', setOrder())
    addButton(tSet, 'Open Logs', 'logs', setOrder())
    addButton(tSet, 'Chat Logs', 'chatlogs', setOrder())
    addButton(tSet, 'Join Logs', 'joinlogs', setOrder())
    addSpacer(tSet, 4, setOrder())
    addSectionTitle(tSet, 'Command System', 5)
    addButton(tSet, 'Break All Loops', 'breakloops', setOrder())
    addIdInput(tSet, 'Add Alias', 'alias;cmd...', 'addalias', setOrder())
    addIdInput(tSet, 'Remove Alias', 'alias...', 'removealias', setOrder())
    addButton(tSet, 'Clear Aliases', 'clraliases', setOrder())
    addButton(tSet, 'Hide Arc Yield', 'hideiy', setOrder())
    addSpacer(tSet, 4, setOrder())
    addSectionTitle(tSet, 'Player Info', 6)
    addButton(tSet, 'Copy Name', 'copyname', setOrder())
    addButton(tSet, 'Copy User ID', 'copyid', setOrder())
    addButton(tSet, 'Copy Place ID', 'copyplaceid', setOrder())
    addButton(tSet, 'Copy Game ID', 'copygameid', setOrder())
    addButton(tSet, 'Account Age', 'age', setOrder())
    addButton(tSet, 'Join Date', 'joindate', setOrder())
    addSpacer(tSet, 4, setOrder())
    addSectionTitle(tSet, 'Display', 5)
    addToggle(tSet, 'FPS Counter', false, 'fps', 'nofps', setOrder())
    addToggle(tSet, 'Coordinates', false, 'coords', 'nocoords', setOrder())
    addToggle(tSet, 'Speedometer', false, 'speedometer', 'nospeedometer', setOrder())
    addToggle(tSet, 'Ping Counter', false, 'ping', 'noping', setOrder())
    addToggle(tSet, 'Watermark', false, 'showwatermark', 'hidewatermark', setOrder())
    addToggle(tSet, 'No Prompts', false, 'noprompts', 'showprompts', setOrder())

    -- ==================== OPEN ANIMATION ====================
    showTab('Movement')
    frame.BackgroundTransparency = 1
    local smallSz = UDim2.new(0, _W * 0.9, 0, _H * 0.9)
    frame.Size = smallSz
    frame.Visible = true
    _tw(frame, {
        BackgroundTransparency = 0,
        Size = UDim2.new(0, _W, 0, _H),
    }, 0.3, Enum.EasingStyle.Back, Enum.EasingDirection.Out)

    ArcCmdGUI.Open = true

    -- ==================== ANIMATED REFLECTIONS ====================
    if not ArcCmdGUI._reflectionConn then
        local _refT = 0
        ArcCmdGUI._reflectionConn = RunService.Heartbeat:Connect(function(dt)
            if not ArcCmdGUI.Open then return end
            _refT = _refT + dt
            for _, el in ipairs(_glassElements) do
                if el and el.Parent then
                    local shine2 = el:FindFirstChild('GlassShine2')
                    if shine2 then
                        local sweep = math.sin(_refT * 0.4) * 0.5
                        shine2.Position = UDim2.new(sweep, 0, 0, 0)
                        shine2.BackgroundTransparency = 0.93 + math.sin(_refT * 0.6) * 0.03
                    end
                    local gloss = el:FindFirstChild('GlassGloss')
                    if gloss then
                        gloss.BackgroundTransparency = 0.91 + math.sin(_refT * 0.8 + 1.5) * 0.04
                    end
                end
            end
        end)
    end
end

-- ==================== CLOSE GUI ====================
function ArcCmdGUI._close()
    if not ArcCmdGUI.Open then return end
    ArcCmdGUI.Open = false
    local frame = ArcCmdGUI.Frame
    if frame then
        local _W = frame.Size.X.Offset
        local _H = frame.Size.Y.Offset
        local smallSz = UDim2.new(0, _W * 0.9, 0, _H * 0.9)
        _tw(frame, {
            BackgroundTransparency = 1,
            Size = smallSz,
        }, 0.2, Enum.EasingStyle.Quart, Enum.EasingDirection.In)
        wait(0.22)
        frame.Visible = false
    end
    -- Do NOT destroy the GUI or disconnect K-conn so pressing K reopens it
end

-- ======================== ARC YIELD GUI SYSTEM LOADED ========================
notify("Arc Yield", "GUI System loaded! Type 'gui' to open. Press K to toggle.")

-- ============================================================================
-- NEON MOUSE CURSOR SYSTEM
-- Custom neon cursor that replaces default mouse, morphs on hover
-- ============================================================================

pcall(function()
        local Players = game:GetService('Players')
        local UserInputService = game:GetService('UserInputService')
        local RunService = game:GetService('RunService')
        local TweenService = game:GetService('TweenService')
        local LocalPlayer = Players.LocalPlayer

        local NeonCursor = {
                Enabled = false,
                CursorFrame = nil,
                CursorGlow = nil,
                CursorDot = nil,
                TrailParts = {},
                Connection = nil,
                HoverConn = nil,
                _hoverTarget = nil,
        }

        function NeonCursor:Create()
                if self.CursorFrame then return end

                local sg = Instance.new('ScreenGui')
                sg.Name = 'NeonCursor_' .. math.random(1000, 9999)
                sg.ResetOnSpawn = false
                sg.DisplayOrder = 9999
                sg.IgnoreGuiInset = true
                sg.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
                sg.Parent = (get_hidden_gui and get_hidden_gui()) or game:GetService('CoreGui')

                -- Outer glow ring
                self.CursorGlow = Instance.new('Frame')
                self.CursorGlow.Name = 'CursorGlow'
                self.CursorGlow.Size = UDim2.new(0, 32, 0, 32)
                self.CursorGlow.BackgroundColor3 = Color3.fromRGB(40, 120, 255)
                self.CursorGlow.BackgroundTransparency = 0.5
                self.CursorGlow.BorderSizePixel = 0
                self.CursorGlow.ZIndex = 100
                self.CursorGlow.Parent = sg
                local glowCorner = Instance.new('UICorner')
                glowCorner.CornerRadius = UDim.new(1, 0)
                glowCorner.Parent = self.CursorGlow

                -- Outer glow stroke
                local glowStroke = Instance.new('UIStroke')
                glowStroke.Color = Color3.fromRGB(60, 150, 255)
                glowStroke.Thickness = 2
                glowStroke.Transparency = 0.3
                glowStroke.Parent = self.CursorGlow

                -- Inner ring
                self.CursorFrame = Instance.new('Frame')
                self.CursorFrame.Name = 'NeonCursor'
                self.CursorFrame.Size = UDim2.new(0, 18, 0, 18)
                self.CursorFrame.BackgroundColor3 = Color3.fromRGB(20, 80, 220)
                self.CursorFrame.BackgroundTransparency = 0.3
                self.CursorFrame.BorderSizePixel = 0
                self.CursorFrame.ZIndex = 101
                self.CursorFrame.Parent = sg
                local curCorner = Instance.new('UICorner')
                curCorner.CornerRadius = UDim.new(1, 0)
                curCorner.Parent = self.CursorFrame

                -- Inner stroke
                local innerStroke = Instance.new('UIStroke')
                innerStroke.Color = Color3.fromRGB(100, 180, 255)
                innerStroke.Thickness = 1.5
                innerStroke.Transparency = 0.2
                innerStroke.Parent = self.CursorFrame

                -- Center dot
                self.CursorDot = Instance.new('Frame')
                self.CursorDot.Name = 'CursorDot'
                self.CursorDot.Size = UDim2.new(0, 4, 0, 4)
                self.CursorDot.Position = UDim2.new(0.5, -2, 0.5, -2)
                self.CursorDot.BackgroundColor3 = Color3.fromRGB(200, 230, 255)
                self.CursorDot.BackgroundTransparency = 0.1
                self.CursorDot.BorderSizePixel = 0
                self.CursorDot.ZIndex = 102
                self.CursorDot.Parent = self.CursorFrame
                local dotCorner = Instance.new('UICorner')
                dotCorner.CornerRadius = UDim.new(1, 0)
                dotCorner.Parent = self.CursorDot

                -- Crosshair lines
                for i = 1, 4 do
                        local line = Instance.new('Frame')
                        line.Name = 'CrossLine_' .. i
                        line.BackgroundColor3 = Color3.fromRGB(80, 170, 255)
                        line.BackgroundTransparency = 0.4
                        line.BorderSizePixel = 0
                        line.ZIndex = 101
                        line.Parent = self.CursorGlow
                        local lCorner = Instance.new('UICorner')
                        lCorner.CornerRadius = UDim.new(1, 0)
                        lCorner.Parent = line

                        if i == 1 then
                                line.Size = UDim2.new(0, 1, 0, 8)
                                line.Position = UDim2.new(0.5, -0.5, 0, -10)
                        elseif i == 2 then
                                line.Size = UDim2.new(0, 1, 0, 8)
                                line.Position = UDim2.new(0.5, -0.5, 1, 2)
                        elseif i == 3 then
                                line.Size = UDim2.new(0, 8, 0, 1)
                                line.Position = UDim2.new(0, -10, 0.5, -0.5)
                        else
                                line.Size = UDim2.new(0, 8, 0, 1)
                                line.Position = UDim2.new(1, 2, 0.5, -0.5)
                        end
                end

                self._gui = sg
        end

        function NeonCursor:SetMorphState(state)
                -- states: 'default', 'hover', 'press', 'link'
                if not self.CursorFrame then return end
                local twInfo = TweenInfo.new(0.2, Enum.EasingStyle.Quart, Enum.EasingDirection.Out)

                if state == 'default' then
                        TweenService:Create(self.CursorGlow, twInfo, {
                                Size = UDim2.new(0, 32, 0, 32),
                                BackgroundTransparency = 0.5,
                                BackgroundColor3 = Color3.fromRGB(40, 120, 255),
                        }):Play()
                        TweenService:Create(self.CursorFrame, twInfo, {
                                Size = UDim2.new(0, 18, 0, 18),
                                BackgroundTransparency = 0.3,
                                BackgroundColor3 = Color3.fromRGB(20, 80, 220),
                        }):Play()
                elseif state == 'hover' then
                        TweenService:Create(self.CursorGlow, twInfo, {
                                Size = UDim2.new(0, 38, 0, 38),
                                BackgroundTransparency = 0.35,
                                BackgroundColor3 = Color3.fromRGB(60, 180, 255),
                        }):Play()
                        TweenService:Create(self.CursorFrame, twInfo, {
                                Size = UDim2.new(0, 22, 0, 22),
                                BackgroundTransparency = 0.15,
                                BackgroundColor3 = Color3.fromRGB(30, 120, 255),
                        }):Play()
                elseif state == 'press' then
                        TweenService:Create(self.CursorGlow, twInfo, {
                                Size = UDim2.new(0, 26, 0, 26),
                                BackgroundTransparency = 0.25,
                                BackgroundColor3 = Color3.fromRGB(100, 200, 255),
                        }):Play()
                        TweenService:Create(self.CursorFrame, twInfo, {
                                Size = UDim2.new(0, 14, 0, 14),
                                BackgroundTransparency = 0.1,
                                BackgroundColor3 = Color3.fromRGB(60, 160, 255),
                        }):Play()
                elseif state == 'link' then
                        TweenService:Create(self.CursorGlow, twInfo, {
                                Size = UDim2.new(0, 36, 0, 36),
                                BackgroundTransparency = 0.4,
                                BackgroundColor3 = Color3.fromRGB(40, 200, 120),
                        }):Play()
                        TweenService:Create(self.CursorFrame, twInfo, {
                                Size = UDim2.new(0, 20, 0, 20),
                                BackgroundTransparency = 0.2,
                                BackgroundColor3 = Color3.fromRGB(20, 160, 80),
                        }):Play()
                end
        end

        function NeonCursor:Enable()
                if self.Enabled then return end
                self:Create()
                self.Enabled = true

                -- Hide real cursor
                UserInputService.MouseIconEnabled = false

                -- Track mouse position
                self.Connection = RunService.RenderStepped:Connect(function()
                        if not self.Enabled or not self.CursorFrame then return end
                        local mouse = LocalPlayer:GetMouse()
                        local pos = UserInputService:GetMouseLocation()
                        local offset = 9
                        self.CursorGlow.Position = UDim2.new(0, pos.X - 16, 0, pos.Y - 16)
                        self.CursorFrame.Position = UDim2.new(0, pos.X - offset, 0, pos.Y - offset)
                end)

                -- Morph on hover
                self.HoverConn = UserInputService.InputBegan:Connect(function(input)
                        if not self.Enabled then return end
                        if input.UserInputType == Enum.UserInputType.MouseButton1 then
                                self:SetMorphState('press')
                        end
                end)
                UserInputService.InputEnded:Connect(function(input)
                        if not self.Enabled then return end
                        if input.UserInputType == Enum.UserInputType.MouseButton1 then
                                self:SetMorphState('default')
                        end
                end)

                -- Detect hover over GUI elements
                spawn(function()
                        while self.Enabled do
                                local hovering = false
                                local mouse = LocalPlayer:GetMouse()
                                local target = mouse.Target

                                -- Check if hovering over GUI
                                local hoveredGui = nil
                                pcall(function()
                                        hoveredGui = game:GetService('GuiService'):GetGuiObjectsAtPosition(
                                                UserInputService:GetMouseLocation().X,
                                                UserInputService:GetMouseLocation().Y
                                        )
                                end)

                                if hoveredGui and #hoveredGui > 1 then
                                        local obj = hoveredGui[2]
                                        if obj then
                                                local isButton = (obj:IsA('TextButton') or obj:IsA('ImageButton'))
                                                local isInput = obj:IsA('TextBox')
                                                local isClickable = false
                                                pcall(function()
                                                        if obj.Active then isClickable = true end
                                                end)

                                                if isButton then
                                                        self:SetMorphState('hover')
                                                        hovering = true
                                                elseif isInput then
                                                        self:SetMorphState('link')
                                                        hovering = true
                                                elseif isClickable then
                                                        self:SetMorphState('hover')
                                                        hovering = true
                                                end
                                        end
                                end

                                if not hovering then
                                        self:SetMorphState('default')
                                end

                                wait(0.15)
                        end
                end)
        end

        function NeonCursor:Disable()
                if not self.Enabled then return end
                self.Enabled = false
                UserInputService.MouseIconEnabled = true

                if self.Connection then
                        self.Connection:Disconnect()
                        self.Connection = nil
                end
                if self.HoverConn then
                        self.HoverConn:Disconnect()
                        self.HoverConn = nil
                end

                if self._gui then
                        pcall(function() self._gui:Destroy() end)
                        self._gui = nil
                end
                self.CursorFrame = nil
                self.CursorGlow = nil
                self.CursorDot = nil
        end

        function NeonCursor:Toggle()
                if self.Enabled then
                        self:Disable()
                else
                        self:Enable()
                end
                return self.Enabled
        end

        -- Expose globally
        getgenv().NeonCursor = NeonCursor
end)


-- ============================================================================
-- CLIENT VISUAL EFFECTS SYSTEM
-- Post-processing effects, particles, and shader-like enhancements
-- ============================================================================

pcall(function()
        local Lighting = game:GetService('Lighting')
        local RunService = game:GetService('RunService')
        local Players = game:GetService('Players')
        local TweenService = game:GetService('TweenService')
        local LocalPlayer = Players.LocalPlayer

        local ClientFX = {
                Effects = {},
                ParticlesEnabled = false,
                ParticleConn = nil,
                CharacterConn = nil,
        }

        function ClientFX:EnableBloom()
                if self.Effects.Bloom then return end
                local bloom = Instance.new('BloomEffect')
                bloom.Name = 'ArcYieldBloom'
                bloom.Intensity = 0.5
                bloom.Size = 24
                bloom.Threshold = 1.2
                bloom.Parent = Lighting
                self.Effects.Bloom = bloom
        end

        function ClientFX:DisableBloom()
                if self.Effects.Bloom then
                        self.Effects.Bloom:Destroy()
                        self.Effects.Bloom = nil
                end
        end

        function ClientFX:EnableColorCorrection()
                if self.Effects.ColorCorrection then return end
                local cc = Instance.new('ColorCorrectionEffect')
                cc.Name = 'ArcYieldCC'
                cc.Brightness = 0.02
                cc.Contrast = 0.05
                cc.Saturation = 0.1
                cc.TintColor = Color3.fromRGB(255, 248, 245)
                cc.Parent = Lighting
                self.Effects.ColorCorrection = cc
        end

        function ClientFX:DisableColorCorrection()
                if self.Effects.ColorCorrection then
                        self.Effects.ColorCorrection:Destroy()
                        self.Effects.ColorCorrection = nil
                end
        end

        function ClientFX:EnableSunRays()
                if self.Effects.SunRays then return end
                local sr = Instance.new('SunRaysEffect')
                sr.Name = 'ArcYieldSunRays'
                sr.Intensity = 0.03
                sr.Spread = 0.6
                sr.Parent = Lighting
                self.Effects.SunRays = sr
        end

        function ClientFX:DisableSunRays()
                if self.Effects.SunRays then
                        self.Effects.SunRays:Destroy()
                        self.Effects.SunRays = nil
                end
        end

        function ClientFX:EnableDepthOfField()
                if self.Effects.DOField then return end
                local dof = Instance.new('DepthOfFieldEffect')
                dof.Name = 'ArcYieldDOF'
                dof.FarIntensity = 0.05
                dof.FocusDistance = 20
                dof.InFocusRadius = 15
                dof.NearIntensity = 0
                dof.Parent = Lighting
                self.Effects.DOField = dof
        end

        function ClientFX:DisableDepthOfField()
                if self.Effects.DOField then
                        self.Effects.DOField:Destroy()
                        self.Effects.DOField = nil
                end
        end

        function ClientFX:EnableAll()
                self:EnableBloom()
                self:EnableColorCorrection()
                self:EnableSunRays()
                self:EnableParticles()
        end

        function ClientFX:DisableAll()
                self:DisableBloom()
                self:DisableColorCorrection()
                self:DisableSunRays()
                self:DisableDepthOfField()
                self:DisableParticles()
        end

        function ClientFX:EnableParticles()
                if self.ParticlesEnabled then return end
                self.ParticlesEnabled = true

                local function attachParticles(character)
                        if not character then return end
                        local hrp = character:FindFirstChild('HumanoidRootPart')
                        if not hrp then return end

                        -- Aura particles (floating around character)
                        local aura = Instance.new('ParticleEmitter')
                        aura.Name = 'ArcYieldAura'
                        aura.Color = ColorSequence.new({
                                ColorSequenceKeypoint.new(0, Color3.fromRGB(40, 120, 255)),
                                ColorSequenceKeypoint.new(0.5, Color3.fromRGB(80, 180, 255)),
                                ColorSequenceKeypoint.new(1, Color3.fromRGB(40, 100, 220)),
                        })
                        aura.Size = NumberSequence.new({
                                NumberSequenceKeypoint.new(0, 0.3),
                                NumberSequenceKeypoint.new(0.5, 0.6),
                                NumberSequenceKeypoint.new(1, 0),
                        })
                        aura.Transparency = NumberSequence.new({
                                NumberSequenceKeypoint.new(0, 0.8),
                                NumberSequenceKeypoint.new(0.3, 0.5),
                                NumberSequenceKeypoint.new(1, 1),
                        })
                        aura.Lifetime = NumberRange.new(1.5, 3)
                        aura.Rate = 15
                        aura.Speed = NumberRange.new(1, 3)
                        aura.SpreadAngle = Vector2.new(180, 180)
                        aura.RotSpeed = NumberRange.new(-60, 60)
                        aura.LightEmission = 0.8
                        aura.LightInfluence = 0.3
                        aura.Parent = hrp

                        -- Trail sparkles
                        local trail = Instance.new('ParticleEmitter')
                        trail.Name = 'ArcYieldTrail'
                        trail.Color = ColorSequence.new({
                                ColorSequenceKeypoint.new(0, Color3.fromRGB(100, 200, 255)),
                                ColorSequenceKeypoint.new(1, Color3.fromRGB(50, 130, 255)),
                        })
                        trail.Size = NumberSequence.new({
                                NumberSequenceKeypoint.new(0, 0.15),
                                NumberSequenceKeypoint.new(0.5, 0.25),
                                NumberSequenceKeypoint.new(1, 0),
                        })
                        trail.Transparency = NumberSequence.new({
                                NumberSequenceKeypoint.new(0, 0.6),
                                NumberSequenceKeypoint.new(0.5, 0.8),
                                NumberSequenceKeypoint.new(1, 1),
                        })
                        trail.Lifetime = NumberRange.new(0.8, 1.5)
                        trail.Rate = 8
                        trail.Speed = NumberRange.new(0.5, 1.5)
                        trail.SpreadAngle = Vector2.new(30, 30)
                        trail.LightEmission = 1
                        trail.LightInfluence = 0.2
                        trail.Parent = hrp
                end

                -- Attach to current character
                if LocalPlayer.Character then
                        attachParticles(LocalPlayer.Character)
                end

                -- Watch for character spawns
                self.CharacterConn = LocalPlayer.CharacterAdded:Connect(function(char)
                        wait(1)
                        attachParticles(char)
                end)
        end

        function ClientFX:DisableParticles()
                if not self.ParticlesEnabled then return end
                self.ParticlesEnabled = false

                if self.CharacterConn then
                        self.CharacterConn:Disconnect()
                        self.CharacterConn = nil
                end

                -- Remove particles from current character
                pcall(function()
                        if LocalPlayer.Character then
                                local hrp = LocalPlayer.Character:FindFirstChild('HumanoidRootPart')
                                if hrp then
                                        local aura = hrp:FindFirstChild('ArcYieldAura')
                                        if aura then aura:Destroy() end
                                        local trail = hrp:FindFirstChild('ArcYieldTrail')
                                        if trail then trail:Destroy() end
                                end
                        end
                end)
        end

        -- Expose globally
        getgenv().ClientFX = ClientFX
end)

Features & Information

funny lil script, btw supports nds, with dropkick script inbuilt, and yunas hub, + lots of custom features, like orbitua - updates every day about like 5 times, max delay prob 1 week.
#infinite yield#arc

Community Comments (15)

bobjsbobjsApr 14, 2026

please comment stuff to add :Due8futwg*ufdgfwvqghuwi8fvuyhfdgew9s0iuwgq2fvgtywu8cu7dfswgtyws7duygf

doenerium6969doenerium6969Apr 14, 2026

you got discord?

Replying to @doenerium6969
bobjsbobjsApr 14, 2026

@doenerium6969 nope

bobjsbobjsApr 15, 2026

btw with some common ones such as fly, u can type arcfly for an easy gui

lucamuca2lucamuca2Apr 15, 2026

w script brotien gonna use ts daily no bugs

doenerium6969doenerium6969Apr 15, 2026

add desync fr

Replying to @doenerium6969
bobjsbobjsApr 15, 2026

@doenerium6969 nearly done with desync fr

bobjsbobjsApr 16, 2026

sorry guys desync is currently patched, because the only ones that work, lock your mouse.

bobjsbobjsApr 18, 2026

by the way, all desyncs are patched, as i cannot create it, as it will lock mouse to middle of screen, and player.gui will fail to open

pr1ngl33pr1ngl33Apr 22, 2026

hello bro im Pr1ngl3s and this script is so cool and so powerfull!

OnixChloroOnixChloroApr 27, 2026

This script is genuinely so good 👍

Replying to @OnixChloro
bobjsbobjsApr 29, 2026

@OnixChloro w

Replying to @bobjs
OnixChloroOnixChloroApr 30, 2026

@bobjs gonna add your script into my scripts collection script

bobjsbobjsApr 29, 2026

guys im adding more stuff rq, like cannon , which launches parts to ur mouse

bobjsbobjsMay 2, 2026

nvm, after a lot of work, desync is finally done!, just in testing, about to release soon

More Scripts for Universal Scripts