//========= Copyright Valve Corporation, All rights reserved. ============// // //============================================================================= #ifndef BASEMULTIPLAYERPLAYER_H #define BASEMULTIPLAYERPLAYER_H #pragma once #include "ai_speech.h" #include "player.h" //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CBaseMultiplayerPlayer : public CAI_ExpresserHost { DECLARE_CLASS(CBaseMultiplayerPlayer, CAI_ExpresserHost); public: CBaseMultiplayerPlayer(); ~CBaseMultiplayerPlayer(); virtual void Spawn(void); virtual void PostConstructor(const char *szClassname); virtual void ModifyOrAppendCriteria(AI_CriteriaSet &criteriaSet); virtual bool SpeakIfAllowed(AIConcept_t concept, const char *modifiers = NULL, char *pszOutResponseChosen = NULL, size_t bufsize = 0, IRecipientFilter *filter = NULL); virtual IResponseSystem *GetResponseSystem(); bool SpeakConcept(AI_Response &response, int iConcept); virtual bool SpeakConceptIfAllowed(int iConcept, const char *modifiers = NULL, char *pszOutResponseChosen = NULL, size_t bufsize = 0, IRecipientFilter *filter = NULL); virtual bool CanHearAndReadChatFrom(CBasePlayer *pPlayer); virtual bool CanSpeak(void) { return true; } virtual bool CanBeAutobalanced() { return true; } virtual void Precache(void) { PrecacheParticleSystem("achieved"); BaseClass::Precache(); } virtual bool ClientCommand(const CCommand &args); virtual bool CanSpeakVoiceCommand(void) { return true; } virtual bool ShouldShowVoiceSubtitleToEnemy(void); virtual void NoteSpokeVoiceCommand(const char *pszScenePlayed) {} virtual void OnAchievementEarned(int iAchievement) {} enum { CHAT_IGNORE_NONE = 0, CHAT_IGNORE_ALL, CHAT_IGNORE_TEAM, }; int m_iIgnoreGlobalChat; //--------------------------------- // Speech support virtual CAI_Expresser *GetExpresser() { return m_pExpresser; } virtual CMultiplayer_Expresser *GetMultiplayerExpresser() { return m_pExpresser; } void SetLastForcedChangeTeamTimeToNow(void) { m_flLastForcedChangeTeamTime = gpGlobals->curtime; } float GetLastForcedChangeTeamTime(void) { return m_flLastForcedChangeTeamTime; } void SetTeamBalanceScore(int iScore) { m_iBalanceScore = iScore; } int GetTeamBalanceScore(void) { return m_iBalanceScore; } virtual int CalculateTeamBalanceScore(void); void AwardAchievement(int iAchievement, int iCount = 1); int GetPerLifeCounterKV(const char *name); void SetPerLifeCounterKV(const char *name, int value); void ResetPerLifeCounters(void); KeyValues *GetPerLifeCounterKeys(void) { return m_pAchievementKV; } void EscortScoringThink(void); void StartScoringEscortPoints(float flRate); void StopScoringEscortPoints(void); float m_flAreaCaptureScoreAccumulator; float m_flCapPointScoreRate; float GetConnectionTime(void) { return m_flConnectionTime; } // Command rate limiting. bool ShouldRunRateLimitedCommand(const CCommand &args); bool ShouldRunRateLimitedCommand(const char *pszCommand); protected: virtual CAI_Expresser *CreateExpresser(void); int m_iCurrentConcept; private: //--------------------------------- CMultiplayer_Expresser *m_pExpresser; float m_flConnectionTime; float m_flLastForcedChangeTeamTime; int m_iBalanceScore; // a score used to determine which players are // switched to balance the teams KeyValues *m_pAchievementKV; // This lets us rate limit the commands the players can execute so they // don't overflow things like reliable buffers. CUtlDict m_RateLimitLastCommandTimes; }; //----------------------------------------------------------------------------- // Inline methods //----------------------------------------------------------------------------- inline CBaseMultiplayerPlayer *ToBaseMultiplayerPlayer(CBaseEntity *pEntity) { if (!pEntity || !pEntity->IsPlayer()) return NULL; #if _DEBUG return dynamic_cast(pEntity); #else return static_cast(pEntity); #endif } #endif // BASEMULTIPLAYERPLAYER_H