Внедрение Discord RPC

From Valve Developer Community
< Ru
Jump to navigation Jump to search
English (en)Русский (ru)Translate (Translate)
Dead End - Icon.png
This article has no Wikipedia icon links to other VDC articles. Please help improve this article by adding links Wikipedia icon that are relevant to the context within the existing text.
January 2024
Нужно сделать: Эта реализация довольно проста, поэтому любые изменения или дополнения будут высоко оценены!

Внедрение 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 за тестирование)

Wikipedia - Letter.png
This article has not been added to any content Wikipedia icon categories. Please help out by Wikipedia icon adding categories.
January 2024