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