
KeylessUniversal

--// Brookhaven Ball Launcher - Clean Live Tracking (Fixed Height)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local player = Players.LocalPlayer
local mouse = player:GetMouse()
local object = nil
local startPos, endPos
local progress = 0
local duration = 2
-- GUI
local screenGui = Instance.new("ScreenGui")
screenGui.ResetOnSpawn = false
screenGui.Parent = player:WaitForChild("PlayerGui")
local mainFrame = Instance.new("Frame")
mainFrame.Size = UDim2.new(0, 280, 0, 380)
mainFrame.Position = UDim2.new(0.5, -140, 0.5, -190)
mainFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
mainFrame.Parent = screenGui
Instance.new("UIStroke", mainFrame).Color = Color3.fromRGB(0, 255, 100)
Instance.new("UIStroke", mainFrame).Thickness = 3
Instance.new("UICorner", mainFrame).CornerRadius = UDim.new(0, 12)
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, 0, 0, 50)
title.BackgroundTransparency = 1
title.Text = "⚽ Ball Launcher"
title.TextColor3 = Color3.fromRGB(255, 255, 255)
title.TextScaled = true
title.Font = Enum.Font.GothamBold
title.Parent = mainFrame
local scrollFrame = Instance.new("ScrollingFrame")
scrollFrame.Size = UDim2.new(1, -20, 0, 220)
scrollFrame.Position = UDim2.new(0, 10, 0, 60)
scrollFrame.BackgroundColor3 = Color3.fromRGB(45, 45, 45)
scrollFrame.ScrollBarThickness = 8
scrollFrame.Parent = mainFrame
local listLayout = Instance.new("UIListLayout")
listLayout.Padding = UDim.new(0, 6)
listLayout.SortOrder = Enum.SortOrder.Name
listLayout.Parent = scrollFrame
local selectLabel = Instance.new("TextLabel")
selectLabel.Size = UDim2.new(1, -20, 0, 30)
selectLabel.Position = UDim2.new(0, 10, 0, 290)
selectLabel.BackgroundTransparency = 1
selectLabel.Text = "Selected: None"
selectLabel.TextColor3 = Color3.fromRGB(180, 180, 180)
selectLabel.TextScaled = true
selectLabel.Font = Enum.Font.Gotham
selectLabel.Parent = mainFrame
local launchButton = Instance.new("TextButton")
launchButton.Size = UDim2.new(1, -20, 0, 50)
launchButton.Position = UDim2.new(0, 10, 0, 325)
launchButton.BackgroundColor3 = Color3.fromRGB(0, 170, 80)
launchButton.Text = "🚀 LAUNCH BALL"
launchButton.TextColor3 = Color3.fromRGB(255, 255, 255)
launchButton.TextScaled = true
launchButton.Font = Enum.Font.GothamBold
launchButton.Parent = mainFrame
for _, v in ipairs({title, scrollFrame, launchButton}) do
Instance.new("UICorner", v).CornerRadius = UDim.new(0, v == title and 12 or 8)
end
local selectedPlayer = nil
local playerButtons = {}
local function createPlayerButton(plr)
if plr == player or playerButtons[plr] then return end
local btn = Instance.new("TextButton")
btn.Size = UDim2.new(1, -10, 0, 40)
btn.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
btn.Text = plr.Name
btn.TextColor3 = Color3.fromRGB(255, 255, 255)
btn.TextScaled = true
btn.Font = Enum.Font.Gotham
btn.Parent = scrollFrame
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 8)
btn.MouseButton1Click:Connect(function()
selectedPlayer = plr
selectLabel.Text = "Selected: " .. plr.Name
for _, b in pairs(playerButtons) do b.BackgroundColor3 = Color3.fromRGB(60, 60, 60) end
btn.BackgroundColor3 = Color3.fromRGB(0, 170, 80)
end)
playerButtons[plr] = btn
end
local function refreshList()
for _, plr in ipairs(Players:GetPlayers()) do
if plr ~= player then createPlayerButton(plr) end
end
scrollFrame.CanvasSize = UDim2.new(0, 0, 0, listLayout.AbsoluteContentSize.Y + 20)
end
refreshList()
Players.PlayerAdded:Connect(function(plr) if plr ~= player then createPlayerButton(plr) refreshList() end end)
Players.PlayerRemoving:Connect(function(plr)
if playerButtons[plr] then playerButtons[plr]:Destroy() playerButtons[plr] = nil end
if selectedPlayer == plr then selectedPlayer = nil selectLabel.Text = "Selected: None" end
refreshList()
end)
--// LAUNCH - Live tracking with clean height fix
launchButton.MouseButton1Click:Connect(function()
if not selectedPlayer then
selectLabel.Text = "Pick a player first!"
task.wait(1.5)
selectLabel.Text = "Selected: None"
return
end
object = workspace:FindFirstChild("Soccerg33ign3t", true)
if not object or not object:IsA("BasePart") then
warn("Ball not found! Click the soccer ball first.")
return
end
local targetPlr = selectedPlayer
print("Tracking live position of " .. targetPlr.Name)
-- Short strong loop that constantly reads current player position
object.Anchored = true
for i = 1, 30 do
if targetPlr.Character and targetPlr.Character:FindFirstChild("HumanoidRootPart") then
local root = targetPlr.Character.HumanoidRootPart
-- 6 studs above head (should stop it going underneath)
local livePos = root.Position + Vector3.new(0, 6, 0)
object.Position = livePos
object.Velocity = Vector3.new(0, 8, 0)
end
task.wait(0.02)
end
object.Anchored = false
object.Velocity = Vector3.new(0, 3, 0) -- gentle kick
launchButton.Text = "✅ TRACKING LIVE!"
task.wait(0.9)
launchButton.Text = "🚀 LAUNCH BALL"
end)
-- Click to select ball for rising animation
mouse.Button1Down:Connect(function()
if mouse.Target and mouse.Target.Name == "Soccerg33ign3t" then
object = mouse.Target
startPos = object.Position
endPos = startPos + Vector3.new(0, 50, 0)
progress = 0
print("Ball selected!")
end
end)
-- Rising animation
RunService.RenderStepped:Connect(function(dt)
if object and progress < 1 then
progress += dt / duration
local accel = progress * progress
local newPos = startPos:Lerp(endPos, accel)
object.CFrame = CFrame.new(newPos)
if progress >= 1 then
object.CFrame = CFrame.new(startPos)
progress = 0
end
end
end)
print("✅ Clean Live Tracking Fixed - Ball should now stay above the player!")No comments yet for this script.



