
Key Required VerifiedUniversal

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)



good shi
nice