120 lines
3.0 KiB
C++
120 lines
3.0 KiB
C++
#include "cbase.h"
|
|
#include "asw_door_area.h"
|
|
#include "asw_door.h"
|
|
#include "asw_marine.h"
|
|
#include "asw_game_resource.h"
|
|
#include "asw_marine_resource.h"
|
|
#include "asw_weapon_welder_shared.h"
|
|
#include "asw_marine_speech.h"
|
|
#include "asw_fail_advice.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
LINK_ENTITY_TO_CLASS( trigger_asw_door_area, CASW_Door_Area );
|
|
|
|
|
|
BEGIN_DATADESC( CASW_Door_Area )
|
|
|
|
END_DATADESC()
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Door_Area, DT_ASW_Door_Area)
|
|
|
|
END_SEND_TABLE()
|
|
|
|
CASW_Door_Area::CASW_Door_Area()
|
|
{
|
|
AddEFlags( EFL_FORCE_CHECK_TRANSMIT );
|
|
m_fNextCutCheck = 0;
|
|
}
|
|
|
|
bool CASW_Door_Area::HasWelder(CASW_Marine *pMarine)
|
|
{
|
|
CASW_Weapon_Welder *pWelder = dynamic_cast<CASW_Weapon_Welder*>(pMarine->GetASWWeapon(2));
|
|
if (pWelder)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
void CASW_Door_Area::ActivateMultiTrigger(CBaseEntity *pActivator)
|
|
{
|
|
if (GetNextThink() > gpGlobals->curtime)
|
|
return; // still waiting for reset time
|
|
|
|
BaseClass::ActivateMultiTrigger(pActivator);
|
|
|
|
CASW_Door* pDoor = GetASWDoor();
|
|
if (!pDoor)
|
|
return;
|
|
|
|
// check for shouting out about a sealed door
|
|
if (pDoor->m_bDoCutShout)
|
|
{
|
|
if (gpGlobals->curtime > m_fNextCutCheck)
|
|
{
|
|
CASW_Marine *pMarine = CASW_Marine::AsMarine( pActivator );
|
|
if ( pMarine )
|
|
{
|
|
// check if there's another marine nearby with a welder
|
|
CASW_Game_Resource *pGameResource = ASWGameResource();
|
|
if (pGameResource)
|
|
{
|
|
bool bFound = false;
|
|
for (int i=0;i<pGameResource->GetMaxMarineResources();i++)
|
|
{
|
|
CASW_Marine_Resource *pMR = pGameResource->GetMarineResource(i);
|
|
CASW_Marine *pOtherMarine = pMR ? pMR->GetMarineEntity() : NULL;
|
|
if (pOtherMarine && pActivator != pOtherMarine
|
|
&& (pMarine->GetAbsOrigin().DistTo(pOtherMarine->GetAbsOrigin()) < 800)
|
|
&& HasWelder(pOtherMarine) )
|
|
bFound = true;
|
|
}
|
|
if (bFound)
|
|
{
|
|
if (pMarine->GetMarineSpeech()->Chatter(CHATTER_REQUEST_CUT_DOOR))
|
|
{
|
|
pDoor->m_bDoCutShout = false;
|
|
if (pDoor->m_bDoAutoShootChatter)
|
|
pDoor->m_bDoAutoShootChatter = false; // don't need to automatic shout about shooting a door if we've already shouted about cutting it
|
|
}
|
|
m_fNextCutCheck = gpGlobals->curtime + 2.0f; // check again sooner if we tried to say the line but couldn't for some reason
|
|
}
|
|
else
|
|
{
|
|
m_fNextCutCheck = gpGlobals->curtime + 10.0f;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (pDoor->m_bDoAutoShootChatter)
|
|
{
|
|
CASW_Marine *pMarine = CASW_Marine::AsMarine( pActivator );
|
|
if (pMarine)
|
|
{
|
|
pDoor->DoAutoDoorShootChatter(pMarine);
|
|
}
|
|
}
|
|
|
|
if ( !RequirementsMet( pActivator ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( pDoor->IsAutoOpen() )
|
|
{
|
|
pDoor->AutoOpen(pActivator);
|
|
|
|
if ( pDoor->CanWeld() )
|
|
{
|
|
ASWFailAdvice()->OnAlienOpenDoor();
|
|
}
|
|
}
|
|
}
|
|
|
|
CASW_Door* CASW_Door_Area::GetASWDoor()
|
|
{
|
|
return dynamic_cast<CASW_Door*>(m_hUseTarget.Get());
|
|
}
|