Kali Hub LEAKED SOURCE
Key Required

Kali Hub LEAKED SOURCE

[🎃]🏀Basketball Legends🏀WaylonTheEvidentWaylonTheEvident 7.5K views 6.2K executesUpdated Dec 8, 2025
4.2/ 5(6 votes)
5183% Positive
Lua Script•1256 lines (39604 chars)
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local HttpService = game:GetService("HttpService")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TeleportService = game:GetService("TeleportService")

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 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", "house"),
    Player = Window:AddTab("Player", "user"),
    Misc = Window:AddTab("Misc", "settings"),
    ["UI Settings"] = Window:AddTab("UI Settings", "monitor"),
}

local function IsPark()
    if workspace:WaitForChild("Game"):FindFirstChild("Courts") then
        return true
    else
        return false
    end
end

local isPark = IsPark()
local ShootingGroup = Tabs.Main:AddLeftGroupbox("Auto Shooting", "target")
local GuardGroup = Tabs.Main:AddRightGroupbox("Auto Guard", "shield")
local ReboundGroup = Tabs.Main:AddLeftGroupbox("Auto Rebound & Steal", "backpack")
local PostGroup = Tabs.Main:AddRightGroupbox("Post Aimbot", "rotate-cw")
local SpeedGroup = Tabs.Player:AddLeftGroupbox("Speed Boost", "zap")
local MiscGroup = Tabs.Misc:AddLeftGroupbox("Visuals", "eye")
local AnimationGroup = Tabs.Misc:AddRightGroupbox("Animation Changer", "play")
local MenuGroup = Tabs["UI Settings"]:AddLeftGroupbox("Menu", "wrench")

local visualGui = player.PlayerGui:WaitForChild("Visual")
local shootingElement = visualGui:WaitForChild("Shooting")
local Shoot = ReplicatedStorage.Packages.Knit.Services.ControlService.RE.Shoot

local autoShootEnabled = false
local autoGuardEnabled = false
local autoGuardToggleEnabled = false
local holdingG = false
local speedBoostEnabled = false
local postAimbotEnabled = false

local desiredSpeed = 30
local predictionTime = 0.3
local guardDistance = 10
local shootPower = 0.8
local postActivationDistance = 10

local visibleConn = nil
local autoGuardConnection = nil
local speedBoostConnection = nil
local postAimbotConnection = nil
local lastPositions = {}

local postHoldActive = false
local lastPostUpdate = 0
local POST_UPDATE_INTERVAL = 0.033

ShootingGroup:AddToggle("AutoShoot", {
    Text = "Auto Time",
    Default = false,
    Tooltip = "Automatically shoots with perfect timing",
    Callback = function(value)
        autoShootEnabled = value
        if autoShootEnabled then
            if not visibleConn then
                visibleConn = shootingElement:GetPropertyChangedSignal("Visible"):Connect(function()
                    if autoShootEnabled and shootingElement.Visible == true then
                        task.wait(0.25)
                        Shoot:FireServer(shootPower)
                    end
                end)
            end
        else
            if visibleConn then
                visibleConn:Disconnect()
                visibleConn = nil
            end
        end
    end
})

ShootingGroup:AddSlider("ShootTiming", {
    Text = "Shot Timing",
    Default = 80,
    Min = 50,
    Max = 100,
    Rounding = 0,
    Tooltip = "Adjust the timing of the shot (80 = Mediocre, 90 = Good, 95 = Great, 100 = Perfect)",
    Callback = function(value)
        shootPower = value / 100
    end
})

ShootingGroup:AddLabel("Shot Timing Guide:\n80 = Mediocre\n90 = Good\n95 = Great\n100 = Perfect", true)

local function getPlayerFromModel(model)
    for _, plr in pairs(Players:GetPlayers()) do
        if plr.Character == model then
            return plr
        end
    end
    return nil
end

local function isOnDifferentTeam(otherModel)
    local otherPlayer = getPlayerFromModel(otherModel)
    if not otherPlayer then return false end
    
    if not player.Team or not otherPlayer.Team then
        return otherPlayer ~= player
    end
    
    return player.Team ~= otherPlayer.Team
end

local function findPlayerWithBall()
    if isPark then
        local closestPlayer = nil
        local closestDistance = math.huge

        for _, model in pairs(workspace:GetChildren()) do
            if model:IsA("Model") and model:FindFirstChild("HumanoidRootPart") and model ~= player.Character then
                local tool = model:FindFirstChild("Basketball")
                if tool and tool:IsA("Tool") then
                    local hrp = model.HumanoidRootPart
                    local dist = (hrp.Position - player.Character.HumanoidRootPart.Position).Magnitude
                    if dist < closestDistance then
                        closestDistance = dist
                        closestPlayer = model
                    end
                end
            end
        end

        if closestPlayer then
            return closestPlayer, closestPlayer:FindFirstChild("HumanoidRootPart")
        end

        return nil, nil
    end

    local looseBall = workspace:FindFirstChild("Basketball")
    if looseBall and looseBall:IsA("BasePart") then
        local closestPlayer = nil
        local closestDistance = math.huge
        
        for _, model in pairs(workspace:GetChildren()) do
            if model:IsA("Model") and model:FindFirstChild("HumanoidRootPart") and model ~= player.Character then
                if isOnDifferentTeam(model) then
                    local rootPart = model:FindFirstChild("HumanoidRootPart")
                    local distance = (looseBall.Position - rootPart.Position).Magnitude
                    
                    if distance < closestDistance and distance < 15 then
                        closestDistance = distance
                        closestPlayer = model
                    end
                end
            end
        end
        
        if closestPlayer then
            return closestPlayer, closestPlayer:FindFirstChild("HumanoidRootPart")
        end
    end
    
    for _, model in pairs(workspace:GetChildren()) do
        if model:IsA("Model") and model:FindFirstChild("HumanoidRootPart") and model ~= player.Character then
            if isOnDifferentTeam(model) then
                local humanoidRootPart = model:FindFirstChild("HumanoidRootPart")
                local basketball = model:FindFirstChild("Basketball")
                
                if basketball and basketball:IsA("Tool") then
                    return model, humanoidRootPart
                end
            end
        end
    end
    
    return nil, nil
end

local function getClosestOpponent()
    local char = player.Character
    if not char then return nil end
    local myRoot = char:FindFirstChild("HumanoidRootPart")
    if not myRoot then return nil end

    local closest, minDist = nil, postActivationDistance
    for _, plr in pairs(Players:GetPlayers()) do
        if plr ~= player and plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") then
            if isOnDifferentTeam(plr.Character) then
                local enemyRoot = plr.Character.HumanoidRootPart
                local dist = (enemyRoot.Position - myRoot.Position).Magnitude
                if dist < minDist then
                    closest = enemyRoot
                    minDist = dist
                end
            end
        end
    end
    return closest
end

local function playerHasBall()
    local char = player.Character
    if not char then return false end
    local basketballTool = char:FindFirstChild("Basketball")
    return basketballTool and basketballTool:IsA("Tool")
end

local function detectBallHand()
    local char = player.Character
    if not char then return "right" end
    
    local basketballTool = char:FindFirstChild("Basketball")
    if basketballTool and basketballTool:IsA("Tool") then
        local handle = basketballTool:FindFirstChild("Handle")
        if handle then
            local charRoot = char:FindFirstChild("HumanoidRootPart")
            if charRoot then
                local relativePos = charRoot.CFrame:ToObjectSpace(handle.CFrame)
                if relativePos.X > 0 then
                    return "right"
                else
                    return "left"
                end
            end
        end
    end
    return "right"
end

local function executePostAimbot()
    local currentTime = tick()
    if currentTime - lastPostUpdate < POST_UPDATE_INTERVAL then
        return
    end
    lastPostUpdate = currentTime

    if not postHoldActive then return end
    
    local char = player.Character
    if not char then return end
    local myRoot = char:FindFirstChild("HumanoidRootPart")
    if not myRoot then return end
    
    local hasBall = playerHasBall()
    local target = getClosestOpponent()
    
    if target then
        local directionToTarget = (target.Position - myRoot.Position).Unit
        local faceTarget = CFrame.new(myRoot.Position, myRoot.Position + directionToTarget)
        
        if hasBall then
            local ballHand = detectBallHand()
            if ballHand == "left" then
                myRoot.CFrame = faceTarget * CFrame.Angles(0, math.rad(90), 0)
            else
                myRoot.CFrame = faceTarget * CFrame.Angles(0, math.rad(-90), 0)
            end
        else
            myRoot.CFrame = faceTarget
        end
    end
end

PostGroup:AddToggle("PostAimbot", {
    Text = "Post Aimbot",
    Default = false,
    Tooltip = "Automatically face opponents when posting up (detects ball hand)",
    Callback = function(value)
        postAimbotEnabled = value
        if not value then
            postHoldActive = false
            if postAimbotConnection then
                postAimbotConnection:Disconnect()
                postAimbotConnection = nil
            end
        end
    end
}):AddKeyPicker("PostAimbotKey", {
    Default = "P",
    SyncToggleState = false,
    Mode = "Hold",
    Text = "Post Aimbot Key",
    Callback = function(active)
        if not postAimbotEnabled then return end
        postHoldActive = active
        
        if active and not postAimbotConnection then
            postAimbotConnection = RunService.Heartbeat:Connect(executePostAimbot)
        elseif not active and postAimbotConnection then
            postAimbotConnection:Disconnect()
            postAimbotConnection = nil
        end
    end
})

PostGroup:AddSlider("PostActivationDistance", {
    Text = "Activation Distance",
    Default = 10,
    Min = 5,
    Max = 20,
    Rounding = 0,
    Tooltip = "Maximum distance to detect opponents",
    Callback = function(value)
        postActivationDistance = value
    end
})

PostGroup:AddLabel("Automatically detects which hand\nhas the ball and posts accordingly", true)

local function autoGuard()
    if not autoGuardEnabled then return end
    if Players.LocalPlayer:FindFirstChild("Basketball") then return end
    
    local character = player.Character
    if not character then return end
    
    local humanoid = character:FindFirstChildOfClass("Humanoid")
    local rootPart = character:FindFirstChild("HumanoidRootPart")
    if not humanoid or not rootPart then return end
    
    local ballCarrier, ballCarrierRoot = findPlayerWithBall()
    
    if ballCarrier and ballCarrierRoot then
        local distance = (rootPart.Position - ballCarrierRoot.Position).Magnitude
        local currentPos = ballCarrierRoot.Position
        local velocity = Vector3.new(0, 0, 0)
        
        if lastPositions[ballCarrier] then
            velocity = (currentPos - lastPositions[ballCarrier]) / task.wait()
        end
        lastPositions[ballCarrier] = currentPos
        
        local predictedPos = currentPos + (velocity * predictionTime * 60)
        local directionToOpponent = (predictedPos - rootPart.Position).Unit
        local defensiveOffset = directionToOpponent * 5
        local defensivePosition = predictedPos - defensiveOffset
        
        defensivePosition = Vector3.new(defensivePosition.X, rootPart.Position.Y, defensivePosition.Z)
        
        if distance <= guardDistance then
            humanoid:MoveTo(defensivePosition)
            
            local VirtualInputManager = game:GetService("VirtualInputManager")
            if distance <= 10 then
                VirtualInputManager:SendKeyEvent(true, Enum.KeyCode.F, false, game)
            else
                VirtualInputManager:SendKeyEvent(false, Enum.KeyCode.F, false, game)
            end
        else
            local VirtualInputManager = game:GetService("VirtualInputManager")
            VirtualInputManager:SendKeyEvent(false, Enum.KeyCode.F, false, game)
        end
    else
        local VirtualInputManager = game:GetService("VirtualInputManager")
        VirtualInputManager:SendKeyEvent(false, Enum.KeyCode.F, false, game)
    end
end

GuardGroup:AddToggle("AutoGuard", {
    Text = "Auto Guard",
    Default = false,
    Tooltip = "Enable auto guard feature (hold G to activate)",
    Callback = function(value)
        autoGuardToggleEnabled = value
        
        if not value then
            autoGuardEnabled = false
            if autoGuardConnection then
                autoGuardConnection:Disconnect()
                autoGuardConnection = nil
            end
            
            lastPositions = {}
            
            local VirtualInputManager = game:GetService("VirtualInputManager")
            VirtualInputManager:SendKeyEvent(false, Enum.KeyCode.F, false, game)
        end
    end
})

local teleportEnabled = false
local offsetDistance = 3 

RunService.RenderStepped:Connect(function()
    if not teleportEnabled then return end
    local char = player.Character
    if not char then return end
    local hrp = char:FindFirstChild("HumanoidRootPart")
    if not hrp then return end

    local closestBall
    local closestDist = math.huge
    local maxDistance = isPark and 100 or math.huge

    for _, child in ipairs(workspace:GetChildren()) do
        if child.Name == "Basketball" then
            local part = child:IsA("BasePart") and child or child:FindFirstChildWhichIsA("BasePart")
            if part then
                local dist = (part.Position - hrp.Position).Magnitude
                if dist < closestDist and dist <= maxDistance then
                    closestDist = dist
                    closestBall = part
                end
            end
        end
    end

    if closestBall then
        local targetPosition = closestBall.Position + closestBall.CFrame.LookVector * offsetDistance
        hrp.CFrame = CFrame.new(targetPosition)
    end
end)

local function toggleTeleport()
    teleportEnabled = not teleportEnabled
end

ReboundGroup:AddToggle("ReboundAutoSteal", {
    Text = "Auto Rebound & Steal",
    Default = false,
    Tooltip = "Will automatically rebound and steal the ball",
    Callback = function(enabled)
        toggleTeleport(enabled) 
    end
})
:AddKeyPicker("ReboundAutoStealKey", {
    Default = "T",
    SyncToggleState = true,
    Mode = "Toggle",
    Text = "Auto Rebound & Steal Key",
    Callback = function(active)
        ReboundGroup:SetToggle("ReboundAutoSteal", active)
    end
})

ReboundGroup:AddSlider("Offset distance", {
    Text = "Rebound & Steal offset distance",
    Default = 0,
    Min = 0,
    Max = 6,
    Rounding = 1,
    Tooltip = "how far ahead of the basketball you will be teleported to",
    Callback = function(value)
        offsetDistance = value
    end
})

local FollowBallCarrierGroup = Tabs.Main:AddLeftGroupbox("Follow Ball Carrier", "users")

local followEnabled = false
local followConnection = nil
local followOffset = 3

local function enableFollowBallCarrier()
    if followEnabled then return end
    followEnabled = true
    
    followConnection = RunService.Heartbeat:Connect(function()
        if not followEnabled then return end
        
        local char = player.Character
        if not char then return end
        local hrp = char:FindFirstChild("HumanoidRootPart")
        if not hrp then return end
        
        local ballCarrier, ballCarrierRoot = findPlayerWithBall()
        
        if ballCarrier and ballCarrierRoot then
            local maxDistance = isPark and 100 or math.huge
            local dist = (hrp.Position - ballCarrierRoot.Position).Magnitude
            
            if dist <= maxDistance then
                hrp.CFrame = ballCarrierRoot.CFrame * CFrame.new(0, 0, followOffset)
            end
        end
    end)
end

local function disableFollowBallCarrier()
    if not followEnabled then return end
    followEnabled = false
    
    if followConnection then
        followConnection:Disconnect()
        followConnection = nil
    end
end

FollowBallCarrierGroup:AddToggle("FollowBallCarrier", {
    Text = "Follow Ball Carrier",
    Default = false,
    Tooltip = "Instantly teleports you to whoever has the ball",
    Callback = function(value)
        if value then
            enableFollowBallCarrier()
        else
            disableFollowBallCarrier()
        end
    end
}):AddKeyPicker("FollowBallCarrierKey", {
    Default = "H",
    SyncToggleState = true,
    Mode = "Toggle",
    Text = "Follow Ball Carrier Key",
    Callback = function(active)
        FollowBallCarrierGroup:SetToggle("FollowBallCarrier", active)
    end
})

FollowBallCarrierGroup:AddSlider("FollowOffset", {
    Text = "Follow Offset",
    Default = -10,
    Min = -10,
    Max = 10,
    Rounding = 0,
    Tooltip = "Distance in front of the ball carrier",
    Callback = function(value)
        followOffset = value
    end
})

local MagsDist = 30
local magnetEnabled = false
local magnetConnection = nil

local stealReachEnabled = false
local stealReachMultiplier = 1.5
local originalRightArmSize, originalLeftArmSize

local function updateHitboxSizes()
    local char = player.Character
    if not char then return end
    
    local rightArm = char:FindFirstChild("Right Arm") or char:FindFirstChild("RightHand") or char:FindFirstChild("RightLowerArm")
    local leftArm = char:FindFirstChild("Left Arm") or char:FindFirstChild("LeftHand") or char:FindFirstChild("LeftLowerArm")
    
    if stealReachEnabled then
        if rightArm then
            if not originalRightArmSize then originalRightArmSize = rightArm.Size end
            rightArm.Size = Vector3.new(
                originalRightArmSize.X * stealReachMultiplier,
                originalRightArmSize.Y * stealReachMultiplier,
                originalRightArmSize.Z * stealReachMultiplier
            )
            rightArm.Transparency = 1
            rightArm.CanCollide = false
            rightArm.Massless = true
        end
        
        if leftArm then
            if not originalLeftArmSize then originalLeftArmSize = leftArm.Size end
            leftArm.Size = Vector3.new(
                originalLeftArmSize.X * stealReachMultiplier,
                originalLeftArmSize.Y * stealReachMultiplier,
                originalLeftArmSize.Z * stealReachMultiplier
            )
            leftArm.Transparency = 1
            leftArm.CanCollide = false
            leftArm.Massless = true
        end
    else
        if rightArm and originalRightArmSize then
            rightArm.Size = originalRightArmSize
            rightArm.Transparency = 0
            rightArm.CanCollide = false
            rightArm.Massless = false
            originalRightArmSize = nil
        end
        
        if leftArm and originalLeftArmSize then
            leftArm.Size = originalLeftArmSize
            leftArm.Transparency = 0
            leftArm.CanCollide = false
            leftArm.Massless = false
            originalLeftArmSize = nil
        end
    end
end


RunService.RenderStepped:Connect(function()
    if stealReachEnabled then
        updateHitboxSizes()
    end
end)


local Reach = Tabs.Main:AddLeftGroupbox("Reach")

local stealReachEnabled = false
local stealReachMultiplier = 1.5

Reach:AddToggle("StealReach", {
    Text = "Steal Reach",
    Default = false,
    Tooltip = "Enable or disable extended reach for stealing",
    Callback = function(value)
        stealReachEnabled = value
        updateHitboxSizes()
    end
})

Reach:AddSlider("StealReachMultiplier", {
    Text = "Steal Reach Multiplier",
    Default = 1.5,
    Min = 1,
    Max = 20,
    Rounding = 1,
    Tooltip = "Adjust how far your reach extends",
    Callback = function(value)
        stealReachMultiplier = value
        if stealReachEnabled then
            updateHitboxSizes()
        end
    end
})


local BallMagnetGroup = Tabs.Main:AddRightGroupbox("Ball Magnet")

BallMagnetGroup:AddToggle("BallMagnet", {
    Text = "Ball Magnet",
    Default = false,
    Tooltip = "Automatically magnets you to the basketball",
    Callback = function(value)
        magnetEnabled = value
        if not value and magnetConnection then
            magnetConnection:Disconnect()
            magnetConnection = nil
        end
    end
}):AddKeyPicker("BallMagnetKey", {
    Default = "M",
    SyncToggleState = true,
    Mode = "Toggle",
    Text = "Ball Magnet Key",
    Callback = function(active)
        BallMagnetGroup:SetToggle("BallMagnet", active)
    end
})

BallMagnetGroup:AddSlider("BallMagnetDistance", {
    Text = "Magnet Distance",
    Default = 30,
    Min = 10,
    Max = 85,
    Rounding = 0,
    Tooltip = "Maximum distance to magnet from",
    Callback = function(value)
        MagsDist = value
    end
})

magnetConnection = RunService.Heartbeat:Connect(function()
    if not magnetEnabled then return end
    
    local char = player.Character
    if not char then return end
    local hrp = char:FindFirstChild("HumanoidRootPart")
    if not hrp then return end
    
    for _, v in ipairs(workspace:GetDescendants()) do
        if v:IsA("BasePart") and v.Name == "Basketball" then
            local dist = (hrp.Position - v.Position).Magnitude
            if dist <= MagsDist then
                local touch = v:FindFirstChildOfClass("TouchTransmitter")
                if not touch then
                    for _, d in ipairs(v:GetDescendants()) do
                        if d:IsA("TouchTransmitter") then
                            touch = d
                            break
                        end
                    end
                end
                if touch then
                    firetouchinterest(hrp, v, 0)
                    firetouchinterest(hrp, v, 1)
                end
            end
        end
    end
end)

UserInputService.InputBegan:Connect(function(input, gameProcessed)
    if input.KeyCode == Enum.KeyCode.G and not gameProcessed then
        if autoGuardToggleEnabled then
            holdingG = true
            autoGuardEnabled = true
            lastPositions = {}
            if not autoGuardConnection then
                autoGuardConnection = RunService.Heartbeat:Connect(autoGuard)
            end
        end
    end
end)

UserInputService.InputEnded:Connect(function(input, gameProcessed)
    if input.KeyCode == Enum.KeyCode.G then
        holdingG = false
        autoGuardEnabled = false
        
        if autoGuardConnection then
            autoGuardConnection:Disconnect()
            autoGuardConnection = nil
        end
        
        lastPositions = {}
        
        local VirtualInputManager = game:GetService("VirtualInputManager")
        VirtualInputManager:SendKeyEvent(false, Enum.KeyCode.F, false, game)
    end
end)

GuardGroup:AddLabel("Hold G to activate auto guard\n(toggle must be enabled)", true)

GuardGroup:AddSlider("GuardDistance", {
    Text = "Guard Distance",
    Default = 10,
    Min = 5,
    Max = 20,
    Rounding = 0,
    Tooltip = "Maximum distance to start guarding",
    Callback = function(value)
        guardDistance = value
    end
})

GuardGroup:AddSlider("PredictionTime", {
    Text = "Prediction Time",
    Default = 0.3,
    Min = 0.1,
    Max = 0.8,
    Rounding = 1,
    Tooltip = "How far ahead to predict opponent movement (seconds)",
    Callback = function(value)
        predictionTime = value
    end
})

GuardGroup:AddLabel("Auto Guard will predict opponent\nmovement and position defensively\nin front of them while holding F.", true)

local function startCFrameSpeed(speed)
    local connection
    connection = RunService.RenderStepped:Connect(function(deltaTime)
        local character = player.Character
        if not character then return end
        local root = character:FindFirstChild("HumanoidRootPart")
        local humanoid = character:FindFirstChildOfClass("Humanoid")
        if not root or not humanoid then return end

        local moveVec = humanoid.MoveDirection
        if moveVec.Magnitude > 0 then
            local speedDelta = math.max(speed - humanoid.WalkSpeed, 0)
            root.CFrame = root.CFrame + (moveVec.Unit * speedDelta * deltaTime)
        end
    end)
    return function()
        if connection then
            connection:Disconnect()
        end
    end
end

SpeedGroup:AddToggle("SpeedBoost", {
    Text = "Speed Boost",
    Default = false,
    Tooltip = "Enable or disable speed boost (CFrame method)",
    Callback = function(value)
        speedBoostEnabled = value
        if value then
            if speedBoostConnection then speedBoostConnection() end
            speedBoostConnection = startCFrameSpeed(desiredSpeed)
        else
            if speedBoostConnection then speedBoostConnection() end
            speedBoostConnection = nil
        end
    end
})

SpeedGroup:AddSlider("SpeedAmount", {
    Text = "Speed Amount",
    Default = 16,
    Min = 16,
    Max = 23,
    Rounding = 1,
    Tooltip = "Adjust the speed boost amount",
    Callback = function(value)
        desiredSpeed = value
        if speedBoostEnabled then
            if speedBoostConnection then speedBoostConnection() end
            speedBoostConnection = startCFrameSpeed(desiredSpeed)
        end
    end
})

local function setBGVisibleToTrue()
    for _, model in pairs(workspace:GetChildren()) do
        if model:IsA("Model") and model:FindFirstChild("HumanoidRootPart") then
            local humanoidRootPart = model.HumanoidRootPart
            for _, obj in pairs(humanoidRootPart:GetDescendants()) do
                if obj.Name == "BG" and obj:IsA("BodyGyro") then
                    obj.Parent = humanoidRootPart
                    obj.MaxTorque = Vector3.new(9e9, 9e9, 9e9)
                    obj.P = 9e4
                    obj.D = 500
                    obj.CFrame = humanoidRootPart.CFrame
                end
            end
        end
    end
end

local function hideBG()
    for _, model in pairs(workspace:GetChildren()) do
        if model:IsA("Model") and model:FindFirstChild("HumanoidRootPart") then
            local humanoidRootPart = model.HumanoidRootPart
            for _, obj in pairs(humanoidRootPart:GetDescendants()) do
                if obj.Name == "BG" and obj:IsA("BodyGyro") then
                    obj.Parent = nil
                end
            end
        end
    end
end

MiscGroup:AddToggle("ShowBG", {
    Text = "Show BodyGyro",
    Default = false,
    Tooltip = "Makes BodyGyro visible for all players",
    Callback = function(value)
        if value then
            setBGVisibleToTrue()
        else
            hideBG()
        end
    end
})

local AnimationsFolder = ReplicatedStorage:WaitForChild("Assets"):WaitForChild("Animations_R15")
local selectedDunkAnim = "Default"
local selectedEmoteAnim = "Dance_Casual"
local animationSpoofEnabled = false
local dunkSpoofConnection = nil
local emoteSpoofConnection = nil
local charAddedConnDunk = nil
local charAddedConnEmote = nil

local EmoteAnimations = {
    Default = "Dance_Casual",
    Dance_Sturdy = "Dance_Sturdy",
    Dance_Taunt = "Dance_Taunt",
    Dance_TakeFlight = "Dance_TakeFlight",
    Dance_Flex = "Dance_Flex",
    Dance_Bat = "Dance_Bat",
    Dance_Twist = "Dance_Twist",
    Dance_Griddy = "Dance_Griddy",
    Dance_Dab = "Dance_Dab",
    Dance_Drake = "Dance_Drake",
    Dance_Fresh = "Dance_Fresh",
    Dance_Hype = "Dance_Hype",
    Dance_Spongebob = "Dance_Spongebob",
    Dance_Backflip = "Dance_Backflip",
    Dance_L = "Dance_L",
    Dance_Facepalm = "Dance_Facepalm",
    Dance_Bow = "Dance_Bow"
}

local emoteOptions = {}
for key, _ in pairs(EmoteAnimations) do
    table.insert(emoteOptions, key)
end
table.sort(emoteOptions)

local function setupDunkSpoof(humanoid)
    local animator = humanoid:FindFirstChildOfClass("Animator") or Instance.new("Animator", humanoid)
    return animator.AnimationPlayed:Connect(function(track)
        if animationSpoofEnabled and track.Animation.Name == "Dunk_Default" and selectedDunkAnim ~= "Default" then
            track:Stop()
            local customAnim = AnimationsFolder:FindFirstChild("Dunk_" .. selectedDunkAnim)
            if customAnim then
                humanoid:LoadAnimation(customAnim):Play()
            end
        end
    end)
end

local function setupEmoteSpoof(humanoid)
    local animator = humanoid:FindFirstChildOfClass("Animator") or Instance.new("Animator", humanoid)
    return animator.AnimationPlayed:Connect(function(track)
        if animationSpoofEnabled and track.Animation.Name == "Dance_Casual" and selectedEmoteAnim ~= "Dance_Casual" then
            track:Stop()
            local customAnim = AnimationsFolder:FindFirstChild(selectedEmoteAnim)
            if customAnim then
                humanoid:LoadAnimation(customAnim):Play()
            end
        end
    end)
end

local function enableAnimationSpoof()
    local char = player.Character
    if char then
        local humanoid = char:FindFirstChildOfClass("Humanoid")
        if humanoid then
            if dunkSpoofConnection then dunkSpoofConnection:Disconnect() end
            if emoteSpoofConnection then emoteSpoofConnection:Disconnect() end
            dunkSpoofConnection = setupDunkSpoof(humanoid)
            emoteSpoofConnection = setupEmoteSpoof(humanoid)
        end
    end

    if charAddedConnDunk then charAddedConnDunk:Disconnect() end
    if charAddedConnEmote then charAddedConnEmote:Disconnect() end

    charAddedConnDunk = player.CharacterAdded:Connect(function(newChar)
        local humanoid = newChar:WaitForChild("Humanoid")
        if dunkSpoofConnection then dunkSpoofConnection:Disconnect() end
        dunkSpoofConnection = setupDunkSpoof(humanoid)
    end)

    charAddedConnEmote = player.CharacterAdded:Connect(function(newChar)
        local humanoid = newChar:WaitForChild("Humanoid")
        if emoteSpoofConnection then emoteSpoofConnection:Disconnect() end
        emoteSpoofConnection = setupEmoteSpoof(humanoid)
    end)
end

local function disableAnimationSpoof()
    if dunkSpoofConnection then
        dunkSpoofConnection:Disconnect()
        dunkSpoofConnection = nil
    end
    if emoteSpoofConnection then
        emoteSpoofConnection:Disconnect()
        emoteSpoofConnection = nil
    end
    if charAddedConnDunk then
        charAddedConnDunk:Disconnect()
        charAddedConnDunk = nil
    end
    if charAddedConnEmote then
        charAddedConnEmote:Disconnect()
        charAddedConnEmote = nil
    end
end

AnimationGroup:AddToggle("AnimationSpoof", {
    Text = "Animation Changer",
    Default = false,
    Tooltip = "Enable animation spoofing for dunks and emotes",
    Callback = function(value)
        animationSpoofEnabled = value
        if value then
            enableAnimationSpoof()
        else
            disableAnimationSpoof()
        end
    end
})

AnimationGroup:AddDropdown("DunkSpoof", {
    Values = {"Default", "Testing", "Testing2", "Reverse", "360", "Testing3", "Tomahawk", "Windmill"},
    Default = 1,
    Multi = false,
    Text = "Dunk Animation",
    Tooltip = "Change your dunk animation",
    Callback = function(value)
        selectedDunkAnim = value
    end
})

AnimationGroup:AddDropdown("EmoteSpoof", {
    Values = emoteOptions,
    Default = 1,
    Multi = false,
    Text = "Emote Animation",
    Tooltip = "Change your emote/dance animation",
    Callback = function(value)
        selectedEmoteAnim = EmoteAnimations[value]
    end
})

local Http = (syn and syn.request) or (http and http.request) or (fluxus and fluxus.request) or (request) or (http_request)

local placesList = {}
local loadingPlaces = false

local TeleporterGroup = Tabs.Misc:AddLeftGroupbox("Teleporter", "move")

local PlaceDropdown = TeleporterGroup:AddDropdown("TeleportPlace", {
    Values = {"Loading places..."},
    Default = 1,
    Multi = false,
    Text = "Select Place",
    Tooltip = "Choose a place to teleport to"
})

local function loadPlaces()
    if loadingPlaces then return end
    loadingPlaces = true
    
    if not Http then
        PlaceDropdown:SetValues({"Current Place"})
        placesList["Current Place"] = game.PlaceId
        loadingPlaces = false
        return
    end
    
    local universeId = game.GameId
    local url = "https://develop.roblox.com/v1/universes/" .. universeId .. "/places?limit=100"
    
    local success, response = pcall(function()
        return Http({
            Url = url,
            Method = "GET",
            Headers = {
                ["User-Agent"] = "Roblox/WinInet",
                ["Content-Type"] = "application/json"
            }
        })
    end)
    
    if success and response and response.Body then
        local decodeSuccess, data = pcall(function()
            return HttpService:JSONDecode(response.Body)
        end)
        
        if decodeSuccess and data and data.data then
            for _, place in ipairs(data.data) do
                if place.name and place.id then
                    local displayName = place.name
                    if place.isRootPlace then
                        displayName = displayName .. " (Root)"
                    end
                    placesList[displayName] = place.id
                end
            end
        end
    end
    
    local placeNames = {}
    for name, _ in pairs(placesList) do
        table.insert(placeNames, name)
    end
    table.sort(placeNames)
    
    if #placeNames > 0 then
        PlaceDropdown:SetValues(placeNames)
        PlaceDropdown:SetValue(placeNames[1])
    else
        PlaceDropdown:SetValues({"Current Place"})
        placesList["Current Place"] = game.PlaceId
    end
    
    loadingPlaces = false
end

task.spawn(loadPlaces)

TeleporterGroup:AddButton({
    Text = "Teleport",
    Func = function()
        local selected = Options.TeleportPlace.Value
        local placeId = placesList[selected]
        
        if placeId then
            Library:Notify({
                Title = "Teleporting",
                Description = "Teleporting to " .. selected .. "...",
                Time = 3,
            })
            
            TeleportService:Teleport(placeId)
        end
    end,
    Tooltip = "Teleport to selected place"
})

TeleporterGroup:AddButton({
    Text = "Rejoin Current Server",
    Func = function()
        Library:Notify({
            Title = "Rejoining",
            Description = "Rejoining current server...",
            Time = 3,
        })
        
        TeleportService:TeleportToPlaceInstance(game.PlaceId, game.JobId, player)
    end,
    Tooltip = "Rejoin your current server"
})

TeleporterGroup:AddButton({
    Text = "Server Hop",
    Func = function()
        Library:Notify({
            Title = "Server Hopping",
            Description = "Finding best server...",
            Time = 3,
        })
        
        local servers = {}
        local cursor = ""
        
        repeat
            local url = "https://games.roblox.com/v1/games/" .. tostring(game.PlaceId) .. "/servers/Public?sortOrder=Asc&limit=100&cursor=" .. cursor
            
            local success, result = pcall(function()
                return game:HttpGet(url)
            end)
            
            if success then
                local decoded = HttpService:JSONDecode(result)
                cursor = decoded.nextPageCursor or ""
                
                for _, server in pairs(decoded.data) do
                    if server.playing < server.maxPlayers and server.id ~= game.JobId then
                        table.insert(servers, server)
                    end
                end
            else
                break
            end
        until cursor == ""
        
        if #servers > 0 then
            table.sort(servers, function(a, b)
                return a.playing < b.playing
            end)
            
            TeleportService:TeleportToPlaceInstance(game.PlaceId, servers[1].id, player)
        else
            Library:Notify({
                Title = "Server Hop Failed",
                Description = "No available servers found",
                Time = 3,
            })
        end
    end,
    Tooltip = "Join the server with the least players"
})

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:AddDropdown("DPIDropdown", {
    Values = { "50%", "75%", "100%", "125%", "150%", "175%", "200%" },
    Default = "100%",
    Text = "DPI Scale",
    Callback = function(Value)
        Value = Value:gsub("%%", "")
        local DPI = tonumber(Value)
        Library:SetDPIScale(DPI)
    end,
})

MenuGroup:AddDivider()

MenuGroup:AddLabel("Menu bind"):AddKeyPicker("MenuKeybind", { 
    Default = "LeftControl", 
    NoUI = true, 
    Text = "Menu keybind" 
})

MenuGroup:AddButton("Unload", function()
    Library:Unload()
end)

Library.ToggleKeybind = Options.MenuKeybind

MenuGroup:AddDivider()
MenuGroup:AddLabel("ThemeManager", true)
MenuGroup:AddLabel("SaveManager", true)

ThemeManager:SetLibrary(Library)
SaveManager:SetLibrary(Library)

SaveManager:IgnoreThemeSettings()
SaveManager:SetIgnoreIndexes({ "MenuKeybind" })

ThemeManager:SetFolder("KaliHub")
SaveManager:SetFolder("KaliHub/configs")

SaveManager:BuildConfigSection(Tabs["UI Settings"])
ThemeManager:ApplyToTab(Tabs["UI Settings"])

SaveManager:LoadAutoloadConfig()

Library:OnUnload(function()
    Library.Unloaded = true
    if visibleConn then
        visibleConn:Disconnect()
    end
    if autoGuardConnection then
        autoGuardConnection:Disconnect()
    end
    if speedBoostConnection then
        speedBoostConnection()
    end
    if magnetConnection then
        magnetConnection:Disconnect()
    end
    if postAimbotConnection then
        postAimbotConnection:Disconnect()
    end
    disableAnimationSpoof()
end)

Features & Information

Hi its leaked now -Aylon
#Leaked#Source#Basketball legends

Community Comments (2)

cash90954cash90954Jan 10, 2026

good shi

yohh67yohh67Mar 20, 2026

nice

More Scripts for [🎃]🏀Basketball Legends🏀