Files
GabsPuNs-Project_Zenith_Main/Minecraft.Client/Windows64/Windows64_DiscordPresence.cpp
2026-05-14 19:16:33 -04:00

187 lines
4.4 KiB
C++

#include "stdafx.h"
#include <discord_rpc.h>
#include "Windows64_DiscordPresence.h"
#include "../../Minecraft.World/StringHelpers.h"
#include "MultiPlayerLevel.h"
#include "../Minecraft.World/LevelData.h"
DiscordPresence g_DiscordPresence;
static DiscordRichPresence presence;
void DiscordPresence::Initialise()
{
app.DebugPrintf("Initialising Discord Presence...\n");
DiscordEventHandlers handlers;
memset(&handlers, 0, sizeof(handlers));
memset(&presence, 0, sizeof(presence));
handlers.ready = [](const DiscordUser* request)
{
app.DebugPrintf("Discord Ready!\n");
};
handlers.errored = [](int errorCode, const char* message)
{
app.DebugPrintf("Discord Errored (%d): %s\n", errorCode, convStringToWstring(message).c_str());
};
handlers.disconnected = [](int errorCode, const char* message)
{
app.DebugPrintf("Discord Disconnected (%d): %s\n", errorCode, convStringToWstring(message).c_str());
};
Discord_Initialize("784487734748119067", &handlers, 1, nullptr);
app.DebugPrintf("Initialised Discord Presence...\n");
}
void DiscordPresence::Shutdown()
{
app.DebugPrintf("Shutting down Discord Presence...\n");
memset(&presence, 0, sizeof(presence));
Discord_Shutdown();
}
void DiscordPresence::Tick()
{
Discord_RunCallbacks();
}
void DiscordPresence::SetPresenceContext(int state)
{
const char* stateStr = "";
switch(state)
{
case CONTEXT_GAME_STATE_BLANK:
stateStr = "Enjoying the view!";
break;
case CONTEXT_GAME_STATE_RIDING_PIG:
stateStr = "Riding a pig";
break;
case CONTEXT_GAME_STATE_RIDING_MINECART:
stateStr = "Riding a minecart";
break;
case CONTEXT_GAME_STATE_BOATING:
stateStr = "In a boat";
break;
case CONTEXT_GAME_STATE_FISHING:
stateStr = "Fishing";
break;
case CONTEXT_GAME_STATE_CRAFTING:
stateStr = "Crafting";
break;
case CONTEXT_GAME_STATE_NETHER:
stateStr = "Into the Nether";
break;
case CONTEXT_GAME_STATE_CD:
stateStr = "Listening to a disc";
break;
case CONTEXT_GAME_STATE_MAP:
stateStr = "Looking at a map";
break;
case CONTEXT_GAME_STATE_ENCHANTING:
stateStr = "Enchanting";
break;
case CONTEXT_GAME_STATE_BREWING:
stateStr = "Brewing a potion";
break;
case CONTEXT_GAME_STATE_ANVIL:
stateStr = "Working at the Anvil";
break;
case CONTEXT_GAME_STATE_TRADING:
stateStr = "Meeting the neighbours";
break;
// New
case CONTEXT_GAME_STATE_BEACON:
stateStr = "Powering the beacon";
break;
case CONTEXT_GAME_STATE_END:
stateStr = "To the End";
break;
case CONTEXT_GAME_STATE_END_POEM:
stateStr = "Listening to the universe";
break;
case CONTEXT_GAME_STATE_FIREWORKS:
stateStr = "Mixing pyrotechnics";
break;
case CONTEXT_GAME_STATE_FURNACE:
stateStr = "Smelting away";
break;
case CONTEXT_GAME_STATE_HOPPER:
stateStr = "Filtering items";
break;
case CONTEXT_GAME_STATE_HORSE:
stateStr = "Checking the saddlebags";
break;
case CONTEXT_GAME_STATE_RIDING_HORSE:
stateStr = "Riding a horse";
break;
case CONTEXT_GAME_STATE_SIGN:
stateStr = "Leaving a message";
break;
default:
stateStr = "";
break;
}
presence.state = stateStr;
Discord_UpdatePresence(&presence);
}
void DiscordPresence::SetCurrentGameActivity(int details)
{
static char finalDetails[64];
const char* detailsStr = "";
const char* gameTypeStr = "";
Minecraft* pMinecraft = Minecraft::GetInstance();
if (pMinecraft->level != nullptr)
{
GameType* gameType = pMinecraft->level->getLevelData()->getGameType();
if (gameType == GameType::SURVIVAL)
gameTypeStr = "Survival Mode";
else if (gameType == GameType::CREATIVE)
gameTypeStr = "Creative Mode";
else if (gameType == GameType::ADVENTURE)
gameTypeStr = "Adventure Mode";
else
gameTypeStr = "Unknown Mode";
}
switch(details)
{
case CONTEXT_PRESENCE_IDLE:
detailsStr = "Idle";
break;
case CONTEXT_PRESENCE_MENUS:
detailsStr = "In the menus";
break;
case CONTEXT_PRESENCE_MULTIPLAYER:
detailsStr = "Playing Multiplayer - %s";
break;
case CONTEXT_PRESENCE_MULTIPLAYEROFFLINE:
detailsStr = "Offline Multiplayer - %s";
break;
case CONTEXT_PRESENCE_MULTIPLAYER_1P:
detailsStr = "Playing Alone - %s";
break;
case CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE:
detailsStr = "Offline Alone - %s";
break;
default:
detailsStr = "";
break;
}
snprintf(finalDetails, sizeof(finalDetails), detailsStr, gameTypeStr);
presence.details = finalDetails;
Discord_UpdatePresence(&presence);
}