Ru/Implementing Discord RPC

Внедрение Discord RPC в Source Engine - это просто, и это делает ваш мод более заметным, так как ваша игровая активность может быть увидена через Discord.
== Что такое Discord RPC? ==
Discord RPC - это библиотека служащая для коммуникации вашей игры с запущенным на вашем компьютере клиентом Discord'a. Это работает на Windows, MacOS и Linux. Вы можете использовать библиотеку напрямую, если хотите, или использовать ее в качестве руководства по написанию своей собственной, если она не подходит для вашей игры как есть.
Ниже приведен пример использования этой статьи в качестве основы с видимыми изменениями:
== Установка ==
Наперво, вам нужно скачать последнюю версию Discord RPC. Вы можете сделать это перейдя в GitHub репозиторий Discord'a. И скачать последнюю версию discord-rpc-win.zip, на момент написания статьи мы будем использовать версию v3.3.0. После завершения загрузки, откройте архив, перейдите в "win32-dynamic/lib/" и извлеките discord-rpc.lib в ваш мод <директория с исходным кодом>/src/lib/public/, после того как с этим будет покончено, сделайте тоже самое с зависимыми файлами, в открытом архиве перейдите на шаг назад и откройте директорию include, теперь извлеките discord_rpc.h и discord_register.h в <директория с исходным кодом>/src/public/. Теперь, заключающий шаг, снова перейдите на шаг назад в открытом архиве и откройте bin директорию, извлеките discord-rpc.dll в /bin директорию вашего мода. Для примера <Steam directory>/steamapps/sourcemods/YourMod/bin/.
== Настройка ==
Теперь, когда установка завершена, время настроить нашу систему. Здесь не так уж много нужно сделать, но это необходимый шаг, который вам придется сделать, дабы реализация работала.
Для начала, перейдите в <src code directory>/src/vpc_scripts/ и откройте source_dll_win32_base.vpc в вашем любимом текстовом редакторе (Лично я использую Notepad++). После того, как вы открыли файл, опуститесь в самый вниз до $Folder	"Link Libraries" и под $Implib "$LIBPUBLIC\vstdlib" добавьте $Lib "$LIBPUBLIC\discord-rpc". После того, как вы изменили VPC скрипт, не забудьте перезапустить createallprojects.bat и/или creategameprojects.bat прежде чем продолжить, в ином случае при сборке могут возникнуть ошибки.
Все, что нужно сделать - запустить систему Discord RPC при запуске модификации. Для того чтобы сделать это, откройте cdll_client_int.cpp и в самом низу списка заголовочных файлов, добавьте #include "discord_rpc.h" и #include , далее под
static ConVar s_cl_class("cl_class", "default", FCVAR_USERINFO|FCVAR_ARCHIVE, "Default class when joining a game");
добавьте
// Discord RPC
static ConVar cl_discord_appid("cl_discord_appid", "123456789123456789", FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT);
static int64_t startTimestamp = time(0);
где номера после cl_discord_appid, это RPC AppID вашего приложения, чтобы настроить RPC клиент, перейдите суда, как только вы настроите приложение, номер, который вам нужно поместить после cl_discord_appid будет находится в "APPLICATION ID", смотрите в разделе "General Information".
Как только это будет сделано, добавьте следующее выше CHLClient::CHLClient()
//-----------------------------------------------------------------------------
// Discord RPC
//-----------------------------------------------------------------------------
static void HandleDiscordReady(const DiscordUser* connectedUser)
{
	DevMsg("Discord: Connected to user %s#%s - %s\n",
		connectedUser->username,
		connectedUser->discriminator,
		connectedUser->userId);
}
static void HandleDiscordDisconnected(int errcode, const char* message)
{
	DevMsg("Discord: Disconnected (%d: %s)\n", errcode, message);
}
static void HandleDiscordError(int errcode, const char* message)
{
	DevMsg("Discord: Error (%d: %s)\n", errcode, message);
}
static void HandleDiscordJoin(const char* secret)
{
	// Not implemented
}
static void HandleDiscordSpectate(const char* secret)
{
	// Not implemented
}
static void HandleDiscordJoinRequest(const DiscordUser* request)
{
	// Not implemented
}
Теперь пролистайте вниз до CHLClient::Init( ... ) и добавьте следующее выше return true; внизу функции.
// Discord RPC
DiscordEventHandlers handlers;
memset(&handlers, 0, sizeof(handlers));
	
handlers.ready = HandleDiscordReady;
handlers.disconnected = HandleDiscordDisconnected;
handlers.errored = HandleDiscordError;
handlers.joinGame = HandleDiscordJoin;
handlers.spectateGame = HandleDiscordSpectate;
handlers.joinRequest = HandleDiscordJoinRequest;
char appid[255];
sprintf(appid, "%d", engine->GetAppID());
Discord_Initialize(cl_discord_appid.GetString(), &handlers, 1, appid);
if (!g_bTextMode)
{
	DiscordRichPresence discordPresence;
	memset(&discordPresence, 0, sizeof(discordPresence));
	discordPresence.state = "In-Game";
	discordPresence.details = "Main Menu";
	discordPresence.startTimestamp = startTimestamp;
	discordPresence.largeImageKey = "ModImageHere";
	Discord_UpdatePresence(&discordPresence);
}
"ModImageHere" это ключ изображения, помните ту старинцу разработчика Discord на которой вы были ранее, где настраивали свое приложение? Вернитесь туда и зайдите на страницу приложения, теперь, слева в списке, перейдите в "Rich Presence" и нажмите на "Art Assets", после, на "Add Image(s)". Добавьте изображение, которое вы хотите использовать для своего мода, и независимо от того, как вы назовете это изображение, это имя, послужит для "ModImageHere". Для примера, вот как это будет выглядеть, в мое случае very_cool_pic является "ModImageHere".
Теперь, когда с этим покончено, давайте перейдем к CHLClient::Shutdown( void ) функции, здесь мы добавим метод Shutdown, добавим его ниже </code>#endif</code> для WORKSHOP_IMPORT_ENABLED
// Discord RPC
Discord_Shutdown();
Теперь спуститесь еще ниже, к CHLClient::LevelInitPreEntity( ... ) и выше комментария для g_RagdollLVManager.SetLowViolence( pMapName ); добавьте
// Discord RPC
if (!g_bTextMode)
{
	DiscordRichPresence discordPresence;
	memset(&discordPresence, 0, sizeof(discordPresence));
	char buffer[256];
	discordPresence.state = "In-Game";
	sprintf(buffer, "Map: %s", pMapName);
	discordPresence.details = buffer;
	discordPresence.largeImageKey = "ModImageHere";
	Discord_UpdatePresence(&discordPresence);
}
Теперь добавим последний кусочек кода в CHLClient::LevelShutdown( void ). Ниже
gHUD.LevelShutdown();
 
добавьте
// Discord RPC
if (!g_bTextMode)
{
	DiscordRichPresence discordPresence;
	memset(&discordPresence, 0, sizeof(discordPresence));
	discordPresence.state = "In-Game";
	discordPresence.details = "Main Menu";
	discordPresence.startTimestamp = startTimestamp;
	discordPresence.largeImageKey = "ModImageHere";
	Discord_UpdatePresence(&discordPresence);
}
== Заключение ==
Установка и настройка завершены! Попробуйте запустить ваш мод и проверить Discord статус, теперь загрузите карту и проверьте его снова!
This implementation works on Source SDK 2013 (SP/MP), as well as Source SDK 2007 (thanks to the IOSoccer team for testing!).
Эта реализация работает на Source SDK 2013 (SP/MP), а также на Source SDK 2007 (спасибо IOSoccer team за тестирование)