#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; ibTrialLicense==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); pack->updateLicenseMask(1); } 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() { // 4J-PB - //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 *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 *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]; // 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; __int64 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 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(); } typedef struct { 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); } return false; } 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; 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;iAddLevelToBannedLevelList(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); // Xbox One will clear things within the DownloadBlob #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) { vector *pvTmsFileDetails=(vector *)lpvData; if(pvTmsFileDetails->size()>0) { #ifdef _DEBUG // dump out the file list app.DebugPrintf("TMSPP filecount - %d\nFiles - \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; if ( saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfQuota || 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] = { IDS_SAVE_INCOMPLETE_RETRY_SAVING, IDS_SAVE_INCOMPLETE_DISABLE_SAVING, IDS_SAVE_INCOMPLETE_DELETE_SAVES }; 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; } }