338 lines
12 KiB
C
338 lines
12 KiB
C
|
// Copyright (C) 2007 Id Software, Inc.
|
||
|
//
|
||
|
|
||
|
#ifndef __GAME_STRUCTURES_TEAMMANAGER_H__
|
||
|
#define __GAME_STRUCTURES_TEAMMANAGER_H__
|
||
|
|
||
|
class sdDeployableEntity;
|
||
|
class sdTeamInfo;
|
||
|
class sdRadarInterface;
|
||
|
|
||
|
#include "../roles/RoleManager.h"
|
||
|
|
||
|
class sdFireTeam;
|
||
|
|
||
|
class sdTeamInfoGameState {
|
||
|
public:
|
||
|
sdTeamInfoGameState( void ) { ; }
|
||
|
|
||
|
void MakeDefault( void );
|
||
|
|
||
|
void Write( idFile* file ) const;
|
||
|
void Read( idFile* file );
|
||
|
|
||
|
int wins;
|
||
|
sdScriptObjectNetworkData scriptData;
|
||
|
};
|
||
|
|
||
|
class sdTeamInfo : public idClass {
|
||
|
public:
|
||
|
static const int MAX_FIRETEAMS = 8;
|
||
|
|
||
|
CLASS_PROTOTYPE( sdTeamInfo );
|
||
|
|
||
|
typedef idPlayer* playerPtr_t;
|
||
|
|
||
|
class sdRadarLayer {
|
||
|
public:
|
||
|
sdRadarLayer( void ) { range = 0.f; mask = 0; maxAngle = 360.f; }
|
||
|
|
||
|
void SetRange( float value ) { range = Square( value ); }
|
||
|
void SetMaxAngle( float value ) { maxAngle = DEG2RAD( value * 0.5f ); }
|
||
|
void SetMask( int value ) { mask = value; }
|
||
|
void SetOrigin( const idVec3& value ) { origin = value.ToVec2(); }
|
||
|
void SetDirection( const idVec3& value ) { direction = value.ToVec2(); }
|
||
|
void SetOwner( idEntity* ent ) { owner = ent; }
|
||
|
|
||
|
float GetRange( void ) const { return range; }
|
||
|
float GetMaxAngle( void ) const { return maxAngle; }
|
||
|
int GetMask( void ) const { return mask; }
|
||
|
const idVec2& GetOrigin( void ) const { return origin; }
|
||
|
const idVec2& GetDirection( void ) const { return direction; }
|
||
|
idEntity* GetOwner( void ) const { return owner; }
|
||
|
|
||
|
private:
|
||
|
float maxAngle;
|
||
|
float range;
|
||
|
int mask;
|
||
|
idVec2 origin;
|
||
|
idVec2 direction;
|
||
|
idEntityPtr< idEntity > owner;
|
||
|
};
|
||
|
sdTeamInfo( void );
|
||
|
~sdTeamInfo( void );
|
||
|
|
||
|
bool operator== ( const sdTeamInfo& other ) { return ( this && ( &other ) ) && other.index == index; }
|
||
|
bool operator!= ( const sdTeamInfo& other ) { return !( *this == other ); }
|
||
|
|
||
|
void PreInit( int _index );
|
||
|
void Init( void );
|
||
|
void Think( void );
|
||
|
void Precache( void );
|
||
|
void SortPlayers( idStaticList< idPlayer*, MAX_CLIENTS >& list, bool wantSpectators = false );
|
||
|
static int SortPlayersFunc( const playerPtr_t* a, const playerPtr_t* b );
|
||
|
void UpdateScript( void );
|
||
|
|
||
|
void Event_GetName( void );
|
||
|
void Event_GetTitle( void );
|
||
|
void Event_RegisterDeployable( idEntity* other );
|
||
|
void Event_UnRegisterDeployable( idEntity* other );
|
||
|
void Event_GetDeployCategoryMax( int deployObjectCategory );
|
||
|
void Event_RegisterSpawnPoint( idEntity* other );
|
||
|
void Event_UnRegisterSpawnPoint( idEntity* other );
|
||
|
void Event_SyncScriptFieldBroadcast( const char* fieldName );
|
||
|
void Event_SyncScriptFieldCallback( const char* fieldName, const char* functionName );
|
||
|
|
||
|
void Event_GetKey( const char *key );
|
||
|
void Event_GetIntKey( const char *key );
|
||
|
void Event_GetFloatKey( const char *key );
|
||
|
void Event_GetVectorKey( const char *key );
|
||
|
|
||
|
void Event_GetKeyWithDefault( const char *key, const char* defaultvalue );
|
||
|
void Event_GetIntKeyWithDefault( const char *key, int defaultvalue );
|
||
|
void Event_GetFloatKeyWithDefault( const char *key, float defaultvalue );
|
||
|
void Event_GetVectorKeyWithDefault( const char *key, const idVec3& defaultvalue );
|
||
|
void Event_SetTeamRearSpawn( idEntity* teamRearSpawnBase );
|
||
|
|
||
|
sdRadarLayer* AllocRadarLayer( void );
|
||
|
sdRadarLayer* AllocJammerLayer( void );
|
||
|
void FreeRadarLayer( sdRadarLayer* layer );
|
||
|
|
||
|
const sdDeclLocStr* GetLifeStatTitle( void ) const;
|
||
|
|
||
|
sdFireTeam& GetFireTeam( int index );
|
||
|
int GetFireTeamIndex( sdFireTeam* fireTeam ) const;
|
||
|
static const char* GetDefaultFireTeamName( int index );
|
||
|
|
||
|
int GetTeamRespawnTime( void );
|
||
|
|
||
|
bool CanJoin( idPlayer* player, const char* password, const sdDeclLocStr*& reason ) const;
|
||
|
|
||
|
const idDict& GetDict( void ) const { return info->GetDict(); }
|
||
|
|
||
|
playerTeamTypes_t GetBotTeam( void ) const { return botTeam; }
|
||
|
int GetIndex( void ) const { return index; }
|
||
|
const char* GetLookupName( void ) const { return lookupname; }
|
||
|
const sdDeclLocStr* GetTitle( void ) const { return title; }
|
||
|
const sdDeclLocStr* GetWinString( void ) const { return winString; }
|
||
|
const sdDeclLocStr* GetWinStringSW_Speed( void ) const { return winStringSW_Speed; }
|
||
|
const sdDeclLocStr* GetWinStringSW_XP( void ) const { return winStringSW_XP; }
|
||
|
|
||
|
const char* GetWinMusic( void ) const { return winMusic; }
|
||
|
|
||
|
const char* GetSpawnFxName( void ) const { return spawnFxName; }
|
||
|
|
||
|
const char* GetCrashLandFxName() const { return crashLandFxName; }
|
||
|
float GetCrashLandThreshold() const { return crashLandThreshold; }
|
||
|
const char* GetParachuteLandFxName() const { return parachuteLandFxName; }
|
||
|
float GetParachuteLandThreshold() const { return parachuteLandThreshold; }
|
||
|
|
||
|
const wchar_t* GetHighCommandName( void ) const { return highCommandName ? highCommandName->GetText() : NULL; }
|
||
|
|
||
|
const sdDeclRating* GetRating( int index ) const;
|
||
|
|
||
|
void ClearMapData( void );
|
||
|
|
||
|
void TryFindPrivateFireTeam( idPlayer* player );
|
||
|
void CreatePrivateFireTeam( idPlayer* player );
|
||
|
bool CreatePublicFireTeam( idPlayer* player );
|
||
|
|
||
|
void OnNewMapLoad( void );
|
||
|
void OnNewScriptLoad( void );
|
||
|
void OnMapStart( void );
|
||
|
void OnScriptChange( void );
|
||
|
void OnCampaignChange( void );
|
||
|
|
||
|
void Reset( void );
|
||
|
void ResetAll( void );
|
||
|
|
||
|
void ApplyNetworkState( const sdTeamInfoGameState& newData );
|
||
|
void ReadNetworkState( const sdTeamInfoGameState& baseData, sdTeamInfoGameState& newData, const idBitMsg& msg ) const;
|
||
|
void WriteNetworkState( const sdTeamInfoGameState& baseData, sdTeamInfoGameState& newData, idBitMsg& msg ) const;
|
||
|
bool CheckNetworkStateChanges( const sdTeamInfoGameState& baseData ) const;
|
||
|
|
||
|
void AddWin( void ) { wins++; }
|
||
|
int GetNumWins( void ) const { return wins; }
|
||
|
|
||
|
idEntity* PointInRadar( const idVec3& target, radarMasks_t type );
|
||
|
idEntity* PointInJammer( const idVec3& target, radarMasks_t type );
|
||
|
|
||
|
bool AllowRespawn( idPlayer* player );
|
||
|
|
||
|
const sdDeclPlayerClass* GetDefaultClass( void ) const { return defaultClass; }
|
||
|
|
||
|
// returns defaultClass if there is no mapping between the classes
|
||
|
const sdDeclPlayerClass* GetEquivalentClass( const sdDeclPlayerClass& currentClass, const sdTeamInfo& desiredTeam ) const;
|
||
|
|
||
|
idEntity* GetDefaultSpawn( void ) { return spawnLocations.Num() ? spawnLocations[ 0 ].GetEntity() : NULL; }
|
||
|
const idEntity* GetDefaultSpawn( void ) const { return spawnLocations.Num() ? spawnLocations[ 0 ].GetEntity() : NULL; }
|
||
|
|
||
|
int GetNumSpawnLocations( void ) const { return spawnLocations.Num(); }
|
||
|
idEntity* GetSpawnLocation( int index ) { return spawnLocations[ index ]; }
|
||
|
const idEntity* GetSpawnLocation( int index ) const { return spawnLocations[ index ]; }
|
||
|
|
||
|
// returns the main base spawn for the team
|
||
|
idEntity* GetHomeBaseSpawn( void );
|
||
|
|
||
|
const idList< idEntityPtr< idEntity > >& GetDeployables( void ) const { return deployables; }
|
||
|
|
||
|
void RegisterDeployable( idEntity* other );
|
||
|
void UnRegisterDeployable( idEntity* other );
|
||
|
|
||
|
void RegisterSpawnPoint( idEntity* other );
|
||
|
void UnRegisterSpawnPoint( idEntity* other );
|
||
|
|
||
|
virtual idScriptObject* GetScriptObject( void ) const { return scriptObject; }
|
||
|
|
||
|
bool AllowRevive( void ) const { return allowRevive; }
|
||
|
|
||
|
template< typename T >
|
||
|
void AddEntityToList( idList< T >& list, idEntity* other ) {
|
||
|
for ( int i = 0; i < list.Num(); i++ ) { if ( list[ i ].GetEntity() == other ) { return; } }
|
||
|
list.Alloc() = other;
|
||
|
}
|
||
|
|
||
|
template< typename T >
|
||
|
void RemoveEntityFromList( idList< T >& list, idEntity* other ) {
|
||
|
for ( int i = 0; i < list.Num(); i++ ) {
|
||
|
if ( list[ i ].GetEntity() != other ) { continue; }
|
||
|
list.RemoveIndex( i );
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
idList< const sdDeclProficiencyType* >& GetProficiencyTypes( void ) { return proficiencyTypes; }
|
||
|
|
||
|
idCVar* GetPasswordCVar( void ) const { return passwordCVar; }
|
||
|
|
||
|
int GetNumPlayers( bool excludeBots = false ) const;
|
||
|
|
||
|
float GetTotalXP( void ) const;
|
||
|
|
||
|
const sdDeclToolTip* GetOOBToolTip( void ) const { return playZoneExitToolTip; }
|
||
|
private:
|
||
|
idEntity* PointInRadar( const idVec3& target, radarMasks_t type, const idList< sdRadarLayer* >& list );
|
||
|
|
||
|
private:
|
||
|
idStr lookupname;
|
||
|
const sdDeclLocStr* title;
|
||
|
const sdDeclLocStr* winString;
|
||
|
const sdDeclLocStr* winStringSW_Speed;
|
||
|
const sdDeclLocStr* winStringSW_XP;
|
||
|
int index;
|
||
|
int wins;
|
||
|
|
||
|
const sdDeclLocStr* highCommandName;
|
||
|
|
||
|
const sdDeclStringMap* info;
|
||
|
|
||
|
idStr winMusic;
|
||
|
|
||
|
idEntityPtr< idEntity > rearSpawnBase;
|
||
|
|
||
|
playerTeamTypes_t botTeam;
|
||
|
|
||
|
idStr spawnFxName;
|
||
|
const sdDeclPlayerClass* defaultClass;
|
||
|
|
||
|
idStr crashLandFxName;
|
||
|
float crashLandThreshold;
|
||
|
idStr parachuteLandFxName;
|
||
|
float parachuteLandThreshold;
|
||
|
|
||
|
sdRequirementContainer playerHealthBoostRequirements;
|
||
|
int maxHealthBoost;
|
||
|
int healthBoost;
|
||
|
|
||
|
idCVar* passwordCVar;
|
||
|
idCVar* maxLivesCVar;
|
||
|
|
||
|
bool allowRevive;
|
||
|
|
||
|
idList< sdRadarLayer* > radarLayers;
|
||
|
idList< sdRadarLayer* > jammerLayers;
|
||
|
idBlockAlloc< sdRadarLayer, 16 > radarAllocator;
|
||
|
|
||
|
idScriptObject* scriptObject;
|
||
|
sdProgramThread* scriptThread;
|
||
|
const sdProgram::sdFunction* allowRespawnFunc;
|
||
|
|
||
|
const sdProgram::sdFunction* teamNextRespawnTimeFunc;
|
||
|
|
||
|
idList< idEntityPtr< idEntity > > deployables;
|
||
|
idList< idEntityPtr< idEntity > > spawnLocations;
|
||
|
|
||
|
idList< const sdDeclRating* > ratings;
|
||
|
|
||
|
idList< const sdDeclProficiencyType* > proficiencyTypes;
|
||
|
|
||
|
sdFireTeam* fireTeams;
|
||
|
|
||
|
const sdDeclToolTip* playZoneExitToolTip;
|
||
|
|
||
|
const sdDeclLocStr* lifeStatTitle;
|
||
|
};
|
||
|
|
||
|
class sdTeamManagerGameState : public sdEntityStateNetworkData {
|
||
|
public:
|
||
|
sdTeamManagerGameState( void ) { ; }
|
||
|
|
||
|
virtual void MakeDefault( void );
|
||
|
|
||
|
virtual void Write( idFile* file ) const;
|
||
|
virtual void Read( idFile* file );
|
||
|
|
||
|
idList< sdTeamInfoGameState > teamData;
|
||
|
};
|
||
|
|
||
|
class sdTeamManagerLocal {
|
||
|
public:
|
||
|
sdTeamManagerLocal( void );
|
||
|
~sdTeamManagerLocal( void );
|
||
|
|
||
|
public:
|
||
|
void Init( void );
|
||
|
void OnNewMapLoad( void );
|
||
|
void OnNewScriptLoad( void );
|
||
|
void OnMapStart( void );
|
||
|
void Shutdown( void );
|
||
|
void Think( void );
|
||
|
|
||
|
sdTeamInfo* GetTeamSafe( const char* name );
|
||
|
sdTeamInfo& GetTeam( const char* name );
|
||
|
sdTeamInfo& GetTeamByIndex( int index );
|
||
|
int GetIndexForTeam( const char* name );
|
||
|
int GetNumTeams( void ) const { return teamInfo.Num(); }
|
||
|
|
||
|
void ApplyNetworkState( const sdEntityStateNetworkData& newState );
|
||
|
void ReadNetworkState( const sdEntityStateNetworkData& baseState, sdEntityStateNetworkData& newState, const idBitMsg& msg ) const;
|
||
|
void WriteNetworkState( const sdEntityStateNetworkData& baseState, sdEntityStateNetworkData& newState, idBitMsg& msg ) const;
|
||
|
bool CheckNetworkStateChanges( const sdEntityStateNetworkData& baseState ) const;
|
||
|
sdEntityStateNetworkData* CreateNetworkStructure( void ) const;
|
||
|
|
||
|
void OnScriptChange( void );
|
||
|
|
||
|
void WriteTeamToStream( sdTeamInfo* newTeam, idFile* file ) const;
|
||
|
sdTeamInfo* ReadTeamFromStream( idFile* file ) const;
|
||
|
|
||
|
void WriteTeamToStream( sdTeamInfo* newTeam, idBitMsg& msg ) const;
|
||
|
sdTeamInfo* ReadTeamFromStream( const idBitMsg& msg ) const;
|
||
|
|
||
|
void WriteTeamToStream( sdTeamInfo* oldTeam, sdTeamInfo* newTeam, idBitMsg& msg ) const;
|
||
|
sdTeamInfo* ReadTeamFromStream( sdTeamInfo* oldTeam, const idBitMsg& msg ) const;
|
||
|
|
||
|
sdNetworkStateObject& GetStateObject( void ) { return stateObject; }
|
||
|
|
||
|
private:
|
||
|
idList< sdTeamInfo* > teamInfo;
|
||
|
int teamBits;
|
||
|
|
||
|
sdNetworkStateObject_Generic< sdTeamManagerLocal, &sdTeamManagerLocal::ApplyNetworkState, &sdTeamManagerLocal::ReadNetworkState,
|
||
|
&sdTeamManagerLocal::WriteNetworkState, &sdTeamManagerLocal::CheckNetworkStateChanges,
|
||
|
&sdTeamManagerLocal::CreateNetworkStructure > stateObject;
|
||
|
};
|
||
|
|
||
|
typedef sdSingleton< sdTeamManagerLocal > sdTeamManager;
|
||
|
|
||
|
#endif // __GAME_STRUCTURES_TEAMMANAGER_H__
|