From ef8d24c6a7650088457ace645eb539a9984e17a8 Mon Sep 17 00:00:00 2001 From: GabsPuNs Date: Fri, 15 May 2026 12:32:26 -0400 Subject: [PATCH] Update UIScene_InGameHostOptionsMenu Thanks Hinder --- .../UI/UIScene_InGameHostOptionsMenu.cpp | 142 ++++++++++++------ .../Common/UI/UIScene_InGameHostOptionsMenu.h | 25 ++- Minecraft.World/Difficulty.cpp | 28 ++++ Minecraft.World/Difficulty.h | 20 ++- Minecraft.World/Level.cpp | 14 ++ Minecraft.World/Level.h | 5 +- Minecraft.World/cmake/sources/Common.cmake | 1 + 7 files changed, 167 insertions(+), 68 deletions(-) create mode 100644 Minecraft.World/Difficulty.cpp diff --git a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp index 51992e32..b025a459 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp @@ -1,64 +1,109 @@ -#include "stdafx.h" #include "UI.h" #include "UIScene_InGameHostOptionsMenu.h" -#include "..\..\Minecraft.h" #include "..\..\MultiPlayerLocalPlayer.h" #include "..\..\ClientConnection.h" -#include "..\..\..\Minecraft.World\net.minecraft.network.h" -#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\MultiPlayerLevel.h" + +int m_iGamemodeTitleSetting[3]= +{ + IDS_SURVIVAL, + IDS_CREATIVE, + IDS_ADVENTURE +}; + +int m_iDifficultyTitleSetting[4]= +{ + IDS_DIFFICULTY_TITLE_PEACEFUL, + IDS_DIFFICULTY_TITLE_EASY, + IDS_DIFFICULTY_TITLE_NORMAL, + IDS_DIFFICULTY_TITLE_HARD +}; UIScene_InGameHostOptionsMenu::UIScene_InGameHostOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) { // Setup all the Iggy references we need for this scene initialiseMovie(); - m_checkboxFireSpreads.init(app.GetString(IDS_FIRE_SPREADS), eControl_FireSpreads, app.GetGameHostOption(eGameHostOption_FireSpreads)!=0); - m_checkboxTNT.init(app.GetString(IDS_TNT_EXPLODES), eControl_TNT, app.GetGameHostOption(eGameHostOption_TNT)!=0); + Init(); +} - m_checkboxDoMobLoot.init(app.GetString(IDS_MOB_LOOT), eControl_DoMobLoot, app.GetGameHostOption(eGameHostOption_DoMobLoot)); - m_checkboxDoTileDrops.init(app.GetString(IDS_TILE_DROPS), eControl_DoTileDrops, app.GetGameHostOption(eGameHostOption_DoTileDrops)); - m_checkboxNaturalRegeneration.init(app.GetString(IDS_NATURAL_REGEN), eControl_NaturalRegeneration, app.GetGameHostOption(eGameHostOption_NaturalRegeneration)); +void UIScene_InGameHostOptionsMenu::Init() +{ + m_hostOptionsList.AddNewCheckbox(app.GetString(IDS_FIRE_SPREADS), eControl_FireSpreads, app.GetGameHostOption(eGameHostOption_FireSpreads) != 0); + m_hostOptionsList.AddNewCheckbox(app.GetString(IDS_TNT_EXPLODES), eControl_TNT, app.GetGameHostOption(eGameHostOption_TNT) != 0); - // If cheats are disabled, remove checkboxes - if (!app.GetGameHostOption(eGameHostOption_CheatsEnabled)) + if (app.GetGameHostOption(eGameHostOption_CheatsEnabled)) { - removeControl(&m_checkboxMobGriefing, true); - removeControl(&m_checkboxKeepInventory, true); - removeControl(&m_checkboxDoMobSpawning, true); - removeControl(&m_checkboxDoDaylightCycle, true); + m_hostOptionsList.AddNewCheckbox(app.GetString(IDS_MOB_LOOT), eControl_DoMobLoot, app.GetGameHostOption(eGameHostOption_DoMobLoot)); + m_hostOptionsList.AddNewCheckbox(app.GetString(IDS_TILE_DROPS), eControl_DoTileDrops, app.GetGameHostOption(eGameHostOption_DoTileDrops)); + m_hostOptionsList.AddNewCheckbox(app.GetString(IDS_NATURAL_REGEN), eControl_NaturalRegeneration, app.GetGameHostOption(eGameHostOption_NaturalRegeneration)); + + m_hostOptionsList.AddNewButton(L"Set Day", eControl_TimeSetDay); + m_hostOptionsList.AddNewButton(L"Set Night", eControl_TimeSetNight); + + int m_CurrentDifficulty = app.GetGameSettings(m_iPad, eGameSetting_Difficulty); + + WCHAR TempString[256]; + swprintf_s(TempString, 256, L"%ls: %ls", app.GetString(IDS_SLIDER_DIFFICULTY), app.GetString(m_iDifficultyTitleSetting[app.GetGameSettings(m_iPad, eGameSetting_Difficulty)])); + m_hostOptionsList.AddNewSlider(TempString, eControl_Difficulty, 0, 3, app.GetGameSettings(m_iPad, eGameSetting_Difficulty)); + + swprintf_s(TempString, 256, L"Game Mode: %ls", app.GetString(m_iGamemodeTitleSetting[0])); + m_hostOptionsList.AddNewSlider(TempString, eControl_GameType, 0, 2, 0); + + m_hostOptionsList.AddNewButton(L"Set World Spawn Point", eControl_PlayerPermissions); + + auto* pMinecraft = Minecraft::GetInstance(); + + if (pMinecraft->getLevel(0)) + { + m_hostOptionsList.AddNewLabel(L""); + m_hostOptionsList.AddNewLabel(L"Weather"); + + int weatherState = pMinecraft->getLevel(0)->getWeatherState(); + + std::wstring weatherString = L""; + + // TODO: Confirm if these names are correct + if (weatherState == 1) + weatherString = L"Rain"; + else if (weatherState == 2) + weatherString = L"Thunder"; + else + weatherString = L"Clear"; + + m_hostOptionsList.AddNewSlider(weatherString, eControl_Weather, 0, 2, 0); + } + + m_hostOptionsList.AddNewCheckbox(L"Weather Cycle", eControl_ShowCoordinates, 0); } - m_checkboxMobGriefing.init(app.GetString(IDS_MOB_GRIEFING), eControl_MobGriefing, app.GetGameHostOption(eGameHostOption_MobGriefing)); - m_checkboxKeepInventory.init(app.GetString(IDS_KEEP_INVENTORY), eControl_KeepInventory, app.GetGameHostOption(eGameHostOption_KeepInventory)); - m_checkboxDoMobSpawning.init(app.GetString(IDS_MOB_SPAWNING), eControl_DoMobSpawning, app.GetGameHostOption(eGameHostOption_DoMobSpawning)); - m_checkboxDoDaylightCycle.init(app.GetString(IDS_DAYLIGHT_CYCLE), eControl_DoDaylightCycle, app.GetGameHostOption(eGameHostOption_DoDaylightCycle)); + m_hostOptionsList.AddNewCheckbox(app.GetString(IDS_MOB_GRIEFING), eControl_MobGriefing, app.GetGameHostOption(eGameHostOption_MobGriefing)); + m_hostOptionsList.AddNewCheckbox(app.GetString(IDS_KEEP_INVENTORY), eControl_KeepInventory, app.GetGameHostOption(eGameHostOption_KeepInventory)); + m_hostOptionsList.AddNewCheckbox(app.GetString(IDS_MOB_SPAWNING), eControl_DoMobSpawning, app.GetGameHostOption(eGameHostOption_DoMobSpawning)); + + auto* localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(m_iPad); + if (!localPlayer) + { + app.DebugPrintf(" Error: couldn't retrieve network player %d\n", localPlayer->GetOnlineName()); + return; + } - INetworkPlayer *localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); unsigned int privs = app.GetPlayerPrivileges(localPlayer->GetSmallId()); - if(app.GetGameHostOption(eGameHostOption_CheatsEnabled) - && Player::getPlayerGamePrivilege(privs,Player::ePlayerGamePrivilege_CanTeleport) - && g_NetworkManager.GetPlayerCount() > 1) + + const bool canTeleport = app.GetGameHostOption(eGameHostOption_CheatsEnabled) && Player::getPlayerGamePrivilege(privs, Player::ePlayerGamePrivilege_CanTeleport) && g_NetworkManager.GetPlayerCount() > 1; + if (canTeleport) { - m_buttonTeleportToPlayer.init(app.GetString(IDS_TELEPORT_TO_PLAYER), eControl_TeleportToPlayer); - m_buttonTeleportToMe.init(app.GetString(IDS_TELEPORT_TO_ME), eControl_TeleportToMe); - } - else - { - removeControl(&m_buttonTeleportToPlayer, true); - removeControl(&m_buttonTeleportToMe, true); + m_hostOptionsList.AddNewButton(app.GetString(IDS_TELEPORT_TO_PLAYER), eControl_TeleportToPlayer); + m_hostOptionsList.AddNewButton(app.GetString(IDS_TELEPORT_TO_ME), eControl_TeleportToMe); } } wstring UIScene_InGameHostOptionsMenu::getMoviePath() { if(app.GetLocalPlayerCount() > 1) - { return L"InGameHostOptionsSplit"; - } else - { return L"InGameHostOptions"; - } } void UIScene_InGameHostOptionsMenu::updateTooltips() @@ -70,6 +115,7 @@ void UIScene_InGameHostOptionsMenu::handleReload() { UIScene::handleReload(); +/* // If cheats are disabled, remove checkboxes if (!app.GetGameHostOption(eGameHostOption_CheatsEnabled)) { @@ -78,31 +124,31 @@ void UIScene_InGameHostOptionsMenu::handleReload() removeControl(&m_checkboxDoMobSpawning, true); removeControl(&m_checkboxDoDaylightCycle, true); } +*/ INetworkPlayer *localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + if (!localPlayer) + return; + unsigned int privs = app.GetPlayerPrivileges(localPlayer->GetSmallId()); - if(app.GetGameHostOption(eGameHostOption_CheatsEnabled) - && Player::getPlayerGamePrivilege(privs,Player::ePlayerGamePrivilege_CanTeleport) - && g_NetworkManager.GetPlayerCount() > 1) + const bool canTeleport = app.GetGameHostOption(eGameHostOption_CheatsEnabled) && Player::getPlayerGamePrivilege(privs, Player::ePlayerGamePrivilege_CanTeleport) && g_NetworkManager.GetPlayerCount() > 1; + + if(!canTeleport) { - } - else - { - removeControl(&m_buttonTeleportToPlayer, true); - removeControl(&m_buttonTeleportToMe, true); + //removeControl(&m_buttonTeleportToPlayer, true); + //removeControl(&m_buttonTeleportToMe, true); } } void UIScene_InGameHostOptionsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) { - //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); - ui.AnimateKeyPress(iPad, key, repeat, pressed, released); switch(key) { case ACTION_MENU_CANCEL: if(pressed) { +/* unsigned int hostOptions = app.GetGameHostOption(eGameHostOption_All); app.SetGameHostOption(hostOptions, eGameHostOption_FireSpreads, m_checkboxFireSpreads.IsChecked()); app.SetGameHostOption(hostOptions, eGameHostOption_TNT, m_checkboxTNT.IsChecked()); @@ -125,10 +171,9 @@ void UIScene_InGameHostOptionsMenu::handleInput(int iPad, int key, bool repeat, Minecraft *pMinecraft = Minecraft::GetInstance(); shared_ptr player = pMinecraft->localplayers[m_iPad]; if(player->connection) - { player->connection->send(std::make_shared(ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, hostOptions)); - } } +*/ navigateBack(); @@ -150,12 +195,11 @@ void UIScene_InGameHostOptionsMenu::handleInput(int iPad, int key, bool repeat, void UIScene_InGameHostOptionsMenu::handlePress(F64 controlId, F64 childId) { - TeleportMenuInitData *initData = new TeleportMenuInitData(); + auto *initData = new TeleportMenuInitData(); initData->iPad = m_iPad; initData->teleportToPlayer = false; if( static_cast(controlId) == eControl_TeleportToPlayer ) - { initData->teleportToPlayer = true; - } + ui.NavigateToScene(m_iPad,eUIScene_TeleportMenu,(void*)initData); } diff --git a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h index b198974f..ea5adbd5 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h @@ -18,27 +18,26 @@ private: eControl_DoDaylightCycle, eControl_TeleportToPlayer, eControl_TeleportToMe, + eControl_TimeSetDay, + eControl_TimeSetNight, + eControl_Difficulty, + eControl_GameType, + eControl_PlayerPermissions, + eControl_Weather, + eControl_ShowCoordinates, }; - UIControl_CheckBox m_checkboxFireSpreads, m_checkboxTNT, m_checkboxMobGriefing, m_checkboxKeepInventory, m_checkboxDoMobSpawning, m_checkboxDoMobLoot, m_checkboxDoTileDrops, m_checkboxNaturalRegeneration, m_checkboxDoDaylightCycle; - UIControl_Button m_buttonTeleportToPlayer, m_buttonTeleportToMe; + UIControl_MultiList m_hostOptionsList; UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) - UI_MAP_ELEMENT( m_checkboxFireSpreads, "CheckboxFireSpreads") - UI_MAP_ELEMENT( m_checkboxTNT, "CheckboxTNT") - UI_MAP_ELEMENT( m_checkboxMobGriefing, "CheckboxMobGriefing") - UI_MAP_ELEMENT( m_checkboxKeepInventory, "CheckboxKeepInventory") - UI_MAP_ELEMENT( m_checkboxDoMobSpawning, "CheckboxMobSpawning") - UI_MAP_ELEMENT( m_checkboxDoMobLoot, "CheckboxMobLoot") - UI_MAP_ELEMENT( m_checkboxDoTileDrops, "CheckboxTileDrops") - UI_MAP_ELEMENT( m_checkboxNaturalRegeneration, "CheckboxNaturalRegeneration") - UI_MAP_ELEMENT( m_checkboxDoDaylightCycle, "CheckboxDayLightCycle") - UI_MAP_ELEMENT( m_buttonTeleportToPlayer, "TeleportToPlayer") - UI_MAP_ELEMENT( m_buttonTeleportToMe, "TeleportPlayerToMe") + UI_MAP_ELEMENT(m_hostOptionsList, "HostOptionsList") UI_END_MAP_ELEMENTS_AND_NAMES() public: UIScene_InGameHostOptionsMenu(int iPad, void *initData, UILayer *parentLayer); virtual EUIScene getSceneType() { return eUIScene_InGameHostOptionsMenu;} + + void Init(); + virtual void updateTooltips(); virtual void handleReload(); diff --git a/Minecraft.World/Difficulty.cpp b/Minecraft.World/Difficulty.cpp new file mode 100644 index 00000000..db94933e --- /dev/null +++ b/Minecraft.World/Difficulty.cpp @@ -0,0 +1,28 @@ +#include "Difficulty.h" + +int Difficulty::getId() +{ + return id; +} + +std::wstring Difficulty::getName() +{ + return name; +} + +int Difficulty::byId(int id) +{ + switch (id) + { + case 0: + return PEACEFUL; + + case 1: + return EASY; + + case 3: + return HARD; + } + + return NORMAL; +} diff --git a/Minecraft.World/Difficulty.h b/Minecraft.World/Difficulty.h index d238ef15..e136a310 100644 --- a/Minecraft.World/Difficulty.h +++ b/Minecraft.World/Difficulty.h @@ -3,8 +3,18 @@ class Difficulty { public: - static const int PEACEFUL = 0; - static const int EASY = 1; - static const int NORMAL = 2; - static const int HARD = 3; -}; \ No newline at end of file + static const int PEACEFUL = 0; + static const int EASY = 1; + static const int NORMAL = 2; + static const int HARD = 3; + +private: + int id; + std::wstring name; + +public: + int getId(); + std::wstring getName(); + + static int byId(int id); +}; diff --git a/Minecraft.World/Level.cpp b/Minecraft.World/Level.cpp index dd66898b..5d8fc3a1 100644 --- a/Minecraft.World/Level.cpp +++ b/Minecraft.World/Level.cpp @@ -4812,4 +4812,18 @@ bool Level::canCreateMore(eINSTANCEOF type, ESPAWN_TYPE spawnType) } // 4J: Interpret 0 as no limit return max == 0 || count < max; +} + +int Level::getWeatherState() +{ + float rainLevel = oRainLevel + (rainLevel - oRainLevel); + float thunderLevel = oThunderLevel + (thunderLevel - oThunderLevel); + + if ((thunderLevel * rainLevel) > 0.9f) + return 2; // Thunder + + if (rainLevel > 0.2f) + return 1; // Rain + + return 0; // Clear } \ No newline at end of file diff --git a/Minecraft.World/Level.h b/Minecraft.World/Level.h index 97a0c56d..e82b9519 100644 --- a/Minecraft.World/Level.h +++ b/Minecraft.World/Level.h @@ -560,4 +560,7 @@ public: }; bool canCreateMore(eINSTANCEOF type, ESPAWN_TYPE spawnType); -}; + +public: + int getWeatherState(); +}; \ No newline at end of file diff --git a/Minecraft.World/cmake/sources/Common.cmake b/Minecraft.World/cmake/sources/Common.cmake index 684b6bab..88663c54 100644 --- a/Minecraft.World/cmake/sources/Common.cmake +++ b/Minecraft.World/cmake/sources/Common.cmake @@ -478,6 +478,7 @@ set(_MINECRAFT_WORLD_COMMON_NET_MINECRAFT_WORLD "${CMAKE_CURRENT_SOURCE_DIR}/CompoundContainer.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/CompoundContainer.h" "${CMAKE_CURRENT_SOURCE_DIR}/Container.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Difficulty.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Difficulty.h" "${CMAKE_CURRENT_SOURCE_DIR}/FlippedIcon.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/FlippedIcon.h"