source-sdk-2013-mapbase/sp/src/game/shared/multiplay_gamerules.h
Joe Ludwig beaae8ac45 Updated the SDK with the latest code from the TF and HL2 branches
* Adds support for Visual Studio 2012 and 2013
* VR Mode:
. Switches from headtrack.dll to sourcevr.dll
. Improved readability of the UI in VR
. Removed the IPD calibration tool. TF2 will now obey the Oculus
configuration file. Use the Oculus calibration tool in your SDK or
install and run "OpenVR" under Tools in Steam to calibrate your IPD.
. Added dropdown to enable VR mode in the Video options. Removed the -vr
command line option.
. Added the ability to switch in and out of VR mode without quitting the
game
. By default VR mode will run full screen. To switch back to a
borderless window set the vr_force_windowed convar.
. Added support for VR mode on Linux
* Many assorted bug fixes and other changes from Team Fortress in
various shared files
2013-12-03 08:54:16 -08:00

283 lines
9.4 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef MULTIPLAY_GAMERULES_H
#define MULTIPLAY_GAMERULES_H
#ifdef _WIN32
#pragma once
#endif
#include "gamerules.h"
#ifdef CLIENT_DLL
#define CMultiplayRules C_MultiplayRules
#else
extern ConVar mp_restartgame;
extern ConVar mp_restartgame_immediate;
extern ConVar mp_waitingforplayers_time;
extern ConVar mp_waitingforplayers_restart;
extern ConVar mp_waitingforplayers_cancel;
extern ConVar mp_clan_readyrestart;
extern ConVar mp_clan_ready_signal;
extern ConVar nextlevel;
extern INetworkStringTable *g_pStringTableServerMapCycle;
#if defined ( TF_DLL ) || defined ( TF_CLIENT_DLL )
extern INetworkStringTable *g_pStringTableServerPopFiles;
extern INetworkStringTable *g_pStringTableServerMapCycleMvM;
#endif
#define VOICE_COMMAND_MAX_SUBTITLE_DIST 1900
class CBaseMultiplayerPlayer;
#endif
extern ConVar mp_show_voice_icons;
#define MAX_SPEAK_CONCEPT_LEN 64
#define MAX_VOICE_COMMAND_SUBTITLE 256
typedef struct
{
#ifndef CLIENT_DLL
// concept to speak
int m_iConcept;
// play subtitle?
bool m_bShowSubtitle;
bool m_bDistanceBasedSubtitle;
char m_szGestureActivity[64];
#else
// localizable subtitle
char m_szSubtitle[MAX_VOICE_COMMAND_SUBTITLE];
// localizable string for menu
char m_szMenuLabel[MAX_VOICE_COMMAND_SUBTITLE];
#endif
} VoiceCommandMenuItem_t;
extern ConVar mp_timelimit;
//=========================================================
// CMultiplayRules - rules for the basic half life multiplayer
// competition
//=========================================================
class CMultiplayRules : public CGameRules
{
public:
DECLARE_CLASS( CMultiplayRules, CGameRules );
// Functions to verify the single/multiplayer status of a game
virtual bool IsMultiplayer( void );
virtual bool Init();
// Damage query implementations.
virtual bool Damage_IsTimeBased( int iDmgType ); // Damage types that are time-based.
virtual bool Damage_ShouldGibCorpse( int iDmgType ); // Damage types that gib the corpse.
virtual bool Damage_ShowOnHUD( int iDmgType ); // Damage types that have client HUD art.
virtual bool Damage_NoPhysicsForce( int iDmgType ); // Damage types that don't have to supply a physics force & position.
virtual bool Damage_ShouldNotBleed( int iDmgType ); // Damage types that don't make the player bleed.
// TEMP: These will go away once DamageTypes become enums.
virtual int Damage_GetTimeBased( void );
virtual int Damage_GetShouldGibCorpse( void );
virtual int Damage_GetShowOnHud( void );
virtual int Damage_GetNoPhysicsForce( void );
virtual int Damage_GetShouldNotBleed( void );
CMultiplayRules();
virtual ~CMultiplayRules() {}
void LoadVoiceCommandScript( void );
virtual bool ShouldDrawHeadLabels()
{
if ( mp_show_voice_icons.GetBool() == false )
return false;
return BaseClass::ShouldDrawHeadLabels();
}
#ifndef CLIENT_DLL
virtual void FrameUpdatePostEntityThink();
// GR_Think
virtual void Think( void );
virtual void RefreshSkillData( bool forceUpdate );
virtual bool IsAllowedToSpawn( CBaseEntity *pEntity );
virtual bool FAllowFlashlight( void );
virtual bool FShouldSwitchWeapon( CBasePlayer *pPlayer, CBaseCombatWeapon *pWeapon );
virtual CBaseCombatWeapon *GetNextBestWeapon( CBaseCombatCharacter *pPlayer, CBaseCombatWeapon *pCurrentWeapon );
virtual bool SwitchToNextBestWeapon( CBaseCombatCharacter *pPlayer, CBaseCombatWeapon *pCurrentWeapon );
// Functions to verify the single/multiplayer status of a game
virtual bool IsDeathmatch( void );
virtual bool IsCoOp( void );
// Client connection/disconnection
// If ClientConnected returns FALSE, the connection is rejected and the user is provided the reason specified in
// svRejectReason
// Only the client's name and remote address are provided to the dll for verification.
virtual bool ClientConnected( edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen );
virtual void InitHUD( CBasePlayer *pl ); // the client dll is ready for updating
virtual void ClientDisconnected( edict_t *pClient );
// Client damage rules
virtual float FlPlayerFallDamage( CBasePlayer *pPlayer );
virtual bool FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker, const CTakeDamageInfo &info );
virtual bool AllowDamage( CBaseEntity *pVictim, const CTakeDamageInfo &info );
// Client spawn/respawn control
virtual void PlayerSpawn( CBasePlayer *pPlayer );
virtual void PlayerThink( CBasePlayer *pPlayer );
virtual bool FPlayerCanRespawn( CBasePlayer *pPlayer );
virtual float FlPlayerSpawnTime( CBasePlayer *pPlayer );
virtual CBaseEntity *GetPlayerSpawnSpot( CBasePlayer *pPlayer );
virtual bool AllowAutoTargetCrosshair( void );
// Client kills/scoring
virtual int IPointsForKill( CBasePlayer *pAttacker, CBasePlayer *pKilled );
virtual void PlayerKilled( CBasePlayer *pVictim, const CTakeDamageInfo &info );
virtual void DeathNotice( CBasePlayer *pVictim, const CTakeDamageInfo &info );
CBasePlayer *GetDeathScorer( CBaseEntity *pKiller, CBaseEntity *pInflictor ); // old version of method - kept for backward compat
virtual CBasePlayer *GetDeathScorer( CBaseEntity *pKiller, CBaseEntity *pInflictor, CBaseEntity *pVictim ); // new version of method
// Weapon retrieval
virtual bool CanHavePlayerItem( CBasePlayer *pPlayer, CBaseCombatWeapon *pWeapon );// The player is touching an CBaseCombatWeapon, do I give it to him?
// Weapon spawn/respawn control
virtual int WeaponShouldRespawn( CBaseCombatWeapon *pWeapon );
virtual float FlWeaponRespawnTime( CBaseCombatWeapon *pWeapon );
virtual float FlWeaponTryRespawn( CBaseCombatWeapon *pWeapon );
virtual Vector VecWeaponRespawnSpot( CBaseCombatWeapon *pWeapon );
// Item retrieval
virtual bool CanHaveItem( CBasePlayer *pPlayer, CItem *pItem );
virtual void PlayerGotItem( CBasePlayer *pPlayer, CItem *pItem );
// Item spawn/respawn control
virtual int ItemShouldRespawn( CItem *pItem );
virtual float FlItemRespawnTime( CItem *pItem );
virtual Vector VecItemRespawnSpot( CItem *pItem );
virtual QAngle VecItemRespawnAngles( CItem *pItem );
// Ammo retrieval
virtual void PlayerGotAmmo( CBaseCombatCharacter *pPlayer, char *szName, int iCount );
// Healthcharger respawn control
virtual float FlHealthChargerRechargeTime( void );
virtual float FlHEVChargerRechargeTime( void );
// What happens to a dead player's weapons
virtual int DeadPlayerWeapons( CBasePlayer *pPlayer );
// What happens to a dead player's ammo
virtual int DeadPlayerAmmo( CBasePlayer *pPlayer );
// Teamplay stuff
virtual const char *GetTeamID( CBaseEntity *pEntity ) {return "";}
virtual int PlayerRelationship( CBaseEntity *pPlayer, CBaseEntity *pTarget );
virtual bool PlayerCanHearChat( CBasePlayer *pListener, CBasePlayer *pSpeaker );
virtual bool PlayTextureSounds( void ) { return FALSE; }
virtual bool PlayFootstepSounds( CBasePlayer *pl );
// NPCs
virtual bool FAllowNPCs( void );
// Immediately end a multiplayer game
virtual void EndMultiplayerGame( void ) { GoToIntermission(); }
// Voice commands
virtual bool ClientCommand( CBaseEntity *pEdict, const CCommand &args );
virtual VoiceCommandMenuItem_t *VoiceCommand( CBaseMultiplayerPlayer *pPlayer, int iMenu, int iItem );
// Bugbait report
bool IsLoadingBugBaitReport( void );
virtual void ResetMapCycleTimeStamp( void ){ m_nMapCycleTimeStamp = 0; }
virtual void HandleTimeLimitChange( void ){ return; }
void IncrementMapCycleIndex();
void HaveAllPlayersSpeakConceptIfAllowed( int iConcept, int iTeam = TEAM_UNASSIGNED, const char *modifiers = NULL );
void RandomPlayersSpeakConceptIfAllowed( int iConcept, int iNumRandomPlayer = 1, int iTeam = TEAM_UNASSIGNED, const char *modifiers = NULL );
virtual void GetTaggedConVarList( KeyValues *pCvarTagList );
void SkipNextMapInCycle();
virtual void ClientCommandKeyValues( edict_t *pEntity, KeyValues *pKeyValues );
public:
struct ResponseRules_t
{
CUtlVector<IResponseSystem*> m_ResponseSystems;
};
CUtlVector<ResponseRules_t> m_ResponseRules;
virtual void InitCustomResponseRulesDicts() {}
virtual void ShutdownCustomResponseRulesDicts() {}
// NVNT virtual to check for haptic device
virtual void ClientSettingsChanged( CBasePlayer *pPlayer );
virtual void GetNextLevelName( char *szNextMap, int bufsize, bool bRandom = false );
static void DetermineMapCycleFilename( char *pszResult, int nSizeResult, bool bForceSpew );
static void LoapMapCycleFileIntoVector ( const char *pszMapCycleFile, CUtlVector<char *> &mapList );
static void FreeMapCycleFileVector ( CUtlVector<char *> &mapList );
bool IsMapInMapCycle( const char *pszName );
protected:
virtual bool UseSuicidePenalty() { return true; } // apply point penalty for suicide?
public:
virtual void ChangeLevel( void );
protected:
virtual void GoToIntermission( void );
void LoadMapCycleFile( void );
void ChangeLevelToMap( const char *pszMap );
float m_flIntermissionEndTime;
static int m_nMapCycleTimeStamp;
static int m_nMapCycleindex;
static CUtlVector<char*> m_MapList;
float m_flTimeLastMapChangeOrPlayerWasConnected;
#else
public:
const char *GetVoiceCommandSubtitle( int iMenu, int iItem );
bool GetVoiceMenuLabels( int iMenu, KeyValues *pKV );
#endif
private:
CUtlVector< CUtlVector< VoiceCommandMenuItem_t > > m_VoiceCommandMenus;
};
inline CMultiplayRules* MultiplayRules()
{
return static_cast<CMultiplayRules*>(g_pGameRules);
}
#endif // MULTIPLAY_GAMERULES_H