getgenv().BhopMode=getgenv().BhopMode or "RampBoost" getgenv().accel=getgenv().accel or 0.02 getgenv().decay=getgenv().decay or 0.01 getgenv().maxaccel=getgenv().maxaccel or 0.1 getgenv().rampboostmin=getgenv().rampboostmin or 0.16 getgenv().rampboostmax=getgenv().rampboostmax or 0.20 local Players=game:GetService("Players") local UserInputService=game:GetService("UserInputService") local RunService=game:GetService("RunService") local player=Players.LocalPlayer local Character=nil local Humanoid=nil local Root=nil local movementModule=nil local originalApplyFriction=nil local holding=false local acceleration=0 local accelRate=getgenv().accel local decayRate=getgenv().decay local maxAcceleration=getgenv().maxaccel local rampBoostMin=getgenv().rampboostmin local rampBoostMax=getgenv().rampboostmax local rayParams=RaycastParams.new() local function getSpeed() if Root then return (Root.Velocity*Vector3.new(1,0,1)).Magnitude end return 0 end local function getRampFactor() if not Root then return 0 end rayParams.FilterType=Enum.RaycastFilterType.Exclude rayParams.FilterDescendantsInstances={Character} local ray=workspace:Raycast(Root.Position,Vector3.new(0,-4,0),rayParams) if ray then local angle=math.deg(math.acos(ray.Normal:Dot(Vector3.new(0,1,0)))) if angle>5 and angle<60 then return math.clamp(angle/60,0,1) end end return 0 end local function applyModule() if not movementModule then return end if not originalApplyFriction then originalApplyFriction=movementModule.ApplyFriction end movementModule.ApplyFriction=function(self,friction) if holding and self.a==true then if getgenv().BhopMode=="None" then return originalApplyFriction(self,friction) end local boost=accelRate if getgenv().BhopMode=="RampBoost" then local rampFactor=getRampFactor() local rampBoost=rampBoostMin+(rampBoostMax-rampBoostMin)*rampFactor boost=boost+rampBoost end if getgenv().BhopMode=="Acceleration" then boost=accelRate end acceleration=math.clamp(acceleration+boost,0,maxAcceleration) local speed=getSpeed() local smooth=acceleration*(speed/55) friction=friction-smooth else acceleration=math.clamp(acceleration-decayRate,0,maxAcceleration) end return originalApplyFriction(self,friction) end end local function watchModule(char) local movement=char:WaitForChild("Movement") local success,module=pcall(require,movement) if success and module then movementModule=module applyModule() end end local function canJump() if not Humanoid then return false end return Humanoid.FloorMaterial~=Enum.Material.Air and Humanoid:GetState()~=Enum.HumanoidStateType.Dead end RunService.Heartbeat:Connect(function() if holding and canJump() then Humanoid.Jump=true end end) UserInputService.JumpRequest:Connect(function() holding=true end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType==Enum.UserInputType.Touch or input.KeyCode==Enum.KeyCode.Space then holding=false end end) local function setupCharacter(char) Character=char Humanoid=char:WaitForChild("Humanoid") Root=char:WaitForChild("HumanoidRootPart") Humanoid.UseJumpPower=true Humanoid.JumpPower=16 watchModule(char) end if player.Character then setupCharacter(player.Character) end player.CharacterAdded:Connect(setupCharacter)