diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp index e2eae1a3..a5820aef 100644 --- a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp @@ -35,16 +35,16 @@ namespace int UIScene_SettingsGraphicsMenu::LevelToDistance(int level) { - static const int table[5] = {2,4,8,16,32}; + static const int table[4] = {2,4,8,16,32}; if(level < 0) level = 0; - if(level > 5) level = 5; + if(level > 4) level = 4; return table[level]; } int UIScene_SettingsGraphicsMenu::DistanceToLevel(int dist) { - static const int table[5] = {2,4,8,16,32}; - for(int i = 0; i < 6; i++){ + static const int table[4] = {2,4,8,16,32}; + for(int i = 0; i < 5; i++){ if(table[i] == dist) return i; } @@ -78,7 +78,7 @@ UIScene_SettingsGraphicsMenu::UIScene_SettingsGraphicsMenu(int iPad, void *initD m_sliderInterfaceOpacity.init(TempString,eControl_InterfaceOpacity,0,100,app.GetGameSettings(m_iPad,eGameSetting_InterfaceOpacity)); swprintf(TempString, 256, L"Render Distance: %d",app.GetGameSettings(m_iPad,eGameSetting_RenderDistance)); - m_sliderRenderDistance.init(TempString,eControl_RenderDistance,0,4,DistanceToLevel(app.GetGameSettings(m_iPad,eGameSetting_RenderDistance))); + m_sliderRenderDistance.init(TempString,eControl_RenderDistance,0,3,DistanceToLevel(app.GetGameSettings(m_iPad,eGameSetting_RenderDistance))); int currentGraphics = app.GetGameSettings(m_iPad, eGameSetting_GraphicsMode); diff --git a/Minecraft.Client/Windows64/Windows64_DiscordPresence.cpp b/Minecraft.Client/Windows64/Windows64_DiscordPresence.cpp new file mode 100644 index 00000000..79cd5c62 --- /dev/null +++ b/Minecraft.Client/Windows64/Windows64_DiscordPresence.cpp @@ -0,0 +1,187 @@ +#include "stdafx.h" + +#include +#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); +} \ No newline at end of file diff --git a/Minecraft.Client/Windows64/Windows64_DiscordPresence.h b/Minecraft.Client/Windows64/Windows64_DiscordPresence.h new file mode 100644 index 00000000..bc722407 --- /dev/null +++ b/Minecraft.Client/Windows64/Windows64_DiscordPresence.h @@ -0,0 +1,15 @@ +#pragma once + +class DiscordPresence +{ +public: + void Initialise(); + void Shutdown(); + + void Tick(); + + void SetPresenceContext(int state); + void SetCurrentGameActivity(int details); +}; + +extern DiscordPresence g_DiscordPresence; \ No newline at end of file diff --git a/Minecraft.Client/cmake/sources/Windows.cmake b/Minecraft.Client/cmake/sources/Windows.cmake index 82cda27d..85fb0f5d 100644 --- a/Minecraft.Client/cmake/sources/Windows.cmake +++ b/Minecraft.Client/cmake/sources/Windows.cmake @@ -292,6 +292,8 @@ set(_MINECRAFT_CLIENT_WINDOWS_WINDOWS64 "${BASE_DIR}/Resource.h" "${BASE_DIR}/Windows64_App.cpp" "${BASE_DIR}/Windows64_App.h" + "${BASE_DIR}/Windows64_DiscordPresence.cpp" + "${BASE_DIR}/Windows64_DiscordPresence.h" "${BASE_DIR}/Windows64_UIController.cpp" "${BASE_DIR}/Windows64_UIController.h" "${BASE_DIR}/KeyboardMouseInput.cpp" diff --git a/Minecraft.Server/cmake/sources/Common.cmake b/Minecraft.Server/cmake/sources/Common.cmake index 7b7c28b5..a496a622 100644 --- a/Minecraft.Server/cmake/sources/Common.cmake +++ b/Minecraft.Server/cmake/sources/Common.cmake @@ -460,6 +460,7 @@ set(_MINECRAFT_SERVER_COMMON_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/Network/WinsockNetLayer.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/PostProcesser.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/Windows64_App.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/Windows64_DiscordPresence.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/Windows64_Minecraft.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/Windows64_UIController.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/WitchModel.cpp"