Ledge Turning Not Working

To cut it simple the moving left and right is glitched for some reason. I don’t understand why and i have tried to fix it. The script came from an open source game: Ledge Climbing - Roblox

I need it for parts in my game but it isn’t working and sometimes it moves left and other times it moves right:

The Consol shows if i pressed left or right.
here is a video of what’s happening:

here is the full code for it:

--services
local UserInputService = game:GetService("UserInputService")
local ContextActionService = game:GetService("ContextActionService")
local RunService = game:GetService("RunService")
local CollectionService = game:GetService("CollectionService")
local TweenService = game:GetService("TweenService")
local Debris = game:GetService("Debris")
local GuiService = game:GetService("GuiService")
local PlayerStats = workspace:WaitForChild("Player"):WaitForChild("Player_Stats"):WaitForChild("CurrentPlayerMovement")

--varibles
local player = game.Players.LocalPlayer
local character = player.Character
local camera = workspace.CurrentCamera
local humanoid = character:WaitForChild("Humanoid")
local rootPart = character:WaitForChild("HumanoidRootPart")
local head = character:WaitForChild("Head")

--modules
local cameraShaker = require(game.ReplicatedStorage:WaitForChild("Modules").CameraShaker)

--shake camera
local function ShakeCamera(shakeCf)
	camera.CFrame = camera.CFrame * shakeCf
end

-- Create CameraShaker instance:
local renderPriority = Enum.RenderPriority.Camera.Value + 1
local camShake = cameraShaker.new(renderPriority, ShakeCamera)

--vaulting
local raycastParams = RaycastParams.new()
raycastParams.FilterDescendantsInstances = {character}
raycastParams.FilterType = Enum.RaycastFilterType.Exclude

local vaultMoveNumber = 10
local canVault = true
local canMove = true
local vaultConnection = nil
local ledgePart = nil

local grabAnim = humanoid:LoadAnimation(script:WaitForChild("Grab"))
local grabRightAnim = humanoid:LoadAnimation(script:WaitForChild("GrabRight"))
local grabLeftAnim = humanoid:LoadAnimation(script:WaitForChild("GrabLeft"))
local grabSounds = script:WaitForChild("Sounds"):GetChildren()

--play vault sounds
local function playSound()
	local sound = grabSounds[math.random(1, #grabSounds)]:Clone()
	sound.Parent = rootPart
	sound.Volume = .15
	sound:Play()

	sound.Ended:Connect(function()
		sound:Destroy()
	end)
end

local function partCheck(ledge)
	local vaultPartCheck = workspace:Raycast(ledge.Position + Vector3.new(0, -1, 0) + ledge.LookVector * 1, ledge.UpVector * 3, raycastParams)
	if vaultPartCheck == nil then
		return true
	elseif not CollectionService:HasTag(vaultPartCheck.Instance, "Ledge") then
		return true
	else
		return false
	end
end


local function vaultMoveCheck(ray, anim)
	local localPos = ray.Instance.CFrame:PointToObjectSpace(ray.Position)
	local localLedgePos = Vector3.new(localPos.X, ray.Instance.Size.Y/2, localPos.Z)
	local ledgePos = ray.Instance.CFrame:PointToWorldSpace(localLedgePos)
	local ledgeOffset = CFrame.lookAt(ledgePos, ledgePos - ray.Normal)

	if partCheck(ledgeOffset) then
		local magnitude = (ledgePos - head.Position).Magnitude
		if magnitude < 3 then
			local info = TweenInfo.new(.15, Enum.EasingStyle.Sine, Enum.EasingDirection.Out, 0, false, 0)
			local goal = {CFrame = ledgeOffset + Vector3.new(0, -2, 0) + ledgeOffset.LookVector * -1}
			local tween = TweenService:Create(ledgePart, info, goal)
			tween:Play()
			canMove = false
			playSound()

			--screen shake
			camShake:Start()
			local dashShake = camShake:ShakeOnce(.2, 13, 0, .5)
			dashShake:StartFadeOut(.5)

			--play anim
			if anim == "Right" then
				grabRightAnim:Play()
			elseif anim == "Left" then
				grabLeftAnim:Play()
			end

			--vault move delay
			task.delay(.25, function()
				canMove = true
			end)
		else
			
		end
	end
end


--moving from left to right function(so my code isn't messy)
local function vaultMove(direction, anim)
	local moveRay = workspace:Raycast(head.CFrame.Position, head.CFrame.RightVector * direction + head.CFrame.LookVector * 8, raycastParams)
	if moveRay then
		if moveRay.Instance then
			vaultMoveCheck(moveRay, anim)
		end
	else
		local turnRay = workspace:Raycast(head.CFrame.Position + Vector3.new(0, -1, 0) + head.CFrame.RightVector * direction, head.CFrame.RightVector * -direction + head.CFrame.LookVector * 2, raycastParams)
		if turnRay then
			if turnRay.Instance then
				vaultMoveCheck(turnRay, anim)
			end
		end
	end
end

--detect if moving left or right
humanoid:GetPropertyChangedSignal("MoveDirection"):Connect(function()
	if (humanoid.MoveDirection:Dot(camera.CFrame.RightVector) > -.9) and not canVault and canMove then
		vaultMove(-vaultMoveNumber, "Right")
	end
	
	if (humanoid.MoveDirection:Dot(-camera.CFrame.RightVector) > -.9) and not canVault and canMove then
		vaultMove(vaultMoveNumber, "Left")
	end
end)

--detect ledges
local function detectLedge()
	if canVault and (humanoid:GetState() == Enum.HumanoidStateType.Freefall or humanoid:GetState() == Enum.HumanoidStateType.Jumping) then
		local vaultCheck = workspace:Raycast(rootPart.CFrame.Position, rootPart.CFrame.LookVector * 5, raycastParams)
		if vaultCheck then
			if vaultCheck.Instance and CollectionService:HasTag(vaultCheck.Instance, "Ledge") and vaultCheck.Instance.Transparency <= 0.2 then
				if vaultCheck.Instance then	
					PlayerStats:SetAttribute("HoldingLedge", true)
					local localPos = vaultCheck.Instance.CFrame:PointToObjectSpace(vaultCheck.Position)
					local localLedgePos = Vector3.new(localPos.X, vaultCheck.Instance.Size.Y/2, localPos.Z)
					local ledgePos = vaultCheck.Instance.CFrame:PointToWorldSpace(localLedgePos)
					local ledgeOffset = CFrame.lookAt(ledgePos, ledgePos - vaultCheck.Normal)

					local magnitude = (ledgePos - head.Position).Magnitude
					if magnitude < 4 then
						if partCheck(ledgeOffset) then
							canVault = false

							--screen shake
							camShake:Start()
							local dashShake = camShake:ShakeOnce(.36, 12, 0, .5)
							dashShake:StartFadeOut(.5)

							--player follows this part(you dont exactly need it but it makes tweening the player when they move easier unless there is a better way to do this but idk)
							ledgePart = Instance.new("Part")
							ledgePart.Parent = workspace
							ledgePart.Anchored = true
							ledgePart.Size = Vector3.one
							ledgePart.CFrame = ledgeOffset + Vector3.new(0, -2, 0) + ledgeOffset.LookVector * -1
							ledgePart.CanQuery = false
							ledgePart.CanCollide = false
							ledgePart.CanTouch = false
							ledgePart.Transparency = 1

							--play anim and sound
							grabAnim:Play()
							playSound()

							--connection while player is on a ledge
							vaultConnection = RunService.RenderStepped:Connect(function(dt)
								rootPart.Anchored = true
								humanoid.AutoRotate = false -- so shift lock doesnt't rotate character
								rootPart.CFrame = rootPart.CFrame:Lerp(CFrame.lookAt(ledgePart.Position, (ledgePart.CFrame * CFrame.new(0, 0, -1)).Position), .25)
								humanoid:ChangeState(Enum.HumanoidStateType.Seated)
							end)
						end
					end
				end
			end
		end
	elseif not canVault then
		canVault = true
		humanoid.AutoRotate = true
		rootPart.Anchored = false
		humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
		grabAnim:Stop()

		--check if it exists and then disconnect
		if vaultConnection then
			vaultConnection:Disconnect()
		end

		if ledgePart then
			ledgePart:Destroy()
		end
	end
end

--pc and console support
UserInputService.InputBegan:Connect(function(input, gp)
	if (input.KeyCode == Enum.KeyCode.ButtonA or input.KeyCode == Enum.KeyCode.Space) then
		PlayerStats:SetAttribute("HoldingLedge", false)
		detectLedge()
	end
end)

--pc and console support
UserInputService.InputBegan:Connect(function(input, gp)
	if PlayerStats:GetAttribute("HoldingLedge") then
		if (input.KeyCode == Enum.KeyCode.A) then
			print("Pressed: Left")
		elseif (input.KeyCode == Enum.KeyCode.D) then
			print("Pressed: Right")
		end
	end
end)


--mobile support
if UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled and not UserInputService.MouseEnabled and not UserInputService.GamepadEnabled and not GuiService:IsTenFootInterface() then
	local jumpButton = player.PlayerGui:WaitForChild("TouchGui"):WaitForChild("TouchControlFrame"):WaitForChild("JumpButton")
	jumpButton.Activated:Connect(function()
		PlayerStats:SetAttribute("HoldingLedge", false)
		detectLedge()
	end)
end 

And here is the snip bit that i believe is causing the issue. Mainly because when i modify it, it changes a lot of the system:

humanoid:GetPropertyChangedSignal("MoveDirection"):Connect(function()
	if (humanoid.MoveDirection:Dot(camera.CFrame.RightVector) > -.9) and not canVault and canMove then
		vaultMove(-vaultMoveNumber, "Right")
	end
	
	if (humanoid.MoveDirection:Dot(-camera.CFrame.RightVector) > -.9) and not canVault and canMove then
		vaultMove(vaultMoveNumber, "Left")
	end
end)

I have changed the .9 to -.9 since it started working and it allows the turning to work.