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 c7b43d251..33a55a004 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); @@ -163,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 { @@ -203,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 { @@ -230,29 +229,46 @@ 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 + 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 ) + { + 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(); @@ -317,32 +333,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();