diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/tf/tf_match_description.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/tf/tf_match_description.h')
| -rw-r--r-- | game/shared/tf/tf_match_description.h | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/game/shared/tf/tf_match_description.h b/game/shared/tf/tf_match_description.h new file mode 100644 index 0000000..4eeb2e8 --- /dev/null +++ b/game/shared/tf/tf_match_description.h @@ -0,0 +1,258 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef TF_MATCH_DESCRIPTION_H +#define TF_MATCH_DESCRIPTION_H +#ifdef _WIN32 +#pragma once +#endif + +#include "tf_matchmaking_shared.h" +#ifdef CLIENT_DLL +#include "basemodel_panel.h" +#endif // CLIENT_DLL + +#ifdef GAME_DLL + // Can't foward declare CMatchInfo::PlayerMatchData_t because C++. Bummer. + #include "tf_gc_server.h" +#endif + + +#ifdef GC_DLL + class CTFLobby; + class CTFParty; + struct MatchDescription_t; + struct MatchParty_t; +#endif + +class CSOTFLadderData; + +enum EMatchType_t +{ + MATCH_TYPE_NONE = 0, + MATCH_TYPE_MVM, + MATCH_TYPE_COMPETITIVE, + MATCH_TYPE_CASUAL +}; + +struct LevelInfo_t +{ + uint32 m_nLevelNum; + uint32 m_nStartXP; // Inclusive + uint32 m_nEndXP; // Non-inclusive + const char* m_pszLevelIcon; // Kill this when we do models + const char* m_pszLevelTitle; + const char* m_pszLevelUpSound; + const char* m_pszLobbyBackgroundImage; +}; + +struct XPSourceDef_t +{ + const char* m_pszSoundName; + const char* m_pszFormattingLocToken; + const char* m_pszTypeLocToken; + float m_flValueMultiplier; +}; + +extern const XPSourceDef_t g_XPSourceDefs[ CMsgTFXPSource_XPSourceType_NUM_SOURCE_TYPES ]; + +class IProgressionDesc +{ +public: + IProgressionDesc( EMatchGroup eMatchGroup + , const char* pszBadgeName + , const char* pszProgressionResFile + , const char* pszLevelToken ); + +#ifdef CLIENT_DLL + virtual void SetupBadgePanel( CBaseModelPanel *pModelPanel, const LevelInfo_t& level ) const = 0; + virtual const uint32 GetLocalPlayerLastAckdExperience() const = 0; + virtual const uint32 GetPlayerExperienceBySteamID( CSteamID steamid ) const = 0; + virtual const LevelInfo_t& YieldingGetLevelForSteamID( const CSteamID& steamID ) const; +#endif // CLIENT_DLL +#if defined GC_DLL + // XXX(JohnS): This should go away once XP is just a rating type, no need for match description to have different + // implementations of how the job does it. + virtual bool BYldAcknowledgePlayerXPOnTransaction( CSQLAccess &transaction, CTFSharedObjectCache *pLockedSOCache ) const = 0; + // XXX(JohnS): Same, this is super specific and hacky. + virtual const bool BRankXPIsActuallyPrimaryMMRating() const = 0; +#endif // defined GC_DLL + virtual const LevelInfo_t& GetLevelForExperience( uint32 nExperience ) const; + const LevelInfo_t& GetLevelByNumber( uint32 nNumber ) const; + uint32 GetNumLevels() const { return m_vecLevels.Count(); } + +#if defined GC_DLL || ( defined STAGING_ONLY && defined CLIENT_DLL ) + virtual void DebugSpewLevels() const = 0; +#endif + + const CUtlString m_strBadgeName; + const char* m_pszLevelToken; + const char* m_pszProgressionResFile; + +protected: +#ifdef CLIENT_DLL + void EnsureBadgePanelModel( CBaseModelPanel *pModelPanel ) const; +#endif + + const EMatchGroup m_eMatchGroup; + CUtlVector< LevelInfo_t > m_vecLevels; +}; + +struct MatchDesc_t +{ + EMatchMode m_eLateJoinMode; + EMMPenaltyPool m_ePenaltyPool; + bool m_bUsesSkillRatings; + bool m_bSupportsLowPriorityQueue; + bool m_bRequiresMatchID; + const ConVar* m_pmm_required_score; + bool m_bUseMatchHud; + const char* m_pszExecFileName; + const ConVar* m_pmm_match_group_size; + const ConVar* m_pmm_match_group_size_minimum; // Optional + EMatchType_t m_eMatchType; + bool m_bShowPreRoundDoors; + bool m_bShowPostRoundDoors; + const char* m_pszMatchEndKickWarning; + const char* m_pszMatchStartSound; + bool m_bAutoReady; + bool m_bShowRankIcons; + bool m_bUseMatchSummaryStage; + bool m_bDistributePerformanceMedals; + bool m_bIsCompetitiveMode; + bool m_bUseFirstBlood; + bool m_bUseReducedBonusTime; + bool m_bUseAutoBalance; + bool m_bAllowTeamChange; + bool m_bRandomWeaponCrits; + bool m_bFixedWeaponSpread; + // If we should not allow match to complete without a complete set of players. + bool m_bRequireCompleteMatch; + bool m_bTrustedServersOnly; + bool m_bForceClientSettings; + bool m_bAllowDrawingAtMatchSummary; + bool m_bAllowSpecModeChange; + bool m_bAutomaticallyRequeueAfterMatchEnds; + bool m_bUsesMapVoteOnRoundEnd; + bool m_bUsesXP; + bool m_bUsesDashboardOnRoundEnd; + bool m_bUsesSurveys; + // Be strict about finding quality matches, for more-competitive matchgroups that want to prioritize match quality + // over speed. + bool m_bStrictMatchmakerScoring; +}; + +class IMatchGroupDescription +{ +public: + + IMatchGroupDescription( EMatchGroup eMatchGroup, const MatchDesc_t& params ) + : m_eMatchGroup( eMatchGroup ) + , m_params( params ) + , m_pProgressionDesc( NULL ) + {} + + +#ifdef GC_DLL + // What rating the matchmaker should use to evaluate players in this matchgroup + virtual EMMRating PrimaryMMRatingBackend() const = 0; + + // What ratings match results in this ladder group should run updates on + virtual const std::vector< EMMRating > &MatchResultRatingBackends() const = 0; + + // When creating a match from the first party, what to copy over + virtual bool InitMatchFromParty( MatchDescription_t* pMatch, const MatchParty_t* pParty ) const = 0; + + // When finding late joiners for an already-in-play lobby + virtual bool InitMatchFromLobby( MatchDescription_t* pMatch, CTFLobby* pLobby ) const = 0; + + // Sync a match party with a CTFParty + virtual void SyncMatchParty( const CTFParty *pParty, MatchParty_t *pMatchParty ) const = 0; + + // A match has formed, what game mode paremeters do we want to set? (ie. MvM Popfile, 12v12 map, etc) + virtual void SelectModeSpecificParameters( const MatchDescription_t* pMatch, CTFLobby* pLobby ) const = 0; + + // Get which server pool to use + virtual int GetServerPoolIndex( EMatchGroup eGroup, EMMServerMode eMode ) const; + + // Get server details + virtual void GetServerDetails( const CMsgGameServerMatchmakingStatus& msg, int& nChallengeIndex, const char* pszMap ) const = 0; + + virtual const char* GetUnauthorizedPartyReason( CTFParty* pParty ) const = 0; + + virtual void Dump( const char *pszLeader, int nSpewLevel, int nLogLevel, const MatchParty_t* pMatch ) const = 0; + + // + // Threaded calls. These are called in work items, and should be pure functions + // + + // Check if pMatch is compatible with pCandidateParty -- that is, if BIntersectMatchWithParty would succeed. + virtual bool BThreadedPartyCompatibleWithMatch( const MatchDescription_t* pMatch, const MatchParty_t *pCurrentParty ) const = 0; + + // When adding a party to a match, what intersection of current state with the incoming party gets copied to the + // match. This returns false if the party isn't compatible, e.g. if !BThreadedPartyCompatibleWithMatch + virtual bool BThreadedIntersectMatchWithParty( MatchDescription_t* pMatch, const MatchParty_t* pParty ) const = 0; + + // Check if two parties are compatible, that is, if they could be added to the same match absent other criteria + virtual bool BThreadedPartiesCompatible( const MatchParty_t *pLeftParty, const MatchParty_t *pRightParty ) const = 0; +#endif + +#ifdef CLIENT_DLL + virtual bool BGetRoundStartBannerParameters( int& nSkin, int& nBodyGroup ) const = 0; + virtual bool BGetRoundDoorParameters( int& nSkin, int& nLogoBodyGroup ) const = 0; + virtual const char *GetMapLoadBackgroundOverride( bool bWideScreen ) const = 0; +#endif + +#ifdef GAME_DLL + // ! Check return, we might fail to setup + virtual bool InitServerSettingsForMatch( const CTFGSLobby* pLobby ) const; + virtual void InitGameRulesSettings() const = 0; + virtual void InitGameRulesSettingsPostEntity() const = 0; + virtual void PostMatchClearServerSettings() const = 0; + virtual bool ShouldRequestLateJoin() const = 0; + virtual bool BMatchIsSafeToLeaveForPlayer( const CMatchInfo* pMatchInfo, const CMatchInfo::PlayerMatchData_t *pMatchPlayer ) const = 0; + virtual bool BPlayWinMusic( int nWinningTeam, bool bGameOver ) const = 0; +#endif + + // Accessors for param values + inline int GetMatchSize() const { return m_params.m_pmm_match_group_size->GetInt(); } + inline bool BShouldAutomaticallyRequeueOnMatchEnd() const { return m_params.m_bAutomaticallyRequeueAfterMatchEnds; } + inline bool BUsesMapVoteAfterMatchEnds() const { return m_params.m_bUsesMapVoteOnRoundEnd; } + inline bool BUsesXP() const { return m_params.m_bUsesXP; } + inline bool BUsesDashboard() const { return m_params.m_bUsesDashboardOnRoundEnd; } + inline bool BUsesStrictMatchmakerScoring() const { return m_params.m_bStrictMatchmakerScoring; } + inline bool BRequiresCompleteMatches() const { return m_params.m_bRequireCompleteMatch; } + inline bool BRequiresMatchID() const { return m_params.m_bRequiresMatchID; } + + // Meta-permissions that are based on other set flags + // + // Only match-vote modes need this ability right now + inline bool BCanServerRequestNewMatchForLobby() const { return BUsesMapVoteAfterMatchEnds(); } + // Auto-balance and anything that is allowed to roll new match lobbies needs to have this ability (for speculative + // matches if the GC is unavailable). It should be possible to add a mode where we do rolling matches, but only + // when the GC is responding, which would not need the unilateral-team-assignment ability + inline bool BCanServerChangeMatchPlayerTeams() const { return BCanServerRequestNewMatchForLobby() || m_params.m_bUseAutoBalance; } + +#ifdef GC_DLL + inline bool BUsesSkillRatings() const { return m_params.m_bUsesSkillRatings; } + inline int GetMinimumMatchSize() const + { + int min = m_params.m_pmm_match_group_size_minimum ? m_params.m_pmm_match_group_size_minimum->GetInt() : -1; + return ( min >= 0 ) ? min : GetMatchSize(); + } + inline bool BUsesSurveys() const { return m_params.m_bUsesSurveys; } +#endif + + inline bool BIsTrustedServersOnly() const { return m_params.m_bTrustedServersOnly; } + + const EMatchGroup m_eMatchGroup; + const MatchDesc_t m_params; + const IProgressionDesc* m_pProgressionDesc; +}; + +const IMatchGroupDescription* GetMatchGroupDescription( const EMatchGroup& eGroup ); + +#endif //TF_MATCH_DESCRIPTION_H |