diff options
| author | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:31:46 -0800 |
|---|---|---|
| committer | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:46:31 -0800 |
| commit | f56bb35301836e56582a575a75864392a0177875 (patch) | |
| tree | de61ddd39de3e7df52759711950b4c288592f0dc /mp/src/game/server/basemultiplayerplayer.cpp | |
| parent | Mark some more files as text. (diff) | |
| download | source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip | |
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/game/server/basemultiplayerplayer.cpp')
| -rw-r--r-- | mp/src/game/server/basemultiplayerplayer.cpp | 682 |
1 files changed, 341 insertions, 341 deletions
diff --git a/mp/src/game/server/basemultiplayerplayer.cpp b/mp/src/game/server/basemultiplayerplayer.cpp index 5176b7c0..031282ac 100644 --- a/mp/src/game/server/basemultiplayerplayer.cpp +++ b/mp/src/game/server/basemultiplayerplayer.cpp @@ -1,341 +1,341 @@ -//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//=============================================================================
-
-#include "cbase.h"
-#include "mp_shareddefs.h"
-#include "basemultiplayerplayer.h"
-
-// Minimum interval between rate-limited commands that players can run.
-#define COMMAND_MAX_RATE 0.3
-
-CBaseMultiplayerPlayer::CBaseMultiplayerPlayer()
-{
- m_iCurrentConcept = MP_CONCEPT_NONE;
- m_flLastForcedChangeTeamTime = -1;
- m_iBalanceScore = 0;
- m_flConnectionTime = gpGlobals->curtime;
-
- // per life achievement counters
- m_pAchievementKV = new KeyValues( "achievement_counts" );
-
- m_flAreaCaptureScoreAccumulator = 0.0f;
-}
-
-CBaseMultiplayerPlayer::~CBaseMultiplayerPlayer()
-{
- m_pAchievementKV->deleteThis();
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-CAI_Expresser *CBaseMultiplayerPlayer::CreateExpresser( void )
-{
- m_pExpresser = new CMultiplayer_Expresser(this);
- if ( !m_pExpresser)
- return NULL;
-
- m_pExpresser->Connect(this);
- return m_pExpresser;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-void CBaseMultiplayerPlayer::PostConstructor( const char *szClassname )
-{
- BaseClass::PostConstructor( szClassname );
- CreateExpresser();
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-void CBaseMultiplayerPlayer::ModifyOrAppendCriteria( AI_CriteriaSet& criteriaSet )
-{
- BaseClass::ModifyOrAppendCriteria( criteriaSet );
-
- ModifyOrAppendPlayerCriteria( criteriaSet );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-bool CBaseMultiplayerPlayer::SpeakIfAllowed( AIConcept_t concept, const char *modifiers, char *pszOutResponseChosen, size_t bufsize, IRecipientFilter *filter )
-{
- if ( !IsAlive() )
- return false;
-
- //if ( IsAllowedToSpeak( concept, bRespondingToPlayer ) )
- return Speak( concept, modifiers, pszOutResponseChosen, bufsize, filter );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-IResponseSystem *CBaseMultiplayerPlayer::GetResponseSystem()
-{
- return BaseClass::GetResponseSystem();
- // NOTE: This is where you would hook your custom responses.
-// return <*>GameRules()->m_ResponseRules[iIndex].m_ResponseSystems[m_iCurrentConcept];
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Doesn't actually speak the concept. Just finds a response in the system. You then have to play it yourself.
-//-----------------------------------------------------------------------------
-AI_Response *CBaseMultiplayerPlayer::SpeakConcept( int iConcept )
-{
- m_iCurrentConcept = iConcept;
- return SpeakFindResponse( g_pszMPConcepts[iConcept] );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-bool CBaseMultiplayerPlayer::SpeakConceptIfAllowed( int iConcept, const char *modifiers, char *pszOutResponseChosen, size_t bufsize, IRecipientFilter *filter )
-{
- // Save the current concept.
- m_iCurrentConcept = iConcept;
- return SpeakIfAllowed( g_pszMPConcepts[iConcept], modifiers, pszOutResponseChosen, bufsize, filter );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-bool CBaseMultiplayerPlayer::CanHearAndReadChatFrom( CBasePlayer *pPlayer )
-{
- // can always hear the console unless we're ignoring all chat
- if ( !pPlayer )
- return m_iIgnoreGlobalChat != CHAT_IGNORE_ALL;
-
- // check if we're ignoring all chat
- if ( m_iIgnoreGlobalChat == CHAT_IGNORE_ALL )
- return false;
-
- // check if we're ignoring all but teammates
- if ( m_iIgnoreGlobalChat == CHAT_IGNORE_TEAM && g_pGameRules->PlayerRelationship( this, pPlayer ) != GR_TEAMMATE )
- return false;
-
- // can't hear dead players if we're alive
- if ( pPlayer->m_lifeState != LIFE_ALIVE && m_lifeState == LIFE_ALIVE )
- return false;
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-bool CBaseMultiplayerPlayer::ShouldRunRateLimitedCommand( const CCommand &args )
-{
- const char *pcmd = args[0];
-
- int i = m_RateLimitLastCommandTimes.Find( pcmd );
- if ( i == m_RateLimitLastCommandTimes.InvalidIndex() )
- {
- m_RateLimitLastCommandTimes.Insert( pcmd, gpGlobals->curtime );
- return true;
- }
- else if ( (gpGlobals->curtime - m_RateLimitLastCommandTimes[i]) < COMMAND_MAX_RATE )
- {
- // Too fast.
- return false;
- }
- else
- {
- m_RateLimitLastCommandTimes[i] = gpGlobals->curtime;
- return true;
- }
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-bool CBaseMultiplayerPlayer::ClientCommand( const CCommand &args )
-{
- const char *pcmd = args[0];
-
- if ( FStrEq( pcmd, "ignoremsg" ) )
- {
- if ( ShouldRunRateLimitedCommand( args ) )
- {
- m_iIgnoreGlobalChat = (m_iIgnoreGlobalChat + 1) % 3;
- switch( m_iIgnoreGlobalChat )
- {
- case CHAT_IGNORE_NONE:
- ClientPrint( this, HUD_PRINTTALK, "#Accept_All_Messages" );
- break;
- case CHAT_IGNORE_ALL:
- ClientPrint( this, HUD_PRINTTALK, "#Ignore_Broadcast_Messages" );
- break;
- case CHAT_IGNORE_TEAM:
- ClientPrint( this, HUD_PRINTTALK, "#Ignore_Broadcast_Team_Messages" );
- break;
- default:
- break;
- }
- }
- return true;
- }
-
- return BaseClass::ClientCommand( args );
-}
-
-bool CBaseMultiplayerPlayer::ShouldShowVoiceSubtitleToEnemy( void )
-{
- return false;
-}
-
-//-----------------------------------------------------------------------------
-// calculate a score for this player. higher is more likely to be switched
-//-----------------------------------------------------------------------------
-int CBaseMultiplayerPlayer::CalculateTeamBalanceScore( void )
-{
- // base score is 0 - ( seconds on server )
- float flTimeConnected = gpGlobals->curtime - m_flConnectionTime;
- int iScore = 0 - (int)flTimeConnected;
-
- // if we were switched recently, score us way down
- float flLastSwitchedTime = GetLastForcedChangeTeamTime();
- if ( flLastSwitchedTime > 0 && ( gpGlobals->curtime - flLastSwitchedTime ) < 300 )
- {
- iScore -= 10000;
- }
- return iScore;
-}
-
-void CBaseMultiplayerPlayer::Spawn( void )
-{
- ResetPerLifeCounters();
-
- StopScoringEscortPoints();
-
- BaseClass::Spawn();
-}
-
-void CBaseMultiplayerPlayer::AwardAchievement( int iAchievement, int iCount )
-{
- Assert( iAchievement >= 0 && iAchievement < 0xFFFF ); // must fit in short
-
- CSingleUserRecipientFilter filter( this );
-
- UserMessageBegin( filter, "AchievementEvent" );
- WRITE_SHORT( iAchievement );
- WRITE_SHORT( iCount );
- MessageEnd();
-}
-
-#ifdef _DEBUG
-
- #include "utlbuffer.h"
-
- void DumpAchievementCounters( const CCommand &args )
- {
- int iPlayerIndex = 1;
-
- if ( args.ArgC() >= 2 )
- {
- iPlayerIndex = atoi( args[1] );
- }
-
- CBaseMultiplayerPlayer *pPlayer = ToBaseMultiplayerPlayer( UTIL_PlayerByIndex( iPlayerIndex ) );
- if ( pPlayer && pPlayer->GetPerLifeCounterKeys() )
- {
- CUtlBuffer buf( 0, 0, CUtlBuffer::TEXT_BUFFER );
- pPlayer->GetPerLifeCounterKeys()->RecursiveSaveToFile( buf, 0 );
-
- char szBuf[1024];
-
- // probably not the best way to print out a CUtlBuffer
- int pos = 0;
- while ( buf.PeekStringLength() )
- {
- szBuf[pos] = buf.GetChar();
- pos++;
- }
- szBuf[pos] = '\0';
-
- Msg( "%s\n", szBuf );
- }
- }
- ConCommand dump_achievement_counters( "dump_achievement_counters", DumpAchievementCounters, "Spew the per-life achievement counters for multiplayer players", FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY );
-
-#endif // _DEBUG
-
-int CBaseMultiplayerPlayer::GetPerLifeCounterKV( const char *name )
-{
- return m_pAchievementKV->GetInt( name, 0 );
-}
-
-void CBaseMultiplayerPlayer::SetPerLifeCounterKV( const char *name, int value )
-{
- m_pAchievementKV->SetInt( name, value );
-}
-
-void CBaseMultiplayerPlayer::ResetPerLifeCounters( void )
-{
- m_pAchievementKV->Clear();
-}
-
-
-ConVar tf_escort_score_rate( "tf_escort_score_rate", "1", FCVAR_CHEAT, "Score for escorting the train, in points per second" );
-
-#define ESCORT_SCORE_CONTEXT "AreaScoreContext"
-#define ESCORT_SCORE_INTERVAL 0.1
-
-//-----------------------------------------------------------------------------
-// Purpose: think to accumulate and award points for escorting the train
-//-----------------------------------------------------------------------------
-void CBaseMultiplayerPlayer::EscortScoringThink( void )
-{
- m_flAreaCaptureScoreAccumulator += ESCORT_SCORE_INTERVAL;
-
- if ( m_flCapPointScoreRate > 0 )
- {
- float flTimeForOnePoint = 1.0f / m_flCapPointScoreRate;
-
- int iPoints = 0;
-
- while ( m_flAreaCaptureScoreAccumulator >= flTimeForOnePoint )
- {
- m_flAreaCaptureScoreAccumulator -= flTimeForOnePoint;
- iPoints++;
- }
-
- if ( iPoints > 0 )
- {
- IGameEvent *event = gameeventmanager->CreateEvent( "player_escort_score" );
- if ( event )
- {
- event->SetInt( "player", entindex() );
- event->SetInt( "points", iPoints );
- gameeventmanager->FireEvent( event, true /* only to server */ );
- }
- }
- }
-
- SetContextThink( &CBaseMultiplayerPlayer::EscortScoringThink, gpGlobals->curtime + ESCORT_SCORE_INTERVAL, ESCORT_SCORE_CONTEXT );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: We're escorting the train, start giving points
-//-----------------------------------------------------------------------------
-void CBaseMultiplayerPlayer::StartScoringEscortPoints( float flRate )
-{
- Assert( flRate > 0.0f );
- m_flCapPointScoreRate = flRate;
- SetContextThink( &CBaseMultiplayerPlayer::EscortScoringThink, gpGlobals->curtime + ESCORT_SCORE_INTERVAL, ESCORT_SCORE_CONTEXT );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Stopped escorting the train
-//-----------------------------------------------------------------------------
-void CBaseMultiplayerPlayer::StopScoringEscortPoints( void )
-{
- SetContextThink( NULL, 0, ESCORT_SCORE_CONTEXT );
-}
-
+//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#include "cbase.h" +#include "mp_shareddefs.h" +#include "basemultiplayerplayer.h" + +// Minimum interval between rate-limited commands that players can run. +#define COMMAND_MAX_RATE 0.3 + +CBaseMultiplayerPlayer::CBaseMultiplayerPlayer() +{ + m_iCurrentConcept = MP_CONCEPT_NONE; + m_flLastForcedChangeTeamTime = -1; + m_iBalanceScore = 0; + m_flConnectionTime = gpGlobals->curtime; + + // per life achievement counters + m_pAchievementKV = new KeyValues( "achievement_counts" ); + + m_flAreaCaptureScoreAccumulator = 0.0f; +} + +CBaseMultiplayerPlayer::~CBaseMultiplayerPlayer() +{ + m_pAchievementKV->deleteThis(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CAI_Expresser *CBaseMultiplayerPlayer::CreateExpresser( void ) +{ + m_pExpresser = new CMultiplayer_Expresser(this); + if ( !m_pExpresser) + return NULL; + + m_pExpresser->Connect(this); + return m_pExpresser; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CBaseMultiplayerPlayer::PostConstructor( const char *szClassname ) +{ + BaseClass::PostConstructor( szClassname ); + CreateExpresser(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CBaseMultiplayerPlayer::ModifyOrAppendCriteria( AI_CriteriaSet& criteriaSet ) +{ + BaseClass::ModifyOrAppendCriteria( criteriaSet ); + + ModifyOrAppendPlayerCriteria( criteriaSet ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CBaseMultiplayerPlayer::SpeakIfAllowed( AIConcept_t concept, const char *modifiers, char *pszOutResponseChosen, size_t bufsize, IRecipientFilter *filter ) +{ + if ( !IsAlive() ) + return false; + + //if ( IsAllowedToSpeak( concept, bRespondingToPlayer ) ) + return Speak( concept, modifiers, pszOutResponseChosen, bufsize, filter ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +IResponseSystem *CBaseMultiplayerPlayer::GetResponseSystem() +{ + return BaseClass::GetResponseSystem(); + // NOTE: This is where you would hook your custom responses. +// return <*>GameRules()->m_ResponseRules[iIndex].m_ResponseSystems[m_iCurrentConcept]; +} + +//----------------------------------------------------------------------------- +// Purpose: Doesn't actually speak the concept. Just finds a response in the system. You then have to play it yourself. +//----------------------------------------------------------------------------- +AI_Response *CBaseMultiplayerPlayer::SpeakConcept( int iConcept ) +{ + m_iCurrentConcept = iConcept; + return SpeakFindResponse( g_pszMPConcepts[iConcept] ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CBaseMultiplayerPlayer::SpeakConceptIfAllowed( int iConcept, const char *modifiers, char *pszOutResponseChosen, size_t bufsize, IRecipientFilter *filter ) +{ + // Save the current concept. + m_iCurrentConcept = iConcept; + return SpeakIfAllowed( g_pszMPConcepts[iConcept], modifiers, pszOutResponseChosen, bufsize, filter ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CBaseMultiplayerPlayer::CanHearAndReadChatFrom( CBasePlayer *pPlayer ) +{ + // can always hear the console unless we're ignoring all chat + if ( !pPlayer ) + return m_iIgnoreGlobalChat != CHAT_IGNORE_ALL; + + // check if we're ignoring all chat + if ( m_iIgnoreGlobalChat == CHAT_IGNORE_ALL ) + return false; + + // check if we're ignoring all but teammates + if ( m_iIgnoreGlobalChat == CHAT_IGNORE_TEAM && g_pGameRules->PlayerRelationship( this, pPlayer ) != GR_TEAMMATE ) + return false; + + // can't hear dead players if we're alive + if ( pPlayer->m_lifeState != LIFE_ALIVE && m_lifeState == LIFE_ALIVE ) + return false; + + return true; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CBaseMultiplayerPlayer::ShouldRunRateLimitedCommand( const CCommand &args ) +{ + const char *pcmd = args[0]; + + int i = m_RateLimitLastCommandTimes.Find( pcmd ); + if ( i == m_RateLimitLastCommandTimes.InvalidIndex() ) + { + m_RateLimitLastCommandTimes.Insert( pcmd, gpGlobals->curtime ); + return true; + } + else if ( (gpGlobals->curtime - m_RateLimitLastCommandTimes[i]) < COMMAND_MAX_RATE ) + { + // Too fast. + return false; + } + else + { + m_RateLimitLastCommandTimes[i] = gpGlobals->curtime; + return true; + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CBaseMultiplayerPlayer::ClientCommand( const CCommand &args ) +{ + const char *pcmd = args[0]; + + if ( FStrEq( pcmd, "ignoremsg" ) ) + { + if ( ShouldRunRateLimitedCommand( args ) ) + { + m_iIgnoreGlobalChat = (m_iIgnoreGlobalChat + 1) % 3; + switch( m_iIgnoreGlobalChat ) + { + case CHAT_IGNORE_NONE: + ClientPrint( this, HUD_PRINTTALK, "#Accept_All_Messages" ); + break; + case CHAT_IGNORE_ALL: + ClientPrint( this, HUD_PRINTTALK, "#Ignore_Broadcast_Messages" ); + break; + case CHAT_IGNORE_TEAM: + ClientPrint( this, HUD_PRINTTALK, "#Ignore_Broadcast_Team_Messages" ); + break; + default: + break; + } + } + return true; + } + + return BaseClass::ClientCommand( args ); +} + +bool CBaseMultiplayerPlayer::ShouldShowVoiceSubtitleToEnemy( void ) +{ + return false; +} + +//----------------------------------------------------------------------------- +// calculate a score for this player. higher is more likely to be switched +//----------------------------------------------------------------------------- +int CBaseMultiplayerPlayer::CalculateTeamBalanceScore( void ) +{ + // base score is 0 - ( seconds on server ) + float flTimeConnected = gpGlobals->curtime - m_flConnectionTime; + int iScore = 0 - (int)flTimeConnected; + + // if we were switched recently, score us way down + float flLastSwitchedTime = GetLastForcedChangeTeamTime(); + if ( flLastSwitchedTime > 0 && ( gpGlobals->curtime - flLastSwitchedTime ) < 300 ) + { + iScore -= 10000; + } + return iScore; +} + +void CBaseMultiplayerPlayer::Spawn( void ) +{ + ResetPerLifeCounters(); + + StopScoringEscortPoints(); + + BaseClass::Spawn(); +} + +void CBaseMultiplayerPlayer::AwardAchievement( int iAchievement, int iCount ) +{ + Assert( iAchievement >= 0 && iAchievement < 0xFFFF ); // must fit in short + + CSingleUserRecipientFilter filter( this ); + + UserMessageBegin( filter, "AchievementEvent" ); + WRITE_SHORT( iAchievement ); + WRITE_SHORT( iCount ); + MessageEnd(); +} + +#ifdef _DEBUG + + #include "utlbuffer.h" + + void DumpAchievementCounters( const CCommand &args ) + { + int iPlayerIndex = 1; + + if ( args.ArgC() >= 2 ) + { + iPlayerIndex = atoi( args[1] ); + } + + CBaseMultiplayerPlayer *pPlayer = ToBaseMultiplayerPlayer( UTIL_PlayerByIndex( iPlayerIndex ) ); + if ( pPlayer && pPlayer->GetPerLifeCounterKeys() ) + { + CUtlBuffer buf( 0, 0, CUtlBuffer::TEXT_BUFFER ); + pPlayer->GetPerLifeCounterKeys()->RecursiveSaveToFile( buf, 0 ); + + char szBuf[1024]; + + // probably not the best way to print out a CUtlBuffer + int pos = 0; + while ( buf.PeekStringLength() ) + { + szBuf[pos] = buf.GetChar(); + pos++; + } + szBuf[pos] = '\0'; + + Msg( "%s\n", szBuf ); + } + } + ConCommand dump_achievement_counters( "dump_achievement_counters", DumpAchievementCounters, "Spew the per-life achievement counters for multiplayer players", FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY ); + +#endif // _DEBUG + +int CBaseMultiplayerPlayer::GetPerLifeCounterKV( const char *name ) +{ + return m_pAchievementKV->GetInt( name, 0 ); +} + +void CBaseMultiplayerPlayer::SetPerLifeCounterKV( const char *name, int value ) +{ + m_pAchievementKV->SetInt( name, value ); +} + +void CBaseMultiplayerPlayer::ResetPerLifeCounters( void ) +{ + m_pAchievementKV->Clear(); +} + + +ConVar tf_escort_score_rate( "tf_escort_score_rate", "1", FCVAR_CHEAT, "Score for escorting the train, in points per second" ); + +#define ESCORT_SCORE_CONTEXT "AreaScoreContext" +#define ESCORT_SCORE_INTERVAL 0.1 + +//----------------------------------------------------------------------------- +// Purpose: think to accumulate and award points for escorting the train +//----------------------------------------------------------------------------- +void CBaseMultiplayerPlayer::EscortScoringThink( void ) +{ + m_flAreaCaptureScoreAccumulator += ESCORT_SCORE_INTERVAL; + + if ( m_flCapPointScoreRate > 0 ) + { + float flTimeForOnePoint = 1.0f / m_flCapPointScoreRate; + + int iPoints = 0; + + while ( m_flAreaCaptureScoreAccumulator >= flTimeForOnePoint ) + { + m_flAreaCaptureScoreAccumulator -= flTimeForOnePoint; + iPoints++; + } + + if ( iPoints > 0 ) + { + IGameEvent *event = gameeventmanager->CreateEvent( "player_escort_score" ); + if ( event ) + { + event->SetInt( "player", entindex() ); + event->SetInt( "points", iPoints ); + gameeventmanager->FireEvent( event, true /* only to server */ ); + } + } + } + + SetContextThink( &CBaseMultiplayerPlayer::EscortScoringThink, gpGlobals->curtime + ESCORT_SCORE_INTERVAL, ESCORT_SCORE_CONTEXT ); +} + +//----------------------------------------------------------------------------- +// Purpose: We're escorting the train, start giving points +//----------------------------------------------------------------------------- +void CBaseMultiplayerPlayer::StartScoringEscortPoints( float flRate ) +{ + Assert( flRate > 0.0f ); + m_flCapPointScoreRate = flRate; + SetContextThink( &CBaseMultiplayerPlayer::EscortScoringThink, gpGlobals->curtime + ESCORT_SCORE_INTERVAL, ESCORT_SCORE_CONTEXT ); +} + +//----------------------------------------------------------------------------- +// Purpose: Stopped escorting the train +//----------------------------------------------------------------------------- +void CBaseMultiplayerPlayer::StopScoringEscortPoints( void ) +{ + SetContextThink( NULL, 0, ESCORT_SCORE_CONTEXT ); +} + |