OBBY CREATOR GLITCHED PARTS
Key RequiredUniversal

OBBY CREATOR GLITCHED PARTS

Universal Scriptbobjsbobjs 2.1K views 672 executesUpdated Apr 5, 2026
Unrated
00
Lua Script•2379 lines (77530 chars)
-- Hydroxide v9 | Obby Creator
-- Solara Safe GUI (no UIListLayout/AutomaticSize/ScrollingFrame in main menu)
-- Uses PaintObject remote directly = PERMANENT server-side changes (no spy needed)
-- v9: ESP speed overhaul, Typing ESP override, Reveal All button

if game.CoreGui:FindFirstChild("Hydroxide") then
    game.CoreGui:FindFirstChild("Hydroxide"):Destroy()
end

local p = game.Players.LocalPlayer
local RS = game:GetService("RunService")
local UIS = game:GetService("UserInputService")
local ms = p:GetMouse()
local cam = workspace.CurrentCamera

local gui = Instance.new("ScreenGui")
gui.Name = "Hydroxide"
gui.ResetOnSpawn = false
gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
gui.Parent = game.CoreGui

-- STATE
local T = {}
local flyBV = nil
local flyBG = nil
local fk = {w=false,a=false,s=false,d=false,sp=false,sh=false}
local trollParts = {}
local hlStorage = {}
local custSpd = nil
local custJmp = nil
local origLit = {}
local dragging = false
local dragStart = Vector3.new(0,0)
local startPos = UDim2.new(0,0,0,0)
local minimized = false
local selectedPart = nil
local selectMode = false
local propOpen = false
local propDragging = false
local propDragStart = Vector3.new(0,0)
local propStartPos = UDim2.new(0,0,0,0)
local customHlStorage = {}
local cespActive = false
-- v9: tracks which parts Custom/Typing ESP owns (for override)
local customEspParts = {}

-- ═══════════════════════════════════════════════════════════════
-- FIND GAME REMOTES — PaintObject, MoveObject, DeleteObject
-- These are the game's actual remotes that save permanently
-- ═══════════════════════════════════════════════════════════════
local PaintObject = nil
local MoveObject = nil
local DeleteObject = nil

pcall(function()
    PaintObject = game:GetService("ReplicatedStorage"):WaitForChild("Events"):WaitForChild("PaintObject", 5)
end)
if not PaintObject then
    pcall(function()
        for _, c in ipairs(game:GetService("ReplicatedStorage"):FindFirstChild("Events"):GetChildren()) do
            if c.Name == "PaintObject" then PaintObject = c; break end
        end
    end)
end
if not PaintObject then
    pcall(function()
        local function scan(obj, d)
            if d > 6 then return end
            for _, c in ipairs(obj:GetChildren()) do
                if c.Name == "PaintObject" and (c:IsA("RemoteEvent") or c:IsA("RemoteFunction")) then
                    PaintObject = c; return
                end
                scan(c, d + 1)
            end
        end
        scan(game:GetService("ReplicatedStorage"), 0)
    end)
end

pcall(function()
    MoveObject = game:GetService("ReplicatedStorage"):WaitForChild("Events"):WaitForChild("MoveObject", 3)
end)
pcall(function()
    DeleteObject = game:GetService("ReplicatedStorage"):WaitForChild("Events"):WaitForChild("DeleteObject", 3)
end)

-- ═══════════════════════════════════════════════════════════════
-- PAINT PART — calls PaintObject remote = PERMANENT server save
-- Format: PaintObject:InvokeServer({[1] = part}, propName, value)
-- ═══════════════════════════════════════════════════════════════
local function paintPart(part, prop, val)
    if not PaintObject or not part or not part.Parent then return false end
    local ok = pcall(function()
        PaintObject:InvokeServer({[1] = part}, prop, val)
    end)
    return ok
end

local function movePart(part, cf, sz)
    if not MoveObject or not part or not part.Parent then return end
    pcall(function()
        MoveObject:InvokeServer({{part, cf or part.CFrame, sz or part.Size}})
    end)
end

-- ═══════════════════════════════════════════════════════════════
-- APPLY PROPERTY — set locally + paint to server = PERMANENT
-- ═══════════════════════════════════════════════════════════════
local function applyProperty(part, propName, value)
    if not part or not part.Parent then return false end

    -- Step 1: Apply locally (instant visual feedback)
    pcall(function()
        if propName == "Transparency" then
            part.Transparency = tonumber(value) or 0
        elseif propName == "Reflectance" then
            part.Reflectance = tonumber(value) or 0
        elseif propName == "Material" then
            local m = Enum.Material[tostring(value)]
            if m then part.Material = m end
        elseif propName == "Color" then
            if typeof(value) == "Color3" then
                part.Color = value
            elseif type(value) == "table" then
                part.Color = Color3.new(value[1], value[2], value[3])
            end
        elseif propName == "CanCollide" then
            part.CanCollide = value
        elseif propName == "Anchored" then
            part.Anchored = value
        elseif propName == "SizeX" then
            local sz = part.Size
            part.Size = Vector3.new(tonumber(value) or sz.X, sz.Y, sz.Z)
        elseif propName == "SizeY" then
            local sz = part.Size
            part.Size = Vector3.new(sz.X, tonumber(value) or sz.Y, sz.Z)
        elseif propName == "SizeZ" then
            local sz = part.Size
            part.Size = Vector3.new(sz.X, sz.Y, tonumber(value) or sz.Z)
        end
    end)

    -- Step 2: PAINT TO SERVER via PaintObject remote = PERMANENT!
    if PaintObject then
        return paintPart(part, propName, value)
    end
    return false
end

-- ═══════════════════════════════════════════════════════════════
-- HELPERS
-- ═══════════════════════════════════════════════════════════════
local function clamp(v,mn,mx) return math.max(mn, math.min(mx, v)) end
local function gH()
    local c = p.Character
    return c and c:FindFirstChild("Humanoid")
end
local function gR()
    local c = p.Character
    return c and c:FindFirstChild("HumanoidRootPart")
end
local function isBtn(prt)
    if not prt:FindFirstChild("TouchTransmitter") then return false end
    local n = prt.Name:lower()
    return n:find("button") or n:find("btn") or n:find("press")
end
local function isKill(prt)
    local n = prt.Name:lower()
    return n:find("kill") or n:find("lava")
        or n:find("acid") or n:find("danger")
        or n:find("spike")
end
local function isWall(prt)
    if prt.Transparency < 0.9 or not prt.CanCollide then return false end
    if prt:FindFirstChild("TouchTransmitter") then return false end
    if isBtn(prt) or isKill(prt) then return false end
    return true
end

-- NOTIFICATION (bottom-right)
local notifFrame = Instance.new("Frame")
notifFrame.Size = UDim2.new(0, 200, 0, 44)
notifFrame.Position = UDim2.new(1, -210, 1, -54)
notifFrame.BackgroundColor3 = Color3.fromRGB(18, 18, 22)
notifFrame.BorderSizePixel = 1
notifFrame.BorderColor3 = Color3.fromRGB(0, 120, 200)
notifFrame.Visible = false
notifFrame.Parent = gui

local ntTitle = Instance.new("TextLabel")
ntTitle.Size = UDim2.new(1, -10, 0, 16)
ntTitle.Position = UDim2.new(0, 5, 0, 2)
ntTitle.BackgroundTransparency = 1
ntTitle.TextColor3 = Color3.fromRGB(0, 200, 255)
ntTitle.Font = Enum.Font.GothamBold
ntTitle.TextSize = 10
ntTitle.TextXAlignment = Enum.TextXAlignment.Left
ntTitle.Parent = notifFrame

local ntBody = Instance.new("TextLabel")
ntBody.Size = UDim2.new(1, -10, 0, 18)
ntBody.Position = UDim2.new(0, 5, 0, 20)
ntBody.BackgroundTransparency = 1
ntBody.TextColor3 = Color3.fromRGB(170, 170, 180)
ntBody.Font = Enum.Font.Gotham
ntBody.TextSize = 9
ntBody.TextXAlignment = Enum.TextXAlignment.Left
ntBody.Parent = notifFrame

function notify(title, text)
    ntTitle.Text = title
    ntBody.Text = text
    notifFrame.Visible = true
    spawn(function()
        wait(2.5)
        if notifFrame.Parent then
            notifFrame.Visible = false
        end
    end)
end

-- MAIN FRAME
local main = Instance.new("Frame")
main.Size = UDim2.new(0, 400, 0, 520)
main.Position = UDim2.new(0.5, -200, 0.5, -260)
main.BackgroundColor3 = Color3.fromRGB(18, 18, 22)
main.BorderSizePixel = 0
main.Active = true
main.Parent = gui

-- DRAG
main.InputBegan:Connect(function(inp)
    if inp.UserInputType == Enum.UserInputType.MouseButton1 then
        dragging = true
        dragStart = inp.Position
        startPos = main.Position
    end
end)
main.InputEnded:Connect(function(inp)
    if inp.UserInputType == Enum.UserInputType.MouseButton1 then
        dragging = false
    end
end)
UIS.InputChanged:Connect(function(inp)
    if dragging and inp.UserInputType
        == Enum.UserInputType.MouseMovement then
        local d = inp.Position - dragStart
        main.Position = UDim2.new(
            startPos.X.Scale,
            startPos.X.Offset + d.X,
            startPos.Y.Scale,
            startPos.Y.Offset + d.Y
        )
    end
    -- prop panel drag
    if propDragging and inp.UserInputType
        == Enum.UserInputType.MouseMovement then
        local d = inp.Position - propDragStart
        propPanel.Position = UDim2.new(
            propStartPos.X.Scale,
            propStartPos.X.Offset + d.X,
            propStartPos.Y.Scale,
            propStartPos.Y.Offset + d.Y
        )
    end
end)

-- TITLE BAR
local titleBar = Instance.new("Frame")
titleBar.Size = UDim2.new(1, 0, 0, 30)
titleBar.BackgroundColor3 = Color3.fromRGB(0, 130, 220)
titleBar.BorderSizePixel = 0
titleBar.Parent = main

local titleTxt = Instance.new("TextLabel")
titleTxt.Size = UDim2.new(1, -70, 1, 0)
titleTxt.Position = UDim2.new(0, 10, 0, 0)
titleTxt.BackgroundTransparency = 1
titleTxt.TextColor3 = Color3.new(1, 1, 1)
titleTxt.Text = "HYDROXIDE v9 | Obby Creator"
titleTxt.Font = Enum.Font.GothamBold
titleTxt.TextSize = 13
titleTxt.TextXAlignment = Enum.TextXAlignment.Left
titleTxt.Parent = titleBar

local closeBtn = Instance.new("TextButton")
closeBtn.Size = UDim2.new(0, 30, 0, 30)
closeBtn.Position = UDim2.new(1, -30, 0, 0)
closeBtn.BackgroundColor3 = Color3.fromRGB(220, 40, 40)
closeBtn.BorderSizePixel = 0
closeBtn.Text = "X"
closeBtn.TextColor3 = Color3.new(1, 1, 1)
closeBtn.Font = Enum.Font.GothamBold
closeBtn.TextSize = 14
closeBtn.Parent = titleBar
closeBtn.MouseButton1Click:Connect(function()
    gui:Destroy()
end)

local miniBtn = Instance.new("TextButton")
miniBtn.Size = UDim2.new(0, 30, 0, 30)
miniBtn.Position = UDim2.new(1, -60, 0, 0)
miniBtn.BackgroundColor3 = Color3.fromRGB(220, 180, 30)
miniBtn.BorderSizePixel = 0
miniBtn.Text = "_"
miniBtn.TextColor3 = Color3.new(0, 0, 0)
miniBtn.Font = Enum.Font.GothamBold
miniBtn.TextSize = 16
miniBtn.Parent = titleBar
miniBtn.MouseButton1Click:Connect(function()
    minimized = not minimized
    if minimized then
        main.Size = UDim2.new(0, 400, 0, 30)
    else
        main.Size = UDim2.new(0, 400, 0, 520)
    end
end)

-- TAB BAR
local tabBar = Instance.new("Frame")
tabBar.Size = UDim2.new(1, 0, 0, 26)
tabBar.Position = UDim2.new(0, 0, 0, 30)
tabBar.BackgroundColor3 = Color3.fromRGB(12, 12, 16)
tabBar.BorderSizePixel = 0
tabBar.Parent = main

local tabNames = {"ESP", "Tools", "Edit", "Misc"}
local tabBtns = {}
for i = 1, 4 do
    local b = Instance.new("TextButton")
    b.Size = UDim2.new(0.25, 0, 1, 0)
    b.Position = UDim2.new((i-1)*0.25, 0, 0, 0)
    b.BackgroundColor3 = Color3.fromRGB(25, 25, 30)
    b.BorderSizePixel = 0
    b.Text = tabNames[i]
    b.TextColor3 = Color3.fromRGB(140, 140, 150)
    b.Font = Enum.Font.GothamBold
    b.TextSize = 11
    b.Parent = tabBar
    tabBtns[i] = b
end

-- TAB FRAMES
local tabFrames = {}
for i = 1, 4 do
    local f = Instance.new("Frame")
    f.Size = UDim2.new(1, 0, 1, -56)
    f.Position = UDim2.new(0, 0, 0, 56)
    f.BackgroundColor3 = Color3.fromRGB(22, 22, 28)
    f.BorderSizePixel = 0
    f.Visible = (i == 1)
    f.Parent = main
    tabFrames[i] = f
end

for i = 1, 4 do
    tabBtns[i].MouseButton1Click:Connect(function()
        for j = 1, 4 do
            tabFrames[j].Visible = (j == i)
            if j == i then
                tabBtns[j].BackgroundColor3 =
                    Color3.fromRGB(0, 110, 200)
                tabBtns[j].TextColor3 = Color3.new(1, 1, 1)
            else
                tabBtns[j].BackgroundColor3 =
                    Color3.fromRGB(25, 25, 30)
                tabBtns[j].TextColor3 =
                    Color3.fromRGB(140, 140, 150)
            end
        end
    end)
end

-- UI HELPERS
local function mkSection(parent, text, y)
    local l = Instance.new("TextLabel")
    l.Size = UDim2.new(1, -16, 0, 18)
    l.Position = UDim2.new(0, 8, 0, y)
    l.BackgroundColor3 = Color3.fromRGB(0, 110, 200)
    l.BorderSizePixel = 0
    l.Text = "  " .. text
    l.TextColor3 = Color3.new(1, 1, 1)
    l.Font = Enum.Font.GothamBold
    l.TextSize = 10
    l.TextXAlignment = Enum.TextXAlignment.Left
    l.Parent = parent
end

local function mkLabel(parent, text, y)
    local l = Instance.new("TextLabel")
    l.Size = UDim2.new(1, -16, 0, 16)
    l.Position = UDim2.new(0, 8, 0, y)
    l.BackgroundTransparency = 1
    l.Text = text
    l.TextColor3 = Color3.fromRGB(120, 120, 130)
    l.Font = Enum.Font.Gotham
    l.TextSize = 9
    l.TextXAlignment = Enum.TextXAlignment.Left
    l.Parent = parent
end

local function mkToggle(parent, text, y, key, cb)
    local f = Instance.new("Frame")
    f.Size = UDim2.new(1, -16, 0, 26)
    f.Position = UDim2.new(0, 8, 0, y)
    f.BackgroundColor3 = Color3.fromRGB(30, 30, 38)
    f.BorderSizePixel = 0
    f.Parent = parent
    local l = Instance.new("TextLabel")
    l.Size = UDim2.new(1, -50, 1, 0)
    l.Position = UDim2.new(0, 8, 0, 0)
    l.BackgroundTransparency = 1
    l.Text = text
    l.TextColor3 = Color3.fromRGB(210, 210, 220)
    l.Font = Enum.Font.Gotham
    l.TextSize = 11
    l.TextXAlignment = Enum.TextXAlignment.Left
    l.Parent = f
    local b = Instance.new("TextButton")
    b.Size = UDim2.new(0, 36, 0, 18)
    b.Position = UDim2.new(1, -42, 0, 4)
    b.BackgroundColor3 = Color3.fromRGB(60, 60, 70)
    b.BorderSizePixel = 0
    b.Text = "OFF"
    b.TextColor3 = Color3.new(1, 1, 1)
    b.Font = Enum.Font.GothamBold
    b.TextSize = 9
    b.Parent = f
    T[key] = false
    b.MouseButton1Click:Connect(function()
        T[key] = not T[key]
        b.Text = T[key] and "ON" or "OFF"
        b.BackgroundColor3 = T[key]
            and Color3.fromRGB(0, 170, 255)
            or Color3.fromRGB(60, 60, 70)
        if cb then cb(T[key]) end
    end)
    return b
end

local function mkBtn(parent, text, y, color, cb)
    local b = Instance.new("TextButton")
    b.Size = UDim2.new(1, -16, 0, 24)
    b.Position = UDim2.new(0, 8, 0, y)
    b.BackgroundColor3 = color
        or Color3.fromRGB(35, 35, 45)
    b.BorderSizePixel = 0
    b.Text = text
    b.TextColor3 = Color3.fromRGB(220, 220, 230)
    b.Font = Enum.Font.GothamBold
    b.TextSize = 11
    b.Parent = parent
    b.MouseButton1Click:Connect(function()
        if cb then cb() end
    end)
    return b
end

-- ═══════════════════════════════════════════════════════════════
-- WORLD ESP — Per-type storage, no conflicts
-- (defined before ESP tab UI so callbacks can reference them)
-- ═══════════════════════════════════════════════════════════════
local killHL = {}
local btnHL = {}
local wallHL = {}

local function clearTypeHL(storage)
    for _, o in pairs(storage) do
        pcall(function()
            if o.Parent then o:Destroy() end
        end)
    end
    for k in pairs(storage) do storage[k] = nil end
end

-- v9: remove highlights from other ESP types for a specific part
local function removeOtherHLForPart(part)
    -- remove from killHL
    for i = #killHL, 1, -1 do
        local o = killHL[i]
        pcall(function()
            if o and o.Parent then
                if o:IsA("Highlight") and o.Adornee == part then
                    o:Destroy()
                    table.remove(killHL, i)
                elseif o:IsA("BillboardGui") and o.Adornee == part then
                    o:Destroy()
                    table.remove(killHL, i)
                end
            end
        end)
    end
    -- remove from btnHL
    for i = #btnHL, 1, -1 do
        local o = btnHL[i]
        pcall(function()
            if o and o.Parent then
                if o:IsA("Highlight") and o.Adornee == part then
                    o:Destroy()
                    table.remove(btnHL, i)
                elseif o:IsA("BillboardGui") and o.Adornee == part then
                    o:Destroy()
                    table.remove(btnHL, i)
                end
            end
        end)
    end
    -- remove from wallHL
    for i = #wallHL, 1, -1 do
        local o = wallHL[i]
        pcall(function()
            if o and o.Parent then
                if o:IsA("Highlight") and o.Adornee == part then
                    o:Destroy()
                    table.remove(wallHL, i)
                elseif o:IsA("BillboardGui") and o.Adornee == part then
                    o:Destroy()
                    table.remove(wallHL, i)
                end
            end
        end)
    end
    -- remove from trollParts (restore original)
    if trollParts[part] then
        local d = trollParts[part]
        pcall(function()
            if part.Parent then
                part.Color = d.c
                part.Transparency = d.t
                part.CastShadow = d.cs
                local tt = part:FindFirstChild("TouchTransmitter")
                if tt then tt.Enabled = d.tt end
            end
        end)
        trollParts[part] = nil
    end
end

local function applyTypeHL(storage, fn, fill, out, ft, lbl)
    clearTypeHL(storage)
    pcall(function()
        for _, v in pairs(
            workspace:GetDescendants()) do
            if v:IsA("BasePart") and fn(v) then
                -- v9: skip if Custom/Typing ESP owns this part
                if not customEspParts[v] then
                    local c = p.Character
                    if not (c and v:IsDescendantOf(c)) then
                        local h = Instance.new("Highlight")
                        h.FillColor = fill
                        h.OutlineColor = out
                        h.FillTransparency = ft
                        h.OutlineTransparency = 0
                        h.Parent = v
                        table.insert(storage, h)
                        if lbl then
                            local bg2 = Instance.new(
                                "BillboardGui")
                            bg2.Size = UDim2.new(0, 80, 0, 18)
                            bg2.StudsOffset =
                                Vector3.new(0, 2.5, 0)
                            bg2.AlwaysOnTop = true
                            bg2.Adornee = v
                            bg2.Parent = v
                            local l2 = Instance.new(
                                "TextLabel")
                            l2.Size = UDim2.new(1,0,1,0)
                            l2.BackgroundTransparency = 1
                            l2.TextColor3 =
                                Color3.new(1,1,1)
                            l2.Text = lbl
                            l2.TextSize = 12
                            l2.Font = Enum.Font.GothamBold
                            l2.Parent = bg2
                            table.insert(storage, bg2)
                        end
                    end
                end
            end
        end
    end)
end

local function clearKillHL()
    clearTypeHL(killHL)
end
local function applyKillHL()
    applyTypeHL(killHL, isKill,
        Color3.fromRGB(255,0,0),
        Color3.fromRGB(255,100,100),
        0.65, "KILL")
end
local function clearBtnHL()
    clearTypeHL(btnHL)
end
local function applyBtnHL()
    applyTypeHL(btnHL, isBtn,
        Color3.fromRGB(0,200,80),
        Color3.fromRGB(0,255,100),
        0.6, "BUTTON")
end
local function clearWallHL()
    clearTypeHL(wallHL)
end
local function applyWallHL()
    applyTypeHL(wallHL, isWall,
        Color3.fromRGB(255,200,0),
        Color3.fromRGB(255,255,0),
        0.5, "WALL")
end

-- Backward compat for reset buttons
function clearHL()
    clearTypeHL(killHL)
    clearTypeHL(btnHL)
    clearTypeHL(wallHL)
    hlStorage = {}
end

-- Troll ESP — reveals invisible/troll parts
local function doTroll(on)
    if on then
        local c = p.Character
        local cnt = 0
        pcall(function()
            for _, v in pairs(
                workspace:GetDescendants()) do
                if v:IsA("BasePart")
                    and v ~= workspace.Terrain then
                    if not (c and v:IsDescendantOf(c)) then
                        -- v9: skip if Custom ESP owns this part
                        if not customEspParts[v] then
                            local isTroll = false
                            if v.Transparency >= 0.5 then
                                isTroll = true
                            end
                            if v.CanCollide and v.Transparency >= 0.3
                                and not isBtn(v) and not isKill(v) then
                                isTroll = true
                            end
                            if isTroll and not trollParts[v] then
                                trollParts[v] = {
                                    c=v.Color,
                                    t=v.Transparency,
                                    cs=v.CastShadow,
                                    tt=v:FindFirstChild(
                                        "TouchTransmitter")
                                        and v.TouchTransmitter.Enabled
                                }
                                if isKill(v) then
                                    v.Color = Color3.fromRGB(255, 0, 0)
                                elseif isBtn(v) then
                                    v.Color = Color3.fromRGB(0, 255, 0)
                                elseif v.CanCollide then
                                    v.Color = Color3.fromRGB(255, 255, 0)
                                else
                                    v.Color = Color3.fromRGB(255, 50, 255)
                                end
                                v.Transparency = 0.4
                                v.CastShadow = false
                                local tt = v:FindFirstChild(
                                    "TouchTransmitter")
                                if tt then
                                    tt.Enabled = false
                                end
                                cnt = cnt + 1
                            end
                        end
                    end
                end
            end
        end)
        return cnt
    else
        for pp, d in pairs(trollParts) do
            -- v9: skip if Custom ESP owns this part now
            if not customEspParts[pp] then
                pcall(function()
                    if pp.Parent then
                        pp.Color = d.c
                        pp.Transparency = d.t
                        pp.CastShadow = d.cs
                        local tt = pp:FindFirstChild(
                            "TouchTransmitter")
                        if tt then tt.Enabled = d.tt end
                    end
                end)
            end
        end
        trollParts = {}
    end
end

-- ========== ESP TAB ==========
local espT = tabFrames[1]
mkSection(espT, "Hover ESP", 5)
mkToggle(espT, "Client Part ESP", 26, "partESP")
mkLabel(espT, "Outline + name + info on hover", 55)
mkSection(espT, "World ESP", 74)
mkToggle(espT, "Troll ESP (invisible parts)", 95, "trollESP", function(v)
    if v then
        local c = doTroll(true)
        notify("Troll", "Revealed " .. tostring(c) .. " parts")
    else
        doTroll(false)
        notify("Troll", "Cleared")
    end
end)

-- v9: REVEAL ALL button — force refreshes ALL active ESP types
mkBtn(espT, "REVEAL ALL (force refresh)", 120,
    Color3.fromRGB(220, 120, 0), function()
        local total = 0
        if T.trollESP then
            total = total + doTroll(true)
        end
        if T.killESP then
            applyKillHL()
        end
        if T.btnESP then
            applyBtnHL()
        end
        if T.wallESP then
            applyWallHL()
        end
        if cespActive and customEspTb.Text and customEspTb.Text ~= "" then
            total = total + applyCustomESP()
        end
        notify("Reveal", "All ESPs refreshed!")
    end)

mkToggle(espT, "Killbrick ESP", 149, "killESP", function(v)
    if v then
        applyKillHL()
        notify("Killbrick", "ESP on")
    else
        clearKillHL()
        notify("Killbrick", "ESP off")
    end
end)
mkToggle(espT, "Button ESP", 178, "btnESP", function(v)
    if v then
        applyBtnHL()
        notify("Button", "ESP on")
    else
        clearBtnHL()
        notify("Button", "ESP off")
    end
end)
mkToggle(espT, "Invisible Wall ESP", 207, "wallESP", function(v)
    if v then
        applyWallHL()
        notify("Wall", "ESP on")
    else
        clearWallHL()
        notify("Wall", "ESP off")
    end
end)
mkSection(espT, "Lighting", 231)
mkToggle(espT, "Fullbright", 252, "fullbright")

-- Custom ESP (Typing ESP) — v9: works on invisible parts, overrides other ESPs
mkSection(espT, "Typing ESP (overrides all)", 278)
mkLabel(espT, "Type name → overrides other ESPs!", 299)

local customEspTb = Instance.new("TextBox")
customEspTb.Size = UDim2.new(1, -16, 0, 24)
customEspTb.Position = UDim2.new(0, 8, 0, 318)
customEspTb.BackgroundColor3 = Color3.fromRGB(40, 40, 50)
customEspTb.BorderSizePixel = 0
customEspTb.PlaceholderText = "e.g. KillBrick, lava, Button..."
customEspTb.PlaceholderColor3 = Color3.fromRGB(80, 80, 90)
customEspTb.Text = ""
customEspTb.TextColor3 = Color3.fromRGB(230, 230, 240)
customEspTb.Font = Enum.Font.Code
customEspTb.TextSize = 11
customEspTb.ClearTextOnFocus = false
customEspTb.Parent = espT

local customEspOn = Instance.new("TextButton")
customEspOn.Size = UDim2.new(0, 90, 0, 24)
customEspOn.Position = UDim2.new(0, 8, 0, 348)
customEspOn.BackgroundColor3 = Color3.fromRGB(0, 170, 80)
customEspOn.BorderSizePixel = 0
customEspOn.Text = "Highlight On"
customEspOn.TextColor3 = Color3.new(1, 1, 1)
customEspOn.Font = Enum.Font.GothamBold
customEspOn.TextSize = 10
customEspOn.Parent = espT

local customEspOff = Instance.new("TextButton")
customEspOff.Size = UDim2.new(0, 90, 0, 24)
customEspOff.Position = UDim2.new(0, 106, 0, 348)
customEspOff.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
customEspOff.BorderSizePixel = 0
customEspOff.Text = "Highlight Off"
customEspOff.TextColor3 = Color3.new(1, 1, 1)
customEspOff.Font = Enum.Font.GothamBold
customEspOff.TextSize = 10
customEspOff.Parent = espT

local function clearCustomESP()
    for _, o in pairs(customHlStorage) do
        if type(o) == "table" then
            pcall(function()
                if o.hl and o.hl.Parent then
                    o.hl:Destroy()
                end
                -- v9: only restore transparency if the part is still alive
                -- and wasn't re-claimed by another ESP
                if o.wasInvis and o.part and o.part.Parent then
                    if not trollParts[o.part] then
                        o.part.Transparency = o.origT
                    end
                end
            end)
        else
            pcall(function()
                if o.Parent then o:Destroy() end
            end)
        end
    end
    customHlStorage = {}
    -- v9: clear ownership tracking
    for part in pairs(customEspParts) do
        customEspParts[part] = nil
    end
end

-- v9: returns count of highlighted parts
local function applyCustomESP()
    clearCustomESP()
    local search = customEspTb.Text
    if not search or search == "" then return 0 end
    search = search:lower()
    local col = Color3.fromRGB(255, 0, 255)
    local cnt = 0
    pcall(function()
        for _, v in pairs(workspace:GetDescendants()) do
            if v:IsA("BasePart") and v ~= workspace.Terrain then
                local c = p.Character
                if not (c and v:IsDescendantOf(c)) then
                    if v.Name:lower():find(search) then
                        -- v9: REMOVE other ESP highlights on this part (override!)
                        removeOtherHLForPart(v)

                        local wasInvis = v.Transparency >= 0.95
                        local origT = v.Transparency
                        -- v9: make invisible parts MUCH more visible
                        if wasInvis then
                            v.Transparency = 0.25
                        end
                        local h = Instance.new("Highlight")
                        h.FillColor = col
                        h.OutlineColor = col
                        h.FillTransparency = 0.25
                        h.OutlineTransparency = 0
                        h.Parent = v
                        table.insert(customHlStorage, {
                            hl = h, part = v,
                            wasInvis = wasInvis,
                            origT = origT
                        })
                        -- v9: mark this part as owned by Typing ESP
                        customEspParts[v] = true
                        cnt = cnt + 1
                    end
                end
            end
        end
    end)
    notify("Typing ESP",
        "Found " .. cnt .. " parts (overrides others)")
    return cnt
end

customEspOn.MouseButton1Click:Connect(function()
    cespActive = true
    applyCustomESP()
end)
customEspOff.MouseButton1Click:Connect(function()
    cespActive = false
    clearCustomESP()
    notify("Typing ESP", "Cleared + restored other ESPs")
end)

-- v9: slow refresh loop for typing ESP (60s, use REVEAL ALL for instant)
spawn(function()
    while gui and gui.Parent do
        wait(60)
        if cespActive and customEspTb.Text
            and customEspTb.Text ~= "" then
            applyCustomESP()
        end
    end
end)

-- ========== TOOLS TAB ==========
local toolsT = tabFrames[2]
mkSection(toolsT, "Movement", 5)
mkBtn(toolsT, "Speed Boost (50)", 26,
    Color3.fromRGB(0, 130, 50), function()
        local h = gH()
        if h then h.WalkSpeed = 50; custSpd = 50 end
        notify("Speed", "50")
    end)
mkBtn(toolsT, "Super Speed (100)", 53,
    Color3.fromRGB(0, 130, 50), function()
        local h = gH()
        if h then h.WalkSpeed = 100; custSpd = 100 end
        notify("Speed", "100")
    end)
mkBtn(toolsT, "Jump Boost (100)", 80,
    Color3.fromRGB(0, 80, 180), function()
        local h = gH()
        if h then h.JumpPower = 100; custJmp = 100 end
        notify("Jump", "100")
    end)
mkBtn(toolsT, "Reset Speed/Jump", 107,
    Color3.fromRGB(120, 50, 50), function()
        local h = gH()
        if h then
            h.WalkSpeed = 16; h.JumpPower = 50
        end
        custSpd = nil; custJmp = nil
        notify("Reset", "Normal")
    end)

mkSection(toolsT, "Abilities", 136)
mkToggle(toolsT, "Noclip (walk thru walls)", 157, "noclip")
mkToggle(toolsT, "Fly (WASD+Space/Shift)", 184, "flying",
    function(v)
        if v then
            local hrp = gR()
            local hm = gH()
            if not hrp or not hm then return end
            hm.PlatformStand = true
            flyBV = Instance.new("BodyVelocity")
            flyBV.MaxForce = Vector3.new(
                math.huge, math.huge, math.huge)
            flyBV.Velocity = Vector3.new(0, 0, 0)
            flyBV.Parent = hrp
            flyBG = Instance.new("BodyGyro")
            flyBG.MaxTorque = Vector3.new(
                math.huge, math.huge, math.huge)
            flyBG.P = 9e4
            flyBG.Parent = hrp
        else
            local hm = gH()
            if hm then
                pcall(function()
                    hm.PlatformStand = false
                end)
            end
            if flyBV then
                flyBV:Destroy(); flyBV = nil
            end
            if flyBG then
                flyBG:Destroy(); flyBG = nil
            end
            fk = {w=false,a=false,s=false,
                  d=false,sp=false,sh=false}
        end
    end)
mkToggle(toolsT, "Infinite Jump", 211, "infJump")
mkToggle(toolsT, "Click Teleport", 238, "clickTP")

mkSection(toolsT, "Hacking", 268)
mkBtn(toolsT, "Activate Nearest Button", 289,
    Color3.fromRGB(180, 100, 0), function()
        local r = gR()
        if not r then
            notify("Button", "No char"); return
        end
        local near = nil
        local nd = math.huge
        for _, v in pairs(workspace:GetDescendants()) do
            if v:IsA("BasePart") and isBtn(v) then
                local d = (r.Position - v.Position).Magnitude
                if d < nd then nd = d; near = v end
            end
        end
        if near then
            r.CFrame = near.CFrame + Vector3.new(0, 5, 0)
            wait(0.3)
            r.CFrame = near.CFrame
            notify("Button", "Activated: " .. near.Name)
        else
            notify("Button", "None nearby")
        end
    end)
mkBtn(toolsT, "Activate ALL Buttons", 316,
    Color3.fromRGB(180, 100, 0), function()
        local r = gR()
        if not r then
            notify("Button", "No char"); return
        end
        local cnt = 0
        for _, v in pairs(workspace:GetDescendants()) do
            if v:IsA("BasePart") and isBtn(v) then
                r.CFrame = v.CFrame
                wait(0.15)
                cnt = cnt + 1
            end
        end
        notify("Buttons", "Activated " .. cnt)
    end)
mkBtn(toolsT, "TP to Hovered Part", 343,
    Color3.fromRGB(80, 0, 150), function()
        local t = ms.Target
        if t and t:IsA("BasePart") then
            local r = gR()
            if r then
                r.CFrame = t.CFrame + Vector3.new(0, 5, 0)
            end
            notify("TP", "Teleported to " .. t.Name)
        else
            notify("TP", "Nothing under cursor")
        end
    end)
mkBtn(toolsT, "God Mode (HP Boost)", 370,
    Color3.fromRGB(150, 0, 150), function()
        local h = gH()
        if h then
            h.MaxHealth = 999999; h.Health = 999999
        end
        notify("God", "999999 HP")
    end)

mkSection(toolsT, "Gravity", 399)
mkBtn(toolsT, "Low Gravity (50)", 420,
    Color3.fromRGB(60, 60, 100), function()
        workspace.Gravity = 50; notify("Gravity", "50")
    end)
mkBtn(toolsT, "Moon Gravity (20)", 447,
    Color3.fromRGB(60, 60, 100), function()
        workspace.Gravity = 20; notify("Gravity", "20")
    end)
mkBtn(toolsT, "Normal Gravity (196)", 474,
    Color3.fromRGB(60, 60, 100), function()
        workspace.Gravity = 196; notify("Gravity", "196")
    end)

-- ═══════════════════════════════════════════════════════════════
-- EDIT TAB — Select part → floating property panel opens
-- Uses PaintObject remote = PERMANENT server saves
-- No spy needed, no built-in editor needed
-- ═══════════════════════════════════════════════════════════════
local editT = tabFrames[3]

-- Selection highlight
local selHL = Instance.new("SelectionBox")
selHL.Color3 = Color3.fromRGB(0, 255, 100)
selHL.LineThickness = 0.06
selHL.Transparency = 0
selHL.Visible = false
selHL.Adornee = nil
selHL.Parent = gui

mkSection(editT, "Select a Part to Edit", 5)

local selBtn = Instance.new("TextButton")
selBtn.Size = UDim2.new(0, 180, 0, 26)
selBtn.Position = UDim2.new(0, 8, 0, 26)
selBtn.BackgroundColor3 = Color3.fromRGB(0, 160, 80)
selBtn.BorderSizePixel = 0
selBtn.Text = "Click to Select Part"
selBtn.TextColor3 = Color3.new(1, 1, 1)
selBtn.Font = Enum.Font.GothamBold
selBtn.TextSize = 11
selBtn.Parent = editT

local deselBtn = Instance.new("TextButton")
deselBtn.Size = UDim2.new(0, 100, 0, 26)
deselBtn.Position = UDim2.new(0, 196, 0, 26)
deselBtn.BackgroundColor3 = Color3.fromRGB(160, 50, 50)
deselBtn.BorderSizePixel = 0
deselBtn.Text = "Deselect"
deselBtn.TextColor3 = Color3.new(1, 1, 1)
deselBtn.Font = Enum.Font.GothamBold
deselBtn.TextSize = 11
deselBtn.Parent = editT

selBtn.MouseButton1Click:Connect(function()
    selectMode = not selectMode
    if selectMode then
        selBtn.Text = ">> Click a part now <<"
        selBtn.BackgroundColor3 =
            Color3.fromRGB(200, 180, 0)
        notify("Select", "Click any part in game")
    else
        selBtn.Text = "Click to Select Part"
        selBtn.BackgroundColor3 =
            Color3.fromRGB(0, 160, 80)
    end
end)

-- PaintObject status label in edit tab
local paintLbl = Instance.new("TextLabel")
paintLbl.Size = UDim2.new(1, -16, 0, 28)
paintLbl.Position = UDim2.new(0, 8, 0, 56)
paintLbl.BackgroundColor3 = Color3.fromRGB(30, 30, 38)
paintLbl.BorderSizePixel = 0
paintLbl.TextColor3 = Color3.fromRGB(0, 255, 100)
paintLbl.Font = Enum.Font.GothamBold
paintLbl.TextSize = 9
paintLbl.TextXAlignment = Enum.TextXAlignment.Left
paintLbl.Text = PaintObject and "PaintObject: CONNECTED - PERMANENT" or "PaintObject: MISSING - local only!"
paintLbl.Parent = editT
if PaintObject then
    paintLbl.TextColor3 = Color3.fromRGB(0, 255, 100)
    paintLbl.BackgroundColor3 = Color3.fromRGB(0, 35, 25)
else
    paintLbl.TextColor3 = Color3.fromRGB(255, 80, 80)
    paintLbl.BackgroundColor3 = Color3.fromRGB(45, 25, 15)
end

mkLabel(editT, "Step 1: Click Select, then click any part", 88)
mkLabel(editT, "Step 2: Type value in panel, press Enter", 104)
mkLabel(editT, "Changes save to server = PERMANENT!", 120)
mkLabel(editT, "Stays even after leaving + unloading", 136)

-- ═══════════════════════════════════════════════════════════════
-- FLOATING PROPERTY PANEL — opens when you select a part
-- ═══════════════════════════════════════════════════════════════
local propPanel = Instance.new("Frame")
propPanel.Name = "PropPanel"
propPanel.Size = UDim2.new(0, 260, 0, 380)
propPanel.Position = UDim2.new(0.5, 120, 0.5, -190)
propPanel.BackgroundColor3 = Color3.fromRGB(15, 15, 20)
propPanel.BorderSizePixel = 0
propPanel.Visible = false
propPanel.Active = true
propPanel.ZIndex = 50
propPanel.Parent = gui

-- prop panel drag
propPanel.InputBegan:Connect(function(inp)
    if inp.UserInputType == Enum.UserInputType.MouseButton1 then
        propDragging = true
        propDragStart = inp.Position
        propStartPos = propPanel.Position
    end
end)
propPanel.InputEnded:Connect(function(inp)
    if inp.UserInputType == Enum.UserInputType.MouseButton1 then
        propDragging = false
    end
end)

-- title bar
local ppTitleBar = Instance.new("Frame")
ppTitleBar.Size = UDim2.new(1, 0, 0, 28)
ppTitleBar.BackgroundColor3 = Color3.fromRGB(0, 200, 255)
ppTitleBar.BorderSizePixel = 0
ppTitleBar.ZIndex = 51
ppTitleBar.Parent = propPanel

local ppTitle = Instance.new("TextLabel")
ppTitle.Size = UDim2.new(1, -36, 1, 0)
ppTitle.Position = UDim2.new(0, 8, 0, 0)
ppTitle.BackgroundTransparency = 1
ppTitle.Text = "PROPERTIES"
ppTitle.TextColor3 = Color3.new(0, 0, 0)
ppTitle.Font = Enum.Font.GothamBold
ppTitle.TextSize = 12
ppTitle.TextXAlignment = Enum.TextXAlignment.Left
ppTitle.ZIndex = 52
ppTitle.Parent = ppTitleBar

local ppClose = Instance.new("TextButton")
ppClose.Size = UDim2.new(0, 28, 0, 28)
ppClose.Position = UDim2.new(1, -28, 0, 0)
ppClose.BackgroundColor3 = Color3.fromRGB(220, 40, 40)
ppClose.BorderSizePixel = 0
ppClose.Text = "X"
ppClose.TextColor3 = Color3.new(1, 1, 1)
ppClose.Font = Enum.Font.GothamBold
ppClose.TextSize = 12
ppClose.ZIndex = 52
ppClose.Parent = ppTitleBar

-- info row (part type + name)
local ppInfo = Instance.new("TextLabel")
ppInfo.Size = UDim2.new(1, -8, 0, 28)
ppInfo.Position = UDim2.new(0, 4, 0, 30)
ppInfo.BackgroundColor3 = Color3.fromRGB(25, 35, 40)
ppInfo.BorderSizePixel = 0
ppInfo.TextColor3 = Color3.fromRGB(0, 255, 170)
ppInfo.Font = Enum.Font.Code
ppInfo.TextSize = 9
ppInfo.TextXAlignment = Enum.TextXAlignment.Left
ppInfo.Text = "No part selected"
ppInfo.ZIndex = 51
ppInfo.Parent = propPanel

-- PaintObject status row in property panel
local ppSync = Instance.new("TextLabel")
ppSync.Size = UDim2.new(1, -8, 0, 18)
ppSync.Position = UDim2.new(0, 4, 0, 60)
ppSync.BorderSizePixel = 0
ppSync.Font = Enum.Font.Code
ppSync.TextSize = 8
ppSync.TextXAlignment = Enum.TextXAlignment.Left
ppSync.ZIndex = 51
ppSync.Parent = propPanel
if PaintObject then
    ppSync.Text = "PaintObject: CONNECTED - All changes are PERMANENT!"
    ppSync.TextColor3 = Color3.fromRGB(0, 255, 100)
    ppSync.BackgroundColor3 = Color3.fromRGB(0, 35, 25)
else
    ppSync.Text = "PaintObject: MISSING - Changes will be local only!"
    ppSync.TextColor3 = Color3.fromRGB(255, 80, 80)
    ppSync.BackgroundColor3 = Color3.fromRGB(45, 25, 15)
end

-- Property input rows — pre-created at fixed Y positions
-- Each row: label (80w) + textbox (168w)
-- Solara safe: no UIListLayout, all fixed positions

local propY = 82
local propH = 26
local propGap = 3

-- Transparency
local ppTransLbl = Instance.new("TextLabel")
ppTransLbl.Size = UDim2.new(0, 80, 0, propH)
ppTransLbl.Position = UDim2.new(0, 4, 0, propY)
ppTransLbl.BackgroundTransparency = 1
ppTransLbl.Text = "Transparency"
ppTransLbl.TextColor3 = Color3.fromRGB(180, 180, 190)
ppTransLbl.Font = Enum.Font.GothamBold
ppTransLbl.TextSize = 9
ppTransLbl.TextXAlignment = Enum.TextXAlignment.Left
ppTransLbl.ZIndex = 51
ppTransLbl.Parent = propPanel

local ppTransTb = Instance.new("TextBox")
ppTransTb.Size = UDim2.new(0, 168, 0, propH)
ppTransTb.Position = UDim2.new(0, 88, 0, propY)
ppTransTb.BackgroundColor3 = Color3.fromRGB(28, 28, 42)
ppTransTb.BorderSizePixel = 0
ppTransTb.Text = "0"
ppTransTb.PlaceholderText = "0"
ppTransTb.PlaceholderColor3 = Color3.fromRGB(60, 60, 80)
ppTransTb.TextColor3 = Color3.fromRGB(0, 255, 170)
ppTransTb.Font = Enum.Font.Code
ppTransTb.TextSize = 11
ppTransTb.ClearTextOnFocus = false
ppTransTb.ZIndex = 52
ppTransTb.Parent = propPanel

propY = propY + propH + propGap

-- Reflectance
local ppReflLbl = Instance.new("TextLabel")
ppReflLbl.Size = UDim2.new(0, 80, 0, propH)
ppReflLbl.Position = UDim2.new(0, 4, 0, propY)
ppReflLbl.BackgroundTransparency = 1
ppReflLbl.Text = "Reflectance"
ppReflLbl.TextColor3 = Color3.fromRGB(180, 180, 190)
ppReflLbl.Font = Enum.Font.GothamBold
ppReflLbl.TextSize = 9
ppReflLbl.TextXAlignment = Enum.TextXAlignment.Left
ppReflLbl.ZIndex = 51
ppReflLbl.Parent = propPanel

local ppReflTb = Instance.new("TextBox")
ppReflTb.Size = UDim2.new(0, 168, 0, propH)
ppReflTb.Position = UDim2.new(0, 88, 0, propY)
ppReflTb.BackgroundColor3 = Color3.fromRGB(28, 28, 42)
ppReflTb.BorderSizePixel = 0
ppReflTb.Text = "0"
ppReflTb.PlaceholderText = "0"
ppReflTb.PlaceholderColor3 = Color3.fromRGB(60, 60, 80)
ppReflTb.TextColor3 = Color3.fromRGB(0, 255, 170)
ppReflTb.Font = Enum.Font.Code
ppReflTb.TextSize = 11
ppReflTb.ClearTextOnFocus = false
ppReflTb.ZIndex = 52
ppReflTb.Parent = propPanel

propY = propY + propH + propGap

-- Material
local ppMatLbl = Instance.new("TextLabel")
ppMatLbl.Size = UDim2.new(0, 80, 0, propH)
ppMatLbl.Position = UDim2.new(0, 4, 0, propY)
ppMatLbl.BackgroundTransparency = 1
ppMatLbl.Text = "Material"
ppMatLbl.TextColor3 = Color3.fromRGB(180, 180, 190)
ppMatLbl.Font = Enum.Font.GothamBold
ppMatLbl.TextSize = 9
ppMatLbl.TextXAlignment = Enum.TextXAlignment.Left
ppMatLbl.ZIndex = 51
ppMatLbl.Parent = propPanel

local ppMatTb = Instance.new("TextBox")
ppMatTb.Size = UDim2.new(0, 168, 0, propH)
ppMatTb.Position = UDim2.new(0, 88, 0, propY)
ppMatTb.BackgroundColor3 = Color3.fromRGB(28, 28, 42)
ppMatTb.BorderSizePixel = 0
ppMatTb.Text = "Plastic"
ppMatTb.PlaceholderText = "Neon, Glass, Metal..."
ppMatTb.PlaceholderColor3 = Color3.fromRGB(60, 60, 80)
ppMatTb.TextColor3 = Color3.fromRGB(0, 200, 255)
ppMatTb.Font = Enum.Font.Code
ppMatTb.TextSize = 11
ppMatTb.ClearTextOnFocus = false
ppMatTb.ZIndex = 52
ppMatTb.Parent = propPanel

propY = propY + propH + propGap

-- Color (hex)
local ppColLbl = Instance.new("TextLabel")
ppColLbl.Size = UDim2.new(0, 80, 0, propH)
ppColLbl.Position = UDim2.new(0, 4, 0, propY)
ppColLbl.BackgroundTransparency = 1
ppColLbl.Text = "Color"
ppColLbl.TextColor3 = Color3.fromRGB(180, 180, 190)
ppColLbl.Font = Enum.Font.GothamBold
ppColLbl.TextSize = 9
ppColLbl.TextXAlignment = Enum.TextXAlignment.Left
ppColLbl.ZIndex = 51
ppColLbl.Parent = propPanel

local ppColTb = Instance.new("TextBox")
ppColTb.Size = UDim2.new(0, 148, 0, propH)
ppColTb.Position = UDim2.new(0, 88, 0, propY)
ppColTb.BackgroundColor3 = Color3.fromRGB(28, 28, 42)
ppColTb.BorderSizePixel = 0
ppColTb.Text = "FFFFFF"
ppColTb.PlaceholderText = "RRGGBB"
ppColTb.PlaceholderColor3 = Color3.fromRGB(60, 60, 80)
ppColTb.TextColor3 = Color3.new(1, 1, 1)
ppColTb.Font = Enum.Font.Code
ppColTb.TextSize = 11
ppColTb.ClearTextOnFocus = false
ppColTb.ZIndex = 52
ppColTb.Parent = propPanel

-- color swatch
local ppSwatch = Instance.new("Frame")
ppSwatch.Size = UDim2.new(0, 16, 0, propH)
ppSwatch.Position = UDim2.new(1, -20, 0, propY)
ppSwatch.BackgroundColor3 = Color3.new(1, 1, 1)
ppSwatch.BorderSizePixel = 0
ppSwatch.ZIndex = 52
ppSwatch.Parent = propPanel

propY = propY + propH + propGap

-- CanCollide toggle
local ppCCFrame = Instance.new("Frame")
ppCCFrame.Size = UDim2.new(1, -8, 0, propH)
ppCCFrame.Position = UDim2.new(0, 4, 0, propY)
ppCCFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 38)
ppCCFrame.BorderSizePixel = 0
ppCCFrame.ZIndex = 51
ppCCFrame.Parent = propPanel

local ppCCLbl = Instance.new("TextLabel")
ppCCLbl.Size = UDim2.new(0, 80, 1, 0)
ppCCLbl.Position = UDim2.new(0, 4, 0, 0)
ppCCLbl.BackgroundTransparency = 1
ppCCLbl.Text = "CanCollide"
ppCCLbl.TextColor3 = Color3.fromRGB(180, 180, 190)
ppCCLbl.Font = Enum.Font.GothamBold
ppCCLbl.TextSize = 9
ppCCLbl.TextXAlignment = Enum.TextXAlignment.Left
ppCCLbl.ZIndex = 52
ppCCLbl.Parent = ppCCFrame

local ppCCBtn = Instance.new("TextButton")
ppCCBtn.Size = UDim2.new(0, 40, 0, 18)
ppCCBtn.Position = UDim2.new(0, 88, 0, 4)
ppCCBtn.BackgroundColor3 = Color3.fromRGB(0, 70, 45)
ppCCBtn.BorderSizePixel = 0
ppCCBtn.Text = "ON"
ppCCBtn.TextColor3 = Color3.fromRGB(0, 255, 100)
ppCCBtn.Font = Enum.Font.GothamBold
ppCCBtn.TextSize = 9
ppCCBtn.ZIndex = 52
ppCCBtn.Parent = ppCCFrame

propY = propY + propH + propGap

-- Anchored toggle
local ppAnFrame = Instance.new("Frame")
ppAnFrame.Size = UDim2.new(1, -8, 0, propH)
ppAnFrame.Position = UDim2.new(0, 4, 0, propY)
ppAnFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 38)
ppAnFrame.BorderSizePixel = 0
ppAnFrame.ZIndex = 51
ppAnFrame.Parent = propPanel

local ppAnLbl = Instance.new("TextLabel")
ppAnLbl.Size = UDim2.new(0, 80, 1, 0)
ppAnLbl.Position = UDim2.new(0, 4, 0, 0)
ppAnLbl.BackgroundTransparency = 1
ppAnLbl.Text = "Anchored"
ppAnLbl.TextColor3 = Color3.fromRGB(180, 180, 190)
ppAnLbl.Font = Enum.Font.GothamBold
ppAnLbl.TextSize = 9
ppAnLbl.TextXAlignment = Enum.TextXAlignment.Left
ppAnLbl.ZIndex = 52
ppAnLbl.Parent = ppAnFrame

local ppAnBtn = Instance.new("TextButton")
ppAnBtn.Size = UDim2.new(0, 40, 0, 18)
ppAnBtn.Position = UDim2.new(0, 88, 0, 4)
ppAnBtn.BackgroundColor3 = Color3.fromRGB(0, 70, 45)
ppAnBtn.BorderSizePixel = 0
ppAnBtn.Text = "ON"
ppAnBtn.TextColor3 = Color3.fromRGB(0, 255, 100)
ppAnBtn.Font = Enum.Font.GothamBold
ppAnBtn.TextSize = 9
ppAnBtn.ZIndex = 52
ppAnBtn.Parent = ppAnFrame

propY = propY + propH + propGap

-- Size X
local ppSzXLbl = Instance.new("TextLabel")
ppSzXLbl.Size = UDim2.new(0, 80, 0, propH)
ppSzXLbl.Position = UDim2.new(0, 4, 0, propY)
ppSzXLbl.BackgroundTransparency = 1
ppSzXLbl.Text = "SizeX"
ppSzXLbl.TextColor3 = Color3.fromRGB(180, 180, 190)
ppSzXLbl.Font = Enum.Font.GothamBold
ppSzXLbl.TextSize = 9
ppSzXLbl.TextXAlignment = Enum.TextXAlignment.Left
ppSzXLbl.ZIndex = 51
ppSzXLbl.Parent = propPanel

local ppSzXTb = Instance.new("TextBox")
ppSzXTb.Size = UDim2.new(0, 168, 0, propH)
ppSzXTb.Position = UDim2.new(0, 88, 0, propY)
ppSzXTb.BackgroundColor3 = Color3.fromRGB(28, 28, 42)
ppSzXTb.BorderSizePixel = 0
ppSzXTb.Text = "4"
ppSzXTb.PlaceholderText = "0"
ppSzXTb.PlaceholderColor3 = Color3.fromRGB(60, 60, 80)
ppSzXTb.TextColor3 = Color3.fromRGB(255, 200, 50)
ppSzXTb.Font = Enum.Font.Code
ppSzXTb.TextSize = 11
ppSzXTb.ClearTextOnFocus = false
ppSzXTb.ZIndex = 52
ppSzXTb.Parent = propPanel

propY = propY + propH + propGap

-- Size Y
local ppSzYLbl = Instance.new("TextLabel")
ppSzYLbl.Size = UDim2.new(0, 80, 0, propH)
ppSzYLbl.Position = UDim2.new(0, 4, 0, propY)
ppSzYLbl.BackgroundTransparency = 1
ppSzYLbl.Text = "SizeY"
ppSzYLbl.TextColor3 = Color3.fromRGB(180, 180, 190)
ppSzYLbl.Font = Enum.Font.GothamBold
ppSzYLbl.TextSize = 9
ppSzYLbl.TextXAlignment = Enum.TextXAlignment.Left
ppSzYLbl.ZIndex = 51
ppSzYLbl.Parent = propPanel

local ppSzYTb = Instance.new("TextBox")
ppSzYTb.Size = UDim2.new(0, 168, 0, propH)
ppSzYTb.Position = UDim2.new(0, 88, 0, propY)
ppSzYTb.BackgroundColor3 = Color3.fromRGB(28, 28, 42)
ppSzYTb.BorderSizePixel = 0
ppSzYTb.Text = "4"
ppSzYTb.PlaceholderText = "0"
ppSzYTb.PlaceholderColor3 = Color3.fromRGB(60, 60, 80)
ppSzYTb.TextColor3 = Color3.fromRGB(255, 200, 50)
ppSzYTb.Font = Enum.Font.Code
ppSzYTb.TextSize = 11
ppSzYTb.ClearTextOnFocus = false
ppSzYTb.ZIndex = 52
ppSzYTb.Parent = propPanel

propY = propY + propH + propGap

-- Size Z
local ppSzZLbl = Instance.new("TextLabel")
ppSzZLbl.Size = UDim2.new(0, 80, 0, propH)
ppSzZLbl.Position = UDim2.new(0, 4, 0, propY)
ppSzZLbl.BackgroundTransparency = 1
ppSzZLbl.Text = "SizeZ"
ppSzZLbl.TextColor3 = Color3.fromRGB(180, 180, 190)
ppSzZLbl.Font = Enum.Font.GothamBold
ppSzZLbl.TextSize = 9
ppSzZLbl.TextXAlignment = Enum.TextXAlignment.Left
ppSzZLbl.ZIndex = 51
ppSzZLbl.Parent = propPanel

local ppSzZTb = Instance.new("TextBox")
ppSzZTb.Size = UDim2.new(0, 168, 0, propH)
ppSzZTb.Position = UDim2.new(0, 88, 0, propY)
ppSzZTb.BackgroundColor3 = Color3.fromRGB(28, 28, 42)
ppSzZTb.BorderSizePixel = 0
ppSzZTb.Text = "4"
ppSzZTb.PlaceholderText = "0"
ppSzZTb.PlaceholderColor3 = Color3.fromRGB(60, 60, 80)
ppSzZTb.TextColor3 = Color3.fromRGB(255, 200, 50)
ppSzZTb.Font = Enum.Font.Code
ppSzZTb.TextSize = 11
ppSzZTb.ClearTextOnFocus = false
ppSzZTb.ZIndex = 52
ppSzZTb.Parent = propPanel

-- ═══════════════════════════════════════════════════════════════
-- PROPERTY PANEL — open/close + populate
-- ═══════════════════════════════════════════════════════════════
local function closePropPanel()
    selectedPart = nil
    selectMode = false
    propOpen = false
    selHL.Adornee = nil
    selHL.Visible = false
    propPanel.Visible = false
    selBtn.Text = "Click to Select Part"
    selBtn.BackgroundColor3 = Color3.fromRGB(0, 160, 80)
    notify("Edit", "Panel closed")
end

local function openPropPanel(part)
    if not part or not part.Parent then return end
    selectedPart = part
    propOpen = true

    -- populate info
    ppTitle.Text = "PROPERTIES - " .. part.ClassName
    ppInfo.Text = part.Name .. " | " .. part.ClassName

    -- populate current values
    pcall(function()
        ppTransTb.Text = string.format("%.2f", part.Transparency)
    end)
    pcall(function()
        ppReflTb.Text = string.format("%.2f", part.Reflectance)
    end)
    pcall(function()
        ppMatTb.Text = part.Material.Name
    end)
    pcall(function()
        local hex = string.format("%02X%02X%02X",
            math.floor(part.Color.R * 255),
            math.floor(part.Color.G * 255),
            math.floor(part.Color.B * 255))
        ppColTb.Text = hex
        ppColTb.TextColor3 = part.Color
        ppSwatch.BackgroundColor3 = part.Color
    end)

    -- CanCollide
    local cc = part.CanCollide
    ppCCBtn.Text = cc and "ON" or "OFF"
    ppCCBtn.BackgroundColor3 = cc
        and Color3.fromRGB(0, 70, 45)
        or Color3.fromRGB(70, 18, 18)
    ppCCBtn.TextColor3 = cc
        and Color3.fromRGB(0, 255, 100)
        or Color3.fromRGB(255, 80, 80)

    -- Anchored
    local an = part.Anchored
    ppAnBtn.Text = an and "ON" or "OFF"
    ppAnBtn.BackgroundColor3 = an
        and Color3.fromRGB(0, 70, 45)
        or Color3.fromRGB(70, 18, 18)
    ppAnBtn.TextColor3 = an
        and Color3.fromRGB(0, 255, 100)
        or Color3.fromRGB(255, 80, 80)

    pcall(function()
        ppSzXTb.Text = string.format("%.1f", part.Size.X)
    end)
    pcall(function()
        ppSzYTb.Text = string.format("%.1f", part.Size.Y)
    end)
    pcall(function()
        ppSzZTb.Text = string.format("%.1f", part.Size.Z)
    end)

    -- show panel + highlight
    propPanel.Visible = true
    selHL.Adornee = part
    selHL.Visible = true

    notify("Selected", part.Name)
end

-- ═══════════════════════════════════════════════════════════════
-- PROPERTY INPUT HANDLERS — FocusLost → applyProperty
-- Each applies locally + paints to server via PaintObject = PERMANENT
-- ═══════════════════════════════════════════════════════════════

-- Transparency
ppTransTb.FocusLost:Connect(function()
    if not selectedPart or not selectedPart.Parent then return end
    local num = tonumber(ppTransTb.Text)
    if num ~= nil then
        ppTransTb.Text = tostring(num)
        local synced = applyProperty(selectedPart, "Transparency", num)
        if synced then
            notify("SET", "Transparency = " .. tostring(num) .. " (SAVED!)")
        else
            notify("SET", "Transparency = " .. tostring(num) .. " (local)")
        end
    else
        pcall(function()
            ppTransTb.Text = string.format("%.2f", selectedPart.Transparency)
        end)
    end
end)

-- Reflectance
ppReflTb.FocusLost:Connect(function()
    if not selectedPart or not selectedPart.Parent then return end
    local num = tonumber(ppReflTb.Text)
    if num ~= nil then
        ppReflTb.Text = tostring(num)
        local synced = applyProperty(selectedPart, "Reflectance", num)
        if synced then
            notify("SET", "Reflectance = " .. tostring(num) .. " (SAVED!)")
        else
            notify("SET", "Reflectance = " .. tostring(num) .. " (local)")
        end
    else
        pcall(function()
            ppReflTb.Text = string.format("%.2f", selectedPart.Reflectance)
        end)
    end
end)

-- Material
ppMatTb.FocusLost:Connect(function()
    if not selectedPart or not selectedPart.Parent then return end
    local val = ppMatTb.Text
    if val and val ~= "" then
        local m = Enum.Material[val]
        if m then
            local synced = applyProperty(selectedPart, "Material", val)
            if synced then
                notify("SET", "Material = " .. val .. " (SAVED!)")
            else
                notify("SET", "Material = " .. val .. " (local)")
            end
        else
            notify("ERROR", "Unknown material: " .. val)
            pcall(function()
                ppMatTb.Text = selectedPart.Material.Name
            end)
        end
    end
end)

-- Color (hex)
ppColTb.FocusLost:Connect(function()
    if not selectedPart or not selectedPart.Parent then return end
    local hex = ppColTb.Text:gsub("#", "")
    if #hex == 6 then
        local r = tonumber(hex:sub(1, 2), 16) or 255
        local g = tonumber(hex:sub(3, 4), 16) or 255
        local b = tonumber(hex:sub(5, 6), 16) or 255
        local col = Color3.fromRGB(r, g, b)
        ppColTb.TextColor3 = col
        ppSwatch.BackgroundColor3 = col
        local synced = applyProperty(selectedPart, "Color", col)
        if synced then
            notify("SET", "Color = #" .. hex .. " (SAVED!)")
        else
            notify("SET", "Color = #" .. hex .. " (local)")
        end
    else
        notify("ERROR", "Use RRGGBB format")
        pcall(function()
            local h = string.format("%02X%02X%02X",
                math.floor(selectedPart.Color.R * 255),
                math.floor(selectedPart.Color.G * 255),
                math.floor(selectedPart.Color.B * 255))
            ppColTb.Text = h
            ppColTb.TextColor3 = selectedPart.Color
            ppSwatch.BackgroundColor3 = selectedPart.Color
        end)
    end
end)

-- CanCollide toggle
ppCCBtn.MouseButton1Click:Connect(function()
    if not selectedPart or not selectedPart.Parent then return end
    local newVal = selectedPart.CanCollide == false
    ppCCBtn.Text = newVal and "ON" or "OFF"
    ppCCBtn.BackgroundColor3 = newVal
        and Color3.fromRGB(0, 70, 45)
        or Color3.fromRGB(70, 18, 18)
    ppCCBtn.TextColor3 = newVal
        and Color3.fromRGB(0, 255, 100)
        or Color3.fromRGB(255, 80, 80)
    applyProperty(selectedPart, "CanCollide", newVal)
    notify("SET", "CanCollide = " .. tostring(newVal))
end)

-- Anchored toggle
ppAnBtn.MouseButton1Click:Connect(function()
    if not selectedPart or not selectedPart.Parent then return end
    local newVal = selectedPart.Anchored == false
    ppAnBtn.Text = newVal and "ON" or "OFF"
    ppAnBtn.BackgroundColor3 = newVal
        and Color3.fromRGB(0, 70, 45)
        or Color3.fromRGB(70, 18, 18)
    ppAnBtn.TextColor3 = newVal
        and Color3.fromRGB(0, 255, 100)
        or Color3.fromRGB(255, 80, 80)
    applyProperty(selectedPart, "Anchored", newVal)
    notify("SET", "Anchored = " .. tostring(newVal))
end)

-- SizeX
ppSzXTb.FocusLost:Connect(function()
    if not selectedPart or not selectedPart.Parent then return end
    local num = tonumber(ppSzXTb.Text)
    if num ~= nil then
        ppSzXTb.Text = tostring(num)
        applyProperty(selectedPart, "SizeX", num)
        notify("SET", "SizeX = " .. tostring(num))
    end
end)

-- SizeY
ppSzYTb.FocusLost:Connect(function()
    if not selectedPart or not selectedPart.Parent then return end
    local num = tonumber(ppSzYTb.Text)
    if num ~= nil then
        ppSzYTb.Text = tostring(num)
        applyProperty(selectedPart, "SizeY", num)
        notify("SET", "SizeY = " .. tostring(num))
    end
end)

-- SizeZ
ppSzZTb.FocusLost:Connect(function()
    if not selectedPart or not selectedPart.Parent then return end
    local num = tonumber(ppSzZTb.Text)
    if num ~= nil then
        ppSzZTb.Text = tostring(num)
        applyProperty(selectedPart, "SizeZ", num)
        notify("SET", "SizeZ = " .. tostring(num))
    end
end)

-- Close panel
ppClose.MouseButton1Click:Connect(closePropPanel)

-- Deselect button
deselBtn.MouseButton1Click:Connect(function()
    closePropPanel()
end)

-- Click to select parts
ms.Button1Down:Connect(function()
    if not selectMode then return end
    local t = ms.Target
    if t and t:IsA("BasePart")
        and t ~= workspace.Terrain then
        local c = p.Character
        if not (c and t:IsDescendantOf(c)) then
            selectMode = false
            selBtn.Text = "Click to Select Part"
            selBtn.BackgroundColor3 =
                Color3.fromRGB(0, 160, 80)
            openPropPanel(t)
        end
    end
end)

-- Keep highlight on selected part
spawn(function()
    while gui and gui.Parent do
        wait(1)
        if selectedPart and selectedPart.Parent then
            selHL.Adornee = selectedPart
            selHL.Visible = true
        else
            selHL.Visible = false
            selHL.Adornee = nil
            if selectedPart
                and not selectedPart.Parent then
                selectedPart = nil
                propOpen = false
                propPanel.Visible = false
            end
        end
    end
end)

-- ========== MISC TAB ==========
local miscT = tabFrames[4]
mkSection(miscT, "Protection", 5)
mkToggle(miscT, "Anti AFK", 26, "antiAFK")

mkSection(miscT, "Camera", 55)
mkBtn(miscT, "FOV 70 (Normal)", 76,
    Color3.fromRGB(50, 50, 80), function()
        cam.FieldOfView = 70; notify("FOV", "70")
    end)
mkBtn(miscT, "FOV 120 (Wide)", 103,
    Color3.fromRGB(50, 50, 80), function()
        cam.FieldOfView = 120; notify("FOV", "120")
    end)

mkSection(miscT, "Character", 132)
mkBtn(miscT, "Reset Character", 153,
    Color3.fromRGB(150, 30, 30), function()
        local h = gH()
        if h then h.Health = 0 end
    end)
mkBtn(miscT, "Suicide", 180,
    Color3.fromRGB(150, 30, 30), function()
        local h = gH()
        if h then h.Health = 0 end
    end)

mkSection(miscT, "Reset All", 209)
mkBtn(miscT, "Reset ALL ESP", 230,
    Color3.fromRGB(120, 50, 50), function()
        T.partESP = false
        T.trollESP = false
        T.killESP = false
        T.btnESP = false
        T.wallESP = false
        T.fullbright = false
        cespActive = false
        clearCustomESP()
        for _, o in pairs(hlStorage) do
            pcall(function()
                if o.Parent then o:Destroy() end
            end)
        end
        hlStorage = {}
        for pp, d in pairs(trollParts) do
            pcall(function()
                if pp.Parent then
                    pp.Color = d.c
                    pp.Transparency = d.t
                    pp.CastShadow = d.cs
                    local t2 = pp:FindFirstChild(
                        "TouchTransmitter")
                    if t2 then t2.Enabled = d.tt end
                end
            end)
        end
        trollParts = {}
        customEspParts = {}
        local l = game:GetService("Lighting")
        l.Brightness = origLit.B or 1
        l.ClockTime = origLit.C or 14.5
        l.FogEnd = origLit.FE or 100000
        l.FogStart = origLit.FS or 0
        l.GlobalShadows = origLit.GS
        notify("Reset", "All ESP cleared")
    end)
mkBtn(miscT, "Reset ALL Mods", 257,
    Color3.fromRGB(120, 50, 50), function()
        for k in pairs(T) do T[k] = false end
        if flyBV then
            flyBV:Destroy(); flyBV = nil
        end
        if flyBG then
            flyBG:Destroy(); flyBG = nil
        end
        local h = gH()
        if h then
            h.WalkSpeed = 16
            h.JumpPower = 50
            pcall(function()
                h.PlatformStand = false
            end)
        end
        workspace.Gravity = 196
        cam.FieldOfView = 70
        custSpd = nil; custJmp = nil
        fk = {w=false,a=false,s=false,
              d=false,sp=false,sh=false}
        for _, o in pairs(hlStorage) do
            pcall(function()
                if o.Parent then o:Destroy() end
            end)
        end
        hlStorage = {}
        cespActive = false
        clearCustomESP()
        for pp, d in pairs(trollParts) do
            pcall(function()
                if pp.Parent then
                    pp.Color = d.c
                    pp.Transparency = d.t
                    pp.CastShadow = d.cs
                    local t2 = pp:FindFirstChild(
                        "TouchTransmitter")
                    if t2 then t2.Enabled = d.tt end
                end
            end)
        end
        trollParts = {}
        customEspParts = {}
        local l = game:GetService("Lighting")
        l.Brightness = origLit.B or 1
        l.ClockTime = origLit.C or 14.5
        l.FogEnd = origLit.FE or 100000
        l.FogStart = origLit.FS or 0
        l.GlobalShadows = origLit.GS
        notify("Reset", "Everything reset")
    end)

mkSection(miscT, "Info", 286)
mkLabel(miscT, "Fly: WASD + Space/Shift", 307)
mkLabel(miscT, "Click TP: Toggle then click part", 325)
mkLabel(miscT, "Edit: Select part, type value, Enter", 343)
mkLabel(miscT, "Drag title bar to move menu", 361)
mkLabel(miscT, "PaintObject remote = permanent saves", 379)

-- ========== HOVER ESP ==========
local esb = Instance.new("SelectionBox")
esb.Color3 = Color3.fromRGB(0, 170, 255)
esb.LineThickness = 0.04
esb.Transparency = 0
esb.Visible = false
esb.Parent = gui

local ebg = Instance.new("BillboardGui")
ebg.Size = UDim2.new(0, 250, 0, 50)
ebg.StudsOffset = Vector3.new(0, 3, 0)
ebg.AlwaysOnTop = true
ebg.Enabled = false
ebg.Parent = gui

local ebf = Instance.new("Frame")
ebf.Size = UDim2.new(1, 0, 1, 0)
ebf.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
ebf.BackgroundTransparency = 0.3
ebf.BorderSizePixel = 0
ebf.Parent = ebg

local en = Instance.new("TextLabel")
en.Size = UDim2.new(1, -8, 0, 16)
en.Position = UDim2.new(0, 4, 0, 2)
en.BackgroundTransparency = 1
en.TextColor3 = Color3.new(1, 1, 1)
en.Font = Enum.Font.GothamBold
en.TextSize = 11
en.TextXAlignment = Enum.TextXAlignment.Left
en.Parent = ebf

local ei = Instance.new("TextLabel")
ei.Size = UDim2.new(1, -8, 0, 14)
ei.Position = UDim2.new(0, 4, 0, 20)
ei.BackgroundTransparency = 1
ei.TextColor3 = Color3.fromRGB(0, 170, 255)
ei.Font = Enum.Font.Gotham
ei.TextSize = 10
ei.TextXAlignment = Enum.TextXAlignment.Left
ei.Parent = ebf

local ee = Instance.new("TextLabel")
ee.Size = UDim2.new(1, -8, 0, 12)
ee.Position = UDim2.new(0, 4, 0, 35)
ee.BackgroundTransparency = 1
ee.TextColor3 = Color3.fromRGB(130, 130, 140)
ee.Font = Enum.Font.Code
ee.TextSize = 9
ee.TextXAlignment = Enum.TextXAlignment.Left
ee.Parent = ebf

local lastHov = nil

RS.RenderStepped:Connect(function()
    local t = ms.Target
    local hp = nil
    if t and t:IsA("BasePart")
        and t ~= workspace.Terrain then
        local c = p.Character
        if not c or not t:IsDescendantOf(c) then
            hp = t
        end
    end
    if hp and T.partESP then
        esb.Adornee = hp
        esb.Visible = true
        ebg.Adornee = hp
        ebg.Enabled = true
        if hp ~= lastHov then
            lastHov = hp
            en.Text = hp.Name
            -- v9: show if Typing ESP owns this part
            if customEspParts[hp] then
                en.TextColor3 =
                    Color3.fromRGB(255, 100, 255)
                ei.TextColor3 =
                    Color3.fromRGB(255, 100, 255)
                ei.Text = "[TYPING ESP]"
            elseif isBtn(hp) then
                en.TextColor3 =
                    Color3.fromRGB(80, 255, 80)
                ei.TextColor3 =
                    Color3.fromRGB(80, 255, 80)
                ei.Text = "[BUTTON]"
            elseif isKill(hp) then
                en.TextColor3 =
                    Color3.fromRGB(255, 80, 80)
                ei.TextColor3 =
                    Color3.fromRGB(255, 80, 80)
                ei.Text = "[KILLBRICK]"
            else
                en.TextColor3 = Color3.new(1, 1, 1)
                ei.TextColor3 =
                    Color3.fromRGB(0, 170, 255)
                ei.Text = "[PART]"
            end
            ee.Text = tostring(hp.Material)
                .. " T:" .. string.format("%.1f",
                    hp.Transparency)
                .. " R:" .. string.format("%.1f",
                    hp.Reflectance)
        end
    else
        esb.Adornee = nil
        esb.Visible = false
        ebg.Enabled = false
        lastHov = nil
    end
end)

-- ========== v9: FAST ESP LOOPS — all at 0.5s, new parts detected via DescendantAdded ==========

-- v9: instant new-part detection — when a new part is added to workspace,
-- immediately apply any active ESP to it (no need to wait for refresh loop)
spawn(function()
    workspace.DescendantAdded:Connect(function(desc)
        if not gui or not gui.Parent then return end
        if not desc:IsA("BasePart") or desc == workspace.Terrain then return end
        local c = p.Character
        if c and desc:IsDescendantOf(c) then return end
        -- small delay to let the part fully initialize
        wait(0.1)
        if not desc or not desc.Parent then return end
        -- check typing ESP first (it overrides)
        if cespActive and customEspTb.Text and customEspTb.Text ~= "" then
            if desc.Name:lower():find(customEspTb.Text:lower()) then
                removeOtherHLForPart(desc)
                local wasInvis = desc.Transparency >= 0.95
                local origT = desc.Transparency
                if wasInvis then desc.Transparency = 0.25 end
                local h = Instance.new("Highlight")
                h.FillColor = Color3.fromRGB(255, 0, 255)
                h.OutlineColor = Color3.fromRGB(255, 0, 255)
                h.FillTransparency = 0.25
                h.OutlineTransparency = 0
                h.Parent = desc
                table.insert(customHlStorage, {
                    hl = h, part = desc,
                    wasInvis = wasInvis, origT = origT
                })
                customEspParts[desc] = true
                return
            end
        end
        -- then check other ESPs
        if T.killESP and isKill(desc) then
            local h = Instance.new("Highlight")
            h.FillColor = Color3.fromRGB(255,0,0)
            h.OutlineColor = Color3.fromRGB(255,100,100)
            h.FillTransparency = 0.65
            h.OutlineTransparency = 0
            h.Parent = desc
            table.insert(killHL, h)
            local bg2 = Instance.new("BillboardGui")
            bg2.Size = UDim2.new(0, 80, 0, 18)
            bg2.StudsOffset = Vector3.new(0, 2.5, 0)
            bg2.AlwaysOnTop = true
            bg2.Adornee = desc
            bg2.Parent = desc
            local l2 = Instance.new("TextLabel")
            l2.Size = UDim2.new(1,0,1,0)
            l2.BackgroundTransparency = 1
            l2.TextColor3 = Color3.new(1,1,1)
            l2.Text = "KILL"
            l2.TextSize = 12
            l2.Font = Enum.Font.GothamBold
            l2.Parent = bg2
            table.insert(killHL, bg2)
        elseif T.btnESP and isBtn(desc) then
            local h = Instance.new("Highlight")
            h.FillColor = Color3.fromRGB(0,200,80)
            h.OutlineColor = Color3.fromRGB(0,255,100)
            h.FillTransparency = 0.6
            h.OutlineTransparency = 0
            h.Parent = desc
            table.insert(btnHL, h)
            local bg2 = Instance.new("BillboardGui")
            bg2.Size = UDim2.new(0, 80, 0, 18)
            bg2.StudsOffset = Vector3.new(0, 2.5, 0)
            bg2.AlwaysOnTop = true
            bg2.Adornee = desc
            bg2.Parent = desc
            local l2 = Instance.new("TextLabel")
            l2.Size = UDim2.new(1,0,1,0)
            l2.BackgroundTransparency = 1
            l2.TextColor3 = Color3.new(1,1,1)
            l2.Text = "BUTTON"
            l2.TextSize = 12
            l2.Font = Enum.Font.GothamBold
            l2.Parent = bg2
            table.insert(btnHL, bg2)
        elseif T.wallESP and isWall(desc) then
            local h = Instance.new("Highlight")
            h.FillColor = Color3.fromRGB(255,200,0)
            h.OutlineColor = Color3.fromRGB(255,255,0)
            h.FillTransparency = 0.5
            h.OutlineTransparency = 0
            h.Parent = desc
            table.insert(wallHL, h)
            local bg2 = Instance.new("BillboardGui")
            bg2.Size = UDim2.new(0, 80, 0, 18)
            bg2.StudsOffset = Vector3.new(0, 2.5, 0)
            bg2.AlwaysOnTop = true
            bg2.Adornee = desc
            bg2.Parent = desc
            local l2 = Instance.new("TextLabel")
            l2.Size = UDim2.new(1,0,1,0)
            l2.BackgroundTransparency = 1
            l2.TextColor3 = Color3.new(1,1,1)
            l2.Text = "WALL"
            l2.TextSize = 12
            l2.Font = Enum.Font.GothamBold
            l2.Parent = bg2
            table.insert(wallHL, bg2)
        elseif T.trollESP then
            if desc.Transparency >= 0.5 then
                if not customEspParts[desc] then
                    trollParts[desc] = {
                        c=desc.Color, t=desc.Transparency,
                        cs=desc.CastShadow,
                        tt=desc:FindFirstChild("TouchTransmitter")
                            and desc.TouchTransmitter.Enabled
                    }
                    if isKill(desc) then
                        desc.Color = Color3.fromRGB(255, 0, 0)
                    elseif isBtn(desc) then
                        desc.Color = Color3.fromRGB(0, 255, 0)
                    elseif desc.CanCollide then
                        desc.Color = Color3.fromRGB(255, 255, 0)
                    else
                        desc.Color = Color3.fromRGB(255, 50, 255)
                    end
                    desc.Transparency = 0.4
                    desc.CastShadow = false
                    local tt = desc:FindFirstChild("TouchTransmitter")
                    if tt then tt.Enabled = false end
                end
            end
        end
    end)
end)

-- v9: slow refresh loops — 60s (use REVEAL ALL button for instant)
spawn(function()
    while gui and gui.Parent do
        wait(60)
        if T.trollESP then doTroll(true) end
    end
end)
spawn(function()
    while gui and gui.Parent do
        wait(60)
        if T.killESP then applyKillHL() end
    end
end)
spawn(function()
    while gui and gui.Parent do
        wait(60)
        if T.btnESP then applyBtnHL() end
    end
end)
spawn(function()
    while gui and gui.Parent do
        wait(60)
        if T.wallESP then applyWallHL() end
    end
end)

-- ========== FULLBRIGHT ==========
local function saveLit()
    local l = game:GetService("Lighting")
    origLit = {
        B = l.Brightness,
        C = l.ClockTime,
        FE = l.FogEnd,
        FS = l.FogStart,
        GS = l.GlobalShadows
    }
end
saveLit()

local function setFB(on)
    local l = game:GetService("Lighting")
    if on then
        saveLit()
        l.Brightness = 2
        l.ClockTime = 14
        l.FogEnd = 100000
        l.FogStart = 0
        l.GlobalShadows = false
    else
        l.Brightness = origLit.B or 1
        l.ClockTime = origLit.C or 14.5
        l.FogEnd = origLit.FE or 100000
        l.FogStart = origLit.FS or 0
        l.GlobalShadows = origLit.GS
    end
end

spawn(function()
    local wasOn = false
    while gui and gui.Parent do
        wait(1)
        if T.fullbright and not wasOn then
            setFB(true); wasOn = true
        elseif not T.fullbright and wasOn then
            setFB(false); wasOn = false
        end
    end
end)

-- ========== NOCLIP ==========
RS.Stepped:Connect(function()
    if not T.noclip then return end
    local c = p.Character
    if c then
        for _, v in pairs(c:GetDescendants()) do
            if v:IsA("BasePart") then
                v.CanCollide = false
            end
        end
    end
end)

-- ========== FLY ==========
RS.RenderStepped:Connect(function()
    if not T.flying then return end
    if flyBV and flyBV.Parent then
        local d = Vector3.new(0, 0, 0)
        local cf = cam.CFrame
        if fk.w then d = d + cf.LookVector end
        if fk.s then d = d - cf.LookVector end
        if fk.a then d = d - cf.RightVector end
        if fk.d then d = d + cf.RightVector end
        if fk.sp then
            d = d + Vector3.new(0, 1, 0)
        end
        if fk.sh then
            d = d - Vector3.new(0, 1, 0)
        end
        if d.Magnitude > 0 then d = d.Unit end
        flyBV.Velocity = d * 60
    end
    if flyBG and flyBG.Parent then
        flyBG.CFrame = cam.CFrame
    end
end)

-- ========== INPUT ==========
UIS.InputBegan:Connect(function(input, processed)
    if processed then return end

    -- Fly keys
    if input.KeyCode == Enum.KeyCode.W then fk.w = true end
    if input.KeyCode == Enum.KeyCode.A then fk.a = true end
    if input.KeyCode == Enum.KeyCode.S then fk.s = true end
    if input.KeyCode == Enum.KeyCode.D then fk.d = true end
    if input.KeyCode == Enum.KeyCode.Space then fk.sp = true end
    if input.KeyCode == Enum.KeyCode.LeftShift then fk.sh = true end

    -- Infinite jump
    if T.infJump and input.KeyCode == Enum.KeyCode.Space then
        local h = gH()
        if h then h.JumpPower = 100 end
        local r = gR()
        if r then r.Velocity = Vector3.new(0, 50, 0) end
    end

    -- Click teleport
    if T.clickTP
        and input.UserInputType
        == Enum.UserInputType.MouseButton1 then
        local t = ms.Target
        if t and t:IsA("BasePart") then
            local r = gR()
            if r then
                r.CFrame = t.CFrame + Vector3.new(0, 3, 0)
            end
        end
    end

    -- Right click deselect
    if input.UserInputType == Enum.UserInputType.MouseButton2 then
        if selectMode then
            selectMode = false
            selBtn.Text = "Click to Select Part"
            selBtn.BackgroundColor3 =
                Color3.fromRGB(0, 160, 80)
        elseif propOpen then
            closePropPanel()
        end
    end

    -- ESC deselect
    if input.KeyCode == Enum.KeyCode.Escape then
        if selectMode then
            selectMode = false
            selBtn.Text = "Click to Select Part"
            selBtn.BackgroundColor3 =
                Color3.fromRGB(0, 160, 80)
        elseif propOpen then
            closePropPanel()
        end
    end
end)

UIS.InputEnded:Connect(function(input, processed)
    if input.KeyCode == Enum.KeyCode.W then fk.w = false end
    if input.KeyCode == Enum.KeyCode.A then fk.a = false end
    if input.KeyCode == Enum.KeyCode.S then fk.s = false end
    if input.KeyCode == Enum.KeyCode.D then fk.d = false end
    if input.KeyCode == Enum.KeyCode.Space then fk.sp = false end
    if input.KeyCode == Enum.KeyCode.LeftShift then fk.sh = false end
end)

-- ========== ANTI AFK ==========
spawn(function()
    while gui and gui.Parent do
        wait(60)
        if T.antiAFK then
            pcall(function()
                game:GetService("VirtualUser")
                    :CaptureController()
                game:GetService("VirtualUser")
                    :ClickButton2(Vector2.new())
            end)
        end
    end
end)

-- ========== RESPAWN SPEED/JUMP FIX ==========
p.CharacterAdded:Connect(function(char)
    spawn(function()
        wait(2)
        if custSpd then
            local h = char:FindFirstChild("Humanoid")
            if h then h.WalkSpeed = custSpd end
        end
        if custJmp then
            local h = char:FindFirstChild("Humanoid")
            if h then h.JumpPower = custJmp end
        end
    end)
end)

-- Print status
if PaintObject then
    print("[Hydroxide v9] PaintObject FOUND - permanent saves enabled")
else
    print("[Hydroxide v9] WARNING: PaintObject NOT FOUND - edit will be local only")
end
print("[Hydroxide v9] MoveObject: " .. tostring(MoveObject))
print("[Hydroxide v9] DeleteObject: " .. tostring(DeleteObject))
print("[Hydroxide v9] ESP: Fast refresh (0.5s) + DescendantAdded instant detection + Typing ESP override")
print("[Hydroxide v9] Ready!")

Features & Information

FUNNY FUNNY OC :D
#YATSDVUDIEUFHBDJWUDFGVWH#obby creator#glitched#happyhappypeoplegooning

Community Comments (6)

bobjsbobjsApr 5, 2026

ignore the tags please

scrippterrscrippterrApr 5, 2026

which obby creator, the one by mario?

bobjsbobjsApr 5, 2026

@scrippterr yeah

Replying to @bobjs
scrippterrscrippterrApr 5, 2026

@bobjsco w

a4c0ua4c0uApr 11, 2026

add the option to delete or clone the part selected

HamadA_80HamadA_80Jun 5, 2026

Idk I'm new I'm on mobile can u help

More Scripts for Universal Scripts