Bhop script lol
Key RequiredUniversal

Bhop script lol

Universal ScriptKoolguyL0LKoolguyL0L 179 views 723 executesUpdated Jul 29, 2026
Unrated
00
Lua Script•406 lines (10381 chars)
--[[
	WARNING: Heads up! This script has not been verified by ScriptBlox. Use at your own risk!
]]

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Debris = game:GetService("Debris")

local player = Players.LocalPlayer
local gui = player:WaitForChild("PlayerGui")

local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local root = character:WaitForChild("HumanoidRootPart")

-- SETUP JUMP ANIMATION
local jumpAnim = Instance.new("Animation")
jumpAnim.AnimationId = "rbxassetid://131814798893284"
local jumpAnimTrack = humanoid:LoadAnimation(jumpAnim)

local scriptEnabled = true
local spaceHeld = false
local infJumpEnabled = false          -- NEW

local velocity = Vector3.new()
local isGrounded = false
local wasGrounded = false

local footstepTimer = 0
local footstepInterval = 0.35
local lastFootstepIndex = 0

-- config
local cfg = {
	groundAccel = 50,
	airAccel = 3200,
	maxAirSpeed = 20,
	runSpeed = 23,
	jumpPower = 32,
	gravity = 80,
	friction = 6,
	stopSpeed = 5,
}

local footstepSounds = {
	"rbxassetid://81623756670923",
	"rbxassetid://78754179999047",
	"rbxassetid://79418255155423",
	"rbxassetid://112240321395589",
}

local jumpSound
local landSound

local function createSounds()
	if jumpSound then jumpSound:Destroy() end
	if landSound then landSound:Destroy() end

	jumpSound = Instance.new("Sound")
	jumpSound.SoundId = "rbxassetid://78754179999047"
	jumpSound.Volume = 0.5
	jumpSound.PlaybackSpeed = 1
	jumpSound.Parent = root

	landSound = Instance.new("Sound")
	landSound.SoundId = "rbxassetid://78754179999047"
	landSound.Volume = 0.6
	landSound.PlaybackSpeed = 1
	landSound.Parent = root
end

createSounds()

local function playFootstep()
	local sound = Instance.new("Sound")
	sound.Parent = workspace

	lastFootstepIndex = lastFootstepIndex + 1
	if lastFootstepIndex > #footstepSounds then
		lastFootstepIndex = 1
	end

	sound.SoundId = footstepSounds[lastFootstepIndex]
	sound.Volume = 0.6
	sound.PlaybackSpeed = 1.0 + math.random(-10, 10) / 100
	sound:Play()

	Debris:AddItem(sound, 2)
end

local function playJump()
	if jumpSound then
		jumpSound:Stop()
		jumpSound:Play()
	end
	if jumpAnimTrack then
		jumpAnimTrack:Play()
	end
end

local function playLand()
	if landSound then
		landSound:Stop()
		landSound:Play()
	end
	if jumpAnimTrack then
		jumpAnimTrack:Stop(0.1)
	end
end

local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled
local gameModes = {}

if isMobile then
	gameModes = {"default (mobile)", "no grenades (mobile)", "hard (mobile)"}
else
	gameModes = {"default (PC)", "no grenades (PC)", "hard (PC)"}
end

local currentModeIndex = 1

-- GUI
local function createGui()
	local g = Instance.new("ScreenGui")
	g.ResetOnSpawn = false
	g.Name = "SourceDBG"
	g.Parent = gui

	-- DESTROY button
	local destroy = Instance.new("TextButton")
	destroy.Size = UDim2.new(0, 70, 0, 30)
	destroy.Position = UDim2.new(0, 10, 1, -250)
	destroy.BackgroundColor3 = Color3.fromRGB(255, 60, 60)
	destroy.Text = "DESTROY"
	destroy.Parent = g

	destroy.MouseButton1Click:Connect(function()
		if humanoid then
			humanoid.WalkSpeed = 16
			humanoid.JumpPower = 50
		end
		g:Destroy()
		scriptEnabled = false
	end)

	-- ON/OFF toggle
	local toggle = Instance.new("TextButton")
	toggle.Size = UDim2.new(0, 70, 0, 30)
	toggle.Position = UDim2.new(0, 10, 1, -210)
	toggle.BackgroundColor3 = Color3.fromRGB(80, 255, 130)
	toggle.Text = "ON"
	toggle.Parent = g

	toggle.MouseButton1Click:Connect(function()
		scriptEnabled = not scriptEnabled
		toggle.Text = scriptEnabled and "ON" or "OFF"
		toggle.BackgroundColor3 = scriptEnabled and Color3.fromRGB(80, 255, 130) or Color3.fromRGB(255, 60, 60)
	end)

	-- INF JUMP button (NEW)
	local infJumpButton = Instance.new("TextButton")
	infJumpButton.Size = UDim2.new(0, 150, 0, 30)
	infJumpButton.Position = UDim2.new(0, 10, 1, -170)
	infJumpButton.BackgroundColor3 = Color3.fromRGB(255, 80, 80)
	infJumpButton.Text = "Inf Jump: OFF"
	infJumpButton.TextScaled = true
	infJumpButton.Parent = g

	infJumpButton.MouseButton1Click:Connect(function()
		infJumpEnabled = not infJumpEnabled
		infJumpButton.Text = infJumpEnabled and "Inf Jump: ON" or "Inf Jump: OFF"
		infJumpButton.BackgroundColor3 = infJumpEnabled and Color3.fromRGB(80, 255, 130) or Color3.fromRGB(255, 80, 80)
	end)

	-- Mode button
	local modeButton = Instance.new("TextButton")
	modeButton.Size = UDim2.new(0, 150, 0, 30)
	modeButton.Position = UDim2.new(0, 10, 1, -130)
	modeButton.BackgroundColor3 = Color3.fromRGB(100, 150, 255)
	modeButton.Text = "Mode: " .. gameModes[currentModeIndex]
	modeButton.TextScaled = true
	modeButton.Parent = g

	modeButton.MouseButton1Click:Connect(function()
		currentModeIndex = currentModeIndex + 1
		if currentModeIndex > #gameModes then
			currentModeIndex = 1
		end
		modeButton.Text = "Mode: " .. gameModes[currentModeIndex]
	end)

	-- SPEED LABEL
	local speedLabel = Instance.new("TextLabel")
	speedLabel.Size = UDim2.new(0, 150, 0, 20)
	speedLabel.Position = UDim2.new(0, 10, 1, -90)
	speedLabel.BackgroundTransparency = 1
	speedLabel.Text = "Type Speed + Enter:"
	speedLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
	speedLabel.TextScaled = true
	speedLabel.Font = Enum.Font.GothamBold
	speedLabel.Parent = g

	-- SPEED TEXTBOX
	local speedBox = Instance.new("TextBox")
	speedBox.Size = UDim2.new(0, 150, 0, 35)
	speedBox.Position = UDim2.new(0, 10, 1, -70)
	speedBox.BackgroundColor3 = Color3.fromRGB(255, 180, 50)
	speedBox.Text = tostring(cfg.runSpeed)
	speedBox.TextColor3 = Color3.fromRGB(0, 0, 0)
	speedBox.TextScaled = true
	speedBox.Font = Enum.Font.GothamBold
	speedBox.ClearTextOnFocus = false
	speedBox.Parent = g

	local function applySpeed()
		local number = tonumber(speedBox.Text)

		if number and number > 0 and number < 500 then
			cfg.runSpeed = number
			cfg.maxAirSpeed = math.floor(number * 0.85)
			speedBox.Text = tostring(number)
			speedBox.BackgroundColor3 = Color3.fromRGB(80, 255, 130)
			task.wait(0.4)
			speedBox.BackgroundColor3 = Color3.fromRGB(255, 180, 50)
		else
			speedBox.Text = tostring(cfg.runSpeed)
			speedBox.BackgroundColor3 = Color3.fromRGB(255, 60, 60)
			task.wait(0.4)
			speedBox.BackgroundColor3 = Color3.fromRGB(255, 180, 50)
		end
	end

	speedBox.FocusLost:Connect(function()
		applySpeed()
	end)

	-- Mobile Jump button
	if isMobile then
		local jumpButton = Instance.new("TextButton")
		jumpButton.Size = UDim2.new(0, 80, 0, 80)
		jumpButton.Position = UDim2.new(1, -90, 1, -90)
		jumpButton.Text = "JUMP"
		jumpButton.Name = "JumpButton"
		jumpButton.Parent = g

		jumpButton.MouseButton1Down:Connect(function()
			spaceHeld = true
		end)
		jumpButton.MouseButton1Up:Connect(function()
			spaceHeld = false
		end)
	end
end

createGui()

local function grounded()
	local rayParams = RaycastParams.new()
	rayParams.FilterDescendantsInstances = {character}
	rayParams.FilterType = Enum.RaycastFilterType.Exclude

	local result = workspace:Raycast(root.Position, Vector3.new(0, -3.8, 0), rayParams)
	return result and result.Instance and result.Instance.CanCollide
end

local function applyFriction(dt)
	local speed = velocity.Magnitude
	if speed < 0.1 then
		velocity = Vector3.new()
		return
	end

	local drop = isGrounded and (math.max(speed, cfg.stopSpeed) * cfg.friction * dt) or 0
	local newSpeed = math.max(speed - drop, 0)

	if newSpeed ~= speed then
		velocity = velocity * (newSpeed / speed)
	end
end

local function accel(wishDir, wishSpeed, accelAmount, dt)
	local cur = velocity:Dot(wishDir)
	local add = wishSpeed - cur
	if add <= 0 then return end

	local accelSpeed = math.min(accelAmount * dt * wishSpeed, add)
	velocity = velocity + wishDir * accelSpeed
end

local function process(dt)
	if not scriptEnabled then return end
	if not humanoid or humanoid.Health <= 0 then return end
	if not root or not root.Parent then return end

	humanoid.WalkSpeed = 0
	humanoid.JumpPower = 0

	wasGrounded = isGrounded
	isGrounded = grounded()

	-- Landing
	if isGrounded and not wasGrounded then
		playLand()
		footstepTimer = 0
	end

	local cam = workspace.CurrentCamera
	local fwd = cam.CFrame.LookVector
	local right = cam.CFrame.RightVector

	fwd = Vector3.new(fwd.X, 0, fwd.Z)
	right = Vector3.new(right.X, 0, right.Z)

	if fwd.Magnitude > 0 then
		fwd = fwd.Unit
	end
	if right.Magnitude > 0 then
		right = right.Unit
	end

	local input = Vector3.new()

	if isMobile then
		input = humanoid.MoveDirection
	else
		if UserInputService:IsKeyDown(Enum.KeyCode.W) then
			input = input + fwd
		end
		if UserInputService:IsKeyDown(Enum.KeyCode.S) then
			input = input - fwd
		end
		if UserInputService:IsKeyDown(Enum.KeyCode.A) then
			input = input - right
		end
		if UserInputService:IsKeyDown(Enum.KeyCode.D) then
			input = input + right
		end
	end

	if input.Magnitude > 0 then
		input = input.Unit
	end

	if isGrounded then
		applyFriction(dt)
		accel(input, cfg.runSpeed, cfg.groundAccel, dt)

		if input.Magnitude > 0.1 then
			footstepTimer = footstepTimer + dt
			if footstepTimer >= footstepInterval then
				playFootstep()
				footstepTimer = 0
			end
		end

		if spaceHeld then
			velocity = Vector3.new(velocity.X, cfg.jumpPower, velocity.Z)
			playJump()
		else
			velocity = Vector3.new(velocity.X, 0, velocity.Z)
		end
	else
		-- Air movement
		accel(input, cfg.maxAirSpeed, cfg.airAccel, dt)
		velocity = velocity + Vector3.new(0, -cfg.gravity * dt, 0)

		-- Infinite Jump (when enabled)
		if infJumpEnabled and spaceHeld then
			velocity = Vector3.new(velocity.X, cfg.jumpPower, velocity.Z)
			playJump()
		end
	end

	root.AssemblyLinearVelocity = velocity
end

UserInputService.InputBegan:Connect(function(input)
	if input.KeyCode == Enum.KeyCode.Space then
		spaceHeld = true
	end
end)

UserInputService.InputEnded:Connect(function(input)
	if input.KeyCode == Enum.KeyCode.Space then
		spaceHeld = false
	end
end)

RunService.Heartbeat:Connect(function(dt)
	process(dt)
end)

player.CharacterAdded:Connect(function(char)
	character = char
	humanoid = char:WaitForChild("Humanoid")
	root = char:WaitForChild("HumanoidRootPart")

	jumpAnimTrack = humanoid:LoadAnimation(jumpAnim)
	createSounds()
	velocity = Vector3.new()
	isGrounded = false
	wasGrounded = false
end)

print("Source Movement Loaded | Infinite Jump Added")

Features & Information

Just bhop Prob just mobile support

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts