Mantling script bug

I have a mantling script but it seems to let you climb on walls like a spider, can somebody please tell me what I did wrong?

local player = game.Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local hrp: Part = character:WaitForChild("HumanoidRootPart")
local humanoid: Humanoid = character:WaitForChild("Humanoid")
local userInputService = game:GetService("UserInputService")

local rayOriginOffset = 5 
local rayDistanceDown = 6  
local rayDistanceUp = 7     
local sphereRayRadius = 3   
local forwardOffset = 2      
local sphereRayCount = 8     

local function createRayVisual(startPos, endPos)
	local rayPart = Instance.new("Part")
	rayPart.Anchored = true
	rayPart.CanCollide = false
	rayPart.Material = Enum.Material.Neon
	rayPart.Color = Color3.new(1, 0, 0)
	rayPart.Size = Vector3.new(0.1, 0.1, (endPos - startPos).Magnitude)
	rayPart.CFrame = CFrame.new(startPos, endPos) * CFrame.new(0, 0, -(endPos - startPos).Magnitude / 2)
	rayPart.Parent = workspace
	game.Debris:AddItem(rayPart, 0.5) 
end

local function castRays()
	local hitCount = 0

	local downRayOrigin = hrp.Position + hrp.CFrame.LookVector * forwardOffset + Vector3.new(0, rayOriginOffset, 0)
	local downRayDirection = Vector3.new(0, -rayDistanceDown, 0)

	local downRaycastParams = RaycastParams.new()
	downRaycastParams.FilterDescendantsInstances = {character}
	downRaycastParams.FilterType = Enum.RaycastFilterType.Exclude

	local downRaycastResult = workspace:Raycast(downRayOrigin, downRayDirection, downRaycastParams)
	if downRaycastResult then
		hitCount = hitCount + 1
		createRayVisual(downRayOrigin, downRaycastResult.Position)
	end

	local upRayOrigin = hrp.Position
	local upRayDirection = Vector3.new(0, rayDistanceUp, 0)

	local upRaycastParams = RaycastParams.new()
	upRaycastParams.FilterDescendantsInstances = {character}
	upRaycastParams.FilterType = Enum.RaycastFilterType.Exclude

	local upRaycastResult = workspace:Raycast(upRayOrigin, upRayDirection, upRaycastParams)
	if upRaycastResult then
		hitCount = hitCount + 1
		createRayVisual(upRayOrigin, upRaycastResult.Position)
	end

	local sphereOrigin = hrp.Position + Vector3.new(0, rayOriginOffset, 0)
	local sphereDirection = hrp.CFrame.LookVector * forwardOffset

	for i = 0, sphereRayCount - 1 do
		local angle = (math.pi * 2 / sphereRayCount) * i 
		local offset = Vector3.new(math.cos(angle) * sphereRayRadius, 0, math.sin(angle) * sphereRayRadius)
		local rayStart = sphereOrigin + offset

		local sphereRaycastParams = RaycastParams.new()
		sphereRaycastParams.FilterDescendantsInstances = {character}
		sphereRaycastParams.FilterType = Enum.RaycastFilterType.Exclude

		local sphereRaycastResult = workspace:Raycast(rayStart, sphereDirection, sphereRaycastParams)
		if sphereRaycastResult then
			hitCount = hitCount + 1
			createRayVisual(rayStart, sphereRaycastResult.Position)
		end
	end

	return hitCount
end

local function executeMantle()
	print("Performing Mantle!")

	local climbHeight = 3 
	local forwardMovement = hrp.CFrame.LookVector * 2 
	local targetCFrame = hrp.CFrame + Vector3.new(0, climbHeight, 0) + forwardMovement

	hrp.Anchored = true
	hrp.CFrame = targetCFrame
	hrp.Anchored = false
end

local function onJumpRequest()
	local hitCount = castRays()

	if hitCount > 0 then
		executeMantle()
	else
		humanoid.JumpPower = 50
		humanoid.Jump = true
		wait(1)
		humanoid.JumpPower = 0
	end
end

userInputService.InputBegan:Connect(function(input)
	if input.KeyCode == Enum.KeyCode.Space then  
		onJumpRequest()
	end
end)

humanoid.JumpPower = 0

we can check if there’s a surface below the mantling position
however i can’t understand the thing you want if that’s not what you want please explain it in details also using task library is much more better

local player = game.Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local hrp: Part = character:WaitForChild("HumanoidRootPart")
local humanoid: Humanoid = character:WaitForChild("Humanoid")
local userInputService = game:GetService("UserInputService")

local rayOriginOffset = 5 
local rayDistanceDown = 6  
local rayDistanceUp = 7     
local sphereRayRadius = 3   
local forwardOffset = 2      
local sphereRayCount = 8     

local function createRayVisual(startPos, endPos)
	local rayPart = Instance.new("Part")
	rayPart.Anchored = true
	rayPart.CanCollide = false
	rayPart.Material = Enum.Material.Neon
	rayPart.Color = Color3.new(1, 0, 0)
	rayPart.Size = Vector3.new(0.1, 0.1, (endPos - startPos).Magnitude)
	rayPart.CFrame = CFrame.new(startPos, endPos) * CFrame.new(0, 0, -(endPos - startPos).Magnitude / 2)
	rayPart.Parent = workspace
	task.delay(0.5, function()
		rayPart:Destroy()
	end)
end

local function castRays()
	local hitCount = 0

	local downRayOrigin = hrp.Position + hrp.CFrame.LookVector * forwardOffset + Vector3.new(0, rayOriginOffset, 0)
	local downRayDirection = Vector3.new(0, -rayDistanceDown, 0)

	local downRaycastParams = RaycastParams.new()
	downRaycastParams.FilterDescendantsInstances = {character}
	downRaycastParams.FilterType = Enum.RaycastFilterType.Exclude

	local downRaycastResult = workspace:Raycast(downRayOrigin, downRayDirection, downRaycastParams)
	if downRaycastResult then
		hitCount = hitCount + 1
		createRayVisual(downRayOrigin, downRaycastResult.Position)
	end

	local upRayOrigin = hrp.Position
	local upRayDirection = Vector3.new(0, rayDistanceUp, 0)

	local upRaycastParams = RaycastParams.new()
	upRaycastParams.FilterDescendantsInstances = {character}
	upRaycastParams.FilterType = Enum.RaycastFilterType.Exclude

	local upRaycastResult = workspace:Raycast(upRayOrigin, upRayDirection, upRaycastParams)
	if upRaycastResult then
		hitCount = hitCount + 1
		createRayVisual(upRayOrigin, upRaycastResult.Position)
	end

	local sphereOrigin = hrp.Position + Vector3.new(0, rayOriginOffset, 0)
	local sphereDirection = hrp.CFrame.LookVector * forwardOffset

	for i = 0, sphereRayCount - 1 do
		local angle = (math.pi * 2 / sphereRayCount) * i 
		local offset = Vector3.new(math.cos(angle) * sphereRayRadius, 0, math.sin(angle) * sphereRayRadius)
		local rayStart = sphereOrigin + offset

		local sphereRaycastParams = RaycastParams.new()
		sphereRaycastParams.FilterDescendantsInstances = {character}
		sphereRaycastParams.FilterType = Enum.RaycastFilterType.Exclude

		local sphereRaycastResult = workspace:Raycast(rayStart, sphereDirection, sphereRaycastParams)
		if sphereRaycastResult then
			hitCount = hitCount + 1
			createRayVisual(rayStart, sphereRaycastResult.Position)
		end
	end

	return hitCount
end

local function executeMantle()
	print("Performing Mantle!")

	local climbHeight = 3 
	local forwardMovement = hrp.CFrame.LookVector * 2 
	
	local raycastParams = RaycastParams.new()
	raycastParams.FilterDescendantsInstances = {character}
	raycastParams.FilterType = Enum.RaycastFilterType.Exclude
	local raycastResult = workspace:Raycast(hrp.Position + Vector3.new(0, climbHeight, 0) + forwardMovement, Vector3.new(0, -climbHeight - 1, 0), raycastParams)
	
	if raycastResult then
		local targetCFrame = CFrame.new(raycastResult.Position + Vector3.new(0, 2, 0))
		hrp.CFrame = targetCFrame
	end
end

local function onJumpRequest()
	local hitCount = castRays()

	if hitCount > 0 then
		executeMantle()
	else
		humanoid.JumpPower = 50
		humanoid.Jump = true
		task.wait(1)
		humanoid.JumpPower = 0
	end
end

userInputService.InputBegan:Connect(function(input)
	if input.KeyCode == Enum.KeyCode.Space then  
		onJumpRequest()
	end
end)

humanoid.JumpPower = 0
2 Likes

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.