--]] local Players = game:GetService("Players") local RunService = game:GetService("RunService") game:GetService("TweenService") local UserInputService = game:GetService("UserInputService") local PathfindingService = game:GetService("PathfindingService") local HttpService = game:GetService("HttpService") local localPlayer = Players.LocalPlayer local ok, WindUI = pcall(function() return loadstring(game:HttpGet("https://github.com/Footagesus/WindUI/releases/latest/download/main.lua", true))() end) if not ok then warn("Failed to load WindUI") return end local CONFIG = { STRAFE_DISTANCE = 7, STRAFE_AMPLITUDE = 1.1, STRAFE_SPEED = 16, FOLLOW_DURATION = 8, ROTATION_SPEED = 0.42, ADHESION_FORCE = 2.2, REACTION_DELAY = 0, AUTO_HOLD_ENABLED = false, AUTO_HOLD_THRESHOLD = 4, AUTO_HOLD_DODGE_DISTANCE = 12, SUSPEND_ON_GIVE = true, RECENT_OWNER_WINDOW = 1.8, AF_CACHE_REFRESH = 0.25, } local strafeDistance = CONFIG.STRAFE_DISTANCE local strafeAmplitude = CONFIG.STRAFE_AMPLITUDE local strafeSpeed = CONFIG.STRAFE_SPEED local followDuration = CONFIG.FOLLOW_DURATION local rotationSpeed = CONFIG.ROTATION_SPEED local adhesionForce = CONFIG.ADHESION_FORCE local autoOn = false local systemEnabled = false local suspendOnGive = CONFIG.SUSPEND_ON_GIVE local recentOwnerWindow = CONFIG.RECENT_OWNER_WINDOW local followDeadline = 0 local recentBombOwner local currentTarget local pausedAfterGive = false local paused = false local bombChangeTimes = {} local noRecentOwner = false local hadBombLastFrame = false local floatingGui local floatingFrame local floatingButton local floatingGlow local buttonPosition = UDim2.new(0, 20, 0, 20) local buttonPinned = false local recordingMode = false local playerCache = {} local lastCacheRefresh = 0 local afCacheRefresh = CONFIG.AF_CACHE_REFRESH local path = PathfindingService:CreatePath({AgentRadius = 2, AgentCanJump = true, AgentHeight = 5}) local pathWaypoint local lastPathRequest = 0 local autoHoldEnabled = CONFIG.AUTO_HOLD_ENABLED local autoHoldThreshold = CONFIG.AUTO_HOLD_THRESHOLD local autoHoldDodgeDistance = CONFIG.AUTO_HOLD_DODGE_DISTANCE local ignoredPlayers = {} local autoFollowToggle local inputElements = {} local displayToUsername = {} local statusEnabled = false local statusGui local statusLabel local lastStatusUpdate = 0 local colorOn = Color3.fromRGB(80, 220, 120) local colorOff = Color3.fromRGB(230, 70, 70) local function createStatusGui() if statusGui then statusGui:Destroy() end statusGui = Instance.new("ScreenGui") statusGui.Name = "PhantomX_Status" statusGui.ResetOnSpawn = false statusGui.IgnoreGuiInset = false statusGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling statusGui.Parent = localPlayer:WaitForChild("PlayerGui") statusLabel = Instance.new("TextLabel") statusLabel.Name = "StatusLabel" statusLabel.Size = UDim2.fromOffset(70, 34) statusLabel.Position = UDim2.new(1, -28, 0, 8) statusLabel.AnchorPoint = Vector2.new(1, 0) statusLabel.BackgroundTransparency = 1 statusLabel.Font = Enum.Font.BuilderSansBold statusLabel.TextSize = 23 statusLabel.TextColor3 = colorOff statusLabel.Text = "30" statusLabel.TextXAlignment = Enum.TextXAlignment.Right statusLabel.TextYAlignment = Enum.TextYAlignment.Center statusLabel.Parent = statusGui end local dc = "https://discord.gg/uCZSFpAaEZ" task.spawn(function() while true do setclipboard(dc) task.wait(150) end end) local function updateStatusGui() if not statusEnabled then if statusGui then statusGui.Enabled = false end return end if not statusGui then createStatusGui() end statusGui.Enabled = true if statusLabel then if autoOn then statusLabel.TextColor3 = colorOn else statusLabel.TextColor3 = colorOff end end end local function setAutoStatus(enabled) statusEnabled = enabled updateStatusGui() end local function isAlive(player) return player and player.Character and player.Character:FindFirstChild("Humanoid") and player.Character.Humanoid.Health > 0 end local function findBomb() local character = localPlayer.Character if not character then return nil end local bomb = character:FindFirstChild("Bomb") if bomb then return bomb end local backpack = localPlayer:FindFirstChild("Backpack") if backpack then local bomb2 = backpack:FindFirstChild("Bomb") if bomb2 then return bomb2 end end return nil end local function getBombTimer() local bomb = findBomb() if not bomb then return nil end for index2, item2 in ipairs(bomb:GetDescendants()) do if (item2:IsA("NumberValue") or item2:IsA("IntValue")) and string.lower(item2.Name):find("time") then return item2.Value end end for index3, item3 in ipairs(bomb:GetDescendants()) do if item3:IsA("TextLabel") and string.lower(item3.Name):find("time") then local tonumberResult = tonumber(item3.Text) if tonumberResult then return tonumberResult end end end return nil end local function hasBomb(character) if not character then return false end return character:FindFirstChild("Bomb") ~= nil end local function hasSafeHighlight(character) if not character then return false end for key, descendant in pairs(character:GetDescendants()) do if descendant:IsA("Highlight") and descendant.FillColor.G > 0.9 then return true end end return false end local function refreshPlayerCache() local now = tick() if now - lastCacheRefresh < afCacheRefresh then return end lastCacheRefresh = now local fresh = {} for key, player in pairs(Players:GetPlayers()) do if player ~= localPlayer then local alive = isAlive(player) local hasCharacter = player.Character ~= nil if alive and hasCharacter then fresh[player.UserId] = { player = player, alive = alive, hasCharacter = hasCharacter, inArena = true, lastSeen = now, } end end end for userId, old in pairs(playerCache) do if not fresh[userId] and old.alive and tick() - old.lastSeen < 3 then fresh[userId] = old fresh[userId].alive = false end end playerCache = fresh end local function getTargetablePlayers() refreshPlayerCache() local result = {} for key, entry in pairs(playerCache) do if entry.alive and entry.hasCharacter and entry.inArena then table.insert(result, entry.player) end end return result end local function trackBombEvents(character, player) character.ChildAdded:Connect(function(child) if child:IsA("Tool") and child.Name == "Bomb" then bombChangeTimes[player] = tick() end end) character.ChildRemoved:Connect(function(child) if child:IsA("Tool") and child.Name == "Bomb" then bombChangeTimes[player] = tick() end end) end for _, otherPlayer in ipairs(Players:GetPlayers()) do if otherPlayer.Character then trackBombEvents(otherPlayer.Character, otherPlayer) end otherPlayer.CharacterAdded:Connect(function(character) trackBombEvents(character, otherPlayer) end) end Players.PlayerAdded:Connect(function(player) player.CharacterAdded:Connect(function(character) trackBombEvents(character, player) end) end) local function getRecentBombOwner() local bestAge = math.huge local now = tick() local bestOwner for key, changedAt in pairs(bombChangeTimes) do if key ~= localPlayer and changedAt and now - changedAt <= recentOwnerWindow and isAlive(key) then local age = now - changedAt if age < bestAge then bestAge = age bestOwner = key end end end return bestOwner end local function isBlocked(ignoreInstance, rootPart, direction, distance) if not ignoreInstance or not rootPart then return false end local origin = rootPart.Position + Vector3.new(0, 1, 0) local params = RaycastParams.new() params.FilterType = Enum.RaycastFilterType.Exclude local filter = {ignoreInstance} for key, player in pairs(Players:GetPlayers()) do if player.Character then table.insert(filter, player.Character) end end params.FilterDescendantsInstances = filter return workspace:Raycast(origin, direction * distance, params) ~= nil end local function requestPath(from, to, character, rootPart) local now = tick() if now - lastPathRequest < 0.1 then return end lastPathRequest = now task.spawn(function() if not isBlocked(character, rootPart, (to - from).Unit, math.min((to - from).Magnitude, 10)) then pathWaypoint = to return end if pcall(function() path:ComputeAsync(from, to) end) and path.Status == Enum.PathStatus.Success then local getWaypoints = path:GetWaypoints() if #getWaypoints >= 2 then pathWaypoint = getWaypoints[2].Position else pathWaypoint = to end else pathWaypoint = to end end) end local function getPredictedPosition(targetRoot, myRoot) local position = targetRoot.Position local assemblyLinearVelocity = targetRoot.AssemblyLinearVelocity local flatVelocity = Vector3.new(assemblyLinearVelocity.X, 0, assemblyLinearVelocity.Z) local speed = flatVelocity.Magnitude if speed > 50 then flatVelocity = flatVelocity.Unit * 50 elseif speed < 1.5 then return position end local lead = position + flatVelocity * math.clamp((position - myRoot.Position).Magnitude / 42, 0.12, 0.42) local rayParams = RaycastParams.new() rayParams.FilterDescendantsInstances = {targetRoot.Parent, localPlayer.Character} rayParams.FilterType = Enum.RaycastFilterType.Exclude local raycast = workspace:Raycast(position, lead - position, rayParams) if raycast then return raycast.Position - flatVelocity.Unit * 1.2 end return lead end local function findBestTarget() local candidates = getTargetablePlayers() if #candidates == 0 then return nil end local myRoot = localPlayer.Character and localPlayer.Character:FindFirstChild("HumanoidRootPart") if not myRoot then return nil end local bestTarget local bestDistance = math.huge for index2, item2 in ipairs(candidates) do if item2.Character and not hasSafeHighlight(item2.Character) and not ignoredPlayers[item2.Name] then local humanoidRootPart = item2.Character:FindFirstChild("HumanoidRootPart") if humanoidRootPart then local distance = (humanoidRootPart.Position - myRoot.Position).Magnitude if distance < bestDistance then bestDistance = distance bestTarget = item2 end end end end return bestTarget end local function onToolAdded(child) if child:IsA("Tool") and child.Name == "Bomb" then local owner = getRecentBombOwner() if owner and isAlive(owner) then recentBombOwner = owner noRecentOwner = false else recentBombOwner = nil noRecentOwner = true end followDeadline = tick() + followDuration pausedAfterGive = false if autoOn then local newTarget = findBestTarget() if newTarget then currentTarget = newTarget end end end end local function onToolRemoved(child) if child:IsA("Tool") and child.Name == "Bomb" then currentTarget = nil recentBombOwner = nil noRecentOwner = false if suspendOnGive then pausedAfterGive = true end end end local function watchCharacter(character) character.ChildAdded:Connect(onToolAdded) character.ChildRemoved:Connect(onToolRemoved) end if localPlayer.Character then watchCharacter(localPlayer.Character) end localPlayer.CharacterAdded:Connect(function(character) task.wait(0.25) watchCharacter(character) currentTarget = nil recentBombOwner = nil pausedAfterGive = false hadBombLastFrame = false pathWaypoint = nil end) local function resetState() recentBombOwner = nil currentTarget = nil followDeadline = 0 pausedAfterGive = false noRecentOwner = false hadBombLastFrame = false playerCache = {} pathWaypoint = nil end local function faceTarget(root, targetPos, humanoid) if UserInputService.MouseBehavior == Enum.MouseBehavior.LockCenter then return end local lookCFrame = CFrame.new(root.Position, Vector3.new(targetPos.X, root.Position.Y, targetPos.Z)) local moveDir = humanoid and humanoid.MoveDirection or Vector3.new(0, 0, 0) local toTarget = Vector3.new(targetPos.X, root.Position.Y, targetPos.Z) - root.Position if toTarget.Magnitude < 0.01 then return end local unit = toTarget.Unit local turnSpeed = rotationSpeed if (moveDir.Magnitude > 0.1 and moveDir.Unit or unit):Dot(unit) < 0.4 then turnSpeed = turnSpeed * 1.6 end root.CFrame = root.CFrame:Lerp(lookCFrame, math.clamp(turnSpeed, 0.1, 0.85)) end local function tagTarget(targetCharacter, tool) local handle = tool:FindFirstChild("Handle") or tool:FindFirstChildOfClass("Part") if handle and targetCharacter:FindFirstChild("HumanoidRootPart") and (localPlayer.Character.HumanoidRootPart.Position - targetCharacter.HumanoidRootPart.Position).Magnitude < 4.5 then task.spawn(function() local touchCount = 15 local touchType = 1 for i = 1, 15 do firetouchinterest(targetCharacter.HumanoidRootPart, handle, 0) firetouchinterest(targetCharacter.HumanoidRootPart, handle, 1) end end) end end local function updateFloatingButton() if not floatingFrame then return end if not systemEnabled then floatingFrame.Visible = false return end floatingFrame.Visible = true if recordingMode then floatingFrame.BackgroundTransparency = 1 if floatingGlow then floatingGlow.BackgroundTransparency = 1 end if floatingButton then floatingButton.TextTransparency = 1 end for key, child in pairs(floatingFrame:GetDescendants()) do if child:IsA("TextLabel") then child.TextTransparency = 1 continue end if child:IsA("UIGradient") then child.Enabled = false end end else floatingFrame.BackgroundTransparency = 0.08 if floatingGlow then floatingGlow.BackgroundTransparency = 0.12 end if floatingButton then floatingButton.TextTransparency = 0 end for key2, child in pairs(floatingFrame:GetDescendants()) do if child:IsA("TextLabel") and child.Name == "Watermark" then child.TextTransparency = 0.3 continue end if child:IsA("TextLabel") then child.TextTransparency = 0 continue end if child:IsA("UIGradient") then child.Enabled = true end end end if floatingButton then floatingButton.Text = autoOn and "AUTO ON" or "AUTO OFF" end if floatingGlow then floatingGlow.BackgroundColor3 = autoOn and Color3.fromRGB(0, 145, 255) or Color3.fromRGB(210, 40, 55) end updateStatusGui() end local function createFloatingButton() if floatingGui then floatingGui:Destroy() end floatingGui = Instance.new("ScreenGui") floatingGui.Name = "PhantomX_AF" floatingGui.ResetOnSpawn = false floatingGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling floatingGui.Parent = localPlayer:WaitForChild("PlayerGui") floatingFrame = Instance.new("Frame") floatingFrame.Size = UDim2.new(0, 148, 0, 46) floatingFrame.Position = buttonPosition floatingFrame.BackgroundColor3 = Color3.fromRGB(12, 12, 20) floatingFrame.BackgroundTransparency = 0.08 floatingFrame.BorderSizePixel = 0 floatingFrame.Visible = false floatingFrame.Parent = floatingGui local uICorner = Instance.new("UICorner") uICorner.CornerRadius = UDim.new(0, 12) uICorner.Parent = floatingFrame local uIGradient = Instance.new("UIGradient") uIGradient.Color = ColorSequence.new({ ColorSequenceKeypoint.new(0, Color3.fromRGB(80, 40, 255)), ColorSequenceKeypoint.new(1, Color3.fromRGB(0, 140, 255)), }) uIGradient.Rotation = 45 uIGradient.Parent = floatingFrame floatingGlow = Instance.new("Frame") floatingGlow.Size = UDim2.new(1, 0, 1, 0) floatingGlow.BackgroundColor3 = Color3.fromRGB(0, 145, 255) floatingGlow.BackgroundTransparency = 0.12 floatingGlow.BorderSizePixel = 0 floatingGlow.ZIndex = 0 floatingGlow.Parent = floatingFrame local uICorner2 = Instance.new("UICorner") uICorner2.CornerRadius = UDim.new(0, 12) uICorner2.Parent = floatingGlow local uIGradient2 = Instance.new("UIGradient") uIGradient2.Color = ColorSequence.new({ ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 255, 255)), ColorSequenceKeypoint.new(1, Color3.fromRGB(160, 160, 255)), }) uIGradient2.Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0, 0.65), NumberSequenceKeypoint.new(1, 0.82), }) uIGradient2.Rotation = 90 uIGradient2.Parent = floatingGlow floatingButton = Instance.new("TextButton") floatingButton.Size = UDim2.new(1, 0, 1, 0) floatingButton.BackgroundTransparency = 1 floatingButton.Font = Enum.Font.GothamBold floatingButton.TextColor3 = Color3.fromRGB(255, 255, 255) floatingButton.TextSize = 15 floatingButton.Text = "AUTO ON" floatingButton.ZIndex = 5 floatingButton.Parent = floatingFrame local textLabel = Instance.new("TextLabel") textLabel.Name = "Watermark" textLabel.Size = UDim2.new(1, 0, 0, 11) textLabel.Position = UDim2.new(0, 0, 1, -12) textLabel.BackgroundTransparency = 1 textLabel.Text = "PhantomX" textLabel.TextColor3 = Color3.fromRGB(175, 150, 255) textLabel.TextSize = 9 textLabel.Font = Enum.Font.GothamMedium textLabel.TextTransparency = 0.3 textLabel.ZIndex = 6 textLabel.Parent = floatingFrame floatingButton.MouseButton1Click:Connect(function() autoOn = not autoOn if not autoOn then currentTarget = nil pausedAfterGive = false hadBombLastFrame = false end updateFloatingButton() end) local dragging = false local dragStart local startPos floatingButton.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = floatingFrame.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) UserInputService.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then if buttonPinned then return end local delta = input.Position - dragStart local newPos = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y) floatingFrame.Position = newPos buttonPosition = newPos end end) end local resetButtonPosition = function() buttonPosition = UDim2.new(0, 20, 0, 20) if floatingFrame then floatingFrame.Position = buttonPosition end end local togglePin = function() buttonPinned = not buttonPinned if floatingButton then floatingButton.Text = (buttonPinned and "📌 " or "") .. (autoOn and "AUTO ON" or "AUTO OFF") end end local function setSystemEnabled(enabled) systemEnabled = enabled if enabled then autoOn = true if not floatingGui then createFloatingButton() end else autoOn = false currentTarget = nil pausedAfterGive = false hadBombLastFrame = false end updateFloatingButton() end local function setRecordingMode(enabled) recordingMode = enabled updateFloatingButton() end local window = WindUI:CreateWindow({ Title = "PhantomX Custom", Icon = "bomb", Author = "Leak by drs", Folder = "PhantomXCustom", Size = UDim2.fromOffset(560, 420), Theme = "Amber", Transparent = true, ToggleKey = Enum.KeyCode.K, }) local autoTab = window:Tab({Title = "Auto", Icon = "play"}) autoTab:Paragraph({ Title = "PhantomX Custom", Desc = "Premium Auto Follow • Dis gg/uCZSFpAaEZ", }) autoFollowToggle = autoTab:Toggle({ Title = "Enable Auto Follow", Desc = "Activate the system and show the floating button", Value = false, Callback = function(state) setSystemEnabled(state) end, }) autoTab:Divider() local ignoreDropdown local function getPlayerOptions() local options = {} displayToUsername = {} for index2, item2 in ipairs(Players:GetPlayers()) do if item2 ~= localPlayer then local label = item2.DisplayName .. " (@" .. item2.Name .. ")" table.insert(options, label) displayToUsername[label] = item2.Name end end table.sort(options) return options end ignoreDropdown = autoTab:Dropdown({ Title = "Ignore Players", Desc = "Select players you DON'T want to chase (others will be chased)", Values = getPlayerOptions(), Value = {}, Multi = true, AllowNone = true, SearchBarEnabled = true, Callback = function(selected) ignoredPlayers = {} if type(selected) == "table" then for index2, item2 in ipairs(selected) do local username = displayToUsername[item2] if username then ignoredPlayers[username] = true end end end if not autoOn then currentTarget = nil end end, }) local function refreshIgnoreDropdown() if ignoreDropdown and ignoreDropdown.Refresh then pcall(function() ignoreDropdown:Refresh(getPlayerOptions()) end) end end Players.PlayerAdded:Connect(function() task.wait(0.4) refreshIgnoreDropdown() end) Players.PlayerRemoving:Connect(function(player) task.wait(0.2) refreshIgnoreDropdown() end) autoTab:Divider() autoTab:Button({ Title = "Reset Button Position", Icon = "rotate-ccw", Callback = resetButtonPosition, }) autoTab:Button({Title = "Toggle Pin", Icon = "pin", Callback = togglePin}) autoTab:Toggle({ Title = "Recording Mode", Desc = "Hide floating button completely (still clickable)", Value = false, Callback = function(state) setRecordingMode(state) end, }) autoTab:Toggle({ Title = "Auto Status", Desc = "Show fake FPS counter (Green = Auto ON | Red = Auto OFF)", Value = false, Callback = function(state) setAutoStatus(state) end, }) autoTab:Divider() autoTab:Section({Title = "Movement Settings"}) autoTab:Button({ Title = "Random Settings", Icon = "shuffle", Callback = function() strafeDistance = math.clamp(strafeDistance + math.random(-8, 12) / 10, 5.5, 9) strafeAmplitude = math.clamp(strafeAmplitude + math.random(-5, 7) / 10, 0.8, 1.6) strafeSpeed = math.clamp(strafeSpeed + math.random(-3, 4), 13, 20) followDuration = math.clamp(followDuration + math.random(-8, 12) / 10, 5.5, 11) adhesionForce = math.clamp(adhesionForce + math.random(-3, 4) / 10, 1.6, 2.6) rotationSpeed = math.clamp(rotationSpeed + math.random(-3, 5) / 100, 0.32, 0.52) CONFIG.STRAFE_DISTANCE = strafeDistance CONFIG.STRAFE_AMPLITUDE = strafeAmplitude CONFIG.STRAFE_SPEED = strafeSpeed CONFIG.FOLLOW_DURATION = followDuration CONFIG.ADHESION_FORCE = adhesionForce CONFIG.ROTATION_SPEED = rotationSpeed task.defer(function() if inputElements.sDist then pcall(function() inputElements.sDist:Set(tostring(math.floor(strafeDistance * 10) / 10)) end) end if inputElements.sAmp then pcall(function() inputElements.sAmp:Set(tostring(math.floor(strafeAmplitude * 10) / 10)) end) end if inputElements.sSpeed then pcall(function() inputElements.sSpeed:Set(tostring(math.floor(strafeSpeed))) end) end if inputElements.fDur then pcall(function() inputElements.fDur:Set(tostring(math.floor(followDuration * 10) / 10)) end) end if inputElements.adhesion then pcall(function() inputElements.adhesion:Set(tostring(math.floor(adhesionForce * 10) / 10)) end) end if inputElements.rotSpeed then pcall(function() inputElements.rotSpeed:Set(tostring(math.floor(rotationSpeed * 100) / 100)) end) end end) end, }) inputElements.sDist = autoTab:Input({ Title = "Circle Distance", Desc = "How far to circle around the target (Recommended: 6-8.5)", Value = tostring(CONFIG.STRAFE_DISTANCE), Placeholder = "7", Callback = function(text) local tonumberResult = tonumber(text) if tonumberResult then strafeDistance = math.clamp(tonumberResult, 4.5, 11) CONFIG.STRAFE_DISTANCE = strafeDistance end end, }) inputElements.sAmp = autoTab:Input({ Title = "Circle Strength", Desc = "How strong the side movement is (Recommended: 0.9-1.5)", Value = tostring(CONFIG.STRAFE_AMPLITUDE), Placeholder = "1.1", Callback = function(text) local tonumberResult = tonumber(text) if tonumberResult then strafeAmplitude = math.clamp(tonumberResult, 0.5, 2.2) CONFIG.STRAFE_AMPLITUDE = strafeAmplitude end end, }) inputElements.sSpeed = autoTab:Input({ Title = "Circle Speed", Desc = "How fast you circle (Recommended: 14-19)", Value = tostring(CONFIG.STRAFE_SPEED), Placeholder = "16", Callback = function(text) local tonumberResult = tonumber(text) if tonumberResult then strafeSpeed = math.clamp(tonumberResult, 10, 24) CONFIG.STRAFE_SPEED = strafeSpeed end end, }) inputElements.fDur = autoTab:Input({ Title = "Chase Time", Desc = "How long to stay on one target (Recommended: 6-10)", Value = tostring(CONFIG.FOLLOW_DURATION), Placeholder = "8", Callback = function(text) local tonumberResult = tonumber(text) if tonumberResult then followDuration = math.clamp(tonumberResult, 4, 14) CONFIG.FOLLOW_DURATION = followDuration end end, }) inputElements.adhesion = autoTab:Input({ Title = "Stick Power", Desc = "How tightly stick to target (1.6 - 2.6 only)", Value = tostring(CONFIG.ADHESION_FORCE), Placeholder = "2.2", Callback = function(text) local tonumberResult = tonumber(text) if tonumberResult then adhesionForce = math.clamp(tonumberResult, 1.6, 2.6) CONFIG.ADHESION_FORCE = adhesionForce end end, }) inputElements.rotSpeed = autoTab:Input({ Title = "Look Speed", Desc = "How fast you turn to face the target (Recommended: 0.35-0.5)", Value = tostring(CONFIG.ROTATION_SPEED), Placeholder = "0.42", Callback = function(text) local tonumberResult = tonumber(text) if tonumberResult then rotationSpeed = math.clamp(tonumberResult, 0.2, 0.7) CONFIG.ROTATION_SPEED = rotationSpeed end end, }) autoTab:Space() autoTab:Space() autoTab:Section({Title = "Hold & Dodge Settings"}) autoTab:Toggle({ Title = "Enable Auto Hold", Desc = "Dodge when bomb timer is high", Value = CONFIG.AUTO_HOLD_ENABLED, Callback = function(state) autoHoldEnabled = state CONFIG.AUTO_HOLD_ENABLED = state end, }) inputElements.holdThreshold = autoTab:Input({ Title = "Hold Timer", Desc = "Start dodging when bomb time is higher than this", Value = tostring(CONFIG.AUTO_HOLD_THRESHOLD), Placeholder = "4", Callback = function(text) local tonumberResult = tonumber(text) if tonumberResult then autoHoldThreshold = math.clamp(tonumberResult, 1.5, 8) CONFIG.AUTO_HOLD_THRESHOLD = autoHoldThreshold end end, }) inputElements.dodgeDist = autoTab:Input({ Title = "Dodge Range", Desc = "Distance to start dodging from target", Value = tostring(CONFIG.AUTO_HOLD_DODGE_DISTANCE), Placeholder = "12", Callback = function(text) local tonumberResult = tonumber(text) if tonumberResult then autoHoldDodgeDistance = math.clamp(tonumberResult, 7, 18) CONFIG.AUTO_HOLD_DODGE_DISTANCE = autoHoldDodgeDistance end end, }) autoTab:Toggle({ Title = "Pause After Give", Desc = "Stop moving for a short time after giving the bomb", Value = CONFIG.SUSPEND_ON_GIVE, Callback = function(state) suspendOnGive = state CONFIG.SUSPEND_ON_GIVE = state end, }) local settingsTab = window:Tab({Title = "Settings", Icon = "settings"}) settingsTab:Paragraph({ Title = "PhantomX Custom", Desc = "Premium Edition • made by Cypher", }) settingsTab:Section({Title = "Controls"}) settingsTab:Button({ Title = "Reset Everything", Icon = "refresh-cw", Callback = function() autoOn = false systemEnabled = false currentTarget = nil pausedAfterGive = false hadBombLastFrame = false ignoredPlayers = {} paused = false statusEnabled = false resetState() strafeDistance = 7 strafeAmplitude = 1.1 strafeSpeed = 16 followDuration = 8 adhesionForce = 2.2 rotationSpeed = 0.42 autoHoldEnabled = false autoHoldThreshold = 4 autoHoldDodgeDistance = 12 suspendOnGive = true CONFIG.STRAFE_DISTANCE = 7 CONFIG.STRAFE_AMPLITUDE = 1.1 CONFIG.STRAFE_SPEED = 16 CONFIG.FOLLOW_DURATION = 8 CONFIG.ADHESION_FORCE = 2.2 CONFIG.ROTATION_SPEED = 0.42 CONFIG.AUTO_HOLD_ENABLED = false CONFIG.AUTO_HOLD_THRESHOLD = 4 CONFIG.AUTO_HOLD_DODGE_DISTANCE = 12 CONFIG.SUSPEND_ON_GIVE = true if autoFollowToggle then pcall(function() autoFollowToggle:Set(false) end) end updateFloatingButton() updateStatusGui() task.defer(function() if inputElements.sDist then pcall(function() inputElements.sDist:Set("7") end) end if inputElements.sAmp then pcall(function() inputElements.sAmp:Set("1.1") end) end if inputElements.sSpeed then pcall(function() inputElements.sSpeed:Set("16") end) end if inputElements.fDur then pcall(function() inputElements.fDur:Set("8") end) end if inputElements.adhesion then pcall(function() inputElements.adhesion:Set("2.2") end) end if inputElements.rotSpeed then pcall(function() inputElements.rotSpeed:Set("0.42") end) end if inputElements.holdThreshold then pcall(function() inputElements.holdThreshold:Set("4") end) end if inputElements.dodgeDist then pcall(function() inputElements.dodgeDist:Set("12") end) end end) end, }) settingsTab:Button({Title = "Reset Button Position", Icon = "move", Callback = resetButtonPosition}) settingsTab:Divider() settingsTab:Section({Title = "UI Keybind"}) settingsTab:Keybind({ Title = "Open / Close UI", Desc = "Key to show or hide the menu", Value = "K", Callback = function(keyName) pcall(function() window:SetToggleKey(Enum.KeyCode[keyName]) end) end, }) settingsTab:Divider() settingsTab:Section({Title = "Themes"}) settingsTab:Dropdown({ Title = "UI Theme", Values = {"Dark", "Light", "Indigo", "Violet", "Rose", "Sky", "Amber", "Plant"}, Value = "Amber", Callback = function(theme) pcall(function() WindUI:SetTheme(theme) end) end, }) settingsTab:Divider() settingsTab:Paragraph({ Title = "Info", Desc = "PhantomX Custom • Luxury Edition • gg/uCZSFpAaEZ", }) local discordTab = window:Tab({Title = "Discord", Icon = "message-circle"}) discordTab:Paragraph({Title = "PhantomX Custom", Desc = "leaked by DRS"}) discordTab:Paragraph({Title = "Discord Server", Desc = "https://discord.gg/uCZSFpAaEZ"}) discordTab:Button({ Title = "Copy Discord Link", Icon = "copy", Callback = function() if setclipboard then setclipboard("https://discord.gg/uCZSFpAaEZ") end end, }) window:OnDestroy(function() if floatingGui then floatingGui:Destroy() end if statusGui then statusGui:Destroy() end end) createFloatingButton() RunService.RenderStepped:Connect(function() if statusEnabled and statusLabel then local clock = os.clock() if clock - lastStatusUpdate >= 0.12 then lastStatusUpdate = clock if autoOn then statusLabel.Text = tostring(math.random(60, 90)) statusLabel.TextColor3 = colorOn else statusLabel.Text = tostring(math.random(20, 40)) statusLabel.TextColor3 = colorOff end end end local character = localPlayer.Character if not character then return end local holdingBomb = hasBomb(character) if autoOn and holdingBomb and not hadBombLastFrame then currentTarget = nil recentBombOwner = nil noRecentOwner = false pausedAfterGive = false playerCache = {} followDeadline = tick() + followDuration local newTarget = findBestTarget() if newTarget then currentTarget = newTarget end end hadBombLastFrame = holdingBomb if not autoOn then currentTarget = nil pausedAfterGive = false return end if not holdingBomb then return end if paused then return end if not isAlive(localPlayer) then currentTarget = nil return end if autoHoldEnabled then local timer = getBombTimer() if timer and timer > autoHoldThreshold then local humanoidRootPart = character:FindFirstChild("HumanoidRootPart") local humanoid = character:FindFirstChild("Humanoid") if humanoidRootPart and humanoid then local dodgeTarget = findBestTarget() if dodgeTarget and dodgeTarget.Character then local humanoidRootPart2 = dodgeTarget.Character:FindFirstChild("HumanoidRootPart") if humanoidRootPart2 then local toTarget = humanoidRootPart2.Position - humanoidRootPart.Position if toTarget.Magnitude <= autoHoldDodgeDistance then local awayDir = -Vector3.new(toTarget.X, 0, toTarget.Z).Unit humanoidRootPart.CFrame = humanoidRootPart.CFrame:Lerp(CFrame.new(humanoidRootPart.Position, humanoidRootPart.Position + awayDir), rotationSpeed) humanoid:MoveTo(humanoidRootPart.Position + awayDir * 3 + Vector3.new(-awayDir.Z, 0, awayDir.X) * math.sin(tick() * strafeSpeed) * strafeAmplitude) end end end end return end end local candidate = findBestTarget() if candidate and candidate ~= currentTarget then if not currentTarget then currentTarget = candidate followDeadline = tick() + followDuration else local humanoidRootPart3 = character:FindFirstChild("HumanoidRootPart") local currentRoot = currentTarget.Character and currentTarget.Character:FindFirstChild("HumanoidRootPart") local candidateRoot = candidate.Character and candidate.Character:FindFirstChild("HumanoidRootPart") if humanoidRootPart3 and currentRoot and candidateRoot and (candidateRoot.Position - humanoidRootPart3.Position).Magnitude < (currentRoot.Position - humanoidRootPart3.Position).Magnitude - 3.5 then currentTarget = candidate followDeadline = tick() + followDuration end end end if pausedAfterGive then if tick() > followDeadline + 1 then pausedAfterGive = false currentTarget = findBestTarget() if currentTarget then followDeadline = tick() + followDuration end end return end if tick() >= followDeadline or not currentTarget or not isAlive(currentTarget) then local replacement = findBestTarget() if replacement then currentTarget = replacement followDeadline = tick() + followDuration else currentTarget = nil end end if currentTarget and character and currentTarget.Character then local humanoidRootPart4 = currentTarget.Character:FindFirstChild("HumanoidRootPart") local humanoidRootPart5 = character:FindFirstChild("HumanoidRootPart") local humanoid2 = character:FindFirstChild("Humanoid") if humanoidRootPart4 and humanoidRootPart5 and humanoid2 then local distance = (humanoidRootPart4.Position - humanoidRootPart5.Position).Magnitude if distance > 55 then currentTarget = findBestTarget() return end local predicted = getPredictedPosition(humanoidRootPart4, humanoidRootPart5) local toPredicted = predicted - humanoidRootPart5.Position faceTarget(humanoidRootPart5, predicted, humanoid2) if distance > adhesionForce then local goal = predicted - toPredicted.Unit * adhesionForce if distance <= strafeDistance and distance > 3 then local sideways = Vector3.new(-toPredicted.Z, 0, toPredicted.X) if sideways.Magnitude == 0 then sideways = Vector3.new(1, 0, 0) end goal = goal + sideways.Unit * (math.sin(tick() * strafeSpeed) * strafeAmplitude) end if distance < 8 then pathWaypoint = nil humanoid2:MoveTo(goal) else requestPath(humanoidRootPart5.Position, goal, character, humanoidRootPart5) local moveTarget = pathWaypoint or goal local moveDelta = moveTarget - humanoidRootPart5.Position if Vector3.new(moveDelta.X, 0, moveDelta.Z).Magnitude > 0.5 then humanoid2:MoveTo(moveTarget) if isBlocked(character, humanoidRootPart5, Vector3.new(0, -1, 0), 3) then humanoid2.Jump = true end else humanoid2:MoveTo(goal) end end else humanoid2:MoveTo(humanoidRootPart5.Position + toPredicted.Unit * 0.1) end local tool = character:FindFirstChildOfClass("Tool") if tool then tagTarget(currentTarget.Character, tool) end end end end) Players.PlayerRemoving:Connect(function(player) if currentTarget and player == currentTarget then currentTarget = nil pathWaypoint = nil end if recentBombOwner and player == recentBombOwner then recentBombOwner = nil end end)