summaryrefslogtreecommitdiff
path: root/game/server/tf2/sensor_tf_team.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf2/sensor_tf_team.cpp')
-rw-r--r--game/server/tf2/sensor_tf_team.cpp139
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 );
+}
+