From e5071944e2f17212656453e41d2f46020266a744 Mon Sep 17 00:00:00 2001 From: SuperCake Date: Wed, 13 May 2026 22:42:14 +0200 Subject: [PATCH 1/4] fix(welder): don't weld if job is done This caused infinite try-to-weld loop --- src/game/shared/swarm/asw_weapon_welder_shared.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/game/shared/swarm/asw_weapon_welder_shared.cpp b/src/game/shared/swarm/asw_weapon_welder_shared.cpp index c7b43d251..39e95c466 100644 --- a/src/game/shared/swarm/asw_weapon_welder_shared.cpp +++ b/src/game/shared/swarm/asw_weapon_welder_shared.cpp @@ -150,6 +150,10 @@ void CASW_Weapon_Welder::WeldDoor(bool bSeal) pMarine->DoMuzzleFlash(); m_bIsFiring = true; } + else + { + bWelding = false; + } } #ifdef CLIENT_DLL pMarine->SetFacingPoint(vecFacingPoint, GetFireRate()*2.0f); From 4a7bf221904f2b787b1012a8ae12e298be45fb44 Mon Sep 17 00:00:00 2001 From: SuperCake Date: Wed, 13 May 2026 23:03:31 +0200 Subject: [PATCH 2/4] feat(welder): add StopCloseForWeld to initiate immediate door opening --- src/game/server/swarm/asw_door.cpp | 12 ++++++++++++ src/game/server/swarm/asw_door.h | 1 + src/game/shared/swarm/asw_weapon_welder_shared.cpp | 9 ++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/game/server/swarm/asw_door.cpp b/src/game/server/swarm/asw_door.cpp index a69eccd7b..febd2a104 100644 --- a/src/game/server/swarm/asw_door.cpp +++ b/src/game/server/swarm/asw_door.cpp @@ -1082,6 +1082,18 @@ bool CASW_Door::CloseForWeld( CASW_Marine *pMarine ) return false; } +bool CASW_Door::StopCloseForWeld( CASW_Marine *pMarine ) +{ + if ( m_bCanCloseToWeld ) + { + variant_t emptyVariant; + AcceptInput( "Open", pMarine, this, emptyVariant, 0 ); + m_fClosingToWeldTime = gpGlobals->curtime; + return true; + } + return false; +} + void CASW_Door::AutoOpen( CBaseEntity *pOther ) { if ( gpGlobals->curtime > m_fClosingToWeldTime ) diff --git a/src/game/server/swarm/asw_door.h b/src/game/server/swarm/asw_door.h index 7f7ddddd1..007488353 100644 --- a/src/game/server/swarm/asw_door.h +++ b/src/game/server/swarm/asw_door.h @@ -95,6 +95,7 @@ class CASW_Door : public CBasePropDoor Vector GetWeldFacingPoint(CBaseEntity* pOther); // the point a marine should look to weld this door bool CloseForWeld(CASW_Marine* PMarine); // player requests the door to shut so he can weld it + bool StopCloseForWeld(CASW_Marine *pMarine); // open the door bool IsRecommendedSeal( void ) { return m_bRecommendedSeal; } bool CanWeld( void ) { return m_bCanCloseToWeld; } float m_fClosingToWeldTime; // door won't autoopen before this curtime diff --git a/src/game/shared/swarm/asw_weapon_welder_shared.cpp b/src/game/shared/swarm/asw_weapon_welder_shared.cpp index 39e95c466..d08cc67b3 100644 --- a/src/game/shared/swarm/asw_weapon_welder_shared.cpp +++ b/src/game/shared/swarm/asw_weapon_welder_shared.cpp @@ -167,12 +167,19 @@ void CASW_Weapon_Welder::WeldDoor(bool bSeal) { if ( pDoor->IsOpen() ) { -#ifndef CLIENT_DLL if ( bSeal ) { +#ifndef CLIENT_DLL pDoor->CloseForWeld( pMarine ); // shut the door first, so we can start welding it +#endif } + else + { +#ifndef CLIENT_DLL + pDoor->StopCloseForWeld( pMarine ); #endif + bWelding = false; + } } else { From 2310d113a2b11b32a6c84ddb93e3fa9605819302 Mon Sep 17 00:00:00 2001 From: SuperCake Date: Wed, 13 May 2026 18:51:51 +0200 Subject: [PATCH 3/4] refactor(welder): extract FinishWeld routine bKeepWeldDirection should do nothing right now --- .../shared/swarm/asw_weapon_welder_shared.cpp | 76 +++++++------------ .../shared/swarm/asw_weapon_welder_shared.h | 2 + 2 files changed, 31 insertions(+), 47 deletions(-) diff --git a/src/game/shared/swarm/asw_weapon_welder_shared.cpp b/src/game/shared/swarm/asw_weapon_welder_shared.cpp index d08cc67b3..ec55b7905 100644 --- a/src/game/shared/swarm/asw_weapon_welder_shared.cpp +++ b/src/game/shared/swarm/asw_weapon_welder_shared.cpp @@ -214,19 +214,7 @@ void CASW_Weapon_Welder::WeldDoor(bool bSeal) if ( !bWelding ) { - m_iAutomaticWeldDirection = 0; - m_bShotDelayed = false; -#ifdef GAME_DLL - if ( pMarine->GetMarineResource() ) - { - pMarine->GetMarineResource()->m_hWeldingDoor = NULL; - } - - m_pWeldDoor = NULL; - - pMarine->OnWeldFinished(); -#endif - m_bIsFiring = false; + FinishWeld( pMarine, false ); } else { @@ -241,29 +229,41 @@ void CASW_Weapon_Welder::WeldDoor(bool bSeal) } } +void CASW_Weapon_Welder::FinishWeld( CASW_Marine* pMarine, bool bKeepWeldDirection ) +{ + m_bShotDelayed = false; +#ifdef GAME_DLL + if ( pMarine ) + { + if ( pMarine->GetMarineResource() ) + { + pMarine->GetMarineResource()->m_hWeldingDoor = NULL; + } + pMarine->OnWeldFinished(); + } +#endif // GAME_DLL +#ifndef CLIENT_DLL + m_pWeldDoor = NULL; +#endif // !CLIENT_DLL + if ( !bKeepWeldDirection ) + { + m_iAutomaticWeldDirection = 0; + } + m_bIsFiring = false; +} + // make the weapon weld if needed void CASW_Weapon_Welder::ItemPostFrame() { + CASW_Marine *pMarine = NULL; #ifndef CLIENT_DLL - CASW_Marine *pMarine = GetMarine(); + pMarine = GetMarine(); if ( !pMarine || !pMarine->GetCommander() ) { if ( m_bPlayingWelderSound ) { - m_bIsFiring = false; - - m_pWeldDoor = NULL; - - if (pMarine) - { - if (pMarine->GetMarineResource()) - { - pMarine->GetMarineResource()->m_hWeldingDoor = NULL; - } - - pMarine->OnWeldFinished(); - } + FinishWeld( pMarine, true ); //Msg( "Clearing weld door as no marine\n" ); } return BaseItemPostFrame(); @@ -328,32 +328,14 @@ void CASW_Weapon_Welder::ItemPostFrame() if ( ( m_iAutomaticWeldDirection > 0 && m_pWeldDoor->GetSealAmount() >= 1.0f ) || ( m_iAutomaticWeldDirection < 0 && m_pWeldDoor->GetSealAmount() <= 0.0f ) ) { - m_bShotDelayed = false; -#ifdef GAME_DLL - if ( pMarine->GetMarineResource() ) - { - pMarine->GetMarineResource()->m_hWeldingDoor = NULL; - } - m_pWeldDoor = NULL; - pMarine->OnWeldFinished(); -#endif - m_bIsFiring = false; + FinishWeld( pMarine, false ); } } else { if ( !FindDoor() ) { - m_bShotDelayed = false; -#ifdef GAME_DLL - if ( pMarine->GetMarineResource() ) - { - pMarine->GetMarineResource()->m_hWeldingDoor = NULL; - } - m_pWeldDoor = NULL; - pMarine->OnWeldFinished(); -#endif - m_bIsFiring = false; + FinishWeld( pMarine, true ); } } } diff --git a/src/game/shared/swarm/asw_weapon_welder_shared.h b/src/game/shared/swarm/asw_weapon_welder_shared.h index c1cba59f4..bf73e0d51 100644 --- a/src/game/shared/swarm/asw_weapon_welder_shared.h +++ b/src/game/shared/swarm/asw_weapon_welder_shared.h @@ -5,6 +5,7 @@ #ifdef CLIENT_DLL #define CASW_Weapon_Welder C_ASW_Weapon_Welder #define CASW_Weapon C_ASW_Weapon + #define CASW_Marine C_ASW_Marine #include "c_asw_weapon.h" #else #include "asw_weapon.h" @@ -29,6 +30,7 @@ class CASW_Weapon_Welder : public CASW_Weapon virtual void PrimaryAttack(); virtual void SecondaryAttack(); virtual void WeldDoor(bool bSeal); + virtual void FinishWeld( CASW_Marine* pMarine, bool bKeepWeldDirection = false ); #ifndef CLIENT_DLL DECLARE_DATADESC(); From 071d0f1e6794fa8a1d6e56838ec161e396971fc9 Mon Sep 17 00:00:00 2001 From: SuperCake Date: Thu, 14 May 2026 02:58:12 +0200 Subject: [PATCH 4/4] fix(welder): open unsealed door right away --- src/game/shared/swarm/asw_weapon_welder_shared.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/game/shared/swarm/asw_weapon_welder_shared.cpp b/src/game/shared/swarm/asw_weapon_welder_shared.cpp index ec55b7905..33a55a004 100644 --- a/src/game/shared/swarm/asw_weapon_welder_shared.cpp +++ b/src/game/shared/swarm/asw_weapon_welder_shared.cpp @@ -243,6 +243,11 @@ void CASW_Weapon_Welder::FinishWeld( CASW_Marine* pMarine, bool bKeepWeldDirecti } #endif // GAME_DLL #ifndef CLIENT_DLL + if ( m_iAutomaticWeldDirection < 0 && m_pWeldDoor && m_pWeldDoor->GetSealAmount() <= 0.0f ) + { + // Open ASAP + m_pWeldDoor->StopCloseForWeld( pMarine ); + } m_pWeldDoor = NULL; #endif // !CLIENT_DLL if ( !bKeepWeldDirection )