mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 01:39:36 +00:00
1
This commit is contained in:
@@ -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 );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user