//========= 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 m_ResponseSystems; }; CUtlVector 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); virtual void LoadMapCycleFileIntoVector(const char *pszMapCycleFile, CUtlVector &mapList); static void FreeMapCycleFileVector(CUtlVector &mapList); // LoadMapCycleFileIntoVector without the fixups inherited versions of // gamerules may provide static void RawLoadMapCycleFileIntoVector(const char *pszMapCycleFile, CUtlVector &mapList); bool IsMapInMapCycle(const char *pszName); virtual bool IsManualMapChangeOkay(const char **pszReason) OVERRIDE; protected: virtual bool UseSuicidePenalty() { return true; } // apply point penalty for suicide? virtual float GetLastMajorEventTime(void) { return -1.0f; } public: virtual void ChangeLevel(void); protected: virtual void GoToIntermission(void); virtual void LoadMapCycleFile(void); void ChangeLevelToMap(const char *pszMap); float m_flIntermissionEndTime; static int m_nMapCycleTimeStamp; static int m_nMapCycleindex; static CUtlVector m_MapList; float m_flTimeLastMapChangeOrPlayerWasConnected; #else public: const char *GetVoiceCommandSubtitle(int iMenu, int iItem); bool GetVoiceMenuLabels(int iMenu, KeyValues *pKV); #endif private: CUtlVector > m_VoiceCommandMenus; }; inline CMultiplayRules *MultiplayRules() { return static_cast(g_pGameRules); } #endif // MULTIPLAY_GAMERULES_H