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/client/econ/client_community_market.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/econ/client_community_market.cpp')
| -rw-r--r-- | game/client/econ/client_community_market.cpp | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/game/client/econ/client_community_market.cpp b/game/client/econ/client_community_market.cpp new file mode 100644 index 0000000..e1aa9cc --- /dev/null +++ b/game/client/econ/client_community_market.cpp @@ -0,0 +1,107 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// + +#include "cbase.h" +#include "econ_gcmessages.h" +#include "econ_item_system.h" +#include "econ_ui.h" +#include "store/store_panel.h" +#include "gc_clientsystem.h" +#include "client_community_market.h" + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +static const float s_fUpdateTimeInSeconds = 60.0f * 15.0f; + +typedef CUtlMap< steam_market_gc_identifier_t, client_market_data_t, unsigned int > ClientMarketDataMap_t; +static ClientMarketDataMap_t s_mapClientMarketData; +static float g_fClientMarketDataLastUpdateTime = -s_fUpdateTimeInSeconds; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +static void ClientMarketData_Refresh() +{ + if ( !EconUI() || !EconUI()->GetStorePanel() ) + return; + + GCSDK::CProtoBufMsg<CMsgGCClientMarketDataRequest> msg( k_EMsgGCClientRequestMarketData ); + msg.Body().set_user_currency( EconUI()->GetStorePanel()->GetCurrency() ); + GCClientSystem()->BSendMessage( msg ); + + g_fClientMarketDataLastUpdateTime = engine->Time(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +const client_market_data_t *GetClientMarketData( const steam_market_gc_identifier_t& ident ) +{ + // If our data is out of date, request fresh data from the GC. We don't need up-to-the-minute + // numbers but we don't want to fall too far behind. THe GC itself doesn't update in realtime + // so constantly querying for updates isn't really useful. We'll still use whatever data if any + // we have for this call. + if ( (engine->Time() - g_fClientMarketDataLastUpdateTime) >= s_fUpdateTimeInSeconds ) + { + ClientMarketData_Refresh(); + } + + // Not having any data on this item isn't an error. We might be requesting something for an + // unlistable item, or we might not have current information from the GC yet. + if ( s_mapClientMarketData.Count() == 0 ) + return NULL; + + // Remap this index? + steam_market_gc_identifier_t searchIdent = ident; + searchIdent.m_unDefIndex = GetItemSchema()->GetCommunityMarketRemappedDefinitionIndex( ident.m_unDefIndex ); + + ClientMarketDataMap_t::IndexType_t index = s_mapClientMarketData.Find( searchIdent ); + if ( index == s_mapClientMarketData.InvalidIndex() ) + return NULL; + + return &s_mapClientMarketData[index]; +} +//----------------------------------------------------------------------------- +const client_market_data_t *GetClientMarketData( item_definition_index_t iItemDef, uint8 unQuality ) +{ + steam_market_gc_identifier_t ident; + ident.m_unDefIndex = iItemDef; + ident.m_unQuality = unQuality; + + return GetClientMarketData( ident ); +} +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CGCClientRequestMarketDataResponse : public GCSDK::CGCClientJob +{ +public: + CGCClientRequestMarketDataResponse( GCSDK::CGCClient *pClient ) : GCSDK::CGCClientJob( pClient ) {} + + virtual bool BYieldingRunGCJob( GCSDK::IMsgNetPacket *pNetPacket ) + { + GCSDK::CProtoBufMsg<CMsgGCClientMarketData> msg( pNetPacket ); + + s_mapClientMarketData.RemoveAll(); + s_mapClientMarketData.SetLessFunc( DefLessFunc( ClientMarketDataMap_t::KeyType_t ) ); + + for ( int i = 0; i < msg.Body().entries_size(); i++ ) + { + const CMsgGCClientMarketDataEntry& entry = msg.Body().entries( i ); + + steam_market_gc_identifier_t ident; + ident.m_unDefIndex = entry.item_def_index(); + ident.m_unQuality = entry.item_quality(); + + client_market_data_t data; + data.m_unQuantityAvailable = entry.item_sell_listings(); + data.m_unLowestPrice = entry.price_in_local_currency(); + + s_mapClientMarketData.Insert( ident, data ); + } + + return true; + } + +}; +GC_REG_JOB( GCSDK::CGCClient, CGCClientRequestMarketDataResponse, "CGCClientRequestMarketDataResponse", k_EMsgGCClientRequestMarketDataResponse, GCSDK::k_EServerTypeGCClient );
\ No newline at end of file |