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

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

Работаем с 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 - %llun", 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 %un", pTradeInviteReceived->m_steamIDPartner.SteamRender(), pTradeInviteReceived->m_unTradeRequestID);
	   //Ваш код ответа на Trade запрос.
}

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

Автор: Dinisoid

Источник

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


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js