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

от автора

Сегодня мы будем работать с интерфейсами Apps, Utils, а так же познакомимся с тем как реализовывать callbacks в нашем приложении. Рекомендую ознакомиться с 1 частью, прежде чем приступать ко второй.

Для активации дебаг режима в steam нужно добавить параметры запуска:

 -dev -console 

Для вывода отладочной информации с нашего приложения переходим в появившуюся консоль и пишем:

log_ipc  verbose <имя нашего приложения.exe> 

Подключим заголовочный файл #include <windows.h> для использования необходимых функций.
Используя наше тестовое приложение из первой части, добавим подключение необходимых интерфейсов.

auto *Utils = (ISteamUtils001 *)Client->GetISteamUtils(pipe,STEAMUTILS_INTERFACE_VERSION_001); auto *Apps = (ISteamApps004 *)Client->GetISteamApps(user,pipe,STEAMAPPS_INTERFACE_VERSION_004); 

Попробуем получить время покупки игры на моем steam аккаунте c заданным ID, объявим AppId_t,
который имеет тип uint32, поместим в него значение 500 (Left 4 Dead).

AppId_t l4d(500); 

Получаем время покупки и серверное время в формате unix timestamp.

int PurchaseTime = Apps->GetEarliestPurchaseUnixTime(l4d); int time = Utils->GetServerRealTime(); 

Конвертируем unix timestamp в удобный вид для человека.

time_t rawtime = time; time_t Ptime = PurchaseTime; struct tm timeinfo; char timebuf[32]; localtime_s( &timeinfo,&rawtime ); asctime_s (timebuf,32,&timeinfo); printf( "%s \n", timebuf );  localtime_s( &timeinfo,&Ptime); asctime_s (timebuf,32,&timeinfo); printf( "%s \n", timebuf); 

На выходе получаю 1 — реальное время сервера, 2 — время когда я приобрел игру.

Sat Nov 10 09:51:15 2012 Sat Nov 22 17:03:45 2008 

Теперь попробуем получить список друзей и уникальную (не изменяющуюся ссылку) на их профиль.

CSteamID curID; int friendcount = Friends->GetFriendCount(); for(int i = 0; i < friendcount; i++)    {    curID = Friends13->GetFriendByIndex(i, k_EFriendFlagAll);    printf("%s - %llu\n", Friends->GetFriendPersonaName(curID), curID.ConvertToUint64());    } system("pause"); 

Получаем такой вывод:

:REC: FabZen - 765611979787897xx DrLuke - 765611979853980xx [EM] Cooler_sk - 765611979862334xx Maryus - 765611979878419xx vorram - 765611979915317xx 0nb0ard - 765611979922297xx .......... 

я закрыл последние две цифры символом <х>, теперь данный id можно подставить в steamcommunity.com/profiles/[id]

Приступим к работе с callbacks, все callbacks перечислены в файле FriendsCommon.h в папке OpenSteamWorks.

Пока не нажмем клавишу Escape получаем callback, сравниваем его с структурой FriendChatMsg_t, если условие верное, выделяем память под строку сообщения, получаем сообщение, если тип сообщения равняется обычному или написанному через /me — сравниваем полученную строку с «hello», если идентичны — посылаю в ответ приветствие, очищаю последний callback и выхожу из программы.

CallbackMsg_t callBack; while (!GetAsyncKeyState(VK_ESCAPE)) { 	Sleep(1); 	if ( Steam_BGetCallback( pipe, &callBack ) )          {  	if(callBack.m_iCallback ==  FriendChatMsg_t::k_iCallback) { 		 FriendChatMsg_t *pFriendMessageInfo = (FriendChatMsg_t *)callBack.m_pubParam; 		 EChatEntryType eMsgType;          char szData[k_cchFriendChatMsgMax];          memset(szData, 0, k_cchFriendChatMsgMax);          Friends->GetChatMessage(pFriendMessageInfo>m_ulSenderID,pFriendMessageInfo>m_iChatID,               szData,sizeof(szData),&eMsgType);      if (eMsgType == k_EChatEntryTypeChatMsg || k_EChatEntryTypeEmote)  {  	if (strcmp(szData, "hello") == 0 && (pFriendMessageInfo->m_ulSenderID != User->GetSteamID())){      Friends->SendMsgToFriend(pFriendMessageInfo->m_ulFriendID,k_EChatEntryTypeChatMsg,"hello my friend",22); 	Steam_FreeLastCallback(pipe); 	ExitProcess(0); 		   } 	     } 	 } 	 Steam_FreeLastCallback(pipe);    } }	 

Пример callback-a на Trade Response (запрос обмена вещей).

if (callbackMsg.m_iCallback == TradeInviteReceived_t::k_iCallback) {        TradeInviteReceived_t* pTradeInviteReceived = (TradeInviteReceived_t*) callbackMsg.m_pubParam;        printf("Trade from %s, ID %u\n", pTradeInviteReceived->m_steamIDPartner.SteamRender(), pTradeInviteReceived->m_unTradeRequestID); 	   //Ваш код ответа на Trade запрос. } 

В следующей статье будет показана работа с пользовательскими достижениями (ISteamUserStats) и интерфейс (ISteamScreenshots).

ссылка на оригинал статьи http://habrahabr.ru/post/158119/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *