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)