FE R6 Hug GUI
Key RequiredUniversal

FE R6 Hug GUI

Universal Scriptddorredoreddorredore 855 views 31.1K executesUpdated Aug 10, 2026
Unrated
00
Lua Script•420 lines (15576 chars)
-- Full updated HUG UI script with respawn-safe handling.
if game.Players.LocalPlayer.Character.Humanoid.RigType == Enum.HumanoidRigType.R6 then
    if game:GetService("CoreGui"):FindFirstChild("HUGUI") then
        game:GetService("CoreGui"):FindFirstChild("HUGUI"):Destroy()
    end

    local Players = game:GetService("Players")
    local RunService = game:GetService("RunService")
    local UserInputService = game:GetService("UserInputService")
    local LocalPlayer = Players.LocalPlayer

    -- dynamic character references (will be updated on respawn)
    local Character = LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait()
    local Humanoid = Character:WaitForChild("Humanoid")
    local RootPart = Character:WaitForChild("HumanoidRootPart")

    -- Animation asset ids (keep here so they can be reloaded after respawn)
    local HUG_ANIM_ID_1 = "rbxassetid://283545583"
    local HUG_ANIM_ID_2 = "rbxassetid://225975820"
    local TROLL_ANIM_ID = "rbxassetid://148840371"

-- state
local hugging = false
local trolling = false
local currentSpeed = 1.0
local lockedTargetPlayer = nil

    -- animation tracks (these will be recreated after respawn)
    local Play_1, Play_2, TrollAnimTrack

    -- helper: clamp
    local function clamp(val, a, b)
        if val < a then return a end
        if val > b then return b end
        return val
    end

    -- update displayed speed (defined later after SpeedBox is created)
    local function updateSpeedDisplay()
        if SpeedBox then
            SpeedBox.Text = string.format("%.1f", currentSpeed)
        end
    end

    -- function to safely load hug animations for current humanoid
    local function loadHugAnims()
        if not Humanoid then return end
        -- stop old if present
        if Play_1 then pcall(function() Play_1:Stop() end) end
        if Play_2 then pcall(function() Play_2:Stop() end) end
        -- load new
        local anim1 = Instance.new("Animation")
        anim1.AnimationId = HUG_ANIM_ID_1
        local anim2 = Instance.new("Animation")
        anim2.AnimationId = HUG_ANIM_ID_2
        Play_1 = Humanoid:LoadAnimation(anim1)
        Play_2 = Humanoid:LoadAnimation(anim2)
    end

    -- function to safely load troll animation
    local function loadTrollAnim()
        if not Humanoid then return end
        if TrollAnimTrack then pcall(function() TrollAnimTrack:Stop() end) end
        local anim = Instance.new("Animation")
        anim.AnimationId = TROLL_ANIM_ID
        TrollAnimTrack = Humanoid:LoadAnimation(anim)
        pcall(function() TrollAnimTrack.Looped = true end)
    end

    -- create GUI (structure preserved as before, with speed -/+ controls)
    local HUGUI = Instance.new("ScreenGui")
    HUGUI.Name = "HUGUI"
    HUGUI.Parent = game.CoreGui
    HUGUI.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
    HUGUI.Enabled = true

    local HTopBar = Instance.new("Frame")
    HTopBar.Name = "HTopBar"
    HTopBar.Parent = HUGUI
    HTopBar.AnchorPoint = Vector2.new(0.5, 0.5)
    HTopBar.Position = UDim2.new(0.5, 0, 0.5, 0)
    HTopBar.Size = UDim2.new(0, 250, 0, 50)
    HTopBar.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
    HTopBar.ZIndex = 2

    local CloseButton = Instance.new("TextButton")
    CloseButton.Name = "CloseButton"
    CloseButton.Parent = HTopBar
    CloseButton.AnchorPoint = Vector2.new(0.5, 0.5)
    CloseButton.BackgroundColor3 = Color3.fromRGB(255, 0, 0)
    CloseButton.Position = UDim2.new(0.845, 0, 0.5, 0)
    CloseButton.Size = UDim2.new(0, 80, 0, 50)
    CloseButton.Font = Enum.Font.SourceSans
    CloseButton.TextSize = 35
    CloseButton.TextColor3 = Color3.fromRGB(255, 255, 255)
    CloseButton.Text = "X"
    CloseButton.MouseButton1Click:Connect(function()
        HUGUI:Destroy()
    end)

    local MinTab = Instance.new("TextButton")
    MinTab.Name = "MinTab"
    MinTab.Parent = HTopBar
    MinTab.AnchorPoint = Vector2.new(0.5, 0.5)
    MinTab.BackgroundColor3 = Color3.fromRGB(0, 0, 255)
    MinTab.Position = UDim2.new(0.54, 0, 0.5, 0)
    MinTab.Size = UDim2.new(0, 80, 0, 50)
    MinTab.Font = Enum.Font.SourceSans
    MinTab.TextSize = 50
    MinTab.TextColor3 = Color3.fromRGB(255, 255, 255)
    MinTab.Text = "-"
    MinTab.MouseButton1Click:Connect(function()
        if MinTab.Text == "-" then
            MinTab.Text = "+"
            HFrame.Visible = false
        else
            MinTab.Text = "-"
            HFrame.Visible = true
        end
    end)

    local HFrame = Instance.new("Frame")
    HFrame.Name = "HFrame"
    HFrame.Parent = HTopBar
    HFrame.AnchorPoint = Vector2.new(0.5, 0.5)
    HFrame.Position = UDim2.new(0.5, 0, 2.5, 0)
    HFrame.Size = UDim2.new(0, 250, 0, 210)
    HFrame.BackgroundColor3 = Color3.fromRGB(50, 50, 50)

    -- Speed control UI (minus, value display, plus)
    local SpeedLabel = Instance.new("TextLabel")
    SpeedLabel.Name = "SpeedLabel"
    SpeedLabel.Parent = HFrame
    SpeedLabel.AnchorPoint = Vector2.new(0.5, 0.5)
    SpeedLabel.BackgroundTransparency = 1
    SpeedLabel.Position = UDim2.new(0.5, 0, 0.15, 0)
    SpeedLabel.Size = UDim2.new(0, 220, 0, 30)
    SpeedLabel.Font = Enum.Font.SourceSans
    SpeedLabel.TextSize = 18
    SpeedLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
    SpeedLabel.Text = "Animation Speed (0.1 = fast, 10 = slow)"
    SpeedLabel.TextWrapped = true

    local MinusBtn = Instance.new("TextButton")
    MinusBtn.Name = "MinusBtn"
    MinusBtn.Parent = HFrame
    MinusBtn.AnchorPoint = Vector2.new(0.5, 0.5)
    MinusBtn.BackgroundColor3 = Color3.fromRGB(80, 80, 80)
    MinusBtn.Position = UDim2.new(0.2, 0, 0.35, 0)
    MinusBtn.Size = UDim2.new(0, 60, 0, 40)
    MinusBtn.Font = Enum.Font.SourceSans
    MinusBtn.TextSize = 30
    MinusBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
    MinusBtn.Text = "-"

    SpeedBox = Instance.new("TextLabel") -- global for updateSpeedDisplay
    SpeedBox.Name = "SpeedBox"
    SpeedBox.Parent = HFrame
    SpeedBox.AnchorPoint = Vector2.new(0.5, 0.5)
    SpeedBox.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
    SpeedBox.Position = UDim2.new(0.5, 0, 0.35, 0)
    SpeedBox.Size = UDim2.new(0, 80, 0, 40)
    SpeedBox.Font = Enum.Font.SourceSans
    SpeedBox.TextSize = 25
    SpeedBox.TextColor3 = Color3.fromRGB(255, 255, 255)
    SpeedBox.Text = "1.0"

    local PlusBtn = Instance.new("TextButton")
    PlusBtn.Name = "PlusBtn"
    PlusBtn.Parent = HFrame
    PlusBtn.AnchorPoint = Vector2.new(0.5, 0.5)
    PlusBtn.BackgroundColor3 = Color3.fromRGB(80, 80, 80)
    PlusBtn.Position = UDim2.new(0.8, 0, 0.35, 0)
    PlusBtn.Size = UDim2.new(0, 60, 0, 40)
    PlusBtn.Font = Enum.Font.SourceSans
    PlusBtn.TextSize = 30
    PlusBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
    PlusBtn.Text = "+"

    -- Hug button (unchanged)
    local HugButton = Instance.new("TextButton")
    HugButton.Name = "HugButton"
    HugButton.Parent = HFrame
    HugButton.AnchorPoint = Vector2.new(0.5, 0.5)
    HugButton.BackgroundColor3 = Color3.fromRGB(80, 80, 80)
    HugButton.Position = UDim2.new(0.5, 0, 0.62, 0)
    HugButton.Size = UDim2.new(0, 180, 0, 60)
    HugButton.Font = Enum.Font.SourceSans
    HugButton.TextSize = 45
    HugButton.TextColor3 = Color3.fromRGB(255, 255, 255)
    HugButton.Text = "HUG\nOff"

    -- Troll Animation button
    local TrollButton = Instance.new("TextButton")
    TrollButton.Name = "TrollButton"
    TrollButton.Parent = HFrame
    TrollButton.AnchorPoint = Vector2.new(0.5, 0.5)
    TrollButton.BackgroundColor3 = Color3.fromRGB(120, 80, 80)
    TrollButton.Position = UDim2.new(0.5, 0, 0.86, 0)
    TrollButton.Size = UDim2.new(0, 180, 0, 60)
    TrollButton.Font = Enum.Font.SourceSans
    TrollButton.TextSize = 35
    TrollButton.TextColor3 = Color3.fromRGB(255, 255, 255)
    TrollButton.Text = "Troll Anim\nOff"

    -- Drag functionality
    local gui = HTopBar
    local dragging, dragInput, dragStart, startPos
    local function update(input)
        local delta = input.Position - dragStart
        gui.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
    end
    gui.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            dragging = true
            dragStart = input.Position
            startPos = gui.Position
            input.Changed:Connect(function()
                if input.UserInputState == Enum.UserInputState.End then
                    dragging = false
                end
            end)
        end
    end)
    gui.InputChanged:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
            dragInput = input
        end
    end)
    UserInputService.InputChanged:Connect(function(input)
        if input == dragInput and dragging then
            update(input)
        end
    end)

    -- Hug functionality unchanged (uses frontHug)
    local function getNearestPlayer()
        local nearest = nil
        local shortestDistance = math.huge
        for _, player in pairs(Players:GetPlayers()) do
            if player ~= LocalPlayer and player.Character and player.Character:FindFirstChild("HumanoidRootPart") then
                local distance = (player.Character.HumanoidRootPart.Position - RootPart.Position).Magnitude
                if distance < shortestDistance then
                    shortestDistance = distance
                    nearest = player
                end
            end
        end
        return nearest
    end

    local function frontHug()
    local targetPlayer = lockedTargetPlayer

    if targetPlayer
        and targetPlayer.Character
        and targetPlayer.Character:FindFirstChild("HumanoidRootPart") then

        local targetRoot = targetPlayer.Character.HumanoidRootPart
        local hugDistance = 1
        local targetCFrame = targetRoot.CFrame

        RootPart.CFrame = CFrame.new(
            targetCFrame.Position + targetCFrame.LookVector * hugDistance,
            targetCFrame.Position
        )
    end
end

-- Hug button behavior
HugButton.MouseButton1Click:Connect(function()
    if HugButton.Text == "HUG\nOff" then
        HugButton.Text = "HUG\nOn"
        hugging = true

        -- Lock onto the nearest player ONLY ONCE
        lockedTargetPlayer = getNearestPlayer()

        -- If nobody is nearby, cancel hug
        if not lockedTargetPlayer then
            HugButton.Text = "HUG\nOff"
            hugging = false
            return
        end

        -- load and play hug animations
        loadHugAnims()
        if Play_1 then pcall(function() Play_1:Play() end) end
        if Play_2 then pcall(function() Play_2:Play() end) end

        spawn(function()
            while hugging do
                if RootPart and Character and Humanoid then
                    frontHug()
                end
                RunService.Heartbeat:Wait()
            end
        end)
    else
        HugButton.Text = "HUG\nOff"
        hugging = false

        -- Unlock target when hug is turned off
        lockedTargetPlayer = nil

        if Play_1 then pcall(function() Play_1:Stop() end) end
        if Play_2 then pcall(function() Play_2:Stop() end) end
    end
end)

    -- Troll animation control
    MinusBtn.MouseButton1Click:Connect(function()
        currentSpeed = clamp((currentSpeed - 0.1), 0.1, 10)
        updateSpeedDisplay()
        if TrollAnimTrack then
            local animSpeed = 1 / currentSpeed
            pcall(function() TrollAnimTrack:AdjustSpeed(animSpeed) end)
        end
    end)

    PlusBtn.MouseButton1Click:Connect(function()
        currentSpeed = clamp((currentSpeed + 0.1), 0.1, 10)
        updateSpeedDisplay()
        if TrollAnimTrack then
            local animSpeed = 1 / currentSpeed
            pcall(function() TrollAnimTrack:AdjustSpeed(animSpeed) end)
        end
    end)

    TrollButton.MouseButton1Click:Connect(function()
        if TrollButton.Text == "Troll Anim\nOff" then
            TrollButton.Text = "Troll Anim\nOn"
            trolling = true
            loadTrollAnim()
            if TrollAnimTrack then
                pcall(function() TrollAnimTrack:Play() end)
                local animSpeed = 1 / currentSpeed
                pcall(function() TrollAnimTrack:AdjustSpeed(animSpeed) end)
            end
            spawn(function()
                while trolling do
                    if TrollAnimTrack then
                        local animSpeedInner = 1 / currentSpeed
                        pcall(function() TrollAnimTrack:AdjustSpeed(animSpeedInner) end)
                    end
                    RunService.Heartbeat:Wait()
                end
            end)
        else
            TrollButton.Text = "Troll Anim\nOff"
            trolling = false
            if TrollAnimTrack then pcall(function() TrollAnimTrack:Stop() end) end
            TrollAnimTrack = nil
        end
    end)

    -- RESPawn handling: update Character, Humanoid, RootPart & reload animations if toggles are on
    local function onCharacterAdded(char)
        Character = char or LocalPlayer.Character
        -- small wait for humanoid/rootpart
        Humanoid = Character:WaitForChild("Humanoid")
        RootPart = Character:WaitForChild("HumanoidRootPart")

        -- stop old tracks (they reference old humanoid)
        if Play_1 then pcall(function() Play_1:Stop() end) end
        if Play_2 then pcall(function() Play_2:Stop() end) end
        if TrollAnimTrack then pcall(function() TrollAnimTrack:Stop() end) end

        -- recreate tracks if toggles currently on
        if hugging then
            loadHugAnims()
            if Play_1 then pcall(function() Play_1:Play() end) end
            if Play_2 then pcall(function() Play_2:Play() end) end
        end
        if trolling then
            loadTrollAnim()
            if TrollAnimTrack then
                pcall(function() TrollAnimTrack:Play() end)
                local animSpeed = 1 / currentSpeed
                pcall(function() TrollAnimTrack:AdjustSpeed(animSpeed) end)
            end
        end

        -- reconnect humanoid died to stop flags (prevents ghost states)
        if Humanoid then
            Humanoid.Died:Connect(function()
    -- stop active states so they don't try to use old tracks
    hugging = false
    trolling = false
    lockedTargetPlayer = nil
                pcall(function() if Play_1 then Play_1:Stop() end end)
                pcall(function() if Play_2 then Play_2:Stop() end end)
                pcall(function() if TrollAnimTrack then TrollAnimTrack:Stop() end end)
                -- reset button labels to Off (safe)
                pcall(function() HugButton.Text = "HUG\nOff" end)
                pcall(function() TrollButton.Text = "Troll Anim\nOff" end)
            end)
        end
    end

    -- initial setup
    updateSpeedDisplay()
    -- connect current humanoid death
    if Humanoid then
        Humanoid.Died:Connect(function()
    hugging = false
    trolling = false
    lockedTargetPlayer = nil
            if Play_1 then pcall(function() Play_1:Stop() end) end
            if Play_2 then pcall(function() Play_2:Stop() end) end
            if TrollAnimTrack then pcall(function() TrollAnimTrack:Stop() end) end
            pcall(function() HugButton.Text = "HUG\nOff" end)
            pcall(function() TrollButton.Text = "Troll Anim\nOff" end)
        end)
    end

    LocalPlayer.CharacterAdded:Connect(onCharacterAdded)
else
    warn("Need R6")
end

Features & Information

Test it out lol

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts