Документація Steamworks
Поглиблена розширена присутність

Огляд

Завдяки нещодавньому виходу нового чату Steam і функції друзів ми збільшили можливості системи розширеної присутності, яка показує більше інформації про ігри, у які грають користувачі. Розширена присутність гравця є способом залучити друзів гравця до його діяльності. Наприклад, друзі, які володіють грою, залучаються, бо знають час, коли можна приєднатися до спільної гри, або бачать, що про цю гру можна поговорити. Ті, хто грою не володіють, можуть зацікавитися нею, коли побачать різні рядки розширеної присутності, де докладніше розповідається про маловідому їм гру.

Розширена присутність показується в багатьох контекстах

У цьому розділі ми опишемо два налаштування, які ви можете встановити для контролю над виглядом ваших ігор у списках друзів гравця:
  • Рядок розширеної присутності — використовується для показу інформації про стан гравця в грі, яку його друзі можуть знати.
  • Групування друзів — використовується для групування друзів, які грають в одну гру.

Рядок розширеної присутності, що контролюється грою


Друзі бачать більше інформації про ігри вже під час першого погляду
Наявну систему можна пристосувати до ваших потреб. Ви можете самі визначити, яка інформація буде найцікавішою для друзів гравця.
Ваша гра матиме власні особливі дані, які показуватимуться в розширеній присутності. Для початку вам потрібно обміркувати наступне:

Багатокористувацькі ігри

Залежно від типу багатокористувацької гри інформація, що допомагає друзям гравця зрозуміти, коли доцільно приєднатися, може відрізнятися. Деякі ігри містять раунди, що обмежені часом чи кількістю живих гравців, тож саме цю інформацію варто показувати. Інші багатокористувацькі ігри завершуються після досягнення цілі, тож доречно вказувати поступ на шляху до неї. Інформація про ігровий режим чи мапу теж може бути корисною для друзів гравця в прийнятті рішення про долучення до гри.

Самітні ігри

Хоча в самітних іграх друзі гравця не зможуть приєднатися до гри, але їх можна залучити цікавою інформацією, спонукати переглянути гру друга, поговорити з ним щодо стратегій чи найцікавіших моментів. Інформація про зону, розділ чи рівень гравця, або ж про його поточну діяльність у грі зможуть допомогти досягти цих цілей.

* Для визначення показуваного рядка в списку друзів і чаті Steam установіть пару ключ-значення steam_display у SetRichPresence. Більше інформації і приклади викликів API знаходяться наприкінці цього розділу.

Приклади даних для показу
  • Лишилося часу
  • Минуло часу
  • Живих гравців
  • Назва мапи чи зони
  • Рівень гравця
  • Клас гравця
  • Рахунок у грі
  • Складність
  • Тип режиму гри
  • Вільних місць на сервері
  • Дії гравця (складання колоди, зміна складу, головне меню тощо)
ПРИМІТКА: майте на увазі, що текст розширеної присутності повинен уміщуватися в один рядок, і що він показується під іменем гравця в списку друзів. Якщо текст завеликий, то він буде обрізаний або пропущений.

Групування друзів


Окрім рядка з додатковою інформацією, новий список друзів показує групи друзів, що грають разом. Друзі в групі, на одному сервері чи в одній команді будуть згруповані разом у категорії гри — їх поєднуватиме лінія. Принцип групування залежатиме від вашої гри й того, що потрібно показати. Наприклад, у Dota 2 є можливість спільної гри групами до 5 осіб, тож саме такі групи друзів будуть показуватися, а не просто випадково підібрані грою 5 гравців однієї команди. У Counter-Strike двоє друзів можуть грати на одному сервері, але гравці об’єднуватимуться не за спільним сервером, а лише якщо грають разом в одній групі гравців Steam.

Коли друзі згруповані, то інші бачитимуть, чи можна до них приєднатися

* Для визначення групування гравців у списку друзів і чаті Steam установіть пари ключ-значення steam_player_group та steam_player_group_size у SetRichPresence.

API Steam і локалізація

  • Інформацію про виклики API Steam для встановлення нових рядків розширеної присутності можна знайти тут: https://partner.steamgames.com/doc/api/ISteamFriends#SetRichPresence

  • Оскільки нова розширена присутність показує унікальні рядки для кожної гри, то необхідна локалізація, щоби гравці на всіх підтримуваних мовах могли розуміти цю інформацію. Додаткову інформацію про її налаштування можна знайти тут:
    https://partner.steamgames.com/doc/api/ISteamFriends#richpresencelocalization

  • Коли ви підключите дані належним чином, запустите гру й переконаєтеся, що ввійшли в Steam на сайті, то зможете перевірити чи все працює й що показуватиметься тут:
    https://steamcommunity.com/dev/testrichpresence


Нижче наведено приклад коду для демонстрації простоти налаштування.

Фрагмент коду
/*--------------------------- ПРИКЛАД -------------------*/ const char *pchStatus; if ( bWinning && cWinners > 1 ) { pchStatus = "Tied"; } else if ( bWinning ) { pchStatus = "Winning"; } else { pchStatus = "Losing"; } SteamFriends()->SetRichPresence( "gamestatus", pchStatus ); bool bDisplayScoreInRichPresence = true; if ( bDisplayScoreInRichPresence ) { char rgchBuffer[32]; sprintf_safe( rgchBuffer, "%2u", uMyScore ); SteamFriends()->SetRichPresence( "score", rgchBuffer ); } SteamFriends()->SetRichPresence( "steam_display", bDisplayScoreInRichPresence ? "#StatusWithScore" : "#StatusWithoutScore" ); // Приклад групування друзів, коли вони грають разом if ( nPartyMemberCount > 1 && strPartyID ) { // Якщо ми в групі, де більше 1 гравця, і маємо належний PartyID, тоді // інформуємо систему розширеної присутності Steam. steamapicontext->SteamFriends()->SetRichPresence( "steam_player_group", strPartyID ); steamapicontext->SteamFriends()->SetRichPresence( "steam_player_group_size", CNumStr( nPartyMemberCount ) ); } else { // Інакше очищуємо всю наявну інформацію, адже ми не в групі. steamapicontext->SteamFriends()->SetRichPresence( "steam_player_group", nullptr ); steamapicontext->SteamFriends()->SetRichPresence( "steam_player_group_size", nullptr ); }

Код вище використовує локалізацію, що містить англійські токени, як-от:

"lang" { "language" "english" "tokens" { "#StatusWithoutScore" "{#Status_%gamestatus%}" "#StatusWithScore" "{#Status_%gamestatus%}: %SCORE%" "#Status_AtMainMenu" "At the main menu" "#Status_WaitingForMatch" "Waiting for match" "#Status_Winning" "Winning" "#Status_Losing" "Losing" "#Status_Tied" "Tied" } }