diff --git a/dll/steam_inventory.h b/dll/steam_inventory.h
index 2b4d93e..fcb672b 100644
--- a/dll/steam_inventory.h
+++ b/dll/steam_inventory.h
@@ -15,7 +15,7 @@
License along with the Goldberg Emulator; if not, see
. */
-#include "base.h"
+#include "item_db_loader.h"
struct Steam_Inventory_Requests {
double timeout = 0.1;
@@ -34,11 +34,10 @@ struct Steam_Inventory_Requests {
}
};
-
class Steam_Inventory :
-public ISteamInventory001,
-public ISteamInventory002,
-public ISteamInventory
+ public ISteamInventory001,
+ public ISteamInventory002,
+ public ISteamInventory
{
class Settings *settings;
class SteamCallResults *callback_results;
@@ -47,6 +46,18 @@ public ISteamInventory
std::vector inventory_requests;
struct Steam_Inventory_Requests *new_inventory_result(const SteamItemInstanceID_t *pInstanceIDs=NULL, uint32 unCountInstanceIDs=0)
+ std::map> items;
+ // Like typedefs
+ using item_iterator = std::map>::iterator;
+ using attr_iterator = std::map::iterator;
+
+ // Set this to false when we have cached everything,
+ // reset to true if something changed in the item db.
+ // Could use inotify on linux
+ // Could use FindFirstChangeNotificationA + WaitForSingleObject + FindNextChangeNotification on Windows to monitor the db file
+ // Or find a server somewhere to hold the data for us then cache on local settings.
+ bool need_load_definitions = true;
+
{
static SteamInventoryResult_t result;
++result;
@@ -76,6 +87,7 @@ struct Steam_Inventory_Requests *get_inventory_result(SteamInventoryResult_t res
public:
Steam_Inventory(class Settings *settings, class SteamCallResults *callback_results, class SteamCallBacks *callbacks)
+ items(read_items_db(Local_Storage::get_program_path() + PATH_SEPARATOR + "steam_items.json"))
{
this->settings = settings;
this->callbacks = callbacks;
@@ -122,7 +134,19 @@ bool GetResultItems( SteamInventoryResult_t resultHandle,
if (!request) return false;
if (!request->result_done()) return false;
- if (punOutItemsArraySize) *punOutItemsArraySize = 0;
+ if (pOutItemsArray != nullptr)
+ {
+ for (auto& i : items)
+ {
+ pOutItemsArray->m_iDefinition = i.first;
+ pOutItemsArray->m_itemId = i.first;
+ pOutItemsArray->m_unQuantity = 1;
+ pOutItemsArray->m_unFlags = k_ESteamItemNoTrade;
+ ++pOutItemsArray;
+ }
+ }
+
+ if (punOutItemsArraySize)* punOutItemsArraySize = items.size();
PRINT_DEBUG("GetResultItems good\n");
return true;
}
@@ -227,6 +251,17 @@ bool GetAllItems( SteamInventoryResult_t *pResultHandle )
*pResultHandle = request->inventory_result;
return true;
}
+ else
+ {
+ //Steam_Client::RegisterCallback : SteamInventoryResultReady_t
+ //Steam_Client::RegisterCallback : SteamInventoryDefinitionUpdate_t
+ //Steam_Client::RegisterCallback : DownloadItemResult_t
+ struct Steam_Inventory_Requests* request = new_inventory_result();
+ struct SteamInventoryResultReady_t data;
+ data.m_handle = request->inventory_result;
+ data.m_result = k_EResultOK;
+ callbacks->addCBResult(data.k_iCallback, &data, sizeof(data), request->timeout);
+ }
return false;
}
@@ -488,6 +523,14 @@ STEAM_METHOD_DESC(LoadItemDefinitions triggers the automatic load and refresh of
bool LoadItemDefinitions()
{
PRINT_DEBUG("LoadItemDefinitions\n");
+
+ if (need_load_definitions)
+ {
+ need_load_definitions = false;
+ SteamInventoryDefinitionUpdate_t data;
+ callbacks->addCBResult(data.k_iCallback, &data, sizeof(data));
+ }
+
return true;
}
@@ -502,18 +545,24 @@ bool GetItemDefinitionIDs(
STEAM_DESC(Size of array is passed in and actual size used is returned in this param) uint32 *punItemDefIDsArraySize )
{
PRINT_DEBUG("GetItemDefinitionIDs\n");
- if (!punItemDefIDsArraySize) {
+ if (!punItemDefIDsArraySize)
return false;
- }
PRINT_DEBUG("array_size %u\n", *punItemDefIDsArraySize);
-/*
- if (pItemDefIDs) {
- *pItemDefIDs = 0;
+
+ if (pItemDefIDs == nullptr)
+ {
+ *punItemDefIDsArraySize = items.size();
+ return true;
}
-*/
- //*punItemDefIDsArraySize = 0;
- return false;
+
+ if (*punItemDefIDsArraySize < items.size())
+ return false;
+
+ for (auto& i : items)
+ * pItemDefIDs++ = i.first;
+
+ return true;
}
@@ -530,6 +579,33 @@ bool GetItemDefinitionProperty( SteamItemDef_t iDefinition, const char *pchPrope
STEAM_OUT_STRING_COUNT(punValueBufferSizeOut) char *pchValueBuffer, uint32 *punValueBufferSizeOut )
{
PRINT_DEBUG("GetItemDefinitionProperty\n");
+
+ item_iterator item;
+ if ((item = items.find(iDefinition)) != items.end())
+ {
+ attr_iterator attr;
+ if (pchPropertyName != nullptr)
+ {
+ // Try to get the property
+ if ((attr = item->second.find(pchPropertyName)) != items[iDefinition].end())
+ {
+ std::string const& val = attr->second;
+ if (pchValueBuffer != nullptr)
+ // copy what we can
+ strncpy(pchValueBuffer, val.c_str(), *punValueBufferSizeOut);
+
+ // Set punValueBufferSizeOut to the property size
+ *punValueBufferSizeOut = val.length() + 1;
+ }
+ // Property not found
+ else
+ {
+ *punValueBufferSizeOut = 0;
+ PRINT_DEBUG("Attr %s not found for item %d", pchPropertyName, iDefinition);
+ }
+ }
+ }
+ return true;
}