Jump to content
McKay Development

Dr. McKay

Administrator
  • Posts

    3667
  • Joined

  • Last visited

Reputation Activity

  1. Like
    Dr. McKay got a reaction from asdfghjkl in Identifying Steam Items   
    Sometimes it can be a little confusing to identify a specific item in the Steam economy. There are several different types of IDs present in one particular item, and a lot of vague terminology. This guide aims to clear all that up for you.

    For starters, the "official" term for a Steam item is an asset. When I say a "Steam item", I mean a particular copy of an item. I'm not referring to the item's definition, name, image, or anything. I'm referring to a specific, unique copy of the item.

    In a general sense, every item on Steam must be owned by an app. An "app" is a game, software, or whatever on Steam. Every app has its own unique AppID. You can find a particular game's AppID by going to its store page or community hub and looking at the URL. For example, TF2's AppID is 440 so TF2's store page can be found at http://store.steampowered.com/app/440. CS:GO's is 730, Dota 2's is 570, and so on. Note that Steam Community items, Steam gifts, and other "Steam" items are owned by the "Steam" app, which has AppID 753. To identify an item, you'll need the AppID of the game which owns it.

    Of course, the AppID alone isn't enough. You also need two other IDs. Have you ever noticed how some games have multiple inventories, which appear in a drop-down list? An example is the Steam inventory, which has sub-inventories for "Community", "Gifts", "Coupons", etc. These "sub-inventories" are called contexts, and each context has its own context ID. If a game doesn't have a drop-down menu to select a context, that doesn't mean that it's without contexts. That only means that it has one single visible context. That single context still has an ID. For all current Valve games, the context ID for the publicly-visible context is 2.

    Context IDs can be a bit tricky. It's entirely up to the game's developer to determine how they work. For example, Valve games take the "single shared inventory" model in which there's one context ID which is shared by everyone. Under this model, an item belongs to one particular context and never leaves that context. Consequently, the item's context ID never changes. It is, however, possible for game developers to create contexts in any way they choose. For example, Spiral Knights uses the "per-character inventory" model in which everyone who plays the game has their own context IDs for their characters. Creating a new character creates a new context ID. This means that when an item is traded between users, its context ID will change as it moved out of a particular character's inventory.

    Those are the two different types of "containers" in the Steam economy. Apps own contexts, and contexts own assets. Every asset on Steam has, in addition to its AppID and context ID, an asset ID which is guaranteed to be unique inside of a given AppID+ContextID combination. Notice that this means that asset IDs are not unique across all of Steam. They aren't even unique across a particular app. They are only unique inside of a given context. For example, there could be two items with asset ID 1 in the same game, as long as they have different context IDs. An item's asset ID may be referred to as "assetid" or just plain "id".

    Context IDs and asset IDs are assigned by the game developer and can follow any pattern. They can change when traded or not. They may both be up to 64 bits in size. Consequently, Steam returns them (like all other 64-bit values) in JSON as strings.

    Still following? All of what we've learned so far leads us to this conclusion: in order to uniquely identify an item, you need its AppID, its context ID, and its asset ID. Once you have these three things, only then can you uniquely identify it. In fact, this is how you link to a particular item in a user's inventory: steamcommunity.com/profiles/steamid/inventory#appid_contextid_assetid. Here's an example: https://steamcommunity.com/id/DoctorMcKay/inventory#440_2_134161610

    What are these "classid" and "instanceid" values though?
    The observant reader may have noticed that there are two more IDs attached to a particular item which I haven't mentioned. These are the "classid" and "instanceid". These IDs are used to map an asset to its description.

    What's a description? A description is what you need in order to actually display an item. An item's description contains its name, image, color, market_name, whether it's tradable or not, whether it's marketable or not, and more. There are many endpoints on Steam which return JSON objects representing assets that only contain the asset's AppID, context ID, asset ID, classid, instanceid, and amount. An item's amount is how big of a stack it is. Unstackable items always have an amount of 1. Stackable items (such as Steam gems) may have a larger amount. Stacked items always have the same asset ID.

    What's the difference between a classid and an instanceid? In a nutshell, a classid "owns" an instanceid. The classid is all you need to get a general overview of an item. For example, items with the same classid will pretty much always have the same name and image. The instanceid allows you to get finer details such as how many kills are on a strange/StatTrak weapon, or custom names/descriptions.

    You can turn a classid/instanceid pair into a description using the GetAssetClassInfo WebAPI method. Notice that the instanceid is actually optional: if you only have a classid that's fine, you just won't get finer details for the item.

    Name? Market Name? Market Hash Name?
    Every asset on Steam has a name. Without a name, there's nothing to show in your inventory. The item's name is the name property of its description. The item's name may be localized if the game's developer has set it up to be.

    Every marketable item also has a "market name". This name may be the same as—or different from—the item's regular name. The item's market name is the market_name property of its description. This is the name that's displayed in the Steam Community Market when the item is up for sale. Why the distinction? There are some items which have value-affecting data that isn't in their name; for example, CS:GO skins have 5 different tiers of "wear", which isn't in their names. The wear tier is appended to each skin's market name however, so that the different tiers of wear are separated in the market. The market name may be localized or not, and may not exist at all if the item isn't marketable. It's up to the game's developer.

    Finally, every marketable item also has a "market hash name", available under the market_hash_name property. This name is supposed to be the English version of the item's market name, but in practice it may vary. For example, Steam Community items prepend the AppID of the originating app to each item's market hash name, but not to the market name. The market hash name is never localized, and may not exist if the item isn't marketable. Again, it's up to the game's developer. You can view the Community Market listings for any marketable item using this URL formula: steamcommunity.com/market/listings/appid/market_hash_name. Here's an example: https://steamcommunity.com/market/listings/440/Mann%20Co.%20Supply%20Crate%20Key

    Note that the Community Market has no concept of contexts. Consequently, market [hash] names are unique for a particular "class" of items per-app (and by extension per-context). This means that for marketable items, two items with identical market hash names will be worth roughly the same (with some exceptions, like unusual TF2 items).

    Questions?
    Ask below. I'm happy to help!
  2. Like
    Dr. McKay got a reaction from Josiox in New CS2 inspect links   
    Support for this new form of inspect link has been added to globaloffensive v3.3.0. While it's not actually required to connect to the GC to decode these, if you want to avoid making code changes (and support older styles of inspect links) then this will work as a drop-in upgrade.
  3. Thanks
    Dr. McKay got a reaction from AHdrOHchik in Error: Could not act on confirmation   
    You need to update node-steamcommunity and call acknowledgeTradeProtection() on each account.
  4. Like
    Dr. McKay got a reaction from UntitledUser in Nethook   
    It's available under artifacts on SteamKit's GitHub Actions (you need to login to GitHub to download): https://github.com/SteamRE/SteamKit/actions

     

  5. Like
    Dr. McKay got a reaction from Jonjo in Nethook   
    It's available under artifacts on SteamKit's GitHub Actions (you need to login to GitHub to download): https://github.com/SteamRE/SteamKit/actions

     

  6. Like
    Dr. McKay got a reaction from mjavad_mllw in best way to check if an item is used in node-tf2   
    Either event should be fine to determine if using a backpack expander succeeded, although personally I'd probably use itemRemoved.
  7. Thanks
    Dr. McKay got a reaction from mjavad_mllw in using more than one account in a script   
    Yeah, no reason that shouldn't work.
  8. Like
    Dr. McKay reacted to diegob in [node-globaloffensive] Connection to CS2 Game Coordinator times out   
    Hey Dr. McKay, Just wanted to say thanks a lot for your help.
    Really appreciate you taking the time to look at it!
  9. Like
    Dr. McKay got a reaction from diegob in [node-globaloffensive] Connection to CS2 Game Coordinator times out   
    You're far more than one step away. Joining a community server is not supported and never will be, as you'd have to implement VAC which nobody has been insane enough to try.
  10. Like
    Dr. McKay got a reaction from diegob in [node-globaloffensive] Connection to CS2 Game Coordinator times out   
    Where are you getting a 'ready' event from? No such event exists in globaloffensive. It's connectedToGC.
  11. Like
    Dr. McKay got a reaction from diegob in [node-globaloffensive] Connection to CS2 Game Coordinator times out   
    It wouldn't show as in-game on the profile unless you set your persona state to Online with the setPersona() method, although that wouldn't affect connecting to the GC.
    Are you still using your modifications to global offensive? Try getting rid of those, as those weren't your problem.
  12. Like
    Dr. McKay got a reaction from jerrey in After I successfully call the method this.client.gamesPlayed([730]), haveGCSession is false   
    This is normal if your steam-user client shut down without properly logging off recently. I believe what happens is the GC never receives a notification of the client disconnecting, so it keeps your session active even though you're no longer there. You can typically solve this by calling logOff() if you don't get a session in a reasonable time, then logging on again.
  13. Like
    Dr. McKay got a reaction from diegob in [node-globaloffensive] Connection to CS2 Game Coordinator times out   
    Set your client's persona state to Online and then check the account's Steam profile to make sure it's actually launching CS. If it doesn't appear as in-game, you're doing something else wrong.
  14. Like
    Dr. McKay got a reaction from diegob in [node-globaloffensive] Connection to CS2 Game Coordinator times out   
    client.gamesPlayed = [730]; // Announce we are "playing" CS2 This is your problem. The correct usage is:
    client.gamesPlayed([730]);  
  15. Like
    Dr. McKay got a reaction from diegob in [node-globaloffensive] Connection to CS2 Game Coordinator times out   
    I'm not aware of any other requirements like you describe. Are you sure that you're logging onto Steam correctly?
  16. Like
    Dr. McKay got a reaction from diegob in [node-globaloffensive] Connection to CS2 Game Coordinator times out   
    No, there's no other prerequisite. Were you previously using these accounts for something like requesting item data? I've heard reports of people having their accounts "banned" from connecting to the GC after doing so.
  17. Like
    Dr. McKay got a reaction from diegob in [node-globaloffensive] Connection to CS2 Game Coordinator times out   
    The latest version of globaloffensive is working fine for me. Do your accounts own a CS2 license?
  18. Like
    Dr. McKay got a reaction from FloatingF in Memory leak in steamUser when using enablePicsCache / picsCacheAll   
    It's not really a memory leak, it's by design. picsCacheAll is especially going to consume lots of memory since it caches all app data it ever comes across. You really shouldn't use picsCacheAll in any app that lives longer than a few hours, and you should avoid using picsCache in general unless you really need it.
    For what purpose do you need the pics cache?
  19. Like
    Dr. McKay got a reaction from Erikino in How to reliably get all account status flags: VAC bans, market/trade restrictions, limited accounts, and “red warning” flags?   
    For your own account that you're logged into, the steam-user accountLimitations and vacBans events are your best bet. For trade bans, I believe you'd need to use the GetPlayerBans WebAPI method.
  20. Like
    Dr. McKay got a reaction from i_love_cats in WebSession not emitted   
    Yes, this is the only way to obtain web cookies if you have a refresh token for EAuthTokenPlatformType.SteamClient. Other platform types can get cookies via steam-session.
  21. Like
    Dr. McKay got a reaction from Askona in New steam update, revert CS2 trades, state id not changed after reverting the trade   
    Trades containing CS2 items are not returned by the WebAPI when using an API key. You need to use an access token instead. You can get one using steam-session, and you provide it like this:
    https://api.steampowered.com/IEconService/GetTradeStatus/v1/?tradeid=123456&access_token=eyAid...
  22. Like
    Dr. McKay got a reaction from HunterX12 in Question: Using proxies with steamcommunity (v3 and later)   
    You can still use a proxy the same way you did before with steamcommunity, but you're correct that the login() method no longer works if you do. You need to use steam-session with your proxy and call setCookies on steamcommunity, passing your proxy to both.
  23. Like
    Dr. McKay got a reaction from 月光下漫步 in New steam update, revert CS2 trades, state id not changed after reverting the trade   
    A trade that's reversed during Trade Protection will go to status 12 in GetTradeHistory and GetTradeStatus.
  24. Thanks
    Dr. McKay got a reaction from Rage in Error: Could not act on confirmation   
    You need to update node-steamcommunity and call acknowledgeTradeProtection() on each account.
  25. Like
    Dr. McKay got a reaction from Nguyen in community.getConfirmations failed because new popup from Steam on today   
    https://github.com/DoctorMcKay/node-steamcommunity/releases/tag/v3.49.0
    As far as I can tell, clicking that button in the popup (which is what acknowledgeTradeProtection() does) is all that's needed, and it only needs to be done once per account. If you've already clicked the button on the account(s) you use to trade, you shouldn't need to do anything more.
×
×
  • Create New...