void CASW_Weapon_Welder::WeldDoor(bool bSeal) { CASW_Marine *pMarine = GetMarine(); if ( !pMarine || !pMarine->GetCommander() ) return; bool bWelding = false; CASW_Door* pDoor = FindDoor(); if ( pDoor ) { bWelding = true; Vector vecFacingPoint = pDoor->GetWeldFacingPoint(pMarine); Vector diff = vecFacingPoint - pMarine->GetAbsOrigin(); diff.z = 0; VectorNormalize(diff); QAngle angCurrentFacing = pMarine->ASWEyeAngles(); Vector vecCurrentFacing = vec3_origin; AngleVectors(angCurrentFacing, &vecCurrentFacing); vecCurrentFacing.z = 0; VectorNormalize(vecCurrentFacing); bool bFacing = DotProduct(diff, vecCurrentFacing) > 0.6f; if ( !pMarine->IsInhabited() ) { bFacing = true; // AI marines don't know how to face the door yet } if ( bFacing && !pDoor->IsOpen() ) { // do our muzzle flash, if we're going to alter the weld some if ( bSeal && pDoor->GetSealAmount() < 1.0f ) { pMarine->DoMuzzleFlash(); m_bIsFiring = true; } else if ( !bSeal && pDoor->GetSealAmount() > 0 ) { pMarine->DoMuzzleFlash(); m_bIsFiring = true; } } #ifdef CLIENT_DLL pMarine->SetFacingPoint(vecFacingPoint, GetFireRate()*2.0f); #else if ( gpGlobals->maxClients <= 1 ) { pMarine->SetFacingPoint(vecFacingPoint, GetFireRate()*2.0f); } #endif if ( bFacing ) { if ( pDoor->IsOpen() ) { #ifndef CLIENT_DLL if ( bSeal ) { pDoor->CloseForWeld( pMarine ); // shut the door first, so we can start welding it } #endif } else { // tell the weapon to weld over the next fire rate interval m_fWeldTime = GetFireRate() + 0.004f; m_bWeldSeal = bSeal; #ifndef CLIENT_DLL m_pWeldDoor = pDoor; //Msg( "Setting weld door to %d\n", pDoor->entindex() ); // network door which door we're working on so all players can see progress if ( pMarine->GetMarineResource() ) pMarine->GetMarineResource()->m_hWeldingDoor = pDoor; #endif } } } else { //Msg( "Couldn't find door to weld\n" ); } if ( pMarine->GetActiveWeapon() != this ) { bool bAttack1, bAttack2, bReload, bOldReload, bOldAttack1; GetButtons( bAttack1, bAttack2, bReload, bOldReload, bOldAttack1 ); if ( bAttack1 || bAttack2 || bReload || pMarine->GetCurrentMeleeAttack() ) { bWelding = false; } } 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; } else { if ( bSeal ) { m_flNextPrimaryAttack = m_flNextPrimaryAttack + GetFireRate(); } else { m_flNextSecondaryAttack = m_flNextSecondaryAttack + GetFireRate(); } } }