Dokumentacja Steamworks
Dynamiczne właściwości przedmiotów w Ekwipunku Steam
W usłudze Ekwipunku Steam pojawiła się możliwość przechowywania dowolnego ciągu, liczby całkowitej, wartości boolean lub właściwości float dla dowolnej instancji danego przedmiotu.

Te właściwości są podobne do indywidualnych dla każdego przedmiotu tagów. Jednak w przeciwieństwie do tych tagów, które są uważane za niezmienne, właściwości te są dynamiczne, ponieważ można je zmodyfikować, wywołując bezpieczne WebAPI lub za pomocą API Steamworks.

Ponadto w przeciwieństwie do tagów, dynamiczne właściwości przedmiotu są czyszczone podczas jego wymiany. Właściwości dynamiczne w tej chwili nie są widoczne podczas przeglądania przedmiotów w ekwipunku użytkownika lub na Rynku Społeczności Steam.

Uzyskanie właściwości przedmiotu


Dynamiczne właściwości przedmiotu są automatycznie przesyłane wraz z jego innymi atrybutami do klienta Steam i mogą zostać uzyskane przez wywołanie ISteamInventory::GetResultItemProperty z nazwą właściwości dynamic_props. Dostarczony bufor zostanie wypełniony reprezentacją ciągów danego JSON-a dla wszystkich dynamicznych właściwości przedmiotu. To na twojej aplikacji ciąży obowiązek poprawnego przetwarzania tego stringa.

W przypadku wszelkich wywołań WebAPI, które zwracają przedmioty w formacie JSON, klucz dynamic_props wskaże pełny obiekt JSON zawierający dynamiczne właściwości przedmiotu.

Zmienianie właściwości przedmiotu


Możesz modyfikować przedmioty z poziomu jednego z twoich bezpiecznych serwerów, używając WebAPI IInventoryService/ModifyItems oraz twojego bezpiecznego klucza wydawcy.

Właściwości przedmiotów możesz także zmodyfikować w kliencie Steam za pośrednictwem API Steamworks i wywołania do ISteamInventory::StartUpdateProperties, ISteamInventory::RemoveProperty, ISteamInventory::SetProperty oraz ISteamInventory::SubmitUpdateProperties. Najpierw jednak musisz przejść na stronę konfiguracji usługi Ekwipunku Steam na stronie partnerskiej, a następnie utworzyć białą listę właściwości, które można ustawić za pośrednictwem klienta. Zalecamy, by do listy dopisać tylko te właściwości, z którymi nie masz problemu, by mógł je ustawiać niezaufany klient (np. użytkownik może wysyłać fałszywe wiadomości, by ustawić dowolną żądaną przez niego wartość).

W tej chwili możliwe jest modyfikowanie do 100 obiektów na użytkownika w każdym wywołaniu. To wywołanie ma ograniczoną częstotliwość w zależności od użytkownika, więc zalecamy zebranie modyfikacji w jedną grupę i wysłanie ich w odpowiednim dla twojej gry czasie. W tej chwili maksymalny limit JSON-a to 1024 bajty na przedmiot.

Zastosowanie ograniczeń

Jak wspomniano wcześniej, możesz utworzyć listę niektórych dozwolonych właściwości, aby umożliwić ich ustawienie z poziomu klienta. Jednak możesz też jeszcze bardziej ograniczyć możliwe do ustawienia właściwości tak, aby wymagane było, by przedmiot docelowy miał określoną parę tag_category:tag_value lub dla dowolnej wartości tag_category. Używając tych ograniczeń tagów w połączeniu z API klienta, możesz pozwolić użytkownikom ustawiać właściwości przedmiotów tylko wtedy, gdy ma to sens (np. kapelusz nie może śledzić liczby zabójstw, ale wyrzutnia rakiet już tak). Te wymagane tagi mogą istnieć na przedmiocie lub w jego powiązanej definicji przedmiotu.

Przykłady


Powiedzmy, że chcesz śledzić, ile razy użytkownik wystrzelił ze swojej wyrzutni rakiet. Można to zrobić na kilka sposobów, ale niezależnie od wybranej metody musisz najpierw zebrać modyfikacje właściwości w jedną grupę do wysłania, ponieważ, jak wspomniano wcześniej, istnieją ograniczenia dotyczące liczby wywołań dla zmian właściwości przedmiotu.

WebAPI

Możesz gromadzić niezbędne statystyki na swoim bezpiecznym serwerze gry, a na końcu rundy gry lub w innym odpowiednim momencie przesłać rezultaty przy pomocy metody POST do WebAPI IInventoryService/ModifyItems, używając swojego bezpiecznego klucza wydawcy.

Przykładowe dane formularza dla wywołania POST:
appid: 480 key: "0123456789abcdeffedcba9876543210" input_json:{ "steamid" : "1234", "timestamp" : 1513274037, "updates" : [] }

API Steamworks

Jeśli chcesz użyć interfejsu Steamworks do zmiany właściwości przedmiotu (jest to dość niezabezpieczona metoda), musisz najpierw dodać wymagane właściwości do listy dozwolonych właściwości dla tej aplikacji.

Następnie, jak w poprzednim przykładzie, na końcu rundy lub w innym odpowiednim momencie możesz rozpocząć aktualizację, ustawić właściwości, a następnie wysłać aktualizację do Steam.

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

W dalszej kolejności w obsłudze wywołania zwrotnego dla SteamInventoryResultReady_t otrzymasz wyniki wywołania, aby zaktualizować te właściwości przedmiotu.

Localization

Dynamic properties are not normally rendered in the web view of the user's backpack. However, you can use the values in your item's description if you specify the dynamic property name as a replacement token.

Using the preceding example, your description string in your item definition could be:
This rocket launcher has been fired %num_times_fired% times.

The description on the web would then look like:
This rocket launcher has been fired 100 times.

Replacement tokens (i.e. strings that match this regular expression "%([a-zA-Z0-9.-_]+)%") that have no corresponding dynamic property are automatically stripped. If you configure your dynamic properties on the Steam Inventory Service page under the "Item Dynamic Properties" section and set the "type" field, then integers and floats will be replaced with 0 instead, and bool properties will be replaced by "false".