Документация Steamworks
Схема инвентаря Steam

Обзор схемы определений предметов

Базовая схема и типы предметов

Далее приведены базовые свойства, которые Steam воспринимает и интерпретирует. Они необходимы для корректного функционирования экономики, обменов, а также для отображения инвентаря. Многие из этих свойств совпадают со свойствами, возвращаемыми веб-API-функцией ISteamEconomy/GetAssetClassInfo.

Предмет (ItemDef) должен относиться к одному из следующих типов:

НазваниеОписание
itemТип предмета, который может находиться в инвентаре игрока.
bundleНабор определений предметов, для каждого из которых задано количество. Когда выдаётся предмет данного типа, он автоматически становится набором предметов, заданных в свойствах bundle.
generatorПредставляет собой случайный предмет. При выдаче этого предмета случайным образом выбирается один из типов предметов из bundle, и создаётся сущность этого типа. (Например, при открытии ящика создаётся один из возможных предметов.)
playtimegeneratorЭто особая форма generator, которая может выдаваться при вызове ISteamInventory::TriggerItemDrop из приложения.
tag_generatorОсобое определение предмета, применяющее метки к экземплярам предметов (см. раздел Метки предметов инвентаря Steam, чтобы узнать больше).
Подробная информация о том, как определить комплексные типы предметов, приведена ниже.

Свойства предметов (ItemDef)

НазваниеОписание
appidНомер вашего приложения
nameАнглоязычное название предмета. Вы можете задать перевод названия предметов на другие языки, используя следующий код в качества примера:
name_english: "Hat" name_french: "Chapeau"
См. допустимый список суффиксов, обозначающих языки, в разделе документации о локализации.
descriptionАнглоязычное описание предмета.
Вы можете задать перевод названия предметов на другие языки, используя следующий код в качества примера:
description_english: "This is a tall hat" description_french: "Ceci est un chapeau haut de forme"
См. допустимый список суффиксов, обозначающих языки, в разделе документации о локализации.
display_typeThe Англоязычное описание «разновидности» предмета.
Вы можете задать перевод описания разновидностей предметов на другие языки, используя следующий код в качества примера:
display_type_english: "Weapon" display_type_french: "Arme"
См. допустимый список суффиксов, обозначающих языки, в разделе документации о локализации.
itemdefidНомер данного предмета. Для предметов не из мастерской значение должно быть меньше 1 000 000.
typeВнутреннее значение. ('item' | 'bundle' | 'generator' | 'playtimegenerator' | 'tag_generator')
bundle(см. типы bundle или generator ниже)
promo(см. раздел «Промо» ниже)
drop_start_timeМетка времени UTC - предотвратить выдачу промо-предметов до этого времени. Применимо, только если promo = manual (см. раздел «Промо» ниже)
exchange(см. раздел «Обмены» ниже)
price(см. раздел «Формат цен» ниже)
price_categoryПредустановленная нами ценовая категория, благодаря которой можно не пересчитывать цену в другие валюты. (см. раздел «Формат цен» ниже)
background_colorЦвет фона в инвентаре (три пары шестнадцатеричных цифр).
name_colorЦвет названия в инвентаре (три пары шестнадцатеричных цифр).
icon_urlСсылка на маленькую иконку предмета. Адрес должен быть общедоступным, поскольку серверы Steam будут совершать загрузку и кэширование. Рекомендуемый размер — 200 на 200 пикселей.
icon_url_largeСсылка на большую иконку предмета. Адрес должен быть общедоступным, поскольку серверы Steam будут совершать загрузку и кэширование. Рекомендуемый размер — 2048 на 2048 пикселей..
marketableПринимает значение false или true. Можно ли продать предмет другим пользователям Steam на Торговой площадке.
tradableПринимает значение false или true. Можно ли обменять предмет.
tags(см. Метки предметов инвентаря Steam)
tag_generatorsСписок номеров определений предметов параметра tag_generator, которые необходимо задать (см. Метки предметов инвентаря Steam)
tag_generator_nameНазвание метки токена категории (см. Метки предметов инвентаря Steam)
tag_generator_valuesСписок значений меток и вероятность их выбора (см. Метки предметов инвентаря Steam)
store_tagsСтрока с метками, разделёнными точкой с запятой. Эти метки используются для фильтрации предметов в магазине предметов приложения.
store_imagesСсылки на изображения, разделённые точкой с запятой. Эти изображения будут проксированы и использованы на странице в магазине предметов вашего приложения.
game_onlyПринимает значение false или true. Если true, предмет не будет отображаться в инвентаре пользователя, и о его получении не будет уведомления. Подходит для случаев, когда выданные предметы используются сразу.
hiddenПринимает значение false или true. Если true, предмет не будет виден пользователям и его нельзя будет приобрести. Подходит для случаев, когда нужно скрыть предметы, которые пока не используются или находятся в разработке.
store_hiddenПринимает значение false или true. Если true, предмет будет скрыт в магазине предметов вашего приложения. По умолчанию все предметы, для которых заданы цены, показываются в магазине.
use_drop_limitПринимает значение false или true. Если true, тогда заданное в drop_limit значение используется для ограничения количества предметов, выдаваемых с помощью ISteamInventory::TriggerItemDrop. См. раздел «Выдача предметов за игровое время» ниже.
drop_limitЦелое число. Ограничивает число выдач предмета с помощью ISteamInventory::TriggerItemDrop для конкретного пользователя. Если равно нулю, выдача предмета прекратится. См. раздел «Выдача предметов за игровое время» ниже.
drop_intervalЦелое число. Игровое время в минутах, по истечении которого предмет может быть выдан пользователю. См. раздел «Выдача предметов за игровое время» ниже.
use_drop_windowПринимает значение false или true. Если true, тогда между выдачами предмета будет перерыв, заданный параметром drop_window. См. раздел «Выдача предметов за игровое время» ниже.
drop_windowЦелое число. Время в минутах, которое должно пройти с предыдущей выдачи, прежде чем пользователю будет выдан предмет. См. раздел «Выдача предметов за игровое время» ниже.
drop_max_per_windowЦелое число. Максимальное число выдач в пределах разрешённого периода, после которого начнёт действовать перерыв. По умолчанию равно 1. См. раздел «Выдача предметов за игровое время» ниже.
granted_manuallyПринимает значение false или true. Если true, предмет будет выдаваться только при вызове AddPromoItem() или AddPromoItems(), где явно указан номер itemdefid. В противном случае выдача может происходить при вызове GrantPromoItems(). По умолчанию установлено значение false.
use_bundle_priceПринимает значение false или true. См. раздел «Продажа наборов» ниже. По умолчанию установлено значение false.
auto_stackПринимает значение false или true. Если true, каждая выдача предметов будет автоматически добавляться к единой базе определённого типа. Выданные предметы будут отображены в обратных вызовах, связанных с инвентарём, в виде количественных изменений. По умолчанию установлено значение false.

Расширенная схема

Вы также можете определить любые дополнительные свойства, которые необходимы для вашей игры.

Использование определений комплексных предметов

Типы предметов bundle и generator

Правила для bundle, generator и playtimegenerator задаются в поле bundle.

В случае с bundle описываются типы и количество содержащихся в наборе предметов.

В случае с generator или playtimegenerator описываются типы возможных предметов и вероятность (вес) генерации каждой разновидности. Обратите внимание, что веса необязательно должны в сумме давать 100, но соблюдать это правило может быть удобным.

В поле bundle значение записывается как набор параметров предметов, разделённых точкой с запятой. Каждый набор параметров содержит номер предмета itemdefid, после которого опционально может следовать разделитель «x» и количественное значение.

Если количественное значение не задано, по умолчанию используется 1.

Формат bundle

bundle_def : item_recipe , { ";" , item_recipe } item_recipe : item_def , []

Примеры bundle

  • Выдаём по одному предмету 201, 202 и 203:
    type: bundle bundle: 201;202;203
  • Выдаём одну копию предмета 101 и пять копий предмета 102:
    type: bundle bundle: 101x1;102x5
  • 90% вероятность выдачи предмета 501, 9% вероятность выдачи предмета 502, 1% вероятность выдачи предмета 503:
    type: generator bundle: 501x90;502x9;503x1
  • 90% вероятность выдачи обычного предмета; 10% вероятность выдачи особого предмета.
    itemdefid: 600 name: Common generator type: generator bundle: 601;602;603;604;605 itemdefid: 700 name: Special generator type: generator bundle: 701;702;703;704;705 itemdefid: 800 name: Master generator type: generator bundle: 600x9;700x1

Обратите внимание, что определения bundle и generator можно объединять в цепочки (как в последнем примере). Во время выдачи комплексные типы предметов раскрываются, пока не останутся только простые предметы.

Формулы обмена

API ExchangeItems позволяет определять сценарии создания или изменения предметов, которые можно безопасно вызывать из клиента. Серверы Steam проверят инвентарь игрока, используют выданные материалы и предоставят конечный предмет, если будут выполнены требования.

Конечный предмет может иметь тип bundle или generator.

Формула указывается в поле exchange целевого предмета. Она задаётся в виде набора одного или нескольких сценариев, разделённых точками с запятой.

Каждый сценарий — это набор обязательных материалов, разделённых запятыми.

Необходимые материалы могут быть указаны явно с помощью itemdefid или метки. Если количество не задано, подразумевается 1.

При использовании ExchangeItems вызывающая сторона предоставляет список материалов, которые обмениваются на получаемый предмет. Сервер проверит каждый сценарий и выберет первый, которому соответствуют полученные материалы.

Обмены легко адаптировать к разным ситуациям: с помощью формул можно запрограммировать возможность открыть ящик с помощью ключа, изготовить необычный предмет из отдельных компонентов, переработать предметы и улучшить их.

Формат обмена

<exchange>: <recipe> { ";" <recipe> } <recipe>: <material> { "," <material> } <material>: <item_def_descriptor> / <item_tag_descriptor> <item_def_descriptor>: <itemdefid> [] <item_tag_descriptor>: <tag_name> ":" <tag_value> []
Если количество не задано явно, то используется значение 1.

Пример обмена

// требуется: // - один предмет #100 и один предмет #101 или // - пять предметов #102 или // - три предмета #103 и три предмета #104 "exchange":"100,101;102x5;103x3,104x3" // требуется одна левая и одная правая перчатка: "exchange":"handed:left,handed:right" // требуется три дерева и что-нибудь необычное: "exchange":"type:tree*3,quality:fancy" // требуется что-то одно из перечисленного: // - предмет #201 и предмет #202 или // - предмет с банановым вкусом и тяжёлый предмет "exchange":"201x1,202x1;flavor:banana,mass:heavy" // переработка пяти «обычных» артефактов в один «особый»: { "name":"special_generator", "type":"generator", "tags":"rarity:special", "bundle":...., "exchange":"rarity:common*5", ... }

Промопредметы

Промопредметы можно выдавать игрокам на основе нескольких критериев:

  • владение определённым AppID (в том числе и AppID дополнения);
  • достижение;
  • игровое время в приложении AppID;
  • выдача вручную — клиент должен вызвать AddPromoItem с конкретным itemdefid.

Проверка промопредметов выполняется Steam, поэтому эти предметы могут быть безопасно запрошены у клиента (см. ISteamInventory::AddPromoItem). Для определения промопредмета укажите одно или несколько правил его выдачи в свойстве promo.

Обратите внимание, что промопредметы могут иметь тип bundle.

Промопредметы, выдаваемые вручную, также могут иметь интервал выдачи. Таким образом, вы можете выдавать по несколько предметов каждую неделю, если игрок выполняет какую-либо задачу (к примеру, внутриигровой квест). Чтобы воспользоваться этой функцией, укажите значения drop_start_time и drop_interval в определении предмета.

Промопредметы не выдаются за временное владение бесплатной игрой (во время бесплатных выходных, с помощью функции Family Sharing и так далее).

Формат правила промоакции

<promo>: <rule> { ";" <rule> } <rule>: app_rule / ach_rule / played_rule / manual_rule <app_rule>: "owns:" <appid> <ach_rule>: "ach:" <achievement name> <played_rule>: "played:" <appid>/<minutes played, defaults to 1> <manual>: "manual"

Примеры промопредметов

// определение простого правила промоакции: "promo":"owns:440;owns:480" // пользователь сыграл по меньшей мере 15 минут в AppID 570: "promo":"played:570/15" // используемый предмет, который выдаётся раз в неделю: "itemdefid": 404, "type": "item", "name": "Weekly Quest Item", "promo": "manual", "drop_start_time": "20170801T120000Z", "drop_interval": 10080, ...

Время начала выдачи

Если установить время начала выдачи (drop_start_time), промопредмет не будет выдан до наступления этого момента. Это позволяет использовать код, который выдаёт предмет заранее. Формат временной метки — ISO 8601 в UTC: ГГГГММДДTЧЧММССZ. К примеру, 20050515T171151Z.

Выдача предметов за игровое время

Функция выдачи предметов за игровое время позволяет серверам Steam отслеживать и выдавать предметы на основе времени, которое пользователи проводят в игре. Для этого нужно всего лишь вызвать ISteamInventory::TriggerItemDrop в тот момент, когда, как вы считаете, настала пора выдать предмет. В этом случае необходимо создать предметы типа playtimegenerator.
Выдача за игровое время контролируется вашим приложением. Автоматическая выдача, основанная исключительно на игровом времени, не поддерживается. Другими словами, игровое время — это условие для выдачи, но триггером для проверки его выполнения является приложение.

Частоту выдачи предметов можно контролировать на уровне приложения в подразделе «Выдача предметов за время в игре» раздела «Служба инвентаря» во вкладке «Сообщество». Вы можете настроить три параметра:
(1) Сколько времени в игре должно пройти перед выдачей?
(2) Сколько предметов выдаётся за один выбранный интервал? и
(3) Сколько времени должно пройти перед следующей выдачей?

Те же параметры можно указать при определении предмета. Значения, указанные при определении предмета, будут иметь приоритет над значениями, установленными для этого предмета на уровне приложения. Это позволяет задавать для каждого предмета отдельные параметры.

Если заданы какие-либо из параметров (drop_interval, use_drop_window, drop_window, drop_max_per_window), каждая выдача предметов типа playtimegenerator будет отслеживаться отдельно. Иными словами, если при определении предмета параметры выдачи НЕ указаны, тогда он будет выдаваться по тем же правилам, что и остальные предметы типа playtimegenerator, у которых также не указаны эти параметры, и все они будут подчиняться настройкам приложения. В противном случае, если параметры выдачи заданы при определении предмета, его выдача выполняется и отслеживается отдельно на уровне playtimegenerator, независимо от приложения и других предметов этого типа.

Пример выдачи предмета за игровое время

  1. Выдаём игроку предмет каждые 30 минут игрового времени. Недостаток такого подхода заключается в том, что он позволяет игрокам
    фармить этот предмет, поскольку каждые 30 минут они будут иметь право на выдачу. Мы настоятельно рекомендуем добавить минимальное время, которое должно пройти до следующей выдачи:
    "drop_interval" : 30
  2. Ограничиваем выдачи одной в день после 30 минут игрового времени. Это позволяет каждый день награждать пользователей, если они возвращаются в вашу игру.
    "drop_interval" : 30,
    "use_drop_window" : "true",
    "drop_window" : "1440"

  3. Выдаём пользователю три предмета каждый день после 90 минут игрового времени. Непрерывно играть необязательно. В этом случае вознаграждается длительная игра.
    "drop_interval" : 30,
    "use_drop_window" : "true",
    "drop_window" : "1440",
    "drop_max_per_window" : "3"
Если при определении предмета пропущен параметр, он будет заменён параметром, указанным для приложения.

Ограничение числа выдач

Переменная drop_limit позволяет ограничить число выдач того или иного предмета (типа generator).
С её помощью вы можете также ограничить количество генераций предмета (к примеру, только когда игроки в первый раз прошли игру на уровне легендарной сложности).
Также её можно использовать для предотвращения выдачи устаревшего предмета, если установить значение, равное нулю. Эта настройка применяется, только если значение use_drop_limit равно true.

Продажа предметов

Чтобы выставить игровые предметы на продажу, просто определите цены или ценовые категории соответствующих предметов.
Более подробная информация об активации и настройке магазина предметов доступна в соответствующем разделе документации.

Назначение цен

Цены предметов могут быть определены в одном из следующих полей (но не в обоих одновременно).
НазваниеОписание
priceОпределяет цену в каждой из валют. Все неопределённые валюты будут автоматически конвертированы во время покупки.
price_categoryОпределяет одну цену, которая будет переведена в каждую поддерживаемую валюту посредством таблицы конвертации валют Valve.

Значения в поле price_category указываются в особой валюте VLV. Значение 100 VLV эквивалентно 0,99 доллара США и конвертируется во все поддерживаемые валюты по курсу Valve.

Курс конвертации VLV тщательно регулируется, чтобы отражать изменения курсов валют. Мы обновляем его по мере необходимости, не учитывая мелкие колебания курсов, и таким образом обеспечиваем пользователям стабильные цены и удобство работы с магазином.

Формат цен

Price: <version>;<pricelist> <version>: "1" <pricelist> : <originalprice>(;<price>)* <originalprice>: <currency><integer>(,<currency><integer>)* <price>: (<daterange>)<currency><integer>(,<currency><integer>)* <currency> 3 буквы, например "USD" <integer> сумма в указанной валюте <daterange>: ГГГГММДДTЧЧММССZ-ГГГГММДДTЧЧММССZ
<daterange> — в значении должно быть ровно 33 символа.

Список параметров daterange должен быть отсортирован по убыванию (сначала будущие даты).

Примеры цен

  • price_category: 1;VLV100
    Ценовая категория задана с помощью таблицы валют Valve.
  • price: 1;USD100
    (1 доллар США)
  • price: 1;USD100,EUR080
    (1 доллар США или 0,8 евро)
  • price: 1;USD100,EUR080;20130607T080000Z-20130606T080000ZUSD50,EUR40
    (1 доллар США или 0,8 евро, кроме 6 июня 2013 года, когда цена снижена до 0,5 долл. США / 0,4 евро)
  • price: 1;USD100,EUR080;20130609T080000Z-20130606T080000ZUSD50,EUR40
    (1 доллар США или 0,8 евро, но с 6 июня 2013 года по 9 июня 2013 года цена снижена до 0,5 долл. США / 0,4 евро)

Продажа наборов


Набор предметов (bundle) можно продавать в магазине предметов. Входящие в набор предметы будут показаны во время оформления покупки, так что пользователь увидит список выдаваемых предметов. Правила возврата средств в Steam позволяют возвращать покупки в течение определённого времени, но все включённые в набор предметы должны по-прежнему находиться в инвентаре игрока и оставаться неизменёнными.

Цены на наборы

При задании цены стоит помнить о нескольких дополнительных действиях. Steam учитывает цены на отдельные предметы в составе набора, чтобы определить цену набора и равномерно распределить выручку с его продажи. Это определит размер выплат авторам предметов из мастерской. В наборе может сочетаться контент от различных авторов мастерской или ваш собственный контент.

Чтобы задать цену на набор предметов:
  • Укажите цену для каждого предмета в наборе.
  • Если какие-либо из содержащихся в наборе предметов не должны продаваться по отдельности, укажите для них параметр store_hidden
    со значением true.
  • В поле price или price_category набора укажите простое значение цены (к примеру, VLV0).
    Эта цена не будет использоваться в магазине, но она необходима для обозначения того, что это предмет для продажи.
  • Если хотите, задайте скидку на набор в значении параметра purchase_bundle_discount.

При желании вы можете указать точную цену набора в каждой валюте. При изменении цены на набор все заданные параметры purchase_bundle_discount будут проигнорированы. Но поскольку цены на отдельные предметы в наборе по-прежнему используются для пропорционального распределения выручки, их необходимо предоставить.

Чтобы изменить автоматически предложенную цену на набор:
  • Укажите желаемую цену в поле набора price или price_category.
  • Установите значение true для use_bundle_price у предметов в наборе.

Продажа предметов типа generator

Не пытайтесь продать предметы типа generator напрямую в магазине предметов.

Чтобы продать предмет со случайным содержимым (например, ящик), его необходимо определить как предмет простого типа item. Затем создайте предмет типа generator, который будет принимать предмет «ящик» как входное значение сценария обмена.

После покупки игрок может «открыть» этот «ящик», и тогда вы вызовете ISteamInventory::ExchangeItems для генерации предмета. С этого момента «ящик» нельзя будет вернуть, поскольку он открыт.

Таблица предустановленных цен VLV

Далее представлены текущие возможные значения, которые можно указать в поле price_category предмета.
НазваниеЦена в долларах США
VLV250,25 доллара США
VLV500,49 доллара США
VLV750,75 доллара США
VLV1000,99 доллара США
VLV1501,49 доллара США
VLV2001,99 доллара США
VLV2502,49 доллара США
VLV3002,99 доллара США
VLV3503,49 доллара США
VLV4003,99 доллара США
VLV4504,49 доллара США
VLV5004,99 доллара США
VLV5505,49 доллара США
VLV6005,99 доллара США
VLV6506,49 доллара США
VLV7006,99 доллара США
VLV7507,49 доллара США
VLV8007,99 доллара США
VLV8508,49 доллара США
VLV9008,99 доллара США
VLV9509,49 доллара США
VLV10009,99 доллара США
VLV110010,99 доллара США
VLV120011,99 доллара США
VLV130012,99 доллара США
VLV140013,99 доллара США
VLV150014,99 доллара США
VLV160015,99 доллара США
VLV170016,99 доллара США
VLV180017,99 доллара США
VLV190018,99 доллара США
VLV200019,99 доллара США
VLV250024,99 доллара США
VLV300029,99 доллара США
VLV350034,99 доллара США
VLV400039,99 доллара США
VLV450044,99 доллара США
VLV500049,99 доллара США
VLV600059,99 доллара США
VLV700069,99 доллара США
VLV800079,99 доллара США
VLV900089,99 доллара США
VLV1000099,99 доллара США

Пример схемы определения предметов:

{ "appid": 480, "items": [ { "itemdefid": 10, "type": "playtimegenerator", "bundle": "100x100;101x50;102x25;103x2;110x20;111x20;120x5;121x3", "name": "Drop Generator", "name_color": "7D6D00", "background_color": "3C352E", "item_slot": "generator", "icon_url": "http://cdn.beta.steampowered.com/apps/440/icons/c_fireaxe_pyro_xmas_large.fa878752e1aa09a721a03042a234063b6c929278.png", "icon_url_large": "http://cdn.beta.steampowered.com/apps/440/icons/c_fireaxe_pyro_xmas_large.fa878752e1aa09a721a03042a234063b6c929278.png", "tradable": false, "marketable": false }, { "itemdefid": 100, "type": "item", "name": "Hat decoration", "description": "Hat decoration description", "price": "1;USD99", "name_color": "7D6D00", "background_color": "3C352E", "item_slot": "decoration", "icon_url": "http://cdn.beta.steampowered.com/apps/440/icons/c_fireaxe_pyro_xmas_large.fa878752e1aa09a721a03042a234063b6c929278.png", "icon_url_large": "http://cdn.beta.steampowered.com/apps/440/icons/c_fireaxe_pyro_xmas_large.fa878752e1aa09a721a03042a234063b6c929278.png", "tradable": true, "marketable": true }, { "itemdefid": 200, "type": "item", "price": "1;VLV100", "name_english": "Red Hat", "name_german": "Roter Hut", "description_english": "Red Hat", "description_german": "Roter Hut", "store_tags": "hat;featured", "icon_url": "http://cdn.beta.steampowered.com/apps/440/icons/c_fireaxe_pyro_xmas_large.fa878752e1aa09a721a03042a234063b6c929278.png", "icon_url_large": "http://cdn.beta.steampowered.com/apps/440/icons/c_fireaxe_pyro_xmas_large.fa878752e1aa09a721a03042a234063b6c929278.png", "tradable": true, "marketable": true } ] }