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.
526 lines
14 KiB
526 lines
14 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: The TF Game rules object |
|
// |
|
// $Workfile: $ |
|
// $Date: $ |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef DOD_GAMERULES_H |
|
#define DOD_GAMERULES_H |
|
|
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "teamplay_gamerules.h" |
|
#include "convar.h" |
|
#include "dod_shareddefs.h" |
|
#include "gamevars_shared.h" |
|
#include "weapon_dodbase.h" |
|
#include "dod_round_timer.h" |
|
|
|
#ifdef CLIENT_DLL |
|
#include "c_baseplayer.h" |
|
#else |
|
#include "player.h" |
|
#include "dod_player.h" |
|
#include "utlqueue.h" |
|
#include "playerclass_info_parse.h" |
|
#include "voice_gamemgr.h" |
|
#include "dod_gamestats.h" |
|
#endif |
|
|
|
#ifdef CLIENT_DLL |
|
#define CDODGameRules C_DODGameRules |
|
#define CDODGameRulesProxy C_DODGameRulesProxy |
|
#else |
|
extern IVoiceGameMgrHelper *g_pVoiceGameMgrHelper; |
|
extern IUploadGameStats *gamestatsuploader; |
|
#endif |
|
|
|
#ifndef CLIENT_DLL |
|
|
|
class CSpawnPoint : public CPointEntity |
|
{ |
|
public: |
|
bool IsDisabled() { return m_bDisabled; } |
|
void InputEnable( inputdata_t &inputdata ) { m_bDisabled = false; } |
|
void InputDisable( inputdata_t &inputdata ) { m_bDisabled = true; } |
|
|
|
private: |
|
bool m_bDisabled; |
|
DECLARE_DATADESC(); |
|
}; |
|
|
|
#endif |
|
|
|
class CDODGameRulesProxy : public CGameRulesProxy |
|
{ |
|
public: |
|
DECLARE_CLASS( CDODGameRulesProxy, CGameRulesProxy ); |
|
DECLARE_NETWORKCLASS(); |
|
}; |
|
|
|
class CDODGameRules; |
|
|
|
class CDODRoundStateInfo |
|
{ |
|
public: |
|
DODRoundState m_iRoundState; |
|
const char *m_pStateName; |
|
|
|
void (CDODGameRules::*pfnEnterState)(); // Init and deinit the state. |
|
void (CDODGameRules::*pfnLeaveState)(); |
|
void (CDODGameRules::*pfnThink)(); // Do a PreThink() in this state. |
|
}; |
|
|
|
typedef enum |
|
{ |
|
STARTROUND_ATTACK = 0, |
|
STARTROUND_DEFEND, |
|
|
|
STARTROUND_BEACH, |
|
|
|
STARTROUND_ATTACK_TIMED, |
|
STARTROUND_DEFEND_TIMED, |
|
|
|
STARTROUND_FLAGS, |
|
} startround_voice_t; |
|
|
|
class CDODGamePlayRules |
|
{ |
|
public: |
|
DECLARE_CLASS_NOBASE( CDODGamePlayRules ); |
|
DECLARE_EMBEDDED_NETWORKVAR(); |
|
|
|
DECLARE_SIMPLE_DATADESC(); |
|
|
|
CDODGamePlayRules() |
|
{ |
|
Reset(); |
|
} |
|
|
|
// This virtual method is necessary to generate a vtable in all cases |
|
// (DECLARE_PREDICTABLE will generate a vtable also)! |
|
virtual ~CDODGamePlayRules() {} |
|
|
|
void Reset( void ) |
|
{ |
|
//RespawnFactor |
|
m_fAlliesRespawnFactor = 1.0f; |
|
m_fAxisRespawnFactor = 1.0f; |
|
} |
|
|
|
//Respawn Factors |
|
float m_fAlliesRespawnFactor; //How delayed are respawning players |
|
float m_fAxisRespawnFactor; //1.0 is normal, 2.0 is twice as long |
|
|
|
int m_iAlliesStartRoundVoice; // Which voice to play at round start |
|
int m_iAxisStartRoundVoice; |
|
}; |
|
|
|
|
|
//Mapper interface for gamerules |
|
class CDODDetect : public CBaseEntity |
|
{ |
|
public: |
|
DECLARE_CLASS( CDODDetect, CBaseEntity ); |
|
|
|
CDODDetect(); |
|
void Spawn( void ); |
|
virtual bool KeyValue( const char *szKeyName, const char *szValue ); |
|
|
|
bool IsMasteredOn( void ); |
|
|
|
inline CDODGamePlayRules *GetGamePlay() { return &m_GamePlayRules; } |
|
CDODGamePlayRules m_GamePlayRules; |
|
|
|
private: |
|
// string_t m_sMaster; |
|
}; |
|
|
|
class CDODViewVectors : public CViewVectors |
|
{ |
|
public: |
|
CDODViewVectors( |
|
Vector vView, |
|
Vector vHullMin, |
|
Vector vHullMax, |
|
Vector vDuckHullMin, |
|
Vector vDuckHullMax, |
|
Vector vDuckView, |
|
Vector vObsHullMin, |
|
Vector vObsHullMax, |
|
Vector vDeadViewHeight, |
|
Vector vProneHullMin, |
|
Vector vProneHullMax ) : |
|
CViewVectors( |
|
vView, |
|
vHullMin, |
|
vHullMax, |
|
vDuckHullMin, |
|
vDuckHullMax, |
|
vDuckView, |
|
vObsHullMin, |
|
vObsHullMax, |
|
vDeadViewHeight ) |
|
{ |
|
m_vProneHullMin = vProneHullMin; |
|
m_vProneHullMax = vProneHullMax; |
|
} |
|
|
|
Vector m_vProneHullMin; |
|
Vector m_vProneHullMax; |
|
}; |
|
|
|
//GAMERULES |
|
class CDODGameRules : public CTeamplayRules |
|
{ |
|
public: |
|
DECLARE_CLASS( CDODGameRules, CTeamplayRules ); |
|
|
|
virtual bool ShouldCollide( int collisionGroup0, int collisionGroup1 ); |
|
|
|
inline DODRoundState State_Get( void ) { return m_iRoundState; } |
|
|
|
int GetSubTeam( int team ); |
|
|
|
bool IsGameUnderTimeLimit( void ); |
|
int GetTimeLeft( void ); |
|
|
|
int GetReinforcementTimerSeconds( int team, float flSpawnEligibleTime ); |
|
|
|
bool IsFriendlyFireOn( void ); |
|
bool IsInBonusRound( void ); |
|
|
|
// Get the view vectors for this mod. |
|
virtual const CViewVectors* GetViewVectors() const; |
|
virtual const CDODViewVectors *GetDODViewVectors() const; |
|
virtual const unsigned char *GetEncryptionKey( void ) { return (unsigned char *)"Wl0u5B3F"; } |
|
|
|
bool AwaitingReadyRestart( void ) { return m_bAwaitingReadyRestart; } |
|
float GetRoundRestartTime( void ) { return m_flRestartRoundTime; } |
|
|
|
bool IsInWarmup( void ) { return m_bInWarmup; } |
|
|
|
bool IsBombingTeam( int team ); |
|
|
|
virtual bool IsConnectedUserInfoChangeAllowed( CBasePlayer *pPlayer ); |
|
|
|
#ifndef CLIENT_DLL |
|
float GetPresentDropChance( void ); // holiday 2011, presents instead of ammo boxes |
|
#endif |
|
|
|
#ifdef CLIENT_DLL |
|
|
|
DECLARE_CLIENTCLASS_NOBASE(); // This makes datatables able to access our private vars. |
|
|
|
void SetRoundState( int iRoundState ); |
|
float m_flLastRoundStateChangeTime; |
|
|
|
#else |
|
|
|
DECLARE_SERVERCLASS_NOBASE(); // This makes datatables able to access our private vars. |
|
|
|
CDODGameRules(); |
|
virtual ~CDODGameRules(); |
|
|
|
virtual void LevelShutdown( void ); |
|
void UploadLevelStats( void ); |
|
|
|
virtual bool ClientCommand( CBaseEntity *pEdict, const CCommand &args ); |
|
virtual void RadiusDamage( const CTakeDamageInfo &info, const Vector &vecSrc, float flRadius, int iClassIgnore, CBaseEntity *pEntityIgnore ); |
|
virtual void RadiusDamage( const CTakeDamageInfo &info, const Vector &vecSrcIn, float flRadius, int iClassIgnore, CBaseEntity *pEntityIgnore, bool bIgnoreWorld = false ); |
|
void RadiusStun( const CTakeDamageInfo &info, const Vector &vecSrc, float flRadius ); |
|
virtual void Think(); |
|
virtual void PlayerKilled( CBasePlayer *pVictim, const CTakeDamageInfo &info ); |
|
virtual void ClientDisconnected( edict_t *pClient ); |
|
virtual float FlPlayerFallDamage( CBasePlayer *pPlayer ); |
|
|
|
virtual const char *GetGameDescription( void ) |
|
{ |
|
return "Day of Defeat: Source"; |
|
} |
|
|
|
void CreateStandardEntities( void ); |
|
|
|
virtual const char *GetChatPrefix( bool bTeamOnly, CBasePlayer *pPlayer ); |
|
|
|
CBaseEntity *GetPlayerSpawnSpot( CBasePlayer *pPlayer ); |
|
bool IsSpawnPointValid( CBaseEntity *pSpot, CBasePlayer *pPlayer ); |
|
virtual void PlayerSpawn( CBasePlayer *pPlayer ); |
|
|
|
int DODPointsForKill( CBasePlayer *pVictim, const CTakeDamageInfo &info ); |
|
|
|
//Round state machine |
|
void State_Transition( DODRoundState newState ); |
|
void State_Enter( DODRoundState newState ); // Initialize the new state. |
|
void State_Leave(); // Cleanup the previous state. |
|
void State_Think(); // Update the current state. |
|
|
|
CDODRoundStateInfo *m_pCurStateInfo; //Fn ptrs for the current state |
|
float m_flStateTransitionTime; //Timer for round states |
|
|
|
// Find the state info for the specified state. |
|
static CDODRoundStateInfo* State_LookupInfo( DODRoundState state ); |
|
|
|
//State Functions |
|
void State_Enter_INIT( void ); |
|
void State_Think_INIT( void ); |
|
|
|
void State_Enter_PREGAME( void ); |
|
void State_Think_PREGAME( void ); |
|
|
|
void State_Enter_STARTGAME( void ); |
|
void State_Think_STARTGAME( void ); |
|
|
|
void State_Enter_PREROUND( void ); |
|
void State_Think_PREROUND( void ); |
|
|
|
void State_Enter_RND_RUNNING( void ); |
|
void State_Think_RND_RUNNING( void ); |
|
|
|
void State_Enter_ALLIES_WIN( void ); |
|
void State_Think_ALLIES_WIN( void ); |
|
|
|
void State_Enter_AXIS_WIN( void ); |
|
void State_Think_AXIS_WIN( void ); |
|
|
|
void State_Enter_RESTART( void ); |
|
void State_Think_RESTART( void ); |
|
|
|
void SetInWarmup( bool bWarmup ); |
|
void CheckWarmup( void ); |
|
void CheckRestartRound( void ); |
|
void CheckRespawnWaves( void ); |
|
|
|
void InitTeams( void ); |
|
|
|
void RoundRespawn( void ); |
|
void CleanUpMap( void ); |
|
void ResetScores( void ); |
|
|
|
// Respawn everyone regardless of state - round reset |
|
inline void RespawnAllPlayers( void ) { RespawnPlayers( true ); } |
|
|
|
// Respawn only one team, players that are ready to spawn - wave reset |
|
inline void RespawnTeam( int iTeam ) { RespawnPlayers( false, true, iTeam ); } |
|
|
|
void RespawnPlayers( bool bForceRespawn, bool bTeam = false, int iTeam = TEAM_UNASSIGNED ); |
|
|
|
void FailSafeSpawnPlayersOnTeam( int iTeam ); |
|
|
|
bool IsPlayerClassOnTeam( int cls, int team ); |
|
bool CanPlayerJoinClass( CDODPlayer *pPlayer, int cls ); |
|
void ChooseRandomClass( CDODPlayer *pPlayer ); |
|
bool ReachedClassLimit( int team, int cls ); |
|
int CountPlayerClass( int team, int cls ); |
|
int GetClassLimit( int team, int cls ); |
|
|
|
int CountActivePlayers( void ); //How many players have chosen a team? |
|
|
|
void SetWinningTeam( int team ); |
|
void PlayWinSong( int team ); |
|
void PlayStartRoundVoice( void ); |
|
void BroadcastSound( const char *sound ); |
|
void PlaySpawnSoundToTeam( const char *sound, int team ); |
|
|
|
int SelectDefaultTeam( void ); |
|
|
|
void CopyGamePlayLogic( const CDODGamePlayRules otherGamePlay ); |
|
|
|
|
|
void DeathNotice( CBasePlayer *pVictim, const CTakeDamageInfo &info ); |
|
|
|
virtual bool CanHavePlayerItem( CBasePlayer *pPlayer, CBaseCombatWeapon *pWeapon ); |
|
|
|
bool TeamFull( int team_id ); |
|
bool TeamStacked( int iNewTeam, int iCurTeam ); |
|
|
|
const char *GetPlayerClassName( int cls, int team ); |
|
|
|
virtual void ClientSettingsChanged( CBasePlayer *pPlayer ); |
|
|
|
void CheckChatForReadySignal( CDODPlayer *pPlayer, const char *chatmsg ); |
|
bool AreAlliesReady( void ) { return m_bHeardAlliesReady; } |
|
bool AreAxisReady( void ) { return m_bHeardAxisReady; } |
|
|
|
void CreateOrJoinRespawnWave( CDODPlayer *pPlayer ); |
|
|
|
virtual bool InRoundRestart( void ); |
|
|
|
void SendTeamScoresEvent( void ); |
|
|
|
void WriteStatsFile( const char *pszLogName ); |
|
|
|
void AddTimerSeconds( int iSecondsToAdd ); |
|
int GetTimerSeconds( void ); |
|
|
|
void CapEvent( int event, int team ); |
|
int m_iLastAlliesCapEvent; |
|
int m_iLastAxisCapEvent; |
|
|
|
// Set the time at which the map was reset to 'now' |
|
// and send an event with the time remaining until map change |
|
void ResetMapTime( void ); |
|
|
|
virtual CBaseCombatWeapon *GetNextBestWeapon( CBaseCombatCharacter *pPlayer, CBaseCombatWeapon *pCurrentWeapon ); |
|
|
|
virtual bool CanEntityBeUsePushed( CBaseEntity *pEnt ); |
|
|
|
virtual void CalcDominationAndRevenge( CDODPlayer *pAttacker, CDODPlayer *pVictim, int *piDeathFlags ); |
|
|
|
float m_flNextFailSafeWaveCheckTime; |
|
|
|
CUtlVector<EHANDLE> *GetSpawnPointListForTeam( int iTeam ); |
|
|
|
virtual void GetTaggedConVarList( KeyValues *pCvarTagList ); |
|
|
|
protected: |
|
virtual void GoToIntermission( void ); |
|
virtual bool UseSuicidePenalty() { return false; } |
|
|
|
void CheckPlayerPositions( void ); |
|
|
|
private: |
|
bool CheckTimeLimit( void ); |
|
bool CheckWinLimit( void ); |
|
|
|
void RadiusDamage( const CTakeDamageInfo &info, const Vector &vecSrcIn, float flRadius, int iClassIgnore, bool bIgnoreWorld ); |
|
float GetExplosionDamageAdjustment(Vector & vecSrc, Vector & vecEnd, CBaseEntity *pTarget, CBaseEntity *pEntityToIgnore); // returns multiplier between 0.0 and 1.0 that is the percentage of any damage done from vecSrc to vecEnd that actually makes it. |
|
float GetAmountOfEntityVisible(Vector & src, CBaseEntity *pTarget, CBaseEntity *pEntityToIgnore); // returns a value from 0 to 1 that is the percentage of player visible from src. |
|
|
|
void CheckLevelInitialized( void ); |
|
bool m_bLevelInitialized; |
|
|
|
int m_iSpawnPointCount_Allies; //number of allies spawns on the map |
|
int m_iSpawnPointCount_Axis; //number of axis spawns on the map |
|
|
|
#define MAX_PLAYERCLASSES_PER_TEAM 16 |
|
|
|
PLAYERCLASS_FILE_INFO_HANDLE m_hPlayerClassInfoHandles[2][MAX_PLAYERCLASSES_PER_TEAM]; |
|
|
|
// restart and warmup variables |
|
float m_flWarmupTimeEnds; |
|
float m_flNextPeriodicThink; |
|
|
|
Vector2D m_vecPlayerPositions[MAX_PLAYERS]; |
|
|
|
|
|
//BELOW HERE NEED TO BE HOOKED UP |
|
|
|
|
|
int m_iNumAlliesAlive; //the number of players alive on each team |
|
int m_iNumAxisAlive; |
|
int m_iNumAlliesOnTeam; //the number of players on each team |
|
int m_iNumAxisOnTeam; |
|
|
|
bool m_bClanMatch; |
|
bool m_bClanMatchActive; |
|
|
|
float GetMaxWaveTime( int iTeam ); |
|
float GetWaveTime( int iTeam ); |
|
void AddWaveTime( int team, float flTime ); |
|
void PopWaveTime( int team ); |
|
|
|
void DetectGameRules( void ); |
|
|
|
bool m_bHeardAlliesReady; |
|
bool m_bHeardAxisReady; |
|
|
|
bool m_bUsingTimer; |
|
int m_iTimerWinTeam; |
|
CHandle< CDODRoundTimer > m_pRoundTimer; |
|
|
|
bool m_bPlayTimerWarning_1Minute; |
|
bool m_bPlayTimerWarning_2Minute; |
|
|
|
bool m_bInitialSpawn; // first time activating? longer wait time for people to join |
|
|
|
bool m_bChangeLevelOnRoundEnd; |
|
|
|
#endif //CLIENT_DLL |
|
|
|
CNetworkVarEmbedded( CDODGamePlayRules, m_GamePlayRules ); |
|
|
|
CNetworkVar( DODRoundState, m_iRoundState ); |
|
|
|
#define DOD_RESPAWN_QUEUE_SIZE 10 |
|
|
|
CNetworkArray( float, m_AlliesRespawnQueue, DOD_RESPAWN_QUEUE_SIZE ); |
|
CNetworkArray( float, m_AxisRespawnQueue, DOD_RESPAWN_QUEUE_SIZE ); |
|
|
|
CNetworkVar( int, m_iAlliesRespawnHead ); |
|
CNetworkVar( int, m_iAlliesRespawnTail ); |
|
|
|
CNetworkVar( int, m_iAxisRespawnHead ); |
|
CNetworkVar( int, m_iAxisRespawnTail ); |
|
|
|
int m_iNumAlliesRespawnWaves; |
|
int m_iNumAxisRespawnWaves; |
|
|
|
CNetworkVar( bool, m_bInWarmup ); |
|
CNetworkVar( bool, m_bAwaitingReadyRestart ); |
|
CNetworkVar( float, m_flRestartRoundTime ); |
|
CNetworkVar( float, m_flMapResetTime ); // time that the map was reset |
|
|
|
CNetworkVar( bool, m_bAlliesAreBombing ); |
|
CNetworkVar( bool, m_bAxisAreBombing ); |
|
|
|
#ifndef CLIENT_DLL |
|
public: |
|
// Stats |
|
void Stats_PlayerKill( int team, int cls ); |
|
void Stats_PlayerCap( int team, int cls ); |
|
void Stats_PlayerDefended( int team, int cls ); |
|
void Stats_WeaponFired( int weaponID ); |
|
void Stats_WeaponHit( int weaponID, float flDist ); |
|
int Stats_WeaponDistanceToBucket( int weaponID, float flDist ); |
|
|
|
float m_flSecondsPlayedPerClass_Allies[7]; |
|
float m_flSecondsPlayedPerClass_Axis[7]; |
|
|
|
int m_iStatsKillsPerClass_Allies[6]; |
|
int m_iStatsKillsPerClass_Axis[6]; |
|
|
|
int m_iStatsSpawnsPerClass_Allies[6]; |
|
int m_iStatsSpawnsPerClass_Axis[6]; |
|
|
|
int m_iStatsCapsPerClass_Allies[6]; |
|
int m_iStatsCapsPerClass_Axis[6]; |
|
|
|
int m_iStatsDefensesPerClass_Allies[6]; |
|
int m_iStatsDefensesPerClass_Axis[6]; |
|
|
|
int m_iWeaponShotsFired[WEAPON_MAX]; |
|
int m_iWeaponShotsHit[WEAPON_MAX]; |
|
int m_iWeaponDistanceBuckets[WEAPON_MAX][DOD_NUM_WEAPON_DISTANCE_BUCKETS]; // distances of buckets are defined per-weapon |
|
|
|
// List of spawn points |
|
CUtlVector<EHANDLE> m_AlliesSpawnPoints; |
|
CUtlVector<EHANDLE> m_AxisSpawnPoints; |
|
|
|
bool m_bWinterHolidayActive; |
|
|
|
#endif // ndef CLIENTDLL |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Gets us at the team fortress game rules |
|
//----------------------------------------------------------------------------- |
|
|
|
inline CDODGameRules* DODGameRules() |
|
{ |
|
return static_cast<CDODGameRules*>(g_pGameRules); |
|
} |
|
|
|
#ifdef CLIENT_DLL |
|
|
|
#else |
|
bool EntityPlacementTest( CBaseEntity *pMainEnt, const Vector &vOrigin, Vector &outPos, bool bDropToGround ); |
|
#endif //CLIENT_DLL |
|
|
|
|
|
#endif // DOD_GAMERULES_H
|
|
|