diff options
Diffstat (limited to 'game/server/tf2/sensor_tf_team.cpp')
| -rw-r--r-- | game/server/tf2/sensor_tf_team.cpp | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/game/server/tf2/sensor_tf_team.cpp b/game/server/tf2/sensor_tf_team.cpp new file mode 100644 index 0000000..083d2d4 --- /dev/null +++ b/game/server/tf2/sensor_tf_team.cpp @@ -0,0 +1,139 @@ +//========= 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 ); +} + |