Внедрение Discord RPC

From Valve Developer Community
< Ru
Revision as of 16:17, 12 July 2023 by Soyka (talk | contribs) (Soyka moved page Implementing Discord RPC:ru to Implementing Discord RPC/ru: MultiPage update)
Jump to navigation Jump to search
English (en)Русский (ru)Translate (Translate)

Template:Todo:ru


Внедрение Discord RPC в Source Engine - это просто, и это делает ваш мод более заметным, так как ваша игровая активность может быть увидена через Discord.

Что такое Discord RPC?

Discord RPC - это библиотека служащая для комуникации вашей игры с запущенным на вашем компьютере клиентом Discord'a. Это работает на Windows, MacOS и Linux. Вы можете использовать библиотеку напрямую, если хотите, или использовать ее в качестве руководства по написанию своей собственной, если она не подходит для вашей игры как есть.

Ниже приведен пример использования этой статьи в качестве основы с видимыми изменениями:

DiscordRPCExample.png

Установка

Наперво, вам нужно скачать последнюю версию 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".

DiscordRPCNameHint01.png



Теперь, когда с этим покончено, давайте перейдем к 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 за тестирование)