diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/shared/achievementmgr.h | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/shared/achievementmgr.h')
| -rw-r--r-- | mp/src/game/shared/achievementmgr.h | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/mp/src/game/shared/achievementmgr.h b/mp/src/game/shared/achievementmgr.h new file mode 100644 index 00000000..6607d98d --- /dev/null +++ b/mp/src/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
|