script.lol
Executors Arceus X (Mobile) Delta Executor Synapse X (PC) KRNL Exploit Xeno Scripts Keyless Scripts
Search Roblox Scripts
Popular Searches
Payload copied to clipboard
100% Free & Keyless 🎮 DesertStorm Jul 30, 2026 Author: XCMEN

XCMEN HUB - DESERTSTORM (AI/WHOLE CODE for you ♥️) U CAN EXPAND IT (DesertStorm) Script Pastebin 2026 - Auto Farm, ESP & Keyless (Synapse X)

Verified and keyless Lua script payload for XCMEN HUB - DESERTSTORM (AI/WHOLE CODE for you ♥️) U CAN EXPAND IT. Compatible with Android/iOS mobile executors and Windows PC exploits.

script.lua (Raw Payload)
--[[
    ╔═══════════════════════════════════════════════════════════════╗
    ║  XCMEN HUB - DesertStorm [EXTRACTION]                         ║
    ║  Educational Testing Only — Private Environment               ║
    ╚═══════════════════════════════════════════════════════════════╝
    
    Tabs: Combat | ESP | NPC | Containers | World | Misc | Settings
--]]

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
local Lighting = game:GetService("Lighting")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local HttpService = game:GetService("HttpService")
local TeleportService = game:GetService("TeleportService")

local LocalPlayer = Players.LocalPlayer

-- ─── DYNAMISCHE CAMERA ─────────────────────────────────────────
local function GetCamera()
    return Workspace.CurrentCamera
end

-- ─── WORKSPACE PFADE ───────────────────────────────────────────
local CONTAINER_FOLDER = Workspace:WaitForChild("Containers")
local BOT_FOLDER = Workspace:WaitForChild("IngameBots")
local EXTRACTION_FOLDER = Workspace:WaitForChild("Extractions")
local AIRDROP_FOLDER = Workspace:WaitForChild("AirdropPositions")
local DEAD_BODIES_FOLDER = Workspace:WaitForChild("DeadBodies")
local NATURE_FOLDER = Workspace:WaitForChild("Nature")

-- ─── REMOTES ───────────────────────────────────────────────────
local Remotes = {
    OpenContainerEvent = ReplicatedStorage:WaitForChild("OpenContainerEvent"),
    ExtractionSync = ReplicatedStorage:WaitForChild("ExtractionSync"),
    HitmarkerEvent = ReplicatedStorage:WaitForChild("HitmarkerEvent"),
    PingLocation = ReplicatedStorage:WaitForChild("PingLocation"),
    RemoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent"),
}

-- ─── MAPPINGS ──────────────────────────────────────────────────
local ContainerTypes = {
    ["Ammo Box"] = "ammo", ["Civilian Airdrop"] = "airdrop",
    ["Double Metal Crates"] = "crate", ["Duffel Bag"] = "bag",
    ["Food Crate"] = "crate", ["Leather Pouch"] = "pouch",
    ["Medical Pouch"] = "medical", ["Metal Crate"] = "crate",
    ["Military Laptop"] = "electronics", ["PC Tower"] = "electronics",
    ["Safe"] = "safe", ["Specops Supply Crate"] = "crate",
    ["Supply Crate"] = "crate", ["T.C.R Supply Crate"] = "crate",
    ["Tall Metal Crate"] = "crate", ["Tanker Truck"] = "vehicle",
    ["Vault"] = "safe", ["Wooden Crate"] = "crate",
    ["Abandoned Car"] = "vehicle", ["DroppedItemContainer"] = "loot",
}

local BotTypes = {
    ["GOVSoldier"] = "gov", ["RebelElite"] = "rebel",
    ["RebelSniper"] = "rebel", ["RebelSoldier"] = "rebel",
    ["Scav"] = "scav", ["TCRElite"] = "tcr",
    ["TCRGuard"] = "tcr", ["Tyrant"] = "boss",
}

local ExtractionNames = {
    ["Getaway Car"] = "Getaway Car", ["Mountain Cave"] = "Mountain Cave",
    ["North-Western Boat"] = "NW Boat", ["Northern Mountain"] = "N Mountain",
    ["Radio Tower"] = "Radio Tower", ["Ruined Hideout"] = "Ruined Hideout",
    ["Southern Boat"] = "S Boat", ["Southern Tunnel"] = "S Tunnel",
    ["Tunnel Exit"] = "Tunnel Exit", ["Western Boat"] = "W Boat",
}

-- ═══════════════════════════════════════════════════════════════
-- CONFIG MANAGER
-- ═══════════════════════════════════════════════════════════════
local ConfigManager = {}
ConfigManager.Current = {}
ConfigManager.Path = "XCMEN_HUB_DesertStorm/"
ConfigManager.FileName = "config.json"
ConfigManager.AutoSaveEnabled = true

function ConfigManager:Init()
    if not isfolder(self.Path) then makefolder(self.Path) end
    self:Load()
    task.spawn(function()
        while self.AutoSaveEnabled do
            task.wait(30)
            if self.AutoSaveEnabled then pcall(function() self:Save() end) end
        end
    end)
end

function ConfigManager:Load()
    local fullPath = self.Path .. self.FileName
    if isfile(fullPath) then
        local ok, data = pcall(function() return HttpService:JSONDecode(readfile(fullPath)) end)
        if ok and type(data) == "table" then self.Current = data; return end
    end
    self:Reset()
end

function ConfigManager:Save()
    local ok, encoded = pcall(function() return HttpService:JSONEncode(self.Current) end)
    if ok then pcall(function() writefile(self.Path .. self.FileName, encoded) end) end
end

function ConfigManager:Reset()
    self.Current = {
        -- Combat / Aimbot
        AimbotEnabled = false, AimbotSmoothness = 0.5,
        AimbotFOV = 150, AimbotMaxDistance = 1000,
        AimbotTeamCheck = false, AimbotVisibilityCheck = false,
        AimbotShowFOV = true, AimbotTargetBots = true,
        
        -- Player ESP
        PlayerESP = false, BoxESP = false, NameESP = false,
        DistanceESP = false, HealthESP = false, Tracers = false,
        Chams = false,
        
        -- NPC ESP
        BotESP = false, BotBoxESP = false, BotNameESP = false,
        BotDistanceESP = false, BotHealthESP = false, BotTracers = false,
        
        -- Container ESP
        LootESP = false, LootNameESP = false, LootDistanceESP = false,
        LootTracers = false,
        
        -- Object ESP
        ExtractionESP = false, AirdropESP = false, DeadBodyESP = false,
        
        -- Colors
        ESPEnemyColor = {R = 255, G = 50, B = 50},
        ESPBotColor = {R = 255, G = 165, B = 0},
        ESPLootColor = {R = 255, G = 215, B = 0},
        ESPExtractionColor = {R = 0, G = 255, B = 255},
        ESPAirdropColor = {R = 255, G = 0, B = 255},
        ESPDeadBodyColor = {R = 128, G = 128, B = 128},
        
        -- World
        FullBright = false, TimeChanger = false, CustomTime = 12,
        RemoveFog = false, WeatherToggle = false, ShowInteractive = false,
        
        -- Misc
        FPSBoost = false,
        
        -- Settings
        Theme = "Default", GUIBind = "RightShift",
        Watermark = true, Notifications = true,
    }
    self:Save()
end

function ConfigManager:Set(key, value) self.Current[key] = value end
function ConfigManager:Get(key) return self.Current[key] end

-- ═══════════════════════════════════════════════════════════════
-- CONNECTION MANAGER
-- ═══════════════════════════════════════════════════════════════
local ConnectionManager = {}
ConnectionManager.Connections = {}

function ConnectionManager:Add(name, connection)
    if self.Connections[name] then pcall(function() self.Connections[name]:Disconnect() end) end
    self.Connections[name] = connection
end

function ConnectionManager:Clear()
    for _, conn in pairs(self.Connections) do pcall(function() conn:Disconnect() end) end
    table.clear(self.Connections)
end

-- ═══════════════════════════════════════════════════════════════
-- UTILITY
-- ═══════════════════════════════════════════════════════════════
local Utils = {}
Utils._cachedFolder = nil

function Utils:GetPlayerFolder()
    if self._cachedFolder and self._cachedFolder.Parent and self._cachedFolder:FindFirstChild(LocalPlayer.Name) then
        return self._cachedFolder
    end
    for _, child in pairs(Workspace:GetChildren()) do
        if (child:IsA("Folder") or child:IsA("Model")) and child:FindFirstChild(LocalPlayer.Name) then
            self._cachedFolder = child
            return child
        end
    end
    return nil
end

function Utils:GetCharacter(player)
    if not player then return nil end
    local folder = self:GetPlayerFolder()
    if not folder then return nil end
    local char = folder:FindFirstChild(player.Name)
    if char and char:FindFirstChild("Humanoid") and char:FindFirstChild("HumanoidRootPart") then
        return char
    end
    return nil
end

function Utils:GetHealth(char)
    if not char then return 0, 100 end
    local healthObj = char:FindFirstChild("Health")
    if healthObj and healthObj:IsA("ValueBase") then return healthObj.Value, 100 end
    local hum = char:FindFirstChildOfClass("Humanoid")
    if hum then return hum.Health, hum.MaxHealth end
    return 0, 100
end

function Utils:IsAlive(char)
    if not char then return false end
    local hum = char:FindFirstChildOfClass("Humanoid")
    return hum and hum.Health > 0
end

function Utils:GetDistance(pos)
    if not LocalPlayer.Character then return 99999 end
    local root = LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
    if root then return (root.Position - pos).Magnitude end
    return 99999
end

function Utils:WorldToScreen(pos)
    local cam = GetCamera()
    if not cam then return Vector2.new(0, 0), false end
    local sp, onScreen = cam:WorldToViewportPoint(pos)
    return Vector2.new(sp.X, sp.Y), onScreen
end

function Utils:ColorFromConfig(key)
    local c = ConfigManager:Get(key)
    return Color3.fromRGB(c.R, c.G, c.B)
end

function Utils:FormatNumber(n) return tostring(math.floor(n + 0.5)) end

function Utils:CopyToClipboard(text) pcall(function() setclipboard(text) end) end

-- ═══════════════════════════════════════════════════════════════
-- DRAWING POOL
-- ═══════════════════════════════════════════════════════════════
local DrawingPool = {}
function DrawingPool:Create(type)
    local ok, d = pcall(function() return Drawing.new(type) end)
    if ok then d.Visible = false; return d end
    return nil
end
function DrawingPool:Destroy(d) pcall(function() d:Remove() end) end

-- ═══════════════════════════════════════════════════════════════
-- ESP ENGINE (ROBUST + CLEANUP)
-- ═══════════════════════════════════════════════════════════════
local ESPManager = {}
ESPManager.PlayerObjects = {}
ESPManager.BotObjects = {}
ESPManager.LootObjects = {}
ESPManager.OtherObjects = {}

-- Hilfsfunktion: Bounding Box aus Character-Parts
local function GetCharBounds(character)
    if not character then return nil end
    local cam = GetCamera()
    if not cam then return nil end
    
    local minX, minY = math.huge, math.huge
    local maxX, maxY = -math.huge, -math.huge
    local any = false
    
    for _, part in pairs(character:GetChildren()) do
        if part:IsA("BasePart") then
            local size = part.Size
            local cf = part.CFrame
            local corners = {
                cf * CFrame.new(-size.X/2, -size.Y/2, -size.Z/2),
                cf * CFrame.new(-size.X/2, -size.Y/2, size.Z/2),
                cf * CFrame.new(-size.X/2, size.Y/2, -size.Z/2),
                cf * CFrame.new(-size.X/2, size.Y/2, size.Z/2),
                cf * CFrame.new(size.X/2, -size.Y/2, -size.Z/2),
                cf * CFrame.new(size.X/2, -size.Y/2, size.Z/2),
                cf * CFrame.new(size.X/2, size.Y/2, -size.Z/2),
                cf * CFrame.new(size.X/2, size.Y/2, size.Z/2),
            }
            for _, c in pairs(corners) do
                local sp, onScreen = cam:WorldToViewportPoint(c.Position)
                if onScreen then
                    any = true
                    minX = math.min(minX, sp.X)
                    minY = math.min(minY, sp.Y)
                    maxX = math.max(maxX, sp.X)
                    maxY = math.max(maxY, sp.Y)
                end
            end
        end
    end
    
    if any and minX ~= math.huge then
        return Vector2.new(minX, minY), Vector2.new(maxX, maxY)
    end
    return nil
end

-- ─── PLAYER ESP ────────────────────────────────────────────────
local PlayerESP = {}
PlayerESP.__index = PlayerESP

function PlayerESP.new(player)
    local self = setmetatable({}, PlayerESP)
    self.Player = player
    self.Drawings = {
        Box = DrawingPool:Create("Square"),
        BoxOutline = DrawingPool:Create("Square"),
        Name = DrawingPool:Create("Text"),
        Distance = DrawingPool:Create("Text"),
        Health = DrawingPool:Create("Text"),
        HealthBar = DrawingPool:Create("Square"),
        HealthBarOutline = DrawingPool:Create("Square"),
        Tracer = DrawingPool:Create("Line"),
    }
    self.Highlight = nil
    return self
end

function PlayerESP:Update()
    local ok, err = pcall(function()
        local char = Utils:GetCharacter(self.Player)
        if not char or not Utils:IsAlive(char) then
            self:Hide()
            return
        end
        
        local topLeft, bottomRight = GetCharBounds(char)
        if not topLeft then self:Hide(); return end
        
        local size = bottomRight - topLeft
        if size.X < 4 or size.Y < 4 then self:Hide(); return end
        
        local root = char:FindFirstChild("HumanoidRootPart")
        local dist = root and Utils:GetDistance(root.Position) or 0
        local color = Utils:ColorFromConfig("ESPEnemyColor")
        
        -- Box
        if ConfigManager:Get("BoxESP") then
            self.Drawings.BoxOutline.Size = size + Vector2.new(2, 2)
            self.Drawings.BoxOutline.Position = topLeft - Vector2.new(1, 1)
            self.Drawings.BoxOutline.Visible = true
            self.Drawings.BoxOutline.Color = Color3.new(0, 0, 0)
            self.Drawings.BoxOutline.Thickness = 1
            self.Drawings.BoxOutline.Filled = false
            
            self.Drawings.Box.Size = size
            self.Drawings.Box.Position = topLeft
            self.Drawings.Box.Visible = true
            self.Drawings.Box.Color = color
            self.Drawings.Box.Thickness = 1
            self.Drawings.Box.Filled = false
        else
            self.Drawings.Box.Visible = false
            self.Drawings.BoxOutline.Visible = false
        end
        
        -- Name
        if ConfigManager:Get("NameESP") then
            self.Drawings.Name.Text = self.Player.Name
            self.Drawings.Name.Position = Vector2.new(topLeft.X + size.X/2, topLeft.Y - 16)
            self.Drawings.Name.Size = 13
            self.Drawings.Name.Center = true
            self.Drawings.Name.Visible = true
            self.Drawings.Name.Color = color
            self.Drawings.Name.Outline = true
        else
            self.Drawings.Name.Visible = false
        end
        
        -- Distance
        if ConfigManager:Get("DistanceESP") then
            self.Drawings.Distance.Text = Utils:FormatNumber(dist) .. "m"
            self.Drawings.Distance.Position = Vector2.new(topLeft.X + size.X/2, bottomRight.Y + 2)
            self.Drawings.Distance.Size = 11
            self.Drawings.Distance.Center = true
            self.Drawings.Distance.Visible = true
            self.Drawings.Distance.Color = Color3.new(1, 1, 1)
            self.Drawings.Distance.Outline = true
        else
            self.Drawings.Distance.Visible = false
        end
        
        -- Health
        if ConfigManager:Get("HealthESP") then
            local hp, maxHp = Utils:GetHealth(char)
            local pct = math.clamp(hp / maxHp, 0, 1)
            
            self.Drawings.Health.Text = Utils:FormatNumber(hp) .. " HP"
            self.Drawings.Health.Position = Vector2.new(topLeft.X + size.X/2, topLeft.Y - 30)
            self.Drawings.Health.Size = 11
            self.Drawings.Health.Center = true
            self.Drawings.Health.Visible = true
            self.Drawings.Health.Color = Color3.fromRGB(255*(1-pct), 255*pct, 0)
            self.Drawings.Health.Outline = true
            
            local barW = size.X
            local barH = 3
            local barPos = Vector2.new(topLeft.X, topLeft.Y - 8)
            
            self.Drawings.HealthBarOutline.Size = Vector2.new(barW+2, barH+2)
            self.Drawings.HealthBarOutline.Position = barPos - Vector2.new(1,1)
            self.Drawings.HealthBarOutline.Visible = true
            self.Drawings.HealthBarOutline.Color = Color3.new(0,0,0)
            self.Drawings.HealthBarOutline.Filled = true
            
            self.Drawings.HealthBar.Size = Vector2.new(barW * pct, barH)
            self.Drawings.HealthBar.Position = barPos
            self.Drawings.HealthBar.Visible = true
            self.Drawings.HealthBar.Color = Color3.fromRGB(255*(1-pct), 255*pct, 0)
            self.Drawings.HealthBar.Filled = true
        else
            self.Drawings.Health.Visible = false
            self.Drawings.HealthBar.Visible = false
            self.Drawings.HealthBarOutline.Visible = false
        end
        
        -- Tracer
        if ConfigManager:Get("Tracers") then
            local cam = GetCamera()
            if cam then
                self.Drawings.Tracer.From = Vector2.new(cam.ViewportSize.X/2, cam.ViewportSize.Y)
                self.Drawings.Tracer.To = Vector2.new(topLeft.X + size.X/2, topLeft.Y + size.Y/2)
                self.Drawings.Tracer.Visible = true
                self.Drawings.Tracer.Color = color
                self.Drawings.Tracer.Thickness = 1
            end
        else
            self.Drawings.Tracer.Visible = false
        end
        
        -- Chams
        if ConfigManager:Get("Chams") then
            if not self.Highlight then
                self.Highlight = Instance.new("Highlight")
                self.Highlight.Parent = char
            end
            self.Highlight.FillColor = color
            self.Highlight.OutlineColor = Color3.new(1,1,1)
            self.Highlight.FillTransparency = 0.5
            self.Highlight.OutlineTransparency = 0
            self.Highlight.Enabled = true
        elseif self.Highlight then
            self.Highlight.Enabled = false
        end
    end)
    if not ok then self:Hide() end
end

function PlayerESP:Hide()
    for _, d in pairs(self.Drawings) do d.Visible = false end
    if self.Highlight then self.Highlight.Enabled = false end
end

function PlayerESP:Destroy()
    self:Hide()
    for _, d in pairs(self.Drawings) do DrawingPool:Destroy(d) end
    if self.Highlight then self.Highlight:Destroy() end
end

-- ─── BOT / NPC ESP ─────────────────────────────────────────────
local BotESP = {}
BotESP.__index = BotESP

function BotESP.new(model)
    local self = setmetatable({}, BotESP)
    self.Model = model
    self.Drawings = {
        Box = DrawingPool:Create("Square"),
        BoxOutline = DrawingPool:Create("Square"),
        Name = DrawingPool:Create("Text"),
        Distance = DrawingPool:Create("Text"),
        Health = DrawingPool:Create("Text"),
        HealthBar = DrawingPool:Create("Square"),
        HealthBarOutline = DrawingPool:Create("Square"),
        Tracer = DrawingPool:Create("Line"),
    }
    return self
end

function BotESP:Update()
    local ok, err = pcall(function()
        if not self.Model or not self.Model.Parent then self:Hide(); return end
        
        local hum = self.Model:FindFirstChildOfClass("Humanoid")
        if not hum or hum.Health <= 0 then self:Hide(); return end
        
        local hrp = self.Model:FindFirstChild("HumanoidRootPart")
        if not hrp then self:Hide(); return end
        
        local topLeft, bottomRight = GetCharBounds(self.Model)
        if not topLeft then self:Hide(); return end
        
        local size = bottomRight - topLeft
        if size.X < 4 or size.Y < 4 then self:Hide(); return end
        
        local dist = Utils:GetDistance(hrp.Position)
        local color = Utils:ColorFromConfig("ESPBotColor")
        local botType = Utils:GetBotType(self.Model)
        
        -- Box
        if ConfigManager:Get("BotBoxESP") then
            self.Drawings.BoxOutline.Size = size + Vector2.new(2,2)
            self.Drawings.BoxOutline.Position = topLeft - Vector2.new(1,1)
            self.Drawings.BoxOutline.Visible = true
            self.Drawings.BoxOutline.Color = Color3.new(0,0,0)
            self.Drawings.BoxOutline.Thickness = 1
            self.Drawings.BoxOutline.Filled = false
            
            self.Drawings.Box.Size = size
            self.Drawings.Box.Position = topLeft
            self.Drawings.Box.Visible = true
            self.Drawings.Box.Color = color
            self.Drawings.Box.Thickness = 1
            self.Drawings.Box.Filled = false
        else
            self.Drawings.Box.Visible = false
            self.Drawings.BoxOutline.Visible = false
        end
        
        -- Name
        if ConfigManager:Get("BotNameESP") then
            self.Drawings.Name.Text = self.Model.Name .. " [" .. botType .. "]"
            self.Drawings.Name.Position = Vector2.new(topLeft.X + size.X/2, topLeft.Y - 16)
            self.Drawings.Name.Size = 12
            self.Drawings.Name.Center = true
            self.Drawings.Name.Visible = true
            self.Drawings.Name.Color = color
            self.Drawings.Name.Outline = true
        else
            self.Drawings.Name.Visible = false
        end
        
        -- Distance
        if ConfigManager:Get("BotDistanceESP") then
            self.Drawings.Distance.Text = Utils:FormatNumber(dist) .. "m"
            self.Drawings.Distance.Position = Vector2.new(topLeft.X + size.X/2, bottomRight.Y + 2)
            self.Drawings.Distance.Size = 11
            self.Drawings.Distance.Center = true
            self.Drawings.Distance.Visible = true
            self.Drawings.Distance.Color = Color3.new(1,1,1)
            self.Drawings.Distance.Outline = true
        else
            self.Drawings.Distance.Visible = false
        end
        
        -- HealthBar
        if ConfigManager:Get("BotHealthESP") then
            local pct = math.clamp(hum.Health / hum.MaxHealth, 0, 1)
            local barW = size.X
            local barH = 3
            local barPos = Vector2.new(topLeft.X, topLeft.Y - 8)
            
            self.Drawings.HealthBarOutline.Size = Vector2.new(barW+2, barH+2)
            self.Drawings.HealthBarOutline.Position = barPos - Vector2.new(1,1)
            self.Drawings.HealthBarOutline.Visible = true
            self.Drawings.HealthBarOutline.Color = Color3.new(0,0,0)
            self.Drawings.HealthBarOutline.Filled = true
            
            self.Drawings.HealthBar.Size = Vector2.new(barW * pct, barH)
            self.Drawings.HealthBar.Position = barPos
            self.Drawings.HealthBar.Visible = true
            self.Drawings.HealthBar.Color = Color3.fromRGB(255*(1-pct), 255*pct, 0)
            self.Drawings.HealthBar.Filled = true
            
            self.Drawings.Health.Text = Utils:FormatNumber(hum.Health) .. " HP"
            self.Drawings.Health.Position = Vector2.new(topLeft.X + size.X/2, topLeft.Y - 22)
            self.Drawings.Health.Size = 10
            self.Drawings.Health.Center = true
            self.Drawings.Health.Visible = true
            self.Drawings.Health.Color = Color3.fromRGB(255*(1-pct), 255*pct, 0)
            self.Drawings.Health.Outline = true
        else
            self.Drawings.Health.Visible = false
            self.Drawings.HealthBar.Visible = false
            self.Drawings.HealthBarOutline.Visible = false
        end
        
        -- Tracer
        if ConfigManager:Get("BotTracers") then
            local cam = GetCamera()
            if cam then
                self.Drawings.Tracer.From = Vector2.new(cam.ViewportSize.X/2, cam.ViewportSize.Y)
                self.Drawings.Tracer.To = Vector2.new(topLeft.X + size.X/2, topLeft.Y + size.Y/2)
                self.Drawings.Tracer.Visible = true
                self.Drawings.Tracer.Color = color
                self.Drawings.Tracer.Thickness = 1
            end
        else
            self.Drawings.Tracer.Visible = false
        end
    end)
    if not ok then self:Hide() end
end

function BotESP:Hide()
    for _, d in pairs(self.Drawings) do d.Visible = false end
end

function BotESP:Destroy()
    self:Hide()
    for _, d in pairs(self.Drawings) do DrawingPool:Destroy(d) end
end

-- ─── LOOT / CONTAINER ESP ──────────────────────────────────────
local LootESP = {}
LootESP.__index = LootESP

function LootESP.new(model)
    local self = setmetatable({}, LootESP)
    self.Model = model
    self.Drawings = {
        Name = DrawingPool:Create("Text"),
        Distance = DrawingPool:Create("Text"),
        Tracer = DrawingPool:Create("Line"),
    }
    return self
end

function LootESP:Update()
    local ok, err = pcall(function()
        if not self.Model or not self.Model.Parent then self:Hide(); return end
        
        local primary = self.Model:IsA("Model") and (self.Model.PrimaryPart or self.Model:FindFirstChildWhichIsA("BasePart")) or self.Model
        if not primary then primary = self.Model:FindFirstChildWhichIsA("BasePart") end
        if not primary then self:Hide(); return end
        
        local pos, onScreen = Utils:WorldToScreen(primary.Position)
        if not onScreen then self:Hide(); return end
        
        local dist = Utils:GetDistance(primary.Position)
        local color = Utils:ColorFromConfig("ESPLootColor")
        
        if ConfigManager:Get("LootNameESP") then
            self.Drawings.Name.Text = self.Model.Name
            self.Drawings.Name.Position = pos
            self.Drawings.Name.Size = 12
            self.Drawings.Name.Center = true
            self.Drawings.Name.Visible = true
            self.Drawings.Name.Color = color
            self.Drawings.Name.Outline = true
        else
            self.Drawings.Name.Visible = false
        end
        
        if ConfigManager:Get("LootDistanceESP") then
            self.Drawings.Distance.Text = Utils:FormatNumber(dist) .. "m"
            self.Drawings.Distance.Position = pos + Vector2.new(0, 14)
            self.Drawings.Distance.Size = 10
            self.Drawings.Distance.Center = true
            self.Drawings.Distance.Visible = true
            self.Drawings.Distance.Color = Color3.new(1,1,1)
            self.Drawings.Distance.Outline = true
        else
            self.Drawings.Distance.Visible = false
        end
        
        if ConfigManager:Get("LootTracers") then
            local cam = GetCamera()
            if cam then
                self.Drawings.Tracer.From = Vector2.new(cam.ViewportSize.X/2, cam.ViewportSize.Y)
                self.Drawings.Tracer.To = pos
                self.Drawings.Tracer.Visible = true
                self.Drawings.Tracer.Color = color
                self.Drawings.Tracer.Thickness = 1
            end
        else
            self.Drawings.Tracer.Visible = false
        end
    end)
    if not ok then self:Hide() end
end

function LootESP:Hide()
    for _, d in pairs(self.Drawings) do d.Visible = false end
end

function LootESP:Destroy()
    self:Hide()
    for _, d in pairs(self.Drawings) do DrawingPool:Destroy(d) end
end

-- ─── SIMPLE OBJECT ESP (Extractions, Airdrops, Bodies) ─────────
local SimpleESP = {}
SimpleESP.__index = SimpleESP

function SimpleESP.new(model, displayName, colorKey)
    local self = setmetatable({}, SimpleESP)
    self.Model = model
    self.DisplayName = displayName
    self.ColorKey = colorKey
    self.Drawings = {
        Name = DrawingPool:Create("Text"),
        Distance = DrawingPool:Create("Text"),
        Tracer = DrawingPool:Create("Line"),
    }
    return self
end

function SimpleESP:Update()
    local ok, err = pcall(function()
        if not self.Model or not self.Model.Parent then self:Hide(); return end
        
        local primary = self.Model:IsA("Model") and (self.Model.PrimaryPart or self.Model:FindFirstChildWhichIsA("BasePart")) or self.Model
        if not primary then primary = self.Model:FindFirstChildWhichIsA("BasePart") end
        if not primary then self:Hide(); return end
        
        local pos, onScreen = Utils:WorldToScreen(primary.Position)
        if not onScreen then self:Hide(); return end
        
        local dist = Utils:GetDistance(primary.Position)
        local color = Utils:ColorFromConfig(self.ColorKey)
        
        self.Drawings.Name.Text = self.DisplayName
        self.Drawings.Name.Position = pos
        self.Drawings.Name.Size = 12
        self.Drawings.Name.Center = true
        self.Drawings.Name.Visible = true
        self.Drawings.Name.Color = color
        self.Drawings.Name.Outline = true
        
        self.Drawings.Distance.Text = Utils:FormatNumber(dist) .. "m"
        self.Drawings.Distance.Position = pos + Vector2.new(0, 14)
        self.Drawings.Distance.Size = 10
        self.Drawings.Distance.Center = true
        self.Drawings.Distance.Visible = true
        self.Drawings.Distance.Color = Color3.new(1,1,1)
        self.Drawings.Distance.Outline = true
        
        local cam = GetCamera()
        if cam then
            self.Drawings.Tracer.From = Vector2.new(cam.ViewportSize.X/2, cam.ViewportSize.Y)
            self.Drawings.Tracer.To = pos
            self.Drawings.Tracer.Visible = true
            self.Drawings.Tracer.Color = color
            self.Drawings.Tracer.Thickness = 1
        end
    end)
    if not ok then self:Hide() end
end

function SimpleESP:Hide()
    for _, d in pairs(self.Drawings) do d.Visible = false end
end

function SimpleESP:Destroy()
    self:Hide()
    for _, d in pairs(self.Drawings) do DrawingPool:Destroy(d) end
end

-- ─── ESP MANAGER LOGIC ─────────────────────────────────────────
function ESPManager:Init()
    -- Player Tracking
    for _, plr in pairs(Players:GetPlayers()) do
        if plr ~= LocalPlayer then
            self.PlayerObjects[plr] = PlayerESP.new(plr)
        end
    end
    Players.PlayerAdded:Connect(function(plr)
        if plr ~= LocalPlayer then self.PlayerObjects[plr] = PlayerESP.new(plr) end
    end)
    Players.PlayerRemoving:Connect(function(plr)
        if self.PlayerObjects[plr] then
            self.PlayerObjects[plr]:Destroy()
            self.PlayerObjects[plr] = nil
        end
    end)
    
    -- Bot Tracking
    for _, bot in pairs(BOT_FOLDER:GetChildren()) do
        if bot:IsA("Model") then
            self.BotObjects[bot] = BotESP.new(bot)
        end
    end
    BOT_FOLDER.ChildAdded:Connect(function(bot)
        if bot:IsA("Model") then self.BotObjects[bot] = BotESP.new(bot) end
    end)
    BOT_FOLDER.ChildRemoved:Connect(function(bot)
        if self.BotObjects[bot] then
            self.BotObjects[bot]:Destroy()
            self.BotObjects[bot] = nil
        end
    end)
    
    -- Loot Tracking
    for _, item in pairs(CONTAINER_FOLDER:GetChildren()) do
        self.LootObjects[item] = LootESP.new(item)
    end
    CONTAINER_FOLDER.ChildAdded:Connect(function(item)
        self.LootObjects[item] = LootESP.new(item)
    end)
    CONTAINER_FOLDER.ChildRemoved:Connect(function(item)
        if self.LootObjects[item] then
            self.LootObjects[item]:Destroy()
            self.LootObjects[item] = nil
        end
    end)
    
    -- Main Loop
    ConnectionManager:Add("ESPMainLoop", RunService.RenderStepped:Connect(function()
        self:Update()
    end))
end

function ESPManager:Update()
    -- Players
    if ConfigManager:Get("PlayerESP") then
        for plr, esp in pairs(self.PlayerObjects) do
            esp:Update()
        end
    else
        for _, esp in pairs(self.PlayerObjects) do esp:Hide() end
    end
    
    -- Bots
    if ConfigManager:Get("BotESP") then
        for bot, esp in pairs(self.BotObjects) do
            if bot.Parent and bot:FindFirstChildOfClass("Humanoid") and bot:FindFirstChildOfClass("Humanoid").Health > 0 then
                esp:Update()
            else
                esp:Hide()
            end
        end
    else
        for _, esp in pairs(self.BotObjects) do esp:Hide() end
    end
    
    -- Loot
    if ConfigManager:Get("LootESP") then
        for item, esp in pairs(self.LootObjects) do
            if item.Parent then
                esp:Update()
            else
                esp:Hide()
            end
        end
    else
        for _, esp in pairs(self.LootObjects) do esp:Hide() end
    end
    
    -- Extractions
    if ConfigManager:Get("ExtractionESP") then
        for _, extract in pairs(EXTRACTION_FOLDER:GetChildren()) do
            if not self.OtherObjects[extract] then
                local name = ExtractionNames[extract.Name] or extract.Name
                self.OtherObjects[extract] = SimpleESP.new(extract, "[EXTRACT] " .. name, "ESPExtractionColor")
            end
            self.OtherObjects[extract]:Update()
        end
    end
    
    -- Airdrops
    if ConfigManager:Get("AirdropESP") then
        for _, drop in pairs(AIRDROP_FOLDER:GetChildren()) do
            if not self.OtherObjects[drop] then
                self.OtherObjects[drop] = SimpleESP.new(drop, "[AIRDROP] " .. drop.Name, "ESPAirdropColor")
            end
            self.OtherObjects[drop]:Update()
        end
    end
    
    -- Dead Bodies
    if ConfigManager:Get("DeadBodyESP") then
        for _, body in pairs(DEAD_BODIES_FOLDER:GetChildren()) do
            if not self.OtherObjects[body] then
                self.OtherObjects[body] = SimpleESP.new(body, "[BODY] " .. body.Name, "ESPDeadBodyColor")
            end
            self.OtherObjects[body]:Update()
        end
    end
    
    -- Cleanup destroyed other objects
    for model, esp in pairs(self.OtherObjects) do
        if not model.Parent then
            esp:Destroy()
            self.OtherObjects[model] = nil
        elseif not (ConfigManager:Get("ExtractionESP") and model.Parent == EXTRACTION_FOLDER)
           and not (ConfigManager:Get("AirdropESP") and model.Parent == AIRDROP_FOLDER)
           and not (ConfigManager:Get("DeadBodyESP") and model.Parent == DEAD_BODIES_FOLDER) then
            esp:Hide()
        end
    end
end

function ESPManager:ClearAll()
    for _, esp in pairs(self.PlayerObjects) do esp:Hide() end
    for _, esp in pairs(self.BotObjects) do esp:Hide() end
    for _, esp in pairs(self.LootObjects) do esp:Hide() end
    for _, esp in pairs(self.OtherObjects) do esp:Hide() end
end

-- ═══════════════════════════════════════════════════════════════
-- AIMBOT
-- ═══════════════════════════════════════════════════════════════
local Aimbot = {}
Aimbot.Locked = false
Aimbot.Target = nil
Aimbot.FOVCircle = nil

function Aimbot:Init()
    self.FOVCircle = DrawingPool:Create("Circle")
    self.FOVCircle.Filled = false
    self.FOVCircle.Thickness = 1.5
    self.FOVCircle.NumSides = 64
    self.FOVCircle.Color = Color3.new(1, 1, 1)
    
    ConnectionManager:Add("AimbotLoop", RunService.RenderStepped:Connect(function()
        self:Update()
    end))
    
    UserInputService.InputBegan:Connect(function(input, gp)
        if gp then return end
        if input.UserInputType == Enum.UserInputType.MouseButton2 then
            self.Locked = true
        end
    end)
    
    UserInputService.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton2 then
            self.Locked = false
            self.Target = nil
        end
    end)
end

function Aimbot:GetClosestHead()
    local closestHead = nil
    local closestDist = math.huge
    local cam = GetCamera()
    if not cam then return nil end
    
    local center = Vector2.new(cam.ViewportSize.X / 2, cam.ViewportSize.Y / 2)
    local fov = ConfigManager:Get("AimbotFOV")
    local maxDist = ConfigManager:Get("AimbotMaxDistance")
    local visCheck = ConfigManager:Get("AimbotVisibilityCheck")
    local targetBots = ConfigManager:Get("AimbotTargetBots")
    
    local myChar = LocalPlayer.Character
    local myRoot = myChar and myChar:FindFirstChild("HumanoidRootPart")
    
    -- Players
    for _, plr in pairs(Players:GetPlayers()) do
        if plr == LocalPlayer then continue end
        local char = Utils:GetCharacter(plr)
        if not char then continue end
        local head = char:FindFirstChild("Head")
        local hum = char:FindFirstChildOfClass("Humanoid")
        if not head or not hum or hum.Health <= 0 then continue end
        
        local dist3D = myRoot and (head.Position - myRoot.Position).Magnitude or 0
        if dist3D > maxDist then continue end
        
        local pos, onScreen = Utils:WorldToScreen(head.Position)
        if not onScreen then continue end
        
        local dist2D = (pos - center).Magnitude
        if dist2D > fov then continue end
        
        if visCheck then
            local rp = RaycastParams.new()
            rp.FilterType = Enum.RaycastFilterType.Blacklist
            rp.FilterDescendantsInstances = {cam, myChar}
            local res = Workspace:Raycast(cam.CFrame.Position, head.Position - cam.CFrame.Position, rp)
            if res and not res.Instance:IsDescendantOf(char) then continue end
        end
        
        if dist2D < closestDist then
            closestDist = dist2D
            closestHead = head
        end
    end
    
    -- Bots
    if targetBots then
        for _, bot in pairs(BOT_FOLDER:GetChildren()) do
            if not bot:IsA("Model") then continue end
            local head = bot:FindFirstChild("Head")
            local hum = bot:FindFirstChildOfClass("Humanoid")
            if not head or not hum or hum.Health <= 0 then continue end
            
            local dist3D = myRoot and (head.Position - myRoot.Position).Magnitude or 0
            if dist3D > maxDist then continue end
            
            local pos, onScreen = Utils:WorldToScreen(head.Position)
            if not onScreen then continue end
            
            local dist2D = (pos - center).Magnitude
            if dist2D > fov then continue end
            
            if visCheck then
                local rp = RaycastParams.new()
                rp.FilterType = Enum.RaycastFilterType.Blacklist
                rp.FilterDescendantsInstances = {cam, myChar}
                local res = Workspace:Raycast(cam.CFrame.Position, head.Position - cam.CFrame.Position, rp)
                if res and not res.Instance:IsDescendantOf(bot) then continue end
            end
            
            if dist2D < closestDist then
                closestDist = dist2D
                closestHead = head
            end
        end
    end
    
    return closestHead
end

function Aimbot:Update()
    local cam = GetCamera()
    if not cam then return end
    
    if ConfigManager:Get("AimbotShowFOV") and ConfigManager:Get("AimbotEnabled") then
        self.FOVCircle.Visible = true
        self.FOVCircle.Radius = ConfigManager:Get("AimbotFOV")
        self.FOVCircle.Position = Vector2.new(cam.ViewportSize.X / 2, cam.ViewportSize.Y / 2)
        self.FOVCircle.Color = self.Locked and Color3.fromRGB(0, 255, 0) or Color3.new(1, 1, 1)
    else
        self.FOVCircle.Visible = false
    end
    
    if not ConfigManager:Get("AimbotEnabled") or not self.Locked then return end
    
    local target = self.Target or self:GetClosestHead()
    if target and target.Parent then
        self.Target = target
        local smoothness = ConfigManager:Get("AimbotSmoothness")
        local alpha = math.clamp(1.1 - smoothness, 0.02, 1)
        cam.CFrame = cam.CFrame:Lerp(CFrame.new(cam.CFrame.Position, target.Position), alpha)
    else
        self.Target = nil
    end
end

-- ═══════════════════════════════════════════════════════════════
-- WORLD MODULE
-- ═══════════════════════════════════════════════════════════════
local WorldModule = {}

function WorldModule:Init()
    self.Original = {
        Brightness = Lighting.Brightness,
        ClockTime = Lighting.ClockTime,
        FogStart = Lighting.FogStart,
        FogEnd = Lighting.FogEnd,
        FogColor = Lighting.FogColor,
        GlobalShadows = Lighting.GlobalShadows,
        OutdoorAmbient = Lighting.OutdoorAmbient,
        Ambient = Lighting.Ambient,
    }
    
    ConnectionManager:Add("WorldLoop", RunService.Heartbeat:Connect(function()
        if ConfigManager:Get("FullBright") then
            Lighting.Brightness = 2
            Lighting.GlobalShadows = false
            Lighting.OutdoorAmbient = Color3.fromRGB(128, 128, 128)
            Lighting.Ambient = Color3.fromRGB(128, 128, 128)
        elseif not ConfigManager:Get("TimeChanger") then
            Lighting.Brightness = self.Original.Brightness
            Lighting.GlobalShadows = self.Original.GlobalShadows
            Lighting.OutdoorAmbient = self.Original.OutdoorAmbient
            Lighting.Ambient = self.Original.Ambient
        end
        
        if ConfigManager:Get("TimeChanger") then
            Lighting.ClockTime = ConfigManager:Get("CustomTime")
        elseif not ConfigManager:Get("FullBright") then
            Lighting.ClockTime = self.Original.ClockTime
        end
        
        if ConfigManager:Get("RemoveFog") then
            Lighting.FogStart = 0
            Lighting.FogEnd = 100000
            Lighting.FogColor = Color3.fromRGB(255, 255, 255)
        elseif not ConfigManager:Get("FullBright") then
            Lighting.FogStart = self.Original.FogStart
            Lighting.FogEnd = self.Original.FogEnd
            Lighting.FogColor = self.Original.FogColor
        end
        
        if ConfigManager:Get("WeatherToggle") and NATURE_FOLDER then
            for _, obj in pairs(NATURE_FOLDER:GetDescendants()) do
                if obj:IsA("ParticleEmitter") or obj:IsA("Beam") then obj.Enabled = false end
            end
        end
        
        if ConfigManager:Get("ShowInteractive") then
            for _, container in pairs(CONTAINER_FOLDER:GetChildren()) do
                if container:IsA("Model") and not container:FindFirstChild("DS_Highlight") then
                    local hl = Instance.new("Highlight")
                    hl.Name = "DS_Highlight"
                    hl.FillColor = Color3.fromRGB(255, 255, 0)
                    hl.OutlineColor = Color3.fromRGB(255, 255, 0)
                    hl.FillTransparency = 0.8
                    hl.OutlineTransparency = 0
                    hl.Parent = container
                end
            end
        else
            for _, container in pairs(CONTAINER_FOLDER:GetChildren()) do
                local hl = container:FindFirstChild("DS_Highlight")
                if hl then hl:Destroy() end
            end
        end
    end))
end

-- ═══════════════════════════════════════════════════════════════
-- MISC MODULE
-- ═══════════════════════════════════════════════════════════════
local MiscModule = {}

function MiscModule:Init()
    ConnectionManager:Add("FPSBoost", RunService.Heartbeat:Connect(function()
        if ConfigManager:Get("FPSBoost") then
            settings().Rendering.QualityLevel = 1
            for _, effect in pairs(Lighting:GetChildren()) do
                if effect:IsA("PostEffect") then effect.Enabled = false end
            end
        end
    end))
end

-- ═══════════════════════════════════════════════════════════════
-- RAYFIELD UI
-- ═══════════════════════════════════════════════════════════════
local RayfieldUI = {}

function RayfieldUI:Init()
    local ok, RayfieldLib = pcall(function()
        return loadstring(game:HttpGet("https://sirius.menu/rayfield"))()
    end)
    if not ok or not RayfieldLib then warn("[XCMEN] Rayfield failed"); return end
    
    self.Library = RayfieldLib
    
    local Window = RayfieldLib:CreateWindow({
        Name = "XCMEN HUB - DesertStorm",
        LoadingTitle = "XCMEN HUB",
        LoadingSubtitle = "DesertStorm [EXTRACTION]",
        ConfigurationSaving = { Enabled = false },
        Discord = { Enabled = false },
        KeySystem = false,
    })
    
    self.Window = Window
    self:CreateCombatTab()
    self:CreateESPTab()
    self:CreateNPCTab()
    self:CreateContainersTab()
    self:CreateWorldTab()
    self:CreateMiscTab()
    self:CreateSettingsTab()
    
    if ConfigManager:Get("Notifications") then
        RayfieldLib:Notify({
            Title = "XCMEN HUB",
            Content = "DesertStorm loaded! Press " .. ConfigManager:Get("GUIBind") .. " to toggle.",
            Duration = 5,
            Image = 4483362458,
        })
    end
end

function RayfieldUI:CreateCombatTab()
    local Tab = self.Window:CreateTab("Combat", 4483362458)
    
    Tab:CreateSection("Aimbot (Hold RMB)")
    
    Tab:CreateToggle({
        Name = "Enable Aimbot",
        CurrentValue = ConfigManager:Get("AimbotEnabled"),
        Flag = "AimbotEnabled",
        Callback = function(v) ConfigManager:Set("AimbotEnabled", v) end,
    })
    
    Tab:CreateSlider({
        Name = "Smoothness (0.1 = Strong / 1 = Weak)",
        Range = {0.1, 1}, Increment = 0.01,
        CurrentValue = ConfigManager:Get("AimbotSmoothness"),
        Flag = "AimbotSmoothness",
        Callback = function(v) ConfigManager:Set("AimbotSmoothness", v) end,
    })
    
    Tab:CreateSlider({
        Name = "FOV Radius", Range = {10, 500}, Increment = 5, Suffix = "px",
        CurrentValue = ConfigManager:Get("AimbotFOV"),
        Flag = "AimbotFOV",
        Callback = function(v) ConfigManager:Set("AimbotFOV", v) end,
    })
    
    Tab:CreateSlider({
        Name = "Max Distance", Range = {50, 3000}, Increment = 50, Suffix = "m",
        CurrentValue = ConfigManager:Get("AimbotMaxDistance"),
        Flag = "AimbotMaxDist",
        Callback = function(v) ConfigManager:Set("AimbotMaxDistance", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Target Bots too",
        CurrentValue = ConfigManager:Get("AimbotTargetBots"),
        Flag = "AimbotTargetBots",
        Callback = function(v) ConfigManager:Set("AimbotTargetBots", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Visibility Check",
        CurrentValue = ConfigManager:Get("AimbotVisibilityCheck"),
        Flag = "AimbotVisCheck",
        Callback = function(v) ConfigManager:Set("AimbotVisibilityCheck", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Show FOV Circle",
        CurrentValue = ConfigManager:Get("AimbotShowFOV"),
        Flag = "AimbotShowFOV",
        Callback = function(v) ConfigManager:Set("AimbotShowFOV", v) end,
    })
end

function RayfieldUI:CreateESPTab()
    local Tab = self.Window:CreateTab("ESP", 4483362458)
    
    Tab:CreateSection("Player ESP")
    
    Tab:CreateToggle({
        Name = "Enable Player ESP", CurrentValue = ConfigManager:Get("PlayerESP"), Flag = "PlayerESP",
        Callback = function(v) ConfigManager:Set("PlayerESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Box ESP", CurrentValue = ConfigManager:Get("BoxESP"), Flag = "BoxESP",
        Callback = function(v) ConfigManager:Set("BoxESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Name ESP", CurrentValue = ConfigManager:Get("NameESP"), Flag = "NameESP",
        Callback = function(v) ConfigManager:Set("NameESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Distance ESP", CurrentValue = ConfigManager:Get("DistanceESP"), Flag = "DistanceESP",
        Callback = function(v) ConfigManager:Set("DistanceESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Health ESP", CurrentValue = ConfigManager:Get("HealthESP"), Flag = "HealthESP",
        Callback = function(v) ConfigManager:Set("HealthESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Tracers", CurrentValue = ConfigManager:Get("Tracers"), Flag = "Tracers",
        Callback = function(v) ConfigManager:Set("Tracers", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Chams", CurrentValue = ConfigManager:Get("Chams"), Flag = "Chams",
        Callback = function(v) ConfigManager:Set("Chams", v) end,
    })
    
    Tab:CreateSection("Colors")
    
    Tab:CreateColorPicker({
        Name = "Enemy Color", Color = Utils:ColorFromConfig("ESPEnemyColor"), Flag = "EnemyColor",
        Callback = function(v)
            ConfigManager:Set("ESPEnemyColor", {R = math.floor(v.R*255), G = math.floor(v.G*255), B = math.floor(v.B*255)})
        end,
    })
end

function RayfieldUI:CreateNPCTab()
    local Tab = self.Window:CreateTab("NPC", 4483362458)
    
    Tab:CreateSection("Bot / NPC ESP")
    
    Tab:CreateToggle({
        Name = "Enable Bot ESP", CurrentValue = ConfigManager:Get("BotESP"), Flag = "BotESP",
        Callback = function(v) ConfigManager:Set("BotESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Box ESP", CurrentValue = ConfigManager:Get("BotBoxESP"), Flag = "BotBoxESP",
        Callback = function(v) ConfigManager:Set("BotBoxESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Name ESP", CurrentValue = ConfigManager:Get("BotNameESP"), Flag = "BotNameESP",
        Callback = function(v) ConfigManager:Set("BotNameESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Distance ESP", CurrentValue = ConfigManager:Get("BotDistanceESP"), Flag = "BotDistanceESP",
        Callback = function(v) ConfigManager:Set("BotDistanceESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Health ESP", CurrentValue = ConfigManager:Get("BotHealthESP"), Flag = "BotHealthESP",
        Callback = function(v) ConfigManager:Set("BotHealthESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Tracers", CurrentValue = ConfigManager:Get("BotTracers"), Flag = "BotTracers",
        Callback = function(v) ConfigManager:Set("BotTracers", v) end,
    })
    
    Tab:CreateSection("Colors")
    
    Tab:CreateColorPicker({
        Name = "Bot Color", Color = Utils:ColorFromConfig("ESPBotColor"), Flag = "BotColor",
        Callback = function(v)
            ConfigManager:Set("ESPBotColor", {R = math.floor(v.R*255), G = math.floor(v.G*255), B = math.floor(v.B*255)})
        end,
    })
end

function RayfieldUI:CreateContainersTab()
    local Tab = self.Window:CreateTab("Containers", 4483362458)
    
    Tab:CreateSection("Loot / Container ESP")
    
    Tab:CreateToggle({
        Name = "Enable Loot ESP", CurrentValue = ConfigManager:Get("LootESP"), Flag = "LootESP",
        Callback = function(v) ConfigManager:Set("LootESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Name ESP", CurrentValue = ConfigManager:Get("LootNameESP"), Flag = "LootNameESP",
        Callback = function(v) ConfigManager:Set("LootNameESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Distance ESP", CurrentValue = ConfigManager:Get("LootDistanceESP"), Flag = "LootDistanceESP",
        Callback = function(v) ConfigManager:Set("LootDistanceESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Tracers", CurrentValue = ConfigManager:Get("LootTracers"), Flag = "LootTracers",
        Callback = function(v) ConfigManager:Set("LootTracers", v) end,
    })
    
    Tab:CreateSection("Object ESP")
    
    Tab:CreateToggle({
        Name = "Extraction ESP", CurrentValue = ConfigManager:Get("ExtractionESP"), Flag = "ExtractionESP",
        Callback = function(v) ConfigManager:Set("ExtractionESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Airdrop ESP", CurrentValue = ConfigManager:Get("AirdropESP"), Flag = "AirdropESP",
        Callback = function(v) ConfigManager:Set("AirdropESP", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Dead Body ESP", CurrentValue = ConfigManager:Get("DeadBodyESP"), Flag = "DeadBodyESP",
        Callback = function(v) ConfigManager:Set("DeadBodyESP", v) end,
    })
    
    Tab:CreateSection("Colors")
    
    Tab:CreateColorPicker({
        Name = "Loot Color", Color = Utils:ColorFromConfig("ESPLootColor"), Flag = "LootColor",
        Callback = function(v)
            ConfigManager:Set("ESPLootColor", {R = math.floor(v.R*255), G = math.floor(v.G*255), B = math.floor(v.B*255)})
        end,
    })
    
    Tab:CreateColorPicker({
        Name = "Extraction Color", Color = Utils:ColorFromConfig("ESPExtractionColor"), Flag = "ExtractColor",
        Callback = function(v)
            ConfigManager:Set("ESPExtractionColor", {R = math.floor(v.R*255), G = math.floor(v.G*255), B = math.floor(v.B*255)})
        end,
    })
    
    Tab:CreateColorPicker({
        Name = "Airdrop Color", Color = Utils:ColorFromConfig("ESPAirdropColor"), Flag = "AirdropColor",
        Callback = function(v)
            ConfigManager:Set("ESPAirdropColor", {R = math.floor(v.R*255), G = math.floor(v.G*255), B = math.floor(v.B*255)})
        end,
    })
end

function RayfieldUI:CreateWorldTab()
    local Tab = self.Window:CreateTab("World", 4483362458)
    
    Tab:CreateSection("Lighting")
    
    Tab:CreateToggle({
        Name = "FullBright", CurrentValue = ConfigManager:Get("FullBright"), Flag = "FullBright",
        Callback = function(v) ConfigManager:Set("FullBright", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Time Changer", CurrentValue = ConfigManager:Get("TimeChanger"), Flag = "TimeChanger",
        Callback = function(v) ConfigManager:Set("TimeChanger", v) end,
    })
    
    Tab:CreateSlider({
        Name = "Custom Time", Range = {0, 24}, Increment = 0.5, Suffix = "hr",
        CurrentValue = ConfigManager:Get("CustomTime"), Flag = "CustomTime",
        Callback = function(v) ConfigManager:Set("CustomTime", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Remove Fog", CurrentValue = ConfigManager:Get("RemoveFog"), Flag = "RemoveFog",
        Callback = function(v) ConfigManager:Set("RemoveFog", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Weather Toggle", CurrentValue = ConfigManager:Get("WeatherToggle"), Flag = "WeatherToggle",
        Callback = function(v) ConfigManager:Set("WeatherToggle", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Show Interactive Objects", CurrentValue = ConfigManager:Get("ShowInteractive"), Flag = "ShowInteractive",
        Callback = function(v) ConfigManager:Set("ShowInteractive", v) end,
    })
end

function RayfieldUI:CreateMiscTab()
    local Tab = self.Window:CreateTab("Misc", 4483362458)
    
    Tab:CreateSection("Performance")
    
    Tab:CreateToggle({
        Name = "FPS Boost", CurrentValue = ConfigManager:Get("FPSBoost"), Flag = "FPSBoost",
        Callback = function(v) ConfigManager:Set("FPSBoost", v) end,
    })
    
    Tab:CreateSection("Teleport (Tween)")
    
    for _, extract in pairs(EXTRACTION_FOLDER:GetChildren()) do
        local name = ExtractionNames[extract.Name] or extract.Name
        Tab:CreateButton({
            Name = "TP: " .. name,
            Callback = function()
                pcall(function()
                    if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                        local primary = extract:IsA("Model") and (extract.PrimaryPart or extract:FindFirstChildWhichIsA("BasePart")) or extract
                        if primary then
                            local root = LocalPlayer.Character.HumanoidRootPart
                            TweenService:Create(root, TweenInfo.new(1.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
                                CFrame = primary.CFrame + Vector3.new(0, 5, 0)
                            }):Play()
                        end
                    end
                end)
            end,
        })
    end
    
    Tab:CreateSection("Server")
    
    Tab:CreateButton({
        Name = "Rejoin Server",
        Callback = function()
            pcall(function() TeleportService:Teleport(game.PlaceId, LocalPlayer) end)
        end,
    })
    
    Tab:CreateButton({
        Name = "Server Hop",
        Callback = function()
            pcall(function()
                local servers = game.HttpService:JSONDecode(game:HttpGet("https://games.roblox.com/v1/games/" .. game.PlaceId .. "/servers/Public?sortOrder=Asc&limit=100"))
                for _, s in pairs(servers.data) do
                    if s.playing < s.maxPlayers and s.id ~= game.JobId then
                        TeleportService:TeleportToPlaceInstance(game.PlaceId, s.id, LocalPlayer)
                        break
                    end
                end
            end)
        end,
    })
    
    Tab:CreateButton({
        Name = "Copy JobId", Callback = function() Utils:CopyToClipboard(game.JobId) end,
    })
    
    Tab:CreateButton({
        Name = "Copy PlaceId", Callback = function() Utils:CopyToClipboard(tostring(game.PlaceId)) end,
    })
end

function RayfieldUI:CreateSettingsTab()
    local Tab = self.Window:CreateTab("Settings", 4483362458)
    
    Tab:CreateSection("Config")
    
    Tab:CreateButton({
        Name = "Save Config",
        Callback = function()
            ConfigManager:Save()
            if ConfigManager:Get("Notifications") then
                self.Library:Notify({Title = "Saved", Content = "Config saved.", Duration = 3})
            end
        end,
    })
    
    Tab:CreateButton({
        Name = "Load Config",
        Callback = function()
            ConfigManager:Load()
            if ConfigManager:Get("Notifications") then
                self.Library:Notify({Title = "Loaded", Content = "Config loaded.", Duration = 3})
            end
        end,
    })
    
    Tab:CreateButton({
        Name = "Reset Config",
        Callback = function()
            ConfigManager:Reset()
            if ConfigManager:Get("Notifications") then
                self.Library:Notify({Title = "Reset", Content = "Defaults restored.", Duration = 3})
            end
        end,
    })
    
    Tab:CreateToggle({
        Name = "Auto Save", CurrentValue = ConfigManager.AutoSaveEnabled, Flag = "AutoSave",
        Callback = function(v) ConfigManager.AutoSaveEnabled = v end,
    })
    
    Tab:CreateSection("UI")
    
    Tab:CreateDropdown({
        Name = "Theme", Options = {"Default", "Ocean", "Midnight", "Sentinel", "Synapse", "Serpent"},
        CurrentOption = ConfigManager:Get("Theme"), Flag = "Theme",
        Callback = function(v) ConfigManager:Set("Theme", v) end,
    })
    
    Tab:CreateToggle({
        Name = "Notifications", CurrentValue = ConfigManager:Get("Notifications"), Flag = "Notifications",
        Callback = function(v) ConfigManager:Set("Notifications", v) end,
    })
    
    Tab:CreateKeybind({
        Name = "GUI Toggle", CurrentKeybind = ConfigManager:Get("GUIBind"), HoldToInteract = false, Flag = "GUIBind",
        Callback = function(k) ConfigManager:Set("GUIBind", tostring(k)) end,
    })
    
    Tab:CreateSection("Danger Zone")
    
    Tab:CreateButton({
        Name = "Destroy GUI",
        Callback = function()
            ConnectionManager:Clear()
            ESPManager:ClearAll()
            self.Library:Destroy()
        end,
    })
end

-- ═══════════════════════════════════════════════════════════════
-- BOOTSTRAP
-- ═══════════════════════════════════════════════════════════════
local function Bootstrap()
    ConfigManager:Init()
    ESPManager:Init()
    Aimbot:Init()
    WorldModule:Init()
    MiscModule:Init()
    RayfieldUI:Init()
    print("[XCMEN HUB] DesertStorm loaded!")
end

local ok, err = pcall(Bootstrap)
if not ok then
    warn("[XCMEN HUB] Error: " .. tostring(err))
end
Verified Executor Compatibility
Synapse X KRNL Xeno Keyless / No Key System

Features of XCMEN HUB - DESERTSTORM (AI/WHOLE CODE for you ♥️) U CAN EXPAND IT Script

The XCMEN HUB - DESERTSTORM (AI/WHOLE CODE for you ♥️) U CAN EXPAND IT script is an optimized Lua execution payload designed for Roblox players. Built to minimize FPS drops and prevent crashes, it provides essential automated functions:

  • Auto Farm & Level Grinding: Automatically cycles quests and mobs with efficient positioning algorithms.
  • Aimbot & ESP: Accurate enemy targeting and wall visibility for items, chests and players.
  • Teleportation: Seamless movement across game checkpoints, safe zones and dungeons.
  • Direct Keyless Loadstring: Executes directly without third-party key verification links.

How to Execute This Script on Mobile & PC

Follow these steps depending on your platform:

Mobile (Android / iOS)

  1. Install Arceus X NEO or Delta Mobile.
  2. Launch the game inside the executor environment.
  3. Open the floating executor console.
  4. Paste the Lua script copied from above.
  5. Click Execute.

PC (Windows)

  1. Launch your PC exploit (such as Synapse X, KRNL, or Xeno).
  2. Join the Roblox game server.
  3. Click Inject / Attach.
  4. Paste the copied script into the script tab.
  5. Press Execute to run the menu.

Frequently Asked Questions (FAQ)

Is the XCMEN HUB - DESERTSTORM (AI/WHOLE CODE for you ♥️) U CAN EXPAND IT script free and keyless?

Yes, this script payload is verified to be 100% free and keyless without linkvertise checkpoints.

Which executors support this script?

Compatible with Synapse X, Delta, Arceus X, Synapse X, KRNL, Fluxus and Xeno.

How do I execute this script safely?

Copy the script payload using the Copy button above, launch your Roblox executor on PC or Mobile, attach to the game client, paste the payload into the editor, and press Execute.

Related & Recommended Scripts