--[[ ═══════════════════════════════════════════════════════════════ 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, }