From 4919c4bb0dc41b4aac7bb183c590aa109e1b7a75 Mon Sep 17 00:00:00 2001 From: Bitl Date: Thu, 11 Dec 2025 07:57:39 -0700 Subject: [PATCH 1/3] [TF] Fix regressions caused by recent Caber explosion change (with improvements) --- src/game/server/tf/tf_player.cpp | 2 +- src/game/shared/tf/tf_gamerules.cpp | 2 +- src/game/shared/tf/tf_weapon_bottle.cpp | 70 +++++++++++++++++++++++-- src/game/shared/tf/tf_weapon_bottle.h | 3 ++ 4 files changed, 70 insertions(+), 7 deletions(-) diff --git a/src/game/server/tf/tf_player.cpp b/src/game/server/tf/tf_player.cpp index fa944e35611..0253fe56f56 100644 --- a/src/game/server/tf/tf_player.cpp +++ b/src/game/server/tf/tf_player.cpp @@ -11268,7 +11268,7 @@ void CTFPlayer::Event_KilledOther( CBaseEntity *pVictim, const CTakeDamageInfo & flRefill *= 0.2; } - if ( flRefill > 0 && ((info.GetDamageType() & DMG_MELEE) || ( info.GetDamageCustom() == TF_DMG_CUSTOM_CHARGE_IMPACT ) ) ) + if ( flRefill > 0 && ( ( info.GetDamageType() & DMG_MELEE ) || ( info.GetDamageCustom() == TF_DMG_CUSTOM_STICKBOMB_EXPLOSION ) || ( info.GetDamageCustom() == TF_DMG_CUSTOM_CHARGE_IMPACT ) ) ) { m_Shared.SetDemomanChargeMeter( m_Shared.GetDemomanChargeMeter() + flRefill * 100.0f ); } diff --git a/src/game/shared/tf/tf_gamerules.cpp b/src/game/shared/tf/tf_gamerules.cpp index c3ec6c0d998..4029e0527e5 100644 --- a/src/game/shared/tf/tf_gamerules.cpp +++ b/src/game/shared/tf/tf_gamerules.cpp @@ -7258,7 +7258,7 @@ float CTFGameRules::ApplyOnDamageAliveModifyRules( const CTakeDamageInfo &info, outParams.bPlayDamageReductionSound = CheckMedicResist( TF_COND_MEDIGUN_SMALL_BULLET_RESIST, TF_COND_MEDIGUN_UBER_BULLET_RESIST, pVictim, flRawDamage, flDamageBase, bCrit, flDamageBonus ); } - if ( info.GetDamageType() & DMG_MELEE ) + if ( ( info.GetDamageType() & DMG_MELEE ) || ( info.GetDamageCustom() == TF_DMG_CUSTOM_STICKBOMB_EXPLOSION ) ) { CALL_ATTRIB_HOOK_FLOAT_ON_OTHER( pVictim, flDamageBase, mult_dmgtaken_from_melee ); } diff --git a/src/game/shared/tf/tf_weapon_bottle.cpp b/src/game/shared/tf/tf_weapon_bottle.cpp index ff74cff1227..b8c09a7d290 100644 --- a/src/game/shared/tf/tf_weapon_bottle.cpp +++ b/src/game/shared/tf/tf_weapon_bottle.cpp @@ -254,16 +254,22 @@ void CTFStickBomb::Smack( void ) TE_TFExplosion( filter, 0.0f, explosion, Vector(0,0,1), TF_WEAPON_GRENADELAUNCHER, pTFPlayer->entindex(), -1, SPECIAL1, iCustomParticleIndex ); - int dmgType = DMG_BLAST | DMG_USEDISTANCEMOD | DMG_MELEE; + int dmgType = DMG_BLAST | DMG_USEDISTANCEMOD; + if ( IsCurrentAttackACrit() ) + { + // TODO: Not removing the old critical path yet, but the new custom damage is marking criticals as well for melee now. dmgType |= DMG_CRITICAL; + } + else if ( m_bMiniCrit ) + { + dmgType |= DMG_RADIUS_MAX; // Unused for melee, indicates this should be a minicrit. + } - float flDamage = 75.0f; - CALL_ATTRIB_HOOK_FLOAT( flDamage, mult_dmg ); - + float flDamage = GetBlastDamage( &dmgType ); CTakeDamageInfo info( pTFPlayer, pTFPlayer, this, explosion, explosion, flDamage, dmgType, TF_DMG_CUSTOM_STICKBOMB_EXPLOSION, &explosion ); - float flRadius = 100.f; + float flRadius = 100.0f; CALL_ATTRIB_HOOK_FLOAT( flRadius, mult_explosion_radius ); CTFRadiusDamageInfo radiusinfo( &info, explosion, flRadius ); @@ -273,6 +279,60 @@ void CTFStickBomb::Smack( void ) } } +//----------------------------------------------------------------------------- +// Purpose: +// Output : float +//----------------------------------------------------------------------------- +#ifdef GAME_DLL +float CTFStickBomb::GetBlastDamage( int *iDamageType ) +{ + float flDamage = 75.0f; + CALL_ATTRIB_HOOK_FLOAT( flDamage, mult_dmg ); + + int iCritDoesNoDamage = 0; + CALL_ATTRIB_HOOK_INT( iCritDoesNoDamage, crit_does_no_damage ); + if ( iCritDoesNoDamage > 0 ) + { + if ( IsCurrentAttackACrit() ) + { + return 0.0f; + } + + if ( iDamageType && *iDamageType & DMG_CRITICAL ) + { + return 0.0f; + } + } + + CTFPlayer *pPlayer = ToTFPlayer( GetPlayerOwner() ); + if ( pPlayer ) + { + float flHalfHealth = pPlayer->GetMaxHealth() * 0.5f; + if ( pPlayer->GetHealth() < flHalfHealth ) + { + CALL_ATTRIB_HOOK_FLOAT( flDamage, mult_dmg_bonus_while_half_dead ); + } + else + { + CALL_ATTRIB_HOOK_FLOAT( flDamage, mult_dmg_penalty_while_half_alive ); + } + + // Some weapons change damage based on player's health + float flReducedHealthBonus = 1.0f; + CALL_ATTRIB_HOOK_FLOAT( flReducedHealthBonus, mult_dmg_with_reduced_health ); + if ( flReducedHealthBonus != 1.0f ) + { + float flHealthFraction = clamp( pPlayer->HealthFraction(), 0.0f, 1.0f ); + flReducedHealthBonus = Lerp( flHealthFraction, flReducedHealthBonus, 1.0f ); + + flDamage *= flReducedHealthBonus; + } + } + + return flDamage; +} +#endif + void CTFStickBomb::WeaponReset( void ) { BaseClass::WeaponReset(); diff --git a/src/game/shared/tf/tf_weapon_bottle.h b/src/game/shared/tf/tf_weapon_bottle.h index 1c886d8bf58..9dd02496e75 100644 --- a/src/game/shared/tf/tf_weapon_bottle.h +++ b/src/game/shared/tf/tf_weapon_bottle.h @@ -96,6 +96,9 @@ class CTFStickBomb : public CTFBreakableMelee virtual void WeaponRegenerate( void ) OVERRIDE; virtual void SwitchBodyGroups( void ) OVERRIDE; virtual const char* GetWorldModel( void ) const OVERRIDE; +#ifdef GAME_DLL + virtual float GetBlastDamage( int *iDamageType ); +#endif #ifdef CLIENT_DLL virtual int GetWorldModelIndex( void ) OVERRIDE; #endif From a9dbf90dcd10382ce28a0401af3dbb8899e05792 Mon Sep 17 00:00:00 2001 From: Bitl Date: Thu, 11 Dec 2025 08:10:53 -0700 Subject: [PATCH 2/3] Slight formatting change --- src/game/shared/tf/tf_weapon_bottle.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/game/shared/tf/tf_weapon_bottle.cpp b/src/game/shared/tf/tf_weapon_bottle.cpp index b8c09a7d290..2128ffc25d1 100644 --- a/src/game/shared/tf/tf_weapon_bottle.cpp +++ b/src/game/shared/tf/tf_weapon_bottle.cpp @@ -267,6 +267,7 @@ void CTFStickBomb::Smack( void ) } float flDamage = GetBlastDamage( &dmgType ); + CTakeDamageInfo info( pTFPlayer, pTFPlayer, this, explosion, explosion, flDamage, dmgType, TF_DMG_CUSTOM_STICKBOMB_EXPLOSION, &explosion ); float flRadius = 100.0f; From 2fff06af121990811cef8a95472dda1edfb5a543 Mon Sep 17 00:00:00 2001 From: Bitl Date: Thu, 11 Dec 2025 08:37:55 -0700 Subject: [PATCH 3/3] Add support for dmg_from_melee --- src/game/shared/tf/tf_gamerules.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/shared/tf/tf_gamerules.cpp b/src/game/shared/tf/tf_gamerules.cpp index 4029e0527e5..6d1cbabb18a 100644 --- a/src/game/shared/tf/tf_gamerules.cpp +++ b/src/game/shared/tf/tf_gamerules.cpp @@ -7374,7 +7374,7 @@ float CTFGameRules::ApplyOnDamageAliveModifyRules( const CTakeDamageInfo &info, if ( pVictim && pVictim->GetActiveTFWeapon() && !iAttackIgnoresResists ) { - if ( info.GetDamageType() & (DMG_CLUB) ) + if ( info.GetDamageType() & (DMG_CLUB) || ( info.GetDamageCustom() == TF_DMG_CUSTOM_STICKBOMB_EXPLOSION ) ) { CALL_ATTRIB_HOOK_FLOAT_ON_OTHER( pVictim->GetActiveTFWeapon(), flRealDamage, dmg_from_melee ); }