isteaminventory.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. // This file is provided under The MIT License as part of Steamworks.NET.
  2. // Copyright (c) 2013-2019 Riley Labrecque
  3. // Please see the included LICENSE.txt for additional information.
  4. // This file is automatically generated.
  5. // Changes to this file will be reverted when you update Steamworks.NET
  6. #if UNITY_ANDROID || UNITY_IOS || UNITY_TIZEN || UNITY_TVOS || UNITY_WEBGL || UNITY_WSA || UNITY_PS4 || UNITY_WII || UNITY_XBOXONE || UNITY_SWITCH
  7. #define DISABLESTEAMWORKS
  8. #endif
  9. #if !DISABLESTEAMWORKS
  10. using System.Runtime.InteropServices;
  11. using IntPtr = System.IntPtr;
  12. namespace Steamworks {
  13. public static class SteamInventory {
  14. /// <summary>
  15. /// <para> INVENTORY ASYNC RESULT MANAGEMENT</para>
  16. /// <para> Asynchronous inventory queries always output a result handle which can be used with</para>
  17. /// <para> GetResultStatus, GetResultItems, etc. A SteamInventoryResultReady_t callback will</para>
  18. /// <para> be triggered when the asynchronous result becomes ready (or fails).</para>
  19. /// <para> Find out the status of an asynchronous inventory result handle. Possible values:</para>
  20. /// <para> k_EResultPending - still in progress</para>
  21. /// <para> k_EResultOK - done, result ready</para>
  22. /// <para> k_EResultExpired - done, result ready, maybe out of date (see DeserializeResult)</para>
  23. /// <para> k_EResultInvalidParam - ERROR: invalid API call parameters</para>
  24. /// <para> k_EResultServiceUnavailable - ERROR: service temporarily down, you may retry later</para>
  25. /// <para> k_EResultLimitExceeded - ERROR: operation would exceed per-user inventory limits</para>
  26. /// <para> k_EResultFail - ERROR: unknown / generic error</para>
  27. /// </summary>
  28. public static EResult GetResultStatus(SteamInventoryResult_t resultHandle) {
  29. InteropHelp.TestIfAvailableClient();
  30. return NativeMethods.ISteamInventory_GetResultStatus(CSteamAPIContext.GetSteamInventory(), resultHandle);
  31. }
  32. /// <summary>
  33. /// <para> Copies the contents of a result set into a flat array. The specific</para>
  34. /// <para> contents of the result set depend on which query which was used.</para>
  35. /// </summary>
  36. public static bool GetResultItems(SteamInventoryResult_t resultHandle, SteamItemDetails_t[] pOutItemsArray, ref uint punOutItemsArraySize) {
  37. InteropHelp.TestIfAvailableClient();
  38. if (pOutItemsArray != null && pOutItemsArray.Length != punOutItemsArraySize) {
  39. throw new System.ArgumentException("pOutItemsArray must be the same size as punOutItemsArraySize!");
  40. }
  41. return NativeMethods.ISteamInventory_GetResultItems(CSteamAPIContext.GetSteamInventory(), resultHandle, pOutItemsArray, ref punOutItemsArraySize);
  42. }
  43. /// <summary>
  44. /// <para> In combination with GetResultItems, you can use GetResultItemProperty to retrieve</para>
  45. /// <para> dynamic string properties for a given item returned in the result set.</para>
  46. /// <para> Property names are always composed of ASCII letters, numbers, and/or underscores.</para>
  47. /// <para> Pass a NULL pointer for pchPropertyName to get a comma - separated list of available</para>
  48. /// <para> property names.</para>
  49. /// <para> If pchValueBuffer is NULL, *punValueBufferSize will contain the</para>
  50. /// <para> suggested buffer size. Otherwise it will be the number of bytes actually copied</para>
  51. /// <para> to pchValueBuffer. If the results do not fit in the given buffer, partial</para>
  52. /// <para> results may be copied.</para>
  53. /// </summary>
  54. public static bool GetResultItemProperty(SteamInventoryResult_t resultHandle, uint unItemIndex, string pchPropertyName, out string pchValueBuffer, ref uint punValueBufferSizeOut) {
  55. InteropHelp.TestIfAvailableClient();
  56. IntPtr pchValueBuffer2 = Marshal.AllocHGlobal((int)punValueBufferSizeOut);
  57. using (var pchPropertyName2 = new InteropHelp.UTF8StringHandle(pchPropertyName)) {
  58. bool ret = NativeMethods.ISteamInventory_GetResultItemProperty(CSteamAPIContext.GetSteamInventory(), resultHandle, unItemIndex, pchPropertyName2, pchValueBuffer2, ref punValueBufferSizeOut);
  59. pchValueBuffer = ret ? InteropHelp.PtrToStringUTF8(pchValueBuffer2) : null;
  60. Marshal.FreeHGlobal(pchValueBuffer2);
  61. return ret;
  62. }
  63. }
  64. /// <summary>
  65. /// <para> Returns the server time at which the result was generated. Compare against</para>
  66. /// <para> the value of IClientUtils::GetServerRealTime() to determine age.</para>
  67. /// </summary>
  68. public static uint GetResultTimestamp(SteamInventoryResult_t resultHandle) {
  69. InteropHelp.TestIfAvailableClient();
  70. return NativeMethods.ISteamInventory_GetResultTimestamp(CSteamAPIContext.GetSteamInventory(), resultHandle);
  71. }
  72. /// <summary>
  73. /// <para> Returns true if the result belongs to the target steam ID, false if the</para>
  74. /// <para> result does not. This is important when using DeserializeResult, to verify</para>
  75. /// <para> that a remote player is not pretending to have a different user's inventory.</para>
  76. /// </summary>
  77. public static bool CheckResultSteamID(SteamInventoryResult_t resultHandle, CSteamID steamIDExpected) {
  78. InteropHelp.TestIfAvailableClient();
  79. return NativeMethods.ISteamInventory_CheckResultSteamID(CSteamAPIContext.GetSteamInventory(), resultHandle, steamIDExpected);
  80. }
  81. /// <summary>
  82. /// <para> Destroys a result handle and frees all associated memory.</para>
  83. /// </summary>
  84. public static void DestroyResult(SteamInventoryResult_t resultHandle) {
  85. InteropHelp.TestIfAvailableClient();
  86. NativeMethods.ISteamInventory_DestroyResult(CSteamAPIContext.GetSteamInventory(), resultHandle);
  87. }
  88. /// <summary>
  89. /// <para> INVENTORY ASYNC QUERY</para>
  90. /// <para> Captures the entire state of the current user's Steam inventory.</para>
  91. /// <para> You must call DestroyResult on this handle when you are done with it.</para>
  92. /// <para> Returns false and sets *pResultHandle to zero if inventory is unavailable.</para>
  93. /// <para> Note: calls to this function are subject to rate limits and may return</para>
  94. /// <para> cached results if called too frequently. It is suggested that you call</para>
  95. /// <para> this function only when you are about to display the user's full inventory,</para>
  96. /// <para> or if you expect that the inventory may have changed.</para>
  97. /// </summary>
  98. public static bool GetAllItems(out SteamInventoryResult_t pResultHandle) {
  99. InteropHelp.TestIfAvailableClient();
  100. return NativeMethods.ISteamInventory_GetAllItems(CSteamAPIContext.GetSteamInventory(), out pResultHandle);
  101. }
  102. /// <summary>
  103. /// <para> Captures the state of a subset of the current user's Steam inventory,</para>
  104. /// <para> identified by an array of item instance IDs. The results from this call</para>
  105. /// <para> can be serialized and passed to other players to "prove" that the current</para>
  106. /// <para> user owns specific items, without exposing the user's entire inventory.</para>
  107. /// <para> For example, you could call GetItemsByID with the IDs of the user's</para>
  108. /// <para> currently equipped cosmetic items and serialize this to a buffer, and</para>
  109. /// <para> then transmit this buffer to other players upon joining a game.</para>
  110. /// </summary>
  111. public static bool GetItemsByID(out SteamInventoryResult_t pResultHandle, SteamItemInstanceID_t[] pInstanceIDs, uint unCountInstanceIDs) {
  112. InteropHelp.TestIfAvailableClient();
  113. return NativeMethods.ISteamInventory_GetItemsByID(CSteamAPIContext.GetSteamInventory(), out pResultHandle, pInstanceIDs, unCountInstanceIDs);
  114. }
  115. /// <summary>
  116. /// <para> RESULT SERIALIZATION AND AUTHENTICATION</para>
  117. /// <para> Serialized result sets contain a short signature which can't be forged</para>
  118. /// <para> or replayed across different game sessions. A result set can be serialized</para>
  119. /// <para> on the local client, transmitted to other players via your game networking,</para>
  120. /// <para> and deserialized by the remote players. This is a secure way of preventing</para>
  121. /// <para> hackers from lying about posessing rare/high-value items.</para>
  122. /// <para> Serializes a result set with signature bytes to an output buffer. Pass</para>
  123. /// <para> NULL as an output buffer to get the required size via punOutBufferSize.</para>
  124. /// <para> The size of a serialized result depends on the number items which are being</para>
  125. /// <para> serialized. When securely transmitting items to other players, it is</para>
  126. /// <para> recommended to use "GetItemsByID" first to create a minimal result set.</para>
  127. /// <para> Results have a built-in timestamp which will be considered "expired" after</para>
  128. /// <para> an hour has elapsed. See DeserializeResult for expiration handling.</para>
  129. /// </summary>
  130. public static bool SerializeResult(SteamInventoryResult_t resultHandle, byte[] pOutBuffer, out uint punOutBufferSize) {
  131. InteropHelp.TestIfAvailableClient();
  132. return NativeMethods.ISteamInventory_SerializeResult(CSteamAPIContext.GetSteamInventory(), resultHandle, pOutBuffer, out punOutBufferSize);
  133. }
  134. /// <summary>
  135. /// <para> Deserializes a result set and verifies the signature bytes. Returns false</para>
  136. /// <para> if bRequireFullOnlineVerify is set but Steam is running in Offline mode.</para>
  137. /// <para> Otherwise returns true and then delivers error codes via GetResultStatus.</para>
  138. /// <para> The bRESERVED_MUST_BE_FALSE flag is reserved for future use and should not</para>
  139. /// <para> be set to true by your game at this time.</para>
  140. /// <para> DeserializeResult has a potential soft-failure mode where the handle status</para>
  141. /// <para> is set to k_EResultExpired. GetResultItems() still succeeds in this mode.</para>
  142. /// <para> The "expired" result could indicate that the data may be out of date - not</para>
  143. /// <para> just due to timed expiration (one hour), but also because one of the items</para>
  144. /// <para> in the result set may have been traded or consumed since the result set was</para>
  145. /// <para> generated. You could compare the timestamp from GetResultTimestamp() to</para>
  146. /// <para> ISteamUtils::GetServerRealTime() to determine how old the data is. You could</para>
  147. /// <para> simply ignore the "expired" result code and continue as normal, or you</para>
  148. /// <para> could challenge the player with expired data to send an updated result set.</para>
  149. /// </summary>
  150. public static bool DeserializeResult(out SteamInventoryResult_t pOutResultHandle, byte[] pBuffer, uint unBufferSize, bool bRESERVED_MUST_BE_FALSE = false) {
  151. InteropHelp.TestIfAvailableClient();
  152. return NativeMethods.ISteamInventory_DeserializeResult(CSteamAPIContext.GetSteamInventory(), out pOutResultHandle, pBuffer, unBufferSize, bRESERVED_MUST_BE_FALSE);
  153. }
  154. /// <summary>
  155. /// <para> INVENTORY ASYNC MODIFICATION</para>
  156. /// <para> GenerateItems() creates one or more items and then generates a SteamInventoryCallback_t</para>
  157. /// <para> notification with a matching nCallbackContext parameter. This API is only intended</para>
  158. /// <para> for prototyping - it is only usable by Steam accounts that belong to the publisher group</para>
  159. /// <para> for your game.</para>
  160. /// <para> If punArrayQuantity is not NULL, it should be the same length as pArrayItems and should</para>
  161. /// <para> describe the quantity of each item to generate.</para>
  162. /// </summary>
  163. public static bool GenerateItems(out SteamInventoryResult_t pResultHandle, SteamItemDef_t[] pArrayItemDefs, uint[] punArrayQuantity, uint unArrayLength) {
  164. InteropHelp.TestIfAvailableClient();
  165. return NativeMethods.ISteamInventory_GenerateItems(CSteamAPIContext.GetSteamInventory(), out pResultHandle, pArrayItemDefs, punArrayQuantity, unArrayLength);
  166. }
  167. /// <summary>
  168. /// <para> GrantPromoItems() checks the list of promotional items for which the user may be eligible</para>
  169. /// <para> and grants the items (one time only). On success, the result set will include items which</para>
  170. /// <para> were granted, if any. If no items were granted because the user isn't eligible for any</para>
  171. /// <para> promotions, this is still considered a success.</para>
  172. /// </summary>
  173. public static bool GrantPromoItems(out SteamInventoryResult_t pResultHandle) {
  174. InteropHelp.TestIfAvailableClient();
  175. return NativeMethods.ISteamInventory_GrantPromoItems(CSteamAPIContext.GetSteamInventory(), out pResultHandle);
  176. }
  177. /// <summary>
  178. /// <para> AddPromoItem() / AddPromoItems() are restricted versions of GrantPromoItems(). Instead of</para>
  179. /// <para> scanning for all eligible promotional items, the check is restricted to a single item</para>
  180. /// <para> definition or set of item definitions. This can be useful if your game has custom UI for</para>
  181. /// <para> showing a specific promo item to the user.</para>
  182. /// </summary>
  183. public static bool AddPromoItem(out SteamInventoryResult_t pResultHandle, SteamItemDef_t itemDef) {
  184. InteropHelp.TestIfAvailableClient();
  185. return NativeMethods.ISteamInventory_AddPromoItem(CSteamAPIContext.GetSteamInventory(), out pResultHandle, itemDef);
  186. }
  187. public static bool AddPromoItems(out SteamInventoryResult_t pResultHandle, SteamItemDef_t[] pArrayItemDefs, uint unArrayLength) {
  188. InteropHelp.TestIfAvailableClient();
  189. return NativeMethods.ISteamInventory_AddPromoItems(CSteamAPIContext.GetSteamInventory(), out pResultHandle, pArrayItemDefs, unArrayLength);
  190. }
  191. /// <summary>
  192. /// <para> ConsumeItem() removes items from the inventory, permanently. They cannot be recovered.</para>
  193. /// <para> Not for the faint of heart - if your game implements item removal at all, a high-friction</para>
  194. /// <para> UI confirmation process is highly recommended.</para>
  195. /// </summary>
  196. public static bool ConsumeItem(out SteamInventoryResult_t pResultHandle, SteamItemInstanceID_t itemConsume, uint unQuantity) {
  197. InteropHelp.TestIfAvailableClient();
  198. return NativeMethods.ISteamInventory_ConsumeItem(CSteamAPIContext.GetSteamInventory(), out pResultHandle, itemConsume, unQuantity);
  199. }
  200. /// <summary>
  201. /// <para> ExchangeItems() is an atomic combination of item generation and consumption.</para>
  202. /// <para> It can be used to implement crafting recipes or transmutations, or items which unpack</para>
  203. /// <para> themselves into other items (e.g., a chest).</para>
  204. /// <para> Exchange recipes are defined in the ItemDef, and explicitly list the required item</para>
  205. /// <para> types and resulting generated type.</para>
  206. /// <para> Exchange recipes are evaluated atomically by the Inventory Service; if the supplied</para>
  207. /// <para> components do not match the recipe, or do not contain sufficient quantity, the</para>
  208. /// <para> exchange will fail.</para>
  209. /// </summary>
  210. public static bool ExchangeItems(out SteamInventoryResult_t pResultHandle, SteamItemDef_t[] pArrayGenerate, uint[] punArrayGenerateQuantity, uint unArrayGenerateLength, SteamItemInstanceID_t[] pArrayDestroy, uint[] punArrayDestroyQuantity, uint unArrayDestroyLength) {
  211. InteropHelp.TestIfAvailableClient();
  212. return NativeMethods.ISteamInventory_ExchangeItems(CSteamAPIContext.GetSteamInventory(), out pResultHandle, pArrayGenerate, punArrayGenerateQuantity, unArrayGenerateLength, pArrayDestroy, punArrayDestroyQuantity, unArrayDestroyLength);
  213. }
  214. /// <summary>
  215. /// <para> TransferItemQuantity() is intended for use with items which are "stackable" (can have</para>
  216. /// <para> quantity greater than one). It can be used to split a stack into two, or to transfer</para>
  217. /// <para> quantity from one stack into another stack of identical items. To split one stack into</para>
  218. /// <para> two, pass k_SteamItemInstanceIDInvalid for itemIdDest and a new item will be generated.</para>
  219. /// </summary>
  220. public static bool TransferItemQuantity(out SteamInventoryResult_t pResultHandle, SteamItemInstanceID_t itemIdSource, uint unQuantity, SteamItemInstanceID_t itemIdDest) {
  221. InteropHelp.TestIfAvailableClient();
  222. return NativeMethods.ISteamInventory_TransferItemQuantity(CSteamAPIContext.GetSteamInventory(), out pResultHandle, itemIdSource, unQuantity, itemIdDest);
  223. }
  224. /// <summary>
  225. /// <para> TIMED DROPS AND PLAYTIME CREDIT</para>
  226. /// <para> Deprecated. Calling this method is not required for proper playtime accounting.</para>
  227. /// </summary>
  228. public static void SendItemDropHeartbeat() {
  229. InteropHelp.TestIfAvailableClient();
  230. NativeMethods.ISteamInventory_SendItemDropHeartbeat(CSteamAPIContext.GetSteamInventory());
  231. }
  232. /// <summary>
  233. /// <para> Playtime credit must be consumed and turned into item drops by your game. Only item</para>
  234. /// <para> definitions which are marked as "playtime item generators" can be spawned. The call</para>
  235. /// <para> will return an empty result set if there is not enough playtime credit for a drop.</para>
  236. /// <para> Your game should call TriggerItemDrop at an appropriate time for the user to receive</para>
  237. /// <para> new items, such as between rounds or while the player is dead. Note that players who</para>
  238. /// <para> hack their clients could modify the value of "dropListDefinition", so do not use it</para>
  239. /// <para> to directly control rarity.</para>
  240. /// <para> See your Steamworks configuration to set playtime drop rates for individual itemdefs.</para>
  241. /// <para> The client library will suppress too-frequent calls to this method.</para>
  242. /// </summary>
  243. public static bool TriggerItemDrop(out SteamInventoryResult_t pResultHandle, SteamItemDef_t dropListDefinition) {
  244. InteropHelp.TestIfAvailableClient();
  245. return NativeMethods.ISteamInventory_TriggerItemDrop(CSteamAPIContext.GetSteamInventory(), out pResultHandle, dropListDefinition);
  246. }
  247. /// <summary>
  248. /// <para> Deprecated. This method is not supported.</para>
  249. /// </summary>
  250. public static bool TradeItems(out SteamInventoryResult_t pResultHandle, CSteamID steamIDTradePartner, SteamItemInstanceID_t[] pArrayGive, uint[] pArrayGiveQuantity, uint nArrayGiveLength, SteamItemInstanceID_t[] pArrayGet, uint[] pArrayGetQuantity, uint nArrayGetLength) {
  251. InteropHelp.TestIfAvailableClient();
  252. return NativeMethods.ISteamInventory_TradeItems(CSteamAPIContext.GetSteamInventory(), out pResultHandle, steamIDTradePartner, pArrayGive, pArrayGiveQuantity, nArrayGiveLength, pArrayGet, pArrayGetQuantity, nArrayGetLength);
  253. }
  254. /// <summary>
  255. /// <para> ITEM DEFINITIONS</para>
  256. /// <para> Item definitions are a mapping of "definition IDs" (integers between 1 and 1000000)</para>
  257. /// <para> to a set of string properties. Some of these properties are required to display items</para>
  258. /// <para> on the Steam community web site. Other properties can be defined by applications.</para>
  259. /// <para> Use of these functions is optional; there is no reason to call LoadItemDefinitions</para>
  260. /// <para> if your game hardcodes the numeric definition IDs (eg, purple face mask = 20, blue</para>
  261. /// <para> weapon mod = 55) and does not allow for adding new item types without a client patch.</para>
  262. /// <para> LoadItemDefinitions triggers the automatic load and refresh of item definitions.</para>
  263. /// <para> Every time new item definitions are available (eg, from the dynamic addition of new</para>
  264. /// <para> item types while players are still in-game), a SteamInventoryDefinitionUpdate_t</para>
  265. /// <para> callback will be fired.</para>
  266. /// </summary>
  267. public static bool LoadItemDefinitions() {
  268. InteropHelp.TestIfAvailableClient();
  269. return NativeMethods.ISteamInventory_LoadItemDefinitions(CSteamAPIContext.GetSteamInventory());
  270. }
  271. /// <summary>
  272. /// <para> GetItemDefinitionIDs returns the set of all defined item definition IDs (which are</para>
  273. /// <para> defined via Steamworks configuration, and not necessarily contiguous integers).</para>
  274. /// <para> If pItemDefIDs is null, the call will return true and *punItemDefIDsArraySize will</para>
  275. /// <para> contain the total size necessary for a subsequent call. Otherwise, the call will</para>
  276. /// <para> return false if and only if there is not enough space in the output array.</para>
  277. /// </summary>
  278. public static bool GetItemDefinitionIDs(SteamItemDef_t[] pItemDefIDs, ref uint punItemDefIDsArraySize) {
  279. InteropHelp.TestIfAvailableClient();
  280. if (pItemDefIDs != null && pItemDefIDs.Length != punItemDefIDsArraySize) {
  281. throw new System.ArgumentException("pItemDefIDs must be the same size as punItemDefIDsArraySize!");
  282. }
  283. return NativeMethods.ISteamInventory_GetItemDefinitionIDs(CSteamAPIContext.GetSteamInventory(), pItemDefIDs, ref punItemDefIDsArraySize);
  284. }
  285. /// <summary>
  286. /// <para> GetItemDefinitionProperty returns a string property from a given item definition.</para>
  287. /// <para> Note that some properties (for example, "name") may be localized and will depend</para>
  288. /// <para> on the current Steam language settings (see ISteamApps::GetCurrentGameLanguage).</para>
  289. /// <para> Property names are always composed of ASCII letters, numbers, and/or underscores.</para>
  290. /// <para> Pass a NULL pointer for pchPropertyName to get a comma - separated list of available</para>
  291. /// <para> property names. If pchValueBuffer is NULL, *punValueBufferSize will contain the</para>
  292. /// <para> suggested buffer size. Otherwise it will be the number of bytes actually copied</para>
  293. /// <para> to pchValueBuffer. If the results do not fit in the given buffer, partial</para>
  294. /// <para> results may be copied.</para>
  295. /// </summary>
  296. public static bool GetItemDefinitionProperty(SteamItemDef_t iDefinition, string pchPropertyName, out string pchValueBuffer, ref uint punValueBufferSizeOut) {
  297. InteropHelp.TestIfAvailableClient();
  298. IntPtr pchValueBuffer2 = Marshal.AllocHGlobal((int)punValueBufferSizeOut);
  299. using (var pchPropertyName2 = new InteropHelp.UTF8StringHandle(pchPropertyName)) {
  300. bool ret = NativeMethods.ISteamInventory_GetItemDefinitionProperty(CSteamAPIContext.GetSteamInventory(), iDefinition, pchPropertyName2, pchValueBuffer2, ref punValueBufferSizeOut);
  301. pchValueBuffer = ret ? InteropHelp.PtrToStringUTF8(pchValueBuffer2) : null;
  302. Marshal.FreeHGlobal(pchValueBuffer2);
  303. return ret;
  304. }
  305. }
  306. /// <summary>
  307. /// <para> Request the list of "eligible" promo items that can be manually granted to the given</para>
  308. /// <para> user. These are promo items of type "manual" that won't be granted automatically.</para>
  309. /// <para> An example usage of this is an item that becomes available every week.</para>
  310. /// </summary>
  311. public static SteamAPICall_t RequestEligiblePromoItemDefinitionsIDs(CSteamID steamID) {
  312. InteropHelp.TestIfAvailableClient();
  313. return (SteamAPICall_t)NativeMethods.ISteamInventory_RequestEligiblePromoItemDefinitionsIDs(CSteamAPIContext.GetSteamInventory(), steamID);
  314. }
  315. /// <summary>
  316. /// <para> After handling a SteamInventoryEligiblePromoItemDefIDs_t call result, use this</para>
  317. /// <para> function to pull out the list of item definition ids that the user can be</para>
  318. /// <para> manually granted via the AddPromoItems() call.</para>
  319. /// </summary>
  320. public static bool GetEligiblePromoItemDefinitionIDs(CSteamID steamID, SteamItemDef_t[] pItemDefIDs, ref uint punItemDefIDsArraySize) {
  321. InteropHelp.TestIfAvailableClient();
  322. if (pItemDefIDs != null && pItemDefIDs.Length != punItemDefIDsArraySize) {
  323. throw new System.ArgumentException("pItemDefIDs must be the same size as punItemDefIDsArraySize!");
  324. }
  325. return NativeMethods.ISteamInventory_GetEligiblePromoItemDefinitionIDs(CSteamAPIContext.GetSteamInventory(), steamID, pItemDefIDs, ref punItemDefIDsArraySize);
  326. }
  327. /// <summary>
  328. /// <para> Starts the purchase process for the given item definitions. The callback SteamInventoryStartPurchaseResult_t</para>
  329. /// <para> will be posted if Steam was able to initialize the transaction.</para>
  330. /// <para> Once the purchase has been authorized and completed by the user, the callback SteamInventoryResultReady_t</para>
  331. /// <para> will be posted.</para>
  332. /// </summary>
  333. public static SteamAPICall_t StartPurchase(SteamItemDef_t[] pArrayItemDefs, uint[] punArrayQuantity, uint unArrayLength) {
  334. InteropHelp.TestIfAvailableClient();
  335. return (SteamAPICall_t)NativeMethods.ISteamInventory_StartPurchase(CSteamAPIContext.GetSteamInventory(), pArrayItemDefs, punArrayQuantity, unArrayLength);
  336. }
  337. /// <summary>
  338. /// <para> Request current prices for all applicable item definitions</para>
  339. /// </summary>
  340. public static SteamAPICall_t RequestPrices() {
  341. InteropHelp.TestIfAvailableClient();
  342. return (SteamAPICall_t)NativeMethods.ISteamInventory_RequestPrices(CSteamAPIContext.GetSteamInventory());
  343. }
  344. /// <summary>
  345. /// <para> Returns the number of items with prices. Need to call RequestPrices() first.</para>
  346. /// </summary>
  347. public static uint GetNumItemsWithPrices() {
  348. InteropHelp.TestIfAvailableClient();
  349. return NativeMethods.ISteamInventory_GetNumItemsWithPrices(CSteamAPIContext.GetSteamInventory());
  350. }
  351. /// <summary>
  352. /// <para> Returns item definition ids and their prices in the user's local currency.</para>
  353. /// <para> Need to call RequestPrices() first.</para>
  354. /// </summary>
  355. public static bool GetItemsWithPrices(SteamItemDef_t[] pArrayItemDefs, ulong[] pCurrentPrices, ulong[] pBasePrices, uint unArrayLength) {
  356. InteropHelp.TestIfAvailableClient();
  357. if (pArrayItemDefs != null && pArrayItemDefs.Length != unArrayLength) {
  358. throw new System.ArgumentException("pArrayItemDefs must be the same size as unArrayLength!");
  359. }
  360. if (pCurrentPrices != null && pCurrentPrices.Length != unArrayLength) {
  361. throw new System.ArgumentException("pCurrentPrices must be the same size as unArrayLength!");
  362. }
  363. if (pBasePrices != null && pBasePrices.Length != unArrayLength) {
  364. throw new System.ArgumentException("pBasePrices must be the same size as unArrayLength!");
  365. }
  366. return NativeMethods.ISteamInventory_GetItemsWithPrices(CSteamAPIContext.GetSteamInventory(), pArrayItemDefs, pCurrentPrices, pBasePrices, unArrayLength);
  367. }
  368. /// <summary>
  369. /// <para> Retrieves the price for the item definition id</para>
  370. /// <para> Returns false if there is no price stored for the item definition.</para>
  371. /// </summary>
  372. public static bool GetItemPrice(SteamItemDef_t iDefinition, out ulong pCurrentPrice, out ulong pBasePrice) {
  373. InteropHelp.TestIfAvailableClient();
  374. return NativeMethods.ISteamInventory_GetItemPrice(CSteamAPIContext.GetSteamInventory(), iDefinition, out pCurrentPrice, out pBasePrice);
  375. }
  376. /// <summary>
  377. /// <para> Create a request to update properties on items</para>
  378. /// </summary>
  379. public static SteamInventoryUpdateHandle_t StartUpdateProperties() {
  380. InteropHelp.TestIfAvailableClient();
  381. return (SteamInventoryUpdateHandle_t)NativeMethods.ISteamInventory_StartUpdateProperties(CSteamAPIContext.GetSteamInventory());
  382. }
  383. /// <summary>
  384. /// <para> Remove the property on the item</para>
  385. /// </summary>
  386. public static bool RemoveProperty(SteamInventoryUpdateHandle_t handle, SteamItemInstanceID_t nItemID, string pchPropertyName) {
  387. InteropHelp.TestIfAvailableClient();
  388. using (var pchPropertyName2 = new InteropHelp.UTF8StringHandle(pchPropertyName)) {
  389. return NativeMethods.ISteamInventory_RemoveProperty(CSteamAPIContext.GetSteamInventory(), handle, nItemID, pchPropertyName2);
  390. }
  391. }
  392. /// <summary>
  393. /// <para> Accessor methods to set properties on items</para>
  394. /// </summary>
  395. public static bool SetProperty(SteamInventoryUpdateHandle_t handle, SteamItemInstanceID_t nItemID, string pchPropertyName, string pchPropertyValue) {
  396. InteropHelp.TestIfAvailableClient();
  397. using (var pchPropertyName2 = new InteropHelp.UTF8StringHandle(pchPropertyName))
  398. using (var pchPropertyValue2 = new InteropHelp.UTF8StringHandle(pchPropertyValue)) {
  399. return NativeMethods.ISteamInventory_SetProperty(CSteamAPIContext.GetSteamInventory(), handle, nItemID, pchPropertyName2, pchPropertyValue2);
  400. }
  401. }
  402. public static bool SetProperty(SteamInventoryUpdateHandle_t handle, SteamItemInstanceID_t nItemID, string pchPropertyName, bool bValue) {
  403. InteropHelp.TestIfAvailableClient();
  404. using (var pchPropertyName2 = new InteropHelp.UTF8StringHandle(pchPropertyName)) {
  405. return NativeMethods.ISteamInventory_SetProperty0(CSteamAPIContext.GetSteamInventory(), handle, nItemID, pchPropertyName2, bValue);
  406. }
  407. }
  408. public static bool SetProperty1(SteamInventoryUpdateHandle_t handle, SteamItemInstanceID_t nItemID, string pchPropertyName, long nValue) {
  409. InteropHelp.TestIfAvailableClient();
  410. using (var pchPropertyName2 = new InteropHelp.UTF8StringHandle(pchPropertyName)) {
  411. return NativeMethods.ISteamInventory_SetProperty1(CSteamAPIContext.GetSteamInventory(), handle, nItemID, pchPropertyName2, nValue);
  412. }
  413. }
  414. public static bool SetProperty2(SteamInventoryUpdateHandle_t handle, SteamItemInstanceID_t nItemID, string pchPropertyName, float flValue) {
  415. InteropHelp.TestIfAvailableClient();
  416. using (var pchPropertyName2 = new InteropHelp.UTF8StringHandle(pchPropertyName)) {
  417. return NativeMethods.ISteamInventory_SetProperty2(CSteamAPIContext.GetSteamInventory(), handle, nItemID, pchPropertyName2, flValue);
  418. }
  419. }
  420. /// <summary>
  421. /// <para> Submit the update request by handle</para>
  422. /// </summary>
  423. public static bool SubmitUpdateProperties(SteamInventoryUpdateHandle_t handle, out SteamInventoryResult_t pResultHandle) {
  424. InteropHelp.TestIfAvailableClient();
  425. return NativeMethods.ISteamInventory_SubmitUpdateProperties(CSteamAPIContext.GetSteamInventory(), handle, out pResultHandle);
  426. }
  427. }
  428. }
  429. #endif // !DISABLESTEAMWORKS