Документація 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" } }