//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Team management class. Contains all the details for a specific team // // $NoKeywords: $ //=============================================================================// #ifndef TF_TEAM_H #define TF_TEAM_H #ifdef _WIN32 #pragma once #endif #include "utlvector.h" #include "tf_shareddefs.h" #include "techtree.h" #include "team.h" #include "order_events.h" class CBaseTFPlayer; class CResourceZone; class CTeamSpawnPoint; class CBaseTFPlayer; class CResourceDrop; class CTechnologyTree; class CBaseTechnology; class CObjectResupply; class CBaseObject; class COrder; class CTeamMessage; class CObjectPowerPack; class CObjectBuffStation; enum { COUNTORDERS_TYPE = (1<<0), COUNTORDERS_TARGET = (1<<1), COUNTORDERS_OWNER = (1<<2) }; // Maximum total number of objects a team can have. #define MAX_TEAM_OBJECTS 1024 //----------------------------------------------------------------------------- // Purpose: Team Manager //----------------------------------------------------------------------------- class CTFTeam : public CTeam { DECLARE_CLASS( CTFTeam, CTeam ); public: virtual ~CTFTeam( void ); DECLARE_SERVERCLASS(); // Initialization virtual void Init( const char *pName, int iNumber ); virtual void Precache( void ); virtual void PrecacheTechnology( CBaseTechnology *pTech ); virtual void Think( void ); //----------------------------------------------------------------------------- // Data Handling //----------------------------------------------------------------------------- virtual void UpdateClientData( CBasePlayer *pPlayer ); virtual void UpdateClientTechnology( int iTechID, CBaseTFPlayer *pPlayer ); virtual void UpdateTechnologyData( void ); virtual bool ShouldTransmitToPlayer( CBasePlayer *pRecipient, CBaseEntity* pEntity ); virtual bool IsEntityVisibleToTactical( CBaseEntity *pEntity ); //----------------------------------------------------------------------------- // Resources //----------------------------------------------------------------------------- virtual void UpdatePotentialResources( void ); virtual void AddResourceZone( CResourceZone *pResource ); virtual void RemoveResourceZone( CResourceZone *pResource ); // Handling for players joining the team during the game float GetJoiningPlayerResources( void ); void SetRecentBankSet( float flResources ); //----------------------------------------------------------------------------- // Technology Tree //----------------------------------------------------------------------------- virtual void InitializeTechTree( void ); virtual CTechnologyTree *GetTechnologyTree( void ); virtual void EnableTechnology( CBaseTechnology *technology, bool bStolen = false ); // Give this team a technology virtual void EnableAllTechnologies( void ); virtual void RecomputeTeamResources( void ); virtual void RecomputePreferences( void ); virtual void RecomputePurchases( void ); virtual bool HasNamedTechnology( const char *name ); virtual void GainedNewTechnology( CBaseTechnology *pTechnology ); virtual void UpdateTechnologies( void ); //----------------------------------------------------------------------------- // Players //----------------------------------------------------------------------------- virtual void AddPlayer( CBasePlayer *pPlayer ); virtual void RemovePlayer( CBasePlayer *pPlayer ); int GetNumOfClass( TFClass iClass ); //----------------------------------------------------------------------------- // Resource Bank //----------------------------------------------------------------------------- void InitializeTeamResources( void ); float GetTeamResources( void ); int AddTeamResources( float fAmount, int nStat = -1 ); void ResourceLoadDeposited( void ); void DonateResources( CBaseTFPlayer *pPlayer ); //----------------------------------------------------------------------------- // Objects //----------------------------------------------------------------------------- void AddObject( CBaseObject *pObject ); void RemoveObject( CBaseObject *pObject ); bool IsObjectOnTeam( CBaseObject *pObject ) const; void AddResupply( CObjectResupply *pResupply ); void RemoveResupply( CObjectResupply *pResupply ); int GetNumObjects( int iObjectType = -1 ); CBaseObject *GetObject( int num ); int GetNumResupplies( void ); CObjectResupply *GetResupply( int num ); // Returns true if the position is covered by a sentry gun. bool IsCoveredBySentryGun( const Vector &vPos ); int GetNumShieldWallsCoveringPosition( const Vector &vPos ); int GetNumResuppliesCoveringPosition( const Vector &vPos ); int GetNumRespawnStationsCoveringPosition( const Vector &vPos ); //----------------------------------------------------------------------------- // Orders //----------------------------------------------------------------------------- void InitializeOrders( void ); COrder* AddOrder( int iOrderType, CBaseEntity *pTarget, CBaseTFPlayer *pPlayer = NULL, float flDistanceToRemove = 1e24, float flLifetime = 60, COrder *pDefaultOrder = NULL // If this is specified, then it is used instead of // asking COrder to allocate an order. ); void RemoveOrder( COrder *pOrder ); void RecalcOrders( void ); void UpdateOrders( void ); void UpdateOrdersOnEvent( COrderEvent_Base *pEvent ); // Flags is a combination of COUNTORDERS_ flags telling which fields to check. int CountOrders( int flags, int iOrderType, CBaseEntity *pTarget=0, CBaseTFPlayer *pOwner=0 ); int CountOrdersOwnedByPlayer( CBaseTFPlayer *pPlayer ); void CreatePersonalOrders( void ); void CreatePersonalOrder( CBaseTFPlayer *pPlayer ); void RemoveOrdersToPlayer( CBaseTFPlayer *pPlayer ); //----------------------------------------------------------------------------- // Messages //----------------------------------------------------------------------------- void ClearMessages( void ); void PostMessage( int iMessageID, CBaseEntity *pEntity = NULL, char *sData = NULL ); void UpdateMessages( void ); void UpdatePowerpacks( CObjectPowerPack *pPackToIgnore, CBaseObject *pObjectToTarget ); void UpdateBuffStations( CObjectBuffStation *pBuffStationToIgnore, CBaseObject *pObjectToTarget, bool bPlacing ); //----------------------------------------------------------------------------- // Utility funcs //----------------------------------------------------------------------------- CTFTeam* GetEnemyTeam(); // Technology Tree CTechnologyTree *m_pTechnologyTree; // TEST CODE // Remove after Resource Experiment! float m_flTotalResourcesSoFar; private: typedef CHandle OrderHandle; // Resource UI data CNetworkVar( bool, m_bHaveZone ); // Resources CNetworkVar( float, m_fResources ); // Current amounts of resource CNetworkVar( float, m_fPotentialResources ); // Amounts of resource when all collectors have returned float m_flLastBankSetAmount; // Most recent amount of resources our players had their banks set to float m_flLastBankSetTime; // Time at which our players last had their banks set // Orders float m_flPersonalOrderUpdateTime; // Used to distribute resources to a team float m_flNextResourceTime; int m_iLastUpdateSentAt; CUtlVector< CResourceZone * > m_aResourcesBeingCollected; CUtlVector< CObjectResupply * > m_aResupplyBeacons; CUtlVector< OrderHandle > m_aOrders; // Stored in order of priority CUtlVector< CTeamMessage* > m_aMessages; CUtlVector< CBaseObject* > m_aObjects; }; extern CTFTeam *GetGlobalTFTeam( int iIndex ); #endif // TF_TEAM_H