repeat task.wait() until game:IsLoaded() local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local VirtualInputManager = game:GetService("VirtualInputManager") local cloneref = cloneref or function(v) return v end local player = Players.LocalPlayer local Char = player.Character or player.CharacterAdded:Wait() local Hum = cloneref(Char:WaitForChild("Humanoid")) or cloneref(Char:FindFirstChild("Humanoid")) local Hrp = cloneref(Char:WaitForChild("HumanoidRootPart")) or cloneref(Char:FindFirstChild("HumanoidRootPart")) local magnetEnabled = false local magnetDistance = 80 local showHitbox = false local hitboxPart = nil local swatEnabled = false local swatRadius = 80 local cframeWalkEnabled = false local cframeWalkSpeed = 66 local infiniteJumpEnabled = false local jumpPowerEnabled = false local customJumpPower = 100 local autoFlagEnabled = false local autoFlagRadius = 80 local autoTouchdownEnabled = false local targetEndzone = "Endzone1" local pullVectorDistance = 10 local pullVectorEnabled = false local ballCarrierEnabled = false local autoCatchEnabled = false local autoCatchRadius = 15 local freezeTechEnabled = false local freezeTechDuration = 0.5 local clickTackleEnabled = false local clickTackleRadius = 80 local cachedBall = nil local cachedFootball = nil local cachedEndzone = nil local lastCacheUpdate = 0 local CACHE_INTERVAL = 0.5 local bcMode = "" local function findBall() if cachedBall and cachedBall.Parent then return cachedBall end for _, v in ipairs(workspace:GetChildren()) do if v:IsA("MeshPart") and v.Name == "Ball" then cachedBall = v return v end end cachedBall = nil return nil end local function findFootball() if cachedFootball and cachedFootball.Parent then return cachedFootball end local football = workspace:FindFirstChild("Football") if football and football:IsA("MeshPart") then cachedFootball = football return football end cachedFootball = nil return nil end local function createHitbox() if hitboxPart then hitboxPart:Destroy() end hitboxPart = Instance.new("Part") hitboxPart.Name = "MagnetHitbox" hitboxPart.Size = Vector3.new(magnetDistance * 2, magnetDistance * 2, magnetDistance * 2) hitboxPart.Anchored = true hitboxPart.CanCollide = false hitboxPart.Transparency = 0.5 hitboxPart.Material = Enum.Material.ForceField hitboxPart.Color = Color3.fromRGB(138, 43, 226) hitboxPart.CastShadow = false hitboxPart.Shape = Enum.PartType.Ball hitboxPart.Parent = workspace return hitboxPart end local function removeHitbox() if hitboxPart then hitboxPart:Destroy() hitboxPart = nil end end local function updateHitbox() if showHitbox and magnetEnabled and Hrp then local ball = findBall() if ball then if not hitboxPart then createHitbox() end if hitboxPart then hitboxPart.CFrame = ball.CFrame hitboxPart.Size = Vector3.new(magnetDistance * 2, magnetDistance * 2, magnetDistance * 2) end else removeHitbox() end elseif hitboxPart then removeHitbox() end end local function findEndzone() if cachedEndzone and cachedEndzone.Parent then return cachedEndzone end local minigames = workspace:FindFirstChild("Minigames") if not minigames then return nil end for _, minigame in ipairs(minigames:GetChildren()) do local localFolder = minigame:FindFirstChild("Local") if localFolder then local design = localFolder:FindFirstChild("Design") if design then local endzone = design:FindFirstChild(targetEndzone) if endzone and endzone:IsA("BasePart") then cachedEndzone = endzone return endzone end end end end cachedEndzone = nil return nil end local function playerHasBall() if not Char then return false end return Char:FindFirstChild("Ball") ~= nil end local function findBallCarrier() for _, model in ipairs(workspace:GetChildren()) do if model:IsA("Model") and model ~= Char and model:FindFirstChild("Ball") then return model end end return nil end local function simulateClick() local camera = workspace.CurrentCamera local viewportSize = camera.ViewportSize local centerX = viewportSize.X / 2 local centerY = viewportSize.Y / 2 VirtualInputManager:SendMouseButtonEvent(centerX, centerY, 0, true, game, 0) task.wait(0.01) VirtualInputManager:SendMouseButtonEvent(centerX, centerY, 0, false, game, 0) end local function onBallAdded(ball) if not freezeTechEnabled then return end if not ball:IsA("MeshPart") then return end ball.Anchored = true if ball:FindFirstChild("BodyVelocity") then ball.BodyVelocity:Destroy() end ball.AssemblyLinearVelocity = Vector3.new(0, 0, 0) ball.AssemblyAngularVelocity = Vector3.new(0, 0, 0) task.wait(freezeTechDuration) if ball and ball.Parent then ball.Anchored = false end end local lastSwatTime = 0 local lastFlagTime = 0 local SWAT_COOLDOWN = 0.1 local FLAG_COOLDOWN = 0.1 RunService.Heartbeat:Connect(function(deltaTime) local currentTime = tick() if currentTime - lastCacheUpdate > CACHE_INTERVAL then lastCacheUpdate = currentTime findBall() findFootball() end if not Hrp then return end updateHitbox() if magnetEnabled then local ball = cachedBall if ball then local dist = (Hrp.Position - ball.Position).Magnitude if dist <= magnetDistance then firetouchinterest(Hrp, ball, 0) firetouchinterest(Hrp, ball, 1) end end end if swatEnabled and (currentTime - lastSwatTime) > SWAT_COOLDOWN then local ball = cachedBall if ball then local dist = (Hrp.Position - ball.Position).Magnitude if dist <= swatRadius then lastSwatTime = currentTime pcall(function() ReplicatedStorage.Packages.Knit.Services.SessionService.RF.PerformAction:InvokeServer("Swat") end) end end end if autoFlagEnabled and (currentTime - lastFlagTime) > FLAG_COOLDOWN then local ball = cachedBall if ball then local dist = (Hrp.Position - ball.Position).Magnitude if dist <= autoFlagRadius then lastFlagTime = currentTime pcall(function() ReplicatedStorage.Packages.Knit.Services.SessionService.RF.PerformAction:InvokeServer("Reach for Flag") end) end end end if autoTouchdownEnabled and playerHasBall() then local endzone = findEndzone() if endzone then Hrp.CFrame = endzone.CFrame + Vector3.new(0, 5, 0) end end if autoCatchEnabled then local football = cachedFootball if football then local dist = (Hrp.Position - football.Position).Magnitude if dist <= autoCatchRadius then simulateClick() end end end if cframeWalkEnabled then local humanoid = Char and Char:FindFirstChildOfClass("Humanoid") if humanoid then local moveVec = humanoid.MoveDirection if moveVec.Magnitude > 0 then Hrp.CFrame = Hrp.CFrame + (moveVec.Unit * cframeWalkSpeed * deltaTime) end end end if ballCarrierEnabled then local carrier = findBallCarrier() if carrier and carrier:FindFirstChild("HumanoidRootPart") then if bcMode == "Blatant" then Hrp.CFrame = carrier.HumanoidRootPart.CFrame * CFrame.new(0, 0, 3) elseif bcMode == "Legit" then local hum = Hrp.Parent:FindFirstChildOfClass("Humanoid") if hum then local target = carrier.HumanoidRootPart.Position local dist = (Hrp.Position - target).Magnitude if dist > 4 then hum:MoveTo(target) end end end end end end) player.CharacterAdded:Connect(function(character) character.ChildAdded:Connect(function(child) if child.Name == "Ball" then onBallAdded(child) end end) local existingBall = character:FindFirstChild("Ball") if existingBall then onBallAdded(existingBall) end end) if player.Character then local character = player.Character character.ChildAdded:Connect(function(child) if child.Name == "Ball" then onBallAdded(child) end end) end UserInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end if not pullVectorEnabled then return end if not Hrp then return end if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then local ball = workspace:FindFirstChild("Ball") if ball and ball:IsA("MeshPart") then local direction = (ball.Position - Hrp.Position).Unit Hrp.CFrame = CFrame.new(ball.Position - (direction * pullVectorDistance), ball.Position) end end end) UserInputService.JumpRequest:Connect(function() if not infiniteJumpEnabled then return end if Hum then Hum:ChangeState(Enum.HumanoidStateType.Jumping) end end) local jumpConnection = nil local function setupJumpPower() if jumpConnection then jumpConnection:Disconnect() end jumpConnection = Hum.Jumping:Connect(function() if jumpPowerEnabled and Hrp then local jumpVelocity = Vector3.new(0, customJumpPower, 0) Hrp.Velocity = Vector3.new(Hrp.Velocity.X, 0, Hrp.Velocity.Z) + jumpVelocity end end) end player.CharacterAdded:Connect(function(newChar) Char = newChar Hrp = newChar:WaitForChild('HumanoidRootPart') Hum = newChar:WaitForChild('Humanoid') removeHitbox() cachedBall = nil cachedFootball = nil cachedEndzone = nil if jumpPowerEnabled then setupJumpPower() end end) local function TackleClicked() if not clickTackleEnabled then return end local Bc = findBallCarrier() if not Bc then return end if Players:FindFirstChild(Bc.Name) and Players:FindFirstChild(Bc.Name) ~= Plr.Name then if Bc and Players:FindFirstChild(Bc.Name) then local TargetHrp = Players:FindFirstChild(Bc.Name).Character:FindFirstChild("HumanoidRootPart") if TargetHrp and Hrp then local dist = (Hrp.Position - TargetHrp.Position).Magnitude if dist <= clickTackleRadius then Hrp.CFrame = TargetHrp.CFrame end end end end end local function detectClick() UserInputService.InputBegan:Connect(function(input, gp) if gp then return end if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then TackleClicked() end end) end local repo = "https://raw.githubusercontent.com/deividcomsono/Obsidian/main/" local Library = loadstring(game:HttpGet(repo .. "Library.lua"))() local ThemeManager = loadstring(game:HttpGet(repo .. "addons/ThemeManager.lua"))() local SaveManager = loadstring(game:HttpGet(repo .. "addons/SaveManager.lua"))() local Options = Library.Options local Toggles = Library.Toggles local Window = Library:CreateWindow({ Title = "Kali Hub", Footer = "by @wrl11 & @aylonthegiant | discord.gg/epNcR8Ce89", NotifySide = "Right", ShowCustomCursor = false, Mobile = { Enabled = true, Title = "Kali Hub", Icon = "rbxassetid://10723434711" } }) local Tabs = { Catching = Window:AddTab("Catching", "hand"), Player = Window:AddTab("Player", "user"), Misc = Window:AddTab("Misc", "badge-question-mark"), ["UI Settings"] = Window:AddTab("UI Settings", "monitor"), } local MagnetGroup = Tabs.Catching:AddLeftGroupbox("Mags") local AutoCatchGroup = Tabs.Catching:AddLeftGroupbox("Auto Catch") local SwatGroup = Tabs.Catching:AddRightGroupbox("Auto Swat") local FlagGroup = Tabs.Catching:AddLeftGroupbox("Auto Flag") local TouchdownGroup = Tabs.Catching:AddRightGroupbox("Auto Touchdown") local PullVectorGroup = Tabs.Catching:AddLeftGroupbox("Pull Vector") local FreezeTechGroup = Tabs.Catching:AddRightGroupbox("Freeze Tech") local SpeedGroup = Tabs.Player:AddLeftGroupbox("Speed") local JumpGroup = Tabs.Player:AddRightGroupbox("Jumping") local BallCarrierGroup = Tabs.Misc:AddLeftGroupbox("Ball Carrier") local ClickTackleGroup = Tabs.Misc:AddRightGroupbox("Click Tackle") local MenuGroup = Tabs["UI Settings"]:AddLeftGroupbox("Menu") MagnetGroup:AddToggle("BallMagnet", { Text = "Football Magnet", Default = false, Callback = function(value) magnetEnabled = value if not value then removeHitbox() end end }) MagnetGroup:AddSlider("MagnetDistance", { Text = "Magnet Distance", Default = 80, Min = 10, Max = 100, Rounding = 0, Callback = function(value) magnetDistance = value end }) MagnetGroup:AddToggle("ShowHitbox", { Text = "Visualize Mag Hitbox", Default = false, Callback = function(value) showHitbox = value if not value then removeHitbox() end end }) AutoCatchGroup:AddToggle("AutoCatch", { Text = "Auto Catch", Default = false, Callback = function(value) autoCatchEnabled = value end }) AutoCatchGroup:AddSlider("AutoCatchRadius", { Text = "Catch Radius", Default = 15, Min = 5, Max = 50, Rounding = 0, Callback = function(value) autoCatchRadius = value end }) FreezeTechGroup:AddToggle("FreezeTech", { Text = "Freeze Tech", Default = false, Callback = function(value) freezeTechEnabled = value end }) FreezeTechGroup:AddSlider("FreezeTechDuration", { Text = "Freeze Duration", Default = 0.5, Min = 0.1, Max = 2, Rounding = 1, Callback = function(value) freezeTechDuration = value end }) SwatGroup:AddToggle("AutoSwat", { Text = "Auto Swat", Default = false, Callback = function(value) swatEnabled = value end }) SwatGroup:AddSlider("SwatRadius", { Text = "Swat Radius", Default = 80, Min = 10, Max = 100, Rounding = 0, Callback = function(value) swatRadius = value end }) FlagGroup:AddToggle("AutoFlag", { Text = "Auto Flag Pull", Default = false, Callback = function(value) autoFlagEnabled = value end }) FlagGroup:AddSlider("FlagRadius", { Text = "Pull Radius", Default = 80, Min = 10, Max = 100, Rounding = 0, Callback = function(value) autoFlagRadius = value end }) TouchdownGroup:AddToggle("AutoTouchdown", { Text = "Auto Touchdown", Default = false, Callback = function(value) autoTouchdownEnabled = value end }) TouchdownGroup:AddDropdown("EndzoneSelect", { Values = { "Endzone1", "Endzone2" }, Default = "Endzone1", Text = "Target Endzone", Callback = function(value) targetEndzone = value cachedEndzone = nil end }) PullVectorGroup:AddToggle("PullVectorToggle", { Text = "Enable Pull Vector [M1]", Default = false, Callback = function(value) pullVectorEnabled = value end }) PullVectorGroup:AddSlider("PullVectorDistance", { Text = "Pull Distance", Default = 10, Min = 5, Max = 50, Rounding = 0, Callback = function(value) pullVectorDistance = value end }) SpeedGroup:AddToggle("CFrameWalk", { Text = "CFrame Walk", Default = false, Callback = function(value) cframeWalkEnabled = value end }) SpeedGroup:AddSlider("CFrameSpeed", { Text = "CFrame Speed", Default = 66, Min = 16, Max = 80, Rounding = 0, Callback = function(value) cframeWalkSpeed = value end }) JumpGroup:AddToggle("InfiniteJump", { Text = "Infinite Jump", Default = false, Callback = function(value) infiniteJumpEnabled = value end }) JumpGroup:AddToggle("JumpPower", { Text = "Jump Power", Default = false, Callback = function(value) jumpPowerEnabled = value if value then setupJumpPower() else if jumpConnection then jumpConnection:Disconnect() end jumpConnection = nil end end }) JumpGroup:AddSlider("JumpHeight", { Text = "Jump Height", Default = 100, Min = 10, Max = 250, Rounding = 0, Callback = function(value) customJumpPower = value end }) BallCarrierGroup:AddToggle("BallCarrier", { Text = "Follow Ball Carrier", Default = false, Callback = function(v) ballCarrierEnabled = v end }) BallCarrierGroup:AddDropdown("BallCarrierMode", { Values = { "Blatant", "Legit" }, Default = "", Text = "Follow Mode", Tooltip = "Choose how to follow the ball carrier", Callback = function(v) bcMode = v end }) ClickTackleGroup:AddToggle("ClickTackle", { Text = "Click Tackle", Default = false, Callback = function(value) clickTackleEnabled = value if value then detectClick() end end }) ClickTackleGroup:AddSlider("ClickTackleRadius", { Text = "Tackle Radius", Default = 80, Min = 10, Max = 150, Rounding = 0, Callback = function(value) clickTackleRadius = value end }) MenuGroup:AddToggle("KeybindMenuOpen", { Default = Library.KeybindFrame.Visible, Text = "Open Keybind Menu", Callback = function(value) Library.KeybindFrame.Visible = value end, }) MenuGroup:AddToggle("ShowCustomCursor", { Text = "Custom Cursor", Default = false, Callback = function(Value) Library.ShowCustomCursor = Value end, }) MenuGroup:AddDropdown("NotificationSide", { Values = { "Left", "Right" }, Default = "Right", Text = "Notification Side", Callback = function(Value) Library:SetNotifySide(Value) end, }) MenuGroup:AddDivider() MenuGroup:AddLabel("Menu bind"):AddKeyPicker("MenuKeybind", { Default = "LeftControl", NoUI = true, Text = "Menu keybind" }) MenuGroup:AddButton({ Text = "Unload", Func = function() Library:Unload() end }) Library.ToggleKeybind = Options.MenuKeybind ThemeManager:SetLibrary(Library) SaveManager:SetLibrary(Library) SaveManager:IgnoreThemeSettings() SaveManager:SetIgnoreIndexes({ "MenuKeybind" }) ThemeManager:SetFolder("Kali Hub") SaveManager:SetFolder("KaliHub/Game") SaveManager:BuildConfigSection(Tabs["UI Settings"]) ThemeManager:ApplyToTab(Tabs["UI Settings"]) Library:Notify({ Title = "Kali Hub", Description = "Script loaded successfully!", Time = 5, }) Library:OnUnload(function() magnetEnabled = false swatEnabled = false autoFlagEnabled = false autoTouchdownEnabled = false pullVectorEnabled = false cframeWalkEnabled = false infiniteJumpEnabled = false jumpPowerEnabled = false ballCarrierEnabled = false autoCatchEnabled = false freezeTechEnabled = false clickTackleEnabled = false if jumpConnection then jumpConnection:Disconnect() end removeHitbox() end)