- PVSM.RU - https://www.pvsm.ru -

Работаем с SteamWorks. Часть 1

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

На данный момент доступ к SteamWorks можно получить если вы являетесь «гейм студией» и хотите распространять свое приложение в steam или через сервис Steam Greenlight, тем самым став партнером steam. Подробности здесь [1]. Open SteamWorks это открытая реализация Steam api (дизассемблированная версия библиотек steam.)

“Open SteamWorks designed for people who know, what they do” — Ryan Stecker. Так автор открытой версии ответил на вопрос (не мой) о наличии дополнительной документации, вся документация которая есть в наличии, является комментариями в исходных кодах. Загрузить последнюю версию Open SteamWorks можно с сайта [2].

Я буду использовать Visual Studio, если у вас есть под рукой mingw, можете использовать его. Приступим к созданию консольного приложения (вы можете использовать пример test platform из open steamworks).
Подключаем необходимые заголовочные файлы.

#include <SteamclientAPI.h>
#include <SteamAPI.h>

Подключаем необходимые библиотеки для компиляции нашего приложения.

#pragma comment( lib, "../Resources/Libs/Win32/steamclient" )
#pragma comment( lib, "../Resources/Libs/Win32/steam" )

Получаем базу Steam с 12 версией интерфейса.
В дизассемблированном виде это компилируется как поиск в реестре пути до стима и подключение к нему.

CSteamAPILoader loader;
auto *Client = (ISteamClient012 *)loader.GetSteam3Factory()(STEAMCLIENT_INTERFACE_VERSION_012, NULL);

Проверяем смогли ли мы получить базу.

if ( !Client )
{
         printf("Unable to get ISteamClient.");
}

Создаем пайпу для взаимодействия.

HSteamPipe pipe = Client->CreateSteamPipe();

Проверяем пайпу.

if ( !pipe )
{
     printf("Unable to get pipe");
}

Подключаемся к глобальному пользователю (запущенный стим).

HSteamUser user = Client->ConnectToGlobalUser( pipe );

Проверка подключения к глобальному пользователю.

if ( !user )
{
            printf("Unable connect to global user");
}

Получаем доступ к api v 12 интерфейса пользователя.

auto *User = (ISteamUser012 *)Client->GetISteamUser( user, pipe, STEAMUSER_INTERFACE_VERSION_012);

Получаем доступ к api v.13 и v. 1 интерфейса друзей.

auto *Friends =  (ISteamFriends001 *)Client->GetISteamFriends(user, pipe, STEAMFRIENDS_INTERFACE_VERSION_001);

auto *Friends13 = (ISteamFriends013 *)Client->GetISteamFriends(user, pipe, STEAMFRIENDS_INTERFACE_VERSION_013);

Предостерегаю тех, кто будет использовать интерфейсы IClient (IClientUtils, IClientFriends, и т. д.), все эти интерфейсы перестают работать сразу после глобального обновления steam, ваше приложение будет выдавать ошибки, используйте ISteam (стабильный) изложенный выше, если очень нужно использовать функции из IClient интерфейсов, а такое иногда случается, скопируйте все важные DLL файлы для вашего приложения (можно посмотреть в таблице импорта) и держите в папке с вашим приложением.

Теперь мы попробуем сделать самую простую вещь, поменять статус в стиме. (api для смены статуса доступна в первой версии интерфейса)

Friends->SetPersonaState(k_EPersonaStateSnooze);

Компилируем, запускаем и теперь мы имеем статус спит в стиме.

Получаем количество друзей.

int friendcount = Friends->GetFriendCount();

printf("%d",friendcount); 

Меняем свое имя

Friends->SetPersonaName("Big_balls");

Перебираем наших друзей, получаем структуру SteamID(64bits) текущего друга по индексу, проверяем статус текущего друга, если равняется статусу онлайн и имя друга Crey, отсылаем ему сообщение.

for(int i = 1; i < friendcount + 1; i++)
 {
 CSteamID thisfriend  = Friends->GetFriendByIndex(i);
 if(Friends->GetFriendPersonaState(thisfriend) == k_EPersonaStateOnline && strstr(Friends- >GetFriendPersonaName(thisfriend),"Crey") != 0)
     {
             
         char myMsg[] = "My friend Crey is online.";
         Friends->SendMsgToFriend(thisfriend, k_EChatEntryTypeEmote,myMsg,strlen(myMsg)+1);

     }

Думаю теперь все понимают, что при помощи SteamWorks можно легко написать trade бота, для обмена вещей по «заданному курсу» и много чего интересного.

В следующих частях мы рассмотрим работу с IScreenshots, IUserstats(achievements), callbacks и возможно дело дойдет до написания бота.

Автор: Dinisoid

Источник [3]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/19623

Ссылки в тексте:

[1] здесь: http://www.steampowered.com/steamworks/FAQ.php

[2] сайта: http://hg.opensteamworks.org

[3] Источник: http://habrahabr.ru/post/157999/