Basketball Legends Script and Hack - Aimbot, Ball Magnet

Project Information

Developer: vnausea, RadeonScripts
Status: UNDETECTED
Updated: May 1, 2026 at 4:06 AM
Version: 1.1.1
Compatibility: PC (Windows, MacOS) - Mobile (iOS, Android)
Updates & Support:

Basketball Legends Script and Hack - Auto Green, Ball Magnet

One of the best free scripts and hacks for Basketball Legends game from Roblox universe with Auto Green, Ball Magnet, Speed Changer features. Just three features that will be able to change your game and add more game features. Thanks to this script you will be able to beat your opponents without much trouble and be the first in the game table. Use this script to play with your friends exclusively in fan mode. Works on PC through emulators, as well as on the mobile version of the Roblox game.

Basketball Legends Script Best (Kali Hub) No Key - Auto Green, Speed Changer, Ball Magnet, Auto Time

Basketball Legends Kali Hub

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)

Basketball Legends Script Zenith Hub

Basketball Legends Script Zenith Hub

loadstring(game:HttpGet("https://raw.githubusercontent.com/2k7kurai/Zenith-Immortal-Hub/refs/heads/main/script%20hub"))()

Basketball Legends Script Roblox 2026

loadstring(game:HttpGet("https://raw.githubusercontent.com/SETHHHX/.../refs/heads/main/Basketball%20legends"))()

Basketball Legends Script Pastebin - Auto Shoot, Auto Play, Auto Perfect

Basketball Legends script pastebin

loadstring(game:HttpGet("https://pastebin.com/raw/EKEfKzZG"))()

Basketball Legends Script GUI - Auto Perfect, Ball Magnet, Auto Guard

Basketball Legends Script GUI

loadstring(game:HttpGet('https://api.exploitingis.fun/loader', true))()

Basketball Legends [2X] Script Mobile - Aimbot X2

Basketball Legends [2X] Script Mobile

loadstring(game:HttpGet("https://pastefy.app/MG0EcNGO/raw"))()

Basketball Legends Script - Auto Shoot, Auto Guard

Basketball Legends Script - Auto Shoot

loadstring(game:HttpGet("https://raw.githubusercontent.com/RadeonScripts/RadeonHubMain/main/MainRobloxExploit"))()

Basketball Legends Auto Script Vision Hub

loadstring(game:HttpGet(('https://pastebin.com/raw/Nd8va3iK')))(

Get Basketball Legends Script and Hack 

Auto Perfect Shot

loadstring(game:HttpGet("https://raw.githubusercontent.com/vnausea/absence-mini/refs/heads/main/absencemini.lua"))()

ChangeLogs:

- Added Basketball Legends Script - Auto Shoot, Auto Guard


ChangeLogs:

1-05-2026, 04:06: - Added Basketball Legends Script Best (Kali Hub) No Key - Auto Green, Speed Changer, Ball Magnet, Auto Time

Free Download Basketball Legends Script and Hack - Aimbot, Ball Magnet

Only authorized users can download files. Please Log in or Register on the website.
Comments: 0 Views: 121 313

0 comments

No Comments