
Key RequiredUniversal

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)No comments yet for this script.

