diff options
Diffstat (limited to 'game/server/dod/dod_control_point_master.h')
| -rw-r--r-- | game/server/dod/dod_control_point_master.h | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/game/server/dod/dod_control_point_master.h b/game/server/dod/dod_control_point_master.h new file mode 100644 index 0000000..acb531e --- /dev/null +++ b/game/server/dod/dod_control_point_master.h @@ -0,0 +1,222 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef DOD_CONTROL_POINT_MASTER_H +#define DOD_CONTROL_POINT_MASTER_H +#ifdef _WIN32 +#pragma once +#endif + +#include "utlmap.h" +#include "dod_shareddefs.h" +#include "dod_team.h" +#include "dod_gamerules.h" +#include "dod_control_point.h" +#include "dod_area_capture.h" +#include "dod_objective_resource.h" +#include "GameEventListener.h" + +// ==================== +// Control Point Master +// ==================== +// One ControlPointMaster is spawned per level. Shortly after spawning it detects all the Control +// points in the map and puts them into the m_ControlPoints. From there it detects the state +// where all points are captured and resets them if necessary It gives points every time interval to +// the owners of the points +// ==================== + +#define TIMER_CONTEXT "TIMER_CONTEXT" +#define FLAGS_CONTEXT "FLAGS_CONTEXT" + +class CControlPointMaster : public CBaseEntity +{ +public: + DECLARE_CLASS( CControlPointMaster, CBaseEntity ); + + CControlPointMaster(); + + virtual void Spawn( void ); + virtual bool KeyValue( const char *szKeyName, const char *szValue ); + + int GetNumPoints( void ); + int GetPointOwner( int point ); + void Reset( void ); + + void RoundRespawn( void ); + + int CountAdvantageFlags( int team ); + + bool IsActive( void ) { return ( m_bDisabled == false ); } + + bool IsUsingRoundTimer( void ) { return m_bUseTimer; } + void GetTimerData( int &iTimerSeconds, int &iTimerWinTeam ); + + void FireTeamWinOutput( int iWinningTeam ); + + void CheckWinConditions( void ); + + bool WouldNewCPOwnerWinGame( CControlPoint *pPoint, int iNewOwner ); + + CControlPoint *GetCPByIndex( int index ); + +private: + void BecomeActive( void ); + void BecomeInactive( void ); + + void EXPORT CPMThink( void ); + + int TeamOwnsAllPoints( CControlPoint *pOverridePoint = NULL, int iOverrideNewTeam = TEAM_UNASSIGNED ); + + void TeamWins( int team ); + + bool FindControlPoints( void ); //look in the map to find active control points + + void InputAddTimerSeconds( inputdata_t &inputdata ); + + CUtlMap<int, CControlPoint *> m_ControlPoints; + + bool m_bFoundPoints; //true when the control points have been found and the array is initialized + + float m_fGivePointsTime; //the time at which we give points for holding control points + + DECLARE_DATADESC(); + + bool m_bDisabled; //is this CPM active or not + void InputEnable( inputdata_t &inputdata ) { BecomeInactive(); } + void InputDisable( inputdata_t &inputdata ) { BecomeActive(); } + + void InputRoundInit( inputdata_t &inputdata ); + void InputRoundStart( inputdata_t &inputdata ); + + bool m_bUseTimer; + int m_iTimerTeam; + int m_iTimerLength; + + COutputEvent m_AlliesWinOutput; + COutputEvent m_AxisWinOutput; +}; + +class CDODCustomScoring : public CBaseEntity, public CGameEventListener +{ +public: + DECLARE_CLASS( CDODCustomScoring, CBaseEntity ); + + DECLARE_DATADESC(); + + CDODCustomScoring() + { + ListenForGameEvent( "dod_round_win" ); + ListenForGameEvent( "dod_round_active" ); + } + + virtual void Spawn( void ) + { + Assert( m_iPointTeam == TEAM_ALLIES || m_iPointTeam == TEAM_AXIS ); + } + + virtual void FireGameEvent( IGameEvent *event ) + { + const char *eventName = event->GetName(); + + if ( !Q_strcmp( eventName, "dod_round_win" ) ) + { + int team = event->GetInt( "team" ); + if ( team == m_iPointTeam ) + { + GiveRemainingPoints(); + } + + // stop giving points, round is over + SetThink( NULL ); // think no more! + } + else if ( !Q_strcmp( eventName, "dod_round_active" ) ) + { + StartGivingPoints(); + } + } + + // Needs to be activated by gamerules + void StartGivingPoints( void ) + { + if ( m_iNumPointGives <= 0 ) + return; + + if ( m_iPointsToGive <= 0 ) + return; + + m_iRemainingPoints = m_iNumPointGives * m_iPointsToGive; + + SetThink( &CDODCustomScoring::PointsThink ); + SetNextThink( gpGlobals->curtime + m_iTickLength ); + } + + // Give this team all the points that they would have gotten had we continued + void GiveRemainingPoints( void ) + { + GivePoints( m_iRemainingPoints ); + } + + // input to give tick points to our team + void InputGivePoints( inputdata_t &inputdata ) + { + int iPoints = inputdata.value.Int(); + GetGlobalTeam(m_iPointTeam)->AddScore( MAX( iPoints, 0 ) ); + } + + // accessor for our point team + int GetPointTeam( void ) + { + return m_iPointTeam; + } + +private: + + void GivePoints( int points ) + { + GetGlobalTeam(m_iPointTeam)->AddScore( MAX( points, 0 ) ); + m_iRemainingPoints -= points; + + if ( points > 0 ) + { + if ( points == 1 ) + { + UTIL_ClientPrintAll( HUD_PRINTTALK, "#game_score_allie_point" ); + } + else + { + char buf[8]; + Q_snprintf( buf, sizeof(buf), "%d", points ); + UTIL_ClientPrintAll( HUD_PRINTTALK, "#game_score_allie_points", buf ); + } + + IGameEvent *event = gameeventmanager->CreateEvent( "dod_tick_points" ); + + if ( event ) + { + event->SetInt( "team", m_iPointTeam ); + event->SetInt( "score", points ); + event->SetInt( "totalscore", GetGlobalTeam(m_iPointTeam)->GetScore() ); + + gameeventmanager->FireEvent( event ); + } + } + } + + void PointsThink( void ) + { + GivePoints( m_iPointsToGive ); + + SetNextThink( gpGlobals->curtime + m_iTickLength ); + } + + int m_iPointTeam; // team to give points to + int m_iPointsToGive; // points to give per tick + int m_iRemainingPoints; // total number of points we have left to give + int m_iTickLength; // time between point gives + int m_iNumPointGives; // number of times we're planning on giving out points +}; + +#endif //DOD_CONTROL_POINT_MASTER_H |