From a750002bc8c3a8add8fef1329701c56616b4bec2 Mon Sep 17 00:00:00 2001 From: Alan Shen Date: Wed, 14 Oct 2026 23:20:00 -0600 Subject: [PATCH 1/2] Time a reload by its own sequence, not a transition The Tachi and Milso viewmodels carry a node graph from HL2's pistol, so a reload started from the lowered pose (during a sprint) played the lowtoidle transition first. DefaultReload took that 0.37-0.40 s transition as the reload length, and the server refilled the magazine after about 0.6 s with no reload animation. Skip transitions for ACT_VM_RELOAD as SetIdealActivity already does for the draw, so the reload plays at once and lasts its own 2.1 s. --- src/game/shared/basecombatweapon_shared.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/game/shared/basecombatweapon_shared.cpp b/src/game/shared/basecombatweapon_shared.cpp index e72e024be8..f9c993e6d8 100644 --- a/src/game/shared/basecombatweapon_shared.cpp +++ b/src/game/shared/basecombatweapon_shared.cpp @@ -2443,7 +2443,13 @@ bool CBaseCombatWeapon::SetIdealActivity( Activity ideal ) int nextSequence = FindTransitionSequence( GetSequence(), m_nIdealSequence, NULL ); // Don't use transitions when we're deploying +#ifdef NEO + // or reloading: the reload ends after the sequence's duration, + // so a transition played first (such as the Tachi's lowtoidle after a sprint) would cut the reload short + if ( ideal != ACT_VM_DRAW && ideal != ACT_VM_RELOAD && IsWeaponVisible() && nextSequence != m_nIdealSequence ) +#else if ( ideal != ACT_VM_DRAW && IsWeaponVisible() && nextSequence != m_nIdealSequence ) +#endif { //Set our activity to the next transitional animation SetActivity( ACT_TRANSITION ); From e8d8993c36f08729d7280ea03523441a882ea84b Mon Sep 17 00:00:00 2001 From: Alan Shen Date: Sun, 25 Oct 2026 21:35:03 -0600 Subject: [PATCH 2/2] Also skip transitions for ACT_VM_RELOAD_EMPTY The reload-empty sequence is affected by the same bug as the regular reload: if a sprint-lowered pistol starts a reload when the magazine is empty, the lowtoidle transition would be timed instead of the full reload-empty sequence. Guard against it now even though no weapon currently calls SetIdealActivity(ACT_VM_RELOAD_EMPTY). --- src/game/shared/basecombatweapon_shared.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/shared/basecombatweapon_shared.cpp b/src/game/shared/basecombatweapon_shared.cpp index f9c993e6d8..8fa90af7ad 100644 --- a/src/game/shared/basecombatweapon_shared.cpp +++ b/src/game/shared/basecombatweapon_shared.cpp @@ -2446,7 +2446,7 @@ bool CBaseCombatWeapon::SetIdealActivity( Activity ideal ) #ifdef NEO // or reloading: the reload ends after the sequence's duration, // so a transition played first (such as the Tachi's lowtoidle after a sprint) would cut the reload short - if ( ideal != ACT_VM_DRAW && ideal != ACT_VM_RELOAD && IsWeaponVisible() && nextSequence != m_nIdealSequence ) + if ( ideal != ACT_VM_DRAW && ideal != ACT_VM_RELOAD && ideal != ACT_VM_RELOAD_EMPTY && IsWeaponVisible() && nextSequence != m_nIdealSequence ) #else if ( ideal != ACT_VM_DRAW && IsWeaponVisible() && nextSequence != m_nIdealSequence ) #endif