//========= 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 GetStopWatchTimer( void ) { return m_iStopWatchTimer; } 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