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.
240 lines
8.7 KiB
240 lines
8.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#ifndef TEAM_OBJECTIVERESOURCE_H |
|
#define TEAM_OBJECTIVERESOURCE_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "shareddefs.h" |
|
|
|
#define TEAM_ARRAY( index, team ) (index + (team * MAX_CONTROL_POINTS)) |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: An entity that networks the state of the game's objectives. |
|
// May contain data for objectives that aren't used by your mod, but |
|
// the extra data will never be networked as long as it's zeroed out. |
|
//----------------------------------------------------------------------------- |
|
class CBaseTeamObjectiveResource : public CBaseEntity |
|
{ |
|
DECLARE_CLASS( CBaseTeamObjectiveResource, CBaseEntity ); |
|
public: |
|
DECLARE_SERVERCLASS(); |
|
DECLARE_DATADESC(); |
|
|
|
CBaseTeamObjectiveResource(); |
|
~CBaseTeamObjectiveResource(); |
|
|
|
virtual void Spawn( void ); |
|
virtual int UpdateTransmitState(void); |
|
|
|
virtual void ObjectiveThink( void ); |
|
|
|
//-------------------------------------------------------------------- |
|
// CONTROL POINT DATA |
|
//-------------------------------------------------------------------- |
|
public: |
|
void ResetControlPoints( void ); |
|
|
|
// Data functions, called to set up the state at the beginning of a round |
|
void SetNumControlPoints( int num ); |
|
int GetNumControlPoints( void ) { return m_iNumControlPoints; } |
|
void SetCPIcons( int index, int iTeam, int iIcon ); |
|
void SetCPOverlays( int index, int iTeam, int iIcon ); |
|
void SetTeamBaseIcons( int iTeam, int iBaseIcon ); |
|
void SetCPPosition( int index, const Vector& vPosition ); |
|
void SetCPVisible( int index, bool bVisible ); |
|
void SetCPRequiredCappers( int index, int iTeam, int iReqPlayers ); |
|
void SetCPCapTime( int index, int iTeam, float flTime ); |
|
void SetCPCapPercentage( int index, float flTime ); |
|
float GetCPCapPercentage( int index ); |
|
void SetTeamCanCap( int index, int iTeam, bool bCanCap ); |
|
void SetBaseCP( int index, int iTeam ); |
|
void SetPreviousPoint( int index, int iTeam, int iPrevIndex, int iPrevPoint ); |
|
int GetPreviousPointForPoint( int index, int team, int iPrevIndex ); |
|
bool TeamCanCapPoint( int index, int team ); |
|
void SetCapLayoutInHUD( const char *pszLayout ) { Q_strncpy(m_pszCapLayoutInHUD.GetForModify(), pszLayout, MAX_CAPLAYOUT_LENGTH ); } |
|
void SetCapLayoutCustomPosition( float flPositionX, float flPositionY ) { m_flCustomPositionX = flPositionX; m_flCustomPositionY = flPositionY; } |
|
void SetWarnOnCap( int index, int iWarnLevel ); |
|
void SetWarnSound( int index, string_t iszSound ); |
|
void SetCPGroup( int index, int iCPGroup ); |
|
void SetCPLocked( int index, bool bLocked ); |
|
void SetTrackAlarm( int index, bool bAlarm ); |
|
void SetCPUnlockTime( int index, float flTime ); |
|
void SetCPTimerTime( int index, float flTime ); |
|
void SetCPCapTimeScalesWithPlayers( int index, bool bScales ); |
|
|
|
// State functions, called many times |
|
void SetNumPlayers( int index, int team, int iNumPlayers ); |
|
void StartCap( int index, int team ); |
|
void SetOwningTeam( int index, int team ); |
|
void SetCappingTeam( int index, int team ); |
|
void SetTeamInZone( int index, int team ); |
|
void SetCapBlocked( int index, bool bBlocked ); |
|
int GetOwningTeam( int index ); |
|
|
|
void AssertValidIndex( int index ) |
|
{ |
|
Assert( 0 <= index && index <= MAX_CONTROL_POINTS && index < m_iNumControlPoints ); |
|
} |
|
|
|
int GetBaseControlPointForTeam( int iTeam ) |
|
{ |
|
Assert( iTeam < MAX_TEAMS ); |
|
return m_iBaseControlPoints[iTeam]; |
|
} |
|
|
|
int GetCappingTeam( int index ) |
|
{ |
|
if ( index >= m_iNumControlPoints ) |
|
return TEAM_UNASSIGNED; |
|
|
|
return m_iCappingTeam[index]; |
|
} |
|
|
|
void SetTimerInHUD( CBaseEntity *pTimer ) |
|
{ |
|
m_iTimerToShowInHUD = pTimer ? pTimer->entindex() : 0; |
|
} |
|
|
|
|
|
void SetStopWatchTimer( CBaseEntity *pTimer ) |
|
{ |
|
m_iStopWatchTimer = pTimer ? pTimer->entindex() : 0; |
|
} |
|
|
|
int GetTimerInHUD( void ) { return m_iTimerToShowInHUD; } |
|
|
|
// Mini-rounds data |
|
void SetPlayingMiniRounds( bool bPlayingMiniRounds ){ m_bPlayingMiniRounds = bPlayingMiniRounds; } |
|
bool PlayingMiniRounds( void ){ return m_bPlayingMiniRounds; } |
|
void SetInMiniRound( int index, bool bInRound ) { m_bInMiniRound.Set( index, bInRound ); } |
|
bool IsInMiniRound( int index ) { return m_bInMiniRound[index]; } |
|
|
|
void UpdateCapHudElement( void ); |
|
|
|
// Train Path data |
|
void SetTrainPathDistance( int index, float flDistance ); |
|
|
|
bool GetCPLocked( int index ) |
|
{ |
|
Assert( index < m_iNumControlPoints ); |
|
return m_bCPLocked[index]; |
|
} |
|
|
|
void ResetHillData( int team ) |
|
{ |
|
if ( team < TEAM_TRAIN_MAX_TEAMS ) |
|
{ |
|
m_nNumNodeHillData.Set( team, 0 ); |
|
|
|
int nNumEntriesPerTeam = TEAM_TRAIN_MAX_HILLS * TEAM_TRAIN_FLOATS_PER_HILL; |
|
int iStartingIndex = team * nNumEntriesPerTeam; |
|
for ( int i = 0 ; i < nNumEntriesPerTeam ; i++ ) |
|
{ |
|
m_flNodeHillData.Set( iStartingIndex + i, 0 ); |
|
} |
|
|
|
iStartingIndex = team * TEAM_TRAIN_MAX_HILLS; |
|
for ( int i = 0; i < TEAM_TRAIN_MAX_HILLS; i++ ) |
|
{ |
|
m_bHillIsDownhill.Set( iStartingIndex + i, 0 ); |
|
} |
|
} |
|
} |
|
|
|
void SetHillData( int team, float flStart, float flEnd, bool bDownhill ) |
|
{ |
|
if ( team < TEAM_TRAIN_MAX_TEAMS ) |
|
{ |
|
int index = ( m_nNumNodeHillData[team] * TEAM_TRAIN_FLOATS_PER_HILL ) + ( team * TEAM_TRAIN_MAX_HILLS * TEAM_TRAIN_FLOATS_PER_HILL ); |
|
if ( index < TEAM_TRAIN_HILLS_ARRAY_SIZE - 1 ) // - 1 because we want to add 2 entries |
|
{ |
|
m_flNodeHillData.Set( index, flStart ); |
|
m_flNodeHillData.Set( index + 1, flEnd ); |
|
|
|
if ( m_nNumNodeHillData[team] < TEAM_TRAIN_MAX_HILLS ) |
|
{ |
|
m_bHillIsDownhill.Set( m_nNumNodeHillData[team] + ( team * TEAM_TRAIN_MAX_HILLS ), bDownhill ); |
|
} |
|
|
|
m_nNumNodeHillData.Set( team, m_nNumNodeHillData[team] + 1); |
|
} |
|
} |
|
} |
|
|
|
private: |
|
CNetworkVar( int, m_iTimerToShowInHUD ); |
|
CNetworkVar( int, m_iStopWatchTimer ); |
|
|
|
CNetworkVar( int, m_iNumControlPoints ); |
|
CNetworkVar( bool, m_bPlayingMiniRounds ); |
|
CNetworkVar( bool, m_bControlPointsReset ); |
|
CNetworkVar( int, m_iUpdateCapHudParity ); |
|
|
|
// data variables |
|
CNetworkArray( Vector, m_vCPPositions, MAX_CONTROL_POINTS ); |
|
CNetworkArray( int, m_bCPIsVisible, MAX_CONTROL_POINTS ); |
|
CNetworkArray( float, m_flLazyCapPerc, MAX_CONTROL_POINTS ); |
|
CNetworkArray( int, m_iTeamIcons, MAX_CONTROL_POINTS * MAX_CONTROL_POINT_TEAMS ); |
|
CNetworkArray( int, m_iTeamOverlays, MAX_CONTROL_POINTS * MAX_CONTROL_POINT_TEAMS ); |
|
CNetworkArray( int, m_iTeamReqCappers, MAX_CONTROL_POINTS * MAX_CONTROL_POINT_TEAMS ); |
|
CNetworkArray( float, m_flTeamCapTime, MAX_CONTROL_POINTS * MAX_CONTROL_POINT_TEAMS ); |
|
CNetworkArray( int, m_iPreviousPoints, MAX_CONTROL_POINTS * MAX_CONTROL_POINT_TEAMS * MAX_PREVIOUS_POINTS ); |
|
CNetworkArray( bool, m_bTeamCanCap, MAX_CONTROL_POINTS * MAX_CONTROL_POINT_TEAMS ); |
|
CNetworkArray( int, m_iTeamBaseIcons, MAX_TEAMS ); |
|
CNetworkArray( int, m_iBaseControlPoints, MAX_TEAMS ); |
|
CNetworkArray( bool, m_bInMiniRound, MAX_CONTROL_POINTS ); |
|
CNetworkArray( int, m_iWarnOnCap, MAX_CONTROL_POINTS ); |
|
CNetworkArray( string_t, m_iszWarnSound, MAX_CONTROL_POINTS ); |
|
CNetworkArray( float, m_flPathDistance, MAX_CONTROL_POINTS ); |
|
CNetworkArray( bool, m_bCPLocked, MAX_CONTROL_POINTS ); |
|
CNetworkArray( float, m_flUnlockTimes, MAX_CONTROL_POINTS ); |
|
CNetworkArray( float, m_flCPTimerTimes, MAX_CONTROL_POINTS ); |
|
|
|
// change when players enter/exit an area |
|
CNetworkArray( int, m_iNumTeamMembers, MAX_CONTROL_POINTS * MAX_CONTROL_POINT_TEAMS ); |
|
|
|
// changes when a cap starts. start and end times are calculated on client |
|
CNetworkArray( int, m_iCappingTeam, MAX_CONTROL_POINTS ); |
|
|
|
CNetworkArray( int, m_iTeamInZone, MAX_CONTROL_POINTS ); |
|
CNetworkArray( bool, m_bBlocked, MAX_CONTROL_POINTS ); |
|
|
|
// changes when a point is successfully captured |
|
CNetworkArray( int, m_iOwner, MAX_CONTROL_POINTS ); |
|
CNetworkArray( bool, m_bCPCapRateScalesWithPlayers, MAX_CONTROL_POINTS ); |
|
|
|
// describes how to lay out the cap points in the hud |
|
CNetworkString( m_pszCapLayoutInHUD, MAX_CAPLAYOUT_LENGTH ); |
|
|
|
// custom screen position for the cap points in the hud |
|
CNetworkVar( float, m_flCustomPositionX ); |
|
CNetworkVar( float, m_flCustomPositionY ); |
|
|
|
// the groups the points belong to |
|
CNetworkArray( int, m_iCPGroup, MAX_CONTROL_POINTS ); |
|
|
|
// Not networked, because the client recalculates it |
|
float m_flCapPercentages[ MAX_CONTROL_POINTS ]; |
|
|
|
// hill data for multi-escort payload maps |
|
CNetworkArray( int, m_nNumNodeHillData, TEAM_TRAIN_MAX_TEAMS ); |
|
CNetworkArray( float, m_flNodeHillData, TEAM_TRAIN_HILLS_ARRAY_SIZE ); |
|
|
|
CNetworkArray( bool, m_bTrackAlarm, TEAM_TRAIN_MAX_TEAMS ); |
|
CNetworkArray( bool, m_bHillIsDownhill, TEAM_TRAIN_MAX_HILLS*TEAM_TRAIN_MAX_TEAMS ); |
|
}; |
|
|
|
extern CBaseTeamObjectiveResource *g_pObjectiveResource; |
|
|
|
inline CBaseTeamObjectiveResource *ObjectiveResource() |
|
{ |
|
return g_pObjectiveResource; |
|
} |
|
|
|
#endif // TEAM_OBJECTIVERESOURCE_H
|
|
|