From 1dee1a8336b789b3d8e2ccf5f62bb17196dcc9bd Mon Sep 17 00:00:00 2001 From: Kajek777 Date: Wed, 5 Nov 2025 17:09:05 +0100 Subject: [PATCH 1/6] Fix extended melee range while charging not working --- src/game/shared/tf/tf_weaponbase_melee.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/game/shared/tf/tf_weaponbase_melee.cpp b/src/game/shared/tf/tf_weaponbase_melee.cpp index 0dac9870cfc..23f2a9a281e 100644 --- a/src/game/shared/tf/tf_weaponbase_melee.cpp +++ b/src/game/shared/tf/tf_weaponbase_melee.cpp @@ -25,6 +25,8 @@ ConVar tf_weapon_criticals_melee( "tf_weapon_criticals_melee", "1", FCVAR_REPLICATED | FCVAR_NOTIFY, "Controls random crits for melee weapons. 0 - Melee weapons do not randomly crit. 1 - Melee weapons can randomly crit only if tf_weapon_criticals is also enabled. 2 - Melee weapons can always randomly crit regardless of the tf_weapon_criticals setting." ); +ConVar tf_shield_charge_range_extend("tf_shield_charge_range_extend", "1", FCVAR_REPLICATED | FCVAR_NOTIFY, "Controls whether Demoman's shield charges extend melee range.\n0 - Attacks started during a charge will not have their melee range modified. 1 - Attacks started during a charge will have an extended melee range."); + //============================================================================= // // TFWeaponBase Melee tables. @@ -164,7 +166,8 @@ bool CTFWeaponBaseMelee::Holster( CBaseCombatWeapon *pSwitchingTo ) int CTFWeaponBaseMelee::GetSwingRange( void ) { CTFPlayer *pOwner = ToTFPlayer( GetOwner() ); - if ( pOwner && pOwner->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) ) + int shield_charge_range_extend = tf_shield_charge_range_extend.GetInt(); + if ( pOwner && ( pOwner->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) || ( IsCurrentAttackDuringDemoCharge() && shield_charge_range_extend ) ) ) { return 128; } From c06d2ef5b3354cafeb17e8b1d34efd5153ab1480 Mon Sep 17 00:00:00 2001 From: Kajek777 Date: Wed, 5 Nov 2025 20:07:39 +0100 Subject: [PATCH 2/6] Changed cvar to be used as the range value, improved implementation --- src/game/shared/tf/tf_weaponbase_melee.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/game/shared/tf/tf_weaponbase_melee.cpp b/src/game/shared/tf/tf_weaponbase_melee.cpp index 23f2a9a281e..76f9cdbc3e2 100644 --- a/src/game/shared/tf/tf_weaponbase_melee.cpp +++ b/src/game/shared/tf/tf_weaponbase_melee.cpp @@ -25,7 +25,7 @@ ConVar tf_weapon_criticals_melee( "tf_weapon_criticals_melee", "1", FCVAR_REPLICATED | FCVAR_NOTIFY, "Controls random crits for melee weapons. 0 - Melee weapons do not randomly crit. 1 - Melee weapons can randomly crit only if tf_weapon_criticals is also enabled. 2 - Melee weapons can always randomly crit regardless of the tf_weapon_criticals setting." ); -ConVar tf_shield_charge_range_extend("tf_shield_charge_range_extend", "1", FCVAR_REPLICATED | FCVAR_NOTIFY, "Controls whether Demoman's shield charges extend melee range.\n0 - Attacks started during a charge will not have their melee range modified. 1 - Attacks started during a charge will have an extended melee range."); +ConVar tf_shield_charge_melee_range("tf_shield_charge_melee_range", "128", FCVAR_REPLICATED | FCVAR_NOTIFY, "The range of a melee attack performed during a shield charge. Set to 0 for no change."); //============================================================================= // @@ -166,10 +166,9 @@ bool CTFWeaponBaseMelee::Holster( CBaseCombatWeapon *pSwitchingTo ) int CTFWeaponBaseMelee::GetSwingRange( void ) { CTFPlayer *pOwner = ToTFPlayer( GetOwner() ); - int shield_charge_range_extend = tf_shield_charge_range_extend.GetInt(); - if ( pOwner && ( pOwner->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) || ( IsCurrentAttackDuringDemoCharge() && shield_charge_range_extend ) ) ) + if ( pOwner && ( pOwner->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) || ( IsCurrentAttackDuringDemoCharge() && tf_shield_charge_melee_range.GetInt() ) ) ) { - return 128; + return tf_shield_charge_melee_range.GetInt(); } else { @@ -203,11 +202,11 @@ void CTFWeaponBaseMelee::PrimaryAttack() pPlayer->EndClassSpecialSkill(); + m_bCurrentAttackIsDuringDemoCharge = pPlayer->m_Shared.GetNextMeleeCrit() != MELEE_NOCRIT; + // Swing the weapon. Swing( pPlayer ); - m_bCurrentAttackIsDuringDemoCharge = pPlayer->m_Shared.GetNextMeleeCrit() != MELEE_NOCRIT; - if ( pPlayer->m_Shared.GetNextMeleeCrit() == MELEE_MINICRIT ) { m_bMiniCrit = true; From 8f66d6f138c8afce8c48ca65a7d27027b2b11f56 Mon Sep 17 00:00:00 2001 From: Kajek777 Date: Thu, 6 Nov 2025 14:49:55 +0100 Subject: [PATCH 3/6] Changed default value of cvar to 0 --- src/game/shared/tf/tf_weaponbase_melee.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/shared/tf/tf_weaponbase_melee.cpp b/src/game/shared/tf/tf_weaponbase_melee.cpp index 76f9cdbc3e2..39c1f5be1b4 100644 --- a/src/game/shared/tf/tf_weaponbase_melee.cpp +++ b/src/game/shared/tf/tf_weaponbase_melee.cpp @@ -25,7 +25,7 @@ ConVar tf_weapon_criticals_melee( "tf_weapon_criticals_melee", "1", FCVAR_REPLICATED | FCVAR_NOTIFY, "Controls random crits for melee weapons. 0 - Melee weapons do not randomly crit. 1 - Melee weapons can randomly crit only if tf_weapon_criticals is also enabled. 2 - Melee weapons can always randomly crit regardless of the tf_weapon_criticals setting." ); -ConVar tf_shield_charge_melee_range("tf_shield_charge_melee_range", "128", FCVAR_REPLICATED | FCVAR_NOTIFY, "The range of a melee attack performed during a shield charge. Set to 0 for no change."); +ConVar tf_shield_charge_melee_range("tf_shield_charge_melee_range", "0", FCVAR_REPLICATED | FCVAR_NOTIFY, "The range of a melee attack performed during a shield charge. Set to 0 for no change."); //============================================================================= // From 11bc5cd8a9c0d64c49c6ccf9ccd9b75f237ba6d5 Mon Sep 17 00:00:00 2001 From: Kajek777 Date: Thu, 6 Nov 2025 21:10:04 +0100 Subject: [PATCH 4/6] Changed to account for swinging before charging --- src/game/shared/tf/tf_weaponbase_melee.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/game/shared/tf/tf_weaponbase_melee.cpp b/src/game/shared/tf/tf_weaponbase_melee.cpp index 39c1f5be1b4..3db7bbc4613 100644 --- a/src/game/shared/tf/tf_weaponbase_melee.cpp +++ b/src/game/shared/tf/tf_weaponbase_melee.cpp @@ -168,7 +168,14 @@ int CTFWeaponBaseMelee::GetSwingRange( void ) CTFPlayer *pOwner = ToTFPlayer( GetOwner() ); if ( pOwner && ( pOwner->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) || ( IsCurrentAttackDuringDemoCharge() && tf_shield_charge_melee_range.GetInt() ) ) ) { - return tf_shield_charge_melee_range.GetInt(); + if (tf_shield_charge_melee_range.GetInt()) + { + return tf_shield_charge_melee_range.GetInt(); + } + else + { + return 128; + } } else { From d39f6bbc1bece35a170ccfcd070270d5be4c5c02 Mon Sep 17 00:00:00 2001 From: Kajek777 Date: Fri, 7 Nov 2025 07:39:40 +0100 Subject: [PATCH 5/6] Split condition into two for clarity --- src/game/shared/tf/tf_weaponbase_melee.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/game/shared/tf/tf_weaponbase_melee.cpp b/src/game/shared/tf/tf_weaponbase_melee.cpp index 3db7bbc4613..844fa03e794 100644 --- a/src/game/shared/tf/tf_weaponbase_melee.cpp +++ b/src/game/shared/tf/tf_weaponbase_melee.cpp @@ -166,16 +166,14 @@ bool CTFWeaponBaseMelee::Holster( CBaseCombatWeapon *pSwitchingTo ) int CTFWeaponBaseMelee::GetSwingRange( void ) { CTFPlayer *pOwner = ToTFPlayer( GetOwner() ); - if ( pOwner && ( pOwner->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) || ( IsCurrentAttackDuringDemoCharge() && tf_shield_charge_melee_range.GetInt() ) ) ) + if (pOwner && pOwner->m_Shared.InCond(TF_COND_SHIELD_CHARGE)) { - if (tf_shield_charge_melee_range.GetInt()) - { - return tf_shield_charge_melee_range.GetInt(); - } - else - { - return 128; - } + // mvm bots that can attack while charging + return 128; + } + else if (IsCurrentAttackDuringDemoCharge() && tf_shield_charge_melee_range.GetInt()) + { + return tf_shield_charge_melee_range.GetInt(); } else { From dd1a4edb09c1ad51aedf2f777859b293c4310069 Mon Sep 17 00:00:00 2001 From: Kajek777 Date: Mon, 10 Nov 2025 14:48:24 +0100 Subject: [PATCH 6/6] Added check for negative values --- src/game/shared/tf/tf_weaponbase_melee.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/shared/tf/tf_weaponbase_melee.cpp b/src/game/shared/tf/tf_weaponbase_melee.cpp index 844fa03e794..9e888ca71f9 100644 --- a/src/game/shared/tf/tf_weaponbase_melee.cpp +++ b/src/game/shared/tf/tf_weaponbase_melee.cpp @@ -166,12 +166,12 @@ bool CTFWeaponBaseMelee::Holster( CBaseCombatWeapon *pSwitchingTo ) int CTFWeaponBaseMelee::GetSwingRange( void ) { CTFPlayer *pOwner = ToTFPlayer( GetOwner() ); - if (pOwner && pOwner->m_Shared.InCond(TF_COND_SHIELD_CHARGE)) + if ( pOwner && pOwner->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) ) { // mvm bots that can attack while charging return 128; } - else if (IsCurrentAttackDuringDemoCharge() && tf_shield_charge_melee_range.GetInt()) + else if ( IsCurrentAttackDuringDemoCharge() && tf_shield_charge_melee_range.GetInt() > 0 ) { return tf_shield_charge_melee_range.GetInt(); }