Create initial mob caps option

This commit is contained in:
Alexandra-Myers 2026-03-07 15:33:40 -05:00
parent 70458e410f
commit 069759196d
12 changed files with 168 additions and 35 deletions

View file

@ -45,9 +45,11 @@
#define GAME_HOST_OPTION_BITMASK_DOTILEDROPS 0x08000000
#define GAME_HOST_OPTION_BITMASK_NATURALREGEN 0x10000000
#define GAME_HOST_OPTION_BITMASK_DODAYLIGHTCYCLE 0x20000000
#define GAME_HOST_OPTION_BITMASK_WORLDMOBCAP 0xC0000000 // 2 bits, 4 values (small(0), medium(1), large(2), unlimited(3))
#define GAME_HOST_OPTION_BITMASK_ALL 0xFFFFFFFF
#define GAME_HOST_OPTION_BITMASK_WORLDSIZE_BITSHIFT 20
#define GAME_HOST_OPTION_BITMASK_WORLDSIZE_BITSHIFT 20
#define GAME_HOST_OPTION_BITMASK_WORLDMOBCAP_BITSHIFT 28 // Set to this value as there is no other remaining space
enum EGameHostOptionWorldSize
{

View file

@ -636,6 +636,7 @@ enum eGameHostOption
eGameHostOption_BedrockFog,
eGameHostOption_NoHUD,
eGameHostOption_WorldSize,
eGameHostOption_WorldMobCap,
eGameHostOption_All,
eGameHostOption_DisableSaving,

View file

@ -8067,10 +8067,15 @@ void CMinecraftApp::SetGameHostOption(unsigned int &uiHostSettings, eGameHostOpt
}
break;
case eGameHostOption_WorldSize:
// clear the difficulty first
// Clear the original value first
uiHostSettings&=~GAME_HOST_OPTION_BITMASK_WORLDSIZE;
uiHostSettings|=(GAME_HOST_OPTION_BITMASK_WORLDSIZE & (uiVal<<GAME_HOST_OPTION_BITMASK_WORLDSIZE_BITSHIFT));
break;
case eGameHostOption_WorldMobCap:
// Clear the original value first
uiHostSettings&=~GAME_HOST_OPTION_BITMASK_WORLDMOBCAP;
uiHostSettings|=(GAME_HOST_OPTION_BITMASK_WORLDMOBCAP & (uiVal<<GAME_HOST_OPTION_BITMASK_WORLDMOBCAP_BITSHIFT));
break;
case eGameHostOption_All:
uiHostSettings=uiVal;
break;
@ -8157,6 +8162,8 @@ unsigned int CMinecraftApp::GetGameHostOption(unsigned int uiHostSettings, eGame
return (uiHostSettings&GAME_HOST_OPTION_BITMASK_NOTOWNER);
case eGameHostOption_WorldSize:
return (uiHostSettings&GAME_HOST_OPTION_BITMASK_WORLDSIZE) >> GAME_HOST_OPTION_BITMASK_WORLDSIZE_BITSHIFT;
case eGameHostOption_WorldMobCap:
return (uiHostSettings&GAME_HOST_OPTION_BITMASK_WORLDMOBCAP) >> GAME_HOST_OPTION_BITMASK_WORLDMOBCAP_BITSHIFT;
case eGameHostOption_MobGriefing:
return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_MOBGRIEFING);
case eGameHostOption_KeepInventory:

View file

@ -11,6 +11,7 @@
#include "..\..\..\Minecraft.World\BiomeSource.h"
#include "..\..\..\Minecraft.World\IntCache.h"
#include "..\..\..\Minecraft.World\LevelType.h"
#include "..\..\..\Minecraft.World\MobCategory.h"
#include "..\..\DLCTexturePack.h"
#ifdef __PSVITA__
@ -1213,6 +1214,10 @@ void UIScene_CreateWorldMenu::CreateGame(UIScene_CreateWorldMenu* pClass, DWORD
pClass->m_MoreOptionsParams.currentWorldSize = (EGameHostOptionWorldSize)(pClass->m_MoreOptionsParams.worldSize+1);
pClass->m_MoreOptionsParams.newWorldSize = (EGameHostOptionWorldSize)(pClass->m_MoreOptionsParams.worldSize+1);
#endif
app.SetGameHostOption(eGameHostOption_WorldMobCap, pClass->m_MoreOptionsParams.worldMobCap );
// Use helper to update the caps based on what was set earlier
MobCategory::updateMobCaps(pClass->m_MoreOptionsParams.worldMobCap);
g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0);

View file

@ -15,6 +15,14 @@ int m_iWorldSizeTitleA[4] =
};
#endif
string m_iWorldMobCapTitleA[4] =
{
"Small",
"Medium",
"Large",
"Unlimited"
};
UIScene_LaunchMoreOptionsMenu::UIScene_LaunchMoreOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer)
{
// Setup all the Iggy references we need for this scene
@ -132,6 +140,10 @@ UIScene_LaunchMoreOptionsMenu::UIScene_LaunchMoreOptionsMenu(int iPad, void *ini
m_tabIndex = m_params->bGenerateOptions ? TAB_WORLD_OPTIONS : TAB_GAME_OPTIONS;
// Introduce a mob cap slider for large worlds. If there were a better solution for this it would be nice...
m_sliderWorldMobCap.init(UIString::UIString("Mob Cap Size: " + m_iWorldMobCapTitleA[m_params->worldMobCap]),eControl_WorldMobCap,0,3,m_params->worldMobCap);
// set the default text
#ifdef _LARGE_WORLDS
wstring wsText=L"";
@ -663,6 +675,11 @@ void UIScene_LaunchMoreOptionsMenu::handleSliderMove(F64 sliderId, F64 currentVa
}
#endif
break;
case eControl_WorldMobCap:
m_sliderWorldMobCap.handleSliderMove(value);
m_params->worldMobCap = value;
m_sliderWorldMobCap.setLabel(UIString::UIString("Mob Cap Size: " + m_iWorldMobCapTitleA[m_params->worldMobCap]));
break;
}
}

View file

@ -38,6 +38,7 @@ private:
eControl_EditSeed,
eControl_WorldSize,
eControl_WorldResize,
eControl_WorldMobCap,
eControl_Count
};
@ -61,6 +62,8 @@ private:
UIControl_TextInput m_editSeed;
UIControl_Slider m_sliderWorldSize;
UIControl_Slider m_sliderWorldResize;
UIControl_Label m_labelWorldMobCap; // Added ~ Mob cap label for user control
UIControl_Slider m_sliderWorldMobCap;
IggyName m_funcSetMenuType, m_funcChangeTab, m_funcSetDescription;
UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene)
UI_MAP_ELEMENT( m_labelGameOptions, "LabelGame")
@ -99,6 +102,8 @@ private:
UI_MAP_ELEMENT( m_labelRandomSeed, "RandomSeed")
UI_MAP_ELEMENT( m_labelWorldSize, "WorldSize")
UI_MAP_ELEMENT( m_sliderWorldSize, "WorldSizeSlider")
UI_MAP_ELEMENT( m_labelWorldMobCap, "WorldMobCap")
UI_MAP_ELEMENT( m_sliderWorldMobCap, "WorldMobCapSlider")
UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_Structures], "CheckboxStructures")
UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_BonusChest], "CheckboxBonusChest")

View file

@ -8,6 +8,7 @@
#include "..\..\MinecraftServer.h"
#include "..\..\..\Minecraft.World\LevelSettings.h"
#include "..\..\..\Minecraft.World\StringHelpers.h"
#include "..\..\..\Minecraft.World\MobCategory.h"
#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__)
#include "Common\Network\Sony\SonyHttp.h"
#endif
@ -479,6 +480,8 @@ void UIScene_LoadMenu::tick()
m_MoreOptionsParams.bDisableSaving = app.GetGameHostOption(uiHostOptions,eGameHostOption_DisableSaving)>0?TRUE:FALSE;
m_MoreOptionsParams.currentWorldSize = (EGameHostOptionWorldSize)app.GetGameHostOption(uiHostOptions,eGameHostOption_WorldSize);
m_MoreOptionsParams.newWorldSize = m_MoreOptionsParams.currentWorldSize;
// Load world mob cap option
m_MoreOptionsParams.worldMobCap = app.GetGameHostOption(uiHostOptions,eGameHostOption_WorldMobCap);
m_MoreOptionsParams.bMobGriefing = app.GetGameHostOption(uiHostOptions, eGameHostOption_MobGriefing);
m_MoreOptionsParams.bKeepInventory = app.GetGameHostOption(uiHostOptions, eGameHostOption_KeepInventory);
@ -1616,6 +1619,10 @@ void UIScene_LoadMenu::StartGameFromSave(UIScene_LoadMenu* pClass, DWORD dwLocal
#ifdef _LARGE_WORLDS
app.SetGameHostOption(eGameHostOption_WorldSize, pClass->m_MoreOptionsParams.worldSize+1 ); // 0 is GAME_HOST_OPTION_WORLDSIZE_UNKNOWN
#endif
app.SetGameHostOption(eGameHostOption_WorldMobCap, pClass->m_MoreOptionsParams.worldMobCap );
// Use helper to update the caps based on what was set earlier
MobCategory::updateMobCaps(pClass->m_MoreOptionsParams.worldMobCap);
// app.SetGameNewWorldSize(64, true );
// app.SetGameNewWorldSize(0, false );

View file

@ -356,6 +356,7 @@ typedef struct _LaunchMoreOptionsMenuInitData
wstring seed;
int worldSize;
int worldMobCap;
bool bDisableSaving;
EGameHostOptionWorldSize currentWorldSize;
@ -372,6 +373,7 @@ typedef struct _LaunchMoreOptionsMenuInitData
bTNT = true;
iPad = -1;
worldSize = 3;
worldMobCap = 0;
seed = L"";
bDisableSaving = false;
newWorldSize = e_worldSize_Unknown;