Fe JOHN DOE BROOKHAVEN WITH PROP [FLING , KILL]
Key Required

Fe JOHN DOE BROOKHAVEN WITH PROP [FLING , KILL]

Brookhaven 🏑RPXENOTXTXENOTXT 1.8K views 9.2K executesUpdated Oct 5, 2026
5.0/ 5(3 votes)
30100% Positive
Lua Scriptβ€’1073 lines (37692 chars)
--[[
    ═══════════════════════════════════════════════════════════════
    JOHN DOE ABILITY PROP β€” MR.XENO  (FINAL)
    Abilities : LASER / SWING / GRAB / BLEACH
    State     : idle β†’ summon β†’ ability β†’ retract β†’ hidden
    ═══════════════════════════════════════════════════════════════
]]

local Players      = game:GetService("Players")
local RunService   = game:GetService("RunService")
local UIS          = game:GetService("UserInputService")
local CoreGui      = game:GetService("CoreGui")
local TweenService = game:GetService("TweenService")

local LP         = Players.LocalPlayer
local OWNER_NAME = LP.Name

-- ═══════════════════════════════════════════════════════════
-- CONFIG
-- ═══════════════════════════════════════════════════════════
local CONFIG = {
    PROP_PARENT_FOLDER = "WorkspaceCom",
    PROP_LIST_FOLDER   = "001_TrafficCones",
    PROP_PREFIX        = "Prop",
    MAX_PROPS          = 30,
    HIDDEN_FAR         = 200,
    IDLE_ORBIT_RADIUS  = 4.2,
    IDLE_ORBIT_HEIGHT  = 2.2,
    LASER_RANGE        = 45,
    LASER_HEIGHT       = 2.2,
    SWING_RADIUS       = 9,
    GRAB_RANGE         = 60,
    BLEACH_RANGE       = 70,
    CYCLE_SPEED        = 0.55,
    TICK_RATE          = 0.06,
}

local ABILITY_DEFS = {
    LASER  = { cooldown = 4.0 },
    SWING  = { cooldown = 3.5 },
    GRAB   = { cooldown = 5.0 },
    BLEACH = { cooldown = 8.0 },
}
local ABILITY_ORDER = { "LASER", "SWING", "GRAB", "BLEACH" }

local COLOR_PRESETS = {
    { name = "CORRUPTED", palette = {
        Color3.fromRGB(255,  60,  60),
        Color3.fromRGB(180,  20,  30),
        Color3.fromRGB(255, 140, 140),
        Color3.fromRGB( 60,   5,  10),
    }},
    { name = "BLOOD", palette = {
        Color3.fromRGB(180,  10,  15),
        Color3.fromRGB(120,   5,  10),
        Color3.fromRGB(220,  30,  40),
        Color3.fromRGB( 40,   0,   0),
    }},
    { name = "PHOENIX", palette = {
        Color3.fromRGB(255, 100,  30),
        Color3.fromRGB(255,  40,  10),
        Color3.fromRGB(255, 200, 100),
        Color3.fromRGB( 80,  10,   0),
    }},
}

local THEME = {
    bg        = Color3.fromRGB(12,  8, 10),
    panel     = Color3.fromRGB(18, 10, 12),
    button    = Color3.fromRGB(26, 14, 16),
    buttonHov = Color3.fromRGB(40, 18, 20),
    red       = Color3.fromRGB(220, 40, 50),
    redBright = Color3.fromRGB(255, 70, 80),
    redGlow   = Color3.fromRGB(255, 140, 145),
    redDark   = Color3.fromRGB(90, 15, 20),
    text      = Color3.fromRGB(240, 225, 225),
    textDim   = Color3.fromRGB(170, 120, 125),
    stroke    = Color3.fromRGB(70, 18, 22),
}

local state = {
    enabled=false, showIdle=false, adjusting=false, minimized=false,
    colorIndex=1, color=Color3.fromRGB(220,40,50), colorPhase=0,
    currentAbility=nil,
    abilityState = { LASER="idle", SWING="idle", GRAB="idle", BLEACH="idle" },
    lastUsed     = { LASER=-math.huge, SWING=-math.huge, GRAB=-math.huge, BLEACH=-math.huge },
    props={}, currentCFrames={}, originalColors={}, tickAccum=0,
}

-- ═══════════════════════════════════════════════════════════
-- PROP HELPERS
-- ═══════════════════════════════════════════════════════════
local function getRoot()
    local char = LP.Character
    return char and char:FindFirstChild("HumanoidRootPart")
end

local function getPropFolder()
    local parent = workspace:FindFirstChild(CONFIG.PROP_PARENT_FOLDER)
    return parent and parent:FindFirstChild(CONFIG.PROP_LIST_FOLDER)
end

local function rememberProp(prop)
    if not prop then return end
    if prop:IsA("BasePart") and not state.originalColors[prop] then
        state.originalColors[prop] = prop.Color
    end
    for _, d in ipairs(prop:GetDescendants()) do
        if d:IsA("BasePart") and not state.originalColors[d] then
            state.originalColors[d] = d.Color
        end
    end
end

local function scanProps()
    local folder = getPropFolder()
    if not folder then return {} end
    local target = CONFIG.PROP_PREFIX .. OWNER_NAME
    local found = {}
    for _, obj in ipairs(folder:GetChildren()) do
        if obj.Name == target then table.insert(found, obj) end
    end
    table.sort(found, function(a,b) return a:GetDebugId() < b:GetDebugId() end)
    while #found > CONFIG.MAX_PROPS do table.remove(found) end
    for _, p in ipairs(found) do rememberProp(p) end
    return found
end

local function invokeProp(prop, cf)
    if not prop or not prop.Parent then return end
    local r = prop:FindFirstChild("SetCurrentCFrame")
    if r and r:IsA("RemoteFunction") then
        pcall(function() r:InvokeServer(cf) end)
    elseif prop:IsA("BasePart") then
        prop.CFrame = cf
    end
end

local function pushColor(prop, color)
    if not prop or not prop.Parent then return end
    local r = prop:FindFirstChild("ChangePropColor")
    if r and r:IsA("RemoteFunction") then
        local ok = pcall(function() r:InvokeServer(color) end)
        if ok then return end
    end
    if prop:IsA("BasePart") then prop.Color = color end
    for _, d in ipairs(prop:GetDescendants()) do
        if d:IsA("BasePart") then d.Color = color end
    end
end

local function restoreColors()
    for part, col in pairs(state.originalColors) do
        if part and part.Parent then part.Color = col end
    end
    table.clear(state.originalColors)
end

local function getHiddenCF(root)
    return root.CFrame * CFrame.new(0, -CONFIG.HIDDEN_FAR, 0)
end

local function getIdleOrbit(i, N, root)
    local ang = ((i-1)/math.max(N,1))*math.pi*2
    local x = math.cos(ang)*CONFIG.IDLE_ORBIT_RADIUS
    local z = math.sin(ang)*CONFIG.IDLE_ORBIT_RADIUS
    local y = CONFIG.IDLE_ORBIT_HEIGHT + math.sin(ang*2)*0.4
    return root.CFrame * CFrame.new(x, y, z)
end

local function currentPalette() return COLOR_PRESETS[state.colorIndex].palette end

-- ═══════════════════════════════════════════════════════════
-- EASING
-- ═══════════════════════════════════════════════════════════
local function easeOutCubic(t) return 1-(1-t)^3 end
local function easeInOutCubic(t)
    if t<0.5 then return 4*t*t*t end
    return 1-((-2*t+2)^3)/2
end
local function easeOutQuint(t) return 1-(1-t)^5 end

-- ═══════════════════════════════════════════════════════════
-- TWEEN ALL PROPS
-- ═══════════════════════════════════════════════════════════
local function tweenPropsTo(targetFn, duration, easeFn)
    easeFn = easeFn or easeOutCubic
    local root = getRoot(); if not root then return end
    local N = #state.props; if N == 0 then return end
    local startCFs = table.create(N)
    for i = 1, N do
        startCFs[i] = state.currentCFrames[i] or getHiddenCF(root)
    end
    local t0 = os.clock()
    while true do
        local a = duration <= 0 and 1 or math.clamp((os.clock()-t0)/duration, 0, 1)
        local e = easeFn(a)
        for i = 1, N do
            local prop = state.props[i]
            if prop and prop.Parent then
                local target = targetFn(i, a, e, root)
                if target then
                    local cf = startCFs[i]:Lerp(target, e)
                    state.currentCFrames[i] = cf
                    task.spawn(invokeProp, prop, cf)
                end
            end
        end
        if a >= 1 then break end
        RunService.Heartbeat:Wait()
    end
end

-- ═══════════════════════════════════════════════════════════
-- LASER  (fix: pakai -Z = forward)
-- ═══════════════════════════════════════════════════════════
local function doLaser()
    local N = #state.props; if N == 0 then return end

    -- SUMMON: cluster kecil di depan
    tweenPropsTo(function(i, a, e, root)
        local u = (i-1)/math.max(N-1,1)
        local ang = u*math.pi*2
        local r = (1-u*0.6)*1.4
        local x = math.cos(ang)*r
        local y = 1.8 + math.sin(ang)*0.4 + u*0.6
        local z = -2.5 - u*0.4  -- FORWARD
        return root.CFrame * CFrame.new(x, y, z)
            * CFrame.Angles(math.rad(-90), 0, 0)
    end, 0.30, easeOutQuint)

    -- EXTEND: beam ke DEPAN
    tweenPropsTo(function(i, a, e, root)
        local u = (i-1)/math.max(N-1,1)
        local z = -(3 + u*CONFIG.LASER_RANGE)   -- FORWARD (-Z)
        return root.CFrame * CFrame.new(0, CONFIG.LASER_HEIGHT, z)
            * CFrame.Angles(math.rad(-90), 0, 0)
    end, 0.28, easeOutCubic)

    -- HOLD + wobble
    local tEnd = os.clock() + 0.65
    while os.clock() < tEnd do
        local root = getRoot()
        if root then
            for i = 1, N do
                local prop = state.props[i]
                if prop and prop.Parent then
                    local u = (i-1)/math.max(N-1,1)
                    local z = -(3 + u*CONFIG.LASER_RANGE)
                    local wob = math.sin(os.clock()*34 + i)*0.16*u
                    local cf = root.CFrame
                        * CFrame.new(wob, CONFIG.LASER_HEIGHT, z)
                        * CFrame.Angles(math.rad(-90), 0, 0)
                    state.currentCFrames[i] = cf
                    task.spawn(invokeProp, prop, cf)
                end
            end
        end
        RunService.Heartbeat:Wait()
    end
end

-- ═══════════════════════════════════════════════════════════
-- SWING  (fix: ada TRAIL di belakang blade)
-- ═══════════════════════════════════════════════════════════
local function doSwing()
    local N = #state.props; if N == 0 then return end
    local A0, A1 = math.rad(-105), math.rad(105)

    -- SUMMON di sisi kanan (posisi awal)
    tweenPropsTo(function(i, a, e, root)
        local u = (i-1)/math.max(N-1,1)
        local ang = A0 - u*math.rad(20)
        local r = CONFIG.SWING_RADIUS + u*0.6
        return root.CFrame
            * CFrame.Angles(0, ang, 0)
            * CFrame.new(0, 2.4 + u*0.7, -r)
    end, 0.24, easeOutCubic)

    -- WINDUP pull lebih ke belakang kanan
    tweenPropsTo(function(i, a, e, root)
        local u = (i-1)/math.max(N-1,1)
        local ang = A0 - u*math.rad(28)
        local r = CONFIG.SWING_RADIUS + u*0.6
        return root.CFrame
            * CFrame.Angles(0, ang, 0)
            * CFrame.new(0, 2.1 + u*0.7, -r)
    end, 0.22, easeInOutCubic)

    task.wait(0.05)

    -- SWEEP dengan TRAIL (lag grow dengan progress)
    tweenPropsTo(function(i, a, e, root)
        local u = (i-1)/math.max(N-1,1)
        local sweep = A0 + (A1 - A0) * e
        -- trailing: makin tinggi u makin ketinggalan
        local lag = u * math.rad(45) * e
        local ang = sweep - lag

        local r = CONFIG.SWING_RADIUS + (1-u)*1.8
        local y = 2.4 + math.sin(e*math.pi)*1.2 + u*0.6
        local tilt = math.rad(60) + e*math.rad(30)

        return root.CFrame
            * CFrame.Angles(0, ang, 0)
            * CFrame.new(0, y, -r)
            * CFrame.Angles(0, math.rad(90), tilt)
    end, 0.32, easeOutQuint)

    task.wait(0.10)
end

-- ═══════════════════════════════════════════════════════════
-- GRAB  (fix: bentuk TANGAN TERBUKA β†’ MENUTUP)
-- ═══════════════════════════════════════════════════════════
local function findGrabTarget()
    local root = getRoot(); if not root then return nil end
    local myPos, look = root.Position, root.CFrame.LookVector
    local best, bestScore = nil, -1
    for _, plr in ipairs(Players:GetPlayers()) do
        if plr ~= LP and plr.Character then
            local hrp = plr.Character:FindFirstChild("HumanoidRootPart")
            if hrp then
                local diff = hrp.Position - myPos
                local dist = diff.Magnitude
                if dist > 1 and dist < CONFIG.GRAB_RANGE then
                    local dot = look:Dot(diff.Unit)
                    if dot > 0.5 then
                        local s = dot * (1 - dist/CONFIG.GRAB_RANGE)
                        if s > bestScore then bestScore = s; best = hrp end
                    end
                end
            end
        end
    end
    return best
end

-- palm/fingers builder
local function handPoint(i, N, center, forward, radius)
    local up = Vector3.new(0,1,0)
    local right = forward:Cross(up)
    if right.Magnitude < 0.01 then right = Vector3.new(1,0,0) end
    right = right.Unit
    local trueUp = right:Cross(forward).Unit
    local ang = ((i-1)/N) * math.pi * 2
    local off = right*math.cos(ang)*radius + trueUp*math.sin(ang)*radius
    return center + off, forward
end

local function doGrab()
    local N = #state.props; if N == 0 then return end
    local root = getRoot(); if not root then return end
    local target = findGrabTarget()

    local function getTargetPos()
        if target and target.Parent then return target.Position end
        local r = getRoot()
        return r and (r.Position + r.CFrame.LookVector*15 + Vector3.new(0,1,0)) or root.Position
    end

    -- SUMMON hand terbuka di depan
    tweenPropsTo(function(i, a, e, root)
        local fwd = root.CFrame.LookVector
        local c   = root.Position + fwd*2.5 + Vector3.new(0, 2.2, 0)
        local pos, d = handPoint(i, N, c, fwd, 2.0*e)
        return CFrame.new(pos, pos + d)
    end, 0.28, easeOutCubic)

    -- EXTEND hand terbuka ke target
    tweenPropsTo(function(i, a, e, root)
        local fwd = root.CFrame.LookVector
        local tPos = getTargetPos()
        local c = (root.Position + fwd*3):Lerp(tPos, e) + Vector3.new(0, 2.2, 0)
        local pos, d = handPoint(i, N, c, fwd, 2.0)
        return CFrame.new(pos, pos + d)
    end, 0.38, easeOutQuint)

    -- CLOSE hand (fingers converge)
    tweenPropsTo(function(i, a, e, root)
        local fwd = root.CFrame.LookVector
        local c   = getTargetPos() + Vector3.new(0, 2.2, 0)
        local radius = 2.0 * (1 - e*0.92)
        local pos, d = handPoint(i, N, c, fwd, radius)
        return CFrame.new(pos, pos + d)
    end, 0.22, easeOutCubic)

    -- HOLD grip
    task.wait(0.28)

    -- RETRACT balik ke player
    tweenPropsTo(function(i, a, e, root)
        local fwd = root.CFrame.LookVector
        local tPos = getTargetPos()
        local c = tPos:Lerp(root.Position + fwd*2.5 + Vector3.new(0,2.2,0), e)
        local radius = 0.16 + e*1.4
        local pos, d = handPoint(i, N, c, fwd, radius)
        return CFrame.new(pos, pos + d)
    end, 0.32, easeInOutCubic)
end

-- ═══════════════════════════════════════════════════════════
-- BLEACH  (BARU: muncul dari tanah bawah player sekitar,
--          naik β†’ turun β†’ retarget, 1 prop / orang)
-- ═══════════════════════════════════════════════════════════
local function doBleach()
    local N = #state.props; if N == 0 then return end
    local root = getRoot(); if not root then return end

    -- kumpulin target player + self
    local myPos = root.Position
    local targets = {}
    for _, plr in ipairs(Players:GetPlayers()) do
        if plr ~= LP and plr.Character then
            local hrp = plr.Character:FindFirstChild("HumanoidRootPart")
            if hrp and (hrp.Position - myPos).Magnitude < CONFIG.BLEACH_RANGE then
                table.insert(targets, hrp)
            end
        end
    end
    table.insert(targets, root)  -- self juga kena

    local function targetPos(idx)
        local t = targets[idx]
        if t and t.Parent then return t.Position end
        local r = getRoot()
        return r and r.Position or myPos
    end

    local waves = 3
    for w = 1, waves do
        -- RISE dari tanah
        tweenPropsTo(function(i, a, e, root)
            local ti = ((i - 1 + w - 1) % #targets) + 1
            local tp = targetPos(ti)
            local y  = -4 + e * 7.5
            return CFrame.new(tp + Vector3.new(0, y, 0))
                * CFrame.Angles(0, os.clock()*3 + i*0.5, 0)
        end, 0.32, easeOutCubic)

        task.wait(0.03)

        -- SINK balik ke tanah
        tweenPropsTo(function(i, a, e, root)
            local ti = ((i - 1 + w - 1) % #targets) + 1
            local tp = targetPos(ti)
            local y  = 3.5 - e * 7.5
            return CFrame.new(tp + Vector3.new(0, y, 0))
                * CFrame.Angles(0, os.clock()*3 + i, 0)
        end, 0.22, easeInOutCubic)
    end
end

-- ═══════════════════════════════════════════════════════════
-- EXECUTOR
-- ═══════════════════════════════════════════════════════════
local function retractAll()
    local root = getRoot(); if not root then return end
    tweenPropsTo(function() return getHiddenCF(root) end, 0.42, easeInOutCubic)
end

local function canUse(name)
    if not state.enabled then return false end
    if state.currentAbility then return false end
    if os.clock() - state.lastUsed[name] < ABILITY_DEFS[name].cooldown then return false end
    return true
end

local function runAbility(name)
    if not canUse(name) then return end
    state.currentAbility = name
    state.abilityState[name] = "summon"
    state.lastUsed[name] = os.clock()
    task.spawn(function()
        local ok, err = pcall(function()
            if name == "LASER" then doLaser()
            elseif name == "SWING" then doSwing()
            elseif name == "GRAB" then doGrab()
            elseif name == "BLEACH" then doBleach() end
        end)
        if not ok then warn("[MR.XENO] "..name.." err: "..tostring(err)) end
        state.abilityState[name] = "retract"
        retractAll()
        state.abilityState[name] = "idle"
        state.currentAbility = nil
        if not state.enabled then restoreColors() end
    end)
end

-- ═══════════════════════════════════════════════════════════
-- UI
-- ═══════════════════════════════════════════════════════════
local gui = Instance.new("ScreenGui")
gui.Name = "JohnDoeAbility_MRXENO"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
gui.Parent = CoreGui

-- MAIN PANEL
local main = Instance.new("Frame")
main.Name = "Main"
main.Size = UDim2.fromOffset(230, 250)
main.Position = UDim2.new(0, 20, 0, 90)
main.BackgroundColor3 = THEME.bg
main.BackgroundTransparency = 0.08
main.BorderSizePixel = 0
main.Parent = gui

Instance.new("UICorner", main).CornerRadius = UDim.new(0, 12)
local mainStroke = Instance.new("UIStroke")
mainStroke.Color = THEME.stroke
mainStroke.Thickness = 1.2
mainStroke.Transparency = 0.15
mainStroke.Parent = main

-- HEADER
local header = Instance.new("Frame")
header.Name = "Header"
header.Size = UDim2.new(1, 0, 0, 44)
header.BackgroundColor3 = Color3.fromRGB(16, 8, 10)
header.BackgroundTransparency = 0.15
header.BorderSizePixel = 0
header.ZIndex = 2
header.Parent = main

Instance.new("UICorner", header).CornerRadius = UDim.new(0, 12)

local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -70, 0, 20)
title.Position = UDim2.fromOffset(12, 6)
title.BackgroundTransparency = 1
title.Text = "MR.XENO"
title.TextColor3 = THEME.redBright
title.Font = Enum.Font.GothamBlack
title.TextSize = 16
title.TextXAlignment = Enum.TextXAlignment.Left
title.ZIndex = 3
title.Parent = header

local subtitle = Instance.new("TextLabel")
subtitle.Size = UDim2.new(1, -70, 0, 14)
subtitle.Position = UDim2.fromOffset(13, 24)
subtitle.BackgroundTransparency = 1
subtitle.Text = "JOHN DOE  β€’  ABILITY PROP"
subtitle.TextColor3 = THEME.textDim
subtitle.Font = Enum.Font.GothamMedium
subtitle.TextSize = 9
subtitle.TextXAlignment = Enum.TextXAlignment.Left
subtitle.ZIndex = 3
subtitle.Parent = header

local headerLine = Instance.new("Frame")
headerLine.Size = UDim2.new(1, -24, 0, 1)
headerLine.Position = UDim2.new(0, 12, 1, -1)
headerLine.BackgroundColor3 = THEME.red
headerLine.BackgroundTransparency = 0.55
headerLine.BorderSizePixel = 0
headerLine.ZIndex = 3
headerLine.Parent = header

-- MINIMIZE BUTTON (parent = main, ZIndex tinggi)
local minBtn = Instance.new("TextButton")
minBtn.Size = UDim2.fromOffset(24, 24)
minBtn.Position = UDim2.new(1, -32, 0, 10)
minBtn.BackgroundColor3 = THEME.button
minBtn.BackgroundTransparency = 0.05
minBtn.BorderSizePixel = 0
minBtn.Text = "β€”"
minBtn.TextColor3 = THEME.text
minBtn.Font = Enum.Font.GothamBold
minBtn.TextSize = 16
minBtn.AutoButtonColor = false
minBtn.ZIndex = 20
minBtn.Parent = main

Instance.new("UICorner", minBtn).CornerRadius = UDim.new(0, 6)
local mbS = Instance.new("UIStroke")
mbS.Color = THEME.stroke; mbS.Thickness = 1; mbS.Transparency = 0.35; mbS.Parent = minBtn

minBtn.MouseEnter:Connect(function()
    TweenService:Create(minBtn, TweenInfo.new(0.15), {BackgroundColor3 = THEME.buttonHov}):Play()
end)
minBtn.MouseLeave:Connect(function()
    TweenService:Create(minBtn, TweenInfo.new(0.15), {BackgroundColor3 = THEME.button}):Play()
end)

-- DRAG MAIN via HEADER
do
    local dragging, dragStart, startPos
    header.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1
            or input.UserInputType == Enum.UserInputType.Touch then
            dragging = true; dragStart = input.Position; startPos = main.Position
        end
    end)
    UIS.InputChanged:Connect(function(input)
        if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement
            or input.UserInputType == Enum.UserInputType.Touch) then
            local d = input.Position - dragStart
            main.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + d.X,
                                      startPos.Y.Scale, startPos.Y.Offset + d.Y)
        end
    end)
    UIS.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1
            or input.UserInputType == Enum.UserInputType.Touch then
            dragging = false
        end
    end)
end

-- PANEL BUTTON FACTORY
local function makePanelButton(text, y)
    local b = Instance.new("TextButton")
    b.Size = UDim2.new(1, -20, 0, 30)
    b.Position = UDim2.fromOffset(10, y)
    b.BackgroundColor3 = THEME.button
    b.BackgroundTransparency = 0.05
    b.BorderSizePixel = 0
    b.Text = ""
    b.AutoButtonColor = false
    b.ZIndex = 3
    b.Parent = main

    Instance.new("UICorner", b).CornerRadius = UDim.new(0, 8)
    local s = Instance.new("UIStroke")
    s.Color = THEME.stroke; s.Thickness = 1; s.Transparency = 0.35; s.Parent = b

    local accent = Instance.new("Frame")
    accent.Size = UDim2.new(0, 3, 1, -14)
    accent.Position = UDim2.new(0, 6, 0, 7)
    accent.BackgroundColor3 = THEME.red
    accent.BorderSizePixel = 0
    accent.Parent = b
    Instance.new("UICorner", accent).CornerRadius = UDim.new(1, 0)

    local val = Instance.new("TextLabel")
    val.Size = UDim2.new(0, 100, 1, 0)
    val.Position = UDim2.new(1, -106, 0, 0)
    val.BackgroundTransparency = 1
    val.Text = ""
    val.TextColor3 = THEME.redGlow
    val.Font = Enum.Font.GothamBold
    val.TextSize = 11
    val.TextXAlignment = Enum.TextXAlignment.Right
    val.Parent = b

    local label = Instance.new("TextLabel")
    label.Size = UDim2.new(1, -120, 1, 0)
    label.Position = UDim2.fromOffset(18, 0)
    label.BackgroundTransparency = 1
    label.Text = text
    label.TextColor3 = THEME.text
    label.Font = Enum.Font.GothamMedium
    label.TextSize = 12
    label.TextXAlignment = Enum.TextXAlignment.Left
    label.Parent = b

    b.MouseEnter:Connect(function()
        TweenService:Create(b, TweenInfo.new(0.15), {BackgroundColor3 = THEME.buttonHov}):Play()
    end)
    b.MouseLeave:Connect(function()
        TweenService:Create(b, TweenInfo.new(0.15), {BackgroundColor3 = THEME.button}):Play()
    end)
    return b, val
end

local colorBtn,  colorVal  = makePanelButton("COLOR",        58)
local scanBtn,   scanVal   = makePanelButton("SCAN PROP",    92)
local toggleBtn, toggleVal = makePanelButton("TOGGLE PROP", 126)
local showBtn,   showVal   = makePanelButton("SHOW ABILITY",160)
local adjustBtn, adjustVal = makePanelButton("ADJUST MOVE", 194)

colorVal.Text  = "CORRUPTED"
scanVal.Text   = "0 / 30"
toggleVal.Text = "OFF"
showVal.Text   = "OFF"
adjustVal.Text = "OFF"

local statusLine = Instance.new("TextLabel")
statusLine.Size = UDim2.new(1, -20, 0, 14)
statusLine.Position = UDim2.new(0, 12, 1, -18)
statusLine.BackgroundTransparency = 1
statusLine.Text = "●  SYSTEM OFFLINE"
statusLine.TextColor3 = THEME.textDim
statusLine.Font = Enum.Font.GothamMedium
statusLine.TextSize = 10
statusLine.TextXAlignment = Enum.TextXAlignment.Left
statusLine.ZIndex = 3
statusLine.Parent = main

-- ═══════════════════════════════════════════════════════════
-- ABILITY BAR
-- ═══════════════════════════════════════════════════════════
local abilityBar = Instance.new("Frame")
abilityBar.Name = "AbilityBar"
abilityBar.Size = UDim2.fromOffset(348, 62)
abilityBar.Position = UDim2.new(0.5, -174, 1, -90)
abilityBar.BackgroundTransparency = 1
abilityBar.Parent = gui

local abilityButtons = {}
for i, name in ipairs(ABILITY_ORDER) do
    local btn = Instance.new("TextButton")
    btn.Name = name
    btn.Size = UDim2.fromOffset(80, 56)
    btn.Position = UDim2.fromOffset((i-1)*88 + 2, 3)
    btn.BackgroundColor3 = THEME.button
    btn.BackgroundTransparency = 0.05
    btn.BorderSizePixel = 0
    btn.Text = ""
    btn.AutoButtonColor = false
    btn.Parent = abilityBar

    Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 10)
    local s = Instance.new("UIStroke")
    s.Color = THEME.redDark; s.Thickness = 1.4; s.Transparency = 0.15; s.Parent = btn

    local icon = Instance.new("Frame")
    icon.Size = UDim2.fromOffset(26, 26)
    icon.Position = UDim2.new(0.5, -13, 0, 6)
    icon.BackgroundColor3 = THEME.redDark
    icon.BorderSizePixel = 0
    icon.Parent = btn
    Instance.new("UICorner", icon).CornerRadius = UDim.new(1, 0)

    local dot = Instance.new("Frame")
    dot.Size = UDim2.fromOffset(8, 8)
    dot.Position = UDim2.new(0.5, -4, 0.5, -4)
    dot.BackgroundColor3 = THEME.redBright
    dot.BorderSizePixel = 0
    dot.Parent = icon
    Instance.new("UICorner", dot).CornerRadius = UDim.new(1, 0)

    local lbl = Instance.new("TextLabel")
    lbl.Size = UDim2.new(1, 0, 0, 16)
    lbl.Position = UDim2.new(0, 0, 1, -20)
    lbl.BackgroundTransparency = 1
    lbl.Text = name
    lbl.TextColor3 = THEME.text
    lbl.Font = Enum.Font.GothamBold
    lbl.TextSize = 11
    lbl.Parent = btn

    local cd = Instance.new("Frame")
    cd.Size = UDim2.fromScale(1, 1)
    cd.BackgroundColor3 = Color3.fromRGB(0,0,0)
    cd.BackgroundTransparency = 0.45
    cd.BorderSizePixel = 0
    cd.Visible = false
    cd.ZIndex = 2
    cd.Parent = btn
    Instance.new("UICorner", cd).CornerRadius = UDim.new(0, 10)

    local cdt = Instance.new("TextLabel")
    cdt.Size = UDim2.fromScale(1, 1)
    cdt.BackgroundTransparency = 1
    cdt.Text = ""
    cdt.TextColor3 = THEME.redBright
    cdt.Font = Enum.Font.GothamBlack
    cdt.TextSize = 16
    cdt.ZIndex = 3
    cdt.Parent = cd

    abilityButtons[name] = { button=btn, cooldown=cd, cooldownText=cdt, stroke=s }

    btn.MouseButton1Down:Connect(function()
        if state.adjusting then return end
        TweenService:Create(btn, TweenInfo.new(0.08), {Size = UDim2.fromOffset(74,52)}):Play()
        TweenService:Create(s, TweenInfo.new(0.08), {Color=THEME.redBright, Transparency=0}):Play()
    end)
    btn.MouseButton1Up:Connect(function()
        TweenService:Create(btn, TweenInfo.new(0.12), {Size = UDim2.fromOffset(80,56)}):Play()
        TweenService:Create(s, TweenInfo.new(0.15), {Color=THEME.redDark, Transparency=0.15}):Play()
    end)
    btn.MouseLeave:Connect(function()
        TweenService:Create(btn, TweenInfo.new(0.12), {Size = UDim2.fromOffset(80,56)}):Play()
        TweenService:Create(s, TweenInfo.new(0.15), {Color=THEME.redDark, Transparency=0.15}):Play()
    end)
    btn.MouseButton1Click:Connect(function()
        if state.adjusting then return end
        runAbility(name)
    end)
    btn.MouseEnter:Connect(function()
        if state.adjusting then return end
        TweenService:Create(btn, TweenInfo.new(0.15), {BackgroundColor3=THEME.buttonHov}):Play()
    end)
    btn.MouseLeave:Connect(function()
        TweenService:Create(btn, TweenInfo.new(0.15), {BackgroundColor3=THEME.button}):Play()
    end)
end

-- ═══════════════════════════════════════════════════════════
-- ADJUST OVERLAY (mode pindah β€” nangkep semua input)
-- ═══════════════════════════════════════════════════════════
local adjustOverlay = Instance.new("TextButton")
adjustOverlay.Size = UDim2.fromScale(1, 1)
adjustOverlay.BackgroundTransparency = 1
adjustOverlay.Text = ""
adjustOverlay.AutoButtonColor = false
adjustOverlay.Visible = false
adjustOverlay.ZIndex = 100
adjustOverlay.Parent = abilityBar

do
    local dragging, dragStart, startPos
    adjustOverlay.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1
            or input.UserInputType == Enum.UserInputType.Touch then
            dragging = true; dragStart = input.Position; startPos = abilityBar.Position
        end
    end)
    UIS.InputChanged:Connect(function(input)
        if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement
            or input.UserInputType == Enum.UserInputType.Touch) then
            local d = input.Position - dragStart
            abilityBar.Position = UDim2.new(
                startPos.X.Scale, startPos.X.Offset + d.X,
                startPos.Y.Scale, startPos.Y.Offset + d.Y)
        end
    end)
    UIS.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1
            or input.UserInputType == Enum.UserInputType.Touch then
            dragging = false
        end
    end)
end

-- outline indicator
local adjustOutline = Instance.new("Frame")
adjustOutline.Size = UDim2.new(1, 6, 1, 6)
adjustOutline.Position = UDim2.fromOffset(-3, -3)
adjustOutline.BackgroundTransparency = 1
adjustOutline.Visible = false
adjustOutline.ZIndex = 99
adjustOutline.Parent = abilityBar
local aoStroke = Instance.new("UIStroke")
aoStroke.Color = THEME.redBright
aoStroke.Thickness = 1.5
aoStroke.Transparency = 0.2
aoStroke.Parent = adjustOutline
Instance.new("UICorner", adjustOutline).CornerRadius = UDim.new(0, 12)

-- ═══════════════════════════════════════════════════════════
-- FLOATING MINIMIZE ICON
-- ═══════════════════════════════════════════════════════════
local floatIcon = Instance.new("TextButton")
floatIcon.Size = UDim2.fromOffset(46, 46)
floatIcon.Position = UDim2.new(0, 20, 0, 90)
floatIcon.BackgroundColor3 = THEME.bg
floatIcon.BackgroundTransparency = 0.05
floatIcon.BorderSizePixel = 0
floatIcon.Text = "X"
floatIcon.TextColor3 = THEME.redBright
floatIcon.Font = Enum.Font.GothamBlack
floatIcon.TextSize = 20
floatIcon.AutoButtonColor = false
floatIcon.Visible = false
floatIcon.ZIndex = 30
floatIcon.Parent = gui

Instance.new("UICorner", floatIcon).CornerRadius = UDim.new(0, 12)
local fiS = Instance.new("UIStroke")
fiS.Color = THEME.red; fiS.Thickness = 1.4; fiS.Transparency = 0.15; fiS.Parent = floatIcon

do
    local dragging, dragStart, startPos
    floatIcon.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1
            or input.UserInputType == Enum.UserInputType.Touch then
            dragging = true; dragStart = input.Position; startPos = floatIcon.Position
        end
    end)
    UIS.InputChanged:Connect(function(input)
        if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement
            or input.UserInputType == Enum.UserInputType.Touch) then
            local d = input.Position - dragStart
            floatIcon.Position = UDim2.new(
                startPos.X.Scale, startPos.X.Offset + d.X,
                startPos.Y.Scale, startPos.Y.Offset + d.Y)
        end
    end)
    UIS.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1
            or input.UserInputType == Enum.UserInputType.Touch then
            dragging = false
        end
    end)
end

local function setMinimized(v)
    if v then
        floatIcon.Position = UDim2.new(main.Position.X.Scale, main.Position.X.Offset,
                                       main.Position.Y.Scale, main.Position.Y.Offset)
    else
        main.Position = UDim2.new(floatIcon.Position.X.Scale, floatIcon.Position.X.Offset,
                                  floatIcon.Position.Y.Scale, floatIcon.Position.Y.Offset)
    end
    state.minimized = v
    main.Visible = not v
    floatIcon.Visible = v
end

minBtn.MouseButton1Click:Connect(function() setMinimized(true) end)
floatIcon.MouseButton1Click:Connect(function() setMinimized(false) end)

-- ═══════════════════════════════════════════════════════════
-- STATUS / REFRESH
-- ═══════════════════════════════════════════════════════════
local function refreshStatus()
    colorVal.Text  = COLOR_PRESETS[state.colorIndex].name
    scanVal.Text   = string.format("%d / %d", #state.props, CONFIG.MAX_PROPS)
    toggleVal.Text = state.enabled and "ON" or "OFF"
    showVal.Text   = state.showIdle and "ON" or "OFF"
    adjustVal.Text = state.adjusting and "ON" or "OFF"
    toggleVal.TextColor3 = state.enabled and THEME.redGlow or THEME.textDim
    showVal.TextColor3   = state.showIdle and THEME.redGlow or THEME.textDim
    adjustVal.TextColor3 = state.adjusting and THEME.redGlow or THEME.textDim
    if state.enabled then
        statusLine.Text = string.format("●  ONLINE  β€’  %d PROPS", #state.props)
        statusLine.TextColor3 = THEME.redGlow
    else
        statusLine.Text = "●  SYSTEM OFFLINE"
        statusLine.TextColor3 = THEME.textDim
    end
end

local function refreshProps()
    state.props = scanProps()
    table.clear(state.currentCFrames)
    if state.enabled then
        local root = getRoot()
        if root then
            for i, prop in ipairs(state.props) do
                local hidden = getHiddenCF(root)
                state.currentCFrames[i] = hidden
                task.spawn(invokeProp, prop, hidden)
                task.spawn(pushColor, prop, state.color)
            end
        end
    end
    refreshStatus()
end

local function setEnabled(v)
    state.enabled = v
    if v then
        if #state.props == 0 then refreshProps() end
        local root = getRoot()
        if root then
            for i, prop in ipairs(state.props) do
                local pos = state.showIdle and getIdleOrbit(i, #state.props, root) or getHiddenCF(root)
                state.currentCFrames[i] = pos
                task.spawn(invokeProp, prop, pos)
                task.spawn(pushColor, prop, state.color)
            end
        end
    else
        restoreColors()
    end
    refreshStatus()
end

-- ═══════════════════════════════════════════════════════════
-- WIRE PANEL BUTTONS
-- ═══════════════════════════════════════════════════════════
colorBtn.MouseButton1Click:Connect(function()
    state.colorIndex = (state.colorIndex % #COLOR_PRESETS) + 1
    state.colorPhase = 0
    refreshStatus()
end)

scanBtn.MouseButton1Click:Connect(function() refreshProps() end)
toggleBtn.MouseButton1Click:Connect(function() setEnabled(not state.enabled) end)

showBtn.MouseButton1Click:Connect(function()
    state.showIdle = not state.showIdle
    refreshStatus()
end)

adjustBtn.MouseButton1Click:Connect(function()
    state.adjusting = not state.adjusting
    adjustOverlay.Visible = state.adjusting
    adjustOutline.Visible = state.adjusting
    refreshStatus()
    for _, info in pairs(abilityButtons) do
        TweenService:Create(info.stroke, TweenInfo.new(0.2), {
            Color = state.adjusting and THEME.redBright or THEME.redDark,
            Transparency = state.adjusting and 0 or 0.15,
        }):Play()
    end
end)

-- ═══════════════════════════════════════════════════════════
-- MAIN LOOP
-- ═══════════════════════════════════════════════════════════
RunService.Heartbeat:Connect(function(dt)
    if not state.enabled then return end
    state.tickAccum += dt
    if state.tickAccum < CONFIG.TICK_RATE then return end
    local step = state.tickAccum
    state.tickAccum = 0

    local root = getRoot(); if not root then return end

    state.colorPhase += step * CONFIG.CYCLE_SPEED
    local pal = currentPalette()
    local n = #pal
    local c = state.colorPhase % n
    local i1 = math.floor(c) + 1
    local i2 = (i1 % n) + 1
    local frac = c - math.floor(c)
    state.color = pal[i1]:Lerp(pal[i2], frac)

    if not state.currentAbility then
        local N = #state.props
        for i, prop in ipairs(state.props) do
            if prop and prop.Parent then
                local pos = state.showIdle and getIdleOrbit(i, N, root) or getHiddenCF(root)
                state.currentCFrames[i] = pos
                task.spawn(invokeProp, prop, pos)
                task.spawn(pushColor, prop, state.color)
            end
        end
    else
        for _, prop in ipairs(state.props) do
            if prop and prop.Parent then task.spawn(pushColor, prop, state.color) end
        end
    end
end)

-- ═══════════════════════════════════════════════════════════
-- COOLDOWN UI
-- ═══════════════════════════════════════════════════════════
task.spawn(function()
    while true do
        task.wait(0.1)
        local now = os.clock()
        for name, def in pairs(ABILITY_DEFS) do
            local info = abilityButtons[name]
            if info then
                local remain = def.cooldown - (now - state.lastUsed[name])
                if remain > 0 and state.enabled then
                    info.cooldown.Visible = true
                    info.cooldownText.Text = string.format("%.1f", remain)
                else
                    info.cooldown.Visible = false
                end
            end
        end
    end
end)

-- ═══════════════════════════════════════════════════════════
-- BOOT
-- ═══════════════════════════════════════════════════════════
refreshProps()
refreshStatus()

LP.CharacterAdded:Connect(function()
    task.wait(1)
    if state.enabled then refreshProps() end
end)

_G.MRXENO = {
    State = state,
    Run   = runAbility,
    Scan  = refreshProps,
    Toggle = setEnabled,
    Config = CONFIG,
}

Features & Information

🩸 JOHN DOE β€” ABILITY PROP A prop-based John Doe system with custom animations, formations, and abilities. ✦ FEATURES Β«β€’ Dynamic prop scanning & detection β€’ Up to 30 props β€’ Custom prop colors β€’ Floating / orbiting idle props β€’ Smooth prop formations & animations β€’ Draggable & minimizable UI β€’ Movable ability bar β€’ Ability cooldown systemΒ» ⚑ ABILITIES LASER Props gather together and form a long-range laser formation. SWING Props form a massive blade and perform a smooth sweeping attack. GRAB Props create a hand formation that reaches toward a target before closing and retracting. BLEACH Props rise from below in 3 waves, creating a large area-based effect. βš™οΈ SETUP Make sure you use 10 blocks prop and 5 chair 🎨 COLOR PRESETS "CORRUPTED" Β· "BLOOD" Β· "PHOENIX" πŸ› οΈ UI "COLOR" Β· "SCAN PROP" Β· "TOGGLE PROP" Β· "SHOW ABILITY" Β· "ADJUST MOVE" Made by MR.XENO
#brookhaven#prop#troll

Community Comments (1)

devicedeviceOct 10, 2026

cool idea. works for me on solara

More Scripts for Brookhaven 🏑RP