Steamworks ドキュメンテーション
Steamインベントリアイテム動的プロパティ
インベントリサービスの新機能では、任意の文字列、整数、ブール値、または浮動小数点を任意のアイテムインスタンスに格納できます。

これらのプロパティは、アイテムごとのタグと同様のものです。 しかしながら、アイテムごとのタグが不変であるのに対し、これらのプロパティは、セキュリティで保護された Web API 呼び出し、または Steamworks API を介して変更可能な動的プロパティです。

また、アイテムタグとは異なり、動的アイテムプロパティは、アイテムのトレード時に消去されます。 動的アイテムプロパティは現時点ではユーザーの Steam インベントリ、または Steam コミュニティマーケット上では表示されません。

アイテムプロパティの取得


動的アイテムプロパティは、他のアイテム属性とともに Steam クライアントに自動的に送信され、プロパティ名 dynamic_props で、ISteamInventory::GetResultItemProperty を呼び出すことによって取得できます。 用意されたバッファには、アイテムに対するすべての動的プロパティが JSON 形式の文字列表現で書き込まれます。 この文字列の適切な解析はアプリケーションに依存します。

アイテムを JSON として返すすべての Web API 呼び出しでは、dynamic_props キーは、動的アイテムプロパティを含む完全な JSON オブジェクトを指します。

アイテムプロパティの変更


セキュリティ保護されたサーバーの 1 つから、IInventoryService/ModifyItems Web API とセキュアなパブリッシャーキーを使用して、アイテムを変更できます。

また、アイテムプロパティは Steam クライアントから Steamworks API を介して、ISteamInventory::StartUpdatePropertiesISteamInventory::RemovePropertyISteamInventory::SetProperty、および ISteamInventory::SubmitUpdateProperties を呼び出すことで変更できます。 ただし、事前にパートナーサイトの Steam インベントリサービス設定ページで、クライアントから設定可能なプロパティをホワイトリストに登録する必要があります。 信頼できないクライアント設定でも問題のないプロパティのみをホワイトリストに追加することを推奨します (言い換えれば、ユーザーはメッセージをスプーフィングして値を設定することが可能です)。

現在、1 人のユーザーに対して各呼び出しごとに最大 100 個のアイテムを変更できます。 この呼び出しは、ユーザーごとにレート制限されているため、変更を一括しゲームに適切なタイミングで送信してください。 現時点では、各アイテムごとの JSON ファイルサイズは最大 1024 バイトです。

制限の適用

前述のように、特定のプロパティをホワイトリストに追加すると、クライアントからプロパティを設定可能です。 しかし、特定のターゲットアイテムに tag_category:tag_value のペア、または任意の tag_category 値を要求することで、設定できるプロパティをさらに制限することもできます。 これらのタグの制限とクライアント API を組み合わせて使用することにより、適切なアイテムのプロパティのみをクライアントで設定できるようになります (つまり、帽子のキル数は記録しませんが、ロケットランチャーのキル数は追跡できます)。 これらの必要なタグには、アイテムまたは関連するアイテム定義のタグが使えます。


ユーザーによるロケットランチャー発射回数を記録したい場合の例です。 これを行う方法はいくつかありますが、上記のように、アイテムプロパティ変更用の呼び出しにはレート制限があるため、選択したメソッドにかかわらず、プロパティの変更は一括して行うようにしてください。

Web API

セキュリティ保護されたゲームサーバーでは、統計を累積することができ、ゲームラウンドの終了時または適切なタイミングで、セキュアなパブリッシャーキーを使用して、IInventoryService/ModifyItems Web API に POST することができます。

POST メソッドのデータフォーム例:
appid: 480 key: "0123456789abcdeffedcba9876543210" input_json:{ "steamid" : "1234", "timestamp" : 1513274037, "updates" : [] }

Steamworks API

Steamworks API を使用してアイテムプロパティを変更したい場合 (本質的に安全ではない方法です)、まずアプリケーションのホワイトリストにそれらのプロパティを追加する必要があります。

次に、上記の例のように、ゲームラウンドの終了後または適切なタイミングで更新を開始し、プロパティを設定して Steam に更新データを送信します。

SteamInventoryUpdateHandle_t updateHandle = SteamInventory()->StartUpdateProperties(); SteamInventory()->SetProperty( updateHandle, nItemID, "num_times_fired", nNumTimesFired ); SteamInventoryResult_t resultUpdate; SteamInventory()->SubmitUpdateProperties( updateHandle, &resultUpdate );

次に、SteamInventoryResultReady_t のコールバックハンドラで呼び出し結果を取得し、それらのアイテムプロパティを更新します。

ローカリゼーション

動的プロパティは通常、ユーザーのバックパックのWebビューではレンダリングされません。 ただし、代替トークンとして動的プロパティ名を指定すれば、アイテムの説明にある値を使用できます。

前述の例を使用すると、アイテム定義の説明文字列は次のようになります。
このロケットランチャーは %num_times_fired% 回発射されています。

すると、Web上の説明は次のようになります。
このロケットランチャーは100回発射されました。

対応する動的プロパティを持たない置換トークン (つまり、この通常表現 "% ([a-zA-Z0-9.-_]+)%"に一致する文字列) は自動的に削除されます。 Steamインベントリサービスページ上の”アイテム動的プロパティ”セクションに動的プロパティを設定し、”タイプ”フィールドを設定している場合、整数と浮動小数点は0に置き換えられ、ブールプロパティは”false”に置き換えられます。