From 6d98c4ebf666efa76e120ce5ec1b2e8f0b3fd1b1 Mon Sep 17 00:00:00 2001 From: "George V." Date: Mon, 13 Apr 2026 17:16:22 +0300 Subject: [PATCH] fix: Prevent gamemode slider movement when hardcore mode is enabled Add virtual `canMoveSlider` method to UIScene base class and override it in both LoadMenu and CreateWorldMenu scenes. The method returns false when attempting to move the gamemode slider while hardcore mode is active, effectively locking the slider in that state. The UIController now checks `canMoveSlider` before initiating a slider drag and during ongoing drag updates. --- Minecraft.Client/Common/UI/UIController.cpp | 9 ++++++--- Minecraft.Client/Common/UI/UIScene.h | 2 ++ Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp | 10 ++++++++++ Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h | 1 + Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp | 8 ++++++++ Minecraft.Client/Common/UI/UIScene_LoadMenu.h | 1 + 6 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Minecraft.Client/Common/UI/UIController.cpp b/Minecraft.Client/Common/UI/UIController.cpp index 03931c18..1eb09ef0 100644 --- a/Minecraft.Client/Common/UI/UIController.cpp +++ b/Minecraft.Client/Common/UI/UIController.cpp @@ -1104,8 +1104,11 @@ void UIController::tickInput() if (sceneMouseX >= cx && sceneMouseX <= cx + cw && sceneMouseY >= cy && sceneMouseY <= cy + ch) { - m_mouseDraggingSliderScene = pScene->getSceneType(); - m_mouseDraggingSliderId = pSlider->getId(); + if (pScene->canMoveSlider(pSlider->getId())) + { + m_mouseDraggingSliderScene = pScene->getSceneType(); + m_mouseDraggingSliderId = pSlider->getId(); + } break; } } @@ -1115,7 +1118,7 @@ void UIController::tickInput() if (leftDown && m_mouseDraggingSliderScene == pScene->getSceneType() && m_mouseDraggingSliderId >= 0) { UIControl_Slider *pSlider = FindSliderById(pScene, m_mouseDraggingSliderId); - if (pSlider && pSlider->getVisible()) + if (pSlider && pSlider->getVisible() && pScene->canMoveSlider(m_mouseDraggingSliderId)) { pSlider->UpdateControl(); S32 sliderX = pSlider->getXPos() + panelOffsetX; diff --git a/Minecraft.Client/Common/UI/UIScene.h b/Minecraft.Client/Common/UI/UIScene.h index 84514ff5..e232e48d 100644 --- a/Minecraft.Client/Common/UI/UIScene.h +++ b/Minecraft.Client/Common/UI/UIScene.h @@ -253,6 +253,8 @@ protected: virtual void handleCheckboxToggled(F64 controlId, bool selected) {} virtual void handleSliderMove(F64 sliderId, F64 currentValue) {} virtual void handleAnimationEnd() {} +public: + virtual bool canMoveSlider(F64 sliderId) { return true; } virtual void handleSelectionChanged(F64 selectedId) {} virtual void handleRequestMoreData(F64 startIndex, bool up) {} virtual void handleTouchBoxRebuild() {} diff --git a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp index 70edcfa7..860e4b00 100644 --- a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp @@ -722,6 +722,16 @@ void UIScene_CreateWorldMenu::handleSliderMove(F64 sliderId, F64 currentValue) } } +bool UIScene_CreateWorldMenu::canMoveSlider(F64 sliderId) +{ + // Prevent gamemode slider movement when hardcore is enabled + if (sliderId == eControl_GameModeToggle && s_bHardcore) + return false; + + return true; +} + + void UIScene_CreateWorldMenu::handleTimerComplete(int id) { #ifdef __PSVITA__ diff --git a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h index 4b73ae98..dc826cc7 100644 --- a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h @@ -74,6 +74,7 @@ protected: virtual void handleTimerComplete(int id); virtual void handleGainFocus(bool navBack); + virtual bool canMoveSlider(F64 sliderId); public: // INPUT diff --git a/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp index 35682e2c..b76ec04e 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp @@ -1040,6 +1040,14 @@ void UIScene_LoadMenu::handleSliderMove(F64 sliderId, F64 currentValue) } } +bool UIScene_LoadMenu::canMoveSlider(F64 sliderId) +{ + if (sliderId == eControl_GameMode && m_bHardcore) + return false; + + return true; +} + void UIScene_LoadMenu::handleTouchBoxRebuild() { m_bRebuildTouchBoxes = true; diff --git a/Minecraft.Client/Common/UI/UIScene_LoadMenu.h b/Minecraft.Client/Common/UI/UIScene_LoadMenu.h index 922cb154..5d2fdb8a 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_LoadMenu.h @@ -100,6 +100,7 @@ protected: void handlePress(F64 controlId, F64 childId); void handleSliderMove(F64 sliderId, F64 currentValue); virtual void handleGainFocus(bool navBack); + virtual bool canMoveSlider(F64 sliderId); private: void StartSharedLaunchFlow();