legacy bhop
Key Required

legacy bhop

Evade ItzPnsdgItzPnsdg 2.4K views 287 executesUpdated Mar 12, 2026
Unrated
00
Lua Script•373 lines (10634 chars)
local autoJumpEnabled = false
local bhopHoldActive = false
local bhopHoldFeature = false
local jumpCooldown = 0.7
local autoJumpType = "Bounce"

local accelerationMethod = "Acceleration"
local groundFriction = -0.5
local AutoAccelerationEnabled = false
local MaxAcceleration = 3
local MinAcceleration = -1
local MaxSpeed = 70

local player = game:GetService("Players").LocalPlayer
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local bhopConnection = nil
local bhopLoaded = false
local Character = nil
local Humanoid = nil
local HumanoidRootPart = nil
local LastJump = 0
local GROUND_CHECK_DISTANCE = 3.5
local MAX_SLOPE_ANGLE = 45

local movementModule = nil
local originalApplyFriction = nil

local function IsOnGround()
    if not Character or not HumanoidRootPart or not Humanoid then return false end
    local success, result = pcall(function()
        local state = Humanoid:GetState()
        if state == Enum.HumanoidStateType.Jumping or state == Enum.HumanoidStateType.Freefall or state == Enum.HumanoidStateType.Swimming then
            return false
        end
        local raycastParams = RaycastParams.new()
        raycastParams.FilterType = Enum.RaycastFilterType.Exclude
        raycastParams.FilterDescendantsInstances = {Character}
        local raycastResult = workspace:Raycast(HumanoidRootPart.Position, Vector3.new(0, -GROUND_CHECK_DISTANCE, 0), raycastParams)
        if not raycastResult then return false end
        local angle = math.deg(math.acos(raycastResult.Normal:Dot(Vector3.new(0, 1, 0))))
        return angle <= MAX_SLOPE_ANGLE
    end)
    return success and result
end

local function updateBhop()
    if not bhopLoaded then return end
    pcall(function()
        if not Character or not Humanoid then return end
        local isBhopActive = autoJumpEnabled or bhopHoldActive
        if isBhopActive then
            local now = tick()
            if IsOnGround() and (now - LastJump) > jumpCooldown then
                Humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
                LastJump = now
            end
        end
    end)
end

local function loadBhop()
    if bhopLoaded then return end
    bhopLoaded = true
    if bhopConnection then bhopConnection:Disconnect() end
    bhopConnection = RunService.Heartbeat:Connect(updateBhop)
end

local function unloadBhop()
    if not bhopLoaded then return end
    bhopLoaded = false
    if bhopConnection then
        bhopConnection:Disconnect()
        bhopConnection = nil
    end
    bhopHoldActive = false
end

local function checkBhopState()
    if autoJumpEnabled or bhopHoldActive then
        loadBhop()
    else
        unloadBhop()
    end
end

local function setupBhopJumpBtn()
    pcall(function()
        local playerGui = player:WaitForChild("PlayerGui", 5)
        local touchGui = playerGui:WaitForChild("TouchGui", 5)
        local jumpButton = touchGui:FindFirstChild("JumpButton", true)
        if not jumpButton then return end
        jumpButton.InputBegan:Connect(function(input)
            if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
                if bhopHoldFeature then
                    bhopHoldActive = true
                    checkBhopState()
                end
            end
        end)
        jumpButton.InputEnded:Connect(function(input)
            if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
                bhopHoldActive = false
                checkBhopState()
            end
        end)
    end)
end

local function getCurrentSpeed()
    if HumanoidRootPart then
        return (HumanoidRootPart.Velocity * Vector3.new(1, 0, 1)).Magnitude
    end
    return 0
end

local function reapplyModifications()
    if not movementModule then return end
    
    if not originalApplyFriction then
        originalApplyFriction = movementModule.ApplyFriction
    end
    
    local isBhopActive = autoJumpEnabled or bhopHoldActive
    
    if isBhopActive then
        movementModule.ApplyFriction = function(self, frictionAmount)
            local isGrounded = self.a == true
            
            if isGrounded then
                if accelerationMethod == "No Acceleration" then
                    frictionAmount = 0
                elseif accelerationMethod == "Ground Acceleration" or accelerationMethod == "Acceleration" then
                    local finalFriction = groundFriction
                    
                    if AutoAccelerationEnabled then
                        local currentSpeed = getCurrentSpeed()
                        if currentSpeed > MaxSpeed then
                            finalFriction = MaxAcceleration
                        elseif currentSpeed < MaxSpeed then
                            finalFriction = MinAcceleration
                        end
                    end
                    
                    frictionAmount = finalFriction
                end
            end
            
            return originalApplyFriction(self, frictionAmount)
        end
    else
        movementModule.ApplyFriction = originalApplyFriction
    end
end

local function setupModuleWatcher(character)
    local movement = character:WaitForChild("Movement")
    
    local function applyToModule()
        local success, module = pcall(require, movement)
        if success and module then
            movementModule = module
            reapplyModifications()
        end
    end
    
    applyToModule()
    
    spawn(function()
        while character and character.Parent do
            wait(1)
            local success, module = pcall(require, movement)
            if success and module and module ~= movementModule then
                movementModule = module
                reapplyModifications()
            end
        end
    end)
end

local function ApplyModifications(character)
    setupModuleWatcher(character)
end

if player.Character then
    ApplyModifications(player.Character)
end

player.CharacterAdded:Connect(ApplyModifications)

player.CharacterAdded:Connect(function(char)
    Character = char
    Humanoid = char:WaitForChild("Humanoid")
    HumanoidRootPart = char:WaitForChild("HumanoidRootPart")
    setupBhopJumpBtn()
    checkBhopState()
end)

if player.Character then
    Character = player.Character
    Humanoid = Character:FindFirstChild("Humanoid")
    HumanoidRootPart = Character:FindFirstChild("HumanoidRootPart")
end

RunService.Heartbeat:Connect(function()
    if not Character or not Character:IsDescendantOf(workspace) then
        Character = player.Character
        if Character then
            Humanoid = Character:FindFirstChildOfClass("Humanoid")
            HumanoidRootPart = Character:FindFirstChild("HumanoidRootPart")
        end
    end
end)

setupBhopJumpBtn()
checkBhopState()

Tabs.Auto:Section({Title="Bhop"})

BhopToggle = Tabs.Auto:Toggle({
    Title = "Bhop",
    Flag = "BhopToggle",
    Value = false,
    Callback = function(state)
        autoJumpEnabled = state
        checkBhopState()
        reapplyModifications()
    end
})

BhopHoldToggle = Tabs.Auto:Toggle({
    Title = "Bhop Jump button/Space",
    Flag = "BhopHoldToggle",
    Value = false,
    Callback = function(state)
        bhopHoldFeature = state
        if not state then
            bhopHoldActive = false
            checkBhopState()
            reapplyModifications()
        end
    end
})

ShowBunnyHopButtonToggle = Tabs.Auto:Toggle({
    Title = "Bhop Button",
    Flag = "ShowBunnyHopButton",
    Value = false,
    Callback = function(state)
        if _G.DarahubLibBtn and _G.DarahubLibBtn.BunnyHopToggle then
            _G.DarahubLibBtn.BunnyHopToggle.Visible = state
        end
    end
})

AccelerationDropdown = Tabs.Auto:Dropdown({
    Title = "Bhop Mode",
    Flag = "AccelerationDropdown",
    Values = {"No Acceleration", "Ground Acceleration", "Acceleration"},
    Value = "Acceleration",
    Callback = function(value)
        accelerationMethod = value
        reapplyModifications()
    end
})

AccelerationInput = Tabs.Auto:Input({
    Title = "Bhop Acceleration (Negative Only)",
    Flag = "AccelerationInput",
    Placeholder = "-0.2",
    Numeric = true,
    Value = "-0.2",
    Callback = function(value)
        local n = tonumber(value)
        if n then
            groundFriction = n
            reapplyModifications()
        end
    end
})

AutoJumpTypeDropdown = Tabs.Auto:Dropdown({
    Title = "Auto Jump Mode",
    Flag = "AutoJumpTypeDropdown",
    Values = {"Bounce", "Realistic"},
    Value = "Bounce",
    Callback = function(value)
        autoJumpType = value
    end
})

JumpCooldownInput = Tabs.Auto:Input({
    Title = "Auto Jump Delay",
    Flag = "JumpCooldownInput",
    Placeholder = "0.7",
    Numeric = true,
    Value = "0.7",
    Callback = function(value)
        local n = tonumber(value)
        if n and n > 0 then
            jumpCooldown = n
        end
    end
})

Tabs.Auto:Section({Title="Auto Acceleration (Legit)"})

AutoAccelerationToggle = Tabs.Auto:Toggle({
    Title = "Auto Acceleration (Legit)",
    Flag = "AutoAccelerationToggle",
    Value = false,
    Callback = function(state)
        AutoAccelerationEnabled = state
        reapplyModifications()
    end
})

MaxAccelerationInput = Tabs.Auto:Input({
    Title = "Max Acceleration",
    Flag = "MaxAccelerationInput",
    Placeholder = "3",
    Numeric = true,
    Value = "3",
    Callback = function(value)
        local n = tonumber(value)
        if n then
            MaxAcceleration = n
            reapplyModifications()
        end
    end
})

MinAccelerationInput = Tabs.Auto:Input({
    Title = "Min Acceleration",
    Flag = "MinAccelerationInput",
    Placeholder = "-1",
    Numeric = true,
    Value = "-1",
    Callback = function(value)
        local n = tonumber(value)
        if n then
            MinAcceleration = n
            reapplyModifications()
        end
    end
})

MaxSpeedInput = Tabs.Auto:Input({
    Title = "Max Speed",
    Flag = "MaxSpeedInput",
    Placeholder = "70",
    Numeric = true,
    Value = "70",
    Callback = function(value)
        local n = tonumber(value)
        if n then
            MaxSpeed = n
            reapplyModifications()
        end
    end
})

ButtonLib.Create:Toggle({
    Text = "Bunny Hop",
    Flag = "BunnyHopToggle",
    Default = false,
    Visible = false,
    Callback = function(s) 
        if BhopToggle then
            BhopToggle:Set(s)
        end
    end
}).Position = UDim2.new(0.5, -125, 0.4, 0)

Features & Information

bhop for legacy

Community Comments (4)

boboxlolboboxlolMar 12, 2026

zammmmm

boboxlolboboxlolMar 12, 2026

how to use??

Replying to @boboxlol
ItzPnsdgItzPnsdgMar 12, 2026(edited)

@boboxlol set autoJumpEnabled to true to enable it, if you want easy use, make your own script. use ai if you don't know what you're doing . prompt: "make a ui with this ui element from scratch, disable reset on res* on screen gui"

Replying to @ItzPnsdg
boboxlolboboxlolMar 12, 2026

@ItzPnsdg ok

More Scripts for Evade