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