Внедрение Discord RPC
January 2024
Внедрение 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 <time.h>
, далее под
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, добавим его ниже #endif для 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 за тестирование)
January 2024