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/achievementmgr.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/achievementmgr.h')
| -rw-r--r-- | game/shared/achievementmgr.h | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/game/shared/achievementmgr.h b/game/shared/achievementmgr.h new file mode 100644 index 0000000..c33261e --- /dev/null +++ b/game/shared/achievementmgr.h @@ -0,0 +1,183 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef ACHIEVEMENTMGR_H +#define ACHIEVEMENTMGR_H +#ifdef _WIN32 +#pragma once +#endif +#include "baseachievement.h" +#include "GameEventListener.h" +#include "hl2orange.spa.h" +#include "iachievementmgr.h" +#include "utlmap.h" +#ifndef NO_STEAM +#include "steam/steam_api.h" +#endif + +#define THINK_CLEAR -1 + +class CAchievementMgr : public CAutoGameSystemPerFrame, public CGameEventListener, public IAchievementMgr +{ +public: + //============================================================================= + // HPE_BEGIN + // [dwenger] Steam Cloud Support + //============================================================================= + + enum SteamCloudPersisting + { + SteamCloudPersist_Off = 0, + SteamCloudPersist_On, + }; + + CAchievementMgr( SteamCloudPersisting ePersistToSteamCloud = SteamCloudPersist_Off ); + + //============================================================================= + // HPE_END + //============================================================================= + + virtual bool Init(); + virtual void PostInit(); + virtual void Shutdown(); + virtual void LevelInitPreEntity(); + virtual void LevelShutdownPreEntity(); + virtual void InitializeAchievements(); + virtual void Update( float frametime ); +#ifdef GAME_DLL + virtual void FrameUpdatePostEntityThink(); +#endif + + void OnMapEvent( const char *pchEventName ); + + // Interfaces exported to other dlls for achievement list queries + IAchievement* GetAchievementByIndex( int index ); + int GetAchievementCount(); + + CBaseAchievement *GetAchievementByID( int iAchievementID ); + CUtlMap<int, CBaseAchievement *> &GetAchievements() { return m_mapAchievement; } + + CBaseAchievement *GetAchievementByName( const char *pchName ); + bool HasAchieved( const char *pchName ); + + void UploadUserData(); + void DownloadUserData(); + void SaveGlobalState( bool bAsync = false ); + void LoadGlobalState(); + void SaveGlobalStateIfDirty( bool bAsync = false ); + void EnsureGlobalStateLoaded(); + void AwardAchievement( int iAchievementID ); + void UpdateAchievement( int iAchievementID, int nData ); + void PreRestoreSavedGame(); + void PostRestoreSavedGame(); + void ResetAchievements(); + void ResetAchievement( int iAchievementID ); + void PrintAchievementStatus(); + float GetLastClassChangeTime() { return m_flLastClassChangeTime; } + float GetTeamplayStartTime() { return m_flTeamplayStartTime; } + int GetMiniroundsCompleted() { return m_iMiniroundsCompleted; } + const char *GetMapName() { return m_szMap; } + void OnAchievementEvent( int iAchievementID, int iCount = 1 ); + + void CheckMetaAchievements( void ); + + void SetDirty( bool bDirty ) + { + if (bDirty) + { + m_bGlobalStateDirty = true; + m_bSteamDataDirty = true; + } + } + + //============================================================================= + // HPE_END + //============================================================================= + + bool CheckAchievementsEnabled(); + bool LoggedIntoSteam() + { +#if !defined(NO_STEAM) + return ( steamapicontext->SteamUser() && steamapicontext->SteamUserStats() && steamapicontext->SteamUser()->BLoggedOn() ); +#else + return false; +#endif + } + float GetTimeLastUpload() { return m_flTimeLastSaved; } // time we last uploaded to Steam + + bool WereCheatsEverOn( void ) { return m_bCheatsEverOn; } + +#if !defined(NO_STEAM) + STEAM_CALLBACK( CAchievementMgr, Steam_OnUserStatsReceived, UserStatsReceived_t, m_CallbackUserStatsReceived ); + STEAM_CALLBACK( CAchievementMgr, Steam_OnUserStatsStored, UserStatsStored_t, m_CallbackUserStatsStored ); +#endif + + void SetAchievementThink( CBaseAchievement *pAchievement, float flThinkTime ); + +private: + void FireGameEvent( IGameEvent *event ); + void OnKillEvent( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ); + void ResetAchievement_Internal( CBaseAchievement *pAchievement ); + void UpdateStateFromSteam_Internal(); + + CUtlMap<int, CBaseAchievement *> m_mapAchievement; // map of all achievements + CUtlVector<CBaseAchievement *> m_vecAchievement; // vector of all achievements for accessing by index + CUtlVector<CBaseAchievement *> m_vecKillEventListeners; // vector of achievements that are listening for kill events + CUtlVector<CBaseAchievement *> m_vecMapEventListeners; // vector of achievements that are listening for map events + CUtlVector<CBaseAchievement *> m_vecComponentListeners; // vector of achievements that are listening for components that make up an achievement + CUtlMap<int, CAchievement_AchievedCount *> m_mapMetaAchievement; // map of CAchievement_AchievedCount + + struct achievementthink_t + { + float m_flThinkTime; + CBaseAchievement *pAchievement; + }; + CUtlVector<achievementthink_t> m_vecThinkListeners; // vector of achievements that are actively thinking + + float m_flLevelInitTime; + + float m_flLastClassChangeTime; // Time when player last changed class + float m_flTeamplayStartTime; // Time when player joined a non-spectating team. Not updated if she switches game teams; cleared if she joins spectator + float m_iMiniroundsCompleted; // # of minirounds played since game start (for maps that have minirounds) + char m_szMap[MAX_PATH]; // file base of map name, cached since we access it frequently in this form + bool m_bGlobalStateDirty; // do we have interesting state changes that needs to be saved? + bool m_bSteamDataDirty; // do we have changes to upload to Steamworks? + bool m_bGlobalStateLoaded; // have we loaded global state + bool m_bCheatsEverOn; // have cheats ever been turned on in this level + float m_flTimeLastSaved; // last time we uploaded to Steam + + //============================================================================= + // HPE_BEGIN + // [dwenger] Steam Cloud Support + //============================================================================= + + bool m_bPersistToSteamCloud; // true = persist data to steam cloud + + //============================================================================= + // HPE_END + //============================================================================= + + CUtlVector<int> m_AchievementsAwarded; +}; + +// helper functions +const char *GetModelName( CBaseEntity *pBaseEntity ); + +#ifdef CLIENT_DLL +bool CalcPlayersOnFriendsList( int iMinPlayers ); +bool CalcHasNumClanPlayers( int iClanTeammates ); +int CalcPlayerCount(); +int CalcTeammateCount(); +#endif // CLIENT + +class IMatchmaking; +extern ConVar cc_achievement_debug; +extern IMatchmaking *matchmaking; + +#ifdef CLIENT_DLL +void MsgFunc_AchievementEvent( bf_read &msg ); +#endif // CLIENT_DLL +#endif // ACHIEVEMENTMGR_H |