2026-03-01 12:16:08 +08:00
# include "stdafx.h"
# include "UI.h"
# include "UIScene_LoadMenu.h"
# include "..\..\Minecraft.h"
# include "..\..\TexturePackRepository.h"
# include "..\..\Options.h"
# include "..\..\MinecraftServer.h"
# include "..\..\..\Minecraft.World\LevelSettings.h"
# include "..\..\..\Minecraft.World\StringHelpers.h"
# if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__)
# include "Common\Network\Sony\SonyHttp.h"
# endif
# include "..\..\DLCTexturePack.h"
# if defined(__ORBIS__) || defined(__PSVITA__)
# include <ces.h>
# endif
# define GAME_CREATE_ONLINE_TIMER_ID 0
# define GAME_CREATE_ONLINE_TIMER_TIME 100
// 4J-PB - Only Xbox will not have trial DLC patched into the game
# ifdef _XBOX
# define CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID 1
# define CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME 50
# endif
int UIScene_LoadMenu : : m_iDifficultyTitleSettingA [ 4 ] =
{
IDS_DIFFICULTY_TITLE_PEACEFUL ,
IDS_DIFFICULTY_TITLE_EASY ,
IDS_DIFFICULTY_TITLE_NORMAL ,
IDS_DIFFICULTY_TITLE_HARD
} ;
int UIScene_LoadMenu : : LoadSaveDataThumbnailReturned ( LPVOID lpParam , PBYTE pbThumbnail , DWORD dwThumbnailBytes )
{
2026-03-03 03:04:10 +08:00
UIScene_LoadMenu * pClass = ( UIScene_LoadMenu * ) ui . GetSceneFromCallbackId ( ( size_t ) lpParam ) ;
2026-03-01 12:16:08 +08:00
2026-03-03 03:04:10 +08:00
if ( pClass )
2026-03-01 12:16:08 +08:00
{
2026-03-03 03:04:10 +08:00
app . DebugPrintf ( " Received data for a thumbnail \n " ) ;
2026-03-01 12:16:08 +08:00
2026-03-03 03:04:10 +08:00
if ( pbThumbnail & & dwThumbnailBytes )
{
pClass - > registerSubstitutionTexture ( pClass - > m_thumbnailName , pbThumbnail , dwThumbnailBytes ) ;
pClass - > m_pbThumbnailData = pbThumbnail ;
pClass - > m_uiThumbnailSize = dwThumbnailBytes ;
pClass - > m_bSaveThumbnailReady = true ;
}
else
{
app . DebugPrintf ( " Thumbnail data is NULL, or has size 0 \n " ) ;
pClass - > m_bThumbnailGetFailed = true ;
}
pClass - > m_bRetrievingSaveThumbnail = false ;
2026-03-01 12:16:08 +08:00
}
return 0 ;
}
UIScene_LoadMenu : : UIScene_LoadMenu ( int iPad , void * initData , UILayer * parentLayer ) : IUIScene_StartGame ( iPad , parentLayer )
{
// Setup all the Iggy references we need for this scene
initialiseMovie ( ) ;
LoadMenuInitData * params = ( LoadMenuInitData * ) initData ;
2026-03-01 13:38:11 -05:00
m_labelGameName . init ( app . GetString ( IDS_WORLD_NAME ) ) ;
2026-03-01 12:16:08 +08:00
m_labelSeed . init ( L " " ) ;
m_labelCreatedMode . init ( app . GetString ( IDS_CREATED_IN_SURVIVAL ) ) ;
m_buttonGamemode . init ( app . GetString ( IDS_GAMEMODE_SURVIVAL ) , eControl_GameMode ) ;
m_buttonMoreOptions . init ( app . GetString ( IDS_MORE_OPTIONS ) , eControl_MoreOptions ) ;
m_buttonLoadWorld . init ( app . GetString ( IDS_LOAD ) , eControl_LoadWorld ) ;
m_texturePackList . init ( app . GetString ( IDS_DLC_MENU_TEXTUREPACKS ) , eControl_TexturePackList ) ;
m_labelTexturePackName . init ( L " " ) ;
m_labelTexturePackDescription . init ( L " " ) ;
m_CurrentDifficulty = app . GetGameSettings ( m_iPad , eGameSetting_Difficulty ) ;
WCHAR TempString [ 256 ] ;
swprintf ( ( WCHAR * ) TempString , 256 , L " %ls: %ls " , app . GetString ( IDS_SLIDER_DIFFICULTY ) , app . GetString ( m_iDifficultyTitleSettingA [ app . GetGameSettings ( m_iPad , eGameSetting_Difficulty ) ] ) ) ;
m_sliderDifficulty . init ( TempString , eControl_Difficulty , 0 , 3 , app . GetGameSettings ( m_iPad , eGameSetting_Difficulty ) ) ;
m_MoreOptionsParams . bGenerateOptions = FALSE ;
m_MoreOptionsParams . bPVP = TRUE ;
m_MoreOptionsParams . bTrust = TRUE ;
m_MoreOptionsParams . bFireSpreads = TRUE ;
m_MoreOptionsParams . bHostPrivileges = FALSE ;
m_MoreOptionsParams . bTNT = TRUE ;
m_MoreOptionsParams . iPad = iPad ;
m_iSaveGameInfoIndex = params - > iSaveGameInfoIndex ;
m_levelGen = params - > levelGen ;
2026-03-03 03:04:10 +08:00
m_bGameModeCreative = false ;
m_iGameModeId = GameType : : SURVIVAL - > getId ( ) ;
2026-03-01 12:16:08 +08:00
m_bHasBeenInCreative = false ;
2026-03-03 03:04:10 +08:00
m_bIsSaveOwner = true ;
2026-03-01 12:16:08 +08:00
m_bSaveThumbnailReady = false ;
m_bRetrievingSaveThumbnail = true ;
m_bShowTimer = false ;
m_pDLCPack = NULL ;
m_bAvailableTexturePacksChecked = false ;
m_bRequestQuadrantSignin = false ;
m_iTexturePacksNotInstalled = 0 ;
m_bRebuildTouchBoxes = false ;
m_bThumbnailGetFailed = false ;
m_seed = 0 ;
2026-03-03 03:04:10 +08:00
m_bIsCorrupt = false ;
2026-03-01 12:16:08 +08:00
m_bMultiplayerAllowed = ProfileManager . IsSignedInLive ( m_iPad ) & & ProfileManager . AllowedToPlayMultiplayer ( m_iPad ) ;
// 4J-PB - read the settings for the online flag. We'll only save this setting if the user changed it.
bool bGameSetting_Online = ( app . GetGameSettings ( m_iPad , eGameSetting_Online ) ! = 0 ) ;
m_MoreOptionsParams . bOnlineSettingChangedBySystem = false ;
// Set the text for friends of friends, and default to on
if ( m_bMultiplayerAllowed )
{
m_MoreOptionsParams . bOnlineGame = bGameSetting_Online ? TRUE : FALSE ;
if ( bGameSetting_Online )
{
m_MoreOptionsParams . bInviteOnly = ( app . GetGameSettings ( m_iPad , eGameSetting_InviteOnly ) ! = 0 ) ? TRUE : FALSE ;
m_MoreOptionsParams . bAllowFriendsOfFriends = ( app . GetGameSettings ( m_iPad , eGameSetting_FriendsOfFriends ) ! = 0 ) ? TRUE : FALSE ;
}
else
{
m_MoreOptionsParams . bInviteOnly = FALSE ;
m_MoreOptionsParams . bAllowFriendsOfFriends = FALSE ;
}
}
else
{
m_MoreOptionsParams . bOnlineGame = FALSE ;
m_MoreOptionsParams . bInviteOnly = FALSE ;
m_MoreOptionsParams . bAllowFriendsOfFriends = FALSE ;
if ( bGameSetting_Online )
{
// The profile settings say Online, but either the player is offline, or they are not allowed to play online
m_MoreOptionsParams . bOnlineSettingChangedBySystem = true ;
}
}
2026-03-03 03:04:10 +08:00
// Set up online game checkbox
bool bOnlineGame = m_MoreOptionsParams . bOnlineGame ;
m_checkboxOnline . SetEnable ( true ) ;
2026-03-01 12:16:08 +08:00
2026-03-03 03:04:10 +08:00
// 4J-PB - to stop an offline game being able to select the online flag
if ( ProfileManager . IsSignedInLive ( m_iPad ) = = false )
{
m_checkboxOnline . SetEnable ( false ) ;
}
2026-03-01 12:16:08 +08:00
2026-03-03 03:04:10 +08:00
if ( m_MoreOptionsParams . bOnlineSettingChangedBySystem )
{
m_checkboxOnline . SetEnable ( false ) ;
bOnlineGame = false ;
2026-03-01 12:16:08 +08:00
}
2026-03-03 03:04:10 +08:00
m_checkboxOnline . init ( app . GetString ( IDS_ONLINE_GAME ) , eControl_OnlineGame , bOnlineGame ) ;
2026-03-01 12:16:08 +08:00
// Level gen
if ( m_levelGen )
{
m_labelGameName . init ( m_levelGen - > getDisplayName ( ) ) ;
if ( m_levelGen - > requiresTexturePack ( ) )
{
m_MoreOptionsParams . dwTexturePack = m_levelGen - > getRequiredTexturePackId ( ) ;
m_texturePackList . setEnabled ( false ) ;
// retrieve the save icon from the texture pack, if there is one
TexturePack * tp = Minecraft : : GetInstance ( ) - > skins - > getTexturePackById ( m_MoreOptionsParams . dwTexturePack ) ;
DWORD dwImageBytes ;
PBYTE pbImageData = tp - > getPackIcon ( dwImageBytes ) ;
if ( dwImageBytes > 0 & & pbImageData )
{
wchar_t textureName [ 64 ] ;
swprintf ( textureName , 64 , L " loadsave " ) ;
registerSubstitutionTexture ( textureName , pbImageData , dwImageBytes ) ;
m_bitmapIcon . setTextureName ( textureName ) ;
}
}
// Set this level as created in creative mode, so that people can't use the themed worlds as an easy way to get achievements
2026-03-03 03:04:10 +08:00
m_bHasBeenInCreative = m_levelGen - > getLevelHasBeenInCreative ( ) ;
if ( m_bHasBeenInCreative )
{
m_labelCreatedMode . setLabel ( app . GetString ( IDS_CREATED_IN_CREATIVE ) ) ;
}
else
{
m_labelCreatedMode . setLabel ( app . GetString ( IDS_CREATED_IN_SURVIVAL ) ) ;
}
2026-03-01 12:16:08 +08:00
}
else
{
# if defined(__PS3__) || defined(__ORBIS__)|| defined(_DURANGO) || defined (__PSVITA__)
// convert to utf16
uint16_t u16Message [ MAX_SAVEFILENAME_LENGTH ] ;
size_t srclen , dstlen ;
srclen = MAX_SAVEFILENAME_LENGTH ;
dstlen = MAX_SAVEFILENAME_LENGTH ;
# ifdef __PS3__
L10nResult lres = UTF8stoUTF16s ( ( uint8_t * ) params - > saveDetails - > UTF8SaveFilename , & srclen , u16Message , & dstlen ) ;
# elif defined(_DURANGO)
// Already utf16 on durango
memcpy ( u16Message , params - > saveDetails - > UTF16SaveFilename , MAX_SAVEFILENAME_LENGTH ) ;
# else // __ORBIS__
{
SceCesUcsContext Context ;
sceCesUcsContextInit ( & Context ) ;
uint32_t utf8Len , utf16Len ;
sceCesUtf8StrToUtf16Str ( & Context , ( uint8_t * ) params - > saveDetails - > UTF8SaveFilename , srclen , & utf8Len , u16Message , dstlen , & utf16Len ) ;
}
# endif
m_thumbnailName = ( wchar_t * ) u16Message ;
if ( params - > saveDetails - > pbThumbnailData )
{
m_pbThumbnailData = params - > saveDetails - > pbThumbnailData ;
m_uiThumbnailSize = params - > saveDetails - > dwThumbnailSize ;
m_bSaveThumbnailReady = true ;
}
else
{
app . DebugPrintf ( " Requesting the save thumbnail \n " ) ;
// set the save to load
PSAVE_DETAILS pSaveDetails = StorageManager . ReturnSavesInfo ( ) ;
# ifdef _DURANGO
// On Durango, we have an extra flag possible with LoadSaveDataThumbnail, which if true will force the loading of this thumbnail even if the save data isn't sync'd from
// the cloud at this stage. This could mean that there could be a pretty large delay before the callback happens, in this case.
2026-03-03 03:04:10 +08:00
C4JStorage : : ESaveGameState eLoadStatus = StorageManager . LoadSaveDataThumbnail ( & pSaveDetails - > SaveInfoA [ ( int ) m_iSaveGameInfoIndex ] , & LoadSaveDataThumbnailReturned , ( LPVOID ) GetCallbackUniqueId ( ) , true ) ;
2026-03-01 12:16:08 +08:00
# else
2026-03-03 03:04:10 +08:00
C4JStorage : : ESaveGameState eLoadStatus = StorageManager . LoadSaveDataThumbnail ( & pSaveDetails - > SaveInfoA [ ( int ) m_iSaveGameInfoIndex ] , & LoadSaveDataThumbnailReturned , ( LPVOID ) GetCallbackUniqueId ( ) ) ;
2026-03-01 12:16:08 +08:00
# endif
m_bShowTimer = true ;
}
# if defined(_DURANGO)
m_labelGameName . init ( params - > saveDetails - > UTF16SaveName ) ;
# else
2026-03-03 03:04:10 +08:00
wchar_t wSaveName [ 128 ] ;
ZeroMemory ( wSaveName , 128 * sizeof ( wchar_t ) ) ;
mbstowcs ( wSaveName , params - > saveDetails - > UTF8SaveName , strlen ( params - > saveDetails - > UTF8SaveName ) + 1 ) ; // plus null
m_labelGameName . init ( wSaveName ) ;
2026-03-01 12:16:08 +08:00
# endif
# endif
}
TelemetryManager - > RecordMenuShown ( m_iPad , eUIScene_LoadMenu , 0 ) ;
m_iTexturePacksNotInstalled = 0 ;
// block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again
if ( app . StartInstallDLCProcess ( m_iPad ) = = true )
{
// not doing a mount, so enable input
m_bIgnoreInput = true ;
}
else
{
m_bIgnoreInput = false ;
Minecraft * pMinecraft = Minecraft : : GetInstance ( ) ;
int texturePacksCount = pMinecraft - > skins - > getTexturePackCount ( ) ;
for ( unsigned int i = 0 ; i < texturePacksCount ; + + i )
{
TexturePack * tp = pMinecraft - > skins - > getTexturePackByIndex ( i ) ;
DWORD dwImageBytes ;
PBYTE pbImageData = tp - > getPackIcon ( dwImageBytes ) ;
if ( dwImageBytes > 0 & & pbImageData )
{
wchar_t imageName [ 64 ] ;
swprintf ( imageName , 64 , L " tpack%08x " , tp - > getId ( ) ) ;
registerSubstitutionTexture ( imageName , pbImageData , dwImageBytes ) ;
m_texturePackList . addPack ( i , imageName ) ;
}
}
m_currentTexturePackIndex = pMinecraft - > skins - > getTexturePackIndex ( m_MoreOptionsParams . dwTexturePack ) ;
UpdateTexturePackDescription ( m_currentTexturePackIndex ) ;
m_texturePackList . selectSlot ( m_currentTexturePackIndex ) ;
// 4J-PB - Only Xbox will not have trial DLC patched into the game
# ifdef _XBOX
// 4J-PB - there may be texture packs we don't have, so use the info from TMS for this
// 4J-PB - Any texture packs available that we don't have installed?
# if defined(__PS3__) || defined(__ORBIS__)
if ( ! m_bAvailableTexturePacksChecked & & app . GetCommerceProductListRetrieved ( ) & & app . GetCommerceProductListInfoRetrieved ( ) )
# else
if ( ! m_bAvailableTexturePacksChecked )
# endif
{
DLC_INFO * pDLCInfo = NULL ;
// first pass - look to see if there are any that are not in the list
bool bTexturePackAlreadyListed ;
bool bNeedToGetTPD = false ;
for ( unsigned int i = 0 ; i < app . GetDLCInfoTexturesOffersCount ( ) ; + + i )
{
bTexturePackAlreadyListed = false ;
# if defined(__PS3__) || defined(__ORBIS__)
char * pchName = app . GetDLCInfoTextures ( i ) ;
pDLCInfo = app . GetDLCInfo ( pchName ) ;
# else
ULONGLONG ull = app . GetDLCInfoTexturesFullOffer ( i ) ;
pDLCInfo = app . GetDLCInfoForFullOfferID ( ull ) ;
# endif
for ( unsigned int i = 0 ; i < texturePacksCount ; + + i )
{
TexturePack * tp = pMinecraft - > skins - > getTexturePackByIndex ( i ) ;
if ( pDLCInfo & & pDLCInfo - > iConfig = = tp - > getDLCParentPackId ( ) )
{
bTexturePackAlreadyListed = true ;
}
}
if ( bTexturePackAlreadyListed = = false )
{
// some missing
bNeedToGetTPD = true ;
m_iTexturePacksNotInstalled + + ;
}
}
if ( bNeedToGetTPD = = true )
{
// add a TMS request for them
app . DebugPrintf ( " +++ Adding TMSPP request for texture pack data \n " ) ;
app . AddTMSPPFileTypeRequest ( e_DLC_TexturePackData ) ;
m_iConfigA = new int [ m_iTexturePacksNotInstalled ] ;
m_iTexturePacksNotInstalled = 0 ;
for ( unsigned int i = 0 ; i < app . GetDLCInfoTexturesOffersCount ( ) ; + + i )
{
bTexturePackAlreadyListed = false ;
# if defined(__PS3__) || defined(__ORBIS__)
char * pchName = app . GetDLCInfoTextures ( i ) ;
pDLCInfo = app . GetDLCInfo ( pchName ) ;
# else
ULONGLONG ull = app . GetDLCInfoTexturesFullOffer ( i ) ;
pDLCInfo = app . GetDLCInfoForFullOfferID ( ull ) ;
# endif
if ( pDLCInfo )
{
for ( unsigned int i = 0 ; i < texturePacksCount ; + + i )
{
TexturePack * tp = pMinecraft - > skins - > getTexturePackByIndex ( i ) ;
if ( pDLCInfo & & pDLCInfo - > iConfig = = tp - > getDLCParentPackId ( ) )
{
bTexturePackAlreadyListed = true ;
}
}
if ( bTexturePackAlreadyListed = = false )
{
m_iConfigA [ m_iTexturePacksNotInstalled + + ] = pDLCInfo - > iConfig ;
}
}
}
}
}
# endif
}
# ifdef _XBOX
addTimer ( CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID , CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME ) ;
# endif
if ( params ) delete params ;
addTimer ( GAME_CREATE_ONLINE_TIMER_ID , GAME_CREATE_ONLINE_TIMER_TIME ) ;
}
void UIScene_LoadMenu : : updateTooltips ( )
{
ui . SetTooltips ( DEFAULT_XUI_MENU_USER , IDS_TOOLTIPS_SELECT , IDS_TOOLTIPS_BACK , - 1 , - 1 ) ;
}
void UIScene_LoadMenu : : updateComponents ( )
{
m_parentLayer - > showComponent ( m_iPad , eUIComponent_Panorama , true ) ;
if ( RenderManager . IsWidescreen ( ) )
{
m_parentLayer - > showComponent ( m_iPad , eUIComponent_Logo , true ) ;
}
else
{
m_parentLayer - > showComponent ( m_iPad , eUIComponent_Logo , false ) ;
}
}
wstring UIScene_LoadMenu : : getMoviePath ( )
{
return L " LoadMenu " ;
}
UIControl * UIScene_LoadMenu : : GetMainPanel ( )
{
return & m_controlMainPanel ;
}
void UIScene_LoadMenu : : tick ( )
{
if ( m_bShowTimer )
{
m_bShowTimer = false ;
ui . NavigateToScene ( m_iPad , eUIScene_Timer ) ;
}
if ( m_bThumbnailGetFailed )
{
// On Durango, this can happen if a save is still not been synchronised (user cancelled, or some error). Return back to give them a choice to pick another save.
ui . NavigateBack ( m_iPad , false , eUIScene_LoadOrJoinMenu ) ;
return ;
}
if ( m_bSaveThumbnailReady )
{
m_bSaveThumbnailReady = false ;
m_bitmapIcon . setTextureName ( m_thumbnailName . c_str ( ) ) ;
// retrieve the seed value from the image metadata
bool bHostOptionsRead = false ;
unsigned int uiHostOptions = 0 ;
char szSeed [ 50 ] ;
ZeroMemory ( szSeed , 50 ) ;
app . GetImageTextData ( m_pbThumbnailData , m_uiThumbnailSize , ( unsigned char * ) & szSeed , uiHostOptions , bHostOptionsRead , m_MoreOptionsParams . dwTexturePack ) ;
# if defined(_XBOX_ONE) || defined(__ORBIS__)
sscanf_s ( szSeed , " %I64d " , & m_seed ) ;
# endif
// #ifdef _DEBUG
// // dump out the thumbnail
// HANDLE hThumbnail = CreateFile("GAME:\\thumbnail.png", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, NULL);
// DWORD dwBytes;
// WriteFile(hThumbnail,pbImageData,dwImageBytes,&dwBytes,NULL);
// XCloseHandle(hThumbnail);
// #endif
if ( szSeed [ 0 ] ! = 0 )
{
WCHAR TempString [ 256 ] ;
swprintf ( ( WCHAR * ) TempString , 256 , L " %ls: %hs " , app . GetString ( IDS_SEED ) , szSeed ) ;
m_labelSeed . setLabel ( TempString ) ;
}
else
{
m_labelSeed . setLabel ( L " " ) ;
}
// Setup all the text and checkboxes to match what the game was saved with on
if ( bHostOptionsRead )
{
m_MoreOptionsParams . bPVP = app . GetGameHostOption ( uiHostOptions , eGameHostOption_PvP ) > 0 ? TRUE : FALSE ;
m_MoreOptionsParams . bTrust = app . GetGameHostOption ( uiHostOptions , eGameHostOption_TrustPlayers ) > 0 ? TRUE : FALSE ;
m_MoreOptionsParams . bFireSpreads = app . GetGameHostOption ( uiHostOptions , eGameHostOption_FireSpreads ) > 0 ? TRUE : FALSE ;
m_MoreOptionsParams . bTNT = app . GetGameHostOption ( uiHostOptions , eGameHostOption_TNT ) > 0 ? TRUE : FALSE ;
m_MoreOptionsParams . bHostPrivileges = app . GetGameHostOption ( uiHostOptions , eGameHostOption_CheatsEnabled ) > 0 ? TRUE : FALSE ;
m_MoreOptionsParams . bDisableSaving = app . GetGameHostOption ( uiHostOptions , eGameHostOption_DisableSaving ) > 0 ? TRUE : FALSE ;
2026-03-03 03:04:10 +08:00
m_MoreOptionsParams . currentWorldSize = ( EGameHostOptionWorldSize ) app . GetGameHostOption ( uiHostOptions , eGameHostOption_WorldSize ) ;
m_MoreOptionsParams . newWorldSize = m_MoreOptionsParams . currentWorldSize ;
m_MoreOptionsParams . bMobGriefing = app . GetGameHostOption ( uiHostOptions , eGameHostOption_MobGriefing ) ;
m_MoreOptionsParams . bKeepInventory = app . GetGameHostOption ( uiHostOptions , eGameHostOption_KeepInventory ) ;
m_MoreOptionsParams . bDoMobSpawning = app . GetGameHostOption ( uiHostOptions , eGameHostOption_DoMobSpawning ) ;
m_MoreOptionsParams . bDoMobLoot = app . GetGameHostOption ( uiHostOptions , eGameHostOption_DoMobLoot ) ;
m_MoreOptionsParams . bDoTileDrops = app . GetGameHostOption ( uiHostOptions , eGameHostOption_DoTileDrops ) ;
m_MoreOptionsParams . bNaturalRegeneration = app . GetGameHostOption ( uiHostOptions , eGameHostOption_NaturalRegeneration ) ;
m_MoreOptionsParams . bDoDaylightCycle = app . GetGameHostOption ( uiHostOptions , eGameHostOption_DoDaylightCycle ) ;
bool cheatsOn = m_MoreOptionsParams . bHostPrivileges ;
if ( ! cheatsOn )
{
// Set defaults
m_MoreOptionsParams . bMobGriefing = true ;
m_MoreOptionsParams . bKeepInventory = false ;
m_MoreOptionsParams . bDoMobSpawning = true ;
m_MoreOptionsParams . bDoDaylightCycle = true ;
}
2026-03-01 12:16:08 +08:00
// turn off creative mode on the save
// #ifdef _DEBUG
// uiHostOptions&=~GAME_HOST_OPTION_BITMASK_BEENINCREATIVE;
// app.SetGameHostOption(eGameHostOption_HasBeenInCreative, 0);
// #endif
2026-03-03 03:04:10 +08:00
if ( app . GetGameHostOption ( uiHostOptions , eGameHostOption_WasntSaveOwner ) > 0 )
{
m_bIsSaveOwner = false ;
}
2026-03-01 12:16:08 +08:00
m_bHasBeenInCreative = app . GetGameHostOption ( uiHostOptions , eGameHostOption_HasBeenInCreative ) > 0 ;
if ( app . GetGameHostOption ( uiHostOptions , eGameHostOption_HasBeenInCreative ) > 0 )
{
m_labelCreatedMode . setLabel ( app . GetString ( IDS_CREATED_IN_CREATIVE ) ) ;
}
else
{
m_labelCreatedMode . setLabel ( app . GetString ( IDS_CREATED_IN_SURVIVAL ) ) ;
}
2026-03-03 03:04:10 +08:00
switch ( app . GetGameHostOption ( uiHostOptions , eGameHostOption_GameType ) )
{
case 1 : // Creative
2026-03-01 12:16:08 +08:00
m_buttonGamemode . setLabel ( app . GetString ( IDS_GAMEMODE_CREATIVE ) ) ;
2026-03-03 03:04:10 +08:00
m_bGameModeCreative = true ;
m_iGameModeId = GameType : : CREATIVE - > getId ( ) ;
break ;
# ifdef _ADVENTURE_MODE_ENABLED
case 2 : // Adventure
m_buttonGamemode . setLabel ( app . GetString ( IDS_GAMEMODE_ADVENTURE ) ) ;
m_bGameModeCreative = false ;
m_iGameModeId = GameType : : ADVENTURE - > getId ( ) ;
break ;
# endif
case 0 : // Survival
default :
m_buttonGamemode . setLabel ( app . GetString ( IDS_GAMEMODE_SURVIVAL ) ) ;
m_bGameModeCreative = false ;
m_iGameModeId = GameType : : SURVIVAL - > getId ( ) ;
break ;
} ;
2026-03-01 12:16:08 +08:00
bool bGameSetting_Online = ( app . GetGameSettings ( m_iPad , eGameSetting_Online ) ! = 0 ) ;
if ( app . GetGameHostOption ( uiHostOptions , eGameHostOption_FriendsOfFriends ) & & ! ( m_bMultiplayerAllowed & & bGameSetting_Online ) )
{
m_MoreOptionsParams . bAllowFriendsOfFriends = TRUE ;
}
}
Minecraft * pMinecraft = Minecraft : : GetInstance ( ) ;
m_currentTexturePackIndex = pMinecraft - > skins - > getTexturePackIndex ( m_MoreOptionsParams . dwTexturePack ) ;
UpdateTexturePackDescription ( m_currentTexturePackIndex ) ;
m_texturePackList . selectSlot ( m_currentTexturePackIndex ) ;
//m_labelGameName.setLabel(m_XContentData.szDisplayName);
ui . NavigateBack ( m_iPad , false , getSceneType ( ) ) ;
}
if ( m_iSetTexturePackDescription > = 0 )
{
UpdateTexturePackDescription ( m_iSetTexturePackDescription ) ;
m_iSetTexturePackDescription = - 1 ;
}
if ( m_bShowTexturePackDescription )
{
slideLeft ( ) ;
m_texturePackDescDisplayed = true ;
m_bShowTexturePackDescription = false ;
}
if ( m_bRequestQuadrantSignin )
{
m_bRequestQuadrantSignin = false ;
SignInInfo info ;
info . Func = & UIScene_LoadMenu : : StartGame_SignInReturned ;
info . lpParam = this ;
info . requireOnline = m_MoreOptionsParams . bOnlineGame ;
ui . NavigateToScene ( ProfileManager . GetPrimaryPad ( ) , eUIScene_QuadrantSignin , & info ) ;
}
# ifdef __ORBIS__
// check the status of the PSPlus common dialog
switch ( sceNpCommerceDialogUpdateStatus ( ) )
{
case SCE_COMMON_DIALOG_STATUS_FINISHED :
{
SceNpCommerceDialogResult Result ;
sceNpCommerceDialogGetResult ( & Result ) ;
sceNpCommerceDialogTerminate ( ) ;
if ( Result . authorized )
{
ProfileManager . PsPlusUpdate ( ProfileManager . GetPrimaryPad ( ) , & Result ) ;
// they just became a PSPlus member
LoadDataComplete ( this ) ;
}
else
{
// continue offline?
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_PRO_NOTONLINE_DECLINE ;
// Give the player a warning about the texture pack missing
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_PLAY_OFFLINE , IDS_NO_PLAYSTATIONPLUS , uiIDA , 1 , ProfileManager . GetPrimaryPad ( ) , & UIScene_LoadMenu : : ContinueOffline , this ) ;
2026-03-01 12:16:08 +08:00
}
}
break ;
default :
break ;
}
# endif
UIScene : : tick ( ) ;
}
# ifdef __ORBIS__
int UIScene_LoadMenu : : ContinueOffline ( void * pParam , int iPad , C4JStorage : : EMessageResult result )
{
UIScene_LoadMenu * pClass = ( UIScene_LoadMenu * ) pParam ;
// results switched for this dialog
if ( result = = C4JStorage : : EMessage_ResultAccept )
{
pClass - > m_MoreOptionsParams . bOnlineGame = false ;
pClass - > LoadDataComplete ( pClass ) ;
}
return 0 ;
}
# endif
void UIScene_LoadMenu : : handleInput ( int iPad , int key , bool repeat , bool pressed , bool released , bool & handled )
{
if ( m_bIgnoreInput ) return ;
ui . AnimateKeyPress ( m_iPad , key , repeat , pressed , released ) ;
switch ( key )
{
case ACTION_MENU_CANCEL :
if ( pressed )
{
app . SetCorruptSaveDeleted ( false ) ;
navigateBack ( ) ;
handled = true ;
}
break ;
case ACTION_MENU_OK :
# ifdef __ORBIS__
case ACTION_MENU_TOUCHPAD_PRESS :
# endif
// 4J-JEV: Inform user why their game must be offline.
# if defined _XBOX_ONE
if ( pressed & & controlHasFocus ( m_checkboxOnline . getId ( ) ) & & ! m_checkboxOnline . IsEnabled ( ) )
{
UINT uiIDA [ 1 ] = { IDS_CONFIRM_OK } ;
2026-03-03 03:04:10 +08:00
ui . RequestErrorMessage ( IDS_PRO_NOTONLINE_TITLE , IDS_PRO_XBOXLIVE_NOTIFICATION , uiIDA , 1 , iPad ) ;
2026-03-01 12:16:08 +08:00
}
# endif
case ACTION_MENU_UP :
case ACTION_MENU_DOWN :
case ACTION_MENU_LEFT :
case ACTION_MENU_RIGHT :
case ACTION_MENU_OTHER_STICK_UP :
case ACTION_MENU_OTHER_STICK_DOWN :
sendInputToMovie ( key , repeat , pressed , released ) ;
2026-03-03 03:04:10 +08:00
bool bOnlineGame = m_checkboxOnline . IsChecked ( ) ;
if ( m_MoreOptionsParams . bOnlineGame ! = bOnlineGame )
2026-03-01 12:16:08 +08:00
{
2026-03-03 03:04:10 +08:00
m_MoreOptionsParams . bOnlineGame = bOnlineGame ;
2026-03-01 12:16:08 +08:00
2026-03-03 03:04:10 +08:00
if ( ! m_MoreOptionsParams . bOnlineGame )
{
m_MoreOptionsParams . bInviteOnly = false ;
m_MoreOptionsParams . bAllowFriendsOfFriends = false ;
2026-03-01 12:16:08 +08:00
}
}
2026-03-03 03:04:10 +08:00
2026-03-01 12:16:08 +08:00
handled = true ;
break ;
}
}
void UIScene_LoadMenu : : handlePress ( F64 controlId , F64 childId )
{
if ( m_bIgnoreInput ) return ;
//CD - Added for audio
ui . PlayUISFX ( eSFX_Press ) ;
switch ( ( int ) controlId )
{
case eControl_GameMode :
2026-03-03 03:04:10 +08:00
switch ( m_iGameModeId )
2026-03-01 12:16:08 +08:00
{
2026-03-03 03:04:10 +08:00
case 0 : // Survival
2026-03-01 12:16:08 +08:00
m_buttonGamemode . setLabel ( app . GetString ( IDS_GAMEMODE_CREATIVE ) ) ;
2026-03-03 03:04:10 +08:00
m_iGameModeId = GameType : : CREATIVE - > getId ( ) ;
m_bGameModeCreative = true ;
break ;
case 1 : // Creative
# ifdef _ADVENTURE_MODE_ENABLED
m_buttonGamemode . setLabel ( app . GetString ( IDS_GAMEMODE_ADVENTURE ) ) ;
m_iGameModeId = GameType : : ADVENTURE - > getId ( ) ;
m_bGameModeCreative = false ;
break ;
case 2 : // Adventure
# endif
2026-03-01 12:16:08 +08:00
m_buttonGamemode . setLabel ( app . GetString ( IDS_GAMEMODE_SURVIVAL ) ) ;
2026-03-03 03:04:10 +08:00
m_iGameModeId = GameType : : SURVIVAL - > getId ( ) ;
m_bGameModeCreative = false ;
break ;
} ;
2026-03-01 12:16:08 +08:00
break ;
case eControl_MoreOptions :
ui . NavigateToScene ( m_iPad , eUIScene_LaunchMoreOptionsMenu , & m_MoreOptionsParams ) ;
break ;
case eControl_TexturePackList :
{
UpdateCurrentTexturePack ( ( int ) childId ) ;
}
break ;
case eControl_LoadWorld :
{
# ifdef _DURANGO
if ( m_MoreOptionsParams . bOnlineGame )
{
m_bIgnoreInput = true ;
ProfileManager . CheckMultiplayerPrivileges ( m_iPad , true , & checkPrivilegeCallback , this ) ;
}
else
# endif
{
StartSharedLaunchFlow ( ) ;
}
}
break ;
} ;
}
# ifdef _DURANGO
void UIScene_LoadMenu : : checkPrivilegeCallback ( LPVOID lpParam , bool hasPrivilege , int iPad )
{
UIScene_LoadMenu * pClass = ( UIScene_LoadMenu * ) lpParam ;
if ( hasPrivilege )
{
pClass - > StartSharedLaunchFlow ( ) ;
}
else
{
pClass - > m_bIgnoreInput = false ;
}
}
# endif
void UIScene_LoadMenu : : StartSharedLaunchFlow ( )
{
Minecraft * pMinecraft = Minecraft : : GetInstance ( ) ;
// Check if we need to upsell the texture pack
if ( m_MoreOptionsParams . dwTexturePack ! = 0 )
{
// texture pack hasn't been set yet, so check what it will be
TexturePack * pTexturePack = pMinecraft - > skins - > getTexturePackById ( m_MoreOptionsParams . dwTexturePack ) ;
if ( pTexturePack = = NULL )
{
# if TO_BE_IMPLEMENTED
// They've selected a texture pack they don't have yet
// upsell
CXuiCtrl4JList : : LIST_ITEM_INFO ListItem ;
// get the current index of the list, and then get the data
ListItem = m_pTexturePacksList - > GetData ( m_currentTexturePackIndex ) ;
// upsell the texture pack
// tell sentient about the upsell of the full version of the skin pack
ULONGLONG ullOfferID_Full ;
app . GetDLCFullOfferIDForPackID ( m_MoreOptionsParams . dwTexturePack , & ullOfferID_Full ) ;
TelemetryManager - > RecordUpsellPresented ( ProfileManager . GetPrimaryPad ( ) , eSet_UpsellID_Texture_DLC , ullOfferID_Full & 0xFFFFFFFF ) ;
# endif
UINT uiIDA [ 2 ] ;
uiIDA [ 0 ] = IDS_TEXTUREPACK_FULLVERSION ;
//uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION;
uiIDA [ 1 ] = IDS_CONFIRM_CANCEL ;
// Give the player a warning about the texture pack missing
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE , IDS_DLC_TEXTUREPACK_NOT_PRESENT , uiIDA , 2 , ProfileManager . GetPrimaryPad ( ) , & TexturePackDialogReturned , this ) ;
2026-03-01 12:16:08 +08:00
return ;
}
}
m_bIgnoreInput = true ;
// if the profile data has been changed, then force a profile write (we save the online/invite/friends of friends settings)
// It seems we're allowed to break the 5 minute rule if it's the result of a user action
// check the checkboxes
// Only save the online setting if the user changed it - we may change it because we're offline, but don't want that saved
if ( ! m_MoreOptionsParams . bOnlineSettingChangedBySystem )
{
app . SetGameSettings ( m_iPad , eGameSetting_Online , m_MoreOptionsParams . bOnlineGame ? 1 : 0 ) ;
}
app . SetGameSettings ( m_iPad , eGameSetting_InviteOnly , m_MoreOptionsParams . bInviteOnly ? 1 : 0 ) ;
app . SetGameSettings ( m_iPad , eGameSetting_FriendsOfFriends , m_MoreOptionsParams . bAllowFriendsOfFriends ? 1 : 0 ) ;
app . CheckGameSettingsChanged ( true , m_iPad ) ;
// Check that we have the rights to use a texture pack we have selected.
if ( m_MoreOptionsParams . dwTexturePack ! = 0 )
{
// texture pack hasn't been set yet, so check what it will be
TexturePack * pTexturePack = pMinecraft - > skins - > getTexturePackById ( m_MoreOptionsParams . dwTexturePack ) ;
DLCTexturePack * pDLCTexPack = ( DLCTexturePack * ) pTexturePack ;
m_pDLCPack = pDLCTexPack - > getDLCInfoParentPack ( ) ;
// do we have a license?
if ( m_pDLCPack & & ! m_pDLCPack - > hasPurchasedFile ( DLCManager : : e_DLCType_Texture , L " " ) )
{
// no
// We need to allow people to use a trial texture pack if they are offline - we only need them online if they want to buy it.
/*
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_OK ;
if ( ! ProfileManager . IsSignedInLive ( m_iPad ) )
{
// need to be signed in to live
ui . RequestMessageBox ( IDS_PRO_NOTONLINE_TITLE , IDS_PRO_XBOXLIVE_NOTIFICATION , uiIDA , 1 ) ;
m_bIgnoreInput = false ;
return ;
}
else */
{
// upsell
# ifdef _XBOX
DLC_INFO * pDLCInfo = app . GetDLCInfoForTrialOfferID ( m_pDLCPack - > getPurchaseOfferId ( ) ) ;
ULONGLONG ullOfferID_Full ;
if ( pDLCInfo ! = NULL )
{
ullOfferID_Full = pDLCInfo - > ullOfferID_Full ;
}
else
{
ullOfferID_Full = pTexturePack - > getDLCPack ( ) - > getPurchaseOfferId ( ) ;
}
// tell sentient about the upsell of the full version of the texture pack
TelemetryManager - > RecordUpsellPresented ( m_iPad , eSet_UpsellID_Texture_DLC , ullOfferID_Full & 0xFFFFFFFF ) ;
# endif
# if defined(_WINDOWS64) || defined(_DURANGO)
// trial pack warning
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_OK ;
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE , IDS_USING_TRIAL_TEXUREPACK_WARNING , uiIDA , 1 , m_iPad , & TrialTexturePackWarningReturned , this ) ;
2026-03-01 12:16:08 +08:00
# elif defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__)
// trial pack warning
UINT uiIDA [ 2 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_OK ;
uiIDA [ 1 ] = IDS_CONFIRM_CANCEL ;
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE , IDS_USING_TRIAL_TEXUREPACK_WARNING , uiIDA , 2 , m_iPad , & TrialTexturePackWarningReturned , this ) ;
2026-03-01 12:16:08 +08:00
# endif
# if defined _XBOX_ONE || defined __ORBIS__
StorageManager . SetSaveDisabled ( true ) ;
# endif
return ;
}
}
}
2026-03-03 03:04:10 +08:00
app . SetGameHostOption ( eGameHostOption_WasntSaveOwner , ( ! m_bIsSaveOwner ) ) ;
2026-03-01 12:16:08 +08:00
# if defined _XBOX_ONE || defined __ORBIS__
app . SetGameHostOption ( eGameHostOption_DisableSaving , m_MoreOptionsParams . bDisableSaving ? 1 : 0 ) ;
StorageManager . SetSaveDisabled ( m_MoreOptionsParams . bDisableSaving ) ;
2026-03-03 03:04:10 +08:00
int newWorldSize = 0 ;
int newHellScale = 0 ;
switch ( m_MoreOptionsParams . newWorldSize )
{
case e_worldSize_Unknown :
newWorldSize = 0 ;
newHellScale = 0 ;
break ;
case e_worldSize_Classic :
newWorldSize = LEVEL_WIDTH_CLASSIC ;
newHellScale = HELL_LEVEL_SCALE_CLASSIC ;
break ;
case e_worldSize_Small :
newWorldSize = LEVEL_WIDTH_SMALL ;
newHellScale = HELL_LEVEL_SCALE_SMALL ;
break ;
case e_worldSize_Medium :
newWorldSize = LEVEL_WIDTH_MEDIUM ;
newHellScale = HELL_LEVEL_SCALE_MEDIUM ;
break ;
case e_worldSize_Large :
newWorldSize = LEVEL_WIDTH_LARGE ;
newHellScale = HELL_LEVEL_SCALE_LARGE ;
break ;
default :
assert ( 0 ) ;
break ;
}
bool bUseMoat = ! m_MoreOptionsParams . newWorldSizeOverwriteEdges ;
app . SetGameNewWorldSize ( newWorldSize , bUseMoat ) ;
app . SetGameNewHellScale ( newHellScale ) ;
app . SetGameHostOption ( eGameHostOption_WorldSize , m_MoreOptionsParams . newWorldSize ) ;
2026-03-01 12:16:08 +08:00
# endif
# if TO_BE_IMPLEMENTED
// Reset the background downloading, in case we changed it by attempting to download a texture pack
XBackgroundDownloadSetMode ( XBACKGROUND_DOWNLOAD_MODE_AUTO ) ;
# endif
// Check if they have the Reset Nether flag set, and confirm they want to do this
if ( m_MoreOptionsParams . bResetNether = = TRUE )
{
UINT uiIDA [ 2 ] ;
uiIDA [ 0 ] = IDS_DONT_RESET_NETHER ;
uiIDA [ 1 ] = IDS_RESET_NETHER ;
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_RESETNETHER_TITLE , IDS_RESETNETHER_TEXT , uiIDA , 2 , m_iPad , & UIScene_LoadMenu : : CheckResetNetherReturned , this ) ;
2026-03-01 12:16:08 +08:00
}
else
{
LaunchGame ( ) ;
}
}
void UIScene_LoadMenu : : handleSliderMove ( F64 sliderId , F64 currentValue )
{
WCHAR TempString [ 256 ] ;
int value = ( int ) currentValue ;
switch ( ( int ) sliderId )
{
case eControl_Difficulty :
m_sliderDifficulty . handleSliderMove ( value ) ;
app . SetGameSettings ( m_iPad , eGameSetting_Difficulty , value ) ;
swprintf ( ( WCHAR * ) TempString , 256 , L " %ls: %ls " , app . GetString ( IDS_SLIDER_DIFFICULTY ) , app . GetString ( m_iDifficultyTitleSettingA [ value ] ) ) ;
m_sliderDifficulty . setLabel ( TempString ) ;
break ;
}
}
void UIScene_LoadMenu : : handleTouchBoxRebuild ( )
{
m_bRebuildTouchBoxes = true ;
}
void UIScene_LoadMenu : : handleTimerComplete ( int id )
{
# ifdef __PSVITA__
// we cannot rebuild touch boxes in an iggy callback because it requires further iggy calls
if ( m_bRebuildTouchBoxes )
{
GetMainPanel ( ) - > UpdateControl ( ) ;
ui . TouchBoxRebuild ( this ) ;
m_bRebuildTouchBoxes = false ;
}
# endif
switch ( id )
{
case GAME_CREATE_ONLINE_TIMER_ID :
{
bool bMultiplayerAllowed = ProfileManager . IsSignedInLive ( m_iPad ) & & ProfileManager . AllowedToPlayMultiplayer ( m_iPad ) ;
if ( bMultiplayerAllowed ! = m_bMultiplayerAllowed )
{
if ( bMultiplayerAllowed )
{
bool bGameSetting_Online = ( app . GetGameSettings ( m_iPad , eGameSetting_Online ) ! = 0 ) ;
m_MoreOptionsParams . bOnlineGame = bGameSetting_Online ? TRUE : FALSE ;
if ( bGameSetting_Online )
{
m_MoreOptionsParams . bInviteOnly = ( app . GetGameSettings ( m_iPad , eGameSetting_InviteOnly ) ! = 0 ) ? TRUE : FALSE ;
m_MoreOptionsParams . bAllowFriendsOfFriends = ( app . GetGameSettings ( m_iPad , eGameSetting_FriendsOfFriends ) ! = 0 ) ? TRUE : FALSE ;
}
else
{
m_MoreOptionsParams . bInviteOnly = FALSE ;
m_MoreOptionsParams . bAllowFriendsOfFriends = FALSE ;
}
}
else
{
m_MoreOptionsParams . bOnlineGame = FALSE ;
m_MoreOptionsParams . bInviteOnly = FALSE ;
m_MoreOptionsParams . bAllowFriendsOfFriends = FALSE ;
}
2026-03-03 03:04:10 +08:00
m_checkboxOnline . SetEnable ( bMultiplayerAllowed ) ;
m_checkboxOnline . setChecked ( m_MoreOptionsParams . bOnlineGame ) ;
2026-03-01 12:16:08 +08:00
m_bMultiplayerAllowed = bMultiplayerAllowed ;
}
}
break ;
// 4J-PB - Only Xbox will not have trial DLC patched into the game
# ifdef _XBOX
case CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID :
{
# if defined(__PS3__) || defined(__ORBIS__)
for ( int i = 0 ; i < m_iTexturePacksNotInstalled ; i + + )
{
if ( m_iConfigA [ i ] ! = - 1 )
{
DLC_INFO * pDLCInfo = app . GetDLCInfoFromTPackID ( m_iConfigA [ i ] ) ;
if ( pDLCInfo )
{
// retrieve the image - if we haven't already
wstring textureName = filenametowstring ( pDLCInfo - > chImageURL ) ;
if ( hasRegisteredSubstitutionTexture ( textureName ) = = false )
{
PBYTE pbImageData ;
int iImageDataBytes = 0 ;
SonyHttp : : getDataFromURL ( pDLCInfo - > chImageURL , ( void * * ) & pbImageData , & iImageDataBytes ) ;
if ( iImageDataBytes ! = 0 )
{
// set the image
registerSubstitutionTexture ( textureName , pbImageData , iImageDataBytes , true ) ;
// add an item in
m_texturePackList . addPack ( m_iConfigA [ i ] , textureName ) ;
m_iConfigA [ i ] = - 1 ;
}
}
else
{
// already have the image, so add an item in
m_texturePackList . addPack ( m_iConfigA [ i ] , textureName ) ;
m_iConfigA [ i ] = - 1 ;
}
}
}
}
bool bAllDone = true ;
for ( int i = 0 ; i < m_iTexturePacksNotInstalled ; i + + )
{
if ( m_iConfigA [ i ] ! = - 1 )
{
bAllDone = false ;
}
}
if ( bAllDone )
{
// kill this timer
killTimer ( CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID ) ;
}
# endif
}
break ;
# endif
}
}
void UIScene_LoadMenu : : LaunchGame ( void )
{
// stop the timer running that causes a check for new texture packs in TMS but not installed, since this will run all through the load game, and will crash if it tries to create an hbrush
# ifdef _XBOX
killTimer ( CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID ) ;
# endif
2026-03-03 03:04:10 +08:00
if ( ( m_bGameModeCreative = = true | | m_bHasBeenInCreative ) | | m_MoreOptionsParams . bHostPrivileges = = TRUE )
2026-03-01 12:16:08 +08:00
{
UINT uiIDA [ 2 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_OK ;
uiIDA [ 1 ] = IDS_CONFIRM_CANCEL ;
2026-03-03 03:04:10 +08:00
if ( m_bGameModeCreative = = true | | m_bHasBeenInCreative )
2026-03-01 12:16:08 +08:00
{
// 4J-PB - Need different text for Survival mode with a level that has been saved in Creative
2026-03-03 03:04:10 +08:00
if ( ! m_bGameModeCreative )
2026-03-01 12:16:08 +08:00
{
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_TITLE_START_GAME , IDS_CONFIRM_START_SAVEDINCREATIVE , uiIDA , 2 , m_iPad , & UIScene_LoadMenu : : ConfirmLoadReturned , this ) ;
2026-03-01 12:16:08 +08:00
}
else // it's creative mode
{
// has it previously been saved in creative?
if ( m_bHasBeenInCreative )
{
// 4J-PB - We don't really need to tell the user this will have achievements disabled, since they already saved it in creative
// and they got the warning then
// inform them that leaderboard writes and achievements will be disabled
//ui.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_SAVEDINCREATIVE_CONTINUE, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::ConfirmLoadReturned,this,app.GetStringTable());
if ( m_levelGen ! = NULL )
{
2026-03-03 03:04:10 +08:00
m_bIsCorrupt = false ;
LoadDataComplete ( this ) ;
2026-03-01 12:16:08 +08:00
}
else
{
// set the save to load
PSAVE_DETAILS pSaveDetails = StorageManager . ReturnSavesInfo ( ) ;
# ifndef _DURANGO
app . DebugPrintf ( " Loading save s [%s] \n " , pSaveDetails - > SaveInfoA [ ( int ) m_iSaveGameInfoIndex ] . UTF8SaveTitle , pSaveDetails - > SaveInfoA [ ( int ) m_iSaveGameInfoIndex ] . UTF8SaveFilename ) ;
# endif
C4JStorage : : ESaveGameState eLoadStatus = StorageManager . LoadSaveData ( & pSaveDetails - > SaveInfoA [ ( int ) m_iSaveGameInfoIndex ] , & LoadSaveDataReturned , this ) ;
# if TO_BE_IMPLEMENTED
if ( eLoadStatus = = C4JStorage : : ELoadGame_DeviceRemoved )
{
// disable saving
StorageManager . SetSaveDisabled ( true ) ;
StorageManager . SetSaveDeviceSelected ( m_iPad , false ) ;
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_OK ;
2026-03-03 03:04:10 +08:00
ui . RequestErrorMessage ( IDS_STORAGEDEVICEPROBLEM_TITLE , IDS_FAILED_TO_LOADSAVE_TEXT , uiIDA , 1 , m_iPad , & CScene_LoadGameSettings : : DeviceRemovedDialogReturned , this ) ;
2026-03-01 12:16:08 +08:00
}
# endif
}
}
else
{
// ask if they're sure they want to turn this into a creative map
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_TITLE_START_GAME , IDS_CONFIRM_START_CREATIVE , uiIDA , 2 , m_iPad , & UIScene_LoadMenu : : ConfirmLoadReturned , this ) ;
2026-03-01 12:16:08 +08:00
}
}
}
else
{
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_TITLE_START_GAME , IDS_CONFIRM_START_HOST_PRIVILEGES , uiIDA , 2 , m_iPad , & UIScene_LoadMenu : : ConfirmLoadReturned , this ) ;
2026-03-01 12:16:08 +08:00
}
}
else
{
if ( m_levelGen ! = NULL )
{
2026-03-03 03:04:10 +08:00
m_bIsCorrupt = false ;
LoadDataComplete ( this ) ;
2026-03-01 12:16:08 +08:00
}
else
{
// set the save to load
PSAVE_DETAILS pSaveDetails = StorageManager . ReturnSavesInfo ( ) ;
# ifndef _DURANGO
app . DebugPrintf ( " Loading save %s [%s] \n " , pSaveDetails - > SaveInfoA [ ( int ) m_iSaveGameInfoIndex ] . UTF8SaveTitle , pSaveDetails - > SaveInfoA [ ( int ) m_iSaveGameInfoIndex ] . UTF8SaveFilename ) ;
# endif
C4JStorage : : ESaveGameState eLoadStatus = StorageManager . LoadSaveData ( & pSaveDetails - > SaveInfoA [ ( int ) m_iSaveGameInfoIndex ] , & LoadSaveDataReturned , this ) ;
# if TO_BE_IMPLEMENTED
if ( eLoadStatus = = C4JStorage : : ELoadGame_DeviceRemoved )
{
// disable saving
StorageManager . SetSaveDisabled ( true ) ;
StorageManager . SetSaveDeviceSelected ( m_iPad , false ) ;
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_OK ;
2026-03-03 03:04:10 +08:00
ui . RequestErrorMessage ( IDS_STORAGEDEVICEPROBLEM_TITLE , IDS_FAILED_TO_LOADSAVE_TEXT , uiIDA , 1 , m_iPad , & CScene_LoadGameSettings : : DeviceRemovedDialogReturned , this ) ;
2026-03-01 12:16:08 +08:00
}
# endif
}
}
//return 0;
}
int UIScene_LoadMenu : : CheckResetNetherReturned ( void * pParam , int iPad , C4JStorage : : EMessageResult result )
{
UIScene_LoadMenu * pClass = ( UIScene_LoadMenu * ) pParam ;
// results switched for this dialog
if ( result = = C4JStorage : : EMessage_ResultDecline )
{
// continue and reset the nether
pClass - > LaunchGame ( ) ;
}
else if ( result = = C4JStorage : : EMessage_ResultAccept )
{
// turn off the reset nether and continue
pClass - > m_MoreOptionsParams . bResetNether = FALSE ;
pClass - > LaunchGame ( ) ;
}
else
{
// else they chose cancel
pClass - > m_bIgnoreInput = false ;
}
return 0 ;
}
int UIScene_LoadMenu : : ConfirmLoadReturned ( void * pParam , int iPad , C4JStorage : : EMessageResult result )
{
UIScene_LoadMenu * pClass = ( UIScene_LoadMenu * ) pParam ;
if ( result = = C4JStorage : : EMessage_ResultAccept )
{
if ( pClass - > m_levelGen ! = NULL )
{
2026-03-03 03:04:10 +08:00
pClass - > m_bIsCorrupt = false ;
pClass - > LoadDataComplete ( pClass ) ;
2026-03-01 12:16:08 +08:00
}
else
{
// set the save to load
PSAVE_DETAILS pSaveDetails = StorageManager . ReturnSavesInfo ( ) ;
# ifndef _DURANGO
app . DebugPrintf ( " Loading save %s [%s] \n " , pSaveDetails - > SaveInfoA [ ( int ) pClass - > m_iSaveGameInfoIndex ] . UTF8SaveTitle , pSaveDetails - > SaveInfoA [ ( int ) pClass - > m_iSaveGameInfoIndex ] . UTF8SaveFilename ) ;
# endif
C4JStorage : : ESaveGameState eLoadStatus = StorageManager . LoadSaveData ( & pSaveDetails - > SaveInfoA [ ( int ) pClass - > m_iSaveGameInfoIndex ] , & LoadSaveDataReturned , pClass ) ;
# if TO_BE_IMPLEMENTED
if ( eLoadStatus = = C4JStorage : : ELoadGame_DeviceRemoved )
{
// disable saving
StorageManager . SetSaveDisabled ( true ) ;
StorageManager . SetSaveDeviceSelected ( m_iPad , false ) ;
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_OK ;
2026-03-03 03:04:10 +08:00
ui . RequestErrorMessage ( IDS_STORAGEDEVICEPROBLEM_TITLE , IDS_FAILED_TO_LOADSAVE_TEXT , uiIDA , 1 , m_iPad , & CScene_LoadGameSettings : : DeviceRemovedDialogReturned , this ) ;
2026-03-01 12:16:08 +08:00
}
2026-03-03 03:04:10 +08:00
# endif
2026-03-01 12:16:08 +08:00
}
}
else
{
pClass - > m_bIgnoreInput = false ;
}
return 0 ;
}
int UIScene_LoadMenu : : LoadDataComplete ( void * pParam )
{
UIScene_LoadMenu * pClass = ( UIScene_LoadMenu * ) pParam ;
if ( ! pClass - > m_bIsCorrupt )
{
int iPrimaryPad = ProfileManager . GetPrimaryPad ( ) ;
bool isSignedInLive = true ;
bool isOnlineGame = pClass - > m_MoreOptionsParams . bOnlineGame ;
int iPadNotSignedInLive = - 1 ;
bool isLocalMultiplayerAvailable = app . IsLocalMultiplayerAvailable ( ) ;
for ( unsigned int i = 0 ; i < XUSER_MAX_COUNT ; + + i )
{
if ( ProfileManager . IsSignedIn ( i ) & & ( ( i = = iPrimaryPad ) | | isLocalMultiplayerAvailable ) )
{
if ( isSignedInLive & & ! ProfileManager . IsSignedInLive ( i ) )
{
// Record the first non signed in live pad
iPadNotSignedInLive = i ;
}
isSignedInLive = isSignedInLive & & ProfileManager . IsSignedInLive ( i ) ;
}
}
// If this is an online game but not all players are signed in to Live, stop!
if ( isOnlineGame & & ! isSignedInLive )
{
# ifdef __ORBIS__
assert ( iPadNotSignedInLive ! = - 1 ) ;
// Check if PSN is unavailable because of age restriction
int npAvailability = ProfileManager . getNPAvailability ( iPadNotSignedInLive ) ;
if ( npAvailability = = SCE_NP_ERROR_AGE_RESTRICTION )
{
pClass - > m_bIgnoreInput = false ;
// 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_OK ;
2026-03-03 03:04:10 +08:00
ui . RequestErrorMessage ( IDS_ONLINE_SERVICE_TITLE , IDS_CONTENT_RESTRICTION , uiIDA , 1 , iPadNotSignedInLive ) ;
2026-03-01 12:16:08 +08:00
}
else
{
pClass - > m_bIgnoreInput = true ;
UINT uiIDA [ 2 ] ;
uiIDA [ 0 ] = IDS_PRO_NOTONLINE_ACCEPT ;
uiIDA [ 1 ] = IDS_CANCEL ;
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_PRO_NOTONLINE_TITLE , IDS_PRO_NOTONLINE_TEXT , uiIDA , 2 , iPadNotSignedInLive , & UIScene_LoadMenu : : MustSignInReturnedPSN , pClass ) ;
2026-03-01 12:16:08 +08:00
}
return 0 ;
# else
pClass - > m_bIgnoreInput = false ;
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_OK ;
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_PRO_NOTONLINE_TITLE , IDS_PRO_NOTONLINE_TEXT , uiIDA , 1 , ProfileManager . GetPrimaryPad ( ) ) ;
2026-03-01 12:16:08 +08:00
return 0 ;
# endif
}
// Check if user-created content is allowed, as we cannot play multiplayer if it's not
bool noUGC = false ;
BOOL pccAllowed = TRUE ;
BOOL pccFriendsAllowed = TRUE ;
bool bContentRestricted = false ;
ProfileManager . AllowedPlayerCreatedContent ( ProfileManager . GetPrimaryPad ( ) , false , & pccAllowed , & pccFriendsAllowed ) ;
# if defined(__PS3__) || defined(__PSVITA__)
if ( isOnlineGame )
{
ProfileManager . GetChatAndContentRestrictions ( ProfileManager . GetPrimaryPad ( ) , false , NULL , & bContentRestricted , NULL ) ;
}
# endif
# ifdef __ORBIS__
bool bPlayStationPlus = true ;
int iPadWithNoPlaystationPlus = 0 ;
for ( unsigned int i = 0 ; i < XUSER_MAX_COUNT ; + + i )
{
if ( ProfileManager . IsSignedIn ( i ) & & ( ( i = = iPrimaryPad ) | | isLocalMultiplayerAvailable ) )
{
if ( ! ProfileManager . HasPlayStationPlus ( i ) )
{
bPlayStationPlus = false ;
iPadWithNoPlaystationPlus = i ;
break ;
}
}
}
# endif
noUGC = ! pccAllowed & & ! pccFriendsAllowed ;
if ( ! isOnlineGame | | ! isLocalMultiplayerAvailable )
{
if ( isOnlineGame & & noUGC )
{
pClass - > setVisible ( true ) ;
ui . RequestUGCMessageBox ( ) ;
pClass - > m_bIgnoreInput = false ;
}
else if ( isOnlineGame & & bContentRestricted )
{
pClass - > setVisible ( true ) ;
ui . RequestContentRestrictedMessageBox ( ) ;
pClass - > m_bIgnoreInput = false ;
}
# ifdef __ORBIS__
else if ( isOnlineGame & & ( bPlayStationPlus = = false ) )
{
pClass - > setVisible ( true ) ;
pClass - > m_bIgnoreInput = false ;
2026-03-03 03:04:10 +08:00
if ( ProfileManager . RequestingPlaystationPlus ( iPadWithNoPlaystationPlus ) )
{
// MGH - added this so we don't try and upsell when we don't know if the player has PS Plus yet (if it can't connect to the PS Plus server).
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_OK ;
ui . RequestAlertMessage ( IDS_ERROR_NETWORK_TITLE , IDS_ERROR_NETWORK , uiIDA , 1 , ProfileManager . GetPrimaryPad ( ) , NULL , NULL ) ;
return 0 ;
}
2026-03-01 12:16:08 +08:00
// 4J-PB - we're not allowed to show the text Playstation Plus - have to call the upsell all the time!
// upsell psplus
int32_t iResult = sceNpCommerceDialogInitialize ( ) ;
SceNpCommerceDialogParam param ;
sceNpCommerceDialogParamInitialize ( & param ) ;
param . mode = SCE_NP_COMMERCE_DIALOG_MODE_PLUS ;
param . features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY ;
param . userId = ProfileManager . getUserID ( iPadWithNoPlaystationPlus ) ;
iResult = sceNpCommerceDialogOpen ( & param ) ;
// UINT uiIDA[2];
// uiIDA[0]=IDS_PLAY_OFFLINE;
// uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP;
// ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_LoadMenu::PSPlusReturned,pClass, app.GetStringTable(),NULL,0,false);
}
# endif
else
{
# if defined(__ORBIS__) || defined(__PSVITA__)
if ( isOnlineGame )
{
bool chatRestricted = false ;
ProfileManager . GetChatAndContentRestrictions ( ProfileManager . GetPrimaryPad ( ) , false , & chatRestricted , NULL , NULL ) ;
if ( chatRestricted )
{
ProfileManager . DisplaySystemMessage ( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION , ProfileManager . GetPrimaryPad ( ) ) ;
}
}
# endif
DWORD dwLocalUsersMask = CGameNetworkManager : : GetLocalPlayerMask ( ProfileManager . GetPrimaryPad ( ) ) ;
// No guest problems so we don't need to force a sign-in of players here
StartGameFromSave ( pClass , dwLocalUsersMask ) ;
}
}
else
{
// 4J-PB not sure why we aren't checking the content restriction for the main player here when multiple controllers are connected - adding now
if ( isOnlineGame & & noUGC )
{
pClass - > setVisible ( true ) ;
ui . RequestUGCMessageBox ( ) ;
pClass - > m_bIgnoreInput = false ;
}
else if ( isOnlineGame & & bContentRestricted )
{
pClass - > setVisible ( true ) ;
ui . RequestContentRestrictedMessageBox ( ) ;
pClass - > m_bIgnoreInput = false ;
}
# ifdef __ORBIS__
else if ( bPlayStationPlus = = false )
{
pClass - > setVisible ( true ) ;
pClass - > m_bIgnoreInput = false ;
2026-03-03 03:04:10 +08:00
if ( ProfileManager . RequestingPlaystationPlus ( iPadWithNoPlaystationPlus ) )
{
// MGH - added this so we don't try and upsell when we don't know if the player has PS Plus yet (if it can't connect to the PS Plus server).
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_OK ;
ui . RequestAlertMessage ( IDS_ERROR_NETWORK_TITLE , IDS_ERROR_NETWORK , uiIDA , 1 , ProfileManager . GetPrimaryPad ( ) , NULL , NULL ) ;
return 0 ;
}
2026-03-01 12:16:08 +08:00
// 4J-PB - we're not allowed to show the text Playstation Plus - have to call the upsell all the time!
// upsell psplus
int32_t iResult = sceNpCommerceDialogInitialize ( ) ;
SceNpCommerceDialogParam param ;
sceNpCommerceDialogParamInitialize ( & param ) ;
param . mode = SCE_NP_COMMERCE_DIALOG_MODE_PLUS ;
param . features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY ;
param . userId = ProfileManager . getUserID ( iPadWithNoPlaystationPlus ) ;
iResult = sceNpCommerceDialogOpen ( & param ) ;
// UINT uiIDA[2];
// uiIDA[0]=IDS_PLAY_OFFLINE;
// uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP;
// ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_LoadMenu::PSPlusReturned,pClass, app.GetStringTable(),NULL,0,false);
}
# endif
else
{
2026-03-01 10:50:48 -06:00
# ifdef _WINDOWS64
// On Windows64, IsSignedInLive() returns true as a stub but Xbox Live is
// not available. Skip QuadrantSignin and proceed directly with local play.
DWORD dwLocalUsersMask = CGameNetworkManager : : GetLocalPlayerMask ( ProfileManager . GetPrimaryPad ( ) ) ;
StartGameFromSave ( pClass , dwLocalUsersMask ) ;
# else
2026-03-01 12:16:08 +08:00
pClass - > m_bRequestQuadrantSignin = true ;
2026-03-01 10:50:48 -06:00
# endif
2026-03-01 12:16:08 +08:00
}
}
}
else
{
// the save is corrupt!
pClass - > m_bIgnoreInput = false ;
// give the option to delete the save
UINT uiIDA [ 2 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_CANCEL ;
uiIDA [ 1 ] = IDS_CONFIRM_OK ;
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE , IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT , uiIDA , 2 , pClass - > m_iPad , & UIScene_LoadMenu : : DeleteSaveDialogReturned , pClass ) ;
2026-03-01 12:16:08 +08:00
}
return 0 ;
}
int UIScene_LoadMenu : : LoadSaveDataReturned ( void * pParam , bool bIsCorrupt , bool bIsOwner )
{
UIScene_LoadMenu * pClass = ( UIScene_LoadMenu * ) pParam ;
pClass - > m_bIsCorrupt = bIsCorrupt ;
2026-03-03 03:04:10 +08:00
# if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__)
if ( app . GetGameHostOption ( eGameHostOption_WasntSaveOwner ) )
{
bIsOwner = false ;
}
# endif
2026-03-01 12:16:08 +08:00
if ( bIsOwner )
{
LoadDataComplete ( pClass ) ;
}
else
{
// messagebox
pClass - > m_bIgnoreInput = false ;
# if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__)
// show the message that trophies are disabled
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_OK ;
2026-03-03 03:04:10 +08:00
ui . RequestErrorMessage ( IDS_SAVEDATA_COPIED_TITLE , IDS_SAVEDATA_COPIED_TEXT , uiIDA , 1 ,
pClass - > m_iPad , & UIScene_LoadMenu : : TrophyDialogReturned , pClass ) ;
app . SetGameHostOption ( eGameHostOption_WasntSaveOwner , true ) ;
2026-03-01 12:16:08 +08:00
# endif
}
return 0 ;
}
int UIScene_LoadMenu : : TrophyDialogReturned ( void * pParam , int iPad , C4JStorage : : EMessageResult result )
{
UIScene_LoadMenu * pClass = ( UIScene_LoadMenu * ) pParam ;
return LoadDataComplete ( pClass ) ;
}
int UIScene_LoadMenu : : DeleteSaveDialogReturned ( void * pParam , int iPad , C4JStorage : : EMessageResult result )
{
UIScene_LoadMenu * pClass = ( UIScene_LoadMenu * ) pParam ;
// results switched for this dialog
if ( result = = C4JStorage : : EMessage_ResultDecline )
{
PSAVE_DETAILS pSaveDetails = StorageManager . ReturnSavesInfo ( ) ;
StorageManager . DeleteSaveData ( & pSaveDetails - > SaveInfoA [ ( int ) pClass - > m_iSaveGameInfoIndex ] , UIScene_LoadMenu : : DeleteSaveDataReturned , pClass ) ;
}
else
{
pClass - > m_bIgnoreInput = false ;
}
return 0 ;
}
int UIScene_LoadMenu : : DeleteSaveDataReturned ( void * pParam , bool bSuccess )
{
UIScene_LoadMenu * pClass = ( UIScene_LoadMenu * ) pParam ;
app . SetCorruptSaveDeleted ( true ) ;
pClass - > navigateBack ( ) ;
return 0 ;
}
// 4J Stu - Shared functionality that is the same whether we needed a quadrant sign-in or not
void UIScene_LoadMenu : : StartGameFromSave ( UIScene_LoadMenu * pClass , DWORD dwLocalUsersMask )
{
2026-03-03 03:04:10 +08:00
if ( pClass - > m_levelGen = = NULL )
{
INT saveOrCheckpointId = 0 ;
bool validSave = StorageManager . GetSaveUniqueNumber ( & saveOrCheckpointId ) ;
TelemetryManager - > RecordLevelResume ( pClass - > m_iPad , eSen_FriendOrMatch_Playing_With_Invited_Friends , eSen_CompeteOrCoop_Coop_and_Competitive , app . GetGameSettings ( pClass - > m_iPad , eGameSetting_Difficulty ) , app . GetLocalPlayerCount ( ) , g_NetworkManager . GetOnlinePlayerCount ( ) , saveOrCheckpointId ) ;
}
else
{
StorageManager . ResetSaveData ( ) ;
// Make our next save default to the name of the level
StorageManager . SetSaveTitle ( pClass - > m_levelGen - > getDefaultSaveName ( ) . c_str ( ) ) ;
}
2026-03-01 12:16:08 +08:00
bool isClientSide = ProfileManager . IsSignedInLive ( ProfileManager . GetPrimaryPad ( ) ) & & pClass - > m_MoreOptionsParams . bOnlineGame ;
# ifdef __PSVITA__
if ( CGameNetworkManager : : usingAdhocMode ( ) )
{
if ( SQRNetworkManager_AdHoc_Vita : : GetAdhocStatus ( ) ) // && pClass->m_MoreOptionsParams.bOnlineGame)
isClientSide = true ;
}
# endif // __PSVITA__
bool isPrivate = ( app . GetGameSettings ( pClass - > m_iPad , eGameSetting_InviteOnly ) > 0 ) ? true : false ;
PSAVE_DETAILS pSaveDetails = StorageManager . ReturnSavesInfo ( ) ;
NetworkGameInitData * param = new NetworkGameInitData ( ) ;
param - > seed = pClass - > m_seed ;
2026-03-03 03:04:10 +08:00
param - > saveData = NULL ;
param - > levelGen = pClass - > m_levelGen ;
2026-03-01 12:16:08 +08:00
param - > texturePackId = pClass - > m_MoreOptionsParams . dwTexturePack ;
Minecraft * pMinecraft = Minecraft : : GetInstance ( ) ;
pMinecraft - > skins - > selectTexturePackById ( pClass - > m_MoreOptionsParams . dwTexturePack ) ;
//pMinecraft->skins->updateUI();
app . SetGameHostOption ( eGameHostOption_Difficulty , Minecraft : : GetInstance ( ) - > options - > difficulty ) ;
app . SetGameHostOption ( eGameHostOption_FriendsOfFriends , app . GetGameSettings ( pClass - > m_iPad , eGameSetting_FriendsOfFriends ) ) ;
app . SetGameHostOption ( eGameHostOption_Gamertags , app . GetGameSettings ( pClass - > m_iPad , eGameSetting_GamertagsVisible ) ) ;
app . SetGameHostOption ( eGameHostOption_BedrockFog , app . GetGameSettings ( pClass - > m_iPad , eGameSetting_BedrockFog ) ? 1 : 0 ) ;
app . SetGameHostOption ( eGameHostOption_PvP , pClass - > m_MoreOptionsParams . bPVP ) ;
app . SetGameHostOption ( eGameHostOption_TrustPlayers , pClass - > m_MoreOptionsParams . bTrust ) ;
app . SetGameHostOption ( eGameHostOption_FireSpreads , pClass - > m_MoreOptionsParams . bFireSpreads ) ;
app . SetGameHostOption ( eGameHostOption_TNT , pClass - > m_MoreOptionsParams . bTNT ) ;
app . SetGameHostOption ( eGameHostOption_HostCanFly , pClass - > m_MoreOptionsParams . bHostPrivileges ) ;
app . SetGameHostOption ( eGameHostOption_HostCanChangeHunger , pClass - > m_MoreOptionsParams . bHostPrivileges ) ;
app . SetGameHostOption ( eGameHostOption_HostCanBeInvisible , pClass - > m_MoreOptionsParams . bHostPrivileges ) ;
2026-03-03 03:04:10 +08:00
app . SetGameHostOption ( eGameHostOption_MobGriefing , pClass - > m_MoreOptionsParams . bMobGriefing ) ;
app . SetGameHostOption ( eGameHostOption_KeepInventory , pClass - > m_MoreOptionsParams . bKeepInventory ) ;
app . SetGameHostOption ( eGameHostOption_DoMobSpawning , pClass - > m_MoreOptionsParams . bDoMobSpawning ) ;
app . SetGameHostOption ( eGameHostOption_DoMobLoot , pClass - > m_MoreOptionsParams . bDoMobLoot ) ;
app . SetGameHostOption ( eGameHostOption_DoTileDrops , pClass - > m_MoreOptionsParams . bDoTileDrops ) ;
app . SetGameHostOption ( eGameHostOption_NaturalRegeneration , pClass - > m_MoreOptionsParams . bNaturalRegeneration ) ;
app . SetGameHostOption ( eGameHostOption_DoDaylightCycle , pClass - > m_MoreOptionsParams . bDoDaylightCycle ) ;
# ifdef _LARGE_WORLDS
app . SetGameHostOption ( eGameHostOption_WorldSize , pClass - > m_MoreOptionsParams . worldSize + 1 ) ; // 0 is GAME_HOST_OPTION_WORLDSIZE_UNKNOWN
# endif
// app.SetGameNewWorldSize(64, true );
// app.SetGameNewWorldSize(0, false );
2026-03-01 12:16:08 +08:00
// flag if the user wants to reset the Nether to force a Fortress with netherwart etc.
app . SetResetNether ( ( pClass - > m_MoreOptionsParams . bResetNether = = TRUE ) ? true : false ) ;
// clear out the app's terrain features list
app . ClearTerrainFeaturePosition ( ) ;
2026-03-03 03:04:10 +08:00
app . SetGameHostOption ( eGameHostOption_GameType , pClass - > m_iGameModeId ) ;
2026-03-01 12:16:08 +08:00
g_NetworkManager . HostGame ( dwLocalUsersMask , isClientSide , isPrivate , MINECRAFT_NET_MAX_PLAYERS , 0 ) ;
param - > settings = app . GetGameHostOption ( eGameHostOption_All ) ;
# ifndef _XBOX
g_NetworkManager . FakeLocalPlayerJoined ( ) ;
# endif
LoadingInputParams * loadingParams = new LoadingInputParams ( ) ;
loadingParams - > func = & CGameNetworkManager : : RunNetworkGameThreadProc ;
loadingParams - > lpParam = ( LPVOID ) param ;
// Reset the autosave time
app . SetAutosaveTimerTime ( ) ;
UIFullscreenProgressCompletionData * completionData = new UIFullscreenProgressCompletionData ( ) ;
completionData - > bShowBackground = TRUE ;
completionData - > bShowLogo = TRUE ;
completionData - > type = e_ProgressCompletion_CloseAllPlayersUIScenes ;
completionData - > iPad = DEFAULT_XUI_MENU_USER ;
loadingParams - > completionData = completionData ;
ui . NavigateToScene ( ProfileManager . GetPrimaryPad ( ) , eUIScene_FullscreenProgress , loadingParams ) ;
}
void UIScene_LoadMenu : : checkStateAndStartGame ( )
{
// Check if they have the Reset Nether flag set, and confirm they want to do this
if ( m_MoreOptionsParams . bResetNether = = TRUE )
{
UINT uiIDA [ 2 ] ;
uiIDA [ 0 ] = IDS_DONT_RESET_NETHER ;
uiIDA [ 1 ] = IDS_RESET_NETHER ;
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_RESETNETHER_TITLE , IDS_RESETNETHER_TEXT , uiIDA , 2 , m_iPad , & UIScene_LoadMenu : : CheckResetNetherReturned , this ) ;
2026-03-01 12:16:08 +08:00
}
else
{
LaunchGame ( ) ;
}
}
int UIScene_LoadMenu : : StartGame_SignInReturned ( void * pParam , bool bContinue , int iPad )
{
UIScene_LoadMenu * pClass = ( UIScene_LoadMenu * ) pParam ;
if ( bContinue = = true )
{
// It's possible that the player has not signed in - they can back out
if ( ProfileManager . IsSignedIn ( pClass - > m_iPad ) )
{
int primaryPad = ProfileManager . GetPrimaryPad ( ) ;
bool noPrivileges = false ;
DWORD dwLocalUsersMask = 0 ;
bool isSignedInLive = ProfileManager . IsSignedInLive ( primaryPad ) ;
bool isOnlineGame = pClass - > m_MoreOptionsParams . bOnlineGame ;
int iPadNotSignedInLive = - 1 ;
bool isLocalMultiplayerAvailable = app . IsLocalMultiplayerAvailable ( ) ;
for ( unsigned int i = 0 ; i < XUSER_MAX_COUNT ; + + i )
{
if ( ProfileManager . IsSignedIn ( i ) & & ( ( i = = primaryPad ) | | isLocalMultiplayerAvailable ) )
{
if ( isSignedInLive & & ! ProfileManager . IsSignedInLive ( i ) )
{
// Record the first non signed in live pad
iPadNotSignedInLive = i ;
}
if ( ! ProfileManager . AllowedToPlayMultiplayer ( i ) ) noPrivileges = true ;
dwLocalUsersMask | = CGameNetworkManager : : GetLocalPlayerMask ( i ) ;
isSignedInLive = isSignedInLive & & ProfileManager . IsSignedInLive ( i ) ;
}
}
// If this is an online game but not all players are signed in to Live, stop!
if ( isOnlineGame & & ! isSignedInLive )
{
# ifdef __ORBIS__
assert ( iPadNotSignedInLive ! = - 1 ) ;
// Check if PSN is unavailable because of age restriction
int npAvailability = ProfileManager . getNPAvailability ( iPadNotSignedInLive ) ;
if ( npAvailability = = SCE_NP_ERROR_AGE_RESTRICTION )
{
pClass - > m_bIgnoreInput = false ;
// 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_OK ;
2026-03-03 03:04:10 +08:00
ui . RequestErrorMessage ( IDS_ONLINE_SERVICE_TITLE , IDS_CONTENT_RESTRICTION , uiIDA , 1 , iPadNotSignedInLive ) ;
2026-03-01 12:16:08 +08:00
}
else
{
pClass - > m_bIgnoreInput = true ;
UINT uiIDA [ 2 ] ;
uiIDA [ 0 ] = IDS_PRO_NOTONLINE_ACCEPT ;
uiIDA [ 1 ] = IDS_CANCEL ;
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_PRO_NOTONLINE_TITLE , IDS_PRO_NOTONLINE_TEXT , uiIDA , 2 , iPadNotSignedInLive , & UIScene_LoadMenu : : MustSignInReturnedPSN , pClass ) ;
2026-03-01 12:16:08 +08:00
}
return 0 ;
# else
pClass - > m_bIgnoreInput = false ;
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_OK ;
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_PRO_NOTONLINE_TITLE , IDS_PRO_NOTONLINE_TEXT , uiIDA , 1 , ProfileManager . GetPrimaryPad ( ) ) ;
2026-03-01 12:16:08 +08:00
return 0 ;
# endif
}
// Check if user-created content is allowed, as we cannot play multiplayer if it's not
bool noUGC = false ;
BOOL pccAllowed = TRUE ;
BOOL pccFriendsAllowed = TRUE ;
ProfileManager . AllowedPlayerCreatedContent ( ProfileManager . GetPrimaryPad ( ) , false , & pccAllowed , & pccFriendsAllowed ) ;
if ( ! pccAllowed & & ! pccFriendsAllowed ) noUGC = true ;
if ( isSignedInLive & & isOnlineGame & & ( noPrivileges | | noUGC ) )
{
if ( noUGC )
{
pClass - > m_bIgnoreInput = false ;
pClass - > setVisible ( true ) ;
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_OK ;
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_FAILED_TO_CREATE_GAME_TITLE , IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE , uiIDA , 1 , ProfileManager . GetPrimaryPad ( ) ) ;
2026-03-01 12:16:08 +08:00
}
else
{
pClass - > m_bIgnoreInput = false ;
pClass - > setVisible ( true ) ;
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_OK ;
2026-03-03 03:04:10 +08:00
ui . RequestAlertMessage ( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE , IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT , uiIDA , 1 , ProfileManager . GetPrimaryPad ( ) ) ;
2026-03-01 12:16:08 +08:00
}
}
else
{
# if defined( __ORBIS__) || defined(__PSVITA__)
if ( isOnlineGame )
{
// show the chat restriction message for all users that it applies to
for ( unsigned int i = 0 ; i < XUSER_MAX_COUNT ; i + + )
{
if ( ProfileManager . IsSignedInLive ( i ) )
{
bool chatRestricted = false ;
ProfileManager . GetChatAndContentRestrictions ( i , false , & chatRestricted , NULL , NULL ) ;
if ( chatRestricted )
{
ProfileManager . DisplaySystemMessage ( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION , i ) ;
}
}
}
}
# endif
// This is NOT called from a storage manager thread, and is in fact called from the main thread in the Profile library tick. Therefore we use the main threads IntCache.
StartGameFromSave ( pClass , dwLocalUsersMask ) ;
}
}
}
else
{
pClass - > m_bIgnoreInput = false ;
}
return 0 ;
}
void UIScene_LoadMenu : : handleGainFocus ( bool navBack )
{
if ( navBack )
{
2026-03-03 03:04:10 +08:00
m_checkboxOnline . setChecked ( m_MoreOptionsParams . bOnlineGame = = TRUE ) ;
2026-03-01 12:16:08 +08:00
}
}
# ifdef __ORBIS__
int UIScene_LoadMenu : : MustSignInReturnedPSN ( void * pParam , int iPad , C4JStorage : : EMessageResult result )
{
UIScene_LoadMenu * pClass = ( UIScene_LoadMenu * ) pParam ;
pClass - > m_bIgnoreInput = false ;
if ( result = = C4JStorage : : EMessage_ResultAccept )
{
SQRNetworkManager_Orbis : : AttemptPSNSignIn ( & UIScene_LoadMenu : : StartGame_SignInReturned , pClass , false , iPad ) ;
}
return 0 ;
}
// int UIScene_LoadMenu::PSPlusReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
// {
// int32_t iResult;
// UIScene_LoadMenu *pClass = (UIScene_LoadMenu *)pParam;
//
// // continue offline, or upsell PS Plus?
// if(result==C4JStorage::EMessage_ResultDecline)
// {
// // upsell psplus
// iResult=sceNpCommerceDialogInitialize();
//
// SceNpCommerceDialogParam param;
// sceNpCommerceDialogParamInitialize(¶m);
// param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS;
// param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY;
// param.userId = ProfileManager.getUserID(pClass->m_iPad);
//
//
// iResult=sceNpCommerceDialogOpen(¶m);
// }
// else if(result==C4JStorage::EMessage_ResultAccept)
// {
// // continue offline
// pClass->m_MoreOptionsParams.bOnlineGame=false;
// pClass->LoadDataComplete(pClass);
// }
//
// pClass->m_bIgnoreInput=false;
// return 0;
// }
# endif