//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============ // // Purpose: CS-specific things to vote on // //============================================================================= #ifndef CS_VOTEISSUES_H #define CS_VOTEISSUES_H #ifdef _WIN32 #pragma once #endif #include "vote_controller.h" class CCSPlayer; //============================================================================= // do not re-order, stored in DB enum { kVoteKickBanPlayerReason_Other, kVoteKickBanPlayerReason_Cheating, kVoteKickBanPlayerReason_Idle, kVoteKickBanPlayerReason_Scamming, }; uint32 GetKickBanPlayerReason( const char *pReasonString ); //============= //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CBaseCSIssue : public CBaseIssue { // Overrides to BaseIssue standard to this mod. public: CBaseCSIssue( const char *typeString, CVoteController *pVoteController ) : CBaseIssue( typeString, pVoteController ) { } virtual int GetVoteIssue( void ) { return VOTEISSUE_UNDEFINED; } virtual const char *GetOtherTeamDisplayString() { return "#SFUI_otherteam_vote_unimplemented"; } }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CRestartGameIssue : public CBaseCSIssue { public: CRestartGameIssue( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_RESTARTGAME, pVoteController ) { } virtual void ExecuteCommand( void ); virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString(); virtual void ListIssueDetails( CBasePlayer *forWhom ); virtual bool IsAllyRestrictedVote( void ){ return false; } virtual const char *GetVotePassedString(); virtual int GetVoteIssue( void ) { return VOTEISSUE_RESTARTGAME; } }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CKickIssue : public CBaseCSIssue { public: CKickIssue( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_KICK, pVoteController ), m_bPlayerCrashed( false ) { } virtual void ExecuteCommand( void ); virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString( void ); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual const char *GetVotePassedString( void ); virtual bool IsAllyRestrictedVote( void ) { return true; } virtual void OnVoteFailed( void ); virtual void OnVoteStarted( void ); virtual const char *GetDetailsString( void ); virtual const char *GetOtherTeamDisplayString(); virtual int GetVoteIssue( void ) { return VOTEISSUE_KICK; } virtual bool IsEnabledInQueuedMatchmaking( void ) { return true; } // Query if the issue is supported in queued matchmaking mode private: void ExtractDataFromDetails( const char *pszDetails, CCSPlayer **pSubject, uint32 *pReason = NULL ); void NotifyGC( CCSPlayer *pSubject, bool bKickedSuccessfully, uint32 unReason ); CSteamID m_steamIDVoteCaller; CSteamID m_steamIDtoBan; bool m_bPlayerCrashed; }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CLoadBackupIssue : public CBaseCSIssue { public: CLoadBackupIssue( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_LOADBACKUP, pVoteController ) { m_szPrevDetailsString[ 0 ] = 0; m_szNiceName[ 0 ] = 0; } virtual void ExecuteCommand( void ); virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString( void ); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual const char *GetVotePassedString( void ); virtual bool IsAllyRestrictedVote( void ) { return false; } virtual void OnVoteFailed( void ); virtual const char *GetDetailsString( void ); virtual float GetFailedVoteLockOutTime( void ) { return 1.0; } virtual bool IsEnabledInQueuedMatchmaking( void ) { return true; } // Query if the issue is supported in queued matchmaking mode virtual int GetVoteIssue( void ) { return VOTEISSUE_LOADBACKUP; } private: CUtlVector< char const * > m_arrStrings; char m_szPrevDetailsString[MAX_PATH]; char m_szNiceName[MAX_PATH]; }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CChangeLevelIssue : public CBaseCSIssue { public: CChangeLevelIssue( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_CHANGELEVEL, pVoteController ) { } virtual void ExecuteCommand( void ); virtual bool IsAllyRestrictedVote( void ){ return false; } virtual bool IsEnabled( void ); virtual bool CanTeamCallVote( int iTeam ) const; // Can someone on the given team call this vote? virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString( void ); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual const char *GetVotePassedString( void ); virtual const char *GetDetailsString( void ); virtual bool IsYesNoVote( void ); virtual int GetVoteIssue( void ) { return VOTEISSUE_CHANGELEVEL; } }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CNextLevelIssue : public CBaseCSIssue { public: CNextLevelIssue( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_NEXTLEVEL, pVoteController ) { } virtual void ExecuteCommand( void ); virtual bool IsAllyRestrictedVote( void ){ return false; } virtual bool IsEnabled( void ); virtual bool CanTeamCallVote( int iTeam ) const; // Can someone on the given team call this vote? virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString( void ); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual const char *GetVotePassedString( void ); virtual const char *GetDetailsString( void ); virtual bool IsYesNoVote( void ); virtual int GetNumberVoteOptions( void ); virtual int GetVoteIssue( void ) { return VOTEISSUE_NEXTLEVEL; } private: CUtlVector m_IssueOptions; }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CScrambleTeams : public CBaseCSIssue { public: CScrambleTeams( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_SCRAMBLE, pVoteController ) { } virtual void ExecuteCommand( void ); virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString( void ); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual bool IsAllyRestrictedVote( void ){ return false; } virtual const char *GetVotePassedString( void ); virtual int GetVoteIssue( void ) { return VOTEISSUE_SCRAMBLE; } }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CSwapTeams : public CBaseCSIssue { public: CSwapTeams( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_SWAPTEAMS, pVoteController ) { } virtual void ExecuteCommand( void ); virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString( void ); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual bool IsAllyRestrictedVote( void ){ return false; } virtual const char *GetVotePassedString( void ); virtual int GetVoteIssue( void ) { return VOTEISSUE_SWAPTEAMS; } }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CPauseMatchIssue : public CBaseCSIssue { public: CPauseMatchIssue( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_PAUSEMATCH, pVoteController ) { } virtual void ExecuteCommand( void ); virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString( void ); virtual bool ShouldIgnoreCreationTimer( void ) { return true; } virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual int GetVotesRequiredToPass( void ){ return 1; } virtual const char *GetVotePassedString( void ); virtual float GetCommandDelay( void ) { return 0.0; } virtual bool IsEnabledDuringWarmup( void ) { return true; } // Can this vote be called during warmup? virtual float GetFailedVoteLockOutTime( void ) { return 1.0; } virtual bool IsEnabledInQueuedMatchmaking( void ) { return true; } // Query if the issue is supported in queued matchmaking mode virtual int GetVoteIssue( void ) { return VOTEISSUE_PAUSEMATCH; } }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CUnpauseMatchIssue : public CBaseCSIssue { public: CUnpauseMatchIssue( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_UNPAUSEMATCH, pVoteController ) { } virtual void ExecuteCommand( void ); virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString( void ); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual bool ShouldIgnoreCreationTimer( void ) { return true; } virtual bool IsUnanimousVoteToPass( void ) { return true; } // Requires all potential voters to pass virtual bool IsEnabledDuringWarmup( void ) { return true; } // Can this vote be called during warmup? virtual bool IsVoteCallExclusiveToSpectators( void ) { return true; } // Whether only spectators can call the vote virtual const char *GetVotePassedString( void ); virtual float GetFailedVoteLockOutTime( void ) { return 1.0; } virtual bool IsEnabledInQueuedMatchmaking( void ) { return true; } // Query if the issue is supported in queued matchmaking mode virtual int GetVoteIssue( void ) { return VOTEISSUE_UNPAUSEMATCH; } }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CReadyForMatchIssue : public CBaseCSIssue { public: CReadyForMatchIssue( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_READYFORMATCH, pVoteController ) { } virtual void ExecuteCommand( void ); virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString( void ); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual bool ShouldIgnoreCreationTimer( void ) { return true; } virtual bool IsUnanimousVoteToPass( void ) { return true; } // Requires all potential voters to pass virtual bool IsEnabledDuringWarmup( void ) { return true; } // Can this vote be called during warmup? virtual bool IsVoteCallExclusiveToSpectators( void ) { return true; } // Whether only spectators can call the vote virtual const char *GetVotePassedString( void ); virtual float GetFailedVoteLockOutTime( void ) { return 1.0; } virtual bool IsEnabledInQueuedMatchmaking( void ) { return true; } // Query if the issue is supported in queued matchmaking mode virtual int GetVoteIssue( void ) { return VOTEISSUE_READYFORMATCH; } }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CNotReadyForMatchIssue : public CBaseCSIssue { public: CNotReadyForMatchIssue( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_NOTREADYFORMATCH, pVoteController ) { } virtual void ExecuteCommand( void ); virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString( void ); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual int GetVotesRequiredToPass( void ){ return 1; } virtual float GetCommandDelay( void ) { return 0.0; } virtual bool ShouldIgnoreCreationTimer( void ) { return true; } virtual bool IsEnabledDuringWarmup( void ) { return true; } // Can this vote be called during warmup? virtual const char *GetVotePassedString( void ); virtual float GetFailedVoteLockOutTime( void ) { return 1.0; } virtual bool IsEnabledInQueuedMatchmaking( void ) { return true; } // Query if the issue is supported in queued matchmaking mode virtual int GetVoteIssue( void ) { return VOTEISSUE_NOTREADYFORMATCH; } }; class CStartTimeOutIssue : public CBaseCSIssue { public: CStartTimeOutIssue( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_STARTTIMEOUT, pVoteController ) { } virtual void ExecuteCommand( void ); virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual bool CanTeamCallVote( int iTeam ) const; // Can someone on the given team call this vote? virtual const char *GetDisplayString( void ); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual bool IsAllyRestrictedVote( void ) { return true; } virtual const char *GetVotePassedString( void ); virtual const char *GetOtherTeamDisplayString( ) { return "#SFUI_otherteam_vote_timeout"; } virtual bool IsEnabledInQueuedMatchmaking( void ) { return true; } // Query if the issue is supported in queued matchmaking mode virtual int GetVoteIssue( void ) { return VOTEISSUE_STARTTIMEOUT; } virtual vote_create_failed_t MakeVoteFailErrorCodeForClients( vote_create_failed_t eDefaultFailCode ); }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CSurrender : public CBaseCSIssue { public: CSurrender( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_SURRENDER, pVoteController ) { } virtual void ExecuteCommand( void ); virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual bool CanTeamCallVote( int iTeam ) const; virtual const char *GetDisplayString( void ); virtual const char *GetOtherTeamDisplayString(); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual bool IsAllyRestrictedVote( void ){ return true; } virtual const char *GetVotePassedString( void ); virtual bool IsEnabledInQueuedMatchmaking( void ) { return true; } // Query if the issue is supported in queued matchmaking mode virtual int GetVoteIssue( void ) { return VOTEISSUE_SURRENDER; } virtual bool IsUnanimousVoteToPass( void ) {return true; } // Requires all potential voters to pass virtual vote_create_failed_t MakeVoteFailErrorCodeForClients( vote_create_failed_t eDefaultFailCode ) { switch ( eDefaultFailCode ) { case VOTE_FAILED_WAITINGFORPLAYERS: case VOTE_FAILED_TEAM_CANT_CALL: return VOTE_FAILED_TOO_EARLY_SURRENDER; default: return eDefaultFailCode; } } }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CQueuedMatchmakingRematch : public CBaseCSIssue { public: CQueuedMatchmakingRematch( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_REMATCH, pVoteController ) { } virtual void ExecuteCommand( void ); virtual void OnVoteFailed( void ); // The moment the vote fails, also has some time for feedback before the window goes away virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString( void ); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual bool IsAllyRestrictedVote( void ){ return false; } virtual const char *GetVotePassedString( void ); virtual int GetVoteIssue( void ) { return VOTEISSUE_REMATCH; } virtual void OnVoteStarted( void ); virtual bool IsEnabledInQueuedMatchmaking( void ) { return true; } // Query if the issue is supported in queued matchmaking mode virtual vote_create_failed_t MakeVoteFailErrorCodeForClients( vote_create_failed_t eDefaultFailCode ) { return VOTE_FAILED_REMATCH; } public: static bool IsTimeForRematchVote(); }; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CQueuedMatchmakingContinue : public CBaseCSIssue { public: CQueuedMatchmakingContinue( CVoteController *pVoteController ) : CBaseCSIssue( VOTEISSUE_NAME_CONTINUE, pVoteController ) { } virtual void ExecuteCommand( void ); virtual void OnVoteFailed( void ); // The moment the vote fails, also has some time for feedback before the window goes away virtual bool IsEnabled( void ); virtual bool CanCallVote( int iEntIndex, const char *pszTypeString, const char *pszDetails, vote_create_failed_t &nFailCode, int &nTime ); virtual const char *GetDisplayString( void ); virtual void ListIssueDetails( CBasePlayer *pForWhom ); virtual bool IsAllyRestrictedVote( void ){ return false; } virtual const char *GetVotePassedString( void ); virtual int GetVoteIssue( void ) { return VOTEISSUE_CONTINUE; } virtual void OnVoteStarted( void ); virtual bool IsEnabledInQueuedMatchmaking( void ) { return true; } // Query if the issue is supported in queued matchmaking mode virtual bool IsUnanimousVoteToPass() { return true; } // Require all attending humans to vote virtual vote_create_failed_t MakeVoteFailErrorCodeForClients( vote_create_failed_t eDefaultFailCode ) { return VOTE_FAILED_CONTINUE; } }; #endif // CS_VOTEISSUES_H