diff --git a/source/game/LadderMovementController.cpp b/source/game/LadderMovementController.cpp index 6152853f6bdaecc805dc1ce60e52c9693c7e9f76..ef824bf04907b941823c1931fcf2562008b94d13 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 a41cc4ac208975e67aba2a2005d6e2157cc878aa..0b34f2256e1e0e4051f4f39cf1d2a40e87046739 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; };