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.
222 lines
5.5 KiB
222 lines
5.5 KiB
//========= 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
|
|
|