From 4238a7238684f49f7ce627d888b5713b3183d241 Mon Sep 17 00:00:00 2001
From: D-AIRY <admin@ds-servers.com>
Date: Mon, 23 Dec 2024 15:36:57 +0300
Subject: [PATCH] Animate ladder mounting

---
 source/game/LadderMovementController.cpp | 19 +++++++++++++++----
 source/game/LadderMovementController.h   |  9 +++++++++
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/source/game/LadderMovementController.cpp b/source/game/LadderMovementController.cpp
index 6152853f6..ef824bf04 100644
--- a/source/game/LadderMovementController.cpp
+++ b/source/game/LadderMovementController.cpp
@@ -45,9 +45,10 @@ void CLadderMovementController::setCharacter(CBaseCharacter *pCharacter)
 	pCharacterController->setGravity(float3(0.0f, 0.0f, 0.0f));
 	pCharacterController->setVelocityForTimeInterval(float3(0.0f, 0.0f, 0.0f), 0.0f);
 
-	TODO("Make move smoother");
-	float3 vPointOnLadder = SMProjectPointOnLine(m_pCharacter->getPos(), m_vLadderPoint[0], m_vLadderPoint[1]);
-	m_pCharacter->setPos(vPointOnLadder);
+	m_mounting.is = true;
+	m_mounting.fFrac = 0.0f;
+	m_mounting.vStartPos = m_pCharacter->getPos();
+	m_mounting.vTargetPos = SMProjectPointOnLine(m_pCharacter->getPos(), m_vLadderPoint[0], m_vLadderPoint[1]);
 }
 
 void CLadderMovementController::handleMove(const float3 &vDir)
@@ -68,7 +69,17 @@ bool CLadderMovementController::handleUse()
 
 void CLadderMovementController::update(float fDt)
 {
-	if(m_bWillDismount)
+	if(m_mounting.is)
+	{
+		m_mounting.fFrac += 7.0f * fDt;
+		if(m_mounting.fFrac > 1.0f)
+		{
+			m_mounting.fFrac = 1.0f;
+			m_mounting.is = false;
+		}
+		m_pCharacter->setPos(vlerp(m_mounting.vStartPos, m_mounting.vTargetPos, m_mounting.fFrac));
+	}
+	else if(m_bWillDismount)
 	{
 		((CPlayer*)m_pCharacter)->m_vCurrentSpeed = m_vMoveDir;
 		m_pCharacter->setMovementController(NULL);
diff --git a/source/game/LadderMovementController.h b/source/game/LadderMovementController.h
index a41cc4ac2..0b34f2256 100644
--- a/source/game/LadderMovementController.h
+++ b/source/game/LadderMovementController.h
@@ -26,6 +26,15 @@ private:
 
 	float3_t m_vMoveDir;
 
+	struct
+	{
+		bool is = false;
+		float fFrac = 0.0f;
+		float3_t vStartPos;
+		float3_t vTargetPos;
+	}
+	m_mounting;
+
 	bool m_bWillDismount = false;
 };
 
-- 
GitLab