From 17fd39c5e7c823980819e2c080cfa8ae5918e07f Mon Sep 17 00:00:00 2001
From: D-AIRY <admin@ds-servers.com>
Date: Wed, 25 Dec 2024 17:18:00 +0300
Subject: [PATCH] Added fall damage

---
 source/game/BaseCharacter.cpp | 19 +++++++++++++++++--
 source/game/BaseCharacter.h   |  4 +++-
 source/game/BaseEntity.cpp    |  2 +-
 source/game/GameData.cpp      |  3 +++
 4 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/source/game/BaseCharacter.cpp b/source/game/BaseCharacter.cpp
index 89dd1892c..a8d01e43f 100644
--- a/source/game/BaseCharacter.cpp
+++ b/source/game/BaseCharacter.cpp
@@ -26,7 +26,7 @@ IEventChannel<XEventPhysicsStep> *CBaseCharacter::m_pTickEventChannel = NULL;
 
 void CCharacterPhysicsTickEventListener::onEvent(const XEventPhysicsStep *pData)
 {
-	m_pCharacter->onPhysicsStep();
+	m_pCharacter->onPhysicsStep(pData->fTimeStep);
 }
 
 CBaseCharacter::CBaseCharacter():
@@ -452,7 +452,7 @@ float3 CBaseCharacter::getHeadOffset()
 	return(vHeadOffset);
 }
 
-void CBaseCharacter::onPhysicsStep()
+void CBaseCharacter::onPhysicsStep(float fDT)
 {
 	updateHitboxes();
 
@@ -469,6 +469,21 @@ void CBaseCharacter::onPhysicsStep()
 
 	m_pHeadEnt->setOffsetPos(getHeadOffset());
 
+	float fVerticalSpeed = m_pCharacter->getLinearVelocity().y;
+	float fVerticalMomentalAccel = (fVerticalSpeed - m_fPrevVerticalSpeed) / fDT;
+
+	static const float* cl_overload_max = GET_PCVAR_FLOAT("cl_overload_max");
+	static const float* cl_overload_dead = GET_PCVAR_FLOAT("cl_overload_dead");
+
+	fVerticalMomentalAccel = fabsf(fVerticalMomentalAccel);
+	if(fVerticalMomentalAccel > *cl_overload_max)
+	{
+		CTakeDamageInfo info(this, ((fVerticalMomentalAccel - *cl_overload_max) / (*cl_overload_dead / *cl_overload_max)) * 100.0f);
+		dispatchDamage(info);
+	}
+
+	m_fPrevVerticalSpeed = fVerticalSpeed;
+
 #if 0
 	//находим текущий квад аи сетки на котором находится игрок
 	ID idq = SAIG_QuadGet(&float3(m_vPosition), true);
diff --git a/source/game/BaseCharacter.h b/source/game/BaseCharacter.h
index ad1cbcb3d..532861d1b 100644
--- a/source/game/BaseCharacter.h
+++ b/source/game/BaseCharacter.h
@@ -198,10 +198,12 @@ protected:
 
 	IMovementController *m_pMovementController = NULL;
 
+	float m_fPrevVerticalSpeed = 0.0f;
+
 private:
 	static IEventChannel<XEventPhysicsStep> *m_pTickEventChannel;
 	CCharacterPhysicsTickEventListener m_physicsTicker;
-	void onPhysicsStep();
+	void onPhysicsStep(float fDT);
 };
 
 #endif
diff --git a/source/game/BaseEntity.cpp b/source/game/BaseEntity.cpp
index 8d498b1f1..b332335c2 100644
--- a/source/game/BaseEntity.cpp
+++ b/source/game/BaseEntity.cpp
@@ -738,7 +738,7 @@ int CBaseEntity::countEntByName(const char *szName)
 
 void CBaseEntity::dispatchDamage(CTakeDamageInfo &takeDamageInfo)
 {
-	float fHealth = takeDamageInfo.m_fDamage * 0.1f;
+	float fHealth = takeDamageInfo.m_fDamage;
 	if(takeDamageInfo.m_pInflictor)
 	{
 		LibReport(REPORT_MSG_LEVEL_NOTICE, "%s damaged (" COLOR_LRED "%.2f" COLOR_RESET ") by " COLOR_YELLOW "%s\n", getClassName(), fHealth, takeDamageInfo.m_pInflictor->getClassName());
diff --git a/source/game/GameData.cpp b/source/game/GameData.cpp
index d5e2b3d83..a759bab39 100644
--- a/source/game/GameData.cpp
+++ b/source/game/GameData.cpp
@@ -670,6 +670,9 @@ GameData::GameData(HWND hWnd, bool isGame):
 	Core_0RegisterCVarFloat("cl_speed_crouch", 1.05f, "Player crouch speed");
 	Core_0RegisterCVarFloat("cl_speed_crawl", 0.175f, "Player crawl speed");
 
+	Core_0RegisterCVarFloat("cl_overload_max", 400.0f, "The maximum G-force a player can withstand without being damaged");
+	Core_0RegisterCVarFloat("cl_overload_dead", 500.0f, "Overload that will result in guaranteed death of the player");
+
 	Core_0RegisterCVarFloat("lvl_debris_remove_time_min", 120.0f, "Debris collector time min");
 	Core_0RegisterCVarFloat("lvl_debris_remove_time_max", 200.0f, "Debris collector time max");
 
-- 
GitLab