Seeker vs Hider Script (November 2026) – Taph Hub

PUBLISHEDUPDATED
1 Available ScriptFree

Staying ahead of other players in Seeker vs Hider is pretty tough when everyone is running around trying to survive, so grabbing a Seeker vs Hider script is a solid move.

You basically pick a side in the deadliest round of hide and seek on Roblox. Hiders need to stay out of sight until the timer runs out, and then turn the tables to take down the Seeker. Meanwhile, the Seeker has to hunt everyone down before time expires, or face the survival phase themselves. You will spend a lot of time crouching, aiming, and reloading while dodging danger.

If you want to check out the currently working code for this game, just scroll down to the section below and copy it.

Seeker vs Hider Script – Taph Hub

Taph HubFree
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UserInputService = game:GetService("UserInputService")
local TeleportService = game:GetService("TeleportService")
local MarketplaceService = game:GetService("MarketplaceService")
local HttpService = game:GetService("HttpService")
local Lighting = game:GetService("Lighting")
local Stats = game:GetService("Stats")
local TweenService = game:GetService("TweenService")
local CoreGui = game:GetService("CoreGui")

local function create(className: string, props: {[string]: any}, children: {Instance}?): any
    local inst = Instance.new(className)
    for k, v in pairs(props) do
        if k ~= "Parent" then
            (inst :: any)[k] = v
        end
    end
    if children then
        for _, child in ipairs(children) do
            child.Parent = inst
        end
    end
    if props.Parent then
        inst.Parent = props.Parent
    end
    return inst
end

if game.PlaceId ~= 18336470541 then
    local guiParent = (gethui and gethui()) or CoreGui
    local oldGuard = guiParent:FindFirstChild("AirFlow_TaphHub_Guard")
    if oldGuard then
        oldGuard:Destroy()
    end

    local GuardGui = create("ScreenGui", {
        Name = "AirFlow_TaphHub_Guard",
        ResetOnSpawn = false,
        IgnoreGuiInset = true,
        ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
        DisplayOrder = 999,
        Parent = guiParent
    })

    local gStroke = create("UIStroke", {
        Color = Color3.fromRGB(220, 55, 55),
        Thickness = 1.3,
        Transparency = 0.15
    })

    local gTitle = create("TextLabel", {
        Size = UDim2.new(1, -24, 0, 20),
        Position = UDim2.new(0, 12, 0, 8),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamBold,
        TextSize = 13,
        TextColor3 = Color3.fromRGB(220, 55, 55),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "Taph Hub Guard",
        ZIndex = 1001
    })

    local gDesc = create("TextLabel", {
        Size = UDim2.new(1, -24, 0, 36),
        Position = UDim2.new(0, 12, 0, 28),
        BackgroundTransparency = 1,
        Font = Enum.Font.Gotham,
        TextSize = 11,
        TextWrapped = true,
        TextColor3 = Color3.fromRGB(225, 235, 228),
        TextXAlignment = Enum.TextXAlignment.Left,
        TextYAlignment = Enum.TextYAlignment.Top,
        Text = "You cannot execute this script in this game, you can\nexecute only in Seeker vs Hider, bro.",
        ZIndex = 1001
    })

    local gFrame = create("Frame", {
        Size = UDim2.new(0, 320, 0, 72),
        Position = UDim2.new(1, -335, 1, -92),
        BackgroundColor3 = Color3.fromRGB(16, 22, 18),
        BorderSizePixel = 0,
        ZIndex = 1000,
        Parent = GuardGui
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 8) }),
        gStroke,
        gTitle,
        gDesc
    })

    task.delay(5, function()
        if gFrame and gFrame.Parent then
            local tw = TweenService:Create(gFrame, TweenInfo.new(0.3), { BackgroundTransparency = 1 })
            TweenService:Create(gTitle, TweenInfo.new(0.3), { TextTransparency = 1 }):Play()
            TweenService:Create(gDesc, TweenInfo.new(0.3), { TextTransparency = 1 }):Play()
            TweenService:Create(gStroke, TweenInfo.new(0.3), { Transparency = 1 }):Play()
            tw:Play()
            tw.Completed:Wait()
            if GuardGui then
                GuardGui:Destroy()
            end
        end
    end)

    return
end

local LocalPlayer = Players.LocalPlayer
local Camera = workspace.CurrentCamera

local disableAnimations = false
local currentTheme = "Black"
local themeUpdaters: {() -> ()} = {}

local function playTween(instance: Instance, duration: number, props: {[string]: any})
    if disableAnimations or duration <= 0 then
        for k, v in pairs(props) do
            (instance :: any)[k] = v
        end
    else
        TweenService:Create(instance, TweenInfo.new(duration), props):Play()
    end
end

local function makeDraggable(frame: GuiObject, handle: GuiObject?)
    local dragTarget = handle or frame
    local dragging = false
    local dragInput: InputObject? = nil
    local dragStart = Vector3.zero
    local startPos = UDim2.new()

    dragTarget.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then
            dragging = true
            dragStart = input.Position
            startPos = frame.Position
            input.Changed:Connect(function()
                if input.UserInputState == Enum.UserInputState.End then
                    dragging = false
                end
            end)
        end
    end)

    dragTarget.InputChanged:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseMovement then
            dragInput = input
        end
    end)

    UserInputService.InputChanged:Connect(function(input)
        if input == dragInput and dragging 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

local ConfigValues: {[string]: any} = {}
local ConfigSetters: {[string]: (any, boolean?) -> ()} = {}
local saveFunctionsEnabled = false
local suppressConfigSave = false

local FolderName = "TaphHub_Configs"
local AutoSaveFile = FolderName .. "/_autosave.json"
local AutoLoadMetaFile = FolderName .. "/_autoload.txt"
local memoryConfigs: {[string]: string} = {}

local function ensureFolder()
    pcall(function()
        if isfolder and makefolder and not isfolder(FolderName) then
            makefolder(FolderName)
        end
    end)
end
ensureFolder()

local function writeTextFile(path: string, data: string)
    ensureFolder()
    local ok = pcall(function()
        if writefile then
            writefile(path, data)
        else
            memoryConfigs[path] = data
        end
    end)
    if not ok then
        memoryConfigs[path] = data
    end
end

local function readTextFile(path: string): string?
    local result: string? = nil
    pcall(function()
        if isfile and readfile and isfile(path) then
            result = readfile(path)
        elseif memoryConfigs[path] then
            result = memoryConfigs[path]
        end
    end)
    return result
end

local function removeTextFile(path: string)
    pcall(function()
        if isfile and delfile and isfile(path) then
            delfile(path)
        end
        memoryConfigs[path] = nil
    end)
end

local function listConfigNames(): {string}
    ensureFolder()
    local names: {string} = {}
    local seen: {[string]: boolean} = {}

    pcall(function()
        if listfiles then
            for _, file in ipairs(listfiles(FolderName)) do
                local clean = string.gsub(file, "\\", "/")
                local base = string.match(clean, "([^/]+)%.json$")
                if base and base ~= "_autosave" and not seen[base] then
                    seen[base] = true
                    table.insert(names, base)
                end
            end
        end
    end)

    for path in pairs(memoryConfigs) do
        local base = string.match(path, "^" .. FolderName .. "/([^/]+)%.json$")
        if base and base ~= "_autosave" and not seen[base] then
            seen[base] = true
            table.insert(names, base)
        end
    end

    table.sort(names)
    return names
end

local function serializeCurrentConfig(): string
    local ok, encoded = pcall(function()
        return HttpService:JSONEncode(ConfigValues)
    end)
    return (ok and encoded) or "{}"
end

local function triggerAutoSave()
    if suppressConfigSave or not saveFunctionsEnabled then
        return
    end
    writeTextFile(AutoSaveFile, serializeCurrentConfig())
end

local function applyConfigJson(rawJson: string)
    local ok, decoded = pcall(function()
        return HttpService:JSONDecode(rawJson)
    end)
    if not ok or type(decoded) ~= "table" then
        return
    end
    suppressConfigSave = true
    for k, v in pairs(decoded) do
        ConfigValues[k] = v
        local setter = ConfigSetters[k]
        if setter then
            pcall(setter, v, true)
        end
    end
    suppressConfigSave = false
    if saveFunctionsEnabled then
        writeTextFile(AutoSaveFile, serializeCurrentConfig())
    end
end

local LucideIcons: {[string]: any} = {}
pcall(function()
    local loaded = loadstring(game:HttpGet("https://raw.githubusercontent.com/Footagesus/Icons/refs/heads/main/lucide/dist/Icons.lua"))()
    if type(loaded) == "table" then
        LucideIcons = loaded
    end
end)

local FallbackIcons: {[string]: string} = {
    ["home"] = "rbxassetid://10723407389",
    ["house"] = "rbxassetid://10723407389",
    ["user"] = "rbxassetid://10747373176",
    ["eye"] = "rbxassetid://10723346959",
    ["crosshair"] = "rbxassetid://10709790948",
    ["gamepad-2"] = "rbxassetid://10723395457",
    ["settings"] = "rbxassetid://10734950309"
}

local function applyIcon(imageLabel: ImageLabel, iconName: string)
    local keys = (iconName == "home") and {"house", "home"} or {iconName}
    local found: any = nil

    for _, k in ipairs(keys) do
        local direct = rawget(LucideIcons, k)
        if direct ~= nil then
            found = direct
            break
        end
        local subTable = rawget(LucideIcons, "icons") or rawget(LucideIcons, "Icons")
        if type(subTable) == "table" then
            local nested = rawget(subTable, k)
            if nested ~= nil then
                found = nested
                break
            end
        end
    end

    if type(found) == "string" and #found > 0 then
        imageLabel.Image = (string.find(found, "rbxassetid://") or string.find(found, "http")) and found or ("rbxassetid://" .. found)
        return
    elseif type(found) == "number" then
        imageLabel.Image = "rbxassetid://" .. tostring(found)
        return
    elseif type(found) == "table" then
        local img = rawget(found, "Image") or rawget(found, "image") or rawget(found, "id")
        local rSize = rawget(found, "ImageRectSize") or rawget(found, "imageRectSize")
        local rOff = rawget(found, "ImageRectOffset") or rawget(found, "imageRectOffset")
        if type(img) == "string" then
            imageLabel.Image = string.find(img, "rbxassetid://") and img or ("rbxassetid://" .. img)
        elseif type(img) == "number" then
            imageLabel.Image = "rbxassetid://" .. tostring(img)
        end
        if typeof(rSize) == "Vector2" then imageLabel.ImageRectSize = rSize end
        if typeof(rOff) == "Vector2" then imageLabel.ImageRectOffset = rOff end
        return
    end

    imageLabel.Image = FallbackIcons[iconName] or "rbxassetid://10723407389"
end

local placeName = "Seeker vs Hider"
local creatorName = "Unknown"
pcall(function()
    local info = MarketplaceService:GetProductInfo(game.PlaceId)
    if info and info.Name then placeName = info.Name end
    if info and info.Creator and info.Creator.Name then creatorName = info.Creator.Name end
end)

local weaponNames: {[string]: boolean} = {}
task.spawn(function()
    local sph = ReplicatedStorage:WaitForChild("SPH_Assets", 10)
    local wm = sph and sph:WaitForChild("WeaponModels", 10)
    if wm then
        for _, child in ipairs(wm:GetChildren()) do weaponNames[child.Name] = true end
        wm.ChildAdded:Connect(function(child) weaponNames[child.Name] = true end)
        wm.ChildRemoved:Connect(function(child) weaponNames[child.Name] = nil end)
    end
end)

local lobbyObjects: {Instance} = {}
local function scanLobby()
    table.clear(lobbyObjects)
    for _, obj in ipairs(workspace:GetDescendants()) do
        if string.lower(obj.Name) == "lobby" and (obj:IsA("Model") or obj:IsA("BasePart") or obj:IsA("Folder")) then
            table.insert(lobbyObjects, obj)
        end
    end
end
scanLobby()

workspace.DescendantAdded:Connect(function(obj)
    if string.lower(obj.Name) == "lobby" and (obj:IsA("Model") or obj:IsA("BasePart") or obj:IsA("Folder")) then
        table.insert(lobbyObjects, obj)
    end
end)

local lobbyRayParams = RaycastParams.new()
lobbyRayParams.FilterType = Enum.RaycastFilterType.Exclude
lobbyRayParams.IgnoreWater = true

local function isInLobby(player: Player): boolean
    local char = player.Character
    if not char then return false end
    local hrp = char:FindFirstChild("HumanoidRootPart") :: BasePart?
    if not hrp then return false end

    for _, lob in ipairs(lobbyObjects) do
        if lob and lob.Parent then
            if char:IsDescendantOf(lob) then return true end
            if lob:IsA("Model") then
                local ok, cf, size = pcall(function() return lob:GetBoundingBox() end)
                if ok and cf and size then
                    local rel = cf:PointToObjectSpace(hrp.Position)
                    local half = (size / 2) + Vector3.new(10, 35, 10)
                    if math.abs(rel.X) <= half.X and math.abs(rel.Y) <= half.Y and math.abs(rel.Z) <= half.Z then
                        return true
                    end
                end
            elseif lob:IsA("BasePart") then
                local rel = lob.CFrame:PointToObjectSpace(hrp.Position)
                local half = (lob.Size / 2) + Vector3.new(10, 45, 10)
                if math.abs(rel.X) <= half.X and math.abs(rel.Y) <= half.Y and math.abs(rel.Z) <= half.Z then
                    return true
                end
            end
        end
    end

    lobbyRayParams.FilterDescendantsInstances = { char }
    local hit = workspace:Raycast(hrp.Position, Vector3.new(0, -120, 0), lobbyRayParams)
    if hit and hit.Instance then
        local curr: Instance? = hit.Instance
        while curr and curr ~= workspace do
            if string.lower(curr.Name) == "lobby" then return true end
            curr = curr.Parent
        end
    end

    return false
end

local function hasGun(player: Player): boolean
    local char = player.Character
    if char then
        for _, item in ipairs(char:GetChildren()) do
            if weaponNames[item.Name] or (item:IsA("Tool") and item:FindFirstChild("Mode")) then
                return true
            end
        end
    end
    local backpack = player:FindFirstChildOfClass("Backpack")
    if backpack then
        for _, item in ipairs(backpack:GetChildren()) do
            if weaponNames[item.Name] or (item:IsA("Tool") and item:FindFirstChild("Mode")) then
                return true
            end
        end
    end
    return false
end

local function getRoleColor(player: Player): Color3
    if isInLobby(player) then return Color3.fromRGB(160, 160, 160) end
    if hasGun(player) then return Color3.fromRGB(220, 55, 55) end
    return Color3.fromRGB(55, 135, 255)
end

local function registerThemedElement(fn: () -> ())
    table.insert(themeUpdaters, fn)
    fn()
end

local function applyThemeAll()
    for _, fn in ipairs(themeUpdaters) do
        pcall(fn)
    end
end

local AirFlow = {}

function AirFlow:CreateWindow(config)
    local WindowObj = {}
    local guiParent = (gethui and gethui()) or CoreGui

    local old = guiParent:FindFirstChild("AirFlow_TaphHub")
    if old then old:Destroy() end

    local ScreenGui = create("ScreenGui", {
        Name = "AirFlow_TaphHub",
        ResetOnSpawn = false,
        IgnoreGuiInset = true,
        ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
        DisplayOrder = 100,
        Parent = guiParent
    })

    function WindowObj:GetScreenGui()
        return ScreenGui
    end

    local NotifyContainer = create("Frame", {
        Name = "Notifications",
        Size = UDim2.new(0, 310, 1, -40),
        Position = UDim2.new(1, -325, 0, 20),
        BackgroundTransparency = 1,
        ZIndex = 300,
        Parent = ScreenGui
    }, {
        create("UIListLayout", {
            SortOrder = Enum.SortOrder.LayoutOrder,
            VerticalAlignment = Enum.VerticalAlignment.Bottom,
            Padding = UDim.new(0, 8)
        })
    })

    function WindowObj:Notify(nConfig)
        local isWhite = (currentTheme == "White")
        local nStroke = create("UIStroke", {
            Color = Color3.fromRGB(46, 213, 115),
            Thickness = 1.2,
            Transparency = 0.2
        })
        local nTitle = create("TextLabel", {
            Size = UDim2.new(1, -24, 0, 20),
            Position = UDim2.new(0, 12, 0, 7),
            BackgroundTransparency = 1,
            Font = Enum.Font.GothamBold,
            TextSize = 13,
            TextColor3 = Color3.fromRGB(46, 213, 115),
            TextXAlignment = Enum.TextXAlignment.Left,
            Text = nConfig.Title or "Taph Hub",
            ZIndex = 302
        })
        local nDesc = create("TextLabel", {
            Size = UDim2.new(1, -24, 0, 30),
            Position = UDim2.new(0, 12, 0, 27),
            BackgroundTransparency = 1,
            Font = Enum.Font.Gotham,
            TextSize = 11,
            TextWrapped = true,
            TextColor3 = isWhite and Color3.fromRGB(40, 48, 44) or Color3.fromRGB(220, 230, 225),
            TextXAlignment = Enum.TextXAlignment.Left,
            Text = nConfig.Description or "",
            ZIndex = 302
        })
        local nFrame = create("Frame", {
            Size = UDim2.new(1, 0, 0, 64),
            BackgroundColor3 = isWhite and Color3.fromRGB(245, 248, 246) or Color3.fromRGB(16, 22, 18),
            BorderSizePixel = 0,
            ZIndex = 301,
            Parent = NotifyContainer
        }, {
            create("UICorner", { CornerRadius = UDim.new(0, 8) }),
            nStroke,
            nTitle,
            nDesc
        })

        task.delay(nConfig.Duration or 2.8, function()
            if nFrame and nFrame.Parent then
                if disableAnimations then
                    nFrame:Destroy()
                else
                    local tw = TweenService:Create(nFrame, TweenInfo.new(0.25), { BackgroundTransparency = 1 })
                    TweenService:Create(nTitle, TweenInfo.new(0.25), { TextTransparency = 1 }):Play()
                    TweenService:Create(nDesc, TweenInfo.new(0.25), { TextTransparency = 1 }):Play()
                    TweenService:Create(nStroke, TweenInfo.new(0.25), { Transparency = 1 }):Play()
                    tw:Play()
                    tw.Completed:Wait()
                    if nFrame then nFrame:Destroy() end
                end
            end
        end)
    end

    local MainStroke = create("UIStroke", { Color = Color3.fromRGB(28, 38, 32), Thickness = 1.2 })
    local MainFrame = create("Frame", {
        Name = "MainFrame",
        Size = UDim2.new(0, 740, 0, 500),
        Position = UDim2.new(0.5, -370, 0.5, -250),
        BackgroundColor3 = Color3.fromRGB(11, 14, 12),
        BorderSizePixel = 0,
        Parent = ScreenGui
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 12) }),
        MainStroke
    })

    local SidebarDivider = create("Frame", {
        Size = UDim2.new(0, 1, 1, 0),
        Position = UDim2.new(1, -1, 0, 0),
        BackgroundColor3 = Color3.fromRGB(26, 36, 30),
        BorderSizePixel = 0
    })
    local HubTitleLbl = create("TextLabel", {
        Size = UDim2.new(1, -28, 0, 48),
        Position = UDim2.new(0, 16, 0, 6),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamBold,
        TextSize = 18,
        TextColor3 = Color3.fromRGB(240, 245, 242),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = config.Title or "Taph Hub"
    })
    local Sidebar = create("Frame", {
        Name = "Sidebar",
        Size = UDim2.new(0, 200, 1, 0),
        BackgroundColor3 = Color3.fromRGB(14, 18, 15),
        BorderSizePixel = 0,
        Parent = MainFrame
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 12) }),
        SidebarDivider,
        HubTitleLbl
    })

    makeDraggable(MainFrame, Sidebar)

    local TabContainer = create("Frame", {
        Size = UDim2.new(1, -20, 1, -135),
        Position = UDim2.new(0, 10, 0, 56),
        BackgroundTransparency = 1,
        Parent = Sidebar
    }, {
        create("UIListLayout", { SortOrder = Enum.SortOrder.LayoutOrder, Padding = UDim.new(0, 6) })
    })

    local AvatarHead = create("ImageLabel", {
        Size = UDim2.new(0, 42, 0, 42),
        Position = UDim2.new(0, 8, 0.5, -21),
        BackgroundColor3 = Color3.fromRGB(24, 32, 28),
        BorderSizePixel = 0
    }, {
        create("UICorner", { CornerRadius = UDim.new(1, 0) })
    })

    task.spawn(function()
        local ok, content = pcall(function()
            return Players:GetUserThumbnailAsync(LocalPlayer.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size150x150)
        end)
        if ok and content then AvatarHead.Image = content end
    end)

    local BPStroke = create("UIStroke", { Color = Color3.fromRGB(30, 42, 34), Thickness = 1 })
    local BPUserLbl = create("TextLabel", {
        Size = UDim2.new(1, -60, 0, 20),
        Position = UDim2.new(0, 56, 0, 11),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamBold,
        TextSize = 11,
        TextColor3 = Color3.fromRGB(230, 238, 232),
        TextXAlignment = Enum.TextXAlignment.Left,
        TextTruncate = Enum.TextTruncate.AtEnd,
        Text = "Username: " .. LocalPlayer.Name
    })
    local BPGameLbl = create("TextLabel", {
        Size = UDim2.new(1, -60, 0, 20),
        Position = UDim2.new(0, 56, 0, 31),
        BackgroundTransparency = 1,
        Font = Enum.Font.Gotham,
        TextSize = 11,
        TextColor3 = Color3.fromRGB(145, 165, 152),
        TextXAlignment = Enum.TextXAlignment.Left,
        TextTruncate = Enum.TextTruncate.AtEnd,
        Text = "Game: " .. placeName
    })
    local BottomProfile = create("Frame", {
        Name = "BottomProfile",
        Size = UDim2.new(1, -16, 0, 62),
        Position = UDim2.new(0, 8, 1, -70),
        BackgroundColor3 = Color3.fromRGB(18, 24, 20),
        BorderSizePixel = 0,
        Parent = Sidebar
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 9) }),
        BPStroke,
        AvatarHead,
        BPUserLbl,
        BPGameLbl
    })

    registerThemedElement(function()
        local w = (currentTheme == "White")
        MainFrame.BackgroundColor3 = w and Color3.fromRGB(242, 246, 243) or Color3.fromRGB(11, 14, 12)
        MainStroke.Color = w and Color3.fromRGB(205, 218, 210) or Color3.fromRGB(28, 38, 32)
        Sidebar.BackgroundColor3 = w and Color3.fromRGB(232, 238, 234) or Color3.fromRGB(14, 18, 15)
        SidebarDivider.BackgroundColor3 = w and Color3.fromRGB(205, 218, 210) or Color3.fromRGB(26, 36, 30)
        HubTitleLbl.TextColor3 = w and Color3.fromRGB(20, 28, 24) or Color3.fromRGB(240, 245, 242)
        BottomProfile.BackgroundColor3 = w and Color3.fromRGB(222, 230, 225) or Color3.fromRGB(18, 24, 20)
        BPStroke.Color = w and Color3.fromRGB(195, 210, 200) or Color3.fromRGB(30, 42, 34)
        BPUserLbl.TextColor3 = w and Color3.fromRGB(22, 30, 25) or Color3.fromRGB(230, 238, 232)
        BPGameLbl.TextColor3 = w and Color3.fromRGB(85, 102, 92) or Color3.fromRGB(145, 165, 152)
    end)

    local PagesHolder = create("Frame", {
        Name = "PagesHolder",
        Size = UDim2.new(1, -216, 1, -24),
        Position = UDim2.new(0, 208, 0, 12),
        BackgroundTransparency = 1,
        Parent = MainFrame
    })

    local toggleKey: Enum.KeyCode = config.ToggleKey or Enum.KeyCode.Y
    local listeningForToggleKey = false

    function WindowObj:SetToggleKey(newKey: Enum.KeyCode)
        toggleKey = newKey
    end
    function WindowObj:GetToggleKey(): Enum.KeyCode
        return toggleKey
    end
    function WindowObj:SetListeningToggleKey(state: boolean)
        listeningForToggleKey = state
    end

    UserInputService.InputBegan:Connect(function(input, gpe)
        if listeningForToggleKey then return end
        if not gpe and input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode == toggleKey then
            MainFrame.Visible = not MainFrame.Visible
            if not MainFrame.Visible then
                WindowObj:Notify({
                    Title = "Taph Hub",
                    Description = "The Interface closed, to open again interface (UI) you can click " .. toggleKey.Name .. ".",
                    Duration = 3.5
                })
            end
        end
    end)

    local tabs = {}
    local firstTab = true

    function WindowObj:AddTab(tConfig)
        local TabObj = {}
        local isSelected = firstTab

        local TB_Icon = create("ImageLabel", {
            Size = UDim2.new(0, 18, 0, 18),
            Position = UDim2.new(0, 12, 0.5, -9),
            BackgroundTransparency = 1
        })
        applyIcon(TB_Icon, tConfig.Icon or "home")

        local TB_Label = create("TextLabel", {
            Size = UDim2.new(1, -44, 1, 0),
            Position = UDim2.new(0, 38, 0, 0),
            BackgroundTransparency = 1,
            Font = Enum.Font.GothamMedium,
            TextSize = 13,
            TextXAlignment = Enum.TextXAlignment.Left,
            Text = tConfig.Name or "Tab"
        })

        local TabBtn = create("TextButton", {
            Size = UDim2.new(1, 0, 0, 36),
            BackgroundTransparency = isSelected and 0 or 1,
            BorderSizePixel = 0,
            Text = "",
            AutoButtonColor = false,
            Parent = TabContainer
        }, {
            create("UICorner", { CornerRadius = UDim.new(0, 8) }),
            TB_Icon,
            TB_Label
        })

        local Page = create("ScrollingFrame", {
            Size = UDim2.new(1, 0, 1, 0),
            BackgroundTransparency = 1,
            BorderSizePixel = 0,
            ScrollBarThickness = 3,
            ScrollBarImageColor3 = Color3.fromRGB(46, 213, 115),
            Visible = isSelected,
            CanvasSize = UDim2.new(0, 0, 0, 0),
            AutomaticCanvasSize = Enum.AutomaticSize.Y,
            Parent = PagesHolder
        }, {
            create("UIListLayout", { SortOrder = Enum.SortOrder.LayoutOrder, Padding = UDim.new(0, 10) }),
            create("UIPadding", {
                PaddingTop = UDim.new(0, 2),
                PaddingBottom = UDim.new(0, 10),
                PaddingLeft = UDim.new(0, 2),
                PaddingRight = UDim.new(0, 6)
            })
        })

        firstTab = false
        local tabEntry = { Button = TabBtn, Icon = TB_Icon, Label = TB_Label, Page = Page, Selected = isSelected }
        table.insert(tabs, tabEntry)

        local function refreshTabsVisual()
            local w = (currentTheme == "White")
            for _, item in ipairs(tabs) do
                item.Button.BackgroundColor3 = w and Color3.fromRGB(205, 228, 214) or Color3.fromRGB(22, 34, 27)
                item.Button.BackgroundTransparency = item.Selected and 0 or 1
                item.Icon.ImageColor3 = item.Selected and Color3.fromRGB(46, 213, 115) or (w and Color3.fromRGB(90, 105, 95) or Color3.fromRGB(150, 165, 155))
                item.Label.TextColor3 = item.Selected and (w and Color3.fromRGB(18, 26, 22) or Color3.fromRGB(240, 248, 242)) or (w and Color3.fromRGB(90, 105, 95) or Color3.fromRGB(150, 165, 155))
            end
        end
        registerThemedElement(refreshTabsVisual)

        TabBtn.MouseButton1Click:Connect(function()
            for _, item in ipairs(tabs) do
                item.Selected = false
                item.Page.Visible = false
            end
            tabEntry.Selected = true
            Page.Visible = true
            refreshTabsVisual()
        end)

        function TabObj:GetPage() return Page end

        function TabObj:AddCategory(catName)
            local CatObj = {}
            local ItemsContainer = create("Frame", {
                Size = UDim2.new(1, -24, 0, 0),
                Position = UDim2.new(0, 12, 0, 36),
                AutomaticSize = Enum.AutomaticSize.Y,
                BackgroundTransparency = 1
            }, {
                create("UIListLayout", { SortOrder = Enum.SortOrder.LayoutOrder, Padding = UDim.new(0, 8) })
            })

            local CatStroke = create("UIStroke", { Color = Color3.fromRGB(26, 38, 30), Thickness = 1 })
            local CatFrame = create("Frame", {
                Size = UDim2.new(1, 0, 0, 0),
                AutomaticSize = Enum.AutomaticSize.Y,
                BackgroundColor3 = Color3.fromRGB(15, 20, 17),
                BorderSizePixel = 0,
                Parent = Page
            }, {
                create("UICorner", { CornerRadius = UDim.new(0, 10) }),
                CatStroke,
                create("UIPadding", { PaddingBottom = UDim.new(0, 12) }),
                create("TextLabel", {
                    Size = UDim2.new(1, -24, 0, 28),
                    Position = UDim2.new(0, 12, 0, 6),
                    BackgroundTransparency = 1,
                    Font = Enum.Font.GothamBold,
                    TextSize = 13,
                    TextColor3 = Color3.fromRGB(46, 213, 115),
                    TextXAlignment = Enum.TextXAlignment.Left,
                    Text = catName
                }),
                ItemsContainer
            })

            registerThemedElement(function()
                local w = (currentTheme == "White")
                CatFrame.BackgroundColor3 = w and Color3.fromRGB(234, 240, 236) or Color3.fromRGB(15, 20, 17)
                CatStroke.Color = w and Color3.fromRGB(202, 215, 206) or Color3.fromRGB(26, 38, 30)
            end)

            function CatObj:GetContainer()
                return ItemsContainer
            end

            function CatObj:AddLabel(text)
                local Lbl = create("TextLabel", {
                    Size = UDim2.new(1, 0, 0, 22),
                    BackgroundTransparency = 1,
                    Font = Enum.Font.Gotham,
                    TextSize = 12,
                    TextXAlignment = Enum.TextXAlignment.Left,
                    TextWrapped = true,
                    Text = text,
                    Parent = ItemsContainer
                })
                registerThemedElement(function()
                    Lbl.TextColor3 = (currentTheme == "White") and Color3.fromRGB(45, 58, 50) or Color3.fromRGB(190, 202, 195)
                end)
                return Lbl
            end

            function CatObj:AddToggle(tgConfig)
                local state = tgConfig.Default or false
                local configKey = tgConfig.ConfigKey or (catName .. "_" .. tgConfig.Name)
                ConfigValues[configKey] = state

                local activeColor = Color3.fromRGB(46, 213, 115)
                local function getInactiveColor()
                    return (currentTheme == "White") and Color3.fromRGB(185, 198, 190) or Color3.fromRGB(38, 48, 42)
                end

                local Knob = create("Frame", {
                    Size = UDim2.new(0, 14, 0, 14),
                    Position = state and UDim2.new(1, -17, 0.5, -7) or UDim2.new(0, 3, 0.5, -7),
                    BackgroundColor3 = Color3.fromRGB(245, 250, 247),
                    BorderSizePixel = 0
                }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }) })

                local SwitchBg = create("TextButton", {
                    Size = UDim2.new(0, 40, 0, 20),
                    Position = UDim2.new(1, -50, 0.5, -10),
                    BackgroundColor3 = state and activeColor or getInactiveColor(),
                    BorderSizePixel = 0,
                    Text = "",
                    AutoButtonColor = false
                }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }), Knob })

                local TitleLbl = create("TextLabel", {
                    Size = UDim2.new(1, -110, 1, 0),
                    Position = UDim2.new(0, 10, 0, 0),
                    BackgroundTransparency = 1,
                    Font = Enum.Font.GothamMedium,
                    TextSize = 12,
                    TextXAlignment = Enum.TextXAlignment.Left,
                    Text = tgConfig.Name
                })

                local Row = create("Frame", {
                    Size = UDim2.new(1, 0, 0, 32),
                    BorderSizePixel = 0,
                    Parent = ItemsContainer
                }, {
                    create("UICorner", { CornerRadius = UDim.new(0, 7) }),
                    TitleLbl,
                    SwitchBg
                })

                registerThemedElement(function()
                    local w = (currentTheme == "White")
                    Row.BackgroundColor3 = w and Color3.fromRGB(224, 232, 227) or Color3.fromRGB(20, 26, 22)
                    TitleLbl.TextColor3 = w and Color3.fromRGB(25, 35, 30) or Color3.fromRGB(225, 235, 228)
                    SwitchBg.BackgroundColor3 = state and activeColor or getInactiveColor()
                end)

                local function setState(newVal: boolean, silent: boolean?)
                    state = (newVal == true)
                    ConfigValues[configKey] = state
                    playTween(SwitchBg, 0.18, { BackgroundColor3 = state and activeColor or getInactiveColor() })
                    playTween(Knob, 0.18, { Position = state and UDim2.new(1, -17, 0.5, -7) or UDim2.new(0, 3, 0.5, -7) })
                    if not silent then
                        WindowObj:Notify({
                            Title = tgConfig.Name,
                            Description = tgConfig.Name .. (state and " has been enabled." or " has been disabled."),
                            Duration = 2
                        })
                    end
                    if tgConfig.Callback then tgConfig.Callback(state) end
                    if not silent then triggerAutoSave() end
                end

                ConfigSetters[configKey] = setState

                SwitchBg.MouseButton1Click:Connect(function()
                    setState(not state, false)
                end)

                if tgConfig.Keybind then
                    local boundKey: Enum.KeyCode = tgConfig.Keybind
                    local listeningForKey = false

                    local KeyBtn = create("TextButton", {
                        Size = UDim2.new(0, 24, 0, 20),
                        Position = UDim2.new(0, 62, 0.5, -10),
                        BackgroundColor3 = Color3.fromRGB(6, 8, 7),
                        BorderSizePixel = 0,
                        Font = Enum.Font.GothamBold,
                        TextSize = 11,
                        TextColor3 = Color3.fromRGB(240, 245, 242),
                        Text = boundKey.Name,
                        AutoButtonColor = false,
                        Parent = Row
                    }, {
                        create("UICorner", { CornerRadius = UDim.new(0, 4) }),
                        create("UIStroke", { Color = Color3.fromRGB(38, 52, 42), Thickness = 1 })
                    })

                    KeyBtn.MouseButton1Click:Connect(function()
                        listeningForKey = true
                        KeyBtn.Text = "..."
                    end)

                    UserInputService.InputBegan:Connect(function(input, gpe)
                        if listeningForKey then
                            if input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode ~= Enum.KeyCode.Unknown then
                                boundKey = input.KeyCode
                                KeyBtn.Text = boundKey.Name
                                listeningForKey = false
                            end
                            return
                        end
                        if not gpe and input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode == boundKey then
                            setState(not state, false)
                        end
                    end)
                end

                return { Set = function(_, v) setState(v, true) end }
            end

            function CatObj:AddSlider(slConfig)
                local minVal = slConfig.Min or 0
                local maxVal = slConfig.Max or 100
                local curVal = slConfig.Default or minVal
                local enabled = (slConfig.Enabled == nil) and true or slConfig.Enabled
                local suffix = slConfig.Suffix or ""
                local configKey = slConfig.ConfigKey or (catName .. "_Slider_" .. slConfig.Name)
                ConfigValues[configKey] = curVal

                local SLabel = create("TextLabel", {
                    Size = UDim2.new(0.65, 0, 0, 20),
                    Position = UDim2.new(0, 10, 0, 4),
                    BackgroundTransparency = 1,
                    Font = Enum.Font.GothamMedium,
                    TextSize = 12,
                    TextXAlignment = Enum.TextXAlignment.Left,
                    Text = slConfig.Name
                })
                local SValue = create("TextLabel", {
                    Size = UDim2.new(0.3, -10, 0, 20),
                    Position = UDim2.new(0.7, 0, 0, 4),
                    BackgroundTransparency = 1,
                    Font = Enum.Font.GothamBold,
                    TextSize = 12,
                    TextColor3 = Color3.fromRGB(46, 213, 115),
                    TextXAlignment = Enum.TextXAlignment.Right,
                    Text = tostring(curVal) .. suffix
                })
                local Fill = create("Frame", {
                    Size = UDim2.new(math.clamp((curVal - minVal) / (maxVal - minVal), 0, 1), 0, 1, 0),
                    BackgroundColor3 = Color3.fromRGB(46, 213, 115),
                    BorderSizePixel = 0
                }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }) })

                local BarBg = create("Frame", {
                    Size = UDim2.new(1, -20, 0, 6),
                    Position = UDim2.new(0, 10, 0, 30),
                    BorderSizePixel = 0
                }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }), Fill })

                local SFrame = create("Frame", {
                    Size = UDim2.new(1, 0, 0, 46),
                    BorderSizePixel = 0,
                    Parent = ItemsContainer
                }, {
                    create("UICorner", { CornerRadius = UDim.new(0, 7) }),
                    SLabel, SValue, BarBg
                })

                local sliding = false
                local function updateVis()
                    local w = (currentTheme == "White")
                    SFrame.BackgroundColor3 = w and Color3.fromRGB(224, 232, 227) or Color3.fromRGB(20, 26, 22)
                    SLabel.TextColor3 = w and Color3.fromRGB(25, 35, 30) or Color3.fromRGB(225, 235, 228)
                    BarBg.BackgroundColor3 = w and Color3.fromRGB(190, 204, 195) or Color3.fromRGB(34, 44, 38)
                    local t = enabled and 0 or 0.58
                    SFrame.BackgroundTransparency = t
                    SLabel.TextTransparency = t
                    SValue.TextTransparency = t
                    BarBg.BackgroundTransparency = t
                    Fill.BackgroundTransparency = t
                end
                registerThemedElement(updateVis)

                local function applyVal(val: number, silent: boolean?)
                    curVal = math.clamp(math.floor(val + 0.5), minVal, maxVal)
                    ConfigValues[configKey] = curVal
                    local rel = math.clamp((curVal - minVal) / (maxVal - minVal), 0, 1)
                    Fill.Size = UDim2.new(rel, 0, 1, 0)
                    SValue.Text = tostring(curVal) .. suffix
                    if slConfig.Callback then slConfig.Callback(curVal) end
                    if not silent then triggerAutoSave() end
                end

                ConfigSetters[configKey] = function(v, silent)
                    if type(v) == "number" then applyVal(v, silent) end
                end

                local function setFromInput(input)
                    if not enabled then return end
                    local rel = math.clamp((input.Position.X - BarBg.AbsolutePosition.X) / BarBg.AbsoluteSize.X, 0, 1)
                    applyVal(minVal + (maxVal - minVal) * rel, false)
                end

                SFrame.InputBegan:Connect(function(input)
                    if enabled and input.UserInputType == Enum.UserInputType.MouseButton1 then
                        sliding = true
                        setFromInput(input)
                    end
                end)
                UserInputService.InputEnded:Connect(function(input)
                    if input.UserInputType == Enum.UserInputType.MouseButton1 then sliding = false end
                end)
                UserInputService.InputChanged:Connect(function(input)
                    if sliding and enabled and input.UserInputType == Enum.UserInputType.MouseMovement then
                        setFromInput(input)
                    end
                end)

                return {
                    SetEnabled = function(_, bool)
                        enabled = bool
                        if not enabled then sliding = false end
                        updateVis()
                    end,
                    GetValue = function(_) return curVal end
                }
            end

            function CatObj:AddDropdown(ddConfig)
                local options = ddConfig.Options or {}
                local curIdx = 1
                for i, v in ipairs(options) do
                    if v == ddConfig.Default then curIdx = i break end
                end
                local selected = options[curIdx] or ""
                local configKey = ddConfig.ConfigKey or (catName .. "_DD_" .. ddConfig.Name)
                ConfigValues[configKey] = selected

                local ValBtn = create("TextButton", {
                    Size = UDim2.new(0, 145, 0, 24),
                    Position = UDim2.new(1, -155, 0.5, -12),
                    BackgroundColor3 = Color3.fromRGB(26, 38, 30),
                    BorderSizePixel = 0,
                    Font = Enum.Font.GothamBold,
                    TextSize = 11,
                    TextColor3 = Color3.fromRGB(46, 213, 115),
                    Text = selected
                }, {
                    create("UICorner", { CornerRadius = UDim.new(0, 6) }),
                    create("UIStroke", { Color = Color3.fromRGB(46, 213, 115), Thickness = 1, Transparency = 0.5 })
                })

                local TitleLbl = create("TextLabel", {
                    Size = UDim2.new(1, -165, 1, 0),
                    Position = UDim2.new(0, 10, 0, 0),
                    BackgroundTransparency = 1,
                    Font = Enum.Font.GothamMedium,
                    TextSize = 12,
                    TextXAlignment = Enum.TextXAlignment.Left,
                    Text = ddConfig.Name
                })

                local Row = create("Frame", {
                    Size = UDim2.new(1, 0, 0, 34),
                    BorderSizePixel = 0,
                    Parent = ItemsContainer
                }, {
                    create("UICorner", { CornerRadius = UDim.new(0, 7) }),
                    TitleLbl,
                    ValBtn
                })

                registerThemedElement(function()
                    local w = (currentTheme == "White")
                    Row.BackgroundColor3 = w and Color3.fromRGB(224, 232, 227) or Color3.fromRGB(20, 26, 22)
                    TitleLbl.TextColor3 = w and Color3.fromRGB(25, 35, 30) or Color3.fromRGB(225, 235, 228)
                    ValBtn.BackgroundColor3 = w and Color3.fromRGB(210, 225, 215) or Color3.fromRGB(26, 38, 30)
                end)

                ConfigSetters[configKey] = function(val, silent)
                    for i, opt in ipairs(options) do
                        if opt == val then
                            curIdx = i
                            selected = opt
                            ValBtn.Text = selected
                            ConfigValues[configKey] = selected
                            if ddConfig.Callback then ddConfig.Callback(selected) end
                            if not silent then triggerAutoSave() end
                            break
                        end
                    end
                end

                ValBtn.MouseButton1Click:Connect(function()
                    if #options == 0 then return end
                    curIdx = (curIdx % #options) + 1
                    selected = options[curIdx]
                    ValBtn.Text = selected
                    ConfigValues[configKey] = selected
                    if ddConfig.Callback then ddConfig.Callback(selected) end
                    triggerAutoSave()
                end)
            end

            function CatObj:AddButton(btnConfig)
                local enabled = (btnConfig.Enabled == nil) and true or btnConfig.Enabled
                local BStroke = create("UIStroke", { Color = Color3.fromRGB(46, 213, 115), Thickness = 1 })
                local Btn = create("TextButton", {
                    Size = UDim2.new(1, 0, 0, 32),
                    BorderSizePixel = 0,
                    Font = Enum.Font.GothamBold,
                    TextSize = 12,
                    Text = btnConfig.Name,
                    AutoButtonColor = false,
                    Parent = ItemsContainer
                }, { create("UICorner", { CornerRadius = UDim.new(0, 7) }), BStroke })

                local function updateBtn()
                    local w = (currentTheme == "White")
                    Btn.BackgroundColor3 = w and Color3.fromRGB(212, 228, 218) or Color3.fromRGB(26, 40, 32)
                    Btn.TextColor3 = w and Color3.fromRGB(20, 32, 25) or Color3.fromRGB(235, 245, 238)
                    Btn.Active = enabled
                    Btn.BackgroundTransparency = enabled and 0 or 0.65
                    Btn.TextTransparency = enabled and 0 or 0.6
                    BStroke.Transparency = enabled and 0.4 or 0.85
                end
                registerThemedElement(updateBtn)

                Btn.MouseButton1Click:Connect(function()
                    if enabled and btnConfig.Callback then btnConfig.Callback() end
                end)

                return {
                    SetEnabled = function(_, bool)
                        enabled = bool
                        updateBtn()
                    end,
                    SetText = function(_, txt)
                        Btn.Text = txt
                    end
                }
            end

            function CatObj:AddColorPicker(cpConfig)
                local colors = {
                    Color3.fromRGB(46, 213, 115),
                    Color3.fromRGB(55, 135, 255),
                    Color3.fromRGB(220, 55, 55),
                    Color3.fromRGB(255, 195, 45),
                    Color3.fromRGB(175, 85, 255),
                    Color3.fromRGB(245, 245, 245)
                }
                local SwatchList = create("Frame", {
                    Size = UDim2.new(0.55, -10, 1, 0),
                    Position = UDim2.new(0.45, 0, 0, 0),
                    BackgroundTransparency = 1
                }, {
                    create("UIListLayout", {
                        FillDirection = Enum.FillDirection.Horizontal,
                        HorizontalAlignment = Enum.HorizontalAlignment.Right,
                        VerticalAlignment = Enum.VerticalAlignment.Center,
                        Padding = UDim.new(0, 6)
                    })
                })

                local TitleLbl = create("TextLabel", {
                    Size = UDim2.new(0.45, 0, 1, 0),
                    Position = UDim2.new(0, 10, 0, 0),
                    BackgroundTransparency = 1,
                    Font = Enum.Font.GothamMedium,
                    TextSize = 12,
                    TextXAlignment = Enum.TextXAlignment.Left,
                    Text = cpConfig.Name
                })

                local Row = create("Frame", {
                    Size = UDim2.new(1, 0, 0, 34),
                    BorderSizePixel = 0,
                    Parent = ItemsContainer
                }, {
                    create("UICorner", { CornerRadius = UDim.new(0, 7) }),
                    TitleLbl,
                    SwatchList
                })

                registerThemedElement(function()
                    local w = (currentTheme == "White")
                    Row.BackgroundColor3 = w and Color3.fromRGB(224, 232, 227) or Color3.fromRGB(20, 26, 22)
                    TitleLbl.TextColor3 = w and Color3.fromRGB(25, 35, 30) or Color3.fromRGB(225, 235, 228)
                end)

                for _, col in ipairs(colors) do
                    local Sw = create("TextButton", {
                        Size = UDim2.new(0, 18, 0, 18),
                        BackgroundColor3 = col,
                        BorderSizePixel = 0,
                        Text = "",
                        Parent = SwatchList
                    }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }) })
                    Sw.MouseButton1Click:Connect(function()
                        if cpConfig.Callback then cpConfig.Callback(col) end
                    end)
                end
            end

            return CatObj
        end

        return TabObj
    end

    return WindowObj
end

local Window = AirFlow:CreateWindow({
    Title = "Taph Hub",
    ToggleKey = Enum.KeyCode.Y
})

local HomeTab = Window:AddTab({ Name = "Home", Icon = "home" })
local PlayerTab = Window:AddTab({ Name = "Player", Icon = "user" })
local VisualsTab = Window:AddTab({ Name = "Visuals", Icon = "eye" })
local TargetTab = Window:AddTab({ Name = "Target", Icon = "crosshair" })
local GameTab = Window:AddTab({ Name = "Game", Icon = "gamepad-2" })
local SettingsTab = Window:AddTab({ Name = "Settings", Icon = "settings" })

local followNoclipOverride = false

do
    local HomePage = HomeTab:GetPage()

    local DisplayNameLbl = create("TextLabel", {
        Size = UDim2.new(0.65, 0, 0, 28),
        Position = UDim2.new(0, 16, 0, 34),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamBold,
        TextSize = 22,
        TextColor3 = Color3.fromRGB(242, 247, 244),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = LocalPlayer.DisplayName
    })
    local HandleLbl = create("TextLabel", {
        Size = UDim2.new(0.65, 0, 0, 18),
        Position = UDim2.new(0, 16, 0, 62),
        BackgroundTransparency = 1,
        Font = Enum.Font.Gotham,
        TextSize = 12,
        TextColor3 = Color3.fromRGB(125, 145, 132),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "@" .. LocalPlayer.Name
    })
    local BustImage = create("ImageLabel", {
        Size = UDim2.new(0, 115, 0, 115),
        Position = UDim2.new(1, -130, 1, -115),
        BackgroundTransparency = 1
    })
    task.spawn(function()
        local ok, img = pcall(function()
            return Players:GetUserThumbnailAsync(LocalPlayer.UserId, Enum.ThumbnailType.AvatarBust, Enum.ThumbnailSize.Size180x180)
        end)
        if ok and img then BustImage.Image = img end
    end)

    local BadgesRow = create("Frame", {
        Size = UDim2.new(0, 230, 0, 26),
        Position = UDim2.new(0, 16, 0, 90),
        BackgroundTransparency = 1
    }, {
        create("UIListLayout", { FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 8) })
    })

    local function makePill(txt, accent)
        return create("TextButton", {
            Size = UDim2.new(0, 68, 1, 0),
            BackgroundColor3 = accent and Color3.fromRGB(20, 42, 30) or Color3.fromRGB(22, 28, 24),
            BorderSizePixel = 0,
            Font = Enum.Font.GothamBold,
            TextSize = 11,
            TextColor3 = accent and Color3.fromRGB(46, 213, 115) or Color3.fromRGB(150, 168, 156),
            Text = txt,
            Parent = BadgesRow
        }, { create("UICorner", { CornerRadius = UDim.new(0, 6) }) })
    end

    makePill("Free", true)
    local NameBtn = makePill("Name", false)
    local AvatarBtn = makePill("Avatar", false)

    local nameHidden = false
    NameBtn.MouseButton1Click:Connect(function()
        nameHidden = not nameHidden
        DisplayNameLbl.Text = nameHidden and "Hidden" or LocalPlayer.DisplayName
        HandleLbl.Text = nameHidden and "@hidden" or ("@" .. LocalPlayer.Name)
    end)
    AvatarBtn.MouseButton1Click:Connect(function()
        BustImage.Visible = not BustImage.Visible
    end)

    local WelcomeCardStroke = create("UIStroke", { Color = Color3.fromRGB(26, 38, 30), Thickness = 1 })
    local WelcomeCard = create("Frame", {
        Size = UDim2.new(1, 0, 0, 130),
        BackgroundColor3 = Color3.fromRGB(15, 20, 17),
        BorderSizePixel = 0,
        Parent = HomePage
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 10) }),
        WelcomeCardStroke,
        create("TextLabel", {
            Size = UDim2.new(0.6, 0, 0, 16),
            Position = UDim2.new(0, 16, 0, 16),
            BackgroundTransparency = 1,
            Font = Enum.Font.GothamBold,
            TextSize = 10,
            TextColor3 = Color3.fromRGB(120, 138, 126),
            TextXAlignment = Enum.TextXAlignment.Left,
            Text = "WELCOME BACK"
        }),
        DisplayNameLbl, HandleLbl, BustImage, BadgesRow
    })

    local FpsValueLbl = create("TextLabel", {
        Size = UDim2.new(0.4, 0, 0, 28),
        Position = UDim2.new(0, 16, 0, 32),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamBold,
        TextSize = 22,
        TextColor3 = Color3.fromRGB(46, 213, 115),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "60"
    })
    local PingValueLbl = create("TextLabel", {
        Size = UDim2.new(0.4, 0, 0, 28),
        Position = UDim2.new(0.52, 0, 0, 32),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamBold,
        TextSize = 22,
        TextColor3 = Color3.fromRGB(235, 180, 60),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "50ms"
    })
    local FpsBarsFrame = create("Frame", {
        Size = UDim2.new(0.44, 0, 0, 26),
        Position = UDim2.new(0, 16, 0, 66),
        BackgroundTransparency = 1
    })
    local PingBarsFrame = create("Frame", {
        Size = UDim2.new(0.44, 0, 0, 26),
        Position = UDim2.new(0.52, 0, 0, 66),
        BackgroundTransparency = 1
    })

    local fpsBars, pingBars = {}, {}
    for i = 1, 16 do
        fpsBars[i] = create("Frame", {
            Size = UDim2.new(0, 8, 0.4, 0),
            Position = UDim2.new(0, (i - 1) * 13, 0.6, 0),
            BackgroundColor3 = (i == 16) and Color3.fromRGB(46, 213, 115) or Color3.fromRGB(42, 58, 48),
            BorderSizePixel = 0,
            Parent = FpsBarsFrame
        }, { create("UICorner", { CornerRadius = UDim.new(0, 2) }) })

        pingBars[i] = create("Frame", {
            Size = UDim2.new(0, 8, 0.5, 0),
            Position = UDim2.new(0, (i - 1) * 13, 0.5, 0),
            BackgroundColor3 = (i == 16) and Color3.fromRGB(235, 180, 60) or Color3.fromRGB(52, 56, 48),
            BorderSizePixel = 0,
            Parent = PingBarsFrame
        }, { create("UICorner", { CornerRadius = UDim.new(0, 2) }) })
    end

    local PlayersCountLbl = create("TextLabel", {
        Size = UDim2.new(0.4, 0, 0, 18),
        Position = UDim2.new(0, 16, 0, 100),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamBold,
        TextSize = 13,
        TextColor3 = Color3.fromRGB(235, 242, 238),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = tostring(#Players:GetPlayers()) .. "/" .. tostring(Players.MaxPlayers)
    })
    local SessionValLbl = create("TextLabel", {
        Size = UDim2.new(0.4, 0, 0, 18),
        Position = UDim2.new(0.52, 0, 0, 100),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamBold,
        TextSize = 13,
        TextColor3 = Color3.fromRGB(235, 242, 238),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "0m 0s"
    })

    local FpsPingWidget = create("Frame", {
        Name = "FpsPingWidget",
        Size = UDim2.new(0, 195, 0, 66),
        Position = UDim2.new(1, -210, 1, -82),
        BackgroundColor3 = Color3.fromRGB(14, 19, 16),
        BorderSizePixel = 0,
        Visible = false,
        ZIndex = 250,
        Parent = Window:GetScreenGui()
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 10) }),
        create("UIStroke", { Color = Color3.fromRGB(46, 213, 115), Thickness = 1.2, Transparency = 0.25 }),
        create("TextLabel", {
            Size = UDim2.new(1, -20, 0, 18),
            Position = UDim2.new(0, 12, 0, 6),
            BackgroundTransparency = 1,
            Font = Enum.Font.GothamBold,
            TextSize = 11,
            TextColor3 = Color3.fromRGB(46, 213, 115),
            TextXAlignment = Enum.TextXAlignment.Left,
            Text = "Taph Hub · Performance",
            ZIndex = 251
        })
    })
    makeDraggable(FpsPingWidget)

    local FPW_FpsLbl = create("TextLabel", {
        Size = UDim2.new(0.5, -12, 0, 26),
        Position = UDim2.new(0, 12, 0, 28),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamBold,
        TextSize = 14,
        TextColor3 = Color3.fromRGB(46, 213, 115),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "FPS: 60",
        ZIndex = 251,
        Parent = FpsPingWidget
    })
    local FPW_PingLbl = create("TextLabel", {
        Size = UDim2.new(0.5, -12, 0, 26),
        Position = UDim2.new(0.5, 0, 0, 28),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamBold,
        TextSize = 14,
        TextColor3 = Color3.fromRGB(235, 180, 60),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "Ping: 50ms",
        ZIndex = 251,
        Parent = FpsPingWidget
    })

    local fpsWidgetState = false
    local FpsWidgetKnob = create("Frame", {
        Size = UDim2.new(0, 12, 0, 12),
        Position = UDim2.new(0, 3, 0.5, -6),
        BackgroundColor3 = Color3.fromRGB(245, 250, 247),
        BorderSizePixel = 0
    }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }) })

    local FpsWidgetSwitch = create("TextButton", {
        Size = UDim2.new(0, 34, 0, 18),
        Position = UDim2.new(0, 92, 0.5, -9),
        BackgroundColor3 = Color3.fromRGB(38, 48, 42),
        BorderSizePixel = 0,
        Text = "",
        AutoButtonColor = false
    }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }), FpsWidgetKnob })

    local AddFpsWidgetHolder = create("Frame", {
        Size = UDim2.new(0, 140, 0, 24),
        Position = UDim2.new(0, 16, 0, 140),
        BackgroundTransparency = 1
    }, {
        create("TextLabel", {
            Size = UDim2.new(0, 85, 1, 0),
            BackgroundTransparency = 1,
            Font = Enum.Font.GothamBold,
            TextSize = 11,
            TextColor3 = Color3.fromRGB(200, 215, 205),
            TextXAlignment = Enum.TextXAlignment.Left,
            Text = "Add Widget"
        }),
        FpsWidgetSwitch
    })

    local function setFpsWidgetState(val: boolean, silent: boolean?)
        fpsWidgetState = (val == true)
        ConfigValues["Home_AddWidget"] = fpsWidgetState
        FpsPingWidget.Visible = fpsWidgetState
        playTween(FpsWidgetSwitch, 0.18, {
            BackgroundColor3 = fpsWidgetState and Color3.fromRGB(46, 213, 115) or Color3.fromRGB(38, 48, 42)
        })
        playTween(FpsWidgetKnob, 0.18, {
            Position = fpsWidgetState and UDim2.new(1, -15, 0.5, -6) or UDim2.new(0, 3, 0.5, -6)
        })
        if not silent then
            Window:Notify({
                Title = "Add Widget",
                Description = "FPS & Ping Widget " .. (fpsWidgetState and "has been enabled." or "has been disabled."),
                Duration = 2
            })
            triggerAutoSave()
        end
    end
    ConfigSetters["Home_AddWidget"] = setFpsWidgetState

    FpsWidgetSwitch.MouseButton1Click:Connect(function()
        setFpsWidgetState(not fpsWidgetState, false)
    end)

    local StatsCardStroke = create("UIStroke", { Color = Color3.fromRGB(26, 38, 30), Thickness = 1 })
    local StatsCard = create("Frame", {
        Size = UDim2.new(1, 0, 0, 174),
        BackgroundColor3 = Color3.fromRGB(15, 20, 17),
        BorderSizePixel = 0,
        Parent = HomePage
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 10) }),
        StatsCardStroke,
        create("TextLabel", {
            Size = UDim2.new(0.4, 0, 0, 16), Position = UDim2.new(0, 16, 0, 14), BackgroundTransparency = 1,
            Font = Enum.Font.GothamBold, TextSize = 10, TextColor3 = Color3.fromRGB(125, 142, 130),
            TextXAlignment = Enum.TextXAlignment.Left, Text = "FPS"
        }),
        create("TextLabel", {
            Size = UDim2.new(0.4, 0, 0, 16), Position = UDim2.new(0.52, 0, 0, 14), BackgroundTransparency = 1,
            Font = Enum.Font.GothamBold, TextSize = 10, TextColor3 = Color3.fromRGB(125, 142, 130),
            TextXAlignment = Enum.TextXAlignment.Left, Text = "PING"
        }),
        create("TextLabel", {
            Size = UDim2.new(0.4, 0, 0, 14), Position = UDim2.new(0, 16, 0, 118), BackgroundTransparency = 1,
            Font = Enum.Font.GothamBold, TextSize = 9, TextColor3 = Color3.fromRGB(115, 132, 120),
            TextXAlignment = Enum.TextXAlignment.Left, Text = "PLAYERS"
        }),
        create("TextLabel", {
            Size = UDim2.new(0.4, 0, 0, 14), Position = UDim2.new(0.52, 0, 0, 118), BackgroundTransparency = 1,
            Font = Enum.Font.GothamBold, TextSize = 9, TextColor3 = Color3.fromRGB(115, 132, 120),
            TextXAlignment = Enum.TextXAlignment.Left, Text = "SESSION"
        }),
        FpsValueLbl, PingValueLbl, FpsBarsFrame, PingBarsFrame, PlayersCountLbl, SessionValLbl, AddFpsWidgetHolder
    })

    local GameMetaLbl = create("TextLabel", {
        Size = UDim2.new(1, -32, 0, 18),
        Position = UDim2.new(0, 16, 0, 35),
        BackgroundTransparency = 1,
        Font = Enum.Font.Gotham,
        TextSize = 11,
        TextColor3 = Color3.fromRGB(130, 148, 136),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "by " .. creatorName .. " · " .. tostring(#Players:GetPlayers()) .. "/" .. tostring(Players.MaxPlayers) .. " players"
    })

    local ServerBtnsFrame = create("Frame", {
        Size = UDim2.new(1, -32, 0, 48),
        Position = UDim2.new(0, 16, 0, 66),
        BackgroundTransparency = 1
    }, {
        create("UIListLayout", { FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 8) })
    })

    local function createServerButton(label, callback)
        local B = create("TextButton", {
            Size = UDim2.new(0.25, -6, 1, 0),
            BackgroundColor3 = Color3.fromRGB(20, 27, 23),
            BorderSizePixel = 0,
            Font = Enum.Font.GothamMedium,
            TextSize = 11,
            TextColor3 = Color3.fromRGB(195, 210, 200),
            Text = label,
            Parent = ServerBtnsFrame
        }, {
            create("UICorner", { CornerRadius = UDim.new(0, 8) }),
            create("UIStroke", { Color = Color3.fromRGB(30, 42, 35), Thickness = 1 })
        })
        B.MouseButton1Click:Connect(callback)
    end

    createServerButton("Rejoin", function()
        TeleportService:TeleportToPlaceInstance(game.PlaceId, game.JobId, LocalPlayer)
    end)
    createServerButton("Hop", function()
        pcall(function()
            local raw = game:HttpGet("https://games.roblox.com/v1/games/" .. tostring(game.PlaceId) .. "/servers/Public?sortOrder=Desc&limit=100")
            local decoded = HttpService:JSONDecode(raw)
            if decoded and decoded.data then
                for _, srv in ipairs(decoded.data) do
                    if srv.id ~= game.JobId and srv.playing < srv.maxPlayers then
                        TeleportService:TeleportToPlaceInstance(game.PlaceId, srv.id, LocalPlayer)
                        break
                    end
                end
            end
        end)
    end)
    createServerButton("Lowest", function()
        pcall(function()
            local raw = game:HttpGet("https://games.roblox.com/v1/games/" .. tostring(game.PlaceId) .. "/servers/Public?sortOrder=Asc&limit=100")
            local decoded = HttpService:JSONDecode(raw)
            if decoded and decoded.data then
                for _, srv in ipairs(decoded.data) do
                    if srv.id ~= game.JobId and srv.playing > 0 and srv.playing < srv.maxPlayers then
                        TeleportService:TeleportToPlaceInstance(game.PlaceId, srv.id, LocalPlayer)
                        break
                    end
                end
            end
        end)
    end)
    createServerButton("Job ID", function()
        if setclipboard then setclipboard(tostring(game.JobId)) end
        Window:Notify({ Title = "Server", Description = "Job ID copied to clipboard.", Duration = 2 })
    end)

    local GameTitleCardLbl = create("TextLabel", {
        Size = UDim2.new(1, -32, 0, 20), Position = UDim2.new(0, 16, 0, 15), BackgroundTransparency = 1,
        Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = Color3.fromRGB(240, 246, 242),
        TextXAlignment = Enum.TextXAlignment.Left, Text = placeName
    })
    local GameCardStroke = create("UIStroke", { Color = Color3.fromRGB(26, 38, 30), Thickness = 1 })
    local GameCard = create("Frame", {
        Size = UDim2.new(1, 0, 0, 145),
        BackgroundColor3 = Color3.fromRGB(15, 20, 17),
        BorderSizePixel = 0,
        Parent = HomePage
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 10) }),
        GameCardStroke,
        GameTitleCardLbl,
        GameMetaLbl, ServerBtnsFrame,
        create("TextLabel", {
            Size = UDim2.new(1, -32, 0, 18), Position = UDim2.new(0, 16, 0, 120), BackgroundTransparency = 1,
            Font = Enum.Font.Gotham, TextSize = 10, TextColor3 = Color3.fromRGB(100, 118, 106),
            TextXAlignment = Enum.TextXAlignment.Left,
            Text = "Job " .. string.sub(tostring(game.JobId), 1, 13) .. " · Place " .. tostring(game.PlaceId)
        })
    })

    registerThemedElement(function()
        local w = (currentTheme == "White")
        WelcomeCard.BackgroundColor3 = w and Color3.fromRGB(234, 240, 236) or Color3.fromRGB(15, 20, 17)
        WelcomeCardStroke.Color = w and Color3.fromRGB(202, 215, 206) or Color3.fromRGB(26, 38, 30)
        DisplayNameLbl.TextColor3 = w and Color3.fromRGB(20, 28, 24) or Color3.fromRGB(242, 247, 244)
        StatsCard.BackgroundColor3 = w and Color3.fromRGB(234, 240, 236) or Color3.fromRGB(15, 20, 17)
        StatsCardStroke.Color = w and Color3.fromRGB(202, 215, 206) or Color3.fromRGB(26, 38, 30)
        PlayersCountLbl.TextColor3 = w and Color3.fromRGB(20, 28, 24) or Color3.fromRGB(235, 242, 238)
        SessionValLbl.TextColor3 = w and Color3.fromRGB(20, 28, 24) or Color3.fromRGB(235, 242, 238)
        GameCard.BackgroundColor3 = w and Color3.fromRGB(234, 240, 236) or Color3.fromRGB(15, 20, 17)
        GameCardStroke.Color = w and Color3.fromRGB(202, 215, 206) or Color3.fromRGB(26, 38, 30)
        GameTitleCardLbl.TextColor3 = w and Color3.fromRGB(20, 28, 24) or Color3.fromRGB(240, 246, 242)
        FpsPingWidget.BackgroundColor3 = w and Color3.fromRGB(240, 245, 242) or Color3.fromRGB(14, 19, 16)
    end)

    local OtherCat = HomeTab:AddCategory("Other")
    OtherCat:AddLabel("if Executor is Xeno, Solara or SirHurt, then executor will garbage.")

    local startTime = os.clock()
    local fpsHistory, pingHistory = {}, {}
    for i = 1, 16 do
        fpsHistory[i] = 60
        pingHistory[i] = 50
    end
    local frameCounter = 0
    local lastTick = os.clock()

    RunService.RenderStepped:Connect(function()
        frameCounter += 1
        local now = os.clock()
        if now - lastTick >= 1 then
            local currentFps = math.clamp(frameCounter, 1, 240)
            frameCounter = 0
            lastTick = now

            local currentPing = 50
            pcall(function()
                currentPing = math.floor(Stats.Network.ServerStatsItem["Data Ping"]:GetValue())
            end)

            FpsValueLbl.Text = tostring(currentFps)
            PingValueLbl.Text = tostring(currentPing) .. "ms"
            FPW_FpsLbl.Text = "FPS: " .. tostring(currentFps)
            FPW_PingLbl.Text = "Ping: " .. tostring(currentPing) .. "ms"

            table.remove(fpsHistory, 1)
            table.insert(fpsHistory, currentFps)
            table.remove(pingHistory, 1)
            table.insert(pingHistory, currentPing)

            for i = 1, 16 do
                local fRatio = math.clamp(fpsHistory[i] / 144, 0.12, 1)
                fpsBars[i].Size = UDim2.new(0, 8, fRatio, 0)
                fpsBars[i].Position = UDim2.new(0, (i - 1) * 13, 1 - fRatio, 0)

                local pRatio = math.clamp(pingHistory[i] / 250, 0.12, 1)
                pingBars[i].Size = UDim2.new(0, 8, pRatio, 0)
                pingBars[i].Position = UDim2.new(0, (i - 1) * 13, 1 - pRatio, 0)
            end

            local elapsed = math.floor(now - startTime)
            SessionValLbl.Text = tostring(math.floor(elapsed / 60)) .. "m " .. tostring(elapsed % 60) .. "s"
            PlayersCountLbl.Text = tostring(#Players:GetPlayers()) .. "/" .. tostring(Players.MaxPlayers)
            GameMetaLbl.Text = "by " .. creatorName .. " · " .. tostring(#Players:GetPlayers()) .. "/" .. tostring(Players.MaxPlayers) .. " players"
        end
    end)
end

do
    local wsEnabled, wsValue = false, 32
    local jpEnabled, jpValue = false, 50
    local flyEnabled, flyValue = false, 32
    local infJumpEnabled, noclipEnabled, deleteJumpLimitActive = false, false, false

    local WalkSpeedCat = PlayerTab:AddCategory("WalkSpeed")
    local WalkSpeedSlider
    WalkSpeedCat:AddToggle({
        Name = "WalkSpeed",
        Default = false,
        Callback = function(val)
            wsEnabled = val
            WalkSpeedSlider:SetEnabled(val)
            local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
            if hum then hum.WalkSpeed = val and wsValue or 16 end
        end
    })
    WalkSpeedSlider = WalkSpeedCat:AddSlider({
        Name = "Select WalkSpeed",
        Min = 8, Max = 128, Default = 32, Enabled = false,
        Callback = function(val)
            wsValue = val
            if wsEnabled then
                local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
                if hum then hum.WalkSpeed = wsValue end
            end
        end
    })

    local JumpPowerCat = PlayerTab:AddCategory("JumpPower")
    local JumpPowerSlider
    JumpPowerCat:AddToggle({
        Name = "JumpPower",
        Default = false,
        Callback = function(val)
            jpEnabled = val
            JumpPowerSlider:SetEnabled(val)
            local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
            if hum then
                hum.UseJumpPower = true
                hum.JumpPower = val and jpValue or 50
            end
        end
    })
    JumpPowerSlider = JumpPowerCat:AddSlider({
        Name = "Select JumpPower",
        Min = 8, Max = 196, Default = 50, Enabled = false,
        Callback = function(val)
            jpValue = val
            if jpEnabled then
                local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
                if hum then
                    hum.UseJumpPower = true
                    hum.JumpPower = jpValue
                end
            end
        end
    })

    local FlyCat = PlayerTab:AddCategory("Fly")
    local FlySlider
    local flyBV: BodyVelocity? = nil
    local flyBG: BodyGyro? = nil

    local function stopFly()
        if flyBV then flyBV:Destroy(); flyBV = nil end
        if flyBG then flyBG:Destroy(); flyBG = nil end
    end

    local function startFly()
        stopFly()
        local hrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
        if not hrp then return end
        flyBV = create("BodyVelocity", {
            MaxForce = Vector3.new(9e9, 9e9, 9e9),
            Velocity = Vector3.zero,
            Parent = hrp
        })
        flyBG = create("BodyGyro", {
            MaxTorque = Vector3.new(9e9, 9e9, 9e9),
            P = 9e4,
            CFrame = Camera.CFrame,
            Parent = hrp
        })
    end

    FlyCat:AddToggle({
        Name = "Fly",
        Default = false,
        Callback = function(val)
            flyEnabled = val
            FlySlider:SetEnabled(val)
            if val then startFly() else stopFly() end
        end
    })
    FlySlider = FlyCat:AddSlider({
        Name = "Speed Fly",
        Min = 16, Max = 128, Default = 32, Enabled = false,
        Callback = function(val) flyValue = val end
    })

    local OtherMoveCat = PlayerTab:AddCategory("Other Movement")
    OtherMoveCat:AddToggle({ Name = "Infinite Jump", Default = false, Callback = function(val) infJumpEnabled = val end })
    OtherMoveCat:AddToggle({ Name = "Noclip", Default = false, Callback = function(val) noclipEnabled = val end })
    OtherMoveCat:AddButton({
        Name = "Delete Limit Jumps",
        Enabled = true,
        Callback = function()
            deleteJumpLimitActive = true
            local char = LocalPlayer.Character
            if char then
                local hum = char:FindFirstChildOfClass("Humanoid")
                if hum then hum:SetStateEnabled(Enum.HumanoidStateType.Jumping, true) end
                for _, desc in ipairs(char:GetDescendants()) do
                    if string.find(string.lower(desc.Name), "jump") and (desc:IsA("LocalScript") or desc:IsA("NumberValue") or desc:IsA("BoolValue")) then
                        pcall(function() desc:Destroy() end)
                    end
                end
            end
            Window:Notify({ Title = "Delete Limit Jumps", Description = "Jump limit has been removed.", Duration = 2 })
        end
    })

    local function bindCharacterGuard(char: Model)
        local hum = char:WaitForChild("Humanoid", 5) :: Humanoid?
        if not hum then return end
        hum:GetPropertyChangedSignal("WalkSpeed"):Connect(function()
            if wsEnabled and hum.WalkSpeed ~= wsValue then hum.WalkSpeed = wsValue end
        end)
        hum:GetPropertyChangedSignal("JumpPower"):Connect(function()
            if jpEnabled and hum.JumpPower ~= jpValue then
                hum.UseJumpPower = true
                hum.JumpPower = jpValue
            end
        end)
    end

    if LocalPlayer.Character then task.spawn(bindCharacterGuard, LocalPlayer.Character) end
    LocalPlayer.CharacterAdded:Connect(bindCharacterGuard)

    RunService.Heartbeat:Connect(function()
        local char = LocalPlayer.Character
        if not char then return end
        local hum = char:FindFirstChildOfClass("Humanoid")
        local hrp = char:FindFirstChild("HumanoidRootPart") :: BasePart?

        if hum then
            if wsEnabled and hum.WalkSpeed ~= wsValue then hum.WalkSpeed = wsValue end
            if jpEnabled then
                if not hum.UseJumpPower then hum.UseJumpPower = true end
                if hum.JumpPower ~= jpValue then hum.JumpPower = jpValue end
            end
            if deleteJumpLimitActive then hum:SetStateEnabled(Enum.HumanoidStateType.Jumping, true) end
        end

        if flyEnabled and hrp then
            if not flyBV or flyBV.Parent ~= hrp then startFly() end
            if FlySlider and FlySlider:GetValue() ~= flyValue then
                flyValue = FlySlider:GetValue()
            end
            local moveDir = Vector3.zero
            local camCF = Camera.CFrame
            if UserInputService:IsKeyDown(Enum.KeyCode.W) then moveDir += camCF.LookVector end
            if UserInputService:IsKeyDown(Enum.KeyCode.S) then moveDir -= camCF.LookVector end
            if UserInputService:IsKeyDown(Enum.KeyCode.D) then moveDir += camCF.RightVector end
            if UserInputService:IsKeyDown(Enum.KeyCode.A) then moveDir -= camCF.RightVector end
            if UserInputService:IsKeyDown(Enum.KeyCode.Space) then moveDir += Vector3.new(0, 1, 0) end
            if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) then moveDir -= Vector3.new(0, 1, 0) end
            if moveDir.Magnitude > 0 then moveDir = moveDir.Unit end
            if flyBV then flyBV.Velocity = moveDir * flyValue end
            if flyBG then flyBG.CFrame = camCF end
        end
    end)

    RunService.Stepped:Connect(function()
        if (noclipEnabled or followNoclipOverride) and LocalPlayer.Character then
            for _, part in ipairs(LocalPlayer.Character:GetDescendants()) do
                if part:IsA("BasePart") and part.CanCollide then part.CanCollide = false end
            end
        end
    end)

    UserInputService.JumpRequest:Connect(function()
        if infJumpEnabled and LocalPlayer.Character then
            local hum = LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
            if hum then hum:ChangeState(Enum.HumanoidStateType.Jumping) end
        end
    end)
end

do
    local espChams, espWeapon, espNickname, espHealth, espStuds = false, false, false, false, false
    local espLines, espSkeleton, espHead = false, false, false

    local ESPCat = VisualsTab:AddCategory("ESP")
    ESPCat:AddToggle({ Name = "ESP Chams", Default = false, Callback = function(v) espChams = v end })
    ESPCat:AddToggle({ Name = "Render Weapon", Default = false, Callback = function(v) espWeapon = v end })
    ESPCat:AddToggle({ Name = "ESP Nickname", Default = false, Callback = function(v) espNickname = v end })
    ESPCat:AddToggle({ Name = "ESP Health", Default = false, Callback = function(v) espHealth = v end })
    ESPCat:AddToggle({ Name = "ESP Studs", Default = false, Callback = function(v) espStuds = v end })

    local ESPPlayerCat = VisualsTab:AddCategory("ESP Player")
    ESPPlayerCat:AddToggle({ Name = "ESP Lines", Default = false, Callback = function(v) espLines = v end })
    ESPPlayerCat:AddToggle({ Name = "Skeleton", Default = false, Callback = function(v) espSkeleton = v end })
    ESPPlayerCat:AddToggle({ Name = "Head", Default = false, Callback = function(v) espHead = v end })

    local WorldCat = VisualsTab:AddCategory("World")
    local origBrightness, origClockTime = Lighting.Brightness, Lighting.ClockTime
    local origShadows, origAmbient = Lighting.GlobalShadows, Lighting.Ambient
    local origFogEnd, origFogStart = Lighting.FogEnd, Lighting.FogStart
    local fbEnabled, fbValue, noFogEnabled, removeKillbricksEnabled = false, 3, false, false
    local transAccessoryEnabled = false
    local transAccessoryPercent = 0
    local savedAccessoryTrans: {[BasePart]: number} = {}
    local FullBrightSlider, TransAccSlider

    WorldCat:AddToggle({
        Name = "FullBright",
        Default = false,
        Callback = function(v)
            fbEnabled = v
            FullBrightSlider:SetEnabled(v)
            if not v then
                Lighting.Brightness = origBrightness
                Lighting.ClockTime = origClockTime
                Lighting.GlobalShadows = origShadows
                Lighting.Ambient = origAmbient
            end
        end
    })
    FullBrightSlider = WorldCat:AddSlider({
        Name = "FullBright Level",
        Min = 1, Max = 10, Default = 3, Enabled = false,
        Callback = function(v) fbValue = v end
    })
    WorldCat:AddToggle({
        Name = "No Fog",
        Default = false,
        Callback = function(v)
            noFogEnabled = v
            if not v then
                Lighting.FogEnd = origFogEnd
                Lighting.FogStart = origFogStart
            end
        end
    })

    local function purgeKillbricks()
        for _, obj in ipairs(workspace:GetDescendants()) do
            if string.lower(obj.Name) == "killbrick" then
                pcall(function() obj:Destroy() end)
            end
        end
    end

    WorldCat:AddToggle({
        Name = "Remove Killbricks",
        Default = false,
        Callback = function(v)
            removeKillbricksEnabled = v
            if v then purgeKillbricks() end
        end
    })

    workspace.DescendantAdded:Connect(function(obj)
        if removeKillbricksEnabled and string.lower(obj.Name) == "killbrick" then
            task.defer(function()
                pcall(function() obj:Destroy() end)
            end)
        end
    end)

    local function applyAccessoriesTransparency()
        local targetTran = math.clamp((100 - transAccessoryPercent) / 100, 0, 1)
        for _, obj in ipairs(workspace:GetDescendants()) do
            if obj:IsA("Accessory") or obj:IsA("Hat") then
                for _, part in ipairs(obj:GetDescendants()) do
                    if part:IsA("BasePart") then
                        if savedAccessoryTrans[part] == nil then
                            savedAccessoryTrans[part] = part.Transparency
                        end
                        part.Transparency = targetTran
                    end
                end
            end
        end
    end

    local function restoreAccessoriesTransparency()
        for part, origT in pairs(savedAccessoryTrans) do
            if part and part.Parent then
                part.Transparency = origT
            end
        end
        table.clear(savedAccessoryTrans)
    end

    WorldCat:AddToggle({
        Name = "Transparent Accessory",
        Default = false,
        Callback = function(v)
            transAccessoryEnabled = v
            TransAccSlider:SetEnabled(v)
            if v then
                applyAccessoriesTransparency()
            else
                restoreAccessoriesTransparency()
            end
        end
    })

    TransAccSlider = WorldCat:AddSlider({
        Name = "Accessory Visibility",
        Min = 0, Max = 100, Default = 0, Suffix = "%", Enabled = false,
        Callback = function(v)
            transAccessoryPercent = v
            if transAccessoryEnabled then
                applyAccessoriesTransparency()
            end
        end
    })

    local lastAccTick = 0
    RunService.RenderStepped:Connect(function()
        if fbEnabled then
            Lighting.Brightness = fbValue
            Lighting.ClockTime = 14
            Lighting.GlobalShadows = false
            Lighting.Ambient = Color3.fromRGB(255, 255, 255)
        end
        if noFogEnabled then
            Lighting.FogEnd = 100000
            Lighting.FogStart = 100000
        end
        if transAccessoryEnabled and os.clock() - lastAccTick >= 0.8 then
            lastAccTick = os.clock()
            applyAccessoriesTransparency()
        end
    end)

    local HitboxCat = VisualsTab:AddCategory("Hitbox Expander")
    local hitboxEnabled = false
    local hitboxStuds = 8
    local hitboxOpacityPercent = 40
    local hbIgnoreLobby = false
    local hbIgnoreHiders = false
    local origHitboxes: {[Player]: {size: Vector3, tran: number, col: Color3, mat: Enum.Material}} = {}
    local HitboxStudsSlider, HitboxTransSlider

    local function restorePlayerHitbox(player: Player)
        local saved = origHitboxes[player]
        if not saved then return end
        local hrp = player.Character and player.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
        if hrp then
            hrp.Size = saved.size
            hrp.Transparency = saved.tran
            hrp.Color = saved.col
            hrp.Material = saved.mat
        end
        origHitboxes[player] = nil
    end

    HitboxCat:AddToggle({
        Name = "Hitbox Expander",
        Default = false,
        Callback = function(val)
            hitboxEnabled = val
            HitboxStudsSlider:SetEnabled(val)
            HitboxTransSlider:SetEnabled(val)
            if not val then
                for _, p in ipairs(Players:GetPlayers()) do
                    restorePlayerHitbox(p)
                end
            end
        end
    })

    HitboxStudsSlider = HitboxCat:AddSlider({
        Name = "Studs Long",
        Min = 1, Max = 64, Default = 8, Suffix = " st", Enabled = false,
        Callback = function(val) hitboxStuds = val end
    })

    HitboxTransSlider = HitboxCat:AddSlider({
        Name = "Transparency",
        Min = 1, Max = 100, Default = 40, Suffix = "%", Enabled = false,
        Callback = function(val) hitboxOpacityPercent = val end
    })

    HitboxCat:AddToggle({
        Name = "Ignore Lobby Players",
        Default = false,
        Callback = function(val) hbIgnoreLobby = val end
    })

    HitboxCat:AddToggle({
        Name = "Ignore Hiders",
        Default = false,
        Callback = function(val) hbIgnoreHiders = val end
    })

    RunService.Heartbeat:Connect(function()
        if not hitboxEnabled then return end
        for _, player in ipairs(Players:GetPlayers()) do
            if player ~= LocalPlayer then
                local char = player.Character
                local hum = char and char:FindFirstChildOfClass("Humanoid")
                local hrp = char and char:FindFirstChild("HumanoidRootPart") :: BasePart?
                if char and hum and hum.Health > 0 and hrp then
                    local inLob = isInLobby(player)
                    local isHider = (not inLob) and (not hasGun(player))
                    if (hbIgnoreLobby and inLob) or (hbIgnoreHiders and isHider) then
                        restorePlayerHitbox(player)
                    else
                        if not origHitboxes[player] then
                            origHitboxes[player] = {
                                size = hrp.Size,
                                tran = hrp.Transparency,
                                col = hrp.Color,
                                mat = hrp.Material
                            }
                        end
                        hrp.Size = Vector3.new(hitboxStuds, hitboxStuds, hitboxStuds)
                        hrp.Transparency = math.clamp((100 - hitboxOpacityPercent) / 100, 0, 0.99)
                        hrp.Color = getRoleColor(player)
                        hrp.Material = Enum.Material.Neon
                        hrp.CanCollide = false
                    end
                else
                    restorePlayerHitbox(player)
                end
            end
        end
    end)

    Players.PlayerRemoving:Connect(function(player)
        origHitboxes[player] = nil
    end)

    local LadderCat = VisualsTab:AddCategory("Ladder [CLIENT]")
    local clientLadder: TrussPart? = nil
    local ladderSizeY = 24
    local ladderColor = Color3.fromRGB(46, 213, 115)
    local ladderOpacityPercent = 80
    local CreateLadderBtn, DeleteLadderBtn

    CreateLadderBtn = LadderCat:AddButton({
        Name = "Create",
        Enabled = true,
        Callback = function()
            if clientLadder then return end
            local hrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
            if not hrp then return end
            local spawnPos = hrp.Position + (hrp.CFrame.LookVector * 4) + Vector3.new(0, ladderSizeY / 2 - 2, 0)
            clientLadder = create("TrussPart", {
                Name = "TaphClientLadder",
                Anchored = true,
                CanCollide = true,
                Size = Vector3.new(2, ladderSizeY, 2),
                Color = ladderColor,
                Transparency = math.clamp((100 - ladderOpacityPercent) / 100, 0, 0.99),
                CFrame = CFrame.new(spawnPos),
                Parent = workspace
            })
            CreateLadderBtn:SetEnabled(false)
            DeleteLadderBtn:SetEnabled(true)
            Window:Notify({ Title = "Ladder [CLIENT]", Description = "Ladder has been created.", Duration = 2 })
        end
    })

    DeleteLadderBtn = LadderCat:AddButton({
        Name = "Delete",
        Enabled = false,
        Callback = function()
            if clientLadder then
                clientLadder:Destroy()
                clientLadder = nil
            end
            CreateLadderBtn:SetEnabled(true)
            DeleteLadderBtn:SetEnabled(false)
            Window:Notify({ Title = "Ladder [CLIENT]", Description = "Ladder has been deleted.", Duration = 2 })
        end
    })

    LadderCat:AddSlider({
        Name = "Ladder Size Y",
        Min = 1, Max = 128, Default = 24, Enabled = true,
        Callback = function(v)
            ladderSizeY = v
            if clientLadder then
                local bottom = clientLadder.Position - Vector3.new(0, clientLadder.Size.Y / 2, 0)
                clientLadder.Size = Vector3.new(2, ladderSizeY, 2)
                clientLadder.Position = bottom + Vector3.new(0, ladderSizeY / 2, 0)
            end
        end
    })
    LadderCat:AddColorPicker({
        Name = "Ladder Color",
        Callback = function(col)
            ladderColor = col
            if clientLadder then clientLadder.Color = ladderColor end
        end
    })
    LadderCat:AddSlider({
        Name = "Transparent",
        Min = 1, Max = 100, Default = 80, Suffix = "%", Enabled = true,
        Callback = function(v)
            ladderOpacityPercent = v
            if clientLadder then
                clientLadder.Transparency = math.clamp((100 - ladderOpacityPercent) / 100, 0, 0.99)
            end
        end
    })

    local OverlayGui = create("ScreenGui", {
        Name = "TaphHub_ESPOverlay",
        IgnoreGuiInset = true,
        ResetOnSpawn = false,
        Parent = (gethui and gethui()) or CoreGui
    })

    local playerVisuals: {[Player]: any} = {}
    local bonePairsR15 = {
        {"Head", "UpperTorso"}, {"UpperTorso", "LowerTorso"},
        {"UpperTorso", "LeftUpperArm"}, {"LeftUpperArm", "LeftLowerArm"}, {"LeftLowerArm", "LeftHand"},
        {"UpperTorso", "RightUpperArm"}, {"RightUpperArm", "RightLowerArm"}, {"RightLowerArm", "RightHand"},
        {"LowerTorso", "LeftUpperLeg"}, {"LeftUpperLeg", "LeftLowerLeg"}, {"LeftLowerLeg", "LeftFoot"},
        {"LowerTorso", "RightUpperLeg"}, {"RightUpperLeg", "RightLowerLeg"}, {"RightLowerLeg", "RightFoot"}
    }
    local bonePairsR6 = {
        {"Head", "Torso"}, {"Torso", "Left Arm"}, {"Torso", "Right Arm"}, {"Torso", "Left Leg"}, {"Torso", "Right Leg"}
    }

    local function createLineFrame()
        return create("Frame", {
            AnchorPoint = Vector2.new(0.5, 0.5),
            BorderSizePixel = 0,
            Visible = false,
            Parent = OverlayGui
        })
    end

    local function draw2DLine(frame: Frame, p1: Vector2, p2: Vector2, color: Color3, thickness: number?)
        local dx, dy = p2.X - p1.X, p2.Y - p1.Y
        local dist = math.sqrt(dx * dx + dy * dy)
        frame.Position = UDim2.new(0, (p1.X + p2.X) / 2, 0, (p1.Y + p2.Y) / 2)
        frame.Size = UDim2.new(0, dist, 0, thickness or 1.5)
        frame.Rotation = math.deg(math.atan2(dy, dx))
        frame.BackgroundColor3 = color
        frame.Visible = true
    end

    local function projectWorldEvenOffscreen(worldPos: Vector3): Vector2
        local vp = Camera.ViewportSize
        local screenPos = Camera:WorldToViewportPoint(worldPos)
        if screenPos.Z < 0 then
            local center = Vector2.new(vp.X / 2, vp.Y / 2)
            local dir = (Vector2.new(vp.X - screenPos.X, vp.Y - screenPos.Y) - center).Unit
            local edge = center + dir * math.max(vp.X, vp.Y)
            return Vector2.new(math.clamp(edge.X, 0, vp.X), math.clamp(edge.Y, 0, vp.Y))
        end
        return Vector2.new(screenPos.X, screenPos.Y)
    end

    local function cleanupVisuals(player: Player)
        local v = playerVisuals[player]
        if not v then return end
        if v.Chams then v.Chams:Destroy() end
        if v.WeaponHL then v.WeaponHL:Destroy() end
        if v.Billboard then v.Billboard:Destroy() end
        if v.Tracer then v.Tracer:Destroy() end
        if v.HeadCircle then v.HeadCircle:Destroy() end
        if v.Bones then
            for _, b in ipairs(v.Bones) do b:Destroy() end
        end
        playerVisuals[player] = nil
    end

    Players.PlayerRemoving:Connect(cleanupVisuals)

    RunService.RenderStepped:Connect(function()
        local vp = Camera.ViewportSize
        local myHrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?

        for _, player in ipairs(Players:GetPlayers()) do
            if player ~= LocalPlayer then
                local char = player.Character
                local hum = char and char:FindFirstChildOfClass("Humanoid")
                local hrp = char and char:FindFirstChild("HumanoidRootPart") :: BasePart?
                local head = char and char:FindFirstChild("Head") :: BasePart?

                if char and hum and hum.Health > 0 and hrp then
                    local vis = playerVisuals[player]
                    if not vis then
                        vis = { Tracer = createLineFrame(), Bones = {} }
                        for i = 1, 14 do vis.Bones[i] = createLineFrame() end

                        local hcs = create("UIStroke", { Thickness = 1.6 })
                        vis.HeadStroke = hcs
                        vis.HeadCircle = create("Frame", {
                            BackgroundTransparency = 1, Visible = false, Parent = OverlayGui
                        }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }), hcs })

                        local bbl = create("TextLabel", {
                            Size = UDim2.new(1, 0, 1, 0), BackgroundTransparency = 1,
                            Font = Enum.Font.GothamBold, TextSize = 12, TextStrokeTransparency = 0.2,
                            TextColor3 = Color3.fromRGB(255, 255, 255)
                        })
                        vis.BillboardText = bbl
                        vis.Billboard = create("BillboardGui", {
                            Size = UDim2.new(0, 200, 0, 50), StudsOffset = Vector3.new(0, 3.2, 0),
                            AlwaysOnTop = true, Parent = OverlayGui
                        }, { bbl })

                        playerVisuals[player] = vis
                    end

                    local roleCol = getRoleColor(player)

                    if espChams then
                        if not vis.Chams or vis.Chams.Parent ~= char then
                            if vis.Chams then vis.Chams:Destroy() end
                            vis.Chams = create("Highlight", {
                                DepthMode = Enum.HighlightDepthMode.AlwaysOnTop,
                                FillTransparency = 0.5, OutlineTransparency = 0,
                                Adornee = char, Parent = char
                            })
                        end
                        vis.Chams.FillColor = roleCol
                        vis.Chams.OutlineColor = roleCol
                        vis.Chams.Enabled = true
                    elseif vis.Chams then
                        vis.Chams.Enabled = false
                    end

                    if espWeapon then
                        local foundWeapon: Instance? = nil
                        for _, child in ipairs(char:GetChildren()) do
                            if weaponNames[child.Name] or child:IsA("Tool") or (child:IsA("Model") and child.Name ~= "Body") then
                                foundWeapon = child
                                break
                            end
                        end
                        if foundWeapon then
                            if not vis.WeaponHL or vis.WeaponHL.Parent ~= foundWeapon then
                                if vis.WeaponHL then vis.WeaponHL:Destroy() end
                                vis.WeaponHL = create("Highlight", {
                                    DepthMode = Enum.HighlightDepthMode.AlwaysOnTop,
                                    FillColor = Color3.fromRGB(255, 215, 60),
                                    OutlineColor = Color3.fromRGB(255, 255, 255),
                                    FillTransparency = 0.25,
                                    Adornee = foundWeapon, Parent = foundWeapon
                                })
                            end
                            vis.WeaponHL.Enabled = true
                        elseif vis.WeaponHL then
                            vis.WeaponHL.Enabled = false
                        end
                    elseif vis.WeaponHL then
                        vis.WeaponHL.Enabled = false
                    end

                    if espNickname or espHealth or espStuds then
                        vis.Billboard.Adornee = head or hrp
                        vis.Billboard.Enabled = true
                        local lines = {}
                        if espNickname then table.insert(lines, player.Name) end
                        if espHealth then table.insert(lines, "HP: " .. tostring(math.floor(hum.Health)) .. "/" .. tostring(math.floor(hum.MaxHealth))) end
                        if espStuds and myHrp then
                            table.insert(lines, tostring(math.floor((hrp.Position - myHrp.Position).Magnitude)) .. " studs")
                        end
                        vis.BillboardText.TextColor3 = roleCol
                        vis.BillboardText.Text = table.concat(lines, "\n")
                    else
                        vis.Billboard.Enabled = false
                    end

                    if espLines then
                        local origin2D = Vector2.new(vp.X / 2, vp.Y)
                        if myHrp then
                            local myPos2D, myOn = Camera:WorldToViewportPoint(myHrp.Position)
                            if myOn and myPos2D.Z > 0 then origin2D = Vector2.new(myPos2D.X, myPos2D.Y) end
                        end
                        draw2DLine(vis.Tracer, origin2D, projectWorldEvenOffscreen(hrp.Position), roleCol, 1.5)
                    else
                        vis.Tracer.Visible = false
                    end

                    if espHead and head then
                        local hPos, hOn = Camera:WorldToViewportPoint(head.Position)
                        if hOn and hPos.Z > 0 then
                            local topPos = Camera:WorldToViewportPoint(head.Position + Vector3.new(0, head.Size.Y / 2 + 0.3, 0))
                            local rad = math.clamp(math.abs(topPos.Y - hPos.Y), 4, 80)
                            vis.HeadCircle.Size = UDim2.new(0, rad * 2, 0, rad * 2)
                            vis.HeadCircle.Position = UDim2.new(0, hPos.X - rad, 0, hPos.Y - rad)
                            vis.HeadStroke.Color = roleCol
                            vis.HeadCircle.Visible = true
                        else
                            vis.HeadCircle.Visible = false
                        end
                    else
                        vis.HeadCircle.Visible = false
                    end

                    if espSkeleton then
                        local pairsList = (hum.RigType == Enum.HumanoidRigType.R15) and bonePairsR15 or bonePairsR6
                        for idx, bFrame in ipairs(vis.Bones) do
                            local pair = pairsList[idx]
                            local pA = pair and char:FindFirstChild(pair[1]) :: BasePart?
                            local pB = pair and char:FindFirstChild(pair[2]) :: BasePart?
                            if pA and pB then
                                local sA, onA = Camera:WorldToViewportPoint(pA.Position)
                                local sB, onB = Camera:WorldToViewportPoint(pB.Position)
                                if onA and onB and sA.Z > 0 and sB.Z > 0 then
                                    draw2DLine(bFrame, Vector2.new(sA.X, sA.Y), Vector2.new(sB.X, sB.Y), roleCol, 1.4)
                                else
                                    bFrame.Visible = false
                                end
                            else
                                bFrame.Visible = false
                            end
                        end
                    else
                        for _, bFrame in ipairs(vis.Bones) do bFrame.Visible = false end
                    end
                else
                    cleanupVisuals(player)
                end
            end
        end
    end)
end

do
    local silentAimEnabled = false
    local showFovCircle = false
    local fovScale = 0.25
    local targetPartName = "HumanoidRootPart"
    local wallCheckPriority = false

    local visRayParams = RaycastParams.new()
    visRayParams.FilterType = Enum.RaycastFilterType.Exclude
    visRayParams.IgnoreWater = true

    local function isTargetVisible(targetPart: BasePart, targetChar: Instance?): boolean
        local filter: {Instance} = {}
        if LocalPlayer.Character then table.insert(filter, LocalPlayer.Character) end
        if targetChar then table.insert(filter, targetChar) end
        visRayParams.FilterDescendantsInstances = filter
        local origin = Camera.CFrame.Position
        local result = workspace:Raycast(origin, targetPart.Position - origin, visRayParams)
        return result == nil
    end

    local fovGui = create("ScreenGui", {
        Name = "TaphHub_FOV",
        ResetOnSpawn = false,
        IgnoreGuiInset = true,
        ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
        Parent = (gethui and gethui()) or CoreGui
    })

    local fovFrame = create("Frame", {
        BackgroundTransparency = 1,
        BorderSizePixel = 0,
        Visible = false,
        Parent = fovGui
    }, {
        create("UICorner", { CornerRadius = UDim.new(1, 0) }),
        create("UIStroke", { Color = Color3.fromRGB(46, 213, 115), Thickness = 1.5 })
    })

    local function getFovRadius(): number
        local vp = Camera.ViewportSize
        return (math.sqrt(vp.X ^ 2 + vp.Y ^ 2) / 2) * fovScale
    end

    RunService.RenderStepped:Connect(function()
        local radius = getFovRadius()
        local vp = Camera.ViewportSize
        fovFrame.Size = UDim2.new(0, radius * 2, 0, radius * 2)
        fovFrame.Position = UDim2.new(0, vp.X / 2 - radius, 0, vp.Y / 2 - radius)
        fovFrame.Visible = silentAimEnabled and showFovCircle
    end)

    local function getClosestTarget(): BasePart?
        local vp = Camera.ViewportSize
        local centerX, centerY = vp.X / 2, vp.Y / 2
        local radius = getFovRadius()
        local candidates: {{part: BasePart, dist: number}} = {}

        for _, player in ipairs(Players:GetPlayers()) do
            if player ~= LocalPlayer then
                local char = player.Character
                local hum = char and char:FindFirstChildOfClass("Humanoid")
                if char and hum and hum.Health > 0 then
                    local part = (char:FindFirstChild(targetPartName) or char:FindFirstChild("HumanoidRootPart")) :: BasePart?
                    if part then
                        local screenPos, onScreen = Camera:WorldToViewportPoint(part.Position)
                        if onScreen and screenPos.Z > 0 then
                            local dist = math.sqrt((screenPos.X - centerX) ^ 2 + (screenPos.Y - centerY) ^ 2)
                            if dist <= radius then
                                table.insert(candidates, { part = part, dist = dist })
                            end
                        end
                    end
                end
            end
        end

        if #candidates == 0 then return nil end
        table.sort(candidates, function(a, b) return a.dist < b.dist end)

        if wallCheckPriority then
            for _, entry in ipairs(candidates) do
                if isTargetVisible(entry.part, entry.part.Parent) then
                    return entry.part
                end
            end
        end

        return candidates[1].part
    end

    task.defer(function()
        local fastCast: any = nil
        local sph = ReplicatedStorage:WaitForChild("SPH_Assets", 10)
        local mods = sph and sph:WaitForChild("Modules", 10)
        local fcMod = mods and mods:WaitForChild("FastCast", 10)

        if fcMod and fcMod:IsA("ModuleScript") then
            local ok, mod = pcall(require, fcMod)
            if ok and type(mod) == "table" and type(rawget(mod, "Fire")) == "function" then
                fastCast = mod
            end
        end

        if not fastCast then
            for _, desc in ipairs(ReplicatedStorage:GetDescendants()) do
                if desc:IsA("ModuleScript") and desc.Name == "FastCast" then
                    local ok, mod = pcall(require, desc)
                    if ok and type(mod) == "table" and type(rawget(mod, "Fire")) == "function" then
                        fastCast = mod
                        break
                    end
                end
            end
        end

        if not fastCast then return end

        local oldFire = fastCast.Fire
        fastCast.Fire = function(...)
            local args = { ... }
            if silentAimEnabled then
                local targetPart = getClosestTarget()
                if targetPart and typeof(args[2]) == "Vector3" then
                    local origin: Vector3 = args[2]
                    local unitDir = (targetPart.Position - origin).Unit
                    local newDir = unitDir * 1000
                    args[3] = newDir
                    args[4] = newDir * 9000000000
                end
            end
            return oldFire(table.unpack(args))
        end
    end)

    local SilentAimCat = TargetTab:AddCategory("Silent Aim")
    local SilentFovSlider

    SilentAimCat:AddToggle({
        Name = "Silent Aim",
        Default = false,
        Callback = function(val)
            silentAimEnabled = val
            SilentFovSlider:SetEnabled(val)
        end
    })

    SilentAimCat:AddToggle({
        Name = "Show FOV Circle",
        Default = false,
        Callback = function(val) showFovCircle = val end
    })

    SilentFovSlider = SilentAimCat:AddSlider({
        Name = "FOV Size",
        Min = 1, Max = 100, Default = 25, Suffix = "%", Enabled = false,
        Callback = function(val) fovScale = val / 100 end
    })

    SilentAimCat:AddDropdown({
        Name = "Target Part",
        Options = { "HumanoidRootPart", "Head" },
        Default = "HumanoidRootPart",
        Callback = function(val) targetPartName = val end
    })

    SilentAimCat:AddToggle({
        Name = "Wall Check Priority",
        Default = false,
        Callback = function(val) wallCheckPriority = val end
    })

    local AimbotCat = TargetTab:AddCategory("Aimbot")
    local aimbotEnabled = false
    local aimbotDistance = 15
    local abIgnoreLobby = false
    local abIgnoreHiders = false
    local AimbotDistSlider

    local isLockedFirstPerson = false
    local transitionStart = 0
    local savedCamMode = LocalPlayer.CameraMode
    local savedMinZoom = LocalPlayer.CameraMinZoomDistance
    local savedMaxZoom = LocalPlayer.CameraMaxZoomDistance

    local function releaseAimbotCamera()
        if isLockedFirstPerson then
            isLockedFirstPerson = false
            LocalPlayer.CameraMode = savedCamMode
            LocalPlayer.CameraMinZoomDistance = savedMinZoom
            LocalPlayer.CameraMaxZoomDistance = savedMaxZoom
        end
    end

    AimbotCat:AddToggle({
        Name = "Aimbot",
        Default = false,
        Keybind = Enum.KeyCode.N,
        Callback = function(val)
            aimbotEnabled = val
            AimbotDistSlider:SetEnabled(val)
            if not val then releaseAimbotCamera() end
        end
    })

    AimbotDistSlider = AimbotCat:AddSlider({
        Name = "Distance",
        Min = 3, Max = 50, Default = 15, Suffix = " st", Enabled = false,
        Callback = function(val) aimbotDistance = val end
    })

    AimbotCat:AddToggle({
        Name = "Ignore Lobby Players",
        Default = false,
        Callback = function(val) abIgnoreLobby = val end
    })

    AimbotCat:AddToggle({
        Name = "Ignore Hiders",
        Default = false,
        Callback = function(val) abIgnoreHiders = val end
    })

    local function findAimbotTarget(): BasePart?
        local myChar = LocalPlayer.Character
        local myHrp = myChar and myChar:FindFirstChild("HumanoidRootPart") :: BasePart?
        if not myHrp then return nil end

        local closestHrp: BasePart? = nil
        local shortestDist = aimbotDistance

        for _, player in ipairs(Players:GetPlayers()) do
            if player ~= LocalPlayer then
                local char = player.Character
                local hum = char and char:FindFirstChildOfClass("Humanoid")
                local hrp = char and char:FindFirstChild("HumanoidRootPart") :: BasePart?
                if char and hum and hum.Health > 0 and hrp then
                    local inLob = isInLobby(player)
                    local isHider = (not inLob) and (not hasGun(player))
                    if not (abIgnoreLobby and inLob) and not (abIgnoreHiders and isHider) then
                        local d = (hrp.Position - myHrp.Position).Magnitude
                        if d <= shortestDist then
                            shortestDist = d
                            closestHrp = hrp
                        end
                    end
                end
            end
        end

        return closestHrp
    end

    RunService.RenderStepped:Connect(function()
        if not aimbotEnabled then return end

        local targetHrp = findAimbotTarget()
        local myChar = LocalPlayer.Character
        local myHead = myChar and myChar:FindFirstChild("Head") :: BasePart?

        if targetHrp and myHead then
            if not isLockedFirstPerson then
                isLockedFirstPerson = true
                transitionStart = os.clock()
                savedCamMode = LocalPlayer.CameraMode
                savedMinZoom = LocalPlayer.CameraMinZoomDistance
                savedMaxZoom = LocalPlayer.CameraMaxZoomDistance
            end

            local elapsed = os.clock() - transitionStart
            local alpha = math.clamp(elapsed / 0.025, 0, 1)

            if alpha < 1 then
                local camPos = Camera.CFrame.Position:Lerp(myHead.Position, alpha)
                Camera.CFrame = CFrame.lookAt(camPos, targetHrp.Position)
            else
                if LocalPlayer.CameraMode ~= Enum.CameraMode.LockFirstPerson then
                    LocalPlayer.CameraMode = Enum.CameraMode.LockFirstPerson
                end
                Camera.CFrame = CFrame.lookAt(Camera.CFrame.Position, targetHrp.Position)
            end
        else
            releaseAimbotCamera()
        end
    end)

    local PlayerTargetCat = TargetTab:AddCategory("Player Target")
    local ptContainer = PlayerTargetCat:GetContainer()
    local selectedTargetPlayer: Player? = nil
    local spectatingTarget = false
    local followingTarget = false
    local savedReturnCFrame: CFrame? = nil

    local TargetAvatarImg = create("ImageLabel", {
        Size = UDim2.new(0, 34, 0, 34),
        Position = UDim2.new(0, 8, 0.5, -17),
        BackgroundColor3 = Color3.fromRGB(26, 36, 30),
        BorderSizePixel = 0,
        Visible = false
    }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }) })

    local SelectDropdownBtn = create("TextButton", {
        Size = UDim2.new(0, 175, 0, 26),
        Position = UDim2.new(1, -185, 0.5, -13),
        BackgroundColor3 = Color3.fromRGB(26, 38, 30),
        BorderSizePixel = 0,
        Font = Enum.Font.GothamBold,
        TextSize = 11,
        TextColor3 = Color3.fromRGB(46, 213, 115),
        Text = "Select Player"
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 6) }),
        create("UIStroke", { Color = Color3.fromRGB(46, 213, 115), Thickness = 1, Transparency = 0.4 })
    })

    local TargetTitleLbl = create("TextLabel", {
        Size = UDim2.new(1, -200, 1, 0),
        Position = UDim2.new(0, 10, 0, 0),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamMedium,
        TextSize = 12,
        TextColor3 = Color3.fromRGB(225, 235, 228),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "Server Player"
    })

    local TargetTopRow = create("Frame", {
        Size = UDim2.new(1, 0, 0, 44),
        BackgroundColor3 = Color3.fromRGB(20, 26, 22),
        BorderSizePixel = 0,
        Parent = ptContainer
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 7) }),
        TargetAvatarImg,
        TargetTitleLbl,
        SelectDropdownBtn
    })

    registerThemedElement(function()
        local w = (currentTheme == "White")
        TargetTopRow.BackgroundColor3 = w and Color3.fromRGB(224, 232, 227) or Color3.fromRGB(20, 26, 22)
        TargetTitleLbl.TextColor3 = w and Color3.fromRGB(25, 35, 30) or Color3.fromRGB(225, 235, 228)
        SelectDropdownBtn.BackgroundColor3 = w and Color3.fromRGB(210, 225, 215) or Color3.fromRGB(26, 38, 30)
    end)

    local PlayerListFrame = create("Frame", {
        Size = UDim2.new(1, 0, 0, 0),
        AutomaticSize = Enum.AutomaticSize.Y,
        BackgroundColor3 = Color3.fromRGB(18, 24, 20),
        BorderSizePixel = 0,
        Visible = false,
        Parent = ptContainer
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 7) }),
        create("UIListLayout", { SortOrder = Enum.SortOrder.LayoutOrder, Padding = UDim.new(0, 4) }),
        create("UIPadding", {
            PaddingTop = UDim.new(0, 6), PaddingBottom = UDim.new(0, 6),
            PaddingLeft = UDim.new(0, 6), PaddingRight = UDim.new(0, 6)
        })
    })

    local GoToBtn, SpectateBtn, FollowBtn

    local function selectPlayer(plr: Player)
        selectedTargetPlayer = plr
        SelectDropdownBtn.Text = plr.Name
        TargetAvatarImg.Visible = true
        TargetTitleLbl.Position = UDim2.new(0, 50, 0, 0)
        TargetTitleLbl.Text = plr.DisplayName
        PlayerListFrame.Visible = false

        task.spawn(function()
            local ok, thumb = pcall(function()
                return Players:GetUserThumbnailAsync(plr.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size150x150)
            end)
            if ok and thumb then TargetAvatarImg.Image = thumb end
        end)

        GoToBtn:SetEnabled(true)
        SpectateBtn:SetEnabled(true)
        FollowBtn:SetEnabled(true)
    end

    local function refreshPlayerList()
        for _, child in ipairs(PlayerListFrame:GetChildren()) do
            if child:IsA("TextButton") then child:Destroy() end
        end
        for _, plr in ipairs(Players:GetPlayers()) do
            if plr ~= LocalPlayer then
                local PBtn = create("TextButton", {
                    Size = UDim2.new(1, 0, 0, 26),
                    BackgroundColor3 = Color3.fromRGB(24, 34, 28),
                    BorderSizePixel = 0,
                    Font = Enum.Font.GothamMedium,
                    TextSize = 11,
                    TextColor3 = Color3.fromRGB(230, 240, 234),
                    Text = plr.DisplayName .. " (@" .. plr.Name .. ")",
                    Parent = PlayerListFrame
                }, { create("UICorner", { CornerRadius = UDim.new(0, 5) }) })

                PBtn.MouseButton1Click:Connect(function()
                    selectPlayer(plr)
                end)
            end
        end
    end

    SelectDropdownBtn.MouseButton1Click:Connect(function()
        PlayerListFrame.Visible = not PlayerListFrame.Visible
        if PlayerListFrame.Visible then
            refreshPlayerList()
        end
    end)

    local lobbyLockActive = false
    local lastLobbyCFrame: CFrame? = nil

    GoToBtn = PlayerTargetCat:AddButton({
        Name = "Go to Player",
        Enabled = false,
        Callback = function()
            if not selectedTargetPlayer or not selectedTargetPlayer.Character then return end
            local targetHrp = selectedTargetPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
            local myHrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
            if targetHrp and myHrp then
                lobbyLockActive = false
                lastLobbyCFrame = nil
                myHrp.CFrame = targetHrp.CFrame * CFrame.new(0, 0, 3.5)
                Window:Notify({ Title = "Player Target", Description = "Teleported behind " .. selectedTargetPlayer.Name, Duration = 2 })
            end
        end
    })

    SpectateBtn = PlayerTargetCat:AddButton({
        Name = "Spectate Player",
        Enabled = false,
        Callback = function()
            spectatingTarget = not spectatingTarget
            if spectatingTarget and selectedTargetPlayer and selectedTargetPlayer.Character then
                local thum = selectedTargetPlayer.Character:FindFirstChildOfClass("Humanoid")
                if thum then
                    Camera.CameraSubject = thum
                    Window:Notify({ Title = "Spectate Player", Description = "Now spectating " .. selectedTargetPlayer.Name, Duration = 2 })
                end
            else
                spectatingTarget = false
                local myHum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
                if myHum then Camera.CameraSubject = myHum end
                Window:Notify({ Title = "Spectate Player", Description = "Camera returned to you.", Duration = 2 })
            end
        end
    })

    local function stopFollowing()
        if not followingTarget then return end
        followingTarget = false
        followNoclipOverride = false
        local myHrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
        if myHrp and savedReturnCFrame then
            myHrp.AssemblyLinearVelocity = Vector3.zero
            myHrp.CFrame = savedReturnCFrame
        end
        savedReturnCFrame = nil
    end

    FollowBtn = PlayerTargetCat:AddButton({
        Name = "Follow Player",
        Enabled = false,
        Callback = function()
            if not followingTarget then
                if not selectedTargetPlayer or not selectedTargetPlayer.Character then return end
                local myHrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
                if myHrp then
                    lobbyLockActive = false
                    lastLobbyCFrame = nil
                    savedReturnCFrame = myHrp.CFrame
                    followingTarget = true
                    followNoclipOverride = true
                    Window:Notify({ Title = "Follow Player", Description = "Following " .. selectedTargetPlayer.Name, Duration = 2 })
                end
            else
                stopFollowing()
                Window:Notify({ Title = "Follow Player", Description = "Stopped following and returned back.", Duration = 2 })
            end
        end
    })

    RunService.Heartbeat:Connect(function()
        if followingTarget then
            if not selectedTargetPlayer or not selectedTargetPlayer.Parent or not selectedTargetPlayer.Character then
                stopFollowing()
                return
            end
            local targetHrp = selectedTargetPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
            local myHrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
            if targetHrp and myHrp then
                myHrp.AssemblyLinearVelocity = Vector3.zero
                myHrp.AssemblyAngularVelocity = Vector3.zero
                myHrp.CFrame = targetHrp.CFrame * CFrame.new(0, 0, 3.5)
            end
        elseif lobbyLockActive and lastLobbyCFrame then
            local myHrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
            if myHrp then
                local distFromLast = (myHrp.Position - lastLobbyCFrame.Position).Magnitude
                local currentlyInLobby = isInLobby(LocalPlayer)
                if currentlyInLobby and distFromLast < 22 then
                    lastLobbyCFrame = myHrp.CFrame
                elseif not currentlyInLobby or distFromLast >= 22 then
                    myHrp.AssemblyLinearVelocity = Vector3.zero
                    myHrp.CFrame = lastLobbyCFrame
                end
            end
        end
    end)

    Players.PlayerRemoving:Connect(function(plr)
        if plr == selectedTargetPlayer then
            if followingTarget then stopFollowing() end
            if spectatingTarget then
                spectatingTarget = false
                local myHum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
                if myHum then Camera.CameraSubject = myHum end
            end
            selectedTargetPlayer = nil
            TargetAvatarImg.Visible = false
            TargetTitleLbl.Position = UDim2.new(0, 10, 0, 0)
            TargetTitleLbl.Text = "Server Player"
            SelectDropdownBtn.Text = "Select Player"
            GoToBtn:SetEnabled(false)
            SpectateBtn:SetEnabled(false)
            FollowBtn:SetEnabled(false)
        end
    end)

    local TeleportCat = TargetTab:AddCategory("Teleport Buttons")

    TeleportCat:AddButton({
        Name = "Teleport to Lobby",
        Enabled = true,
        Callback = function()
            local myHrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
            if not myHrp then return end
            local targetSpawn: BasePart? = nil

            for _, lob in ipairs(lobbyObjects) do
                if lob and lob.Parent then
                    for _, desc in ipairs(lob:GetDescendants()) do
                        if desc:IsA("SpawnLocation") or (desc:IsA("BasePart") and string.find(string.lower(desc.Name), "spawn")) then
                            targetSpawn = desc :: BasePart
                            break
                        end
                    end
                    if not targetSpawn and lob:IsA("Model") then
                        local destCF = lob:GetPivot() + Vector3.new(0, 5, 0)
                        lastLobbyCFrame = destCF
                        lobbyLockActive = true
                        myHrp.AssemblyLinearVelocity = Vector3.zero
                        myHrp.CFrame = destCF
                        Window:Notify({ Title = "Teleport", Description = "Teleported to Lobby.", Duration = 2 })
                        return
                    end
                end
                if targetSpawn then break end
            end

            if not targetSpawn then
                for _, desc in ipairs(workspace:GetDescendants()) do
                    if desc:IsA("SpawnLocation") then
                        targetSpawn = desc
                        break
                    end
                end
            end

            if targetSpawn then
                local destCF = targetSpawn.CFrame + Vector3.new(0, 4, 0)
                lastLobbyCFrame = destCF
                lobbyLockActive = true
                myHrp.AssemblyLinearVelocity = Vector3.zero
                myHrp.CFrame = destCF
                Window:Notify({ Title = "Teleport", Description = "Teleported to Lobby.", Duration = 2 })
            end
        end
    })

    TeleportCat:AddButton({
        Name = "Teleport to Map",
        Enabled = true,
        Callback = function()
            local myHrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
            if not myHrp then return end

            lobbyLockActive = false
            lastLobbyCFrame = nil

            local mapFolder: Instance? = workspace:FindFirstChild("map")
            if not mapFolder then
                for _, obj in ipairs(workspace:GetDescendants()) do
                    if obj.Name == "map" and (obj:IsA("Folder") or obj:IsA("Model")) then
                        mapFolder = obj
                        break
                    end
                end
            end

            if not mapFolder then
                Window:Notify({ Title = "Teleport to Map", Description = "Folder 'map' not found in Workspace.", Duration = 2 })
                return
            end

            local spawnCandidates: {BasePart} = {}

            for _, mapChild in ipairs(mapFolder:GetChildren()) do
                local spawnsFolder = mapChild:FindFirstChild("spawns")
                if spawnsFolder then
                    local civFolder = spawnsFolder:FindFirstChild("civ")
                    if civFolder then
                        for _, sp in ipairs(civFolder:GetChildren()) do
                            if sp:IsA("BasePart") and string.lower(sp.Name) == "spawn" then
                                table.insert(spawnCandidates, sp)
                            elseif sp:IsA("BasePart") then
                                table.insert(spawnCandidates, sp)
                            end
                        end
                    end
                    if #spawnCandidates == 0 then
                        for _, desc in ipairs(spawnsFolder:GetDescendants()) do
                            if desc:IsA("BasePart") then
                                table.insert(spawnCandidates, desc)
                            end
                        end
                    end
                end
            end

            if #spawnCandidates == 0 then
                for _, desc in ipairs(mapFolder:GetDescendants()) do
                    if desc:IsA("BasePart") and string.lower(desc.Name) == "spawn" then
                        table.insert(spawnCandidates, desc)
                    end
                end
            end

            if #spawnCandidates > 0 then
                local chosenSpawn = spawnCandidates[math.random(1, #spawnCandidates)]
                myHrp.AssemblyLinearVelocity = Vector3.zero
                myHrp.CFrame = chosenSpawn.CFrame + Vector3.new(0, 4, 0)
                Window:Notify({ Title = "Teleport to Map", Description = "Teleported to map spawn.", Duration = 2 })
            else
                Window:Notify({ Title = "Teleport to Map", Description = "No 'spawn' parts found inside map -> spawns -> civ.", Duration = 2 })
            end
        end
    })
end

do
    local OptCat = GameTab:AddCategory("Optimization")
    local autoCleanEnabled = false
    local maxProjectiles = 20
    local maxShells = 15

    local ProjectilesFolder: Instance? = nil
    local ShellsFolder: Instance? = nil

    task.spawn(function()
        local sphWs = workspace:WaitForChild("SPH_Workspace", 10)
        if sphWs then
            ProjectilesFolder = sphWs:WaitForChild("Projectiles", 10)
            ShellsFolder = sphWs:WaitForChild("Shells", 10)
        end
    end)

    local function trimFolder(folder: Instance?, limit: number)
        if not folder then return end
        local items = folder:GetChildren()
        local count = #items
        if count > limit then
            for i = 1, count - limit do
                local obj = items[i]
                pcall(function() obj:Destroy() end)
            end
        end
    end

    RunService.Heartbeat:Connect(function()
        if not autoCleanEnabled then return end
        trimFolder(ProjectilesFolder, maxProjectiles)
        trimFolder(ShellsFolder, maxShells)
    end)

    local function clearAllProjectilesAndShells()
        if ProjectilesFolder then
            for _, child in ipairs(ProjectilesFolder:GetChildren()) do
                pcall(function() child:Destroy() end)
            end
        end
        if ShellsFolder then
            for _, child in ipairs(ShellsFolder:GetChildren()) do
                pcall(function() child:Destroy() end)
            end
        end
    end

    OptCat:AddToggle({
        Name = "Auto-Clean Projectiles & Shells",
        Default = false,
        Callback = function(val) autoCleanEnabled = val end
    })

    OptCat:AddSlider({
        Name = "Max Projectiles",
        Min = 5, Max = 80, Default = 20, Enabled = true,
        Callback = function(val) maxProjectiles = val end
    })

    OptCat:AddSlider({
        Name = "Max Shells",
        Min = 5, Max = 80, Default = 15, Enabled = true,
        Callback = function(val) maxShells = val end
    })

    OptCat:AddButton({
        Name = "Clear Now",
        Enabled = true,
        Callback = function()
            clearAllProjectilesAndShells()
            Window:Notify({
                Title = "Cleared",
                Description = "Projectiles and shells removed.",
                Duration = 2
            })
        end
    })

    local FpsBoostCat = GameTab:AddCategory("FPS Boost")
    local removeTextureEnabled = false
    local deleteDistantEnabled = false
    local renderDistStuds = 64
    local DistantSlider

    local savedMaterials: {[BasePart]: Enum.Material} = {}
    local savedDecals: {[Instance]: number} = {}

    local function stripObjectTexture(obj: Instance)
        if obj:IsA("BasePart") and not obj:IsA("Terrain") then
            if not savedMaterials[obj] then
                savedMaterials[obj] = obj.Material
            end
            obj.Material = Enum.Material.SmoothPlastic
        elseif obj:IsA("Decal") or obj:IsA("Texture") then
            local dec = obj :: Decal
            if savedDecals[obj] == nil then
                savedDecals[obj] = dec.Transparency
            end
            dec.Transparency = 1
        end
    end

    local function restoreAllTextures()
        for part, mat in pairs(savedMaterials) do
            if part and part.Parent then
                part.Material = mat
            end
        end
        table.clear(savedMaterials)

        for dec, tran in pairs(savedDecals) do
            if dec and dec.Parent then
                (dec :: Decal).Transparency = tran
            end
        end
        table.clear(savedDecals)
    end

    FpsBoostCat:AddToggle({
        Name = "Remove Texture",
        Default = false,
        Callback = function(val)
            removeTextureEnabled = val
            if val then
                for _, obj in ipairs(workspace:GetDescendants()) do
                    stripObjectTexture(obj)
                end
            else
                restoreAllTextures()
            end
        end
    })

    workspace.DescendantAdded:Connect(function(obj)
        if removeTextureEnabled then
            task.defer(function()
                stripObjectTexture(obj)
            end)
        end
    end)

    local hiddenDistantParts: {[BasePart]: {tran: number, shadow: boolean}} = {}

    local function isCharacterPart(part: BasePart): boolean
        if LocalPlayer.Character and part:IsDescendantOf(LocalPlayer.Character) then
            return true
        end
        for _, p in ipairs(Players:GetPlayers()) do
            if p.Character and part:IsDescendantOf(p.Character) then
                return true
            end
        end
        return false
    end

    local function restoreAllHiddenParts()
        for part, info in pairs(hiddenDistantParts) do
            if part and part.Parent then
                part.Transparency = info.tran
                part.CastShadow = info.shadow
            end
            hiddenDistantParts[part] = nil
        end
    end

    FpsBoostCat:AddToggle({
        Name = "Delete Distant Parts",
        Default = false,
        Callback = function(val)
            deleteDistantEnabled = val
            DistantSlider:SetEnabled(val)
            if not val then
                restoreAllHiddenParts()
            end
        end
    })

    DistantSlider = FpsBoostCat:AddSlider({
        Name = "Distance",
        Min = 8, Max = 256, Default = 64, Suffix = " st", Enabled = false,
        Callback = function(val)
            renderDistStuds = val
        end
    })

    local lastCullTick = 0
    RunService.Heartbeat:Connect(function()
        if not deleteDistantEnabled then return end
        local now = os.clock()
        if now - lastCullTick < 0.15 then return end
        lastCullTick = now

        local myHrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
        if not myHrp then return end
        local myPos = myHrp.Position

        for part, info in pairs(hiddenDistantParts) do
            if not part or not part.Parent then
                hiddenDistantParts[part] = nil
            elseif (part.Position - myPos).Magnitude <= renderDistStuds then
                part.Transparency = info.tran
                part.CastShadow = info.shadow
                hiddenDistantParts[part] = nil
            end
        end

        for _, obj in ipairs(workspace:GetDescendants()) do
            if obj:IsA("BasePart") and not obj:IsA("Terrain") and obj.Name ~= "TaphClientLadder" and not isCharacterPart(obj) then
                if (obj.Position - myPos).Magnitude > renderDistStuds then
                    if not hiddenDistantParts[obj] then
                        hiddenDistantParts[obj] = {
                            tran = obj.Transparency,
                            shadow = obj.CastShadow
                        }
                        obj.Transparency = 1
                        obj.CastShadow = false
                    end
                end
            end
        end
    end)

    local MapInfoCat = GameTab:AddCategory("Map Information")
    local CurrentMapLbl = MapInfoCat:AddLabel("Current Map: None")
    local PlayersRoundLbl = MapInfoCat:AddLabel("Players on Round: 0")
    local PlayersAliveLbl = MapInfoCat:AddLabel("Players Alive: 0")
    local SeekerDistLbl = MapInfoCat:AddLabel("How Close is Seeker: 0 Studs")

    local WidgetFrame = create("Frame", {
        Name = "MapInfoWidget",
        Size = UDim2.new(0, 225, 0, 118),
        Position = UDim2.new(1, -240, 0, 16),
        BackgroundColor3 = Color3.fromRGB(14, 19, 16),
        BorderSizePixel = 0,
        Visible = false,
        ZIndex = 250,
        Parent = Window:GetScreenGui()
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 10) }),
        create("UIStroke", { Color = Color3.fromRGB(46, 213, 115), Thickness = 1.2, Transparency = 0.25 }),
        create("TextLabel", {
            Size = UDim2.new(1, -20, 0, 22),
            Position = UDim2.new(0, 12, 0, 6),
            BackgroundTransparency = 1,
            Font = Enum.Font.GothamBold,
            TextSize = 12,
            TextColor3 = Color3.fromRGB(46, 213, 115),
            TextXAlignment = Enum.TextXAlignment.Left,
            Text = "Map Information",
            ZIndex = 251
        })
    })
    makeDraggable(WidgetFrame)

    local W_CurrentMap = create("TextLabel", {
        Size = UDim2.new(1, -20, 0, 18),
        Position = UDim2.new(0, 12, 0, 30),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamMedium,
        TextSize = 11,
        TextColor3 = Color3.fromRGB(225, 235, 228),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "Current Map: None",
        ZIndex = 251,
        Parent = WidgetFrame
    })

    local W_PlayersRound = create("TextLabel", {
        Size = UDim2.new(1, -20, 0, 18),
        Position = UDim2.new(0, 12, 0, 50),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamMedium,
        TextSize = 11,
        TextColor3 = Color3.fromRGB(225, 235, 228),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "Players on Round: 0",
        ZIndex = 251,
        Parent = WidgetFrame
    })

    local W_PlayersAlive = create("TextLabel", {
        Size = UDim2.new(1, -20, 0, 18),
        Position = UDim2.new(0, 12, 0, 70),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamMedium,
        TextSize = 11,
        TextColor3 = Color3.fromRGB(225, 235, 228),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "Players Alive: 0",
        ZIndex = 251,
        Parent = WidgetFrame
    })

    local W_SeekerDist = create("TextLabel", {
        Size = UDim2.new(1, -20, 0, 18),
        Position = UDim2.new(0, 12, 0, 90),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamMedium,
        TextSize = 11,
        TextColor3 = Color3.fromRGB(225, 235, 228),
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "How Close is Seeker: 0 Studs",
        ZIndex = 251,
        Parent = WidgetFrame
    })

    registerThemedElement(function()
        local w = (currentTheme == "White")
        WidgetFrame.BackgroundColor3 = w and Color3.fromRGB(240, 245, 242) or Color3.fromRGB(14, 19, 16)
        local tc = w and Color3.fromRGB(25, 35, 30) or Color3.fromRGB(225, 235, 228)
        W_CurrentMap.TextColor3 = tc
        W_PlayersRound.TextColor3 = tc
        W_PlayersAlive.TextColor3 = tc
        W_SeekerDist.TextColor3 = tc
    end)

    MapInfoCat:AddToggle({
        Name = "Add Widget Map Information",
        Default = false,
        Callback = function(val)
            WidgetFrame.Visible = val
        end
    })

    local trackedMapInstance: Instance? = nil
    local lockedRoundCount = 0
    local roundCountLocked = false
    local firstTeleportTimestamp = 0

    RunService.Heartbeat:Connect(function()
        local mapFolder = workspace:FindFirstChild("map")
        local activeMapModel: Instance? = nil
        if mapFolder then
            for _, child in ipairs(mapFolder:GetChildren()) do
                if child:IsA("Model") or child:IsA("Folder") then
                    activeMapModel = child
                    break
                end
            end
        end

        if activeMapModel ~= trackedMapInstance then
            trackedMapInstance = activeMapModel
            lockedRoundCount = 0
            roundCountLocked = false
            firstTeleportTimestamp = 0
        end

        local mapNameStr = activeMapModel and activeMapModel.Name or "None"

        local aliveOnMap = 0
        local myHrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") :: BasePart?
        local closestSeekerStuds: number? = nil

        for _, plr in ipairs(Players:GetPlayers()) do
            local char = plr.Character
            local hum = char and char:FindFirstChildOfClass("Humanoid")
            local hrp = char and char:FindFirstChild("HumanoidRootPart") :: BasePart?
            if char and hum and hum.Health > 0 and hrp then
                if not isInLobby(plr) then
                    aliveOnMap += 1
                    if plr ~= LocalPlayer and hasGun(plr) and myHrp then
                        local dist = math.floor((hrp.Position - myHrp.Position).Magnitude)
                        if closestSeekerStuds == nil or dist < closestSeekerStuds then
                            closestSeekerStuds = dist
                        end
                    end
                end
            end
        end

        if activeMapModel then
            if not roundCountLocked then
                if aliveOnMap > 0 then
                    if firstTeleportTimestamp == 0 then
                        firstTeleportTimestamp = os.clock()
                    end
                    if aliveOnMap > lockedRoundCount then
                        lockedRoundCount = aliveOnMap
                    end
                    if os.clock() - firstTeleportTimestamp >= 4 then
                        roundCountLocked = true
                    end
                end
            end
        else
            lockedRoundCount = 0
            roundCountLocked = false
            firstTeleportTimestamp = 0
        end

        local seekerText = closestSeekerStuds and (tostring(closestSeekerStuds) .. " Studs") or "0 Studs"

        local t1 = "Current Map: " .. mapNameStr
        local t2 = "Players on Round: " .. tostring(lockedRoundCount)
        local t3 = "Players Alive: " .. tostring(aliveOnMap)
        local t4 = "How Close is Seeker: " .. seekerText

        CurrentMapLbl.Text = t1
        PlayersRoundLbl.Text = t2
        PlayersAliveLbl.Text = t3
        SeekerDistLbl.Text = t4

        W_CurrentMap.Text = t1
        W_PlayersRound.Text = t2
        W_PlayersAlive.Text = t3
        W_SeekerDist.Text = t4
    end)
end

do
    local SaveFuncCat = SettingsTab:AddCategory("Save Functions")
    SaveFuncCat:AddToggle({
        Name = "Save Functions",
        Default = false,
        ConfigKey = "Settings_SaveFunctions",
        Callback = function(val)
            saveFunctionsEnabled = val
            if val then
                writeTextFile(AutoSaveFile, serializeCurrentConfig())
            else
                removeTextFile(AutoSaveFile)
            end
        end
    })

    local JsonCat = SettingsTab:AddCategory("JSON Config")
    local jsonContainer = JsonCat:GetContainer()
    local selectedConfigName = "Select Config"

    local ConfigInputBox = create("TextBox", {
        Size = UDim2.new(1, 0, 0, 32),
        BackgroundColor3 = Color3.fromRGB(20, 26, 22),
        BorderSizePixel = 0,
        Font = Enum.Font.GothamMedium,
        TextSize = 12,
        TextColor3 = Color3.fromRGB(235, 245, 238),
        PlaceholderText = "Enter config name...",
        PlaceholderColor3 = Color3.fromRGB(115, 130, 120),
        Text = "",
        ClearTextOnFocus = false,
        Parent = jsonContainer
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 7) }),
        create("UIStroke", { Color = Color3.fromRGB(36, 52, 42), Thickness = 1 }),
        create("UIPadding", { PaddingLeft = UDim.new(0, 10), PaddingRight = UDim.new(0, 10) })
    })

    local ConfigDropdownBtn = create("TextButton", {
        Size = UDim2.new(1, 0, 0, 32),
        BackgroundColor3 = Color3.fromRGB(22, 32, 26),
        BorderSizePixel = 0,
        Font = Enum.Font.GothamBold,
        TextSize = 12,
        TextColor3 = Color3.fromRGB(46, 213, 115),
        Text = "Select Config",
        Parent = jsonContainer
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 7) }),
        create("UIStroke", { Color = Color3.fromRGB(46, 213, 115), Thickness = 1, Transparency = 0.45 })
    })

    local ConfigListFrame = create("Frame", {
        Size = UDim2.new(1, 0, 0, 0),
        AutomaticSize = Enum.AutomaticSize.Y,
        BackgroundColor3 = Color3.fromRGB(18, 24, 20),
        BorderSizePixel = 0,
        Visible = false,
        Parent = jsonContainer
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 7) }),
        create("UIListLayout", { SortOrder = Enum.SortOrder.LayoutOrder, Padding = UDim.new(0, 4) }),
        create("UIPadding", {
            PaddingTop = UDim.new(0, 6), PaddingBottom = UDim.new(0, 6),
            PaddingLeft = UDim.new(0, 6), PaddingRight = UDim.new(0, 6)
        })
    })

    registerThemedElement(function()
        local w = (currentTheme == "White")
        ConfigInputBox.BackgroundColor3 = w and Color3.fromRGB(224, 232, 227) or Color3.fromRGB(20, 26, 22)
        ConfigInputBox.TextColor3 = w and Color3.fromRGB(20, 30, 25) or Color3.fromRGB(235, 245, 238)
        ConfigDropdownBtn.BackgroundColor3 = w and Color3.fromRGB(214, 228, 218) or Color3.fromRGB(22, 32, 26)
        ConfigListFrame.BackgroundColor3 = w and Color3.fromRGB(220, 228, 223) or Color3.fromRGB(18, 24, 20)
    end)

    local AddCfgBtn, DeleteCfgBtn, RenameCfgBtn, AutoLoadCfgBtn

    local function updateConfigButtonsState()
        local valid = (selectedConfigName ~= "Select Config" and selectedConfigName ~= "")
        DeleteCfgBtn:SetEnabled(valid)
        RenameCfgBtn:SetEnabled(valid)
        AutoLoadCfgBtn:SetEnabled(valid)
        AddCfgBtn:SetEnabled(true)
    end

    local function setSelectedConfig(name: string)
        selectedConfigName = name
        ConfigDropdownBtn.Text = name
        ConfigListFrame.Visible = false
        updateConfigButtonsState()
        if name ~= "Select Config" then
            local raw = readTextFile(FolderName .. "/" .. name .. ".json")
            if raw then
                applyConfigJson(raw)
                Window:Notify({ Title = "JSON Config", Description = "Loaded config '" .. name .. "'.", Duration = 2 })
            end
        end
    end

    local function rebuildConfigList()
        for _, child in ipairs(ConfigListFrame:GetChildren()) do
            if child:IsA("TextButton") then child:Destroy() end
        end

        local defaultOpt = create("TextButton", {
            Size = UDim2.new(1, 0, 0, 26),
            BackgroundColor3 = Color3.fromRGB(26, 34, 29),
            BorderSizePixel = 0,
            Font = Enum.Font.GothamMedium,
            TextSize = 11,
            TextColor3 = Color3.fromRGB(180, 195, 185),
            Text = "Select Config",
            Parent = ConfigListFrame
        }, { create("UICorner", { CornerRadius = UDim.new(0, 5) }) })

        defaultOpt.MouseButton1Click:Connect(function()
            setSelectedConfig("Select Config")
        end)

        for _, cfgName in ipairs(listConfigNames()) do
            local CBtn = create("TextButton", {
                Size = UDim2.new(1, 0, 0, 26),
                BackgroundColor3 = Color3.fromRGB(24, 38, 30),
                BorderSizePixel = 0,
                Font = Enum.Font.GothamBold,
                TextSize = 11,
                TextColor3 = Color3.fromRGB(46, 213, 115),
                Text = cfgName .. ".json",
                Parent = ConfigListFrame
            }, { create("UICorner", { CornerRadius = UDim.new(0, 5) }) })

            CBtn.MouseButton1Click:Connect(function()
                setSelectedConfig(cfgName)
            end)
        end
    end

    ConfigDropdownBtn.MouseButton1Click:Connect(function()
        ConfigListFrame.Visible = not ConfigListFrame.Visible
        if ConfigListFrame.Visible then
            rebuildConfigList()
        end
    end)

    AddCfgBtn = JsonCat:AddButton({
        Name = "Add",
        Enabled = true,
        Callback = function()
            local rawName = string.gsub(ConfigInputBox.Text, "[^%w_%-]", "")
            if #rawName == 0 then
                Window:Notify({ Title = "JSON Config", Description = "Enter a valid config name in the text box first.", Duration = 2 })
                return
            end
            writeTextFile(FolderName .. "/" .. rawName .. ".json", serializeCurrentConfig())
            ConfigInputBox.Text = ""
            setSelectedConfig(rawName)
            Window:Notify({ Title = "JSON Config", Description = "Created config '" .. rawName .. ".json'.", Duration = 2 })
        end
    })

    DeleteCfgBtn = JsonCat:AddButton({
        Name = "Delete",
        Enabled = false,
        Callback = function()
            if selectedConfigName == "Select Config" then return end
            local target = selectedConfigName
            removeTextFile(FolderName .. "/" .. target .. ".json")
            local autoLoaded = readTextFile(AutoLoadMetaFile)
            if autoLoaded == target then
                removeTextFile(AutoLoadMetaFile)
            end
            setSelectedConfig("Select Config")
            Window:Notify({ Title = "JSON Config", Description = "Deleted config '" .. target .. ".json'.", Duration = 2 })
        end
    })

    RenameCfgBtn = JsonCat:AddButton({
        Name = "Rename",
        Enabled = false,
        Callback = function()
            if selectedConfigName == "Select Config" then return end
            local newName = string.gsub(ConfigInputBox.Text, "[^%w_%-]", "")
            if #newName == 0 then
                Window:Notify({ Title = "JSON Config", Description = "Enter the new name in the text box first.", Duration = 2 })
                return
            end
            local oldPath = FolderName .. "/" .. selectedConfigName .. ".json"
            local newPath = FolderName .. "/" .. newName .. ".json"
            local existingData = readTextFile(oldPath) or serializeCurrentConfig()
            writeTextFile(newPath, existingData)
            removeTextFile(oldPath)

            local autoLoaded = readTextFile(AutoLoadMetaFile)
            if autoLoaded == selectedConfigName then
                writeTextFile(AutoLoadMetaFile, newName)
            end

            ConfigInputBox.Text = ""
            setSelectedConfig(newName)
            Window:Notify({ Title = "JSON Config", Description = "Renamed config to '" .. newName .. ".json'.", Duration = 2 })
        end
    })

    AutoLoadCfgBtn = JsonCat:AddButton({
        Name = "Set as AutoLoad",
        Enabled = false,
        Callback = function()
            if selectedConfigName == "Select Config" then return end
            writeTextFile(AutoLoadMetaFile, selectedConfigName)
            writeTextFile(FolderName .. "/" .. selectedConfigName .. ".json", serializeCurrentConfig())
            Window:Notify({ Title = "JSON Config", Description = "'" .. selectedConfigName .. ".json' set as AutoLoad.", Duration = 2 })
        end
    })

    local UISettingsCat = SettingsTab:AddCategory("UI Settings")
    local uiContainer = UISettingsCat:GetContainer()

    local KeybindBtn = create("TextButton", {
        Size = UDim2.new(0, 56, 0, 22),
        Position = UDim2.new(1, -66, 0.5, -11),
        BackgroundColor3 = Color3.fromRGB(10, 14, 12),
        BorderSizePixel = 0,
        Font = Enum.Font.GothamBold,
        TextSize = 11,
        TextColor3 = Color3.fromRGB(46, 213, 115),
        Text = Window:GetToggleKey().Name,
        AutoButtonColor = false
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 5) }),
        create("UIStroke", { Color = Color3.fromRGB(46, 213, 115), Thickness = 1, Transparency = 0.4 })
    })

    local KeybindRowLbl = create("TextLabel", {
        Size = UDim2.new(1, -80, 1, 0),
        Position = UDim2.new(0, 10, 0, 0),
        BackgroundTransparency = 1,
        Font = Enum.Font.GothamMedium,
        TextSize = 12,
        TextXAlignment = Enum.TextXAlignment.Left,
        Text = "Set keybind to open/close UI"
    })

    local KeybindRow = create("Frame", {
        Size = UDim2.new(1, 0, 0, 34),
        BorderSizePixel = 0,
        Parent = uiContainer
    }, {
        create("UICorner", { CornerRadius = UDim.new(0, 7) }),
        KeybindRowLbl,
        KeybindBtn
    })

    registerThemedElement(function()
        local w = (currentTheme == "White")
        KeybindRow.BackgroundColor3 = w and Color3.fromRGB(224, 232, 227) or Color3.fromRGB(20, 26, 22)
        KeybindRowLbl.TextColor3 = w and Color3.fromRGB(25, 35, 30) or Color3.fromRGB(225, 235, 228)
        KeybindBtn.BackgroundColor3 = w and Color3.fromRGB(210, 224, 215) or Color3.fromRGB(10, 14, 12)
    end)

    local waitingForUiKey = false
    KeybindBtn.MouseButton1Click:Connect(function()
        waitingForUiKey = true
        Window:SetListeningToggleKey(true)
        KeybindBtn.Text = "..."
    end)

    UserInputService.InputBegan:Connect(function(input)
        if waitingForUiKey and input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode ~= Enum.KeyCode.Unknown then
            waitingForUiKey = false
            Window:SetToggleKey(input.KeyCode)
            KeybindBtn.Text = input.KeyCode.Name
            ConfigValues["UI_ToggleKey"] = input.KeyCode.Name
            triggerAutoSave()
            task.defer(function()
                Window:SetListeningToggleKey(false)
            end)
        end
    end)

    ConfigSetters["UI_ToggleKey"] = function(val)
        if type(val) == "string" and (Enum.KeyCode :: any)[val] then
            local kc = (Enum.KeyCode :: any)[val]
            Window:SetToggleKey(kc)
            KeybindBtn.Text = kc.Name
        end
    end

    UISettingsCat:AddToggle({
        Name = "Disable Animations",
        Default = false,
        ConfigKey = "UI_DisableAnimations",
        Callback = function(val)
            disableAnimations = val
        end
    })

    UISettingsCat:AddDropdown({
        Name = "Theme",
        Options = { "Black", "White" },
        Default = "Black",
        ConfigKey = "UI_Theme",
        Callback = function(val)
            currentTheme = val
            applyThemeAll()
        end
    })

    local CreditsCat = SettingsTab:AddCategory("Credits")
    CreditsCat:AddLabel("Made by Lunex Softworks LLC.")

    task.defer(function()
        local autoLoadName = readTextFile(AutoLoadMetaFile)
        if autoLoadName and #autoLoadName > 0 then
            local raw = readTextFile(FolderName .. "/" .. autoLoadName .. ".json")
            if raw then
                selectedConfigName = autoLoadName
                ConfigDropdownBtn.Text = autoLoadName
                updateConfigButtonsState()
                applyConfigJson(raw)
                Window:Notify({
                    Title = "AutoLoad Config",
                    Description = "Loaded '" .. autoLoadName .. ".json' automatically.",
                    Duration = 3
                })
                return
            end
        end

        local autoSaveRaw = readTextFile(AutoSaveFile)
        if autoSaveRaw then
            applyConfigJson(autoSaveRaw)
        end
    end)
end

Window:Notify({
    Title = "Taph Hub",
    Description = "Loaded successfully (Press " .. Window:GetToggleKey().Name .. " to toggle UI)",
    Duration = 4
})
Executor compatibility changes over time. Check current reports before testing.

Copy the code above into a compatible Roblox script executor if you choose to test it.

Seeker vs Hider Script Status

✓AvailabilityFree
$Price$0
◫CompatibilityDesktop & Mobile
★SafetyVerified

Roblox and game updates can affect compatibility, so the script’s status should be treated as temporary rather than guaranteed.

Frequently Asked Questions

What is a Seeker vs Hider script?

A Seeker vs Hider script is third-party Lua code intended to run alongside the Roblox game through a compatible script executor.

What features does this Seeker vs Hider script include?

Different scripts contain different code and features. Check the script menu after it loads to see everything it offers.

How do you use the Seeker vs Hider script?

Pick a compatible executor such as Hydrogen, MacSploit, AWP.GG, Delta, Fluxus, Codex, launch Roblox and join the game, copy the complete Lua code from the script card above, paste it into the executor’s editor, and click Run or Execute. Compatibility changes over time, so a name here doesn’t guarantee current support.

Can a Seeker vs Hider script get your Roblox account banned?

Yes. Third-party scripts can violate Roblox rules and may put an account at risk. Only use code from a source you trust, never enter your Roblox password into a script or executor, and test on an alternate account first.

Does the Seeker vs Hider script work on mobile?

Check whether both the executor and the script support your device and the current Roblox version. Mobile executor support does not guarantee that every script will work.

Check out our Roblox Scripts hub and Roblox Games Directory for more.

Leave a Comment