2026-03-01 12:16:08 +08:00
# include " stdafx.h "
# include "..\Common\Consoles_App.h"
# include "..\User.h"
# include "..\..\Minecraft.Client\Minecraft.h"
# include "..\..\Minecraft.Client\MinecraftServer.h"
# include "..\..\Minecraft.Client\PlayerList.h"
# include "..\..\Minecraft.Client\ServerPlayer.h"
# include "..\..\Minecraft.World\Level.h"
# include "..\..\Minecraft.World\LevelSettings.h"
# include "..\..\Minecraft.World\BiomeSource.h"
# include "..\..\Minecraft.World\LevelType.h"
# include "ServiceConfig\Events-XBLA.8-149E11AEEvents.h"
# include "..\..\Minecraft.World\DurangoStats.h"
# include "..\..\Minecraft.Client\Durango\XML\xmlFilesCallback.h"
CConsoleMinecraftApp app ;
CConsoleMinecraftApp : : CConsoleMinecraftApp ( ) : CMinecraftApp ( )
{
memset ( & m_ThumbnailBuffer , 0 , sizeof ( ImageFileBuffer ) ) ;
m_bShutdown = false ;
m_bRead_TMS_DLCINFO_XML = false ;
m_bTMSPP_GlobalFileListRead = false ;
m_bTMSPP_UserFileListRead = false ;
for ( int i = 0 ; i < MAX_LOCAL_PLAYERS ; i + + )
{
m_iLastPresenceContext [ i ] = - 1 ;
m_xuidLastPresencePlayer [ i ] = INVALID_XUID ;
}
}
void CConsoleMinecraftApp : : HandleDLCLicenseChange ( )
{
// run through the DLC packs and update if required
int iOfferC = app . GetDLCOffersCount ( ) ;
for ( int i = 0 ; i < iOfferC ; i + + )
{
MARKETPLACE_CONTENTOFFER_INFO xOffer = StorageManager . GetOffer ( i ) ;
XCONTENT_DATA * pContentData = StorageManager . GetInstalledDLC ( xOffer . wszProductID ) ;
if ( ( pContentData ! = NULL ) & & ( pContentData - > bTrialLicense = = false ) )
{
DLCPack * pack = app . m_dlcManager . getPackFromProductID ( xOffer . wszProductID ) ;
if ( pack )
{
// Clear the DLC installed flag so the scenes will pick up the new dlc (could be a full pack install)
app . ClearDLCInstalled ( ) ;
app . DebugPrintf ( " >>> HandleDLCLicenseChange - Updating license for DLC [%ls] \n " , xOffer . wszOfferName ) ;
2026-03-02 15:53:32 +07:00
pack - > updateLicenseMask ( 1 ) ;
2026-03-01 12:16:08 +08:00
}
else
{
app . DebugPrintf ( " >>> HandleDLCLicenseChange - Couldn't find licensed DLC [%ls] in app.m_dlcManager \n " , xOffer . wszOfferName ) ;
}
}
}
ui . HandleDLCLicenseChange ( ) ;
}
void CConsoleMinecraftApp : : SetRichPresenceContext ( int iPad , int contextId )
{
if ( iPad < XUSER_MAX_COUNT & & Minecraft : : GetInstance ( ) - > localplayers [ iPad ] )
{
PlayerUID uid ;
ProfileManager . GetXUID ( iPad , & uid , true ) ;
if ( uid ! = INVALID_XUID )
{
// 4J-JEV: Player has changed, update cached player and ensure this next presence is sent.
if ( uid ! = m_xuidLastPresencePlayer [ iPad ] )
{
m_xuidLastPresencePlayer [ iPad ] = uid ;
m_iLastPresenceContext [ iPad ] = - 1 ;
}
if ( m_iLastPresenceContext [ iPad ] ! = contextId )
{
app . DebugPrintf ( " >>> EventWriteRichPresenceState(%ls,_,%d) \n " , uid . toString ( ) . c_str ( ) , contextId ) ;
EventWriteRichPresenceState ( uid . toString ( ) . c_str ( ) , DurangoStats : : getPlayerSession ( ) , contextId ) ;
m_iLastPresenceContext [ iPad ] = contextId ;
}
}
}
}
void CConsoleMinecraftApp : : StoreLaunchData ( )
{
}
void CConsoleMinecraftApp : : ExitGame ( )
{
//Windows::ApplicationModel::Core::CoreApplication::Exit();
m_bShutdown = true ;
}
void CConsoleMinecraftApp : : FatalLoadError ( )
{
2026-03-02 15:53:32 +07:00
// 4J-PB -
2026-03-01 12:16:08 +08:00
//for(int i=0;i<10;i++)
{
# ifndef _CONTENT_PACKAGE
OutputDebugStringA ( " FatalLoadError \n " ) ;
# endif
//Sleep(5000);
}
}
void CConsoleMinecraftApp : : CaptureSaveThumbnail ( )
{
RenderManager . CaptureThumbnail ( & m_ThumbnailBuffer ) ;
}
void CConsoleMinecraftApp : : GetSaveThumbnail ( PBYTE * pbData , DWORD * pdwSize )
{
// on a save caused by a create world, the thumbnail capture won't have happened
if ( m_ThumbnailBuffer . Allocated ( ) )
{
if ( pbData )
{
* pbData = new BYTE [ m_ThumbnailBuffer . GetBufferSize ( ) ] ;
* pdwSize = m_ThumbnailBuffer . GetBufferSize ( ) ;
memcpy ( * pbData , m_ThumbnailBuffer . GetBufferPointer ( ) , * pdwSize ) ;
}
m_ThumbnailBuffer . Release ( ) ;
}
else
{
if ( pbData )
{
// use the default image
StorageManager . GetDefaultSaveThumbnail ( pbData , pdwSize ) ;
}
}
}
void CConsoleMinecraftApp : : ReleaseSaveThumbnail ( )
{
}
void CConsoleMinecraftApp : : GetScreenshot ( int iPad , PBYTE * pbData , DWORD * pdwSize )
{
}
int CConsoleMinecraftApp : : GetLocalTMSFileIndex ( WCHAR * wchTMSFile , bool bFilenameIncludesExtension , eFileExtensionType eEXT )
{
return - 1 ;
}
int CConsoleMinecraftApp : : LoadLocalTMSFile ( WCHAR * wchTMSFile )
{
return - 1 ;
}
int CConsoleMinecraftApp : : LoadLocalTMSFile ( WCHAR * wchTMSFile , eFileExtensionType eExt )
{
return - 1 ;
}
void CConsoleMinecraftApp : : FreeLocalTMSFiles ( eTMSFileType eType )
{
}
int CConsoleMinecraftApp : : LoadLocalDLCImages ( )
{
unordered_map < wstring , DLC_INFO * > * pDLCInfoA = app . GetDLCInfo ( ) ;
// 4J-PB - Any local graphic files for the Minecraft Store?
for ( AUTO_VAR ( it , pDLCInfoA - > begin ( ) ) ; it ! = pDLCInfoA - > end ( ) ; it + + )
{
DLC_INFO * pDLCInfo = ( * it ) . second ;
LoadLocalDLCImage ( pDLCInfo - > wchBanner , & pDLCInfo - > pbImageData , & pDLCInfo - > dwImageBytes ) ;
}
return 0 ;
}
void CConsoleMinecraftApp : : FreeLocalDLCImages ( )
{
// 4J-PB - Any local graphic files for the Minecraft Store?
unordered_map < wstring , DLC_INFO * > * pDLCInfoA = app . GetDLCInfo ( ) ;
for ( AUTO_VAR ( it , pDLCInfoA - > begin ( ) ) ; it ! = pDLCInfoA - > end ( ) ; it + + )
{
DLC_INFO * pDLCInfo = ( * it ) . second ;
if ( pDLCInfo - > dwImageBytes ! = 0 )
{
free ( pDLCInfo - > pbImageData ) ;
pDLCInfo - > dwImageBytes = 0 ;
pDLCInfo - > pbImageData = NULL ;
}
}
}
int CConsoleMinecraftApp : : LoadLocalDLCImage ( WCHAR * wchName , PBYTE * ppbImageData , DWORD * pdwBytes )
{
// load the local file
WCHAR wchFilename [ 64 ] ;
2026-03-02 15:53:32 +07:00
2026-03-01 12:16:08 +08:00
// 4J-PB - Read the file containing the product codes. This will be different for the SCEE/SCEA/SCEJ builds
swprintf ( wchFilename , L " DLCImages/%s " , wchName ) ;
HANDLE hFile = CreateFile ( wchFilename , GENERIC_READ , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL ) ;
if ( hFile = = INVALID_HANDLE_VALUE )
{
app . DebugPrintf ( " Failed to open %ls \n " , wchFilename ) ;
return FALSE ;
}
DWORD dwHigh = 0 ;
* pdwBytes = GetFileSize ( hFile , & dwHigh ) ;
if ( * pdwBytes ! = 0 )
{
DWORD dwBytesRead ;
PBYTE pbImageData = ( PBYTE ) malloc ( * pdwBytes ) ;
if ( ReadFile ( hFile , pbImageData , * pdwBytes , & dwBytesRead , NULL ) = = FALSE )
{
// failed
free ( pbImageData ) ;
* pdwBytes = 0 ;
}
else
{
* ppbImageData = pbImageData ;
}
}
CloseHandle ( hFile ) ;
return 0 ;
}
void CConsoleMinecraftApp : : TemporaryCreateGameStart ( )
{
////////////////////////////////////////////////////////////////////////////////////////////// From CScene_Main::OnInit
app . setLevelGenerationOptions ( NULL ) ;
// From CScene_Main::RunPlayGame
Minecraft * pMinecraft = Minecraft : : GetInstance ( ) ;
app . ReleaseSaveThumbnail ( ) ;
ProfileManager . SetLockedProfile ( 0 ) ;
pMinecraft - > user - > name = L " Durango " ;
app . ApplyGameSettingsChanged ( 0 ) ;
////////////////////////////////////////////////////////////////////////////////////////////// From CScene_MultiGameJoinLoad::OnInit
MinecraftServer : : resetFlags ( ) ;
// From CScene_MultiGameJoinLoad::OnNotifyPressEx
app . SetTutorialMode ( false ) ;
app . SetCorruptSaveDeleted ( false ) ;
////////////////////////////////////////////////////////////////////////////////////////////// From CScene_MultiGameCreate::CreateGame
app . ClearTerrainFeaturePosition ( ) ;
wstring wWorldName = L " TestWorld " ;
StorageManager . ResetSaveData ( ) ;
StorageManager . SetSaveTitle ( wWorldName . c_str ( ) ) ;
bool isFlat = false ;
2026-03-02 15:53:32 +07:00
int64_t seedValue = BiomeSource : : findSeed ( isFlat ? LevelType : : lvl_flat : LevelType : : lvl_normal ) ; // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements
2026-03-01 12:16:08 +08:00
NetworkGameInitData * param = new NetworkGameInitData ( ) ;
param - > seed = seedValue ;
param - > saveData = NULL ;
app . SetGameHostOption ( eGameHostOption_Difficulty , 0 ) ;
app . SetGameHostOption ( eGameHostOption_FriendsOfFriends , 0 ) ;
app . SetGameHostOption ( eGameHostOption_Gamertags , 1 ) ;
app . SetGameHostOption ( eGameHostOption_BedrockFog , 1 ) ;
app . SetGameHostOption ( eGameHostOption_GameType , GameType : : SURVIVAL - > getId ( ) ) ;
app . SetGameHostOption ( eGameHostOption_LevelType , 0 ) ;
app . SetGameHostOption ( eGameHostOption_Structures , 1 ) ;
app . SetGameHostOption ( eGameHostOption_BonusChest , 0 ) ;
app . SetGameHostOption ( eGameHostOption_PvP , 1 ) ;
app . SetGameHostOption ( eGameHostOption_TrustPlayers , 1 ) ;
app . SetGameHostOption ( eGameHostOption_FireSpreads , 1 ) ;
app . SetGameHostOption ( eGameHostOption_TNT , 1 ) ;
app . SetGameHostOption ( eGameHostOption_HostCanFly , 1 ) ;
app . SetGameHostOption ( eGameHostOption_HostCanChangeHunger , 1 ) ;
app . SetGameHostOption ( eGameHostOption_HostCanBeInvisible , 1 ) ;
param - > settings = app . GetGameHostOption ( eGameHostOption_All ) ;
g_NetworkManager . FakeLocalPlayerJoined ( ) ;
LoadingInputParams * loadingParams = new LoadingInputParams ( ) ;
loadingParams - > func = & CGameNetworkManager : : RunNetworkGameThreadProc ;
loadingParams - > lpParam = ( LPVOID ) param ;
// Reset the autosave time
app . SetAutosaveTimerTime ( ) ;
C4JThread * thread = new C4JThread ( loadingParams - > func , loadingParams - > lpParam , " RunNetworkGame " ) ;
thread - > Run ( ) ;
}
2026-03-02 15:53:32 +07:00
typedef struct
2026-03-01 12:16:08 +08:00
{
eDLCContentType e_DLC_Type ;
//WCHAR *wchDisplayName;
WCHAR * wchProductId ;
WCHAR * wchBannerName ;
WCHAR * wchFirstSkin ;
int iConfig ;
unsigned int uiSortIndex ;
}
DLC_DETAILS ;
# define MAX_DLC_DETAILS 18
/*DLC_DETAILS DLCDetailsA[MAX_DLC_DETAILS] =
{
// skin packs
// Skin Pack Festive
{ e_DLC_SkinPack , L " Festive Skin Pack " , L " 6dffc4d6-a2d2-4c8c-9284-c607f77e431a " , L " SPF.png " , L " dlcskin00000600.png " , 0 , 1 } ,
// Skin Pack 1
{ e_DLC_SkinPack , L " Skin Pack 1 " , L " 8ecf0f25-a119-4987-a32b-ee0a5925ad8d " , L " SP1.png " , L " dlcskin00000000.png " , 0 , 2 } ,
// Skin Pack 2
{ e_DLC_SkinPack , L " Skin Pack 2 " , L " cc59b688-7cfb-4fa0-a76e-84aa55b92cae " , L " SP2.png " , L " dlcskin00000900.png " , 0 , 3 } ,
// Skin Pack 6
//{ e_DLC_SkinPack,L"0037a29f-876e-4709-8bb8-a388738e6f51","SP6.png","dlcskin00000900.png",0,3},
// Skin Pack Battle And Beasts
{ e_DLC_SkinPack , L " Battle And Beasts " , L " eeeb6489-02a3-4c6e-a8c9-2ace2aa1094d " , L " SPC.png " , L " dlcskin00000800.png " , 0 , 4 } ,
// Skin Pack Battle And Beasts 2
{ e_DLC_SkinPack , L " Battle And Beasts 2 " , L " b858200a-59a8-4e1f-a049-f3e73db2d786 " , L " SPZ.png " , L " dlcskin00001000.png " , 0 , 5 } ,
// Skin Pack Marvel Avengers
{ e_DLC_SkinPack , L " Marvel Avengers " , L " d59757dd-7757-4c5e-8499-dbe4743baa10 " , L " SPM.png " , L " dlcskin00001700.png " , 0 , 6 } ,
// Skin Pack Marvel Spider-Man
{ e_DLC_SkinPack , L " Marvel Spider-Man " , L " cdca1bff-13d1-435a-8aee-e7a35002473f " , L " SPI.png " , L " dlcskin00001800.png " , 0 , 7 } ,
// Skin Pack Birthday 1
{ e_DLC_SkinPack , L " Birthday Skin Pack " , L " 951e8062-3d4e-470c-8177-5eca91bc08b3 " , L " SPB.png " , L " dlcskin00000700.png " , 0 , 8 } ,
// Skin Pack Birthday 2
{ e_DLC_SkinPack , L " 2nd Birthday Skin Pack " , L " c7157788-468d-4ca8-9ecf-5d77a09850fc " , L " SPB2.png " , L " dlcskin00002200.png " , 0 , 9 } ,
// Texture Packs
// Plastic Texture Pack
{ e_DLC_TexturePacks , L " Plastic Texture Pack " , L " 52ecdcf1-d362-47a1-973b-1eeca0db0ea8 " , L " TP01.png " , L " " , 2049 , 1 } ,
// Natural Texture Pack
{ e_DLC_TexturePacks , L " Natural Texture Pack " , L " 1c56db0c-ff49-4bb1-b372-2122b0e813c1 " , L " TP02.png " , L " " , 2053 , 2 } ,
// Halloween Texture Pack
{ e_DLC_TexturePacks , L " Halloween Texture Pack " , L " 8cb331d1-8fa1-4367-a41a-d4830a80ce67 " , L " TP03.png " , L " " , 2052 , 3 } ,
// Fantasy Texture Pack
{ e_DLC_TexturePacks , L " Fantasy Texture Pack " , L " 375a1df4-5550-415b-b278-20f65b31a7a3 " , L " TP04.png " , L " " , 2051 , 4 } ,
// City Texture Pack
{ e_DLC_TexturePacks , L " City Texture Pack " , L " ea5c7b40-e04d-4469-9382-8806467ca2c4 " , L " TP05.png " , L " " , 2054 , 5 } ,
// Candy Texture Pack
{ e_DLC_TexturePacks , L " Candy Texture Pack " , L " 94c75e45-0757-4886-916c-ab026ae27ca9 " , L " TP06.png " , L " " , 2050 , 6 } ,
// Comic Texture Pack
//{ e_DLC_TexturePacks,L"Comic Texture Pack",L"3e14cf0f-26eb-40df-897d-7af905456e58",L"TP07.png",L"",2055,7},
// Mash-up Packs
// Mass Effect
{ e_DLC_MashupPacks , L " Mass Effect " , L " ead4f3bb-b388-42da-8fa9-f1f91570b5c7 " , L " MPMA.png " , L " dlcskin00001100.png " , 1024 , 1 } ,
// Skyrim
{ e_DLC_MashupPacks , L " Skyrim " , L " 81cc4261-7b63-4e48-af1c-60b9ae099644 " , L " MPSR.png " , L " dlcskin00001400.png " , 1025 , 2 } ,
// Halo
{ e_DLC_MashupPacks , L " Halo " , L " 1e06dafc-ea27-475e-945c-fcee0c455f87 " , L " MPHA.png " , L " dlcskin00001600.png " , 1026 , 3 } ,
} ; */
void CConsoleMinecraftApp : : InitialiseDLCDetails ( )
{
for ( int i = 0 ; i < 18 ; i + + )
{
//RegisterDLCData(DLCDetailsA[i].e_DLC_Type, DLCDetailsA[i].wchBannerName, DLCDetailsA[i].wchDisplayName, DLCDetailsA[i].wchProductId, DLCDetailsA[i].wchFirstSkin, DLCDetailsA[i].iConfig, DLCDetailsA[i].uiSortIndex);
}
}
bool CConsoleMinecraftApp : : UpdateProductId ( XCONTENT_DATA & Data )
{
// Do we have a product id for this?
DLC_INFO * pDLCInfo = app . GetDLCInfoForProductName ( Data . wszDisplayName ) ;
if ( pDLCInfo ! = NULL )
{
app . DebugPrintf ( " Updating product id for %ls \n " , Data . wszDisplayName ) ;
swprintf_s ( Data . wszProductID , 64 , L " %ls " , pDLCInfo - > wsProductId . c_str ( ) ) ;
return true ;
}
else
{
app . DebugPrintf ( " Couldn't find %ls \n " , Data . wszDisplayName ) ;
}
2026-03-02 15:53:32 +07:00
return false ;
2026-03-01 12:16:08 +08:00
}
void CConsoleMinecraftApp : : Shutdown ( )
{
m_bShutdown = true ;
}
bool CConsoleMinecraftApp : : getShutdownFlag ( )
{
return m_bShutdown ;
}
// TMS
bool CConsoleMinecraftApp : : TMSPP_ReadBannedList ( int iPad , eTMSAction NextAction )
{
app . DebugPrintf ( " CConsoleMinecraftApp::TMSPP_ReadBannedList \n " ) ;
eTitleStorageState eResult ;
bool bSendBanFileRetrievedMsg = false ;
if ( GetBanListRead ( iPad ) = = false )
{
// Attempt to read the ban list
// do we have one in our user filelist?
//if(StorageManager.TMSPP_InFileList(C4JStorage::eGlobalStorage_TitleUser,iPad,L"BannedList"))
{
SetBanListRead ( iPad , true ) ;
ClearBanList ( iPad ) ;
eResult = StorageManager . TMSPP_ReadFile ( iPad , C4JStorage : : eGlobalStorage_TitleUser , C4JStorage : : TMS_FILETYPE_BINARY , L " BannedList " , & CConsoleMinecraftApp : : Callback_TMSPPReadBannedList , this , NextAction ) ;
if ( eResult ! = eTitleStorage_pending )
{
// something went wrong
app . SetTMSAction ( iPad , ( eTMSAction ) NextAction ) ;
bSendBanFileRetrievedMsg = true ;
}
}
}
else
{
bSendBanFileRetrievedMsg = true ;
}
if ( bSendBanFileRetrievedMsg )
{
ui . HandleTMSBanFileRetrieved ( iPad ) ;
}
app . SetTMSAction ( iPad , ( eTMSAction ) NextAction ) ;
return true ;
}
int CConsoleMinecraftApp : : Callback_TMSPPReadBannedList ( void * pParam , int iPad , int iUserData , LPVOID lpvData , WCHAR * wchFilename )
{
app . DebugPrintf ( " CConsoleMinecraftApp::Callback_TMSPPReadBannedList \n " ) ;
C4JStorage : : PTMSPP_FILEDATA pFileData = ( C4JStorage : : PTMSPP_FILEDATA ) lpvData ;
2026-03-02 15:53:32 +07:00
2026-03-01 12:16:08 +08:00
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) pParam ;
if ( pFileData )
{
// put the entries into the vector
int iEntries = pFileData - > dwSize / sizeof ( BANNEDLISTDATA ) ;
PBANNEDLISTDATA pData = ( PBANNEDLISTDATA ) pFileData - > pbData ;
for ( int i = 0 ; i < iEntries ; i + + )
{
pClass - > AddLevelToBannedLevelList ( iPad , & pData [ i ] , false ) ;
}
// mark the level as not checked against banned levels - it'll be checked once the level starts
app . SetBanListCheck ( iPad , false ) ;
2026-03-02 15:53:32 +07:00
// Xbox One will clear things within the DownloadBlob
2026-03-01 12:16:08 +08:00
# ifndef _XBOX_ONE
delete [ ] pFileData - > pbData ;
delete [ ] pFileData ;
# endif
ui . HandleTMSBanFileRetrieved ( iPad ) ;
}
else
{
// read problem - set state to idel again
StorageManager . TMSPP_ClearTitleStorageState ( iPad ) ;
}
// change the state to the next action
pClass - > SetTMSAction ( iPad , ( eTMSAction ) iUserData ) ;
return 0 ;
}
void CConsoleMinecraftApp : : TMSPP_ReadDLCFile ( int iPad , eTMSAction NextAction )
{
app . DebugPrintf ( " CConsoleMinecraftApp::TMSPP_ReadDLCFile \n " ) ;
bool bRetrievedDLCFile = false ;
// try reading the DLC.xml file (from TMS global) - only allowed to do this once an hour at the most, but we'll just read once each time the game launches
eTitleStorageState eResult ;
if ( m_bRead_TMS_DLCINFO_XML = = false )
{
// 4J-PB - we're reading this info from a local file now
eResult = StorageManager . TMSPP_ReadFile ( iPad , C4JStorage : : eGlobalStorage_Title , C4JStorage : : TMS_FILETYPE_BINARY , L " DLCXbox1.cmp " , & CConsoleMinecraftApp : : Callback_TMSPPReadDLCFile , this , NextAction ) ;
if ( eResult ! = eTitleStorage_pending )
{
// something went wrong
app . SetTMSAction ( iPad , ( eTMSAction ) NextAction ) ;
bRetrievedDLCFile = true ;
m_bRead_TMS_DLCINFO_XML = true ;
}
}
else
{
bRetrievedDLCFile = true ;
}
if ( bRetrievedDLCFile )
{
ui . HandleTMSDLCFileRetrieved ( iPad ) ;
app . SetTMSAction ( iPad , ( eTMSAction ) NextAction ) ;
}
}
void CConsoleMinecraftApp : : TMSPP_RetrieveFileList ( int iPad , C4JStorage : : eGlobalStorage eStorageFacility , eTMSAction NextAction )
{
app . DebugPrintf ( " CConsoleMinecraftApp::TMSPP_RetrieveFileList \n " ) ;
if ( eStorageFacility = = C4JStorage : : eGlobalStorage_Title )
{
if ( m_bTMSPP_GlobalFileListRead = = false )
{
m_bTMSPP_GlobalFileListRead = true ;
StorageManager . TMSPP_ReadFileList ( iPad , eStorageFacility , & CConsoleMinecraftApp : : Callback_TMSPPRetrieveFileList , this , NextAction ) ;
}
else
{
SetTMSAction ( iPad , NextAction ) ;
}
}
else
{
if ( m_bTMSPP_UserFileListRead = = false )
{
m_bTMSPP_UserFileListRead = true ;
StorageManager . TMSPP_ReadFileList ( iPad , eStorageFacility , & CConsoleMinecraftApp : : Callback_TMSPPRetrieveFileList , this , NextAction ) ;
}
else
{
SetTMSAction ( iPad , NextAction ) ;
}
}
}
int CConsoleMinecraftApp : : Callback_TMSPPRetrieveFileList ( void * pParam , int iPad , int iUserData , LPVOID lpvData , WCHAR * wchFilename )
{
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) pParam ;
app . DebugPrintf ( " CConsoleMinecraftApp::Callback_TMSPPRetrieveFileList \n " ) ;
if ( lpvData ! = NULL )
2026-03-02 15:53:32 +07:00
{
2026-03-01 12:16:08 +08:00
vector < C4JStorage : : PTMSPP_FILE_DETAILS > * pvTmsFileDetails = ( vector < C4JStorage : : PTMSPP_FILE_DETAILS > * ) lpvData ;
if ( pvTmsFileDetails - > size ( ) > 0 )
2026-03-02 15:53:32 +07:00
{
2026-03-01 12:16:08 +08:00
# ifdef _DEBUG
// dump out the file list
app . DebugPrintf ( " TMSPP filecount - %d \n Files - \n " , pvTmsFileDetails - > size ( ) ) ;
int iCount = 0 ;
AUTO_VAR ( itEnd , pvTmsFileDetails - > end ( ) ) ;
for ( AUTO_VAR ( it , pvTmsFileDetails - > begin ( ) ) ; it ! = itEnd ; it + + )
{
C4JStorage : : PTMSPP_FILE_DETAILS fd = * it ;
app . DebugPrintf ( " %2d. %ls (size - %d) \n " , iCount + + , fd - > wchFilename , fd - > ulFileSize ) ;
}
# endif
}
}
// change the state to the next action
pClass - > SetTMSAction ( iPad , ( eTMSAction ) iUserData ) ;
return 0 ;
}
//#define WRITE_DLCINFO 1
int CConsoleMinecraftApp : : Callback_TMSPPReadDLCFile ( void * pParam , int iPad , int iUserData , LPVOID lpvData , WCHAR * pwchFilename )
{
app . DebugPrintf ( " CConsoleMinecraftApp::Callback_TMSPPReadDLCFile \n " ) ;
C4JStorage : : PTMSPP_FILEDATA pFileData = ( C4JStorage : : PTMSPP_FILEDATA ) lpvData ;
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) pParam ;
# ifdef WRITE_DLCINFO
if ( 0 )
# else
if ( pFileData & & pFileData - > dwSize > 0 )
# endif
{
// the DLC.xml file is now compressed
unsigned int uiDecompSize = * ( unsigned int * ) pFileData - > pbData ;
unsigned int uiCompSize = ( ( unsigned int * ) pFileData - > pbData ) [ 1 ] ;
BYTE * pDecompressedData = new BYTE [ uiDecompSize ] ;
Compression : : ECompressionTypes eOriginalCompressionType = Compression : : getCompression ( ) - > GetDecompressionType ( ) ;
Compression : : getCompression ( ) - > SetDecompressionType ( Compression : : eCompressionType_LZXRLE ) ;
Compression : : getCompression ( ) - > Decompress ( pDecompressedData , & uiDecompSize , & ( ( unsigned int * ) pFileData - > pbData ) [ 2 ] , uiCompSize ) ;
Compression : : getCompression ( ) - > SetDecompressionType ( eOriginalCompressionType ) ;
ATG : : XMLParser xmlParser ;
xmlDLCInfoCallback xmlCallback ;
xmlParser . RegisterSAXCallbackInterface ( & xmlCallback ) ;
xmlParser . ParseXMLBuffer ( ( CHAR * ) pDecompressedData , uiDecompSize ) ;
pClass - > m_bRead_TMS_DLCINFO_XML = true ;
delete pDecompressedData ;
// apply the dlc info to the locally installed DLC
StorageManager . UpdateDLCProductIDs ( ) ;
ui . HandleTMSDLCFileRetrieved ( iPad ) ;
}
else
{
// if there was a read error, reset to idle
StorageManager . TMSPP_ClearTitleStorageState ( iPad ) ;
# ifdef WRITE_DLCINFO
HANDLE file ;
DWORD dwHigh = 0 ;
DWORD dwFileSize ;
// hack for now to upload the file
// open the local file
file = CreateFile ( L " DLCXbox1.cmp " , GENERIC_READ , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL ) ;
if ( file = = INVALID_HANDLE_VALUE )
{
DWORD error = GetLastError ( ) ;
app . DebugPrintf ( " Failed to open DLCXbox1.cmp with error code %d (%x) \n " , error , error ) ;
__debugbreak ( ) ;
return 0 ;
}
dwHigh = 0 ;
dwFileSize = GetFileSize ( file , & dwHigh ) ;
if ( dwFileSize ! = 0 )
{
DWORD bytesRead ;
PBYTE pbData = new BYTE [ dwFileSize ] ;
ReadFile ( file , pbData , dwFileSize , & bytesRead , NULL ) ;
if ( bytesRead = = dwFileSize )
{
//StorageManager.TMSPP_WriteFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"DLCXbox1.cmp",(PBYTE) pbData, dwFileSize,NULL,NULL, 0);
StorageManager . TMSPP_WriteFile ( iPad , C4JStorage : : eGlobalStorage_TitleUser , C4JStorage : : TMS_FILETYPE_BINARY , L " TP06.cmp " , ( PBYTE ) pbData , dwFileSize , NULL , NULL , 0 ) ;
}
Sleep ( 5000 ) ;
}
CloseHandle ( file ) ;
/*
// now the icon
file = CreateFile ( L " TP06.png " , GENERIC_READ , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL ) ;
if ( file = = INVALID_HANDLE_VALUE )
{
DWORD error = GetLastError ( ) ;
app . DebugPrintf ( " Failed to open DLCXbox1.cmp with error code %d (%x) \n " , error , error ) ;
return 0 ;
}
dwHigh = 0 ;
dwFileSize = GetFileSize ( file , & dwHigh ) ;
if ( dwFileSize ! = 0 )
{
DWORD bytesRead ;
PBYTE pbData = new BYTE [ dwFileSize ] ;
ReadFile ( file , pbData , dwFileSize , & bytesRead , NULL ) ;
if ( bytesRead = = dwFileSize )
{
StorageManager . TMSPP_WriteFile ( iPad , C4JStorage : : eGlobalStorage_TitleUser , C4JStorage : : TMS_FILETYPE_BINARY , L " TP06.png " , ( PBYTE ) pbData , dwFileSize , NULL , NULL , 0 ) ;
}
Sleep ( 5000 ) ;
}
CloseHandle ( file ) ; */
# endif
}
// change the state to the next action
pClass - > SetTMSAction ( iPad , ( eTMSAction ) iUserData ) ;
return 0 ;
}
void CConsoleMinecraftApp : : Callback_SaveGameIncomplete ( void * pParam , C4JStorage : : ESaveIncompleteType saveIncompleteType )
{
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) pParam ;
2026-03-02 15:53:32 +07:00
if ( saveIncompleteType = = C4JStorage : : ESaveIncomplete_OutOfQuota
2026-03-01 12:16:08 +08:00
| | saveIncompleteType = = C4JStorage : : ESaveIncomplete_OutOfLocalStorage )
{
StorageManager . SetSaveDisabled ( true ) ;
pClass - > EnterSaveNotificationSection ( ) ;
int message ;
if ( saveIncompleteType = = C4JStorage : : ESaveIncomplete_OutOfQuota ) message = IDS_SAVE_INCOMPLETE_EXPLANATION_QUOTA ;
else message = IDS_SAVE_INCOMPLETE_EXPLANATION_LOCAL_STORAGE ;
UINT uiIDA [ 3 ] =
2026-03-02 15:53:32 +07:00
{
IDS_SAVE_INCOMPLETE_RETRY_SAVING ,
IDS_SAVE_INCOMPLETE_DISABLE_SAVING ,
IDS_SAVE_INCOMPLETE_DELETE_SAVES
2026-03-01 12:16:08 +08:00
} ;
if ( ui . RequestMessageBox ( IDS_SAVE_INCOMPLETE_TITLE , message , uiIDA , 3 , 0 , Callback_SaveGameIncompleteMessageBoxReturned , pClass , app . GetStringTable ( ) ) = = C4JStorage : : EMessage_Busy )
{
// If this failed to display, continue as if we cancelled. This isn't ideal, but the user should already have had some system notification of being out of memory,
// and if we instantly retry then they may not be able to navigate whatever other error is blocking this from appearing
Callback_SaveGameIncompleteMessageBoxReturned ( pParam , 0 , C4JStorage : : EMessage_Cancelled ) ;
}
}
else
{
// 4J-JEV: Unknown error, just cancel the operation.
Callback_SaveGameIncompleteMessageBoxReturned ( pParam , 0 , C4JStorage : : EMessage_Cancelled ) ;
}
}
int CConsoleMinecraftApp : : Callback_SaveGameIncompleteMessageBoxReturned ( void * pParam , int iPad , C4JStorage : : EMessageResult result )
{
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) pParam ;
switch ( result )
{
case C4JStorage : : EMessage_ResultAccept :
pClass - > LeaveSaveNotificationSection ( ) ;
StorageManager . SetSaveDisabled ( false ) ;
StorageManager . ContinueIncompleteOperation ( ) ;
break ;
case C4JStorage : : EMessage_ResultDecline :
case C4JStorage : : EMessage_Cancelled :
pClass - > LeaveSaveNotificationSection ( ) ;
// Set the global flag, so that we don't disable saving again once the message box is complete
app . SetGameHostOption ( eGameHostOption_DisableSaving , 1 ) ;
StorageManager . CancelIncompleteOperation ( ) ;
break ;
case C4JStorage : : EMessage_ResultThirdOption :
ui . NavigateToScene ( iPad , eUIScene_InGameSaveManagementMenu , NULL , eUILayer_Error , eUIGroup_Fullscreen ) ;
break ;
}
return 0 ;
}
void CConsoleMinecraftApp : : ReadLocalDLCList ( void )
{
char szFile [ 255 ] ;
DWORD dwLength ;
// read the local dlc list
File fDLCList ( L " CU/DLCXbox1.cmp " ) ;
if ( fDLCList . exists ( ) )
{
dwLength = fDLCList . length ( ) ;
byteArray data ( dwLength ) ;
FileInputStream fis ( fDLCList ) ;
fis . read ( data , 0 , dwLength ) ;
fis . close ( ) ;
unsigned int uiDecompSize = * ( unsigned int * ) data . data ;
unsigned int uiCompSize = ( ( unsigned int * ) data . data ) [ 1 ] ;
BYTE * pDecompressedData = new BYTE [ uiDecompSize ] ;
Compression : : ECompressionTypes eOriginalCompressionType = Compression : : getCompression ( ) - > GetDecompressionType ( ) ;
Compression : : getCompression ( ) - > SetDecompressionType ( Compression : : eCompressionType_LZXRLE ) ;
Compression : : getCompression ( ) - > Decompress ( pDecompressedData , & uiDecompSize , & ( ( unsigned int * ) data . data ) [ 2 ] , uiCompSize ) ;
Compression : : getCompression ( ) - > SetDecompressionType ( eOriginalCompressionType ) ;
ATG : : XMLParser xmlParser ;
xmlDLCInfoCallback xmlCallback ;
xmlParser . RegisterSAXCallbackInterface ( & xmlCallback ) ;
xmlParser . ParseXMLBuffer ( ( CHAR * ) pDecompressedData , uiDecompSize ) ;
delete pDecompressedData ;
}
}