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/shared_object_tracker.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/shared_object_tracker.h')
| -rw-r--r-- | game/shared/tf/shared_object_tracker.h | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/game/shared/tf/shared_object_tracker.h b/game/shared/tf/shared_object_tracker.h new file mode 100644 index 0000000..e3bf2b0 --- /dev/null +++ b/game/shared/tf/shared_object_tracker.h @@ -0,0 +1,172 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef SHARED_OBJECT_MANAGER_H +#define SHARED_OBJECT_MANAGER_H + +#include "GameEventListener.h" +#include "econ_item_constants.h" +#include "econ_item_inventory.h" + +#ifdef GAME_DLL + #include "tf_player.h" +#else + #include "c_tf_player.h" + #include "local_steam_shared_object_listener.h" +#endif + + +#if defined( _WIN32 ) +#pragma once +#endif + +using namespace GCSDK; +class CSOTrackerManager; + +extern short g_nQuestSpewFlags; +#define SO_TRACKER_SPEW_OBJECTIVES 1<<0 +#define SO_TRACKER_SPEW_ITEM_TRACKER_MANAGEMENT 1<<1 +#define SO_TRACKER_SPEW_GC_COMMITS 1<<2 +#define SO_TRACKER_SPEW_OBJECTIVE_TRACKER_MANAGEMENT 1<<3 +#define SO_TRACKER_SPEW_SOCACHE_ACTIVITY 1<<4 +#define SO_TRACKER_SPEW_TRACKER_ACCEPTANCE 1<<5 +void SOTrackerSpew( const char* pszBuff, int nType ); +#define SO_TRACKER_SPEW( pszBuff, nType ) SOTrackerSpew( pszBuff, nType ); + +class CBaseSOTracker +{ +public: + DECLARE_CLASS_NOBASE( CBaseSOTracker ) + + CBaseSOTracker( const CSharedObject* pSObject, CSteamID steamIDOwner, CSOTrackerManager* pManager ); + virtual ~CBaseSOTracker(); + + const CSharedObject* GetSObject() const { return m_pSObject; } + const CSteamID GetOwnerSteamID() const { return m_steamIDOwner; } + const CTFPlayer* GetTrackedPlayer() const { return ToTFPlayer( GetPlayerBySteamID( m_steamIDOwner ) ); } + virtual void Spew() const; + + virtual void CommitChangesToDB() = 0; + virtual void OnUpdate() = 0; + virtual void OnRemove() = 0; +protected: + + const CSharedObject* m_pSObject; + CSteamID m_steamIDOwner; + CSOTrackerManager* m_pManager; +}; + +struct CommitRecord_t +{ + CommitRecord_t( ::google::protobuf::Message* pMessage ) + : m_flLastCommitTime( Plat_FloatTime() ) + , m_flReportedTime( Plat_FloatTime() ) + , m_pProtoMsg( pMessage ) + {} + + ~CommitRecord_t() + { + if ( m_pProtoMsg ) + delete m_pProtoMsg; + } + + double m_flLastCommitTime; + double m_flReportedTime; + ::google::protobuf::Message* m_pProtoMsg; + +private: + CommitRecord_t(); // Nope +}; +typedef CUtlMap< uint64, CommitRecord_t* > CommitsMap_t; + +// A class to handle the creation and deletion of shared object trackers. Automatically +// subscribes to the local player's SOCache and will subscribe to any connecting players' +// SOCaches when they connect. +#ifdef GAME_DLL +class CSOTrackerManager : public ISharedObjectListener, public CGameEventListener, public CAutoGameSystemPerFrame +#else +class CSOTrackerManager : public CLocalSteamSharedObjectListener, public CGameEventListener, public CAutoGameSystemPerFrame +#endif +{ +public: + + DECLARE_CLASS_NOBASE( CSOTrackerManager ) + + typedef CUtlMap< uint64, CBaseSOTracker * > SOTrackerMap_t; + + CSOTrackerManager(); + virtual ~CSOTrackerManager(); + + virtual void Initialize(); + virtual void Shutdown(); + + virtual void FireGameEvent( IGameEvent *pEvent ) OVERRIDE; + void EnsureTrackersForPlayer( const CSteamID& steamIDPlayer ); + void EnsureTrackersForPlayer( CTFPlayer* pPlayer ); + + void SOCreated( const CSteamID & steamIDOwner, const CSharedObject *pObject, ESOCacheEvent eEvent ) OVERRIDE; + void PreSOUpdate( const CSteamID & steamIDOwner, ESOCacheEvent eEvent ) OVERRIDE {}; + void SOUpdated( const CSteamID & steamIDOwner, const CSharedObject *pObject, ESOCacheEvent eEvent ) OVERRIDE; + void PostSOUpdate( const CSteamID & steamIDOwner, ESOCacheEvent eEvent ) OVERRIDE {}; + void SODestroyed( const CSteamID & steamIDOwner, const CSharedObject *pObject, ESOCacheEvent eEvent ) OVERRIDE; + void SOCacheSubscribed( const CSteamID & steamIDOwner, ESOCacheEvent eEvent ) OVERRIDE; + void SOCacheUnsubscribed( const CSteamID & steamIDOwner, ESOCacheEvent eEvent ) OVERRIDE; + +#ifdef GAME_DLL + virtual void FrameUpdatePreEntityThink() OVERRIDE; + void AddCommitRecord( const ::google::protobuf::Message* pRecord, uint64 nKey, bool bRequireResponse ); + void AcknowledgeCommit( const ::google::protobuf::Message* pRecord, uint64 nKey ); + void DBG_SpewPendingCommits(); +#endif + void Spew(); + + + virtual SOTrackerMap_t::KeyType_t GetKeyForObjectTracker( const CSharedObject* pItem, CSteamID steamIDOwner ) = 0; + CBaseSOTracker* GetTracker( SOTrackerMap_t::KeyType_t nKey ) const; + template< class T > + T GetTypedTracker( SOTrackerMap_t::KeyType_t nKey ) const { return assert_cast< T >( GetTracker( nKey ) ); } + CommitRecord_t* GetCommitRecord( CommitsMap_t::KeyType_t ); +protected: + + enum ETrackerHandling_t + { + TRACKER_CREATE_OR_UPDATE = 0, + TRACKER_REMOVE, + }; + + void UpdateTrackerForItem( const CSharedObject* pItem, ETrackerHandling_t eHandling, CSteamID steamIDOwner ); + +private: + + virtual int GetType() const = 0; + virtual const char* GetName() const = 0; + virtual CFmtStr GetDebugObjectDescription( const CSharedObject* pItem ) const = 0; + virtual CBaseSOTracker* AllocateNewTracker( const CSharedObject* pItem, CSteamID steamIDOwner, CSOTrackerManager* pManager ) const = 0; + virtual ::google::protobuf::Message* AllocateNewProtoMessage() const = 0; + virtual void OnCommitRecieved( const ::google::protobuf::Message* pProtoMsg ) = 0; + virtual bool ShouldTrackObject( const CSteamID & steamIDOwner, const CSharedObject *pObject ) const = 0; + virtual int CompareRecords( const ::google::protobuf::Message* pNewProtoMsg, const ::google::protobuf::Message* pExistingProtoMsg ) const = 0; + + void HandleSOEvent( const CSteamID & steamIDOwner, const CSharedObject *pObject, ETrackerHandling_t eHandling ); + void CommitAllChanges(); + void CreateAndAddTracker( const CSharedObject* pItem, CSteamID steamIDOwner ); + void RemoveAndDeleteTrackerAtIndex( SOTrackerMap_t::IndexType_t idx ); + void RemoveTrackersForSteamID( const CSteamID & steamIDOwner ); + +#ifdef GAME_DLL + void CommitRecord( CommitRecord_t* pRecord ) const; + virtual void SendMessageForCommit( const ::google::protobuf::Message* pProtoMessage ) const = 0; +#endif + + double m_flLastUnacknowledgeCommitTime; + CommitsMap_t m_mapUnacknowledgedCommits; + SOTrackerMap_t m_mapItemTrackers; +}; + + + +#endif // SHARED_OBJECT_MANAGER_H |