local character = script.Parent local humanoid = character:WaitForChild("Humanoid") local root = humanoid.RootPart local runService = game:GetService("RunService") local raycastOffset = CFrame.new(0, 4, -1) * CFrame.Angles(-math.pi/2, 0, 0) local params = RaycastParams.new() params.FilterDescendantsInstances = {character} params.IgnoreWater = true local weld = Instance.new("Weld") weld.Part1 = root weld.Parent = root --local cam = workspace.CurrentCamera runService.RenderStepped:Connect(function(dt) if weld.Enabled then weld.Enabled = false weld.Part0 = nil end local rootCF = root.CFrame if humanoid.Jump then root:ApplyImpulse(rootCF.ZVector * root.AssemblyMass) return end local rayCF = rootCF * raycastOffset local rayPos = rayCF.Position local rayDir = rayCF.LookVector * 6 local result = workspace:Raycast(rayPos, rayDir, params) if result and result.Instance then if result.Position.Y > rootCF.Position.Y + 1.5 then return end if result.Instance.Name == "ledge" then weld.Enabled = true local move = humanoid.MoveDirection:Dot(rootCF.LookVector) weld.C0 = result.Instance.CFrame:ToObjectSpace(rootCF) * CFrame.new(0, dt*move*5, -dt*move) weld.Part0 = result.Instance humanoid:ChangeState(Enum.HumanoidStateType.Climbing) end end end)