--[[ ╔═══════════════════════════════════════════════════════════╗ ║ PHANTOM HUB | Football Fusion 3 ║ ║ Version 3.0.0 | All Executors ║ ║ PC · Mobile · Tablet · iOS · Mac ║ ╚═══════════════════════════════════════════════════════════╝ ]] local VERSION = "3.0.0" local RAW_URL = "https://raw.githubusercontent.com/roscriptdevv/PhantomHub-FF3/refs/heads/main/PhantomHub.lua" local VER_URL = "https://raw.githubusercontent.com/roscriptdevv/PhantomHub/refs/heads/main/version.txt" local KEY_API_URL = "https://api.phantomhub.gg/validate" local HARDCODED_KEYS = {} local TIER = "NONE" local SpyerWindow local Connections = {} local DrawingObjects = {} local function track(c) Connections[#Connections+1]=c; return c end local function trackDraw(d) DrawingObjects[#DrawingObjects+1]=d; return d end local function disconnectAll() for _,c in ipairs(Connections) do pcall(function()c:Disconnect()end) end for _,d in ipairs(DrawingObjects) do pcall(function()d:Remove()end) end Connections = {} DrawingObjects = {} end disconnectAll() local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local CoreGui = game:GetService("CoreGui") local Lighting = game:GetService("Lighting") local TeleportService = game:GetService("TeleportService") local StarterGui = game:GetService("StarterGui") local LP = Players.LocalPlayer local Cam = workspace.CurrentCamera local function getHttp(url) if type(syn)=="table" and type(syn.request)=="function" then local ok,r=pcall(syn.request,{Url=url,Method="GET"}) if ok and r and type(r.Body)=="string" then return r.Body end end if type(http_request)=="function" then local ok,r=pcall(http_request,{Url=url,Method="GET"}) if ok and r and type(r.Body)=="string" then return r.Body end end if type(request)=="function" then local ok,r=pcall(request,{Url=url,Method="GET"}) if ok and r and type(r.Body)=="string" then return r.Body end end if type(game.HttpGet)=="function" then local ok,r=pcall(function()return game:HttpGet(url)end) if ok and type(r)=="string" and #r>0 then return r end end return nil end local function postHttp(url,body) if type(syn)=="table" and type(syn.request)=="function" then local ok,r=pcall(syn.request,{Url=url,Method="POST",Headers={["Content-Type"]="application/json"},Body=body}) if ok and r then return r.Body end end if type(http_request)=="function" then local ok,r=pcall(http_request,{Url=url,Method="POST",Headers={["Content-Type"]="application/json"},Body=body}) if ok and r then return r.Body end end if type(request)=="function" then local ok,r=pcall(request,{Url=url,Method="POST",Headers={["Content-Type"]="application/json"},Body=body}) if ok and r then return r.Body end end return nil end local function writeFile(path,data) if type(writefile)=="function" then pcall(writefile,path,data) end end local function readFile(path) if type(readfile)=="function" then local ok,d=pcall(readfile,path) return ok and d or nil end return nil end local function makeFolder(path) if type(isfolder)=="function" and type(makefolder)=="function" then if not isfolder(path) then pcall(makefolder,path) end end end local function setClipboard(text) if type(setclipboard)=="function" then pcall(setclipboard,text) elseif type(toclipboard)=="function" then pcall(toclipboard,text) end end local function newCClosure(fn) if type(newcclosure)=="function" then local ok,c=pcall(newcclosure,fn) if ok then return c end end return fn end local guiParent local function getProtectedParent() if type(gethui)=="function" then local ok,h=pcall(gethui) if ok and h then return h end end local ok,cg=pcall(function()return game:GetService("CoreGui")end) if ok and cg then return cg end return LP:WaitForChild("PlayerGui") end guiParent = getProtectedParent() local function protectGui(gui) if type(syn)=="table" and type(syn.protect_gui)=="function" then pcall(syn.protect_gui,gui) end if type(protect_gui)=="function" then pcall(protect_gui,gui) end end pcall(function() for _,name in ipairs({"PhantomHub","PhantomHubKey"}) do local g=CoreGui:FindFirstChild(name) or LP.PlayerGui:FindFirstChild(name) if g then g:Destroy() end end end) local THEMES = { Dark = { BG=Color3.fromRGB(13,13,13), Surface=Color3.fromRGB(20,20,20), Card=Color3.fromRGB(26,26,26), SidebarBG=Color3.fromRGB(16,16,16), ActiveTab=Color3.fromRGB(22,22,22), Accent=Color3.fromRGB(204,18,18), AccentHov=Color3.fromRGB(230,30,30), TextMain=Color3.fromRGB(255,255,255), TextSub=Color3.fromRGB(170,170,170), TextMuted=Color3.fromRGB(110,110,110), Border=Color3.fromRGB(40,40,40), ToggleOff=Color3.fromRGB(55,55,55), ToggleOn=Color3.fromRGB(204,18,18), SliderFill=Color3.fromRGB(204,18,18), SliderBG=Color3.fromRGB(40,40,40), BtnBG=Color3.fromRGB(30,30,30), BtnBord=Color3.fromRGB(50,50,50), KeyFree=Color3.fromRGB(30,180,60), KeyPaid=Color3.fromRGB(204,18,18), SpyFire=Color3.fromRGB(255,80,80), SpyInvoke=Color3.fromRGB(255,220,80), SpyBG=Color3.fromRGB(10,10,10), }, Blood = { BG=Color3.fromRGB(10,0,0), Surface=Color3.fromRGB(18,4,4), Card=Color3.fromRGB(25,6,6), SidebarBG=Color3.fromRGB(14,2,2), ActiveTab=Color3.fromRGB(30,8,8), Accent=Color3.fromRGB(220,0,0), AccentHov=Color3.fromRGB(255,30,30), TextMain=Color3.fromRGB(255,230,230), TextSub=Color3.fromRGB(200,140,140), TextMuted=Color3.fromRGB(140,80,80), Border=Color3.fromRGB(60,20,20), ToggleOff=Color3.fromRGB(70,20,20), ToggleOn=Color3.fromRGB(220,0,0), SliderFill=Color3.fromRGB(220,0,0), SliderBG=Color3.fromRGB(60,20,20), BtnBG=Color3.fromRGB(30,8,8), BtnBord=Color3.fromRGB(60,20,20), KeyFree=Color3.fromRGB(30,180,60), KeyPaid=Color3.fromRGB(220,0,0), SpyFire=Color3.fromRGB(255,60,60), SpyInvoke=Color3.fromRGB(255,200,60), SpyBG=Color3.fromRGB(8,2,2), }, Midnight = { BG=Color3.fromRGB(8,8,21), Surface=Color3.fromRGB(14,14,30), Card=Color3.fromRGB(20,20,40), SidebarBG=Color3.fromRGB(12,12,26), ActiveTab=Color3.fromRGB(22,22,44), Accent=Color3.fromRGB(68,102,255), AccentHov=Color3.fromRGB(100,130,255), TextMain=Color3.fromRGB(220,225,255), TextSub=Color3.fromRGB(150,160,220), TextMuted=Color3.fromRGB(100,110,170), Border=Color3.fromRGB(40,40,80), ToggleOff=Color3.fromRGB(50,50,100), ToggleOn=Color3.fromRGB(68,102,255), SliderFill=Color3.fromRGB(68,102,255), SliderBG=Color3.fromRGB(40,40,80), BtnBG=Color3.fromRGB(20,20,44), BtnBord=Color3.fromRGB(50,50,100), KeyFree=Color3.fromRGB(30,200,80), KeyPaid=Color3.fromRGB(68,102,255), SpyFire=Color3.fromRGB(100,140,255), SpyInvoke=Color3.fromRGB(255,220,80), SpyBG=Color3.fromRGB(6,6,18), }, Carbon = { BG=Color3.fromRGB(11,11,11), Surface=Color3.fromRGB(17,17,17), Card=Color3.fromRGB(23,23,23), SidebarBG=Color3.fromRGB(15,15,15), ActiveTab=Color3.fromRGB(28,28,28), Accent=Color3.fromRGB(160,160,160), AccentHov=Color3.fromRGB(200,200,200), TextMain=Color3.fromRGB(255,255,255), TextSub=Color3.fromRGB(180,180,180), TextMuted=Color3.fromRGB(120,120,120), Border=Color3.fromRGB(45,45,45), ToggleOff=Color3.fromRGB(55,55,55), ToggleOn=Color3.fromRGB(160,160,160), SliderFill=Color3.fromRGB(160,160,160), SliderBG=Color3.fromRGB(40,40,40), BtnBG=Color3.fromRGB(28,28,28), BtnBord=Color3.fromRGB(50,50,50), KeyFree=Color3.fromRGB(30,180,60), KeyPaid=Color3.fromRGB(160,160,160), SpyFire=Color3.fromRGB(200,200,200), SpyInvoke=Color3.fromRGB(255,220,80), SpyBG=Color3.fromRGB(9,9,9), }, } local T = {} for k,v in pairs(THEMES.Dark) do T[k]=v end local currentThemeName = "Dark" local themedElements = {} local function regThemed(obj, prop, role) themedElements[#themedElements+1]={obj,prop,role} end local function applyTheme(name) if not THEMES[name] then return end if TIER=="FREE" and name~="Dark" then return end local newT = THEMES[name] for k,v in pairs(newT) do T[k]=v end currentThemeName = name for _,entry in ipairs(themedElements) do pcall(function() local obj,prop,role=entry[1],entry[2],entry[3] if T[role] then obj[prop]=T[role] end end) end end if type(getgenv)~="function" then getgenv=function()return _G end end getgenv().FF3Config = { Magnet=false, MagnetRadius=10, AutoCatch=false, AutoCatchDelay=0.3, MagnetType="Legit", AngleLock=false, MagnetHotkey="E", QBAPassing=false, TargetLead=5, TargetLock=false, PerfectAccuracy=false, LookAtTarget=false, MagLead=5, AngleLead=3, BulletLead=5, DimeLead=15, MagHeight=6, AngleHeight=8, DimeHeight=20, AutoSwat=false, AutoTackle=false, DiveAssist=false, Jammer=false, AutoInterception=false, BlockBypass=false, FumbleStripper=false, AutoStrafe=false, AutoPower=false, AutoAim=false, TrajectoryPreview=false, KickPowerTarget=100, KickMeterFreeze=false, Speed=false, SpeedValue=21, JumpPower=false, JumpPowerValue=50, AngleEnhancer=false, AngleEnhancerValue=50, HipHeight=2, FOV=70, TracerLines=false, ChamsFill=false, DistanceESP=false, FullBright=false, LandingZoneRadius=5, NoClip=false, AntiFumble=false, AutoGG=false, FakeLag=0, MenuHotkey="RightShift", StreamerMode=false, Notifications=true, WatermarkOpacity=0.8, FPSUnlocker=false, ActiveTheme="Dark", SpyerEnabled=false, SpyerPaused=false, AutoFarm=false, AutoFarmTarget="Score", DefenseZoneLock=false, AutoCoverReceiver=false, KickAngleAdjust=0, AutoQBScramble=false, MagEngineActive=false, MagEngineMode="Legit", PredictiveCatch=false, CatchAngleWindow=100, BallSpinComp=true, DiveCatch=false, PossessionAssert=false, MomentumAbsorb=true, PreSnapPosition=false, CatchPriority=false, AutoSecure=false, BallLeadFactor=1.0, CatchHeightBias=0.5, PassType="Auto", ReceiverScoring=true, PocketCollapseDetect=false, AutoThrow=false, AirTimeComp=true, CoverageRead=false, ThrowWindow=0.35, AccuracyBoost=false, TargetSwitch=false, MinReceiverSep=8, PassPowerScale=1.0, HitboxEvasion=false, EvasionMode="Auto", JukeSequence=false, SpinMoveAuto=false, BlitzDetect=false, InboundsProtect=true, BreakTackleAssist=false, EvasionRadius=8, EvasionDelay=0.12, DiveAvoid=false, AntiFumbleV2=false, FumblePacketBlock=false, PossessionLock=false, VelocityClamp=false, FumbleVelocityThreshold=40, BallOwnershipTick=0.05, FumbleRemoteBlock=false, ImpactAbsorption=true, } local CFG = getgenv().FF3Config local DEFAULTS={} for k,v in pairs(CFG) do DEFAULTS[k]=v end local function validateKey(key) key = key:upper():gsub("%s","") local res = postHttp(KEY_API_URL, '{"key":"'..key..'","game":"FF3","v":"'..VERSION..'"}') if res then local tier = res:match('"tier"%s*:%s*"(%a+)"') if tier then return tier:upper() end if res:find('"valid"%s*:%s*true') then if res:find('"paid"') then return "PAID" end return "FREE" end end return HARDCODED_KEYS[key] or nil end local function showKeyScreen() local KGui = Instance.new("ScreenGui") KGui.Name = "PhantomHubKey" KGui.ResetOnSpawn = false KGui.DisplayOrder = 1000 KGui.IgnoreGuiInset = true KGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling KGui.Parent = guiParent protectGui(KGui) local overlay = Instance.new("Frame") overlay.BackgroundColor3 = Color3.fromRGB(0,0,0) overlay.BackgroundTransparency = 0 overlay.Size = UDim2.new(1,0,1,0) overlay.BorderSizePixel = 0 overlay.Parent = KGui task.spawn(function() local rng = Random.new() for i=1,18 do local dot = Instance.new("Frame") dot.BackgroundColor3 = Color3.fromRGB(204,18,18) dot.BackgroundTransparency = 0.85 local sz = rng:NextInteger(2,5) dot.Size = UDim2.new(0,sz,0,sz) dot.Position = UDim2.new(rng:NextNumber(),0,rng:NextNumber(),0) dot.BorderSizePixel = 0 dot.Parent = overlay local c=Instance.new("UICorner"); c.CornerRadius=UDim.new(1,0); c.Parent=dot task.spawn(function() while dot.Parent do local tx = rng:NextNumber() local ty = rng:NextNumber() TweenService:Create(dot,TweenInfo.new(rng:NextNumber(4,8),Enum.EasingStyle.Sine,Enum.EasingDirection.InOut), {Position=UDim2.new(tx,0,ty,0)}):Play() task.wait(rng:NextNumber(4,8)) end end) end end) local card = Instance.new("Frame") card.BackgroundColor3 = Color3.fromRGB(16,16,16) card.Size = UDim2.new(0,420,0,0) card.Position = UDim2.new(0.5,-210,0.5,0) card.BorderSizePixel = 0 card.ClipsDescendants = true card.Parent = KGui local cc=Instance.new("UICorner"); cc.CornerRadius=UDim.new(0,14); cc.Parent=card local cs=Instance.new("UIStroke"); cs.Color=Color3.fromRGB(204,18,18); cs.Thickness=1.5; cs.Parent=card TweenService:Create(card,TweenInfo.new(0.4,Enum.EasingStyle.Back,Enum.EasingDirection.Out), {Size=UDim2.new(0,420,0,390),Position=UDim2.new(0.5,-210,0.5,-195)}):Play() local logoRow = Instance.new("Frame") logoRow.BackgroundTransparency=1 logoRow.Size=UDim2.new(1,0,0,70) logoRow.Position=UDim2.new(0,0,0,20) logoRow.Parent=card local logoIcon=Instance.new("TextLabel") logoIcon.Text="✦" logoIcon.TextColor3=Color3.fromRGB(204,18,18) logoIcon.Font=Enum.Font.GothamBold logoIcon.TextSize=34 logoIcon.BackgroundTransparency=1 logoIcon.Size=UDim2.new(0,50,1,0) logoIcon.Position=UDim2.new(0.5,-100,0,0) logoIcon.Parent=logoRow local logoTitle=Instance.new("TextLabel") logoTitle.Text="PHANTOM HUB" logoTitle.TextColor3=Color3.fromRGB(255,255,255) logoTitle.Font=Enum.Font.GothamBold logoTitle.TextSize=22 logoTitle.BackgroundTransparency=1 logoTitle.Size=UDim2.new(0,160,0,36) logoTitle.Position=UDim2.new(0.5,-60,0,10) logoTitle.TextXAlignment=Enum.TextXAlignment.Left logoTitle.Parent=logoRow local logoSub=Instance.new("TextLabel") logoSub.Text="Football Fusion 3 · v"..VERSION logoSub.TextColor3=Color3.fromRGB(110,110,110) logoSub.Font=Enum.Font.Gotham logoSub.TextSize=11 logoSub.BackgroundTransparency=1 logoSub.Size=UDim2.new(0,200,0,18) logoSub.Position=UDim2.new(0.5,-60,0,46) logoSub.TextXAlignment=Enum.TextXAlignment.Left logoSub.Parent=logoRow local div=Instance.new("Frame") div.BackgroundColor3=Color3.fromRGB(40,40,40) div.Size=UDim2.new(1,-40,0,1) div.Position=UDim2.new(0,20,0,96) div.BorderSizePixel=0 div.Parent=card local tierRow=Instance.new("Frame") tierRow.BackgroundTransparency=1 tierRow.Size=UDim2.new(1,-40,0,64) tierRow.Position=UDim2.new(0,20,0,108) tierRow.Parent=card local function tierBox(x,label,color,features) local b=Instance.new("Frame") b.BackgroundColor3=Color3.fromRGB(22,22,22) b.Size=UDim2.new(0,174,1,0) b.Position=UDim2.new(0,x,0,0) b.BorderSizePixel=0 b.Parent=tierRow local bc=Instance.new("UICorner"); bc.CornerRadius=UDim.new(0,8); bc.Parent=b local bs=Instance.new("UIStroke"); bs.Color=color; bs.Thickness=1; bs.Parent=b local lbl=Instance.new("TextLabel") lbl.Text=label lbl.TextColor3=color lbl.Font=Enum.Font.GothamBold lbl.TextSize=11 lbl.BackgroundTransparency=1 lbl.Size=UDim2.new(1,0,0,18) lbl.Position=UDim2.new(0,0,0,4) lbl.TextXAlignment=Enum.TextXAlignment.Center lbl.Parent=b local fl=Instance.new("TextLabel") fl.Text=features fl.TextColor3=Color3.fromRGB(150,150,150) fl.Font=Enum.Font.Gotham fl.TextSize=9 fl.BackgroundTransparency=1 fl.Size=UDim2.new(1,-8,0,36) fl.Position=UDim2.new(0,4,0,22) fl.TextXAlignment=Enum.TextXAlignment.Center fl.TextWrapped=true fl.Parent=b return b end tierBox(0,"FREE",Color3.fromRGB(30,180,60),"Magnet · Speed · Jump\nNoClip · Basic Config") tierBox(186,"PAID",Color3.fromRGB(204,18,18),"All features unlocked\nSpyer · All Themes · Full Aimbot") local inputFrame=Instance.new("Frame") inputFrame.BackgroundColor3=Color3.fromRGB(22,22,22) inputFrame.Size=UDim2.new(1,-40,0,40) inputFrame.Position=UDim2.new(0,20,0,188) inputFrame.BorderSizePixel=0 inputFrame.Parent=card local ifc=Instance.new("UICorner"); ifc.CornerRadius=UDim.new(0,10); ifc.Parent=inputFrame local ifs=Instance.new("UIStroke"); ifs.Color=Color3.fromRGB(50,50,50); ifs.Thickness=1; ifs.Parent=inputFrame local keyIcon=Instance.new("TextLabel") keyIcon.Text="🔑" keyIcon.TextSize=14 keyIcon.BackgroundTransparency=1 keyIcon.Size=UDim2.new(0,32,1,0) keyIcon.Position=UDim2.new(0,4,0,0) keyIcon.Parent=inputFrame local keyInput=Instance.new("TextBox") keyInput.BackgroundTransparency=1 keyInput.Size=UDim2.new(1,-40,1,0) keyInput.Position=UDim2.new(0,34,0,0) keyInput.Text="" keyInput.PlaceholderText="Enter your access key..." keyInput.PlaceholderColor3=Color3.fromRGB(80,80,80) keyInput.TextColor3=Color3.fromRGB(255,255,255) keyInput.Font=Enum.Font.GothamBold keyInput.TextSize=12 keyInput.TextXAlignment=Enum.TextXAlignment.Left keyInput.ClearTextOnFocus=false keyInput.Parent=inputFrame keyInput.Focused:Connect(function() TweenService:Create(ifs,TweenInfo.new(0.15),{Color=Color3.fromRGB(204,18,18)}):Play() end) keyInput.FocusLost:Connect(function() TweenService:Create(ifs,TweenInfo.new(0.15),{Color=Color3.fromRGB(50,50,50)}):Play() end) local statusLabel=Instance.new("TextLabel") statusLabel.Text="" statusLabel.TextColor3=Color3.fromRGB(255,80,80) statusLabel.Font=Enum.Font.Gotham statusLabel.TextSize=11 statusLabel.BackgroundTransparency=1 statusLabel.Size=UDim2.new(1,-40,0,16) statusLabel.Position=UDim2.new(0,20,0,236) statusLabel.TextXAlignment=Enum.TextXAlignment.Center statusLabel.Parent=card local submitBtn=Instance.new("TextButton") submitBtn.BackgroundColor3=Color3.fromRGB(204,18,18) submitBtn.Size=UDim2.new(1,-40,0,40) submitBtn.Position=UDim2.new(0,20,0,258) submitBtn.Text="UNLOCK PHANTOM HUB" submitBtn.TextColor3=Color3.fromRGB(255,255,255) submitBtn.Font=Enum.Font.GothamBold submitBtn.TextSize=13 submitBtn.BorderSizePixel=0 submitBtn.Parent=card local sbc=Instance.new("UICorner"); sbc.CornerRadius=UDim.new(0,10); sbc.Parent=submitBtn submitBtn.MouseEnter:Connect(function() TweenService:Create(submitBtn,TweenInfo.new(0.12),{BackgroundColor3=Color3.fromRGB(230,30,30)}):Play() end) submitBtn.MouseLeave:Connect(function() TweenService:Create(submitBtn,TweenInfo.new(0.12),{BackgroundColor3=Color3.fromRGB(204,18,18)}):Play() end) local getKeyBtn=Instance.new("TextButton") getKeyBtn.BackgroundColor3=Color3.fromRGB(26,26,26) getKeyBtn.Size=UDim2.new(1,-40,0,32) getKeyBtn.Position=UDim2.new(0,20,0,308) getKeyBtn.Text="Get a Key → phantomhub.gg" getKeyBtn.TextColor3=Color3.fromRGB(150,150,150) getKeyBtn.Font=Enum.Font.Gotham getKeyBtn.TextSize=11 getKeyBtn.BorderSizePixel=0 getKeyBtn.Parent=card local gkc=Instance.new("UICorner"); gkc.CornerRadius=UDim.new(0,10); gkc.Parent=getKeyBtn local gks=Instance.new("UIStroke"); gks.Color=Color3.fromRGB(45,45,45); gks.Thickness=1; gks.Parent=getKeyBtn local keySaved = readFile("PhantomHub/key.dat") local validated = false local function tryKey(k) submitBtn.Text="VALIDATING..." submitBtn.AutoButtonColor=false statusLabel.Text="" task.wait(0.05) local tier = validateKey(k) if tier then TIER = tier writeFile("PhantomHub/key.dat", k) submitBtn.Text="✓ ACCESS GRANTED ("..tier..")" submitBtn.BackgroundColor3=Color3.fromRGB(30,180,60) task.wait(0.9) TweenService:Create(card,TweenInfo.new(0.3,Enum.EasingStyle.Back,Enum.EasingDirection.In), {Size=UDim2.new(0,420,0,0),Position=UDim2.new(0.5,-210,0.5,0)}):Play() TweenService:Create(overlay,TweenInfo.new(0.3),{BackgroundTransparency=1}):Play() task.wait(0.35) KGui:Destroy() validated=true else submitBtn.Text="UNLOCK PHANTOM HUB" submitBtn.AutoButtonColor=true statusLabel.Text="✕ Invalid key. Visit phantomhub.gg to get one." TweenService:Create(card,TweenInfo.new(0.04),{Position=UDim2.new(0.5,-216,0.5,-195)}):Play() task.wait(0.04) TweenService:Create(card,TweenInfo.new(0.04),{Position=UDim2.new(0.5,-204,0.5,-195)}):Play() task.wait(0.04) TweenService:Create(card,TweenInfo.new(0.04),{Position=UDim2.new(0.5,-210,0.5,-195)}):Play() end end if keySaved and validateKey(keySaved) then tryKey(keySaved) end submitBtn.MouseButton1Click:Connect(function() if validated then return end local k=keyInput.Text:gsub("%s","") if #k<5 then statusLabel.Text="✕ Please enter your key." return end tryKey(k) end) keyInput.FocusLost:Connect(function(enter) if enter and not validated then local k=keyInput.Text:gsub("%s","") if #k>4 then tryKey(k) end end end) while not validated do task.wait(0.05) end end makeFolder("PhantomHub") showKeyScreen() local callerSpoofInstalled = false local function installCallerSpoof() if callerSpoofInstalled then return end if not (type(getrawmetatable)=="function" and type(setreadonly)=="function") then return end pcall(function() local mt = getrawmetatable(game) local old = mt.__namecall setreadonly(mt, false) mt.__namecall = newCClosure(function(self, ...) local method = getnamecallmethod and getnamecallmethod() or "" if method=="FireServer" or method=="InvokeServer" or method=="FireAllClients" then if type(checkcaller)=="function" and not checkcaller() then return old(self, ...) end return old(self, ...) end return old(self, ...) end) setreadonly(mt, true) callerSpoofInstalled = true end) end installCallerSpoof() local CachedBall = nil local function findBall() if CachedBall and CachedBall.Parent and not CachedBall.Anchored then return CachedBall end CachedBall=nil for _,obj in ipairs(workspace:GetDescendants()) do local nm=obj.Name:lower() if (nm:find("football") or nm=="ball") and obj:IsA("BasePart") and not obj.Anchored then CachedBall=obj; return obj end end return nil end workspace.DescendantAdded:Connect(function(obj) if type(obj.Name)=="string" then local nm=obj.Name:lower() if (nm:find("football") or nm=="ball") and obj:IsA("BasePart") then CachedBall=obj end end end) local ScreenGui=Instance.new("ScreenGui") ScreenGui.Name="PhantomHub" ScreenGui.ResetOnSpawn=false ScreenGui.ZIndexBehavior=Enum.ZIndexBehavior.Sibling ScreenGui.DisplayOrder=999 ScreenGui.IgnoreGuiInset=true ScreenGui.Parent=guiParent protectGui(ScreenGui) local notifHolder=Instance.new("Frame") notifHolder.BackgroundTransparency=1 notifHolder.Size=UDim2.new(0,280,1,0) notifHolder.Position=UDim2.new(1,-295,0,0) notifHolder.Parent=ScreenGui local notifList=Instance.new("UIListLayout"); notifList.Padding=UDim.new(0,8) notifList.FillDirection=Enum.FillDirection.Vertical; notifList.VerticalAlignment=Enum.VerticalAlignment.Bottom notifList.SortOrder=Enum.SortOrder.LayoutOrder; notifList.Parent=notifHolder local notifPad=Instance.new("UIPadding"); notifPad.PaddingBottom=UDim.new(0,14); notifPad.Parent=notifHolder local function notify(title,msg,dur) if not CFG.Notifications then return end local n=Instance.new("Frame") n.BackgroundColor3=T.Card n.Size=UDim2.new(1,0,0,62) n.BackgroundTransparency=1 n.ClipsDescendants=true n.Parent=notifHolder local nc=Instance.new("UICorner"); nc.CornerRadius=UDim.new(0,10); nc.Parent=n local ns=Instance.new("UIStroke"); ns.Color=T.Accent; ns.Thickness=1; ns.Parent=n local bar=Instance.new("Frame"); bar.BackgroundColor3=T.Accent bar.Size=UDim2.new(0,3,1,-16); bar.Position=UDim2.new(0,0,0,8); bar.BorderSizePixel=0; bar.Parent=n local bc=Instance.new("UICorner"); bc.CornerRadius=UDim.new(0,3); bc.Parent=bar local col=Instance.new("Frame"); col.BackgroundTransparency=1 col.Size=UDim2.new(1,-18,1,0); col.Position=UDim2.new(0,12,0,0); col.Parent=n local cl=Instance.new("UIListLayout"); cl.Padding=UDim.new(0,2); cl.SortOrder=Enum.SortOrder.LayoutOrder; cl.Parent=col local cp=Instance.new("UIPadding"); cp.PaddingTop=UDim.new(0,12); cp.Parent=col local tL=Instance.new("TextLabel"); tL.Text=title; tL.TextColor3=T.TextMain tL.Font=Enum.Font.GothamBold; tL.TextSize=12; tL.BackgroundTransparency=1 tL.TextXAlignment=Enum.TextXAlignment.Left; tL.Size=UDim2.new(1,0,0,14); tL.Parent=col local mL=Instance.new("TextLabel"); mL.Text=msg; mL.TextColor3=T.TextSub mL.Font=Enum.Font.Gotham; mL.TextSize=10; mL.BackgroundTransparency=1 mL.TextXAlignment=Enum.TextXAlignment.Left; mL.Size=UDim2.new(1,0,0,14); mL.TextWrapped=true; mL.Parent=col TweenService:Create(n,TweenInfo.new(0.22,Enum.EasingStyle.Quart,Enum.EasingDirection.Out),{BackgroundTransparency=0}):Play() local prog=Instance.new("Frame"); prog.BackgroundColor3=T.Accent; prog.BackgroundTransparency=0.6 prog.Size=UDim2.new(1,0,0,2); prog.Position=UDim2.new(0,0,1,-2); prog.BorderSizePixel=0; prog.Parent=n TweenService:Create(prog,TweenInfo.new(dur or 3,Enum.EasingStyle.Linear),{Size=UDim2.new(0,0,0,2)}):Play() task.delay(dur or 3,function() TweenService:Create(n,TweenInfo.new(0.25),{BackgroundTransparency=1,Size=UDim2.new(1,0,0,0)}):Play() task.delay(0.3,function()n:Destroy()end) end) end local function tw(obj,props,t,style,dir) TweenService:Create(obj,TweenInfo.new(t or 0.18,style or Enum.EasingStyle.Quart,dir or Enum.EasingDirection.Out),props):Play() end local function corner(r,parent) local c=Instance.new("UICorner"); c.CornerRadius=UDim.new(0,r or 8); c.Parent=parent; return c end local function stroke(col,thick,parent) local s=Instance.new("UIStroke"); s.Color=col or T.Border; s.Thickness=thick or 1 s.ApplyStrokeMode=Enum.ApplyStrokeMode.Border; s.Parent=parent; return s end local function pad(t2,r,b,l,parent) local p=Instance.new("UIPadding"); p.PaddingTop=UDim.new(0,t2 or 0) p.PaddingRight=UDim.new(0,r or 0); p.PaddingBottom=UDim.new(0,b or 0) p.PaddingLeft=UDim.new(0,l or 0); p.Parent=parent; return p end local function listL(sp,dir,parent) local l=Instance.new("UIListLayout"); l.Padding=UDim.new(0,sp or 6) l.FillDirection=dir or Enum.FillDirection.Vertical; l.SortOrder=Enum.SortOrder.LayoutOrder l.Parent=parent; return l end local function lbl(text,size,col,bold,parent) local l=Instance.new("TextLabel"); l.Text=text; l.TextSize=size or 13 l.TextColor3=col or T.TextMain; l.Font=bold and Enum.Font.GothamBold or Enum.Font.Gotham l.BackgroundTransparency=1; l.TextXAlignment=Enum.TextXAlignment.Left l.AutomaticSize=Enum.AutomaticSize.XY; l.Parent=parent; return l end local function frm(bg,size,pos,parent) local f=Instance.new("Frame"); f.BackgroundColor3=bg or T.Surface f.Size=size or UDim2.new(1,0,0,30) if pos then f.Position=pos end f.BorderSizePixel=0; f.Parent=parent; return f end local function scroll(size,pos,parent) local sf=Instance.new("ScrollingFrame"); sf.BackgroundTransparency=1 sf.Size=size or UDim2.new(1,0,1,0) if pos then sf.Position=pos end sf.BorderSizePixel=0; sf.ScrollBarThickness=3 sf.ScrollBarImageColor3=T.Accent; sf.CanvasSize=UDim2.new(0,0,0,0) sf.AutomaticCanvasSize=Enum.AutomaticSize.Y; sf.Parent=parent; return sf end local function separator(parent) local f=frm(T.Border,UDim2.new(1,-24,0,1),nil,parent) f.BackgroundTransparency=0; return f end local WIN_W, WIN_H = 680, 430 local MainFrame=Instance.new("Frame") MainFrame.Name="MainFrame" MainFrame.BackgroundColor3=T.BG MainFrame.Size=UDim2.new(0,WIN_W,0,WIN_H) MainFrame.Position=UDim2.new(0.5,-WIN_W/2,0.5,-WIN_H/2) MainFrame.BorderSizePixel=0 MainFrame.ClipsDescendants=true MainFrame.Parent=ScreenGui corner(12,MainFrame) local mainStroke=stroke(T.Border,1,MainFrame) regThemed(MainFrame,"BackgroundColor3","BG") regThemed(mainStroke,"Color","Border") local Shadow=Instance.new("ImageLabel") Shadow.BackgroundTransparency=1 Shadow.Size=UDim2.new(1,50,1,50) Shadow.Position=UDim2.new(0,-25,0,-25) Shadow.Image="rbxassetid://6014261993" Shadow.ImageColor3=Color3.fromRGB(0,0,0) Shadow.ImageTransparency=0.5 Shadow.ScaleType=Enum.ScaleType.Slice Shadow.SliceCenter=Rect.new(49,49,450,450) Shadow.ZIndex=-1 Shadow.Parent=MainFrame MainFrame.Size=UDim2.new(0,WIN_W,0,0) MainFrame.Position=UDim2.new(0.5,-WIN_W/2,0.5,0) task.wait(0.05) tw(MainFrame,{Size=UDim2.new(0,WIN_W,0,WIN_H),Position=UDim2.new(0.5,-WIN_W/2,0.5,-WIN_H/2)},0.35,Enum.EasingStyle.Back) local TitleBar=frm(T.SidebarBG,UDim2.new(1,0,0,46),UDim2.new(0,0,0,0),MainFrame) regThemed(TitleBar,"BackgroundColor3","SidebarBG") local accentLine=frm(T.Accent,UDim2.new(1,0,0,2),UDim2.new(0,0,1,-2),TitleBar) regThemed(accentLine,"BackgroundColor3","Accent") local TitleIcon=Instance.new("TextLabel") TitleIcon.Text="✦"; TitleIcon.TextColor3=T.Accent; TitleIcon.Font=Enum.Font.GothamBold TitleIcon.TextSize=18; TitleIcon.BackgroundTransparency=1 TitleIcon.Size=UDim2.new(0,30,1,0); TitleIcon.Position=UDim2.new(0,14,0,0) TitleIcon.Parent=TitleBar regThemed(TitleIcon,"TextColor3","Accent") local TitleText=Instance.new("TextLabel") TitleText.Text="PHANTOM HUB"; TitleText.TextColor3=T.TextMain; TitleText.Font=Enum.Font.GothamBold TitleText.TextSize=14; TitleText.BackgroundTransparency=1 TitleText.Size=UDim2.new(0,220,0,22); TitleText.Position=UDim2.new(0,46,0,7) TitleText.TextXAlignment=Enum.TextXAlignment.Left; TitleText.Parent=TitleBar regThemed(TitleText,"TextColor3","TextMain") local TierBadge=Instance.new("TextLabel") TierBadge.Text=TIER=="PAID" and "PAID" or "FREE" TierBadge.TextColor3=TIER=="PAID" and T.KeyPaid or T.KeyFree TierBadge.Font=Enum.Font.GothamBold; TierBadge.TextSize=9 TierBadge.BackgroundColor3=Color3.fromRGB(26,26,26); TierBadge.BackgroundTransparency=0 TierBadge.Size=UDim2.new(0,34,0,16); TierBadge.Position=UDim2.new(0,46,0,26) TierBadge.Parent=TitleBar local tbc=corner(4,TierBadge) local SubText=Instance.new("TextLabel") SubText.Text="Football Fusion 3 • v"..VERSION SubText.TextColor3=T.TextMuted; SubText.Font=Enum.Font.Gotham; SubText.TextSize=10 SubText.BackgroundTransparency=1; SubText.Size=UDim2.new(0,240,0,16) SubText.Position=UDim2.new(0,84,0,26); SubText.TextXAlignment=Enum.TextXAlignment.Left SubText.Parent=TitleBar regThemed(SubText,"TextColor3","TextMuted") local function titleBtn(icon,xOff) local b=Instance.new("TextButton") b.Text=icon; b.TextColor3=T.TextMuted; b.Font=Enum.Font.Gotham; b.TextSize=14 b.BackgroundTransparency=1; b.Size=UDim2.new(0,28,0,28) b.Position=UDim2.new(1,xOff,0.5,-14); b.Parent=TitleBar b.MouseEnter:Connect(function()tw(b,{TextColor3=T.TextMain},0.1)end) b.MouseLeave:Connect(function()tw(b,{TextColor3=T.TextMuted},0.1)end) return b end local CloseBtn=titleBtn("✕",-36) local MinBtn=titleBtn("−",-66) local PinBtn=titleBtn("⊡",-96) local pinned=false PinBtn.MouseButton1Click:Connect(function() pinned=not pinned PinBtn.Text=pinned and "⊠" or "⊡" tw(PinBtn,{TextColor3=pinned and T.Accent or T.TextMuted},0.1) end) CloseBtn.MouseButton1Click:Connect(function() tw(MainFrame,{Size=UDim2.new(0,WIN_W,0,0),Position=UDim2.new(0.5,-WIN_W/2,0.5,0)},0.2) task.delay(0.22,function()MainFrame.Visible=false end) end) MinBtn.MouseButton1Click:Connect(function() if MainFrame.Size.Y.Offset<50 then tw(MainFrame,{Size=UDim2.new(0,WIN_W,0,WIN_H)},0.22) else tw(MainFrame,{Size=UDim2.new(0,WIN_W,0,46)},0.22) end end) do local drag,ds,sp,ati=false,nil,nil,nil track(TitleBar.InputBegan:Connect(function(inp) local isT=inp.UserInputType==Enum.UserInputType.Touch local isM=inp.UserInputType==Enum.UserInputType.MouseButton1 if (isT or isM) and not drag then drag=true; ati=isT and inp.TouchId or nil ds=inp.Position; sp=MainFrame.Position end end)) track(UserInputService.InputChanged:Connect(function(inp) if not drag then return end local isT=inp.UserInputType==Enum.UserInputType.Touch local isM=inp.UserInputType==Enum.UserInputType.MouseMovement if isT and inp.TouchId~=ati then return end if isT or isM then local d=inp.Position-ds MainFrame.Position=UDim2.new(sp.X.Scale,sp.X.Offset+d.X,sp.Y.Scale,sp.Y.Offset+d.Y) end end)) track(UserInputService.InputEnded:Connect(function(inp) local isT=inp.UserInputType==Enum.UserInputType.Touch local isM=inp.UserInputType==Enum.UserInputType.MouseButton1 if isT and inp.TouchId~=ati then return end if isT or isM then drag=false;ati=nil end end)) end local BodyFrame=frm(T.BG,UDim2.new(1,0,1,-46),UDim2.new(0,0,0,46),MainFrame) regThemed(BodyFrame,"BackgroundColor3","BG") local Sidebar=frm(T.SidebarBG,UDim2.new(0,178,1,0),UDim2.new(0,0,0,0),BodyFrame) regThemed(Sidebar,"BackgroundColor3","SidebarBG") local divLine=frm(T.Border,UDim2.new(0,1,1,0),UDim2.new(0,178,0,0),BodyFrame) regThemed(divLine,"BackgroundColor3","Border") local ContentArea=frm(T.BG,UDim2.new(1,-179,1,0),UDim2.new(0,179,0,0),BodyFrame) regThemed(ContentArea,"BackgroundColor3","BG") local searchBarFrame=frm(T.Surface,UDim2.new(1,0,0,36),UDim2.new(0,0,0,0),ContentArea) regThemed(searchBarFrame,"BackgroundColor3","Surface") local searchIcon=Instance.new("TextLabel") searchIcon.Text="🔍"; searchIcon.TextSize=12; searchIcon.BackgroundTransparency=1 searchIcon.Size=UDim2.new(0,28,1,0); searchIcon.Position=UDim2.new(0,6,0,0); searchIcon.Parent=searchBarFrame local searchBox=Instance.new("TextBox") searchBox.BackgroundTransparency=1; searchBox.Size=UDim2.new(1,-40,1,0) searchBox.Position=UDim2.new(0,30,0,0); searchBox.Text="" searchBox.PlaceholderText="Search features..."; searchBox.PlaceholderColor3=T.TextMuted searchBox.TextColor3=T.TextMain; searchBox.Font=Enum.Font.Gotham; searchBox.TextSize=12 searchBox.TextXAlignment=Enum.TextXAlignment.Left; searchBox.ClearTextOnFocus=false searchBox.Parent=searchBarFrame regThemed(searchBox,"TextColor3","TextMain") local searchDiv=frm(T.Border,UDim2.new(1,0,0,1),UDim2.new(0,0,1,-1),searchBarFrame) regThemed(searchDiv,"BackgroundColor3","Border") local ContentScroll=scroll(UDim2.new(1,0,1,-36),UDim2.new(0,0,0,36),ContentArea) regThemed(ContentScroll,"ScrollBarImageColor3","Accent") local SidebarScroll=scroll(UDim2.new(1,0,1,0),UDim2.new(0,0,0,0),Sidebar) listL(4,Enum.FillDirection.Vertical,SidebarScroll) pad(10,8,10,8,SidebarScroll) local Pages={} local SidebarBtns={} local ActiveTab=nil local TAB_ICONS={ Magnet="🧲",["QB Aimbot"]="🏈",Defense="🛡",Kicker="⚽", Player="🏃",Visuals="👁",Misc="⚙",Settings="≡", } local TAB_ORDER={"Magnet","QB Aimbot","Defense","Kicker","Player","Visuals","Misc","Settings"} local function newPage() local sf=scroll(UDim2.new(1,0,1,0),nil,ContentScroll) listL(6,Enum.FillDirection.Vertical,sf) pad(14,14,14,14,sf) sf.Visible=false return sf end local tabActivators={} local function addTab(name) local page=newPage() Pages[name]=page local btn=Instance.new("TextButton") btn.BackgroundColor3=T.SidebarBG; btn.BackgroundTransparency=1 btn.Size=UDim2.new(1,0,0,38); btn.Text=""; btn.AutoButtonColor=false btn.BorderSizePixel=0; btn.Parent=SidebarScroll corner(8,btn) regThemed(btn,"BackgroundColor3","ActiveTab") local iL=Instance.new("TextLabel"); iL.Text=TAB_ICONS[name] or "•"; iL.TextSize=14 iL.Font=Enum.Font.Gotham; iL.BackgroundTransparency=1; iL.TextColor3=T.TextMuted iL.Size=UDim2.new(0,24,1,0); iL.Position=UDim2.new(0,8,0,0); iL.Parent=btn regThemed(iL,"TextColor3","TextMuted") local nL=Instance.new("TextLabel"); nL.Text=name; nL.TextSize=12 nL.Font=Enum.Font.Gotham; nL.BackgroundTransparency=1; nL.TextColor3=T.TextMuted nL.Size=UDim2.new(1,-36,1,0); nL.Position=UDim2.new(0,34,0,0) nL.TextXAlignment=Enum.TextXAlignment.Left; nL.Parent=btn regThemed(nL,"TextColor3","TextMuted") local selBar=frm(T.Accent,UDim2.new(0,3,0,20),UDim2.new(0,0,0.5,-10),btn) corner(3,selBar); selBar.Visible=false regThemed(selBar,"BackgroundColor3","Accent") SidebarBtns[name]={btn=btn,iL=iL,nL=nL,selBar=selBar} local function activate() if ActiveTab and Pages[ActiveTab] then Pages[ActiveTab].Visible=false end for n2,d in pairs(SidebarBtns) do tw(d.btn,{BackgroundTransparency=1},0.1) tw(d.nL,{TextColor3=T.TextMuted},0.1); tw(d.iL,{TextColor3=T.TextMuted},0.1) d.selBar.Visible=false end ActiveTab=name; page.Visible=true tw(btn,{BackgroundColor3=T.ActiveTab,BackgroundTransparency=0},0.12) tw(nL,{TextColor3=T.TextMain},0.12); tw(iL,{TextColor3=T.Accent},0.12) selBar.Visible=true searchBox.Text="" end btn.MouseButton1Click:Connect(activate) btn.MouseEnter:Connect(function() if ActiveTab~=name then tw(btn,{BackgroundTransparency=0.65},0.1); tw(nL,{TextColor3=T.TextSub},0.1) end end) btn.MouseLeave:Connect(function() if ActiveTab~=name then tw(btn,{BackgroundTransparency=1},0.1); tw(nL,{TextColor3=T.TextMuted},0.1) end end) tabActivators[name]=activate return page,activate end local function filterSearch(query) local q=query:lower() if ActiveTab then local p=Pages[ActiveTab] if not p then return end for _,child in ipairs(p:GetChildren()) do if child:IsA("Frame") then local match=false if q=="" then match=true else for _,desc in ipairs(child:GetDescendants()) do if desc:IsA("TextLabel") or desc:IsA("TextButton") then if desc.Text:lower():find(q,1,true) then match=true;break end end end end child.Visible=match end end end end searchBox:GetPropertyChangedSignal("Text"):Connect(function()filterSearch(searchBox.Text)end) local function secHeader(text,parent) local c=frm(nil,UDim2.new(1,0,0,28),nil,parent); c.BackgroundTransparency=1 local b=frm(T.Accent,UDim2.new(0,2,0,14),UDim2.new(0,0,0.5,-7),c); corner(2,b) regThemed(b,"BackgroundColor3","Accent") local l=lbl(text,10,T.TextMuted,false,c); l.Position=UDim2.new(0,10,0,6) regThemed(l,"TextColor3","TextMuted") return c end local function paidGate(featureName) if TIER=="PAID" then return true end notify("Phantom Hub","⚠ "..featureName.." requires Paid access",3) return false end local function addToggle(parent,text,desc,cfgKey,cb) local row=frm(T.Card,UDim2.new(1,0,0,(desc and desc~="") and 54 or 44),nil,parent) corner(8,row); local rs=stroke(T.Border,1,row) regThemed(row,"BackgroundColor3","Card"); regThemed(rs,"Color","Border") local col=Instance.new("Frame"); col.BackgroundTransparency=1 col.Size=UDim2.new(1,-66,1,0); col.Position=UDim2.new(0,12,0,0); col.Parent=row listL(2,Enum.FillDirection.Vertical,col); pad(10,0,10,0,col) local tL=lbl(text,12,T.TextMain,true,col); regThemed(tL,"TextColor3","TextMain") if desc and desc~="" then local dL=lbl(desc,10,T.TextMuted,false,col); regThemed(dL,"TextColor3","TextMuted") end local tW,tH=40,22 local tF=frm(T.ToggleOff,UDim2.new(0,tW,0,tH),nil,row) tF.Position=UDim2.new(1,-(tW+12),0.5,-tH/2) corner(tH/2,tF) regThemed(tF,"BackgroundColor3",CFG[cfgKey] and "ToggleOn" or "ToggleOff") local kH=tH-6 local kn=frm(Color3.fromRGB(255,255,255),UDim2.new(0,kH,0,kH),nil,tF) kn.Position=CFG[cfgKey] and UDim2.new(0,tW-kH-3,0.5,-kH/2) or UDim2.new(0,3,0.5,-kH/2) corner(kH/2,kn) local function setT(val) CFG[cfgKey]=val tw(tF,{BackgroundColor3=val and T.ToggleOn or T.ToggleOff},0.15) tw(kn,{Position=val and UDim2.new(0,tW-kH-3,0.5,-kH/2) or UDim2.new(0,3,0.5,-kH/2)},0.15) if cb then cb(val) end end local b=Instance.new("TextButton"); b.BackgroundTransparency=1 b.Size=UDim2.new(1,0,1,0); b.Text=""; b.Parent=row b.MouseButton1Click:Connect(function()setT(not CFG[cfgKey])end) return row,setT end local function addSlider(parent,text,desc,cfgKey,mn,mx,step,cb) local c=frm(T.Card,UDim2.new(1,0,0,64),nil,parent) corner(8,c); local cs=stroke(T.Border,1,c) regThemed(c,"BackgroundColor3","Card"); regThemed(cs,"Color","Border") pad(10,12,10,12,c) local top=Instance.new("Frame"); top.BackgroundTransparency=1 top.Size=UDim2.new(1,0,0,18); top.Parent=c listL(0,Enum.FillDirection.Horizontal,top) local tL=lbl(text,12,T.TextMain,true,top); regThemed(tL,"TextColor3","TextMain") if desc and desc~="" then local dL=lbl(" — "..desc,10,T.TextMuted,false,top); regThemed(dL,"TextColor3","TextMuted") end local vL=Instance.new("TextLabel"); vL.TextColor3=T.Accent; vL.Font=Enum.Font.GothamBold vL.TextSize=11; vL.BackgroundTransparency=1; vL.Size=UDim2.new(1,0,1,0) vL.TextXAlignment=Enum.TextXAlignment.Right; vL.Parent=top regThemed(vL,"TextColor3","Accent") local function fmt(v) return (step<1) and string.format("%.1f",v) or tostring(math.floor(v)) end vL.Text=fmt(CFG[cfgKey]) local tH=4 local tF=frm(T.SliderBG,UDim2.new(1,0,0,tH),UDim2.new(0,0,0,28),c) corner(tH/2,tF); regThemed(tF,"BackgroundColor3","SliderBG") local pct0=math.clamp((CFG[cfgKey]-mn)/(mx-mn),0,1) local fill=frm(T.SliderFill,UDim2.new(pct0,0,1,0),nil,tF); corner(tH/2,fill) regThemed(fill,"BackgroundColor3","SliderFill") local kSz=14 local kn=frm(Color3.fromRGB(255,255,255),UDim2.new(0,kSz,0,kSz),nil,tF) kn.Position=UDim2.new(pct0,-kSz/2,0.5,-kSz/2); corner(kSz/2,kn) local function upd(pct) pct=math.clamp(pct,0,1) local raw=mn+(mx-mn)*pct local r=math.floor(raw/step+0.5)*step r=math.clamp(r,mn,mx); CFG[cfgKey]=r; vL.Text=fmt(r) tw(fill,{Size=UDim2.new(pct,0,1,0)},0.05) tw(kn,{Position=UDim2.new(pct,-kSz/2,0.5,-kSz/2)},0.05) if cb then cb(r) end end local sliding,sti=false,nil tF.InputBegan:Connect(function(inp) if inp.UserInputType==Enum.UserInputType.MouseButton1 or inp.UserInputType==Enum.UserInputType.Touch then sliding=true; sti=inp.UserInputType==Enum.UserInputType.Touch and inp.TouchId or nil upd((inp.Position.X-tF.AbsolutePosition.X)/tF.AbsoluteSize.X) end end) track(UserInputService.InputChanged:Connect(function(inp) if not sliding then return end if inp.UserInputType==Enum.UserInputType.Touch and inp.TouchId~=sti then return end if inp.UserInputType==Enum.UserInputType.MouseMovement or inp.UserInputType==Enum.UserInputType.Touch then upd((inp.Position.X-tF.AbsolutePosition.X)/tF.AbsoluteSize.X) end end)) track(UserInputService.InputEnded:Connect(function(inp) if inp.UserInputType==Enum.UserInputType.Touch and inp.TouchId~=sti then return end if inp.UserInputType==Enum.UserInputType.MouseButton1 or inp.UserInputType==Enum.UserInputType.Touch then sliding=false;sti=nil end end)) return c end local function addDropdown(parent,text,opts,cfgKey,cb) local c=frm(T.Card,UDim2.new(1,0,0,44),nil,parent) corner(8,c); local cs=stroke(T.Border,1,c) regThemed(c,"BackgroundColor3","Card"); regThemed(cs,"Color","Border") local l=lbl(text,12,T.TextMain,true,c); l.Position=UDim2.new(0,12,0.5,-7) regThemed(l,"TextColor3","TextMain") local sel=Instance.new("TextButton") sel.BackgroundColor3=T.BtnBG; sel.Size=UDim2.new(0,130,0,26) sel.Position=UDim2.new(1,-142,0.5,-13); sel.Text=CFG[cfgKey] or opts[1] sel.TextColor3=T.TextMain; sel.Font=Enum.Font.Gotham; sel.TextSize=11 sel.BorderSizePixel=0; sel.Parent=c; corner(6,sel) local ss=stroke(T.BtnBord,1,sel); regThemed(ss,"Color","BtnBord") regThemed(sel,"BackgroundColor3","BtnBG"); regThemed(sel,"TextColor3","TextMain") local arr=lbl("▾",10,T.Accent,false,sel); arr.Position=UDim2.new(1,-18,0.5,-7) regThemed(arr,"TextColor3","Accent") local ddF=frm(T.Card,UDim2.new(0,130,0,#opts*30+6),nil,ScreenGui) ddF.Visible=false; ddF.ZIndex=200; corner(8,ddF) local dds=stroke(T.Border,1,ddF); regThemed(dds,"Color","Border") regThemed(ddF,"BackgroundColor3","Card") listL(2,Enum.FillDirection.Vertical,ddF); pad(3,6,3,6,ddF) local open=false local function close() open=false; tw(ddF,{Size=UDim2.new(0,130,0,0)},0.12) task.delay(0.13,function()ddF.Visible=false end) end for _,opt in ipairs(opts) do local ob=Instance.new("TextButton"); ob.BackgroundTransparency=1 ob.Size=UDim2.new(1,0,0,28); ob.Text=opt ob.TextColor3=opt==CFG[cfgKey] and T.Accent or T.TextSub ob.Font=Enum.Font.Gotham; ob.TextSize=11; ob.BorderSizePixel=0 ob.Parent=ddF; corner(6,ob) regThemed(ob,"TextColor3",opt==CFG[cfgKey] and "Accent" or "TextSub") ob.MouseButton1Click:Connect(function() CFG[cfgKey]=opt; sel.Text=opt for _,ch in ipairs(ddF:GetChildren()) do if ch:IsA("TextButton") then tw(ch,{TextColor3=ch.Text==opt and T.Accent or T.TextSub},0.1) end end if cb then cb(opt) end; close() end) ob.MouseEnter:Connect(function()tw(ob,{BackgroundTransparency=0.5},0.1)end) ob.MouseLeave:Connect(function()tw(ob,{BackgroundTransparency=1},0.1)end) end sel.MouseButton1Click:Connect(function() if open then close() else open=true local p=sel.AbsolutePosition ddF.Position=UDim2.new(0,p.X,0,p.Y+30) ddF.Size=UDim2.new(0,130,0,0); ddF.Visible=true tw(ddF,{Size=UDim2.new(0,130,0,#opts*30+6)},0.14) end end) return c end local function addButton(parent,text,desc,cb) local btn=Instance.new("TextButton") btn.BackgroundColor3=T.Card; btn.Size=UDim2.new(1,0,0,42) btn.Text=""; btn.BorderSizePixel=0; btn.Parent=parent corner(8,btn); local bs=stroke(T.BtnBord,1,btn) regThemed(btn,"BackgroundColor3","Card"); regThemed(bs,"Color","BtnBord") local bar=frm(T.Accent,UDim2.new(0,2,0,16),UDim2.new(0,0,0.5,-8),btn) corner(2,bar); regThemed(bar,"BackgroundColor3","Accent") local l=lbl(text,12,T.TextMain,true,btn); l.Position=UDim2.new(0,14,0.5,-7) regThemed(l,"TextColor3","TextMain") if desc and desc~="" then local d=lbl(desc,10,T.TextMuted,false,btn); d.Position=UDim2.new(0,14,0.5,5) regThemed(d,"TextColor3","TextMuted") end btn.MouseEnter:Connect(function()tw(btn,{BackgroundColor3=T.ActiveTab},0.1)end) btn.MouseLeave:Connect(function()tw(btn,{BackgroundColor3=T.Card},0.1)end) btn.MouseButton1Click:Connect(function() tw(btn,{BackgroundColor3=T.Accent},0.08); tw(l,{TextColor3=T.BG},0.08) task.delay(0.16,function()tw(btn,{BackgroundColor3=T.Card},0.12);tw(l,{TextColor3=T.TextMain},0.12)end) if cb then cb() end end) return btn end local allKeybinds={} local function addKeybind(parent,text,cfgKey,cb) local c=frm(T.Card,UDim2.new(1,0,0,44),nil,parent) corner(8,c); local cs=stroke(T.Border,1,c) regThemed(c,"BackgroundColor3","Card"); regThemed(cs,"Color","Border") lbl(text,12,T.TextMain,true,c).Position=UDim2.new(0,12,0.5,-7) local kBtn=Instance.new("TextButton") kBtn.BackgroundColor3=T.BtnBG; kBtn.Size=UDim2.new(0,80,0,26) kBtn.Position=UDim2.new(1,-92,0.5,-13); kBtn.Text=CFG[cfgKey] or "None" kBtn.TextColor3=T.Accent; kBtn.Font=Enum.Font.GothamBold; kBtn.TextSize=11 kBtn.BorderSizePixel=0; kBtn.Parent=c; corner(6,kBtn) local ks=stroke(T.BtnBord,1,kBtn); regThemed(ks,"Color","BtnBord") regThemed(kBtn,"BackgroundColor3","BtnBG"); regThemed(kBtn,"TextColor3","Accent") allKeybinds[cfgKey]={label=text,btn=kBtn} local listening=false kBtn.MouseButton1Click:Connect(function() if listening then return end listening=true; kBtn.Text="..."; tw(kBtn,{TextColor3=T.TextMuted},0.1) local conn conn=UserInputService.InputBegan:Connect(function(inp) if inp.UserInputType==Enum.UserInputType.Keyboard then local kn=inp.KeyCode.Name CFG[cfgKey]=kn; kBtn.Text=kn tw(kBtn,{TextColor3=T.Accent},0.1) listening=false; conn:Disconnect() if cb then cb(kn) end end end) end) return c end local function addTextInput(parent,text,placeholder,cb) local c=frm(T.Card,UDim2.new(1,0,0,60),nil,parent) corner(8,c); local cs=stroke(T.Border,1,c) regThemed(c,"BackgroundColor3","Card"); regThemed(cs,"Color","Border") pad(8,12,8,12,c) local l=lbl(text,12,T.TextMain,true,c); l.Position=UDim2.new(0,0,0,8) regThemed(l,"TextColor3","TextMain") local inp=Instance.new("TextBox") inp.BackgroundColor3=T.BtnBG; inp.Size=UDim2.new(1,0,0,26) inp.Position=UDim2.new(0,0,0,30); inp.Text=""; inp.PlaceholderText=placeholder or "" inp.PlaceholderColor3=T.TextMuted; inp.TextColor3=T.TextMain inp.Font=Enum.Font.Gotham; inp.TextSize=11; inp.TextXAlignment=Enum.TextXAlignment.Left inp.ClearTextOnFocus=false; inp.BorderSizePixel=0; inp.Parent=c corner(6,inp); local is=stroke(T.BtnBord,1,inp); pad(0,0,0,8,inp) regThemed(inp,"BackgroundColor3","BtnBG"); regThemed(inp,"TextColor3","TextMain") regThemed(is,"Color","BtnBord") inp.FocusLost:Connect(function(enter)if enter and cb then cb(inp.Text)end end) return c,inp end for _,name in ipairs(TAB_ORDER) do addTab(name) end do local P=Pages["Magnet"] secHeader("BALL MAGNET",P) addToggle(P,"Magnet","Master switch","Magnet",function(v) notify("Magnet",v and "Ball magnet ON" or "Ball magnet OFF",2) end) addSlider(P,"Catch Radius","Pull distance (studs)","MagnetRadius",1,25,0.1) addToggle(P,"Auto-Catch","Instantly secures ball in radius","AutoCatch") addSlider(P,"Auto-Catch Delay","Delay before catch fires","AutoCatchDelay",0.1,2.5,0.1) addDropdown(P,"Magnet Type",{"Legit","Blatant","Custom"},"MagnetType",function(v) notify("Magnet","Switched to "..v,2) end) addToggle(P,"Angle Lock","Only pull from natural catch angles","AngleLock") secHeader("HOTKEYS",P) addKeybind(P,"Ball Magnet Toggle","MagnetHotkey") secHeader("MAG ENGINE (ADVANCED)",P) addToggle(P,"Mag Engine V2","Predictive catch with physics solver","MagEngineActive",function(v) if v and not paidGate("Mag Engine V2") then CFG.MagEngineActive=false; return end notify("Mag Engine",v and "Predictive catch engine ON" or "Engine OFF",2) end) addDropdown(P,"Engine Mode",{"Legit","Semi","Blatant"},"MagEngineMode") addToggle(P,"Predictive Catch","Pre-calculate ball intercept point","PredictiveCatch",function(v) if v and not paidGate("Predictive Catch") then CFG.PredictiveCatch=false end end) addSlider(P,"Catch Angle Window","Max catch angle from forward (°)","CatchAngleWindow",30,180,5) addSlider(P,"Ball Lead Factor","Intercept prediction multiplier","BallLeadFactor",0.5,2.0,0.1) addSlider(P,"Catch Height Bias","Vertical snap offset","CatchHeightBias",0,2,0.1) addToggle(P,"Ball Spin Compensation","Offset pull for ball rotation","BallSpinComp") addToggle(P,"Dive Catch","Extend reach for low / far balls","DiveCatch") addToggle(P,"Catch Priority Queue","Score & rank multiple balls","CatchPriority",function(v) if v and not paidGate("Catch Priority Queue") then CFG.CatchPriority=false end end) addToggle(P,"Possession Assert","Continuously re-send possess remote","PossessionAssert",function(v) if v and not paidGate("Possession Assert") then CFG.PossessionAssert=false end end) addToggle(P,"Momentum Absorb","Cancel ball velocity on catch","MomentumAbsorb") addToggle(P,"Auto Secure","Fire catch remote when ball in range","AutoSecure") addToggle(P,"Pre-Snap Position","Move to intercept point pre-snap","PreSnapPosition",function(v) if v and not paidGate("Pre-Snap Position") then CFG.PreSnapPosition=false end end) end do local P=Pages["QB Aimbot"] secHeader("QUARTERBACK AIMBOT",P) addToggle(P,"QBA Passing","Enable QB aimbot passing","QBAPassing",function(v) if v and not paidGate("QB Aimbot") then CFG.QBAPassing=false return end end) addToggle(P,"Target Lock","Lock camera onto receiver","TargetLock") addToggle(P,"Perfect Accuracy","Override inaccuracy","PerfectAccuracy") addToggle(P,"Look-At Target","Force torso to face receiver","LookAtTarget") addToggle(P,"Auto QB Scramble","Dodge rushers when pocket collapses","AutoQBScramble",function(v) if v and not paidGate("Auto QB Scramble") then CFG.AutoQBScramble=false end end) secHeader("LEAD SLIDERS",P) addSlider(P,"Mag Lead","Magnet prediction studs","MagLead",0,20,0.1) addSlider(P,"Angle Lead","Sideways receiver offset","AngleLead",0,12,0.1) addSlider(P,"Bullet Lead","Hard line-drive lead","BulletLead",0,15,0.1) addSlider(P,"Dime Lead","Deep lob downfield lead","DimeLead",5,30,0.1) secHeader("HEIGHT SLIDERS",P) addSlider(P,"Mag Height","Peak height — magnet","MagHeight",2,12,0.1) addSlider(P,"Angle Height","Height to clear defender","AngleHeight",1,18,0.1) addSlider(P,"Dime Height","Rainbow pass peak","DimeHeight",10,40,0.1) secHeader("LEAD CALCULATOR (ADVANCED)",P) addDropdown(P,"Pass Type",{"Auto","Bullet","Touch","Lob","Dime"},"PassType") addSlider(P,"Pass Power Scale","Ball speed multiplier","PassPowerScale",0.5,1.5,0.05) addSlider(P,"Throw Window","Auto-throw timing (s)","ThrowWindow",0.1,0.8,0.05) addSlider(P,"Min Receiver Sep","Min separation to throw (studs)","MinReceiverSep",4,20,1) addToggle(P,"Receiver Scoring","Auto-rank receivers by separation","ReceiverScoring") addToggle(P,"Air Time Compensation","Gravity-adjusted lead vectors","AirTimeComp") addToggle(P,"Coverage Read","Skip covered receivers","CoverageRead",function(v) if v and not paidGate("Coverage Read") then CFG.CoverageRead=false end end) addToggle(P,"Auto-Throw","Fire pass when window opens","AutoThrow",function(v) if v and not paidGate("Auto-Throw") then CFG.AutoThrow=false end end) addToggle(P,"Target Switch","Re-target if receiver covered","TargetSwitch",function(v) if v and not paidGate("Target Switch") then CFG.TargetSwitch=false end end) addToggle(P,"Pocket Collapse Detect","Sense rusher pressure on QB","PocketCollapseDetect",function(v) if v and not paidGate("Pocket Collapse") then CFG.PocketCollapseDetect=false end end) addToggle(P,"Accuracy Boost","Zero out pass spread","AccuracyBoost",function(v) if v and not paidGate("Accuracy Boost") then CFG.AccuracyBoost=false end end) end do local P=Pages["Defense"] secHeader("DEFENSIVE TOOLS",P) addToggle(P,"Auto-Swat","Auto swat incoming passes","AutoSwat") addToggle(P,"Auto-Tackle","Auto tackle on contact","AutoTackle") addToggle(P,"Dive Assist","Extend dive reach","DiveAssist") addToggle(P,"Jammer","Stick to receivers","Jammer") addToggle(P,"Auto-Interception","Force catch for turnover","AutoInterception",function(v) if v and not paidGate("Auto-Interception") then CFG.AutoInterception=false end end) addToggle(P,"Block Bypass","Phase through offensive linemen","BlockBypass") addToggle(P,"Fumble Stripper","Max fumble chance on hit","FumbleStripper") addToggle(P,"Auto-Strafe","Lock torso to line of scrimmage","AutoStrafe") secHeader("ADVANCED COVERAGE",P) addToggle(P,"Zone Lock","Snap to nearest receiver route","DefenseZoneLock",function(v) if v and not paidGate("Zone Lock") then CFG.DefenseZoneLock=false end end) addToggle(P,"Auto-Cover Receiver","Mirror receiver position","AutoCoverReceiver",function(v) if v and not paidGate("Auto-Cover Receiver") then CFG.AutoCoverReceiver=false end end) secHeader("HITBOX EVASION ENGINE",P) addToggle(P,"Hitbox Evasion","Auto-dodge incoming tackles","HitboxEvasion",function(v) if v and not paidGate("Hitbox Evasion") then CFG.HitboxEvasion=false end end) addDropdown(P,"Evasion Mode",{"Auto","Left","Right"},"EvasionMode") addSlider(P,"Evasion Radius","Threat detection range (studs)","EvasionRadius",3,20,0.5) addSlider(P,"Evasion Delay","Reaction time (s)","EvasionDelay",0.05,0.4,0.01) addToggle(P,"Juke Sequence","Automated left/right/burst pattern","JukeSequence",function(v) if v and not paidGate("Juke Sequence") then CFG.JukeSequence=false end end) addToggle(P,"Spin Move","Auto 360° spin on tackle","SpinMoveAuto",function(v) if v and not paidGate("Spin Move") then CFG.SpinMoveAuto=false end end) addToggle(P,"Dive Avoid","Jump over incoming dives","DiveAvoid") addToggle(P,"Break Tackle Assist","Velocity burst to shed tackle","BreakTackleAssist",function(v) if v and not paidGate("Break Tackle Assist") then CFG.BreakTackleAssist=false end end) addToggle(P,"Blitz Detect","Alert on 3+ rushing defenders","BlitzDetect") addToggle(P,"In-Bounds Protect","Auto-correct if near sideline","InboundsProtect") secHeader("ANTI-FUMBLE FIREWALL",P) addToggle(P,"Anti-Fumble V2","Full possession lock system","AntiFumbleV2",function(v) if v and not paidGate("Anti-Fumble V2") then CFG.AntiFumbleV2=false end end) addToggle(P,"Fumble Remote Block","Intercept fumble remote calls","FumbleRemoteBlock",function(v) if v and not paidGate("Fumble Remote Block") then CFG.FumbleRemoteBlock=false end end) addToggle(P,"Possession Lock","Continuously assert ball ownership","PossessionLock",function(v) if v and not paidGate("Possession Lock") then CFG.PossessionLock=false end end) addToggle(P,"Velocity Clamp","Cap ball speed on high-impact","VelocityClamp") addSlider(P,"Fumble Velocity Threshold","Speed to trigger clamp (su/s)","FumbleVelocityThreshold",15,80,1) addToggle(P,"Impact Absorption","Dampen player velocity on hits","ImpactAbsorption") end do local P=Pages["Kicker"] secHeader("KICKER TOOLS",P) addToggle(P,"Auto-Power","Auto-stop gauge at target","AutoPower") addSlider(P,"Kick Power Target","Target power %","KickPowerTarget",50,100,0.1) addToggle(P,"Auto-Aim","Align with goalpost center","AutoAim") addToggle(P,"Trajectory Preview","Draw ball path pre-kick","TrajectoryPreview",function(v) if v and not paidGate("Trajectory Preview") then CFG.TrajectoryPreview=false end end) addToggle(P,"Kick Meter Freeze","Freeze needle in green zone","KickMeterFreeze") addSlider(P,"Kick Angle Adjust","Fine-tune horizontal aim","KickAngleAdjust",-15,15,0.5) addButton(P,"Instant Max Kick","100% power + 100% accuracy",function() if not paidGate("Instant Max Kick") then return end notify("Kicker","Instant max kick triggered!",2) for _,r in ipairs(game:GetDescendants()) do if r:IsA("RemoteEvent") then local nm=r.Name:lower() if nm:find("kick") or nm:find("power") then pcall(function()r:FireServer(100,100)end); break end end end end) end do local P=Pages["Player"] secHeader("CHARACTER MODIFIERS",P) addToggle(P,"Speed","Modify run speed","Speed",function(v) local char=LP.Character; local hum=char and char:FindFirstChildOfClass("Humanoid") if hum then hum.WalkSpeed=v and CFG.SpeedValue or 16 end end) addSlider(P,"Speed Value","Run speed (studs/s)","SpeedValue",21,23,0.1,function(val) if not CFG.Speed then return end local char=LP.Character; local hum=char and char:FindFirstChildOfClass("Humanoid") if hum then hum.WalkSpeed=val end end) addToggle(P,"Jump Power","Modify jump height","JumpPower",function(v) local char=LP.Character; local hum=char and char:FindFirstChildOfClass("Humanoid") if hum then hum.JumpPower=v and CFG.JumpPowerValue or 50 end end) addSlider(P,"Jump Power Value","Jump height","JumpPowerValue",50,70,0.1,function(val) if not CFG.JumpPower then return end local char=LP.Character; local hum=char and char:FindFirstChildOfClass("Humanoid") if hum then hum.JumpPower=val end end) addToggle(P,"Angle Enhancer","Sharpen turning radius","AngleEnhancer") addSlider(P,"Angle Enhancer Value","Turning enhancement","AngleEnhancerValue",50,70,0.1) addSlider(P,"Hip Height","Ground offset","HipHeight",0.1,5,0.1,function(val) local char=LP.Character; local hum=char and char:FindFirstChildOfClass("Humanoid") if hum then hum.HipHeight=val end end) end do local P=Pages["Visuals"] secHeader("VISUAL ENHANCEMENTS",P) addSlider(P,"FOV Changer","Camera field of view","FOV",60,120,1,function(val) Cam.FieldOfView=val end) addToggle(P,"Tracer Lines","Lines from screen to receivers","TracerLines",function(v) if v and not paidGate("Tracer Lines") then CFG.TracerLines=false end end) addToggle(P,"Chams Fill","Color players through walls","ChamsFill",function(v) if v and not paidGate("Chams") then CFG.ChamsFill=false end end) addToggle(P,"Distance ESP","Stud distance above ball","DistanceESP",function(v) if v and not paidGate("Distance ESP") then CFG.DistanceESP=false end end) addToggle(P,"Full Bright","Remove shadows and night","FullBright",function(v) Lighting.Brightness=v and 2 or 1 Lighting.GlobalShadows=not v for _,obj in ipairs(Lighting:GetChildren()) do if obj:IsA("ColorCorrectionEffect") or obj:IsA("BlurEffect") or obj:IsA("DepthOfFieldEffect") then pcall(function()obj.Enabled=not v end) end end end) addSlider(P,"Landing Zone Radius","Ball landing indicator size","LandingZoneRadius",1,15,0.1) addToggle(P,"No-Clip","Phase through blockers","NoClip",function(v) notify("Visuals",v and "No-Clip ON" or "No-Clip OFF",2) end) end do local P=Pages["Misc"] secHeader("MISCELLANEOUS",P) addToggle(P,"Anti-Fumble","Lock ball on hard hits","AntiFumble") addToggle(P,"Auto-GG","Say 'gg wp' when clock ends","AutoGG") addSlider(P,"Fake Lag Intensity","Packet delay frequency","FakeLag",0,1,0.1) secHeader("SERVER TOOLS",P) addButton(P,"Server Hop","Find and join a new public server",function() if not paidGate("Server Hop") then return end notify("Server Hop","Searching for servers via Roblox API...",3) task.spawn(function() local placeId=tostring(game.PlaceId) local url="https://games.roblox.com/v1/games/"..placeId.."/servers/Public?sortOrder=Asc&limit=100&excludeFullGames=true" local body=getHttp(url) if not body then notify("Server Hop","⚠ HTTP failed (executor may block Roblox API)",3); return end local ids={} for id in body:gmatch('"id"%s*:%s*"([^"]+)"') do if id~=game.JobId then ids[#ids+1]=id end end if #ids==0 then notify("Server Hop","No other servers found",3); return end local pick=ids[math.random(1,#ids)] notify("Server Hop","Joining server "..pick:sub(1,8).."...",2) task.wait(1) pcall(function()TeleportService:TeleportToPlaceInstance(game.PlaceId,pick,LP)end) end) end) addButton(P,"Rejoin Server","Reconnect to same server",function() notify("Misc","Rejoining...",2) task.spawn(function() task.wait(1) pcall(function()TeleportService:TeleportToPlaceInstance(game.PlaceId,game.JobId,LP)end) end) end) secHeader("REMOTE SPY",P) addToggle(P,"Enable Remote Spy","Intercept all remote calls","SpyerEnabled",function(v) if v and not paidGate("Remote Spy") then CFG.SpyerEnabled=false return end if SpyerWindow then SpyerWindow.Visible=v end notify("Remote Spy",v and "Spyer window opened" or "Spyer hidden",2) end) addToggle(P,"Pause Spy","Pause capturing","SpyerPaused") end do local P=Pages["Settings"] secHeader("CONFIGURATION",P) local _,nameInp=addTextInput(P,"Config Name","e.g. Legit_QB") local function cfgToJson() local parts={} for k,v in pairs(CFG) do local sv if type(v)=="boolean" then sv=v and "true" or "false" else sv='"'..tostring(v)..'"' end parts[#parts+1]='"'..k..'": '..sv end return "{\n "..table.concat(parts,",\n ").."\n}" end addButton(P,"Save Config","Write current settings to file",function() makeFolder("PhantomHub/Configs") local name=(nameInp and nameInp.Text~="") and nameInp.Text or "Config1" writeFile("PhantomHub/Configs/"..name..".json",cfgToJson()) notify("Settings","Saved: "..name,2) end) addButton(P,"Load Config","Load settings from file",function() local name=(nameInp and nameInp.Text~="") and nameInp.Text or "Config1" local data=readFile("PhantomHub/Configs/"..name..".json") if data then pcall(function() for k,v in data:gmatch('"([^"]+)"%s*:%s*"?([^",\n}]+)"?') do if CFG[k]~=nil then if v=="true" then CFG[k]=true elseif v=="false" then CFG[k]=false else local n=tonumber(v); CFG[k]=n or v end end end end) notify("Settings","Loaded: "..name,2) else notify("Settings","File not found: "..name,2) end end) addButton(P,"Export Config String","Copy config as text",function() setClipboard(cfgToJson()) notify("Settings","Config copied to clipboard",2) end) addButton(P,"Reset All Settings","Restore defaults",function() for k,v in pairs(DEFAULTS) do CFG[k]=v end Cam.FieldOfView=70; Lighting.Brightness=1; Lighting.GlobalShadows=true local char=LP.Character; local hum=char and char:FindFirstChildOfClass("Humanoid") if hum then hum.WalkSpeed=16; hum.JumpPower=50; hum.HipHeight=2 end notify("Settings","All settings reset",2) end) secHeader("KEYBIND MANAGER",P) local kbFrame=frm(T.Card,UDim2.new(1,0,0,0),nil,P) kbFrame.AutomaticSize=Enum.AutomaticSize.Y; corner(8,kbFrame) local kbs=stroke(T.Border,1,kbFrame); regThemed(kbs,"Color","Border") regThemed(kbFrame,"BackgroundColor3","Card") listL(0,Enum.FillDirection.Vertical,kbFrame); pad(8,10,8,10,kbFrame) local kbHeader=Instance.new("Frame") kbHeader.BackgroundTransparency=1; kbHeader.Size=UDim2.new(1,0,0,22); kbHeader.Parent=kbFrame local kbH1=lbl("Action",10,T.TextMuted,false,kbHeader); kbH1.Position=UDim2.new(0,0,0,4) regThemed(kbH1,"TextColor3","TextMuted") local kbH2=lbl("Key",10,T.TextMuted,false,kbHeader); kbH2.Position=UDim2.new(1,-60,0,4) regThemed(kbH2,"TextColor3","TextMuted") task.defer(function() for cfgKey,data in pairs(allKeybinds) do local row=Instance.new("Frame"); row.BackgroundTransparency=1 row.Size=UDim2.new(1,0,0,28); row.Parent=kbFrame local rl=lbl(data.label,11,T.TextSub,false,row); rl.Position=UDim2.new(0,0,0,6) regThemed(rl,"TextColor3","TextSub") local rk=lbl(CFG[cfgKey] or "None",11,T.Accent,true,row) rk.Position=UDim2.new(1,-70,0,6); rk.TextXAlignment=Enum.TextXAlignment.Right regThemed(rk,"TextColor3","Accent") local listening=false local rb=Instance.new("TextButton"); rb.BackgroundTransparency=1 rb.Size=UDim2.new(1,0,1,0); rb.Text=""; rb.Parent=row rb.MouseButton1Click:Connect(function() if listening then return end listening=true; rk.Text="..." local c; c=UserInputService.InputBegan:Connect(function(inp) if inp.UserInputType==Enum.UserInputType.Keyboard then CFG[cfgKey]=inp.KeyCode.Name; rk.Text=CFG[cfgKey] if data.btn then data.btn.Text=CFG[cfgKey] end listening=false; c:Disconnect() end end) end) end end) secHeader("THEMES",P) local themeRow=frm(T.Card,UDim2.new(1,0,0,72),nil,P) corner(8,themeRow); local trs=stroke(T.Border,1,themeRow) regThemed(themeRow,"BackgroundColor3","Card"); regThemed(trs,"Color","Border") listL(0,Enum.FillDirection.Horizontal,themeRow); pad(12,12,12,12,themeRow) local THEME_COLORS={Dark=Color3.fromRGB(204,18,18),Blood=Color3.fromRGB(220,0,0),Midnight=Color3.fromRGB(68,102,255),Carbon=Color3.fromRGB(150,150,150)} local THEME_NAMES={"Dark","Blood","Midnight","Carbon"} for _,tname in ipairs(THEME_NAMES) do local col=Instance.new("Frame"); col.BackgroundTransparency=1 col.Size=UDim2.new(0,80,1,0); col.Parent=themeRow local orb=frm(THEME_COLORS[tname],UDim2.new(0,32,0,32),nil,col) orb.Position=UDim2.new(0.5,-16,0,4); corner(16,orb) if tname~="Dark" then local lock=lbl("🔒",12,Color3.fromRGB(150,150,150),false,orb) lock.Position=UDim2.new(0.5,-8,0.5,-8) lock.Name="LockIcon" end local nl=lbl(tname,9,T.TextMuted,false,col); nl.Position=UDim2.new(0.5,-20,0,40) local tb=Instance.new("TextButton"); tb.BackgroundTransparency=1 tb.Size=UDim2.new(1,0,1,0); tb.Text=""; tb.Parent=col tb.MouseButton1Click:Connect(function() if tname~="Dark" and TIER~="PAID" then notify("Themes","⚠ Themes require Paid access",3); return end applyTheme(tname); CFG.ActiveTheme=tname notify("Phantom Hub","Theme: "..tname,1.5) for _,ch in ipairs(themeRow:GetChildren()) do if ch:IsA("Frame") then for _,sub in ipairs(ch:GetChildren()) do if sub:IsA("Frame") then local lk=sub:FindFirstChild("LockIcon") if lk then lk.TextTransparency=TIER=="PAID" and 1 or 0 end end end end end end) end secHeader("PREFERENCES",P) addKeybind(P,"Menu Hotkey","MenuHotkey") addToggle(P,"Streamer Mode","Hide username","StreamerMode",function(v) SubText.Text=v and "Football Fusion 3 • ████" or "Football Fusion 3 • v"..VERSION end) addToggle(P,"Notifications","Show feature pop-ups","Notifications") addSlider(P,"Watermark Opacity","Script logo visibility","WatermarkOpacity",0,1,0.1) addToggle(P,"FPS Unlocker","Remove 60fps frame cap","FPSUnlocker",function(v) if type(setfpscap)=="function" then pcall(setfpscap,v and 0 or 60) end end) end tabActivators["Magnet"]() local SpyLogs={} local spyPaused=false local SPY_W,SPY_H=520,340 SpyerWindow=Instance.new("Frame") SpyerWindow.Name="SpyerWindow" SpyerWindow.BackgroundColor3=T.SpyBG SpyerWindow.Size=UDim2.new(0,SPY_W,0,SPY_H) SpyerWindow.Position=UDim2.new(0.5,-SPY_W/2,0.1,0) SpyerWindow.BorderSizePixel=0 SpyerWindow.ClipsDescendants=true SpyerWindow.Visible=false SpyerWindow.ZIndex=500 SpyerWindow.Parent=ScreenGui corner(10,SpyerWindow) local spystroke=stroke(T.Accent,1.5,SpyerWindow) regThemed(spystroke,"Color","Accent") local spyTitle=frm(T.SidebarBG,UDim2.new(1,0,0,36),UDim2.new(0,0,0,0),SpyerWindow) regThemed(spyTitle,"BackgroundColor3","SidebarBG") local stL=lbl("🔬 PHANTOM SPY",13,T.TextMain,true,spyTitle); stL.Position=UDim2.new(0,12,0.5,-8) local spyCount=lbl("0 fires",11,T.TextMuted,false,spyTitle); spyCount.Position=UDim2.new(1,-160,0.5,-7) regThemed(spyCount,"TextColor3","TextMuted") local clearBtn=Instance.new("TextButton"); clearBtn.BackgroundColor3=Color3.fromRGB(204,18,18) clearBtn.Size=UDim2.new(0,54,0,22); clearBtn.Position=UDim2.new(1,-124,0.5,-11) clearBtn.Text="CLEAR"; clearBtn.TextColor3=Color3.fromRGB(255,255,255) clearBtn.Font=Enum.Font.GothamBold; clearBtn.TextSize=9; clearBtn.BorderSizePixel=0; clearBtn.Parent=spyTitle corner(6,clearBtn) local cpAllBtn=Instance.new("TextButton"); cpAllBtn.BackgroundColor3=Color3.fromRGB(30,30,30) cpAllBtn.Size=UDim2.new(0,60,0,22); cpAllBtn.Position=UDim2.new(1,-64,0.5,-11) cpAllBtn.Text="COPY ALL"; cpAllBtn.TextColor3=Color3.fromRGB(200,200,200) cpAllBtn.Font=Enum.Font.GothamBold; cpAllBtn.TextSize=9; cpAllBtn.BorderSizePixel=0; cpAllBtn.Parent=spyTitle corner(6,cpAllBtn) local spyClosBtn=Instance.new("TextButton"); spyClosBtn.BackgroundTransparency=1 spyClosBtn.Size=UDim2.new(0,24,0,24); spyClosBtn.Position=UDim2.new(1,-30,0.5,-12) spyClosBtn.Text="✕"; spyClosBtn.TextColor3=T.TextMuted; spyClosBtn.Font=Enum.Font.Gotham spyClosBtn.TextSize=13; spyClosBtn.Parent=spyTitle spyClosBtn.MouseButton1Click:Connect(function()SpyerWindow.Visible=false;CFG.SpyerEnabled=false end) local spySearchBar=frm(T.Surface,UDim2.new(1,0,0,28),UDim2.new(0,0,0,36),SpyerWindow) regThemed(spySearchBar,"BackgroundColor3","Surface") local spySearchBox=Instance.new("TextBox"); spySearchBox.BackgroundTransparency=1 spySearchBox.Size=UDim2.new(1,-12,1,0); spySearchBox.Position=UDim2.new(0,6,0,0) spySearchBox.Text=""; spySearchBox.PlaceholderText="Filter remotes..." spySearchBox.PlaceholderColor3=T.TextMuted; spySearchBox.TextColor3=T.TextMain spySearchBox.Font=Enum.Font.Gotham; spySearchBox.TextSize=11 spySearchBox.TextXAlignment=Enum.TextXAlignment.Left; spySearchBox.Parent=spySearchBar regThemed(spySearchBox,"TextColor3","TextMain") local spyList=scroll(UDim2.new(1,0,1,-64),UDim2.new(0,0,0,64),SpyerWindow) spyList.ScrollBarThickness=3; spyList.ScrollBarImageColor3=T.Accent listL(2,Enum.FillDirection.Vertical,spyList); pad(4,4,4,4,spyList) do local sd,ss2,sp2,sti=false,nil,nil,nil spyTitle.InputBegan:Connect(function(inp) local isT=inp.UserInputType==Enum.UserInputType.Touch local isM=inp.UserInputType==Enum.UserInputType.MouseButton1 if (isT or isM) and not sd then sd=true; ss2=inp.Position; sp2=SpyerWindow.Position; sti=isT and inp.TouchId or nil end end) track(UserInputService.InputChanged:Connect(function(inp) if not sd then return end local isT=inp.UserInputType==Enum.UserInputType.Touch local isM=inp.UserInputType==Enum.UserInputType.MouseMovement if isT and inp.TouchId~=sti then return end if isT or isM then local d=inp.Position-ss2 SpyerWindow.Position=UDim2.new(sp2.X.Scale,sp2.X.Offset+d.X,sp2.Y.Scale,sp2.Y.Offset+d.Y) end end)) track(UserInputService.InputEnded:Connect(function(inp) local isT=inp.UserInputType==Enum.UserInputType.Touch local isM=inp.UserInputType==Enum.UserInputType.MouseButton1 if isT and inp.TouchId~=sti then return end if isT or isM then sd=false;sti=nil end end)) end local function serializeArgs(...) local args={...}; local parts={} for i,v in ipairs(args) do local t=typeof(v) if t=="string" then parts[i]='"'..v:sub(1,28)..'"' elseif t=="number" then parts[i]=string.format("%.3g",v) elseif t=="boolean" then parts[i]=tostring(v) elseif t=="Instance" then parts[i]=v:GetFullName() elseif t=="Vector3" then parts[i]=string.format("V3(%.1f,%.1f,%.1f)",v.X,v.Y,v.Z) elseif t=="CFrame" then parts[i]="CF(...)" elseif t=="table" then parts[i]="{table}" else parts[i]=t end end return table.concat(parts,", ") end local totalFires=0 local function addSpyEntry(method,remote,argsStr) totalFires=totalFires+1 spyCount.Text=totalFires.." fires" local entry={method=method,path=remote:GetFullName(),args=argsStr,time=os.clock()} table.insert(SpyLogs,1,entry) if #SpyLogs>500 then table.remove(SpyLogs) end local q=spySearchBox.Text:lower() if q~="" and not entry.path:lower():find(q,1,true) then return end local row=frm(T.Card,UDim2.new(1,0,0,44),nil,spyList) row.Name="SpyRow" local rowStroke=stroke(T.Border,1,row); corner(6,row) regThemed(row,"BackgroundColor3","Card"); regThemed(rowStroke,"Color","Border") local methodCol=method=="FireServer" and T.SpyFire or (method=="InvokeServer" and T.SpyInvoke or T.TextSub) local mL=lbl("["..method.."]",9,methodCol,true,row); mL.Position=UDim2.new(0,8,0,6) local pL=lbl(entry.path:sub(-40),10,T.TextMain,false,row); pL.Position=UDim2.new(0,8,0,20) regThemed(pL,"TextColor3","TextMain") local aL=lbl(argsStr~="" and "("..argsStr:sub(1,60)..")" or "()",9,T.TextMuted,false,row) aL.Position=UDim2.new(0,8,1,-18); regThemed(aL,"TextColor3","TextMuted") local copyBtn=Instance.new("TextButton"); copyBtn.BackgroundColor3=Color3.fromRGB(30,30,30) copyBtn.Size=UDim2.new(0,44,0,20); copyBtn.Position=UDim2.new(1,-52,0.5,-10) copyBtn.Text="COPY"; copyBtn.TextColor3=T.Accent; copyBtn.Font=Enum.Font.GothamBold copyBtn.TextSize=8; copyBtn.BorderSizePixel=0; copyBtn.Parent=row; corner(5,copyBtn) copyBtn.MouseButton1Click:Connect(function() local code='local remote=game:GetService("ReplicatedStorage"):FindFirstChild("'..remote.Name..'")\nif remote then remote:'..method..'('..argsStr..') end' setClipboard(code) copyBtn.Text="✓" task.delay(1.5,function()copyBtn.Text="COPY"end) end) spySearchBox:GetPropertyChangedSignal("Text"):Connect(function() local q2=spySearchBox.Text:lower() row.Visible=q2=="" or entry.path:lower():find(q2,1,true)~=nil end) local children=spyList:GetChildren() local rowCount=0 for _,c in ipairs(children) do if c.Name=="SpyRow" then rowCount=rowCount+1 end end if rowCount>100 then for _,c in ipairs(children) do if c.Name=="SpyRow" then c:Destroy(); break end end end end clearBtn.MouseButton1Click:Connect(function() SpyLogs={}; totalFires=0; spyCount.Text="0 fires" for _,c in ipairs(spyList:GetChildren()) do if c.Name=="SpyRow" then c:Destroy() end end end) cpAllBtn.MouseButton1Click:Connect(function() local parts={} for _,e in ipairs(SpyLogs) do parts[#parts+1]=e.path..":"..e.method.."("..e.args..")" end setClipboard(table.concat(parts,"\n")) notify("Remote Spy","All logs copied to clipboard",2) end) if type(getrawmetatable)=="function" and type(setreadonly)=="function" then pcall(function() local mt=getrawmetatable(game) local oldNC=mt.__namecall setreadonly(mt,false) mt.__namecall=newCClosure(function(self,...) local method=getnamecallmethod and getnamecallmethod() or "" if CFG.SpyerEnabled and not CFG.SpyerPaused then if (method=="FireServer" or method=="InvokeServer" or method=="FireAllClients") and typeof(self)=="Instance" and (self:IsA("RemoteEvent") or self:IsA("RemoteFunction")) then local ok,args=pcall(serializeArgs,...) task.defer(function() pcall(addSpyEntry,method,self,ok and args or "") end) end end return oldNC(self,...) end) setreadonly(mt,true) end) end local WMFrame=Instance.new("Frame") WMFrame.BackgroundColor3=T.Card; WMFrame.Size=UDim2.new(0,170,0,28) WMFrame.Position=UDim2.new(0,10,0,10) WMFrame.BackgroundTransparency=1-CFG.WatermarkOpacity; WMFrame.Parent=ScreenGui corner(6,WMFrame); stroke(T.Border,1,WMFrame) local WMLabel=Instance.new("TextLabel"); WMLabel.Text="✦ PHANTOM HUB" WMLabel.TextColor3=T.Accent; WMLabel.Font=Enum.Font.GothamBold; WMLabel.TextSize=11 WMLabel.BackgroundTransparency=1; WMLabel.Size=UDim2.new(1,0,1,0) WMLabel.TextXAlignment=Enum.TextXAlignment.Center; WMLabel.Parent=WMFrame regThemed(WMLabel,"TextColor3","Accent") track(RunService.Heartbeat:Connect(function() WMFrame.BackgroundTransparency=1-CFG.WatermarkOpacity WMLabel.TextTransparency=1-CFG.WatermarkOpacity end)) local FloatBtn=Instance.new("TextButton") FloatBtn.BackgroundColor3=T.BG; FloatBtn.Size=UDim2.new(0,50,0,50) FloatBtn.Position=UDim2.new(0,16,0.5,-25); FloatBtn.Text="✦" FloatBtn.TextColor3=T.Accent; FloatBtn.Font=Enum.Font.GothamBold; FloatBtn.TextSize=22 FloatBtn.BorderSizePixel=0; FloatBtn.ZIndex=10; FloatBtn.Parent=ScreenGui corner(25,FloatBtn); stroke(T.Accent,2,FloatBtn) regThemed(FloatBtn,"TextColor3","Accent") task.spawn(function() while FloatBtn.Parent do tw(FloatBtn,{BackgroundColor3=Color3.fromRGB(30,5,5)},1.4,Enum.EasingStyle.Sine) task.wait(1.4) tw(FloatBtn,{BackgroundColor3=T.BG},1.4,Enum.EasingStyle.Sine) task.wait(1.4) end end) do local fd,fs,fp,fti=false,nil,nil,nil track(FloatBtn.InputBegan:Connect(function(inp) local isT=inp.UserInputType==Enum.UserInputType.Touch local isM=inp.UserInputType==Enum.UserInputType.MouseButton1 if (isT or isM) and not fd then fd=true; fs=inp.Position; fp=FloatBtn.Position; fti=isT and inp.TouchId or nil end end)) track(UserInputService.InputChanged:Connect(function(inp) if not fd then return end local isT=inp.UserInputType==Enum.UserInputType.Touch local isM=inp.UserInputType==Enum.UserInputType.MouseMovement if isT and inp.TouchId~=fti then return end if isT or isM then local d=inp.Position-fs if math.abs(d.X)>4 or math.abs(d.Y)>4 then FloatBtn.Position=UDim2.new(fp.X.Scale,fp.X.Offset+d.X,fp.Y.Scale,fp.Y.Offset+d.Y) end end end)) track(UserInputService.InputEnded:Connect(function(inp) local isT=inp.UserInputType==Enum.UserInputType.Touch local isM=inp.UserInputType==Enum.UserInputType.MouseButton1 if isT and inp.TouchId~=fti then return end if isT or isM then fd=false;fti=nil end end)) end local guiOpen=true local function toggleGui() guiOpen=not guiOpen if guiOpen then MainFrame.Visible=true MainFrame.Size=UDim2.new(0,WIN_W,0,0) MainFrame.Position=UDim2.new(0.5,-WIN_W/2,0.5,0) tw(MainFrame,{Size=UDim2.new(0,WIN_W,0,WIN_H),Position=UDim2.new(0.5,-WIN_W/2,0.5,-WIN_H/2)},0.28,Enum.EasingStyle.Back) else tw(MainFrame,{Size=UDim2.new(0,WIN_W,0,0),Position=UDim2.new(0.5,-WIN_W/2,0.5,0)},0.2) task.delay(0.22,function()MainFrame.Visible=false end) end end FloatBtn.MouseButton1Click:Connect(toggleGui) track(UserInputService.InputBegan:Connect(function(inp,gp) if gp then return end if inp.UserInputType~=Enum.UserInputType.Keyboard then return end local kn=inp.KeyCode.Name if kn==CFG.MenuHotkey then toggleGui() end if kn==CFG.MagnetHotkey then CFG.Magnet=not CFG.Magnet notify("Magnet",CFG.Magnet and "Magnet ON (hotkey)" or "Magnet OFF (hotkey)",2) end end)) track(RunService.Stepped:Connect(function() if not CFG.NoClip then return end local char=LP.Character; if not char then return end for _,p in ipairs(char:GetDescendants()) do if p:IsA("BasePart") then p.CanCollide=false end end end)) track(RunService.Heartbeat:Connect(function() local char=LP.Character; local hum=char and char:FindFirstChildOfClass("Humanoid") if not hum then return end if CFG.Speed then hum.WalkSpeed=CFG.SpeedValue end if CFG.JumpPower then hum.JumpPower=CFG.JumpPowerValue end end)) track(RunService.RenderStepped:Connect(function() if not CFG.FullBright then return end Lighting.Brightness=2; Lighting.ClockTime=14; Lighting.GlobalShadows=false end)) track(RunService.RenderStepped:Connect(function() if not CFG.Magnet then return end local char=LP.Character; local hrp=char and char:FindFirstChild("HumanoidRootPart") if not hrp then return end local ball=findBall(); if not ball then return end local dist=(ball.Position-hrp.Position).Magnitude if dist>CFG.MagnetRadius then return end if CFG.AngleLock then local dir=(ball.Position-hrp.Position).Unit if hrp.CFrame.LookVector:Dot(dir)<0.3 then return end end if CFG.MagnetType=="Blatant" then pcall(function()ball.CFrame=hrp.CFrame*CFrame.new(0,2,-1)end) else pcall(function()ball.CFrame=ball.CFrame:Lerp(hrp.CFrame*CFrame.new(0,2,-1),0.22)end) end if CFG.AutoCatch then task.delay(CFG.AutoCatchDelay,function() for _,r in ipairs(game:GetDescendants()) do if r:IsA("RemoteEvent") then local nm=r.Name:lower() if nm:find("catch") or nm:find("secure") then pcall(function()r:FireServer()end); break end end end end) end end)) track(RunService.Heartbeat:Connect(function() if not CFG.BlockBypass then return end local char=LP.Character; if not char then return end for _,p in ipairs(char:GetDescendants()) do if p:IsA("BasePart") then p.CollisionGroup=pcall(function()end) and p.CollisionGroup or p.CollisionGroup end end end)) track(RunService.Heartbeat:Connect(function() if not CFG.AutoCoverReceiver then return end local char=LP.Character; local hrp=char and char:FindFirstChild("HumanoidRootPart") if not hrp then return end local closest,closestDist=nil,math.huge for _,plr in ipairs(Players:GetPlayers()) do if plr==LP then continue end local tChar=plr.Character; local tHRP=tChar and tChar:FindFirstChild("HumanoidRootPart") if tHRP then local d=(tHRP.Position-hrp.Position).Magnitude if d30 then fired=false end break end end end end end) do if getgenv and not getgenv().PhantomHubLoaded then getgenv().PhantomHubLoaded = true end local _ENV_SHIELD = {} local function shieldGlobal(k) local genv = getgenv and getgenv() or _G local v = rawget(genv, k) if v ~= nil then _ENV_SHIELD[k] = v end end pcall(shieldGlobal, "PhantomHubLoaded") local _TELEM_LIST = {"LogService","StatsService","HttpService"} for _, sn in ipairs(_TELEM_LIST) do pcall(function() local _ = game:GetService(sn) end) end end local MagEngine = {} MagEngine.LastBallPos = nil MagEngine.PredictedPos = nil MagEngine.SpinAngle = 0 MagEngine.BallHistory = {} MagEngine.TargetQueue = {} MagEngine.DiveCatchFired = false MagEngine.LastCapture = 0 local GRAVITY_V3 = Vector3.new(0, -196.2, 0) local function magPushHistory(pos) table.insert(MagEngine.BallHistory, 1, {pos=pos, t=os.clock()}) if #MagEngine.BallHistory > 20 then table.remove(MagEngine.BallHistory) end end local function magEstimateVel() local h = MagEngine.BallHistory if #h < 3 then return Vector3.new(0,0,0) end local dt = h[1].t - h[3].t if dt <= 0 then return Vector3.new(0,0,0) end return (h[1].pos - h[3].pos) / dt end local function magPredictPos(p0, vel, t) return p0 + vel * t + 0.5 * GRAVITY_V3 * t * t end local function magComputeTOF(origin, target, vel) local hDist = Vector3.new(target.X-origin.X, 0, target.Z-origin.Z).Magnitude local hSpd = Vector3.new(vel.X, 0, vel.Z).Magnitude if hSpd < 0.1 then return 0.5 end return math.clamp(hDist / hSpd, 0.05, 2.0) end local function magValidateAngle(hrp, ballPos, ballVel) if not CFG.AngleLock then return true end if ballVel.Magnitude < 0.5 then return true end local towardPlayer = (-ballVel).Unit local dot = math.clamp(towardPlayer:Dot(hrp.CFrame.LookVector), -1, 1) return math.deg(math.acos(dot)) <= ((CFG.CatchAngleWindow or 100) / 2) end local function magCatchHeight(hrp) local base = CFG.MagHeight or 6 local bias = CFG.CatchHeightBias or 0.5 local char = LP.Character local headY = (char and char:FindFirstChild("Head") and char:FindFirstChild("Head").Position.Y) or (hrp.Position.Y + 2) local ballY = (CachedBall and CachedBall.Position.Y) or headY if ballY > headY + 1 then return base + bias * 1.5 end if ballY < hrp.Position.Y - 0.5 then return math.max(0.5, base - bias * 2) end return base end local function magCatchCF(hrp) local catchH = magCatchHeight(hrp) if not CFG.BallSpinComp then return hrp.CFrame * CFrame.new(0, catchH, -1) end local lat = math.sin(MagEngine.SpinAngle) * 0.4 return hrp.CFrame * CFrame.new(lat, catchH, -1) end local function magModeLegit(hrp, ball, dt) local vel = magEstimateVel() local tof = magComputeTOF(ball.Position, hrp.Position, vel) MagEngine.PredictedPos = magPredictPos(ball.Position, vel, tof * (CFG.BallLeadFactor or 1)) local catchCF = magCatchCF(hrp) local predicted = MagEngine.PredictedPos local blendedCF = catchCF if predicted and CFG.PredictiveCatch then local catchPos = catchCF.Position local blendedPos = Vector3.new( predicted.X * 0.55 + catchPos.X * 0.45, catchPos.Y, predicted.Z * 0.55 + catchPos.Z * 0.45) blendedCF = CFrame.new(blendedPos) * catchCF.Rotation end local lerpAmt = math.clamp(dt * (4 + (CFG.MagnetRadius or 10) / 5), 0.05, 0.28) pcall(function() ball.CFrame = ball.CFrame:Lerp(blendedCF, lerpAmt) end) end local function magModeSemi(hrp, ball, dt) local rng = Random.new() local jit = Vector3.new(rng:NextNumber(-0.08,0.08), rng:NextNumber(-0.04,0.04), rng:NextNumber(-0.08,0.08)) local catchCF = magCatchCF(hrp) pcall(function() ball.CFrame = ball.CFrame:Lerp(catchCF * CFrame.new(jit.X, jit.Y, jit.Z), math.clamp(dt * 8, 0.08, 0.45)) end) end local function magModeBlatant(hrp, ball) local catchCF = magCatchCF(hrp) pcall(function() ball.CFrame = catchCF ball.AssemblyLinearVelocity = Vector3.new(0,0,0) ball.AssemblyAngularVelocity = Vector3.new(0,0,0) end) end local function magAbsorbMomentum(hrp, ball) if not CFG.MomentumAbsorb then return end local pVel = Vector3.new(0,0,0) pcall(function() pVel = hrp.AssemblyLinearVelocity end) pcall(function() ball.AssemblyLinearVelocity = pVel * 0.5 end) end local _secureCd = 0 local function magAutoSecure(hrp, ball) if not CFG.AutoSecure then return end local now = os.clock() if now - _secureCd < 0.35 then return end if (ball.Position - hrp.Position).Magnitude > (CFG.MagnetRadius or 10) * 0.4 then return end _secureCd = now task.spawn(function() task.wait(CFG.AutoCatchDelay or 0.3) pcall(function() for _, r in ipairs(game:GetDescendants()) do if r:IsA("RemoteEvent") then local nm = r.Name:lower() if nm:find("catch") or nm:find("secure") or nm:find("possess") then r:FireServer(); break end end end end) end) end local _possAssertCd = 0 local function magAssertPossession(hrp, ball) if not CFG.PossessionAssert then return end local now = os.clock() if now - _possAssertCd < (CFG.BallOwnershipTick or 0.05) then return end if (ball.Position - hrp.Position).Magnitude > (CFG.MagnetRadius or 10) then return end _possAssertCd = now pcall(function() for _, r in ipairs(game:GetDescendants()) do if r:IsA("RemoteEvent") then local nm = r.Name:lower() if nm:find("possess") or nm:find("own") or nm:find("hold") then r:FireServer(true); break end end end end) end local function magDiveCatch(hrp, ball, hum) if not CFG.DiveCatch then return end if MagEngine.DiveCatchFired then return end local dist = (ball.Position - hrp.Position).Magnitude if dist < 2 or dist > (CFG.MagnetRadius or 10) * 1.4 then return end if ball.Position.Y - hrp.Position.Y > 3 then return end MagEngine.DiveCatchFired = true pcall(function() for _, r in ipairs(game:GetDescendants()) do if r:IsA("RemoteEvent") then local nm = r.Name:lower() if nm:find("dive") or nm:find("lunge") or nm:find("reach") then r:FireServer(); break end end end end) task.delay(1.2, function() MagEngine.DiveCatchFired = false end) end local function magUpdatePriorityQueue(hrp) if not CFG.CatchPriority then return end MagEngine.TargetQueue = {} for _, obj in ipairs(workspace:GetDescendants()) do if obj:IsA("BasePart") and not obj.Anchored then local nm = obj.Name:lower() if nm:find("football") or nm == "ball" then local dist = (obj.Position - hrp.Position).Magnitude local vel = magEstimateVel() local toBall = obj.Position - hrp.Position local approachScore = toBall.Magnitude > 0.01 and (-vel:Dot(toBall.Unit)) or 0 local score = (1 / math.max(dist, 0.1)) + approachScore * 0.5 table.insert(MagEngine.TargetQueue, {ball=obj, score=score}) end end end table.sort(MagEngine.TargetQueue, function(a,b) return a.score > b.score end) end task.spawn(function() while true do task.wait(0.5) local char = LP.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if hrp and CFG.CatchPriority then pcall(magUpdatePriorityQueue, hrp) end end end) track(RunService.RenderStepped:Connect(function(dt) if not CFG.MagEngineActive and not CFG.Magnet then return end local char = LP.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") local hum = char and char:FindFirstChildOfClass("Humanoid") if not hrp or not hum then return end local ball if CFG.CatchPriority and #MagEngine.TargetQueue > 0 then ball = MagEngine.TargetQueue[1].ball if not ball or not ball.Parent then ball = findBall() end else ball = findBall() end if not ball then return end magPushHistory(ball.Position) MagEngine.SpinAngle = (MagEngine.SpinAngle + dt * 6.28) % (math.pi * 2) local dist = (ball.Position - hrp.Position).Magnitude if dist > (CFG.MagnetRadius or 10) then local vel = magEstimateVel() local tof = magComputeTOF(ball.Position, hrp.Position, vel) MagEngine.PredictedPos = magPredictPos(ball.Position, vel, tof * (CFG.BallLeadFactor or 1)) if CFG.PreSnapPosition and MagEngine.PredictedPos then local interceptDist = (MagEngine.PredictedPos - hrp.Position).Magnitude if interceptDist < 30 then pcall(function() hum:MoveTo(MagEngine.PredictedPos) end) end end return end local vel = magEstimateVel() if not magValidateAngle(hrp, ball.Position, vel) then return end local mode = CFG.MagnetType or "Legit" if CFG.MagEngineActive then mode = CFG.MagEngineMode end if mode == "Blatant" then magModeBlatant(hrp, ball) elseif mode == "Semi" then magModeSemi (hrp, ball, dt) else magModeLegit (hrp, ball, dt) end magAbsorbMomentum (hrp, ball) magAutoSecure (hrp, ball) magAssertPossession(hrp, ball) magDiveCatch (hrp, ball, hum) MagEngine.LastCapture = os.clock() end)) local QBEngine = {} QBEngine.BestReceiver = nil QBEngine.PocketHealth = 1.0 QBEngine.ScrambleActive = false QBEngine.FrameIdx = 0 QBEngine.Overlay = nil local QB_SPEED = {Bullet=120, Touch=80, Lob=55, Dime=45} local QB_G = 196.2 local function qbLaunchAngle(hDist, hDiff, v) if v <= 0 or hDist < 0.01 then return math.pi/4 end local v2 = v * v local disc = v2*v2 - QB_G*(QB_G*hDist*hDist + 2*hDiff*v2) if disc < 0 then return nil end return math.atan((v2 - math.sqrt(disc)) / (QB_G * hDist)) end local function qbAirTime(angle, v, hDist) local vx = v * math.cos(angle) if vx < 0.01 then return 0.5 end return math.clamp(hDist / vx, 0.05, 3.0) end local function qbAutoType(dist) if dist < 15 then return "Touch" elseif dist < 38 then return "Bullet" elseif dist < 65 then return "Lob" else return "Dime" end end local function qbDefMap() local m = {} for _, plr in ipairs(Players:GetPlayers()) do if plr == LP then continue end local tChar = plr.Character local tHRP = tChar and tChar:FindFirstChild("HumanoidRootPart") if tHRP then m[plr.UserId] = tHRP end end return m end local function qbScoreReceiver(recHRP, hrp, defMap) if not recHRP then return -math.huge end local dist = (recHRP.Position - hrp.Position).Magnitude if dist > 200 or dist < 3 then return -math.huge end local distScore = 1 - math.abs(dist - 35) / 100 local minDef = math.huge for uid, dHRP in pairs(defMap) do if dHRP ~= recHRP then local d = (recHRP.Position - dHRP.Position).Magnitude if d < minDef then minDef = d end end end local sepScore = math.min((minDef == math.huge and 20 or minDef) / 20, 1.0) local toRec = (recHRP.Position - hrp.Position) local fwdScore = toRec.Magnitude > 0 and math.max(0, hrp.CFrame.LookVector:Dot(toRec.Unit)) or 0 return distScore*0.3 + sepScore*0.5 + fwdScore*0.2 end local function qbSelectBest(hrp, defMap) local best, bestS = nil, -math.huge for _, plr in ipairs(Players:GetPlayers()) do if plr == LP then continue end local tChar = plr.Character local tHRP = tChar and tChar:FindFirstChild("HumanoidRootPart") if not tHRP then continue end local s = qbScoreReceiver(tHRP, hrp, defMap) if s > bestS then bestS=s; best={plr=plr, hrp=tHRP, score=s} end end return best end local function qbComputeLead(hrp, recHRP, passType) local spd = (QB_SPEED[passType] or QB_SPEED.Bullet) * (CFG.PassPowerScale or 1.0) local recVel = Vector3.new(0,0,0) pcall(function() recVel = recHRP.AssemblyLinearVelocity end) local targetPos = recHRP.Position local throwOrig = hrp.Position + Vector3.new(0,5,0) for _ = 1, 4 do local toT = targetPos - throwOrig local hDist = Vector3.new(toT.X,0,toT.Z).Magnitude local hDiff = toT.Y local angle = qbLaunchAngle(hDist, hDiff, spd) if not angle then spd=spd*1.15; angle=math.pi/4 end local tof = qbAirTime(angle, spd, hDist) local hLead = 0 if passType=="Lob" then hLead = (CFG.AngleHeight or 8) * 0.15 elseif passType=="Dime" then hLead = (CFG.DimeHeight or 20) * 0.15 elseif passType=="Bullet" then hLead = (CFG.MagHeight or 2) * 0.05 end targetPos = recHRP.Position + recVel*tof + Vector3.new(0, hLead, 0) end return throwOrig, targetPos end local function qbEvalPocket(hrp, defMap) local count = 0 for _, dHRP in pairs(defMap) do if (dHRP.Position - hrp.Position).Magnitude < 12 then count=count+1 end end QBEngine.PocketHealth = math.max(0, 1 - count*0.3) return QBEngine.PocketHealth end local function qbScrambleDir(hrp, defMap) local cDir, cDist = nil, math.huge for _, dHRP in pairs(defMap) do local d = (dHRP.Position-hrp.Position).Magnitude if d < cDist then cDist=d; cDir=(dHRP.Position-hrp.Position).Unit end end if not cDir then return hrp.CFrame.LookVector end return Vector3.new(-cDir.Z, 0, cDir.X) end local function qbIsCovered(recHRP, defMap) local thresh = CFG.MinReceiverSep or 8 for _, dHRP in pairs(defMap) do if (dHRP.Position - recHRP.Position).Magnitude < thresh then return true end end return false end local function qbInitOverlay() if QBEngine.Overlay then return end local ol = Instance.new("TextLabel") ol.BackgroundTransparency=1; ol.Size=UDim2.new(0,220,0,22) ol.Position=UDim2.new(0.5,-110,0.12,0) ol.Font=Enum.Font.GothamBold; ol.TextSize=12 ol.TextColor3=T.Accent; ol.TextStrokeTransparency=0.5 ol.TextXAlignment=Enum.TextXAlignment.Center ol.Text=""; ol.ZIndex=50; ol.Parent=ScreenGui QBEngine.Overlay = ol end local function qbUpdateOverlay(best, passType, pocket) if not QBEngine.Overlay then return end if not CFG.QBAPassing then QBEngine.Overlay.Text=""; return end local hrp = LP.Character and LP.Character:FindFirstChild("HumanoidRootPart") if not best then QBEngine.Overlay.Text="No open receiver" QBEngine.Overlay.TextColor3=Color3.fromRGB(180,80,80); return end local dist = hrp and math.floor((best.hrp.Position-hrp.Position).Magnitude) or 0 QBEngine.Overlay.Text=string.format("✦ %s %ds [%s] Pocket:%d%%", best.plr.Name:sub(1,9), dist, passType, math.floor(pocket*100)) QBEngine.Overlay.TextColor3 = pocket>0.5 and T.Accent or Color3.fromRGB(255,120,40) end local _autoThrowCd = 0 local function qbAutoThrow(hrp, targetPos, best, passType) if not CFG.AutoThrow then return end if not best or QBEngine.PocketHealth<0.15 then return end local now = os.clock() if now - _autoThrowCd < (CFG.ThrowWindow or 0.35) then return end _autoThrowCd = now task.spawn(function() pcall(function() for _, r in ipairs(game:GetDescendants()) do if r:IsA("RemoteEvent") then local nm = r.Name:lower() if nm:find("throw") or nm:find("pass") or nm:find("release") then r:FireServer(targetPos, best.plr) break end end end end) end) end local function qbAccuracyBoost() if not CFG.AccuracyBoost then return end pcall(function() for _, r in ipairs(game:GetDescendants()) do if r:IsA("RemoteEvent") then local nm = r.Name:lower() if nm:find("accuracy") or nm:find("spread") then r:FireServer(0); return end end end end) end local _qbTick = 0; local _swCd = 0 track(RunService.Heartbeat:Connect(function(dt) if not CFG.QBAPassing then if QBEngine.Overlay then QBEngine.Overlay.Text="" end QBEngine.ScrambleActive=false; return end QBEngine.FrameIdx = QBEngine.FrameIdx + 1 local char = LP.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") local hum = char and char:FindFirstChildOfClass("Humanoid") if not hrp or not hum then return end qbInitOverlay() _qbTick = _qbTick + dt if _qbTick < 0.05 then return end _qbTick = 0 local defMap = qbDefMap() local pocket = qbEvalPocket(hrp, defMap) if CFG.AutoQBScramble and pocket < 0.4 then QBEngine.ScrambleActive = true local escDir = qbScrambleDir(hrp, defMap) local escPos = hrp.Position + escDir*14 pcall(function() hum:MoveTo(Vector3.new(escPos.X, hrp.Position.Y, escPos.Z)) end) else QBEngine.ScrambleActive = false end if CFG.ReceiverScoring and not QBEngine.ScrambleActive then QBEngine.BestReceiver = qbSelectBest(hrp, defMap) end local best = QBEngine.BestReceiver local passType = (CFG.PassType == "Auto") and "Auto" or CFG.PassType if best then local dist = (best.hrp.Position - hrp.Position).Magnitude if passType == "Auto" then passType = qbAutoType(dist) end if CFG.CoverageRead and qbIsCovered(best.hrp, defMap) then local now = os.clock() if now - _swCd > 0.4 then _swCd = now QBEngine.BestReceiver = qbSelectBest(hrp, defMap) best = QBEngine.BestReceiver end end if best then local _, targetPos = qbComputeLead(hrp, best.hrp, passType) if CFG.TargetLock and CFG.LookAtTarget then local dir = best.hrp.Position - hrp.Position local cf = CFrame.new(hrp.Position, hrp.Position+Vector3.new(dir.X,0,dir.Z)) pcall(function() hrp.CFrame = hrp.CFrame:Lerp(cf, 0.12) end) end qbAccuracyBoost() qbAutoThrow(hrp, targetPos, best, passType) qbUpdateOverlay(best, passType, pocket) else qbUpdateOverlay(nil, passType, pocket) end else qbUpdateOverlay(nil, passType, pocket) end end)) local DefEngine = {} DefEngine.ThreatMap = {} DefEngine.NearestThreat = nil DefEngine.NearestDist = math.huge DefEngine.LastEvasion = 0 DefEngine.JukeIdx = 0 DefEngine.BlitzDetected = false DefEngine.EvasionActive = false local JUKE_SEQ = {"Left","Right","Left","SpeedBurst","Right"} local FIELD_HW = 120 local _defYHist = {} local function defUpdateYHist(uid, y) if not _defYHist[uid] then _defYHist[uid]={} end table.insert(_defYHist[uid], 1, y) if #_defYHist[uid] > 6 then table.remove(_defYHist[uid]) end end local function defIsDiving(uid) local h = _defYHist[uid] if not h or #h < 4 then return false end return (h[4] - h[1]) > 0.6 end local function defBuildThreatMap(hrp) DefEngine.ThreatMap = {} DefEngine.NearestThreat = nil DefEngine.NearestDist = math.huge local evR = CFG.EvasionRadius or 8 for _, plr in ipairs(Players:GetPlayers()) do if plr == LP then continue end local tChar = plr.Character local tHRP = tChar and tChar:FindFirstChild("HumanoidRootPart") if not tHRP then continue end local d = (tHRP.Position - hrp.Position).Magnitude defUpdateYHist(plr.UserId, tHRP.Position.Y) if d < evR * 2 then local defVel = Vector3.new(0,0,0) pcall(function() defVel = tHRP.AssemblyLinearVelocity end) local toPlayer = (hrp.Position - tHRP.Position) local tpUnit = toPlayer.Magnitude > 0 and toPlayer.Unit or Vector3.new(0,0,0) local appSpd = defVel:Dot(tpUnit) local isHS = appSpd > 18 and d < evR * 0.7 local isDive = defIsDiving(plr.UserId) local score = (appSpd/10) * (1/math.max(d,0.5)) + (isHS and 2 or 0) + (isDive and 1.5 or 0) local entry = {hrp=tHRP, dist=d, appSpd=appSpd, isHS=isHS, isDive=isDive, score=score, vel=defVel} DefEngine.ThreatMap[plr.UserId] = entry if d < DefEngine.NearestDist then DefEngine.NearestDist = d DefEngine.NearestThreat = entry end end end end local function defEvasionDir(hrp, threat) if not threat then return nil end local tDir = (hrp.Position - threat.hrp.Position).Unit local leftD = Vector3.new(-tDir.Z, 0, tDir.X) local rgtD = Vector3.new( tDir.Z, 0,-tDir.X) local mode = CFG.EvasionMode or "Auto" if mode=="Left" then return leftD end if mode=="Right" then return rgtD end local lCount, rCount = 0, 0 for _, t in pairs(DefEngine.ThreatMap) do if (t.hrp.Position-(hrp.Position+leftD*5)).Magnitude < 4 then lCount=lCount+1 end if (t.hrp.Position-(hrp.Position+rgtD *5)).Magnitude < 4 then rCount=rCount+1 end end if lCount < rCount then return leftD end if rCount < lCount then return rgtD end local charVel = Vector3.new(0,0,0) pcall(function() charVel = hrp.AssemblyLinearVelocity end) if charVel.Magnitude > 1 then return charVel.Unit:Dot(leftD) > 0 and leftD or rgtD end return leftD end local function defExecuteEvasion(hrp, hum, threat) if not CFG.HitboxEvasion then return end local now = os.clock() if now - DefEngine.LastEvasion < (CFG.EvasionDelay or 0.12) then return end local dir = defEvasionDir(hrp, threat) if not dir then return end DefEngine.LastEvasion = now DefEngine.EvasionActive = true local evPos = Vector3.new((hrp.Position+dir*6).X, hrp.Position.Y, (hrp.Position+dir*6).Z) pcall(function() hum:MoveTo(evPos) end) pcall(function() hum.WalkSpeed = math.min((CFG.SpeedValue or 21)*1.4, 32) end) task.delay(0.22, function() DefEngine.EvasionActive = false pcall(function() hum.WalkSpeed = CFG.Speed and CFG.SpeedValue or 16 end) end) end local _jukeCd = 0 local function defJukeStep(hrp, hum) if not CFG.JukeSequence then return end local now = os.clock() if now - _jukeCd < 0.18 then return end _jukeCd = now DefEngine.JukeIdx = (DefEngine.JukeIdx % #JUKE_SEQ) + 1 local step = JUKE_SEQ[DefEngine.JukeIdx] local dir if step=="Left" then dir = hrp.CFrame.RightVector * -1 elseif step=="Right" then dir = hrp.CFrame.RightVector elseif step=="SpeedBurst" then dir = hrp.CFrame.LookVector pcall(function() for _, r in ipairs(game:GetDescendants()) do if r:IsA("RemoteEvent") and r.Name:lower():find("sprint") then r:FireServer(true); break end end end) else return end local jp = hrp.Position + dir*4 pcall(function() hum:MoveTo(Vector3.new(jp.X, hrp.Position.Y, jp.Z)) end) end local _spinCd = 0 local function defSpinMove(hrp) if not CFG.SpinMoveAuto then return end local now = os.clock() if now - _spinCd < 1.2 then return end if DefEngine.NearestDist > 5 then return end _spinCd = now task.spawn(function() for i = 1, 8 do pcall(function() hrp.CFrame = hrp.CFrame * CFrame.Angles(0, math.pi/4, 0) end) task.wait(0.04) end pcall(function() for _, r in ipairs(game:GetDescendants()) do if r:IsA("RemoteEvent") then local nm = r.Name:lower() if nm:find("spin") or nm:find("juke") or nm:find("stiff") then r:FireServer(); break end end end end) end) end local function defInbounds(hrp, hum) if not CFG.InboundsProtect then return end local pos = hrp.Position if math.abs(pos.X)>FIELD_HW or math.abs(pos.Z)>FIELD_HW then local safe = Vector3.new( math.clamp(pos.X,-FIELD_HW+5,FIELD_HW-5), pos.Y, math.clamp(pos.Z,-FIELD_HW+5,FIELD_HW-5)) pcall(function() hum:MoveTo(safe) end) end end local _blitzCd = 0 local function defBlitzCheck(hrp) if not CFG.BlitzDetect then DefEngine.BlitzDetected=false; return end local now = os.clock() if now - _blitzCd < 0.3 then return end _blitzCd = now local n = 0 for _, t in pairs(DefEngine.ThreatMap) do if t.appSpd > 12 and t.dist < 22 then n=n+1 end end local was = DefEngine.BlitzDetected DefEngine.BlitzDetected = n >= 3 if DefEngine.BlitzDetected and not was then notify("Evasion","⚠ Blitz detected — "..n.." rushers inbound!",2.5) end end local _breakCd = 0 local function defBreakTackle(hrp, hum, threat) if not CFG.BreakTackleAssist or not threat then return end if threat.dist > 3.5 then return end local now = os.clock() if now - _breakCd < 0.6 then return end _breakCd = now local away = (hrp.Position - threat.hrp.Position).Unit pcall(function() hrp.AssemblyLinearVelocity = away * 28 end) pcall(function() hum.WalkSpeed = 32 end) task.delay(0.3, function() pcall(function() hum.WalkSpeed = CFG.Speed and CFG.SpeedValue or 16 end) end) end local _defTick = 0 track(RunService.Heartbeat:Connect(function(dt) local needsRun = CFG.HitboxEvasion or CFG.JukeSequence or CFG.SpinMoveAuto or CFG.BlitzDetect or CFG.InboundsProtect or CFG.BreakTackleAssist if not needsRun then return end local char = LP.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") local hum = char and char:FindFirstChildOfClass("Humanoid") if not hrp or not hum then return end _defTick = _defTick + dt if _defTick < 0.04 then return end _defTick = 0 defBuildThreatMap(hrp) defBlitzCheck(hrp) defInbounds(hrp, hum) local threat = DefEngine.NearestThreat if not threat then return end if CFG.HitboxEvasion and threat.dist < (CFG.EvasionRadius or 8) then if CFG.DiveAvoid and threat.isDive then pcall(function() hum.Jump=true end) end defExecuteEvasion(hrp, hum, threat) end if CFG.JukeSequence and threat.dist < (CFG.EvasionRadius or 8)*1.2 then defJukeStep(hrp, hum) end defSpinMove(hrp) defBreakTackle(hrp, hum, threat) end)) local AFEngine = {} AFEngine.BlockedCount = 0 AFEngine.FumbleRemoteNames = {} AFEngine.ImpactDetected = false AFEngine.ImpactTimer = 0 AFEngine.Overlay = nil AFEngine.HookInstalled = false local function afDiscover() if #AFEngine.FumbleRemoteNames > 0 then return end for _, r in ipairs(game:GetDescendants()) do if r:IsA("RemoteEvent") or r:IsA("RemoteFunction") then local nm = r.Name:lower() if nm:find("fumble") or nm:find("strip") or nm:find("loose") or nm:find("dropball") or nm:find("lostball") then AFEngine.FumbleRemoteNames[#AFEngine.FumbleRemoteNames+1] = nm end end end end local _velCd = 0 local function afClampVelocity(hrp, ball) if not CFG.VelocityClamp then return end local now = os.clock() if now - _velCd < 0.05 then return end _velCd = now if (ball.Position-hrp.Position).Magnitude > (CFG.MagnetRadius or 10) then return end local vmag = ball.AssemblyLinearVelocity.Magnitude local thresh = CFG.FumbleVelocityThreshold or 40 if vmag > thresh then AFEngine.ImpactDetected = true AFEngine.ImpactTimer = now pcall(function() ball.AssemblyLinearVelocity = ball.AssemblyLinearVelocity.Unit * (thresh*0.4) ball.AssemblyAngularVelocity = ball.AssemblyAngularVelocity * 0.3 end) AFEngine.BlockedCount = AFEngine.BlockedCount + 1 end if AFEngine.ImpactDetected and (now-AFEngine.ImpactTimer) > 0.5 then AFEngine.ImpactDetected = false end end local _possLkCd = 0 local function afPossessionLock(hrp, ball) if not CFG.PossessionLock then return end local now = os.clock() if now - _possLkCd < (CFG.BallOwnershipTick or 0.05) then return end if (ball.Position-hrp.Position).Magnitude > (CFG.MagnetRadius or 10)*0.6 then return end _possLkCd = now pcall(function() for _, r in ipairs(game:GetDescendants()) do if r:IsA("RemoteEvent") then local nm = r.Name:lower() if nm:find("possess") or nm:find("carry") or nm:find("hold") or nm:find("own") then r:FireServer(LP); return end end end end) end local _impAbsCd = 0 local function afAbsorbImpact(hrp, ball) if not CFG.ImpactAbsorption then return end local now = os.clock() if now - _impAbsCd < 0.08 then return end if (ball.Position-hrp.Position).Magnitude > 6 then return end _impAbsCd = now local pVel = Vector3.new(0,0,0) pcall(function() pVel = hrp.AssemblyLinearVelocity end) if pVel.Magnitude > 30 then pcall(function() hrp.AssemblyLinearVelocity = pVel * 0.35 end) end end local function afInstallFumbleBlock() if AFEngine.HookInstalled then return end if not (type(getrawmetatable)=="function" and type(setreadonly)=="function") then return end pcall(function() local mt = getrawmetatable(game) local old = mt.__namecall setreadonly(mt, false) mt.__namecall = newCClosure(function(self, ...) if CFG.FumbleRemoteBlock and CFG.AntiFumbleV2 then local method = getnamecallmethod and getnamecallmethod() or "" if method=="FireServer" or method=="InvokeServer" then if typeof(self)=="Instance" and (self:IsA("RemoteEvent") or self:IsA("RemoteFunction")) then local nm = self.Name:lower() for _, bn in ipairs(AFEngine.FumbleRemoteNames) do if nm == bn then AFEngine.BlockedCount = AFEngine.BlockedCount + 1 return end end if nm:find("fumble") or nm:find("looseball") or nm:find("dropball") then AFEngine.BlockedCount = AFEngine.BlockedCount + 1 return end end end end return old(self, ...) end) setreadonly(mt, true) AFEngine.HookInstalled = true end) end local function afInitHUD() if AFEngine.Overlay then return end local ol = Instance.new("TextLabel") ol.BackgroundTransparency=1; ol.Size=UDim2.new(0,200,0,20) ol.Position=UDim2.new(0.5,-100,0.92,0) ol.Font=Enum.Font.GothamBold; ol.TextSize=11 ol.TextColor3=Color3.fromRGB(30,200,80); ol.TextStrokeTransparency=0.4 ol.TextXAlignment=Enum.TextXAlignment.Center ol.Text=""; ol.ZIndex=50; ol.Parent=ScreenGui AFEngine.Overlay = ol end local function afUpdateHUD(ball, hrp) local ol = AFEngine.Overlay if not ol then return end if not CFG.AntiFumbleV2 then ol.Text=""; return end local bs = AFEngine.BlockedCount>0 and (" ["..AFEngine.BlockedCount.."blk]") or "" local dist = ball and hrp and math.floor((ball.Position-hrp.Position).Magnitude) or 99 if AFEngine.ImpactDetected then ol.TextColor3=Color3.fromRGB(255,80,80); ol.Text="⚠ IMPACT ABSORBED"..bs elseif dist < (CFG.MagnetRadius or 10) then ol.TextColor3=Color3.fromRGB(30,200,80); ol.Text="✓ POSSESSION SECURED"..bs else ol.TextColor3=Color3.fromRGB(150,150,150); ol.Text="◈ ANTI-FUMBLE ARMED"..bs end end task.delay(3, function() pcall(afDiscover) if CFG.FumbleRemoteBlock then afInstallFumbleBlock() end end) track(RunService.Heartbeat:Connect(function() if CFG.FumbleRemoteBlock and not AFEngine.HookInstalled then pcall(afInstallFumbleBlock) end end)) local _afTick = 0 track(RunService.Heartbeat:Connect(function(dt) if not CFG.AntiFumbleV2 then if AFEngine.Overlay then AFEngine.Overlay.Text="" end return end local char = LP.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if not hrp then return end local ball = findBall() if not ball then if AFEngine.Overlay then AFEngine.Overlay.Text="" end return end afInitHUD() _afTick = _afTick + dt if _afTick < 0.04 then afUpdateHUD(ball,hrp); return end _afTick = 0 afClampVelocity(hrp, ball) afPossessionLock(hrp, ball) afAbsorbImpact(hrp, ball) afUpdateHUD(ball, hrp) if CFG.AntiFumble then if (ball.Position-hrp.Position).Magnitude < 5 then pcall(function() ball.AssemblyLinearVelocity = ball.AssemblyLinearVelocity*0.1 end) end end end)) local hasDrawing=type(Drawing)=="table" and Drawing~=nil if hasDrawing then local espLabel=trackDraw(Drawing.new("Text")) espLabel.Size=13; espLabel.Font=Drawing.Fonts.UI espLabel.Color=T.Accent; espLabel.Outline=true espLabel.OutlineColor=Color3.fromRGB(0,0,0); espLabel.Visible=false track(RunService.RenderStepped:Connect(function() espLabel.Visible=false if not CFG.DistanceESP then return end local char=LP.Character; local hrp=char and char:FindFirstChild("HumanoidRootPart"); if not hrp then return end local ball=findBall(); if not ball then return end local sp,onScreen=Cam:WorldToViewportPoint(ball.Position+Vector3.new(0,2.5,0)) if not onScreen then return end espLabel.Position=Vector2.new(sp.X,sp.Y) espLabel.Text=math.floor((ball.Position-hrp.Position).Magnitude).." studs" espLabel.Color=T.Accent; espLabel.Visible=true end)) local POOL_SIZE=20 local linePool={} for i=1,POOL_SIZE do local ln=trackDraw(Drawing.new("Line")); ln.Thickness=1.2 ln.Color=T.Accent; ln.Visible=false; linePool[i]=ln end track(RunService.RenderStepped:Connect(function() for _,ln in ipairs(linePool) do ln.Visible=false end if not CFG.TracerLines then return end local center=Vector2.new(Cam.ViewportSize.X/2,Cam.ViewportSize.Y) local idx=0 for _,plr in ipairs(Players:GetPlayers()) do if plr==LP or idx>=POOL_SIZE then break end local tChar=plr.Character; local tHRP=tChar and tChar:FindFirstChild("HumanoidRootPart"); if not tHRP then continue end local sp,onScreen=Cam:WorldToViewportPoint(tHRP.Position) if not onScreen then continue end idx=idx+1 local ln=linePool[idx]; ln.From=center; ln.To=Vector2.new(sp.X,sp.Y) ln.Color=T.Accent; ln.Visible=true end end)) end local chamBoxes={} task.spawn(function() while true do task.wait(0.5) for uid,box in pairs(chamBoxes) do if not box.Adornee or not box.Adornee.Parent then pcall(function()box:Destroy()end); chamBoxes[uid]=nil end end if not CFG.ChamsFill then for _,box in pairs(chamBoxes) do pcall(function()box:Destroy()end) end chamBoxes={}; continue end for _,plr in ipairs(Players:GetPlayers()) do if plr==LP then continue end local uid=plr.UserId if not chamBoxes[uid] then local tChar=plr.Character if tChar and tChar.Parent then pcall(function() local box=Instance.new("SelectionBox") box.Adornee=tChar; box.Color3=T.Accent box.LineThickness=0.05; box.SurfaceTransparency=0.65 box.SurfaceColor3=T.Accent; box.Parent=ScreenGui chamBoxes[uid]=box end) end end end end end) task.spawn(function() task.wait(10) local latest=getHttp(VER_URL) if not latest then return end latest=latest:gsub("%s","") if latest:match("^%d+%.%d+%.%d+$") and latest~=VERSION then local src=getHttp(RAW_URL) if src and #src>500 then makeFolder("PhantomHub") writeFile("PhantomHub/PhantomHub.lua",src) disconnectAll() notify("Phantom Hub","Updated to v"..latest.." — re-executing",3) task.wait(1) pcall(loadstring,src) end end end) notify("Phantom Hub","Loaded · v"..VERSION.." · "..TIER.." · FF3 ready",4)