mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 22:27:05 +00:00
140 lines
4.0 KiB
C++
140 lines
4.0 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: Definitions of all the entities that control logic flow within a map
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
#include "cbase.h"
|
|
#include "EntityInput.h"
|
|
#include "EntityOutput.h"
|
|
#include "tf_team.h"
|
|
#include "tf_obj.h"
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Detects a bunch of tf team state
|
|
//-----------------------------------------------------------------------------
|
|
class CSensorTFTeam : public CLogicalEntity
|
|
{
|
|
DECLARE_CLASS( CSensorTFTeam, CLogicalEntity );
|
|
|
|
public:
|
|
void Spawn( void );
|
|
void Think( void );
|
|
|
|
private:
|
|
DECLARE_DATADESC();
|
|
|
|
// Computes the number of respawns stations on the sensed team
|
|
int ComputeRespawnCount();
|
|
|
|
// outputs
|
|
COutputInt m_OnRespawnCountChanged;
|
|
COutputInt m_OnResourceCountChanged;
|
|
COutputInt m_OnMemberCountChanged;
|
|
COutputInt m_OnRespawnCountChangedDelta;
|
|
COutputInt m_OnResourceCountChangedDelta;
|
|
COutputInt m_OnMemberCountChangedDelta;
|
|
|
|
// What team am I sensing?
|
|
int m_nTeam;
|
|
CTFTeam *m_pTeam;
|
|
|
|
// So we can know when state changes...
|
|
int m_nRespawnCount;
|
|
int m_nResourceCount;
|
|
int m_nMemberCount;
|
|
};
|
|
|
|
|
|
LINK_ENTITY_TO_CLASS( sensor_tf_team, CSensorTFTeam );
|
|
|
|
|
|
BEGIN_DATADESC( CSensorTFTeam )
|
|
|
|
DEFINE_OUTPUT( m_OnRespawnCountChanged, "OnRespawnCountChanged" ),
|
|
DEFINE_OUTPUT( m_OnResourceCountChanged, "OnResourceCountChanged" ),
|
|
DEFINE_OUTPUT( m_OnMemberCountChanged, "OnMemberCountChanged" ),
|
|
DEFINE_OUTPUT( m_OnRespawnCountChangedDelta, "OnRespawnCountChangedDelta" ),
|
|
DEFINE_OUTPUT( m_OnResourceCountChangedDelta, "OnResourceCountChangedDelta" ),
|
|
DEFINE_OUTPUT( m_OnMemberCountChangedDelta, "OnMemberCountChangedDelta" ),
|
|
DEFINE_KEYFIELD( m_nTeam, FIELD_INTEGER, "team"),
|
|
|
|
END_DATADESC()
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Spawn!
|
|
//-----------------------------------------------------------------------------
|
|
void CSensorTFTeam::Spawn( void )
|
|
{
|
|
// Hook us up to a team...
|
|
m_pTeam = GetGlobalTFTeam( m_nTeam );
|
|
|
|
// Gets us thinkin!
|
|
SetNextThink( gpGlobals->curtime + 0.1f );
|
|
|
|
// Force an output message on our first think
|
|
m_nRespawnCount = -1;
|
|
m_nResourceCount = -1;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Compute the number of respawn stations on this team
|
|
//-----------------------------------------------------------------------------
|
|
int CSensorTFTeam::ComputeRespawnCount()
|
|
{
|
|
int nCount = 0;
|
|
for (int i = m_pTeam->GetNumObjects(); --i >= 0; )
|
|
{
|
|
CBaseObject *pObject = m_pTeam->GetObject(i);
|
|
if ( pObject && (pObject->GetType() == OBJ_RESPAWN_STATION) )
|
|
{
|
|
++nCount;
|
|
}
|
|
}
|
|
return nCount;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Forces a recompare
|
|
//-----------------------------------------------------------------------------
|
|
void CSensorTFTeam::Think( )
|
|
{
|
|
if (!m_pTeam)
|
|
return;
|
|
|
|
// Check for a difference in the number of respawn stations
|
|
int nRespawnCount = ComputeRespawnCount();
|
|
if ( nRespawnCount != m_nRespawnCount )
|
|
{
|
|
m_OnRespawnCountChangedDelta.Set( nRespawnCount - m_nRespawnCount, this, this );
|
|
m_nRespawnCount = nRespawnCount;
|
|
m_OnRespawnCountChanged.Set( m_nRespawnCount, this, this );
|
|
}
|
|
|
|
// Check for a difference in the number of resources harvested
|
|
if ( m_nResourceCount != m_pTeam->m_flTotalResourcesSoFar )
|
|
{
|
|
m_OnResourceCountChangedDelta.Set( m_pTeam->m_flTotalResourcesSoFar - m_nResourceCount, this, this );
|
|
m_nResourceCount = m_pTeam->m_flTotalResourcesSoFar;
|
|
m_OnResourceCountChanged.Set( m_nResourceCount, this, this );
|
|
}
|
|
|
|
// Check for a difference in the number of team members
|
|
if ( m_nMemberCount != m_pTeam->GetNumPlayers() )
|
|
{
|
|
m_OnMemberCountChangedDelta.Set( m_pTeam->GetNumPlayers() - m_nMemberCount, this, this );
|
|
m_nMemberCount = m_pTeam->GetNumPlayers();
|
|
m_OnMemberCountChanged.Set( m_nMemberCount, this, this );
|
|
}
|
|
|
|
SetNextThink( gpGlobals->curtime + 0.1f );
|
|
}
|
|
|