balloon float bang troll script
Key RequiredUniversal

balloon float bang troll script

Universal Scriptstrrrtmstrrrtm 471 views 8.3K executesUpdated Aug 13, 2026
Unrated
00
Lua Script•821 lines (28487 chars)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")

-- Ensure Player and Mouse are fully loaded to prevent nil indexing errors
local player = Players.LocalPlayer
while not player do
    task.wait()
    player = Players.LocalPlayer
end

local mouse = player:GetMouse()
while not mouse do
    task.wait()
    mouse = player:GetMouse()
end

local looping = false
local targetPlayer = nil
local currentTime = 0

-- Persistent state variables for respawn tracking
local isFloatActive = false
local activeTarget = nil
local targetConnection = nil

-- Keep track of original joint states for clean resets
_G.OriginalJoints = {}
_G.OriginalHipHeight = 0

-- Configuration table with updated defaults from the screenshot
local config = {
    baseZ = 2.5,
    rangeZ = 1.5,
    limbSpeed = 220,
    bodySpeed = 210
}

-- ScreenGui
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "BalloonFloatGui"
ScreenGui.ResetOnSpawn = false -- Keeps the UI loaded across spawns
local successCore, errCore = pcall(function()
    ScreenGui.Parent = game:GetService("CoreGui")
end)
if not successCore then
    ScreenGui.Parent = player:WaitForChild("PlayerGui")
end
ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling

-- Intro Frame
local IntroFrame = Instance.new("Frame")
IntroFrame.Name = "IntroFrame"
IntroFrame.Parent = ScreenGui
IntroFrame.BackgroundColor3 = Color3.fromRGB(20, 30, 45)
IntroFrame.BorderSizePixel = 0
IntroFrame.Position = UDim2.new(0.5, -200, 0.5, -150)
IntroFrame.Size = UDim2.new(0, 400, 0, 300)

local UICorner1 = Instance.new("UICorner")
UICorner1.Parent = IntroFrame
UICorner1.CornerRadius = UDim.new(0, 15)

-- Intro Title & Subtitle
local IntroTitle = Instance.new("TextLabel")
IntroTitle.Parent = IntroFrame
IntroTitle.BackgroundTransparency = 1
IntroTitle.Position = UDim2.new(0, 0, 0.2, 0)
IntroTitle.Size = UDim2.new(1, 0, 0, 60)
IntroTitle.Font = Enum.Font.GothamBold
IntroTitle.Text = "BALLOON FLOAT"
IntroTitle.TextColor3 = Color3.fromRGB(85, 200, 255)
IntroTitle.TextSize = 42
IntroTitle.TextStrokeTransparency = 0.8

local IntroSubtitle = Instance.new("TextLabel")
IntroSubtitle.Parent = IntroFrame
IntroSubtitle.BackgroundTransparency = 1
IntroSubtitle.Position = UDim2.new(0, 0, 0.45, 0)
IntroSubtitle.Size = UDim2.new(1, 0, 0, 30)
IntroSubtitle.Font = Enum.Font.Gotham
IntroSubtitle.Text = "Direct Click Follower - PC Edition"
IntroSubtitle.TextColor3 = Color3.fromRGB(200, 220, 240)
IntroSubtitle.TextSize = 16

-- Continue Button
local ContinueButton = Instance.new("TextButton")
ContinueButton.Parent = IntroFrame
ContinueButton.BackgroundColor3 = Color3.fromRGB(85, 170, 255)
ContinueButton.Position = UDim2.new(0.5, -80, 0.7, 0)
ContinueButton.Size = UDim2.new(0, 160, 0, 45)
ContinueButton.Font = Enum.Font.GothamBold
ContinueButton.Text = "CONTINUE"
ContinueButton.TextColor3 = Color3.fromRGB(255, 255, 255)
ContinueButton.TextSize = 18
ContinueButton.AutoButtonColor = false

local UICorner2 = Instance.new("UICorner")
UICorner2.Parent = ContinueButton
UICorner2.CornerRadius = UDim.new(0, 10)

-- Main Frame (Expanded width to 600 for Sidebar player list)
local MainFrame = Instance.new("Frame")
MainFrame.Name = "MainFrame"
MainFrame.Parent = ScreenGui
MainFrame.BackgroundColor3 = Color3.fromRGB(25, 35, 50)
MainFrame.BorderSizePixel = 0
MainFrame.Position = UDim2.new(0.5, -300, 0.5, -137)
MainFrame.Size = UDim2.new(0, 600, 0, 275)
MainFrame.Visible = false
MainFrame.BackgroundTransparency = 1

local UICorner3 = Instance.new("UICorner")
UICorner3.Parent = MainFrame
UICorner3.CornerRadius = UDim.new(0, 15)

-- Top Bar (drag handle)
local TopBar = Instance.new("Frame")
TopBar.Parent = MainFrame
TopBar.BackgroundColor3 = Color3.fromRGB(35, 45, 65)
TopBar.BorderSizePixel = 0
TopBar.Size = UDim2.new(1, 0, 0, 50)

local UICorner4 = Instance.new("UICorner")
UICorner4.Parent = TopBar
UICorner4.CornerRadius = UDim.new(0, 15)

-- Title
local Title = Instance.new("TextLabel")
Title.Parent = TopBar
Title.BackgroundTransparency = 1
Title.Position = UDim2.new(0, 15, 0, 0)
Title.Size = UDim2.new(1, -60, 1, 0)
Title.Font = Enum.Font.GothamBold
Title.Text = "BALLOON FLOAT"
Title.TextColor3 = Color3.fromRGB(85, 200, 255)
Title.TextSize = 22
Title.TextXAlignment = Enum.TextXAlignment.Left

-- Close Button
local CloseButton = Instance.new("TextButton")
CloseButton.Parent = TopBar
CloseButton.BackgroundColor3 = Color3.fromRGB(255, 85, 85)
CloseButton.Position = UDim2.new(1, -45, 0.5, -15)
CloseButton.Size = UDim2.new(0, 30, 0, 30)
CloseButton.Font = Enum.Font.GothamBold
CloseButton.Text = "X"
CloseButton.TextColor3 = Color3.fromRGB(255, 255, 255)
CloseButton.TextSize = 18

local UICorner5 = Instance.new("UICorner")
UICorner5.Parent = CloseButton
UICorner5.CornerRadius = UDim.new(0, 8)

-- Status Label
local StatusLabel = Instance.new("TextLabel")
StatusLabel.Parent = MainFrame
StatusLabel.BackgroundTransparency = 1
StatusLabel.Position = UDim2.new(0, 20, 0, 55)
StatusLabel.Size = UDim2.new(0, 360, 0, 50)
StatusLabel.Font = Enum.Font.GothamMedium
StatusLabel.Text = "Status: Click on any player's character to start floating!\n(Press INSERT or R-CTRL to Hide/Show)"
StatusLabel.TextColor3 = Color3.fromRGB(180, 200, 220)
StatusLabel.TextSize = 14
StatusLabel.TextWrapped = true
StatusLabel.TextYAlignment = Enum.TextYAlignment.Center

-- --- UI Inputs Configuration Area (2x2 Grid on Left side) ---

-- ROW 1, COLUMN 1: Base Z Input
local BaseZLabel = Instance.new("TextLabel")
BaseZLabel.Parent = MainFrame
BaseZLabel.BackgroundTransparency = 1
BaseZLabel.Position = UDim2.new(0, 20, 0, 110)
BaseZLabel.Size = UDim2.new(0, 170, 0, 15)
BaseZLabel.Font = Enum.Font.GothamBold
BaseZLabel.Text = "Base Z"
BaseZLabel.TextColor3 = Color3.fromRGB(85, 200, 255)
BaseZLabel.TextSize = 12
BaseZLabel.TextXAlignment = Enum.TextXAlignment.Center

local BaseZInput = Instance.new("TextBox")
BaseZInput.Parent = MainFrame
BaseZInput.BackgroundColor3 = Color3.fromRGB(35, 45, 65)
BaseZInput.Position = UDim2.new(0, 20, 0, 127)
BaseZInput.Size = UDim2.new(0, 170, 0, 28)
BaseZInput.Font = Enum.Font.GothamMedium
BaseZInput.Text = tostring(config.baseZ)
BaseZInput.TextColor3 = Color3.fromRGB(255, 255, 255)
BaseZInput.TextSize = 14
BaseZInput.ClearTextOnFocus = false

local UICornerBaseZ = Instance.new("UICorner")
UICornerBaseZ.Parent = BaseZInput
UICornerBaseZ.CornerRadius = UDim.new(0, 6)

-- ROW 1, COLUMN 2: Range Z Input
local RangeZLabel = Instance.new("TextLabel")
RangeZLabel.Parent = MainFrame
RangeZLabel.BackgroundTransparency = 1
RangeZLabel.Position = UDim2.new(0, 210, 0, 110)
RangeZLabel.Size = UDim2.new(0, 170, 0, 15)
RangeZLabel.Font = Enum.Font.GothamBold
RangeZLabel.Text = "Range Z"
RangeZLabel.TextColor3 = Color3.fromRGB(85, 200, 255)
RangeZLabel.TextSize = 12
RangeZLabel.TextXAlignment = Enum.TextXAlignment.Center

local RangeZInput = Instance.new("TextBox")
RangeZInput.Parent = MainFrame
RangeZInput.BackgroundColor3 = Color3.fromRGB(35, 45, 65)
RangeZInput.Position = UDim2.new(0, 210, 0, 127)
RangeZInput.Size = UDim2.new(0, 170, 0, 28)
RangeZInput.Font = Enum.Font.GothamMedium
RangeZInput.Text = tostring(config.rangeZ)
RangeZInput.TextColor3 = Color3.fromRGB(255, 255, 255)
RangeZInput.TextSize = 14
RangeZInput.ClearTextOnFocus = false

local UICornerRangeZ = Instance.new("UICorner")
UICornerRangeZ.Parent = RangeZInput
UICornerRangeZ.CornerRadius = UDim.new(0, 6)

-- ROW 2, COLUMN 1: Limb Speed Input
local SpeedLabel = Instance.new("TextLabel")
SpeedLabel.Parent = MainFrame
SpeedLabel.BackgroundTransparency = 1
SpeedLabel.Position = UDim2.new(0, 20, 0, 160)
SpeedLabel.Size = UDim2.new(0, 170, 0, 15)
SpeedLabel.Font = Enum.Font.GothamBold
SpeedLabel.Text = "Limb Speed"
SpeedLabel.TextColor3 = Color3.fromRGB(85, 200, 255)
SpeedLabel.TextSize = 12
SpeedLabel.TextXAlignment = Enum.TextXAlignment.Center

local SpeedInput = Instance.new("TextBox")
SpeedInput.Parent = MainFrame
SpeedInput.BackgroundColor3 = Color3.fromRGB(35, 45, 65)
SpeedInput.Position = UDim2.new(0, 20, 0, 177)
SpeedInput.Size = UDim2.new(0, 170, 0, 28)
SpeedInput.Font = Enum.Font.GothamMedium
SpeedInput.Text = tostring(config.limbSpeed)
SpeedInput.TextColor3 = Color3.fromRGB(255, 255, 255)
SpeedInput.TextSize = 14
SpeedInput.ClearTextOnFocus = false

local UICornerSpeed = Instance.new("UICorner")
UICornerSpeed.Parent = SpeedInput
UICornerSpeed.CornerRadius = UDim.new(0, 6)

-- ROW 2, COLUMN 2: Body Speed Input
local BodySpeedLabel = Instance.new("TextLabel")
BodySpeedLabel.Parent = MainFrame
BodySpeedLabel.BackgroundTransparency = 1
BodySpeedLabel.Position = UDim2.new(0, 210, 0, 160)
BodySpeedLabel.Size = UDim2.new(0, 170, 0, 15)
BodySpeedLabel.Font = Enum.Font.GothamBold
BodySpeedLabel.Text = "Body Speed"
BodySpeedLabel.TextColor3 = Color3.fromRGB(85, 200, 255)
BodySpeedLabel.TextSize = 12
BodySpeedLabel.TextXAlignment = Enum.TextXAlignment.Center

local BodySpeedInput = Instance.new("TextBox")
BodySpeedInput.Parent = MainFrame
BodySpeedInput.BackgroundColor3 = Color3.fromRGB(35, 45, 65)
BodySpeedInput.Position = UDim2.new(0, 210, 0, 177)
BodySpeedInput.Size = UDim2.new(0, 170, 0, 28)
BodySpeedInput.Font = Enum.Font.GothamMedium
BodySpeedInput.Text = tostring(config.bodySpeed)
BodySpeedInput.TextColor3 = Color3.fromRGB(255, 255, 255)
BodySpeedInput.TextSize = 14
BodySpeedInput.ClearTextOnFocus = false

local UICornerBodySpeed = Instance.new("UICorner")
UICornerBodySpeed.Parent = BodySpeedInput
UICornerBodySpeed.CornerRadius = UDim.new(0, 6)


-- Sanitization & input capture connections
BaseZInput.FocusLost:Connect(function()
    local val = tonumber(BaseZInput.Text)
    if val then
        config.baseZ = val
    else
        BaseZInput.Text = tostring(config.baseZ)
    end
end)

RangeZInput.FocusLost:Connect(function()
    local val = tonumber(RangeZInput.Text)
    if val then
        config.rangeZ = val
    else
        RangeZInput.Text = tostring(config.rangeZ)
    end
end)

SpeedInput.FocusLost:Connect(function()
    local val = tonumber(SpeedInput.Text)
    if val then
        config.limbSpeed = val
    else
        SpeedInput.Text = tostring(config.limbSpeed)
    end
end)

BodySpeedInput.FocusLost:Connect(function()
    local val = tonumber(BodySpeedInput.Text)
    if val then
        config.bodySpeed = val
    else
        BodySpeedInput.Text = tostring(config.bodySpeed)
    end
end)

-- --- Stop Button (Aligned to the left panel) ---
local StopButton = Instance.new("TextButton")
StopButton.Parent = MainFrame
StopButton.BackgroundColor3 = Color3.fromRGB(255, 90, 90)
StopButton.Position = UDim2.new(0, 20, 0, 215)
StopButton.Size = UDim2.new(0, 360, 0, 45)
StopButton.Font = Enum.Font.GothamBold
StopButton.Text = "STOP LOOP"
StopButton.TextColor3 = Color3.fromRGB(255, 255, 255)
StopButton.TextSize = 18
StopButton.AutoButtonColor = false

local StopCorner = Instance.new("UICorner")
StopCorner.Parent = StopButton
StopCorner.CornerRadius = UDim.new(0, 10)


-- --- Sidebar Divider ---
local Divider = Instance.new("Frame")
Divider.Parent = MainFrame
Divider.BackgroundColor3 = Color3.fromRGB(35, 45, 65)
Divider.BorderSizePixel = 0
Divider.Position = UDim2.new(0, 395, 0, 60)
Divider.Size = UDim2.new(0, 2, 0, 200)


-- --- Player List & Text Search Sidebar Panel ---

-- Player Name Input (Search Box / Instant Interact)
local NameInput = Instance.new("TextBox")
NameInput.Parent = MainFrame
NameInput.BackgroundColor3 = Color3.fromRGB(35, 45, 65)
NameInput.Position = UDim2.new(0, 410, 0, 55)
NameInput.Size = UDim2.new(0, 170, 0, 30)
NameInput.Font = Enum.Font.GothamMedium
NameInput.PlaceholderText = "Type Player Name..."
NameInput.PlaceholderColor3 = Color3.fromRGB(120, 140, 160)
NameInput.Text = ""
NameInput.TextColor3 = Color3.fromRGB(255, 255, 255)
NameInput.TextSize = 13
NameInput.ClearTextOnFocus = false

local UICornerNameInput = Instance.new("UICorner")
UICornerNameInput.Parent = NameInput
UICornerNameInput.CornerRadius = UDim.new(0, 6)

-- Player List Scroll Container
local ScrollFrame = Instance.new("ScrollingFrame")
ScrollFrame.Parent = MainFrame
ScrollFrame.BackgroundTransparency = 1
ScrollFrame.BorderSizePixel = 0
ScrollFrame.Position = UDim2.new(0, 410, 0, 95)
ScrollFrame.Size = UDim2.new(0, 170, 0, 165)
ScrollFrame.CanvasSize = UDim2.new(0, 0, 0, 0)
ScrollFrame.ScrollBarThickness = 4
ScrollFrame.ScrollBarImageColor3 = Color3.fromRGB(85, 200, 255)

local ListLayout = Instance.new("UIListLayout")
ListLayout.Parent = ScrollFrame
ListLayout.SortOrder = Enum.SortOrder.LayoutOrder
ListLayout.Padding = UDim.new(0, 5)


-- --- Sidebar logic functions ---

local function updatePlayerList()
    -- Clear current listings
    for _, child in pairs(ScrollFrame:GetChildren()) do
        if child:IsA("TextButton") then
            child:Destroy()
        end
    end
    
    local filterText = string.lower(NameInput.Text)
    local players = Players:GetPlayers()
    local displayCount = 0
    
    for _, otherPlayer in pairs(players) do
        if otherPlayer ~= player then
            local username = string.lower(otherPlayer.Name)
            local displayname = string.lower(otherPlayer.DisplayName)
            
            -- Only include player if name matches active text filter
            if filterText == "" or string.find(username, filterText) or string.find(displayname, filterText) then
                displayCount = displayCount + 1
                
                local PlayerBtn = Instance.new("TextButton")
                PlayerBtn.Parent = ScrollFrame
                PlayerBtn.BackgroundColor3 = Color3.fromRGB(35, 45, 65)
                PlayerBtn.Size = UDim2.new(1, -6, 0, 28) -- offset for scrollbar
                PlayerBtn.Font = Enum.Font.GothamBold
                PlayerBtn.Text = otherPlayer.DisplayName
                PlayerBtn.TextColor3 = Color3.fromRGB(200, 220, 240)
                PlayerBtn.TextSize = 11
                PlayerBtn.AutoButtonColor = true
                
                local BtnCorner = Instance.new("UICorner")
                BtnCorner.Parent = PlayerBtn
                BtnCorner.CornerRadius = UDim.new(0, 6)
                
                PlayerBtn.MouseButton1Click:Connect(function()
                    startBalloonFloat(otherPlayer)
                end)
            end
        end
    end
    
    ScrollFrame.CanvasSize = UDim2.new(0, 0, 0, displayCount * 33)
end

-- Refresh the list dynamically
Players.PlayerAdded:Connect(updatePlayerList)
Players.PlayerRemoving:Connect(updatePlayerList)
NameInput:GetPropertyChangedSignal("Text"):Connect(updatePlayerList)

-- Start float connection setup helper
local function startBalloonFloat(target)
    -- Defined down below, forward-declared logically
end

-- Instant "Type Player Name" connection on Enter
NameInput.FocusLost:Connect(function(enterPressed)
    if enterPressed then
        local targetName = string.lower(NameInput.Text)
        if targetName ~= "" then
            for _, otherPlayer in pairs(Players:GetPlayers()) do
                if otherPlayer ~= player then
                    local username = string.lower(otherPlayer.Name)
                    local displayname = string.lower(otherPlayer.DisplayName)
                    
                    if username == targetName or displayname == targetName or string.find(username, targetName) or string.find(displayname, targetName) then
                        startBalloonFloat(otherPlayer)
                        break
                    end
                end
            end
        end
    end
end)


-- --- GUI control mechanics ---

local isOpen = false
local guiUnlocked = false

-- Open Frame Animation
local function openGUI()
    if isOpen or not guiUnlocked then return end
    isOpen = true
    updatePlayerList() -- Build initial list
    MainFrame.Visible = true
    MainFrame.Position = UDim2.new(0.5, -300, 1.5, 0)
    TweenService:Create(MainFrame, TweenInfo.new(0.6, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {
        Position = UDim2.new(0.5, -300, 0.5, -137),
        BackgroundTransparency = 0
    }):Play()
    
    for _, child in pairs(MainFrame:GetDescendants()) do
        if child:IsA("GuiObject") then
            if child:IsA("TextBox") or child:IsA("TextButton") then
                child.BackgroundTransparency = 0
                child.TextTransparency = 0
            elseif child:IsA("TextLabel") then
                child.BackgroundTransparency = 1
                child.TextTransparency = 0
            end
        end
    end
end

-- Close Frame Animation
local function closeGUI()
    if not isOpen then return end
    isOpen = false

    TweenService:Create(MainFrame, TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.In), {
        Position = UDim2.new(0.5, -300, 1.5, 0),
        BackgroundTransparency = 1
    }):Play()

    for _, child in pairs(MainFrame:GetDescendants()) do
        if child:IsA("GuiObject") then
            local targets = {
                BackgroundTransparency = 1
            }
            if child:IsA("TextLabel") or child:IsA("TextButton") or child:IsA("TextBox") then
                targets.TextTransparency = 1
            end
            if child:IsA("ScrollingFrame") then
                targets.BackgroundTransparency = 1
            end
            TweenService:Create(child, TweenInfo.new(0.4), targets):Play()
        end
    end

    task.wait(0.5)
    MainFrame.Visible = false
end

-- Keyboard Hotkey (Insert / Right Control) to Toggle Open/Close
UserInputService.InputBegan:Connect(function(input, processed)
    if processed then return end
    if input.KeyCode == Enum.KeyCode.Insert or input.KeyCode == Enum.KeyCode.RightControl then
        if not guiUnlocked then return end
        if isOpen then
            closeGUI()
        else
            openGUI()
        end
    end
end)

-- Continue Button click
ContinueButton.MouseButton1Click:Connect(function()
    ContinueButton.BackgroundColor3 = Color3.fromRGB(60, 150, 235)
    task.wait(0.1)
    ContinueButton.BackgroundColor3 = Color3.fromRGB(85, 170, 255)

    IntroFrame:TweenPosition(UDim2.new(0.5, -200, -0.5, 0), "Out", "Back", 0.6, true)

    task.wait(0.6)
    IntroFrame.Visible = false

    guiUnlocked = true
    openGUI()
end)

-- Helper Functions
local function getJoint(parent, name)
    return parent:FindFirstChild(name) or parent:FindFirstChild(name:gsub(" ", ""))
end

local function updateStatus(text, color)
    StatusLabel.Text = "Status: " .. text
    StatusLabel.TextColor3 = color or Color3.fromRGB(180, 200, 220)
end

-- Stop Float Loop & Restore Joints
local function stopLoop()
    looping = false
    targetPlayer = nil
    
    local char = player.Character
    if char then
        local humanoid = char:FindFirstChildOfClass("Humanoid")
        if humanoid then
            humanoid.PlatformStand = false
            humanoid.HipHeight = _G.OriginalHipHeight or 0
        end
    end

    -- Restore initial postures
    if _G.OriginalJoints then
        for joint, originalC0 in pairs(_G.OriginalJoints) do
            if joint and joint.Parent then
                joint.C0 = originalC0
            end
        end
    end
    
    -- Status only clears completely if we are not persisting a respawn float
    if not isFloatActive then
        updateStatus("Balloon float stopped. Click any player to start again!", Color3.fromRGB(180, 200, 220))
    end
end

-- Clean disconnections for target tracking
local function disconnectTarget()
    if targetConnection then
        targetConnection:Disconnect()
        targetConnection = nil
    end
end

-- Completely stop and erase active follow states
local function endActiveFloat()
    isFloatActive = false
    activeTarget = nil
    disconnectTarget()
    stopLoop()
end

-- Connect target player's character updates to resume automatically if they die/respawn
local function connectTargetRespawn(target)
    disconnectTarget()
    targetConnection = target.CharacterAdded:Connect(function(char)
        char:WaitForChild("Humanoid")
        char:WaitForChild("HumanoidRootPart")
        task.wait(0.3)
        if isFloatActive and activeTarget == target then
            startBalloonFloat(target)
        end
    end)
end

-- Start Balloon Floating (Strictly behind target, no forward clipping)
function startBalloonFloat(target)
    if not guiUnlocked then return false end
    if not target or target == player then return false end

    -- Save state persistency values
    isFloatActive = true
    activeTarget = target
    connectTargetRespawn(target)

    if looping then
        stopLoop()
        task.wait(0.1)
    end

    targetPlayer = target
    looping = true
    updateStatus("Floating on " .. target.DisplayName .. " strictly behind them!", Color3.fromRGB(85, 255, 170))

    local character = player.Character
    if not character then return false end
    local humanoid = character:FindFirstChildOfClass("Humanoid")
    local myHRP = character:FindFirstChild("HumanoidRootPart")
    if not humanoid or not myHRP then return false end

    _G.OriginalHipHeight = humanoid.HipHeight
    _G.OriginalJoints = {}
    
    local isR15 = (humanoid.RigType == Enum.HumanoidRigType.R15)
    local joints = {}

    -- Track rig structures
    if isR15 then
        local upperTorso = character:WaitForChild("UpperTorso")
        local head = character:WaitForChild("Head")
        local rightUpper = character:WaitForChild("RightUpperArm")
        local leftUpper = character:WaitForChild("LeftUpperArm")
        local rightThigh = character:WaitForChild("RightUpperLeg")
        local leftThigh = character:WaitForChild("LeftUpperLeg")
        
        joints.Neck = getJoint(head, "Neck")
        joints.RightShoulder = getJoint(rightUpper, "RightShoulder")
        joints.LeftShoulder = getJoint(leftUpper, "LeftShoulder")
        joints.RightHip = getJoint(rightThigh, "RightHip")
        joints.LeftHip = getJoint(leftThigh, "LeftHip")
        joints.Waist = getJoint(upperTorso, "Waist")
    else
        local torso = character:WaitForChild("Torso")
        joints.Neck = getJoint(torso, "Neck")
        joints.RightShoulder = getJoint(torso, "Right Shoulder")
        joints.LeftShoulder = getJoint(torso, "Left Shoulder")
        joints.RightHip = getJoint(torso, "Right Hip")
        joints.LeftHip = getJoint(torso, "Left Hip")
    end

    -- Save joints
    for name, joint in pairs(joints) do
        if joint then
            _G.OriginalJoints[joint] = joint.C0
        end
    end

    humanoid.PlatformStand = true

    task.spawn(function()
        currentTime = 0
        while looping and targetPlayer and targetPlayer.Character and player.Character do
            local targetHRP = targetPlayer.Character:FindFirstChild("HumanoidRootPart")
            myHRP = player.Character:FindFirstChild("HumanoidRootPart")
            
            if targetHRP and myHRP then
                -- Calculations read dynamic configurations instantly from input fields:
                local baseZ = config.baseZ
                local rangeZ = config.rangeZ
                local offsetZ = baseZ + (rangeZ * math.sin(currentTime * config.bodySpeed))

                myHRP.CFrame = targetHRP.CFrame * CFrame.new(0, 0, offsetZ)
                myHRP.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
            end

            -- Joint swaying animations (Floating limbs)
            local slowSway = math.sin(currentTime * 1.5)
            local fastSway = math.cos(currentTime * 3)

            -- Custom sway cycles for realistic dangles (Forward/Backward pitch)
            local forwardDip = math.rad(25) * (math.sin(currentTime * config.limbSpeed) + 1) * 0.5
            local leftArmSway = math.sin(currentTime * config.limbSpeed) * math.rad(15)
            local legSwayLeft = math.sin(currentTime * config.limbSpeed) * math.rad(15)
            local legSwayRight = -math.sin(currentTime * config.limbSpeed) * math.rad(15)

            -- Right Arm (Dips forward/downward and returns up to holding position)
            if joints.RightShoulder then
                local orig = _G.OriginalJoints[joints.RightShoulder]
                if isR15 then
                    joints.RightShoulder.C0 = orig * CFrame.Angles(forwardDip, 0, math.rad(140))
                else
                    joints.RightShoulder.C0 = orig * CFrame.Angles(0, 0, math.rad(130) - forwardDip)
                end
            end
            
            -- Left Arm (Realistic forward/backward dangle)
            if joints.LeftShoulder then
                local orig = _G.OriginalJoints[joints.LeftShoulder]
                if isR15 then
                    joints.LeftShoulder.C0 = orig * CFrame.Angles(leftArmSway, 0, math.rad(-15))
                else
                    joints.LeftShoulder.C0 = orig * CFrame.Angles(0, 0, math.rad(-10) + leftArmSway)
                end
            end
            
            -- Head
            if joints.Neck then
                local orig = _G.OriginalJoints[joints.Neck]
                joints.Neck.C0 = orig * CFrame.Angles(math.rad(-10) + (fastSway * 0.02), math.rad(10) + (slowSway * 0.05), 0)
            end
            
            -- Legs (Realistic out-of-phase forward/backward dangle)
            if joints.LeftHip then
                local orig = _G.OriginalJoints[joints.LeftHip]
                joints.LeftHip.C0 = orig * CFrame.Angles(math.rad(10) + legSwayLeft, 0, math.rad(-5))
            end
            if joints.RightHip then
                local orig = _G.OriginalJoints[joints.RightHip]
                joints.RightHip.C0 = orig * CFrame.Angles(math.rad(10) + legSwayRight, 0, math.rad(5))
            end
            
            -- Waist/Spine (R15)
            if isR15 and joints.Waist then
                local orig = _G.OriginalJoints[joints.Waist]
                joints.Waist.C0 = orig * CFrame.Angles(math.rad(-5) + (slowSway * 0.03), 0, math.rad(5) + (slowSway * 0.02))
            end

            currentTime += RunService.Heartbeat:Wait()
        end
        stopLoop()
    end)
    return true
end

-- Automatically resume float on local respawn
player.CharacterAdded:Connect(function(char)
    char:WaitForChild("Humanoid")
    char:WaitForChild("HumanoidRootPart")
    task.wait(0.3) -- Small buffer for joint instantiation setup
    if isFloatActive and activeTarget and activeTarget.Parent then
        startBalloonFloat(activeTarget)
    end
end)

-- Button Connections
StopButton.MouseButton1Click:Connect(function()
    if not guiUnlocked then return end
    endActiveFloat()
end)

CloseButton.MouseButton1Click:Connect(function()
    endActiveFloat()
    closeGUI()
end)

-- Detect Mouse Clicks on Other Players (Triggers start immediately)
mouse.Button1Down:Connect(function()
    if not guiUnlocked then return end
    
    local target = mouse.Target
    if target and target.Parent then
        local clickedPlayer = Players:GetPlayerFromCharacter(target.Parent) or Players:GetPlayerFromCharacter(target.Parent.Parent)
        
        if clickedPlayer and clickedPlayer ~= player then
            startBalloonFloat(clickedPlayer)
        end
    end
end)

-- Reliable Dragging Script for PC
local function makeDraggable(frame, handle)
    local dragStart = nil
    local startPos = nil

    handle.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then
            dragStart = input.Position
            startPos = frame.Position

            local connection
            connection = UserInputService.InputChanged:Connect(function(changedInput)
                if changedInput.UserInputType == Enum.UserInputType.MouseMovement then
                    local delta = changedInput.Position - dragStart
                    frame.Position = UDim2.new(
                        startPos.X.Scale,
                        startPos.X.Offset + delta.X,
                        startPos.Y.Scale,
                        startPos.Y.Offset + delta.Y
                    )
                end
            end)

            local releaseConnection
            releaseConnection = UserInputService.InputEnded:Connect(function(endedInput)
                if endedInput.UserInputType == Enum.UserInputType.MouseButton1 then
                    connection:Disconnect()
                    releaseConnection:Disconnect()
                end
            end)
        end
    end)
end

makeDraggable(MainFrame, TopBar)

Features & Information

It's free for anyone to use
#troll#bang

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts