repeat task.wait() until game:IsLoaded() local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") 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")) getgenv().MagsActivated = getgenv().MagsActivated or false getgenv().MagsRange = getgenv().MagsRange or 10 getgenv().ShowHitbox = getgenv().ShowHitbox or false getgenv().SpeedEnabled = getgenv().SpeedEnabled or false getgenv().SpeedValue = getgenv().SpeedValue or 1 getgenv().JumpPowerOn = getgenv().JumpPowerOn or false getgenv().JumpBoost = getgenv().JumpBoost or 50 getgenv().PullEnabled = getgenv().PullEnabled or false getgenv().PullPower = getgenv().PullPower or 10 getgenv().ClickTackleEnabled = getgenv().ClickTackleEnabled or false getgenv().ClickTackleRange = getgenv().ClickTackleRange or 15 local hitboxes = {} local movementLoop = nil local pullButtonHeld = false local clickTackleConnection = nil local pullButtonGui = Instance.new("ScreenGui") pullButtonGui.Name = "PullButtonGui" pullButtonGui.ResetOnSpawn = false pullButtonGui.Parent = player:WaitForChild("PlayerGui") local pullContainer = Instance.new("Frame") pullContainer.Name = "PullContainer" pullContainer.Size = UDim2.new(0, 100, 0, 100) pullContainer.Position = UDim2.new(0.85, 0, 0.7, 0) pullContainer.BackgroundTransparency = 1 pullContainer.Active = true pullContainer.Draggable = true pullContainer.Parent = pullButtonGui local pullButton = Instance.new("TextButton") pullButton.Size = UDim2.new(0, 70, 0, 70) pullButton.Position = UDim2.new(0, 15, 0, 15) pullButton.BackgroundColor3 = Color3.fromRGB(40, 40, 40) pullButton.BorderSizePixel = 0 pullButton.Text = "Pull" pullButton.TextColor3 = Color3.fromRGB(255, 255, 255) pullButton.Font = Enum.Font.GothamBold pullButton.TextSize = 16 pullButton.Parent = pullContainer pullButton.Visible = false pullButton.AutoButtonColor = false local pullCorner = Instance.new("UICorner") pullCorner.CornerRadius = UDim.new(1, 0) pullCorner.Parent = pullButton local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled local function hitboxx(oid) if not oid or hitboxes[oid] or not getgenv().MagsActivated or not getgenv().ShowHitbox then return end local holder = oid:FindFirstAncestorOfClass("Model") if holder and Players:GetPlayerFromCharacter(holder) then return end local hitbox = Instance.new("Part") hitbox.Name = "Hitbox" hitbox.Size = Vector3.new(getgenv().MagsRange, getgenv().MagsRange, getgenv().MagsRange) hitbox.Anchored = true hitbox.CanCollide = false hitbox.Transparency = 0.2 hitbox.Material = Enum.Material.ForceField hitbox.Color = Color3.fromRGB(128, 0, 128) hitbox.CastShadow = false hitbox.CFrame = oid.CFrame hitbox.Shape = Enum.PartType.Ball hitbox.Parent = oid hitboxes[oid] = {part = hitbox} local connection connection = RunService.Heartbeat:Connect(function() if not oid or not oid.Parent or not getgenv().MagsActivated or not getgenv().ShowHitbox then if hitbox then hitbox:Destroy() end if connection then connection:Disconnect() end hitboxes[oid] = nil return end local holder = oid:FindFirstAncestorOfClass("Model") if holder and Players:GetPlayerFromCharacter(holder) then if hitbox then hitbox:Destroy() end if connection then connection:Disconnect() end hitboxes[oid] = nil return end hitbox.CFrame = oid.CFrame hitbox.Size = Vector3.new(getgenv().MagsRange, getgenv().MagsRange, getgenv().MagsRange) end) end local function removeHitboxes() for oid, data in pairs(hitboxes) do if data.part then data.part:Destroy() end end hitboxes = {} end local function footballhitbox() if not getgenv().MagsActivated or not getgenv().ShowHitbox then return end for _, child in pairs(workspace:GetChildren()) do if child.Name == "Football" and child:IsA("BasePart") then hitboxx(child) end end end local function startMovementSystem() if not movementLoop then movementLoop = RunService.Heartbeat:Connect(function(dt) if not getgenv().SpeedEnabled then return end local character = player.Character if not character or not character:FindFirstChild("HumanoidRootPart") then return end local hrp = character.HumanoidRootPart local humanoid = character:FindFirstChild("Humanoid") if humanoid and humanoid.MoveDirection.Magnitude > 0 then local spd = getgenv().SpeedValue or 1 local speedStudsPerSec = spd * 8 local moveVector = humanoid.MoveDirection * speedStudsPerSec * dt hrp.CFrame = hrp.CFrame + moveVector end end) end end local function stopMovementSystem() if movementLoop then movementLoop:Disconnect() movementLoop = nil end end local function whenmoving(character) if not character then return end local humanoid = character:WaitForChild("Humanoid") local humanoidrootpart = character:WaitForChild("HumanoidRootPart") humanoid.StateChanged:Connect(function(_, newstate) if newstate == Enum.HumanoidStateType.Jumping and getgenv().JumpPowerOn then task.wait(0.05) local boost = getgenv().JumpBoost or 50 humanoidrootpart.AssemblyLinearVelocity = humanoidrootpart.AssemblyLinearVelocity + Vector3.new(0, boost - 50, 0) end end) end local function findClosestBallCarrier(maxDistance) local character = player.Character if not character then return nil end local hrp = character:FindFirstChild("HumanoidRootPart") if not hrp then return nil end local closestDistance = maxDistance local closestCharacter = nil for _, plr in ipairs(Players:GetPlayers()) do if plr == player then continue end local targetChar = plr.Character if not targetChar then continue end local targetHrp = targetChar:FindFirstChild("HumanoidRootPart") if not targetHrp then continue end local hasFootball = targetChar:FindFirstChild("Football") ~= nil if not hasFootball then for _, item in ipairs(targetChar:GetChildren()) do if item:IsA("Tool") and (item.Name == "Football" or item.Name:match("Football")) then hasFootball = true break end if item:IsA("BasePart") and item.Name == "Football" then hasFootball = true break end end end if not hasFootball then continue end local distance = (hrp.Position - targetHrp.Position).Magnitude if distance < closestDistance then closestDistance = distance closestCharacter = targetChar end end return closestCharacter end local function enableClickTackle() if clickTackleConnection then return end clickTackleConnection = UserInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end local validInput = input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch if validInput then if isMobile and input.UserInputType == Enum.UserInputType.Touch then local touchPos = input.Position local buttonPos = pullButton.AbsolutePosition local buttonSize = pullButton.AbsoluteSize local isTouchingPullButton = pullButton.Visible and touchPos.X >= buttonPos.X and touchPos.X <= buttonPos.X + buttonSize.X and touchPos.Y >= buttonPos.Y and touchPos.Y <= buttonPos.Y + buttonSize.Y if isTouchingPullButton then return end end local targetChar = findClosestBallCarrier(getgenv().ClickTackleRange) if targetChar and targetChar:FindFirstChild("HumanoidRootPart") then local character = player.Character if not character then return end local hrp = character:FindFirstChild("HumanoidRootPart") if not hrp then return end hrp.CFrame = targetChar.HumanoidRootPart.CFrame end end end) end local function disableClickTackle() if clickTackleConnection then clickTackleConnection:Disconnect() clickTackleConnection = nil end end RunService.RenderStepped:Connect(function() if not getgenv().MagsActivated then return end if getgenv().ShowHitbox then footballhitbox() end for _, v in next, workspace:GetChildren() do if v.Name == "Football" then v.CanCollide = false local character = player.Character if character and character:FindFirstChild("HumanoidRootPart") then local hrp = character.HumanoidRootPart local range = getgenv().MagsRange or 10 local dist = (v.Position - hrp.Position).Magnitude if dist <= range then v.CFrame = hrp.CFrame firetouchinterest(hrp, v, 0) firetouchinterest(hrp, v, 0) end end end end end) task.spawn(function() while task.wait(0.05) do if getgenv().PullEnabled and pullButtonHeld then local character = player.Character if character then local hrp = character:FindFirstChild("HumanoidRootPart") if hrp then local target = workspace:FindFirstChild("Football") if target and target:IsA("BasePart") then local diff = target.Position - hrp.Position local dist = diff.Magnitude if dist > 0.1 then local direction = diff.Unit local power = getgenv().PullPower or 10 hrp.Velocity = direction * power * 5 end end end end end end end) pullButton.MouseButton1Down:Connect(function() if getgenv().PullEnabled then pullButtonHeld = true pullButton.BackgroundColor3 = Color3.fromRGB(0, 120, 255) end end) pullButton.MouseButton1Up:Connect(function() pullButtonHeld = false pullButton.BackgroundColor3 = Color3.fromRGB(40, 40, 40) end) pullButton.TouchTap:Connect(function() if getgenv().PullEnabled then pullButtonHeld = not pullButtonHeld if pullButtonHeld then pullButton.BackgroundColor3 = Color3.fromRGB(0, 120, 255) else pullButton.BackgroundColor3 = Color3.fromRGB(40, 40, 40) end end end) UserInputService.TouchEnded:Connect(function(touch, gameProcessed) local touchPos = touch.Position local buttonPos = pullButton.AbsolutePosition local buttonSize = pullButton.AbsoluteSize local isOutsideButton = touchPos.X < buttonPos.X or touchPos.X > buttonPos.X + buttonSize.X or touchPos.Y < buttonPos.Y or touchPos.Y > buttonPos.Y + buttonSize.Y if pullButtonHeld and isOutsideButton then pullButtonHeld = false pullButton.BackgroundColor3 = Color3.fromRGB(40, 40, 40) end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then pullButtonHeld = false pullButton.BackgroundColor3 = Color3.fromRGB(40, 40, 40) end end) if player.Character then whenmoving(player.Character) end player.CharacterAdded:Connect(function(char) whenmoving(char) 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, }) local Tabs = { Main = Window:AddTab("Main", "disc"), Physics = Window:AddTab("Physics", "zap"), ["UI Settings"] = Window:AddTab("UI Settings", "monitor"), } local MagnetGroupBox = Tabs.Main:AddLeftGroupbox("Magnets", "magnet") local PullGroupBox = Tabs.Main:AddRightGroupbox("Pull Vector", "move") local SpeedGroupBox = Tabs.Physics:AddLeftGroupbox("CFrame Speed", "zap") local JumpPowerGroupBox = Tabs.Physics:AddRightGroupbox("Jump Power", "arrow-up") local TackleGroupBox = Tabs.Physics:AddLeftGroupbox("Tackle", "target") local MenuGroup = Tabs["UI Settings"]:AddLeftGroupbox("Menu", "wrench") MagnetGroupBox:AddToggle("MagnetToggle", { Text = "Enable Magnets", Default = false, Tooltip = "Toggle magnet functionality", Callback = function(Value) getgenv().MagsActivated = Value if not Value then removeHitboxes() end end }) MagnetGroupBox:AddToggle("ShowHitbox", { Text = "Show Hitbox", Default = false, Tooltip = "Show visual hitbox", Callback = function(Value) getgenv().ShowHitbox = Value if not Value then removeHitboxes() end end }) MagnetGroupBox:AddSlider("MagDistance", { Text = "Mag Distance", Default = 10, Min = 1, Max = 100, Rounding = 0, Compact = false, Callback = function(Value) getgenv().MagsRange = Value end }) PullGroupBox:AddToggle("PullVectorToggle", { Text = "Pull Vector", Default = false, Tooltip = "Enable pull vector (shows button on screen)", Callback = function(Value) getgenv().PullEnabled = Value pullButton.Visible = Value if not Value then pullButtonHeld = false pullButton.BackgroundColor3 = Color3.fromRGB(40, 40, 40) end end }) PullGroupBox:AddSlider("PullVectorSlider", { Text = "Pull Power", Default = 10, Min = 1, Max = 25, Rounding = 1, Compact = false, Callback = function(Value) getgenv().PullPower = Value end }) SpeedGroupBox:AddToggle("CFrameSpeed", { Text = "CFrame Speed", Default = false, Tooltip = "Enable CFrame-based movement", Callback = function(state) getgenv().SpeedEnabled = state if state then startMovementSystem() else stopMovementSystem() end end }) SpeedGroupBox:AddSlider("SpeedValue", { Text = "Speed Value", Default = 1, Min = 1, Max = 5, Rounding = 1, Compact = false, Callback = function(value) getgenv().SpeedValue = value end }) JumpPowerGroupBox:AddToggle("JumpPower", { Text = "Jump Power", Default = false, Tooltip = "Enable jump power boost", Callback = function(Value) getgenv().JumpPowerOn = Value end }) JumpPowerGroupBox:AddSlider("JumpBoost", { Text = "Jump Boost", Default = 50, Min = 50, Max = 120, Rounding = 1, Compact = false, Callback = function(Value) getgenv().JumpBoost = Value end }) TackleGroupBox:AddToggle("ClickTackleToggle", { Text = "Click Tackle", Default = false, Tooltip = "Click/tap to teleport to ball carrier", Callback = function(Value) getgenv().ClickTackleEnabled = Value if Value then enableClickTackle() else disableClickTackle() end end }):AddKeyPicker("ClickTackleKey", { Default = "X", SyncToggleState = true, Mode = "Toggle", Text = "Click Tackle Key", Callback = function(active) TackleGroupBox:SetToggle("ClickTackleToggle", active) end, }) TackleGroupBox:AddSlider("ClickTackleRange", { Text = "Tackle Range", Default = 15, Min = 1, Max = 30, Rounding = 1, Compact = false, Callback = function(Value) getgenv().ClickTackleRange = 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/Football") SaveManager:BuildConfigSection(Tabs["UI Settings"]) ThemeManager:ApplyToTab(Tabs["UI Settings"]) Library:Notify({ Title = "Kali Hub", Description = "Football loaded successfully!", Time = 5, }) Library:OnUnload(function() getgenv().MagsActivated = false getgenv().ShowHitbox = false getgenv().SpeedEnabled = false getgenv().JumpPowerOn = false getgenv().PullEnabled = false getgenv().ClickTackleEnabled = false removeHitboxes() stopMovementSystem() disableClickTackle() if pullButtonGui then pullButtonGui:Destroy() end Library.Unloaded = true end)