summaryrefslogtreecommitdiff
path: root/game/server/dod/dod_control_point_master.h
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/dod/dod_control_point_master.h')
-rw-r--r--game/server/dod/dod_control_point_master.h222
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