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

в 10:43, , рубрики: c++, Steam, steam api, steam works, steamworks, Программирование, метки: , , ,

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

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

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

Я буду использовать 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

Источник

Поделиться

* - обязательные к заполнению поля