From f9eb989b3baf02e094cb23aa63a3c88ef064ffba Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sun, 4 Aug 2024 17:25:38 +0200 Subject: [PATCH] Game: add method for calculating zoom FOV interp --- src/game/CMakeLists.txt | 2 ++ src/game/client/r1/c_weapon_x.cpp | 6 ++++++ src/game/client/r1/c_weapon_x.h | 5 +++++ src/game/server/r1/weapon_x.cpp | 6 ++++++ src/game/server/r1/weapon_x.h | 4 ++++ src/game/shared/r1/weapon_playerdata.h | 20 +++++++++++++++++++- 6 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/game/client/r1/c_weapon_x.cpp create mode 100644 src/game/server/r1/weapon_x.cpp diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 86b069b3..6cc44afb 100644 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -153,6 +153,7 @@ add_sources( SOURCE_GROUP "Player" ) add_sources( SOURCE_GROUP "Weapon" + "server/r1/weapon_x.cpp" "server/r1/weapon_x.h" ) @@ -219,6 +220,7 @@ add_sources( SOURCE_GROUP "Player" ) add_sources( SOURCE_GROUP "Weapon" + "client/r1/c_weapon_x.cpp" "client/r1/c_weapon_x.h" ) diff --git a/src/game/client/r1/c_weapon_x.cpp b/src/game/client/r1/c_weapon_x.cpp new file mode 100644 index 00000000..8ed6219c --- /dev/null +++ b/src/game/client/r1/c_weapon_x.cpp @@ -0,0 +1,6 @@ +#include "c_weapon_x.h" + +float C_WeaponX::GetZoomFOVInterpAmount(const float curTime) const +{ + return m_playerData.GetZoomFOVInterpAmount(curTime); +} diff --git a/src/game/client/r1/c_weapon_x.h b/src/game/client/r1/c_weapon_x.h index 042510d7..1fc3248e 100644 --- a/src/game/client/r1/c_weapon_x.h +++ b/src/game/client/r1/c_weapon_x.h @@ -8,6 +8,11 @@ class C_WeaponX : C_BaseAnimating { +public: + float GetZoomFOVInterpAmount(const float curTime) const; + inline bool HasTargetZoomFOV() { return m_playerData.GetTargetZoomFOV() == *(float*)&m_modVars[3120]; } + +private: EHANDLE m_weaponOwner; float m_lastPrimaryAttack; float m_nextReadyTime; diff --git a/src/game/server/r1/weapon_x.cpp b/src/game/server/r1/weapon_x.cpp new file mode 100644 index 00000000..26253f9e --- /dev/null +++ b/src/game/server/r1/weapon_x.cpp @@ -0,0 +1,6 @@ +#include "weapon_x.h" + +float CWeaponX::GetZoomFOVInterpAmount(const float curTime) const +{ + return m_playerData.GetZoomFOVInterpAmount(curTime); +} diff --git a/src/game/server/r1/weapon_x.h b/src/game/server/r1/weapon_x.h index 2922d173..91c029e6 100644 --- a/src/game/server/r1/weapon_x.h +++ b/src/game/server/r1/weapon_x.h @@ -14,6 +14,10 @@ class CWeaponX : CBaseAnimating { +public: + float GetZoomFOVInterpAmount(const float curTime) const; + +private: EHANDLE m_weaponOwner; float m_lastPrimaryAttack; float m_nextReadyTime; diff --git a/src/game/shared/r1/weapon_playerdata.h b/src/game/shared/r1/weapon_playerdata.h index 935b4572..470732df 100644 --- a/src/game/shared/r1/weapon_playerdata.h +++ b/src/game/shared/r1/weapon_playerdata.h @@ -3,6 +3,11 @@ class WeaponPlayerData { +public: + inline float GetZoomFOVInterpAmount(const float curTime) const; + inline float GetTargetZoomFOV() const { return m_targetZoomFOV; } + +private: void* __vftable; float m_moveSpread; float m_spreadStartTime; @@ -70,8 +75,21 @@ class WeaponPlayerData int m_charmAttachment; int m_charmScriptIndex; }; - // Client's class is identical. typedef WeaponPlayerData WeaponPlayerData_Client; + +float WeaponPlayerData::GetZoomFOVInterpAmount(const float curTime) const +{ + const float zoomLerpTime = m_zoomFOVLerpTime; + + if (zoomLerpTime <= 0.0f) + return 1.0f; + + const float endLerptime = m_zoomFOVLerpEndTime; + const float finalLerpTime = Min(Max((curTime - (endLerptime - zoomLerpTime)) / zoomLerpTime, 0.0f), 1.0f); + + return (3.0f - (finalLerpTime + finalLerpTime)) * (finalLerpTime * finalLerpTime); +} + #endif // SHARED_WEAPON_PLAYERDATA_H