You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
5.8 KiB
217 lines
5.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Entity that propagates train data for escort game type |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "c_team_train_watcher.h" |
|
#include "igameevents.h" |
|
#include "c_team_objectiveresource.h" |
|
|
|
#ifdef TF_CLIENT_DLL |
|
#include "tf_shareddefs.h" |
|
#include "teamplayroundbased_gamerules.h" |
|
#endif |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
IMPLEMENT_CLIENTCLASS_DT(C_TeamTrainWatcher, DT_TeamTrainWatcher, CTeamTrainWatcher) |
|
|
|
RecvPropFloat( RECVINFO( m_flTotalProgress ) ), |
|
RecvPropInt( RECVINFO( m_iTrainSpeedLevel ) ), |
|
RecvPropFloat( RECVINFO( m_flRecedeTime ) ), |
|
RecvPropInt( RECVINFO( m_nNumCappers ) ), |
|
#ifdef GLOWS_ENABLE |
|
RecvPropEHandle( RECVINFO( m_hGlowEnt ) ), |
|
#endif // GLOWS_ENABLE |
|
|
|
END_RECV_TABLE() |
|
|
|
CUtlVector< CHandle<C_TeamTrainWatcher> > g_hTrainWatchers; |
|
|
|
C_TeamTrainWatcher::C_TeamTrainWatcher() |
|
{ |
|
// force updates when we get our baseline |
|
m_iTrainSpeedLevel = -2; |
|
m_flTotalProgress = -1; |
|
m_flRecedeTime = -1; |
|
|
|
#ifdef GLOWS_ENABLE |
|
m_pGlowEffect = NULL; |
|
m_hGlowEnt = NULL; |
|
m_hOldGlowEnt = NULL; |
|
#endif // GLOWS_ENABLE |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
C_TeamTrainWatcher::~C_TeamTrainWatcher() |
|
{ |
|
#ifdef GLOWS_ENABLE |
|
DestroyGlowEffect(); |
|
#endif // GLOWS_ENABLE |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void C_TeamTrainWatcher::ClientThink() |
|
{ |
|
#ifdef GLOWS_ENABLE |
|
if ( IsDormant() || ( m_hGlowEnt.Get() == NULL ) ) |
|
{ |
|
DestroyGlowEffect(); |
|
m_hOldGlowEnt = NULL; |
|
m_hGlowEnt = NULL; |
|
} |
|
#endif // GLOWS_ENABLE |
|
} |
|
|
|
#ifdef GLOWS_ENABLE |
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void C_TeamTrainWatcher::UpdateGlowEffect( void ) |
|
{ |
|
// destroy the existing effect |
|
if ( m_pGlowEffect ) |
|
{ |
|
DestroyGlowEffect(); |
|
} |
|
|
|
// create a new effect if we have a cart |
|
if ( m_hGlowEnt ) |
|
{ |
|
float r, g, b; |
|
TeamplayRoundBasedRules()->GetTeamGlowColor( GetTeamNumber(), r, g, b ); |
|
m_pGlowEffect = new CGlowObject( m_hGlowEnt, Vector( r, g, b ), 1.0, true ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void C_TeamTrainWatcher::DestroyGlowEffect( void ) |
|
{ |
|
if ( m_pGlowEffect ) |
|
{ |
|
delete m_pGlowEffect; |
|
m_pGlowEffect = NULL; |
|
} |
|
} |
|
#endif // GLOWS_ENABLE |
|
|
|
void C_TeamTrainWatcher::OnPreDataChanged( DataUpdateType_t updateType ) |
|
{ |
|
BaseClass::OnPreDataChanged( updateType ); |
|
|
|
m_iOldTrainSpeedLevel = m_iTrainSpeedLevel; |
|
m_flOldProgress = m_flTotalProgress; |
|
m_flOldRecedeTime = m_flRecedeTime; |
|
m_nOldNumCappers = m_nNumCappers; |
|
#ifdef GLOWS_ENABLE |
|
m_hOldGlowEnt = m_hGlowEnt; |
|
#endif // GLOWS_ENABLE |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void C_TeamTrainWatcher::OnDataChanged( DataUpdateType_t updateType ) |
|
{ |
|
BaseClass::OnDataChanged( updateType ); |
|
|
|
if ( updateType == DATA_UPDATE_CREATED ) |
|
{ |
|
SetNextClientThink( CLIENT_THINK_ALWAYS ); |
|
} |
|
|
|
if ( m_iOldTrainSpeedLevel != m_iTrainSpeedLevel || m_nOldNumCappers != m_nNumCappers ) |
|
{ |
|
IGameEvent *event = gameeventmanager->CreateEvent( "escort_speed" ); |
|
if ( event ) |
|
{ |
|
event->SetInt( "team", GetTeamNumber() ); |
|
event->SetInt( "speed", m_iTrainSpeedLevel ); |
|
event->SetInt( "players", m_nNumCappers ); |
|
gameeventmanager->FireEventClientSide( event ); |
|
} |
|
} |
|
|
|
if ( m_flOldProgress != m_flTotalProgress ) |
|
{ |
|
IGameEvent *event = gameeventmanager->CreateEvent( "escort_progress" ); |
|
if ( event ) |
|
{ |
|
event->SetInt( "team", GetTeamNumber() ); |
|
event->SetFloat( "progress", m_flTotalProgress ); |
|
|
|
if ( m_flOldProgress <= -1 ) |
|
{ |
|
event->SetBool( "reset", true ); |
|
} |
|
|
|
gameeventmanager->FireEventClientSide( event ); |
|
} |
|
|
|
// check to see if the train is now on a hill |
|
if ( ObjectiveResource() ) |
|
{ |
|
int nNumHills = ObjectiveResource()->GetNumNodeHillData( GetTeamNumber() ); |
|
if ( nNumHills > 0 ) |
|
{ |
|
float flStart = 0, flEnd = 0; |
|
for ( int i = 0 ; i < nNumHills ; i++ ) |
|
{ |
|
ObjectiveResource()->GetHillData( GetTeamNumber(), i, flStart, flEnd ); |
|
|
|
bool state = ( m_flTotalProgress >= flStart && m_flTotalProgress <= flEnd ); |
|
ObjectiveResource()->SetTrainOnHill( GetTeamNumber(), i, state ); |
|
} |
|
} |
|
} |
|
} |
|
|
|
if ( m_flOldRecedeTime != m_flRecedeTime ) |
|
{ |
|
IGameEvent *event = gameeventmanager->CreateEvent( "escort_recede" ); |
|
if ( event ) |
|
{ |
|
event->SetInt( "team", GetTeamNumber() ); |
|
event->SetFloat( "recedetime", m_flRecedeTime ); |
|
gameeventmanager->FireEventClientSide( event ); |
|
} |
|
} |
|
#ifdef GLOWS_ENABLE |
|
if ( m_hOldGlowEnt != m_hGlowEnt ) |
|
{ |
|
UpdateGlowEffect(); |
|
} |
|
#endif // GLOWS_ENABLE |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void C_TeamTrainWatcher::Spawn( void ) |
|
{ |
|
BaseClass::Spawn(); |
|
|
|
if ( g_hTrainWatchers.Find( this ) == g_hTrainWatchers.InvalidIndex() ) |
|
{ |
|
g_hTrainWatchers.AddToTail( this ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void C_TeamTrainWatcher::UpdateOnRemove( void ) |
|
{ |
|
BaseClass::UpdateOnRemove(); |
|
|
|
g_hTrainWatchers.FindAndRemove( this ); |
|
}
|
|
|