aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Xbox/Xbox_App.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/Xbox/Xbox_App.cpp')
-rw-r--r--Minecraft.Client/Xbox/Xbox_App.cpp3033
1 files changed, 3033 insertions, 0 deletions
diff --git a/Minecraft.Client/Xbox/Xbox_App.cpp b/Minecraft.Client/Xbox/Xbox_App.cpp
new file mode 100644
index 00000000..b252035e
--- /dev/null
+++ b/Minecraft.Client/Xbox/Xbox_App.cpp
@@ -0,0 +1,3033 @@
+#include "stdafx.h"
+
+#include "..\Common\UI\UIStructs.h"
+
+#include "..\Common\XUI\XUI_Intro.h"
+#include "..\Common\XUI\XUI_MainMenu.h"
+#include "..\Common\XUI\XUI_NewUpdateMessage.h"
+#include "..\Common\XUI\XUI_HelpAndOptions.h"
+#include "..\Common\XUI\XUI_TextEntry.h"
+#include "..\Common\XUI\XUI_HelpHowToPlay.h"
+#include "..\Common\XUI\XUI_HowToPlayMenu.h"
+#include "..\Common\XUI\XUI_HelpControls.h"
+#include "..\Common\XUI\XUI_TextEntry.h"
+#include "..\Common\XUI\XUI_LoadSettings.h"
+#include "..\Common\XUI\XUI_SettingsAll.h"
+#include "..\Common\XUI\XUI_SettingsOptions.h"
+#include "..\Common\XUI\XUI_SettingsAudio.h"
+#include "..\Common\XUI\XUI_SettingsControl.h"
+#include "..\Common\XUI\XUI_SettingsGraphics.h"
+#include "..\Common\XUI\XUI_SettingsUI.h"
+#include "..\Common\XUI\XUI_Leaderboards.h"
+#include "..\Common\XUI\XUI_Debug.h"
+#include "..\Common\XUI\XUI_DebugTips.h"
+#include "..\Common\XUI\XUI_Reinstall.h"
+#include "..\Common\XUI\XUI_Death.h"
+#include "..\Common\XUI\XUI_DebugOverlay.h"
+#include "..\Common\XUI\XUI_DLCOffers.h"
+#include "..\Common\XUI\XUI_SocialPost.h"
+#include "..\Common\XUI\XUI_Scene_Container.h"
+#include "..\Common\XUI\XUI_Scene_Furnace.h"
+#include "..\Common\XUI\XUI_Scene_Inventory.h"
+#include "..\Common\XUI\XUI_Scene_Trap.h"
+#include "..\Common\XUI\XUI_Control_ComboBox.h"
+#include "..\Common\XUI\XUI_MultiGameInfo.h"
+#include "..\Common\XUI\XUI_MultiGameJoinLoad.h"
+#include "..\Common\XUI\XUI_MultiGameCreate.h"
+#include "..\Common\XUI\XUI_MultiGameLaunchMoreOptions.h"
+#include "..\Common\XUI\XUI_SignEntry.h"
+#include "..\Common\XUI\XUI_InGameInfo.h"
+#include "..\Common\XUI\XUI_TrialExitUpsell.h"
+#include "..\Common\XUI\XUI_BasePlayer.h"
+#include "..\Common\XUI\XUI_PartnernetPassword.h"
+#include "..\Common\XUI\XUI_SaveMessage.h"
+#include "..\Common\XUI\XUI_Chat.h"
+#include "..\Common\XUI\XUI_SkinSelect.h"
+#include "..\Common\XUI\XUI_InGameHostOptions.h"
+#include "..\Common\XUI\XUI_InGamePlayerOptions.h"
+#include "..\Common\XUI\XUI_Scene_Enchant.h"
+#include "..\Common\XUI\XUI_Scene_BrewingStand.h"
+#include "..\Common\XUI\XUI_XZP_Icons.h"
+#include "..\Common\XUI\XUI_Controls.h"
+#include "..\Common\XUI\XUI_Scene_Win.h"
+#include "..\Common\XUI\XUI_HUD.h"
+#include "..\Common\XUI\XUI_DebugSetCamera.h"
+//#include "..\Common\XUI\XUI_TransferToXboxOne.h"
+
+#ifdef _DEBUG_MENUS_ENABLED
+#include "..\Common\XUI\XUI_DebugItemEditor.h"
+#endif
+#ifndef _CONTENT_PACKAGE
+#include "..\Common\XUI\XUI_DebugSchematicCreator.h"
+#endif
+
+#include "..\..\Minecraft.World\Recipy.h"
+#include "GameConfig\Minecraft.spa.h"
+#include "..\..\Minecraft.Client\Options.h"
+#include "..\..\Minecraft.World\AABB.h"
+#include "..\..\Minecraft.World\Vec3.h"
+#include "..\MinecraftServer.h"
+#include "..\GameRenderer.h"
+#include "..\ProgressRenderer.h"
+#include "..\..\Minecraft.Client\LevelRenderer.h"
+#include "..\..\Minecraft.Client\MobSkinMemTextureProcessor.h"
+
+#include "..\..\Minecraft.Client\Minecraft.h"
+
+#include "..\ClientConnection.h"
+#include "..\MultiPlayerLocalPlayer.h"
+#include "..\..\Minecraft.Client\LocalPlayer.h"
+#include "..\..\Minecraft.World\Player.h"
+#include "..\..\Minecraft.World\Inventory.h"
+#include "..\..\Minecraft.World\Level.h"
+#include "..\..\Minecraft.World\FurnaceTileEntity.h"
+#include "..\..\Minecraft.World\Container.h"
+#include "..\..\Minecraft.World\DispenserTileEntity.h"
+#include "..\..\Minecraft.World\SignTileEntity.h"
+#include "..\..\Minecraft.Client\StatsCounter.h"
+#include "..\GameMode.h"
+#include "Social\SocialManager.h"
+#include <xgraphics.h>
+#include "..\Common\Tutorial\TutorialMode.h"
+#include "..\..\Minecraft.Client\Xbox\XML\ATGXmlParser.h"
+#include "..\..\Minecraft.Client\Xbox\XML\xmlFilesCallback.h"
+#include "4JLibs\inc\4J_Input.h"
+#include "Font\XUI_FontRenderer.h"
+#include "..\Common\Minecraft_Macros.h"
+#include "..\..\Minecraft.Client\PlayerList.h"
+#include "..\..\Minecraft.Client\ServerPlayer.h"
+#include "..\Common\GameRules\ConsoleGameRules.h"
+#include "..\Common\GameRules\ConsoleSchematicFile.h"
+#include "..\..\Minecraft.World\InputOutputStream.h"
+#include "..\..\Minecraft.World\LevelSettings.h"
+#include "..\User.h"
+
+#include "Sentient\SentientManager.h"
+#include "..\..\Minecraft.World\LevelData.h"
+#include "..\..\Minecraft.World\net.minecraft.world.entity.player.h"
+#include "..\..\Minecraft.Client\EntityRenderDispatcher.h"
+#include "..\..\Minecraft.World\compression.h"
+#include "..\TexturePackRepository.h"
+#include "..\TexturePack.h"
+#include "..\Common\DLC\DLCAudioFile.h"
+#include "..\DLCTexturePack.h"
+
+#include "..\Common\XUI\XUI_Intro.h"
+#include "..\Common\XUI\XUI_MainMenu.h"
+#include "..\Common\XUI\XUI_NewUpdateMessage.h"
+#include "..\Common\XUI\XUI_HelpAndOptions.h"
+#include "..\Common\XUI\XUI_TextEntry.h"
+#include "..\Common\XUI\XUI_HelpHowToPlay.h"
+#include "..\Common\XUI\XUI_HowToPlayMenu.h"
+#include "..\Common\XUI\XUI_HelpControls.h"
+#include "..\Common\XUI\XUI_TextEntry.h"
+#include "..\Common\XUI\XUI_LoadSettings.h"
+#include "..\Common\XUI\XUI_SettingsAll.h"
+#include "..\Common\XUI\XUI_SettingsOptions.h"
+#include "..\Common\XUI\XUI_SettingsAudio.h"
+#include "..\Common\XUI\XUI_SettingsControl.h"
+#include "..\Common\XUI\XUI_SettingsGraphics.h"
+#include "..\Common\XUI\XUI_SettingsUI.h"
+#include "..\Common\XUI\XUI_Leaderboards.h"
+#include "..\Common\XUI\XUI_Debug.h"
+#include "..\Common\XUI\XUI_DebugTips.h"
+#include "..\Common\XUI\XUI_Reinstall.h"
+#include "..\Common\XUI\XUI_Death.h"
+#include "..\Common\XUI\XUI_DebugOverlay.h"
+#include "..\Common\XUI\XUI_DLCOffers.h"
+#include "..\Common\XUI\XUI_SocialPost.h"
+#include "..\Common\XUI\XUI_Scene_Container.h"
+#include "..\Common\XUI\XUI_Scene_Furnace.h"
+#include "..\Common\XUI\XUI_Scene_Inventory.h"
+#include "..\Common\XUI\XUI_Scene_Trap.h"
+#include "..\Common\XUI\XUI_Control_ComboBox.h"
+#include "..\Common\XUI\XUI_MultiGameInfo.h"
+#include "..\Common\XUI\XUI_MultiGameJoinLoad.h"
+#include "..\Common\XUI\XUI_MultiGameCreate.h"
+#include "..\Common\XUI\XUI_MultiGameLaunchMoreOptions.h"
+#include "..\Common\XUI\XUI_SignEntry.h"
+#include "..\Common\XUI\XUI_InGameInfo.h"
+#include "..\Common\XUI\XUI_TrialExitUpsell.h"
+#include "..\Common\XUI\XUI_BasePlayer.h"
+#include "..\Common\XUI\XUI_PartnernetPassword.h"
+#include "..\Common\XUI\XUI_SaveMessage.h"
+#include "..\Common\XUI\XUI_Chat.h"
+#include "..\Common\XUI\XUI_SkinSelect.h"
+#include "..\Common\XUI\XUI_InGameHostOptions.h"
+#include "..\Common\XUI\XUI_InGamePlayerOptions.h"
+#include "..\Common\XUI\XUI_Scene_Enchant.h"
+#include "..\Common\XUI\XUI_Scene_BrewingStand.h"
+#include "..\Common\XUI\XUI_XZP_Icons.h"
+#include "..\Common\XUI\XUI_Controls.h"
+#include "..\Common\XUI\XUI_Scene_Win.h"
+#include "..\Common\XUI\XUI_HUD.h"
+#include "..\Common\XUI\XUI_Scene_Anvil.h"
+#include "..\Common\XUI\XUI_Scene_Trading.h"
+#include "..\Common\XUI\XUI_Teleport.h"
+
+#ifdef _DEBUG_MENUS_ENABLED
+#include "..\Common\XUI\XUI_DebugItemEditor.h"
+#endif
+#ifndef _CONTENT_PACKAGE
+#include "..\Common\XUI\XUI_DebugSchematicCreator.h"
+#endif
+
+#include "Xbox_App.h"
+
+CConsoleMinecraftApp app;
+
+LPCWSTR apwstrLocale[10] =
+{
+ L"", // the default locale
+ L"", // English
+ L"ja-JP", // Japanese
+ L"de-DE", // German
+ L"fr-FR", // French
+ L"es-ES", // Spanish
+ L"it-IT", // Italian
+ L"ko-KR", // Korean
+ L"zh-CHT",// Traditional Chinese
+ L"pt-PT" // Portuguese
+};
+
+WCHAR *CConsoleMinecraftApp::wchTypefaceA[]=
+{
+ L"Mojangles",
+ L"SDBookM",
+ L"DFGMaruGothic-Md",
+ L"DFHeiMedium-B5",
+};
+
+WCHAR *CConsoleMinecraftApp::wchTypefaceLocatorA[]=
+{
+ L"media/font/Mojangles.ttf",
+ L"media/font/KOR/BOKMSD.ttf",
+ L"media/font/JPN/DFGMaruGothic-Md.ttf",
+ L"media/font/CHT/DFHeiMedium-B5.ttf",
+};
+
+WCHAR *CConsoleMinecraftApp::wchSceneA[]=
+{
+ L"xuiscene_partnernetpassword",
+ L"xuiscene_intro",
+ L"xuiscene_savemessage",
+ L"xuiscene_main",
+ L"xuiscene_fullscreenprogress",
+ L"xuiscene_pause",
+ L"xuiscene_craftingpanel_2x2",
+ L"xuiscene_craftingpanel_3x3",
+ L"xuiscene_furnace",
+ L"xuiscene_container",
+ L"xuiscene_container_large",
+ L"xuiscene_inventory",
+ L"xuiscene_trap",
+ L"xuiscene_debug",
+ L"xuiScene_DebugTips",
+ L"xuiscene_helpandoptions",
+ L"xuiscene_howtoplay",
+ L"xuiscene_howtoplay_menu",
+ L"xuiscene_controls",
+ L"xuiscene_settings_options",
+ L"xuiscene_settings_audio",
+ L"xuiscene_settings_control",
+ L"xuiscene_settings_graphics",
+ L"xuiscene_settings_UI",
+ L"xuiscene_settings_all",
+ L"xuiscene_leaderboards",
+ L"xuiscene_credits",
+ L"xuiscene_death",
+ L"xuiscene_tutorialpopup",
+ L"xuiscene_multi_create",
+ L"xuiscene_multi_joinload",
+ L"xuiscene_multi_gameinfo",
+ L"xuiscene_signentry",
+ L"xuiscene_ingameinfo",
+ L"xuiscene_connectingprogress",
+ L"xuiscene_DLCOffers",
+ L"xuiscene_socialpost",
+ L"xuiscene_trialexitupsell",
+ L"xuiscene_load_settings",
+ L"xuiscene_chat",
+ L"xuiscene_reinstall",
+ L"xuiscene_skinselect",
+ L"xuiscene_text_entry",
+ L"xuiscene_ingame_host_options",
+ L"xuiscene_ingame_player_options",
+ L"xuiscene_inventory_creative",
+ L"xuiscene_multi_launch_more_options",
+
+ L"xuiscene_DLCMain",
+ L"xuiscene_NewUpdateMessage",
+ L"xuiscene_enchant",
+ L"xuiscene_brewingstand",
+ L"xuiscene_win",
+ L"xuiscene_hud",
+ L"xuiscene_trading",
+ L"xuiscene_anvil",
+ L"xuiscene_teleportmenu",
+// L"xuiscene_TransferToXboxOne",
+
+#ifdef _DEBUG_MENUS_ENABLED
+ L"xuiscene_debugoverlay",
+ L"xuiscene_debug_item_editor",
+#endif
+#ifndef _CONTENT_PACKAGE
+ L"xuiscene_debug_schematic_create",
+ L"xuiscene_debug_set_camera",
+#endif
+};
+
+CConsoleMinecraftApp::CConsoleMinecraftApp() : CMinecraftApp()
+{
+ ZeroMemory(m_PreviewBuffer,sizeof(XSOCIAL_PREVIEWIMAGE)*XUSER_MAX_COUNT);
+ m_bTMSPP_GlobalFileListRead=false;
+ m_bRead_TMS_XUIDS_XML=false;
+ m_bRead_TMS_Config_XML=false;
+ m_bRead_TMS_DLCINFO_XML=false;
+ m_pXuidsFileBuffer=NULL;
+ m_dwXuidsFileSize=0;
+ ZeroMemory(m_ScreenshotBuffer,sizeof(LPD3DXBUFFER)*XUSER_MAX_COUNT);
+ m_ThumbnailBuffer=NULL;
+#ifdef _DEBUG_MENUS_ENABLED
+ debugOverlayCreated = false;
+#endif
+
+ for(int i=0;i<XUSER_MAX_COUNT;i++)
+ {
+ m_iCountDown[i]=0;
+ m_bMenuToBeClosed[i]=false;
+ m_bMenuDisplayed[i]=false;
+ m_bPauseMenuDisplayed[i] = false;
+ m_bContainerMenuDisplayed[i]=false;
+ m_bIgnoreAutosaveMenuDisplayed[i]=false;
+ m_bIgnorePlayerJoinMenuDisplayed[i]=false;
+ m_hCurrentScene[i]=NULL;
+ m_hFirstScene[i]=NULL;
+ }
+
+ m_titleDeploymentType = XTITLE_DEPLOYMENT_DOWNLOAD;
+ DWORD dwResult = XTitleGetDeploymentType(&m_titleDeploymentType, NULL);
+ if( dwResult == ERROR_SUCCESS )
+ {
+ switch( m_titleDeploymentType )
+ {
+ case XTITLE_DEPLOYMENT_OPTICAL_DISC:
+ DebugPrintf("Deployment type is: Disc\n");
+ // Disc-based title.
+ break;
+ case XTITLE_DEPLOYMENT_INSTALLED_TO_HDD:
+ DebugPrintf("Deployment type is: Installed to HDD\n");
+ // Disc-based title has been installed to the hard drive.
+ break;
+ case XTITLE_DEPLOYMENT_DOWNLOAD:
+ DebugPrintf("Deployment type is: Download\n");
+ // Title is deployed as a downloadable title.
+ break;
+ case XTITLE_DEPLOYMENT_OTHER:
+ // Drop through.
+ default:
+ DebugPrintf("Deployment type is: Other/Default\n");
+ // Unknown deployment type.
+ }
+ }
+
+}
+
+void CConsoleMinecraftApp::SetRichPresenceContext(int iPad, int contextId)
+{
+ ProfileManager.SetRichPresenceContextValue(iPad,CONTEXT_GAME_STATE,contextId);
+}
+
+
+//--------------------------------------------------------------------------------------
+// Name: RegisterXuiClasses()
+// Desc: Registers all the scene classes.
+//--------------------------------------------------------------------------------------
+HRESULT CConsoleMinecraftApp::RegisterXuiClasses()
+{
+ // Register any other classes necessary for the app/scene
+ HRESULT hr;
+
+#ifdef _CONTENT_PACKAGE
+#ifndef _FINAL_BUILD
+ hr= CScene_PartnernetPassword::Register();
+ if( FAILED( hr ) ) return hr;
+#endif
+#endif
+
+ hr = CXuiSceneInventoryCreative::Register();
+ if( FAILED( hr ) ) return hr;
+
+ hr = CScene_NewUpdateMessage::Register();
+ if( FAILED( hr ) ) return hr;
+
+#ifdef _DEBUG_MENUS_ENABLED
+ hr = CScene_DebugItemEditor::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_DebugTips::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_DebugOverlay::Register();
+ if( FAILED( hr ) ) return hr;
+#endif
+#ifndef _CONTENT_PACKAGE
+ hr = CScene_DebugSchematicCreator::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_DebugSetCamera::Register();
+ if( FAILED( hr) ) return hr;
+#endif
+
+ hr = CScene_Reinstall::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_SaveMessage::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_Intro::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_Main::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_Debug::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_HelpAndOptions::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_HowToPlay::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_HowToPlayMenu::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_Controls::Register();
+ if( FAILED( hr ) ) return hr;
+
+ // Settings scenes
+ hr = CScene_SettingsAll::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_SettingsOptions::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_SettingsAudio::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_SettingsControl::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_SettingsGraphics::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_SettingsUI::Register();
+ if( FAILED( hr ) ) return hr;
+
+ hr = CScene_Leaderboards::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_Credits::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = UIScene_PauseMenu::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiSceneCraftingPanel::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiSceneBase::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlBurnProgress::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlFireProgress::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlSlotItem::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlSlotList::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlSlotItemListItem::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiSceneContainer::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiSceneFurnace::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiSceneInventory::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiSceneTrap::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrl4JEdit::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_FullscreenProgress::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlLoadingProgress::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlMinecraftSlot::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlMinecraftPlayer::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_Death::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_TutorialPopup::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrl4JList::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlCraftIngredientSlot::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlSliderWrapper::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlPassThroughList::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_MultiGameCreate::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_MultiGameLaunchMoreOptions::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_MultiGameJoinLoad::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_MultiGameInfo::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_SignEntry::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_InGameInfo::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_ConnectingProgress::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiSceneBasePlayer::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_DLCOffers::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_SocialPost::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_TrialExitUpsell::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_LoadGameSettings::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_Chat::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlSplashPulser::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_SkinSelect::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CXuiCtrlMinecraftSkinPreview::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_TextEntry::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_InGameHostOptions::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_InGamePlayerOptions::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = CScene_DLCMain::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CXuiSceneEnchant::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CXuiCtrlEnchantmentBook::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CXuiCtrlEnchantmentButton::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CXuiSceneBrewingStand::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CXuiCtrlBrewProgress::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CXuiCtrlBubblesProgress::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CXuiCtrlEnchantmentButtonText::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CXuiCtrlMobEffect::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CScene_Win::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CXuiSceneHud::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CXuiSceneAnvil::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CXuiSceneTrading::Register();
+ if( FAILED( hr) ) return hr;
+ hr = CScene_Teleport::Register();
+ if( FAILED( hr) ) return hr;
+
+
+ hr = CXuiCtrl4JIcon::Register();
+ if( FAILED( hr ) ) return hr;
+ hr = XuiHtmlRegister();
+ if( FAILED( hr ) ) return hr;
+
+// hr = CScene_TransferToXboxOne::Register();
+ if( FAILED( hr ) ) return hr;
+
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Name: UnregisterXuiClasses()
+// Desc: Unregisters all the scene classes.
+//--------------------------------------------------------------------------------------
+HRESULT CConsoleMinecraftApp::UnregisterXuiClasses()
+{
+ XuiHtmlUnregister();
+
+ CScene_TextEntry::Unregister();
+
+#ifndef _CONTENT_PACKAGE
+ CScene_DebugSchematicCreator::Unregister();
+ CScene_DebugSetCamera::Unregister();
+#endif
+#ifdef _DEBUG_MENUS_ENABLED
+ CScene_DebugItemEditor::Unregister();
+ CScene_DebugTips::Unregister();
+ CScene_DebugOverlay::Unregister();
+#endif
+ CScene_Teleport::Unregister();
+ CXuiSceneTrading::Unregister();
+ CXuiSceneAnvil::Unregister();
+// CScene_TransferToXboxOne::Unregister();
+ CXuiSceneHud::Unregister();
+ CScene_Win::Unregister();
+ CXuiCtrlMobEffect::Unregister();
+ CXuiCtrlEnchantmentButtonText::Unregister();
+ CXuiCtrlBubblesProgress::Unregister();
+ CXuiCtrlBrewProgress::Unregister();
+ CXuiSceneBrewingStand::Unregister();
+ CXuiCtrlEnchantmentButton::Unregister();
+ CXuiCtrlEnchantmentBook::Unregister();
+ CXuiSceneEnchant::Unregister();
+ CScene_InGamePlayerOptions::Unregister();
+ CScene_InGameHostOptions::Unregister();
+ CXuiCtrl4JIcon::Unregister();
+ CXuiCtrlMinecraftSkinPreview::Unregister();
+ CScene_SkinSelect::Unregister();
+ CXuiCtrlSplashPulser::Unregister();
+ CScene_Chat::Unregister();
+ CScene_LoadGameSettings::Unregister();
+ CScene_TrialExitUpsell::Unregister();
+ CScene_SocialPost::Unregister();
+ CScene_DLCOffers::Unregister();
+ CXuiSceneBasePlayer::Unregister();
+ CScene_ConnectingProgress::Unregister();
+ CScene_InGameInfo::Unregister();
+ CScene_SignEntry::Unregister();
+ CScene_MultiGameInfo::Unregister();
+ CScene_MultiGameJoinLoad::Unregister();
+ CScene_MultiGameLaunchMoreOptions::Unregister();
+ CScene_MultiGameCreate::Unregister();
+ CXuiCtrlPassThroughList::Unregister();
+ CXuiCtrlSliderWrapper::Unregister();
+ CXuiCtrlCraftIngredientSlot::Unregister();
+ CXuiCtrl4JList::Unregister();
+ CScene_TutorialPopup::Unregister();
+ CScene_Death::Unregister();
+ CXuiCtrlMinecraftPlayer::Unregister();
+ CXuiCtrlMinecraftSlot::Unregister();
+ CXuiCtrlLoadingProgress::Unregister();
+ CScene_FullscreenProgress::Unregister();
+ CXuiCtrl4JEdit::Unregister();
+ CXuiCtrlBurnProgress::Unregister();
+ CXuiCtrlFireProgress::Unregister();
+ CXuiCtrlSlotItem::Unregister();
+ CXuiCtrlSlotList::Unregister();
+ CXuiCtrlSlotItemListItem::Unregister();
+ CXuiSceneContainer::Unregister();
+ CXuiSceneFurnace::Unregister();
+ CXuiSceneInventory::Unregister();
+ CXuiSceneTrap::Unregister();
+ CXuiSceneBase::Unregister();
+ CXuiSceneCraftingPanel::Unregister();
+ UIScene_PauseMenu::Unregister();
+ CScene_Credits::Unregister();
+ CScene_Leaderboards::Unregister();
+ CScene_Controls::Unregister();
+ CScene_HowToPlay::Unregister();
+ CScene_HowToPlayMenu::Unregister();
+ CScene_HelpAndOptions::Unregister();
+ CScene_Main::Unregister();
+ CScene_Debug::Unregister();
+ CScene_Intro::Unregister();
+ CScene_SaveMessage::Unregister();
+ CScene_Reinstall::Unregister();
+ CScene_DLCMain::Unregister();
+
+ CScene_SettingsAll::Unregister();
+ CScene_SettingsOptions::Unregister();
+ CScene_SettingsAudio::Unregister();
+ CScene_SettingsControl::Unregister();
+ CScene_SettingsGraphics::Unregister();
+ CScene_SettingsUI::Unregister();
+
+ CScene_NewUpdateMessage::Unregister();
+
+#ifdef _CONTENT_PACKAGE
+#ifndef _FINAL_BUILD
+ CScene_PartnernetPassword::Unregister();
+#endif
+#endif
+
+ return S_OK;
+}
+
+
+
+void CConsoleMinecraftApp::GetPreviewImage(int iPad,XSOCIAL_PREVIEWIMAGE *preview)
+{
+ preview->Pitch = m_PreviewBuffer[iPad].Pitch;
+ preview->Width = m_PreviewBuffer[iPad].Width;
+ preview->Height = m_PreviewBuffer[iPad].Height;
+ preview->Format = m_PreviewBuffer[iPad].Format;
+ unsigned int sizeBytes = XGAddress2DTiledExtent(m_PreviewBuffer[iPad].Width, m_PreviewBuffer[iPad].Height, 4) * 4;
+ preview->pBytes = (BYTE *)XPhysicalAlloc(sizeBytes, MAXULONG_PTR, 0, PAGE_READWRITE | PAGE_WRITECOMBINE );
+ memcpy( (void *)preview->pBytes, (void *)m_PreviewBuffer[iPad].pBytes, sizeBytes );
+ XPhysicalFree((LPVOID)m_PreviewBuffer[iPad].pBytes);
+ m_PreviewBuffer[iPad].pBytes = NULL;
+}
+
+void CConsoleMinecraftApp::CaptureScreenshot(int iPad)
+{
+ RenderManager.CaptureScreen(&m_ScreenshotBuffer[iPad], &m_PreviewBuffer[iPad]);
+}
+
+
+HRESULT CConsoleMinecraftApp::LoadXuiResources()
+{
+ m_fontRenderer = new XUI_FontRenderer();
+
+ OverrideFontRenderer(true);
+
+ const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string
+ WCHAR szResourceLocator[ LOCATOR_SIZE ];
+ HRESULT hr;
+
+ // load from the .xzp file
+ const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL);
+
+
+ //#ifdef _CONTENT_PACKAGE
+ // Get the current language setting from the console
+ DWORD dwLanguage = XGetLanguage( );
+
+// if( dwLanguage>=sizeof( apwstrLocale )/sizeof( apwstrLocale[0] ) )
+// {
+// // Use default locale if out of bounds
+// dwLanguage = 0;
+// }
+ // force default to English for now
+ //dwLanguage=1;
+ // Tell XUI what the locale is
+
+ // 4J-PB - we need to load all fonts in an order, and set them as fallbacks of each other - if you save a game in an Asian language, you must be able to switch to English, and still see the Asian characters in the save name
+
+ switch(dwLanguage)
+ {
+
+ case XC_LANGUAGE_KOREAN:
+ //fallback to Japanese, Chinese
+ RegisterFont(eFont_Chinese,eFont_None);
+ RegisterFont(eFont_Japanese,eFont_Chinese);
+ RegisterFont(eFont_Korean,eFont_Japanese,true);
+ XuiSetLocale( L"ko-KR" );
+ break;
+ case XC_LANGUAGE_JAPANESE:
+ //fallback to Korean, Chinese
+ RegisterFont(eFont_Chinese,eFont_None);
+ RegisterFont(eFont_Korean,eFont_Chinese);
+ RegisterFont(eFont_Japanese,eFont_Korean,true);
+ XuiSetLocale( L"ja-JP" );
+ break;
+ case XC_LANGUAGE_TCHINESE:
+ //fallback to Korean, Japanese
+ RegisterFont(eFont_Japanese,eFont_None);
+ RegisterFont(eFont_Korean,eFont_Japanese);
+ RegisterFont(eFont_Chinese,eFont_Korean,true);
+ XuiSetLocale( L"zh-CHT" );
+ break;
+
+
+ default:
+ //fallback to Korean,Japanese, Chinese
+ RegisterFont(eFont_Chinese,eFont_None);
+ RegisterFont(eFont_Japanese,eFont_Chinese);
+ RegisterFont(eFont_Korean,eFont_Japanese);
+ RegisterFont(eFont_European,eFont_Korean,true);
+
+ // some locales can override the language setting
+ bool bOverrideLanguage=true;
+
+ // 4J-PB - removing all the new languages until a future TU
+
+ switch(XGetLocale())
+ {
+#ifdef NEW_LANGUAGES
+ case XC_LOCALE_CZECH_REPUBLIC:
+ XuiSetLocale( L"cs-CZ" );
+ break;
+ case XC_LOCALE_DENMARK:
+ XuiSetLocale( L"da-DK" );
+ break;
+ case XC_LOCALE_FINLAND:
+ XuiSetLocale( L"fi-FI" );
+ break;
+ case XC_LOCALE_GREECE:
+ XuiSetLocale( L"el-GR" );
+ break;
+ case XC_LOCALE_SLOVAK_REPUBLIC:
+ XuiSetLocale( L"sk-SK" );
+ break;
+#endif
+ default:
+ bOverrideLanguage=false;
+ break;
+ }
+
+ if(bOverrideLanguage==false)
+ {
+ switch(dwLanguage)
+ {
+ case XC_LANGUAGE_ENGLISH:
+ switch(XGetLocale())
+ {
+#ifdef NEW_LANGUAGES
+ case XC_LOCALE_AUSTRALIA:
+ case XC_LOCALE_CANADA:
+ case XC_LOCALE_CZECH_REPUBLIC:
+ case XC_LOCALE_GREECE:
+ case XC_LOCALE_HONG_KONG:
+ case XC_LOCALE_HUNGARY:
+ case XC_LOCALE_INDIA:
+ case XC_LOCALE_IRELAND:
+ case XC_LOCALE_ISRAEL:
+ case XC_LOCALE_NEW_ZEALAND:
+ case XC_LOCALE_SAUDI_ARABIA:
+ case XC_LOCALE_SINGAPORE:
+ case XC_LOCALE_SLOVAK_REPUBLIC:
+ case XC_LOCALE_SOUTH_AFRICA:
+ case XC_LOCALE_UNITED_ARAB_EMIRATES:
+ case XC_LOCALE_GREAT_BRITAIN:
+ XuiSetLocale( L"en-GB" );
+ break;
+#endif
+ default:
+ XuiSetLocale( L"" );
+ break;
+ }
+ break;
+ case XC_LANGUAGE_PORTUGUESE:
+ if(XGetLocale()==XC_LOCALE_BRAZIL)
+ {
+ // Brazilian Portuguese
+ XuiSetLocale( L"pt-BR" );
+ }
+ else
+ {
+ XuiSetLocale( L"pt-PT" );
+ }
+ break;
+ case XC_LANGUAGE_GERMAN:
+ XuiSetLocale( L"de-DE" );
+ break;
+ case XC_LANGUAGE_FRENCH:
+ XuiSetLocale( L"fr-FR" );
+ break;
+ case XC_LANGUAGE_SPANISH:
+ switch(XGetLocale())
+ {
+#ifdef NEW_LANGUAGES
+ case XC_LOCALE_ARGENTINA:
+ case XC_LOCALE_CHILE:
+ case XC_LOCALE_COLOMBIA:
+ case XC_LOCALE_MEXICO:
+ case XC_LOCALE_UNITED_STATES:
+ XuiSetLocale( L"es-MX" );
+ break;
+#endif
+ default:
+ XuiSetLocale( L"es-ES" );
+ break;
+ }
+ break;
+ case XC_LANGUAGE_ITALIAN:
+ XuiSetLocale( L"it-IT" );
+ break;
+#ifdef NEW_LANGUAGES
+ case XC_LANGUAGE_POLISH:
+ XuiSetLocale( L"pl-PL" );
+ break;
+ case XC_LANGUAGE_RUSSIAN:
+ XuiSetLocale( L"ru-RU" );
+ break;
+ case XC_LANGUAGE_SWEDISH:
+ XuiSetLocale( L"sv-SE" );
+ break;
+ case XC_LANGUAGE_TURKISH:
+ XuiSetLocale( L"tr-TR" );
+ break;
+ case XC_LANGUAGE_BNORWEGIAN:
+ XuiSetLocale( L"nb-NO" );
+ break;
+ case XC_LANGUAGE_DUTCH:
+ // 4J-PB - the loc people gave us nl-BE but no nl-NL. They claim they are identical, so use nl-BE.
+ //if(XGetLocale()==XC_LOCALE_BELGIUM)
+ {
+ // Belgian Dutch
+ XuiSetLocale( L"nl-BE" );
+ }
+// else
+// {
+// XuiSetLocale( L"nl-NL" );
+// }
+ break;
+ case XC_LANGUAGE_SCHINESE:
+ // fall back to English until we have a font, and Microsoft are happy with the Chinese Simplified text
+ //XuiSetLocale( L"zh-CHS" );
+ XuiSetLocale( L"" );
+ break;
+#endif
+ }
+ }
+ }
+
+
+ //#endif
+
+ XuiSoundXACTRegister();
+ XuiSoundXAudioRegister();
+
+ // Register a default typeface
+ // wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/font/Mojangles.ttf");
+ // hr = RegisterDefaultTypeface( L"Mojangles",szResourceLocator);
+
+ // Load the skin file used for the scene.
+ wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/skin_Minecraft.xur");
+ hr=LoadSkin( szResourceLocator );
+ if( FAILED(hr) ) app.FatalLoadError();
+
+ // Storage strings
+ wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/4J_strings.xus");
+ hr=StorageManager.m_pStringTable->Load( szResourceLocator );
+ if( FAILED(hr) ) app.FatalLoadError();
+
+ wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/strings.xus");
+ hr=StringTable.Load( szResourceLocator );
+ if( FAILED(hr) ) app.FatalLoadError();
+
+ // #ifdef _DEBUG
+ // // dump out the text
+ // int iStringC=0;
+ // LPCWSTR lpTempString;
+ //
+ // while((lpTempString=StringTable.Lookup(iStringC))!=NULL)
+ // {
+ // DebugPrintf("STRING %d = ",iStringC);
+ // OutputDebugStringW(lpTempString);
+ // DebugPrintf("\n");
+ // iStringC++;
+ // }
+ // #endif
+
+
+
+ // Load the xui scenes
+
+ // 4J Stu - Add the tooltip/container scene to the root object
+ // Load the scene.
+ ASSERT(m_hObjRoot);
+ HXUIOBJ mainBaseScene;
+ wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/");
+ if(RenderManager.IsHiDef())
+ {
+ hr=LoadFirstScene( szResourceLocator, L"xuiscene_base.xur", NULL, &mainBaseScene );
+ }
+ else
+ {
+ if(RenderManager.IsWidescreen())
+ {
+ hr=LoadFirstScene( szResourceLocator, L"xuiscene_base.xur", NULL, &mainBaseScene );
+ }
+ else
+ {
+ hr=LoadFirstScene( szResourceLocator, L"xuiscene_base_480.xur", NULL, &mainBaseScene );
+ }
+ }
+ if( FAILED(hr) ) app.FatalLoadError();
+
+ XuiElementGetChildById( mainBaseScene, L"BasePlayer0", &m_PlayerBaseScene[0] );
+ XuiElementGetChildById( mainBaseScene, L"BasePlayer1", &m_PlayerBaseScene[1] );
+ XuiElementGetChildById( mainBaseScene, L"BasePlayer2", &m_PlayerBaseScene[2] );
+ XuiElementGetChildById( mainBaseScene, L"BasePlayer3", &m_PlayerBaseScene[3] );
+
+ for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx)
+ {
+ XuiElementGetChildById( m_PlayerBaseScene[idx], L"XuiSceneContainer", &m_hCurrentScene[idx]);
+ m_hFirstScene[idx]=m_hCurrentScene[idx];
+
+ XuiElementGetChildById( m_PlayerBaseScene[idx], L"XuiSceneTutorialContainer", &m_hCurrentTutorialScene[idx]);
+ m_hFirstTutorialScene[idx]=m_hCurrentTutorialScene[idx];
+
+ XuiElementGetChildById( m_PlayerBaseScene[idx], L"XuiSceneChatRoot", &m_hCurrentChatScene[idx]);
+ m_hFirstChatScene[idx]=m_hCurrentChatScene[idx];
+
+ WCHAR szResourceLocator[ LOCATOR_SIZE ];
+ wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/");
+ HXUIOBJ hScene;
+ HRESULT hr = XuiSceneCreate(szResourceLocator,app.GetSceneName(eUIComponent_Chat, true,false), &idx, &hScene);
+ if( FAILED(hr) ) app.FatalLoadError();
+
+ hr = XuiSceneNavigateForward(m_hCurrentChatScene[idx], FALSE, hScene, idx);
+ if (FAILED(hr))
+ {
+ app.DebugPrintf("chat scene navigate fail");
+ XuiDestroyObject(hScene);
+ return hr;
+ }
+
+ m_hCurrentChatScene[idx]=hScene;
+
+ XuiElementGetChildById( m_PlayerBaseScene[idx], L"XuiSceneHudRoot", &m_hCurrentHudScene[idx]);
+ m_hFirstHudScene[idx]=m_hCurrentHudScene[idx];
+
+ ReloadHudScene(idx, false, true);
+ }
+
+ // get the "Press START to join in" message
+ HXUIOBJ hPressStartMessage;
+
+ XuiElementGetChildById( mainBaseScene, L"XuiPressStartMessage", &hPressStartMessage );
+ // set the text
+ XuiControlSetText(hPressStartMessage, GetString(IDS_PRESS_START_TO_JOIN));
+
+ HXUIOBJ debugContainerObj;
+ XuiElementGetChildById( mainBaseScene, L"XuiSceneDebugContainer", &debugContainerObj );
+ debugContainerScene.Attach( debugContainerObj );
+
+ SetResourcesLoaded(true);
+
+ return S_OK;
+
+}
+
+HRESULT CConsoleMinecraftApp::RegisterFont(eFont eFontLanguage,eFont eFontFallback, bool bSetAsDefault)
+{
+ HRESULT hr=S_OK;
+ const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string
+ WCHAR szResourceLocator[ LOCATOR_SIZE ];
+ const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL);
+
+ wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", wchTypefaceLocatorA[eFontLanguage]);
+ // 4J Stu - Check that the font file actually exists
+ HXUIRESOURCE fontTempResource;
+ BOOL isMemoryResource;
+ hr = XuiResourceOpenNoLoc(szResourceLocator, &fontTempResource, &isMemoryResource);
+ if( FAILED(hr) ) app.FatalLoadError();
+ XuiResourceClose(fontTempResource);
+
+ if(bSetAsDefault)
+ {
+ if(eFontFallback!=eFont_None)
+ {
+ hr = RegisterDefaultTypeface( wchTypefaceA[eFontLanguage],szResourceLocator,NULL,0.0f,wchTypefaceA[eFontFallback]);
+ }
+ else
+ {
+ hr = RegisterDefaultTypeface( wchTypefaceA[eFontLanguage],szResourceLocator);
+ }
+ }
+ else
+ {
+ TypefaceDescriptor typefaceDescriptorStruct;
+ ZeroMemory(&typefaceDescriptorStruct,sizeof(TypefaceDescriptor));
+ typefaceDescriptorStruct.szTypeface=wchTypefaceA[eFontLanguage];
+ typefaceDescriptorStruct.szLocator=szResourceLocator;
+ if(eFontFallback!=eFont_None)
+ {
+ typefaceDescriptorStruct.szFallbackTypeface= wchTypefaceA[eFontFallback];
+ }
+ hr = XuiRegisterTypeface(&typefaceDescriptorStruct,FALSE);
+ }
+ return hr;
+}
+
+
+// TMS++
+
+void CConsoleMinecraftApp::TMSPP_SetTitleGroupID(LPCSTR szTitleGroupID)
+{
+ StorageManager.TMSPP_SetTitleGroupID(szTitleGroupID);
+}
+
+void CConsoleMinecraftApp::TMSPP_RetrieveFileList(int iPad,C4JStorage::eGlobalStorage eStorageFacility,CHAR *szPath,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,szPath,&CConsoleMinecraftApp::Callback_TMSPPReadFileList,this,NextAction);
+ }
+ else
+ {
+ SetTMSAction(iPad,NextAction);
+ }
+ }
+ else
+ {
+ StorageManager.TMSPP_ReadFileList(iPad,eStorageFacility,szPath,&CConsoleMinecraftApp::Callback_TMSPPReadFileList,this,NextAction);
+ }
+
+
+}
+
+int CConsoleMinecraftApp::Callback_TMSPPReadFileList(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILE_LIST pTmsFileList)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadFileList\n");
+ CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam;
+
+#ifdef _DEBUG
+ // dump out the file list
+ app.DebugPrintf("TMSPP filecount - %d\n",pTmsFileList->iCount);
+ for(int i=0;i<pTmsFileList->iCount;i++)
+ {
+ app.DebugPrintf("TMSPP - %s\n",pTmsFileList->FileDetailsA[i].szFilename);
+ }
+#endif
+ // change the state to the next action
+ pClass->SetTMSAction(iPad,(eTMSAction)iUserData);
+ return 0;
+}
+
+void CConsoleMinecraftApp::TMSPP_ReadXuidsFile(int iPad,eTMSAction NextAction)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::TMSPP_ReadXuidsFile\n");
+ C4JStorage::ETMSStatus eResult;
+ // try reading the xuids.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
+
+ if(m_bRead_TMS_XUIDS_XML==false)
+ {
+ m_bRead_TMS_XUIDS_XML=true;
+
+ eResult=StorageManager.TMSPP_ReadFile(iPad,C4JStorage::eGlobalStorage_Title,C4JStorage::TMS_FILETYPE_BINARY,"xuids.xml",&CConsoleMinecraftApp::Callback_TMSPPReadXuidsFile,this,NextAction);
+
+ if(eResult!=C4JStorage::ETMSStatus_ReadInProgress)
+ {
+ // something went wrong
+ app.SetTMSAction(iPad,(eTMSAction)NextAction);
+ }
+ }
+ else
+ {
+ app.SetTMSAction(iPad,(eTMSAction)NextAction);
+ }
+}
+
+int CConsoleMinecraftApp::Callback_TMSPPReadXuidsFile(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadXuidsFile\n");
+ CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam;
+ if(pFileData)
+ {
+ ATG::XMLParser xmlParser;
+ xmlMojangCallback xmlCallback;
+
+ xmlParser.RegisterSAXCallbackInterface( &xmlCallback );
+ xmlParser.ParseXMLBuffer((CHAR *)pFileData->pbData,pFileData->dwSize);
+ delete [] pFileData->pbData;
+ delete [] pFileData;
+ }
+
+ // change the state to the next action
+ pClass->SetTMSAction(iPad,(eTMSAction)iUserData);
+
+ return 0;
+}
+
+void CConsoleMinecraftApp::TMSPP_ReadConfigFile(int iPad,eTMSAction NextAction)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::TMSPP_ReadConfigFile\n");
+ C4JStorage::ETMSStatus eResult;
+ // try reading the xuids.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
+
+ if(m_bRead_TMS_Config_XML==false)
+ {
+ m_bRead_TMS_Config_XML=true;
+
+ eResult=StorageManager.TMSPP_ReadFile(iPad,C4JStorage::eGlobalStorage_Title,C4JStorage::TMS_FILETYPE_BINARY,"Config.xml",&CConsoleMinecraftApp::Callback_TMSPPReadConfigFile,this,NextAction);
+
+ if(eResult!=C4JStorage::ETMSStatus_ReadInProgress)
+ {
+ // something went wrong - probably no Config.xml file exists in TMS++
+ app.SetTMSAction(iPad,(eTMSAction)NextAction);
+ }
+ }
+ else
+ {
+ app.SetTMSAction(iPad,(eTMSAction)NextAction);
+ }
+}
+
+int CConsoleMinecraftApp::Callback_TMSPPReadConfigFile(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadConfigFile\n");
+ CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam;
+ if(pFileData)
+ {
+ ATG::XMLParser xmlParser;
+ xmlConfigCallback xmlCallback;
+
+ xmlParser.RegisterSAXCallbackInterface( &xmlCallback );
+ xmlParser.ParseXMLBuffer((CHAR *)pFileData->pbData,pFileData->dwSize);
+ delete [] pFileData->pbData;
+ delete [] pFileData;
+ }
+
+ // change the state to the next action
+ pClass->SetTMSAction(iPad,(eTMSAction)iUserData);
+
+ return 0;
+}
+
+
+
+bool CConsoleMinecraftApp::TMSPP_ReadBannedList(int iPad,eTMSAction NextAction)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::TMSPP_ReadBannedList\n");
+ C4JStorage::ETMSStatus eResult;
+ bool bSendBanFileRetrievedMsg=false;
+
+ if(GetBanListRead(iPad)==false)
+ {
+ // 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,"BannedList",&CConsoleMinecraftApp::Callback_TMSPPReadBannedList,this,NextAction);
+ if(eResult!=C4JStorage::ETMSStatus_ReadInProgress)
+ {
+ // something went wrong
+ app.SetTMSAction(iPad,(eTMSAction)NextAction);
+ bSendBanFileRetrievedMsg=true;
+ }
+ }
+ else
+ {
+ // not in the list - we'll need to fall back to TMS
+ return false;
+ }
+
+ }
+ 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, C4JStorage::PTMSPP_FILEDATA pFileData,LPCSTR szFilename)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadBannedList\n");
+
+ 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].xuid,pData[i].pszLevelName, false);
+ }
+ // mark the level as not checked against banned levels - it'll be checked once the level starts
+ app.SetBanListCheck(iPad,false);
+
+ delete [] pFileData->pbData;
+ delete [] pFileData;
+ }
+ ui.HandleTMSBanFileRetrieved(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
+ C4JStorage::ETMSStatus eResult;
+ if(m_bRead_TMS_DLCINFO_XML==false)
+ {
+ //m_bRead_TMS_DLCINFO_XML=true;
+
+ eResult=StorageManager.TMSPP_ReadFile(iPad,C4JStorage::eGlobalStorage_Title,C4JStorage::TMS_FILETYPE_BINARY,"DLC.cmp",&CConsoleMinecraftApp::Callback_TMSPPReadDLCFile,this,NextAction);
+ if(eResult!=C4JStorage::ETMSStatus_ReadInProgress)
+ {
+ // something went wrong
+ app.SetTMSAction(iPad,(eTMSAction)NextAction);
+ bRetrievedDLCFile=true;
+ }
+ }
+ else
+ {
+ bRetrievedDLCFile=true;
+ }
+
+ if(bRetrievedDLCFile)
+ {
+ ui.HandleTMSDLCFileRetrieved(iPad);
+
+ app.SetTMSAction(iPad,(eTMSAction)NextAction);
+ }
+}
+
+int CConsoleMinecraftApp::Callback_TMSPPReadDLCFile(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILEDATA pFileData,LPCSTR szFilename)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadDLCFile\n");
+ CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam;
+
+ if(pFileData && pFileData->dwSize>0)
+ {
+ // 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::getCompression()->Decompress(pDecompressedData,&uiDecompSize,&((unsigned int *)pFileData->pbData)[2],uiCompSize);
+ delete [] pFileData->pbData;
+ delete [] pFileData;
+
+ ATG::XMLParser xmlParser;
+ xmlDLCInfoCallback xmlCallback;
+
+ xmlParser.RegisterSAXCallbackInterface( &xmlCallback );
+ xmlParser.ParseXMLBuffer((CHAR *)pDecompressedData,uiDecompSize);
+
+ pClass->m_bRead_TMS_DLCINFO_XML=true;
+
+ delete pDecompressedData;
+ }
+
+ ui.HandleTMSDLCFileRetrieved(iPad);
+
+ // change the state to the next action
+ pClass->SetTMSAction(iPad,(eTMSAction)iUserData);
+
+ return 0;
+}
+
+
+void CConsoleMinecraftApp::ReadBannedList(int iPad,eTMSAction NextAction, bool bCallback)
+{
+ // try reading the banned level list file (from TMS User) - only allowed to do this once an hour at the most, but we'll just read once each time the user signs in
+
+ if(GetBanListCheck(iPad)==false)
+ {
+ SetBanListCheck(iPad,true);
+ ClearBanList(iPad);
+
+ //StorageManager.DeleteTMSFile(iPad,C4JStorage::eGlobalStorage_TitleUser,L"BannedList");
+ C4JStorage::ETMSStatus eTMSStatus;
+ if(bCallback)
+ {
+ eTMSStatus=StorageManager.ReadTMSFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::eTMS_FileType_Normal,L"BannedList",&BannedListA[iPad].pBannedList, &BannedListA[iPad].dwBytes,&CConsoleMinecraftApp::CallbackBannedListFileFromTMS,this,NextAction);
+ }
+ else
+ {
+ eTMSStatus=StorageManager.ReadTMSFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::eTMS_FileType_Normal,L"BannedList",&BannedListA[iPad].pBannedList, &BannedListA[iPad].dwBytes);
+
+ if(eTMSStatus==C4JStorage::ETMSStatus_Idle)
+ {
+ // put the entries into the vector
+ int iEntries=BannedListA[iPad].dwBytes/sizeof(BANNEDLISTDATA);
+ PBANNEDLISTDATA pData=(PBANNEDLISTDATA)BannedListA[iPad].pBannedList;
+
+ for(int i=0;i<iEntries;i++)
+ {
+ AddLevelToBannedLevelList(iPad,pData[i].xuid,pData[i].pszLevelName, false);
+ }
+ // mark the level as not checked against banned levels - it'll be checked once the level starts
+ app.SetBanListCheck(iPad,false);
+ }
+ }
+ }
+ else
+ {
+ app.SetTMSAction(iPad,(eTMSAction)NextAction);
+ // Fix for #70412 - TCR 1.00: BAS Game Stability: The title enters an unresponsive state, on the following screen, when the client attempts to start a new game after leaving a hosted game.
+
+ // if bCallback is set and we've already got the ban list (from a join in session previously), we need to send a message out to let the waiting process proceed
+
+ if(bCallback)
+ {
+ ui.HandleTMSBanFileRetrieved(iPad);
+ }
+ }
+}
+
+int CConsoleMinecraftApp::CallbackBannedListFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction)
+{
+ CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)lpParam;
+
+ if(pClass->BannedListA[iPad].dwBytes>0)
+ {
+ // put the entries into the vector
+ int iEntries=pClass->BannedListA[iPad].dwBytes/sizeof(BANNEDLISTDATA);
+ PBANNEDLISTDATA pData=(PBANNEDLISTDATA)pClass->BannedListA[iPad].pBannedList;
+
+ for(int i=0;i<iEntries;i++)
+ {
+ pClass->AddLevelToBannedLevelList(iPad,pData[i].xuid,pData[i].pszLevelName, false);
+ }
+
+ // mark the level as not checked against banned levels - it'll be checked once the level starts
+ app.SetBanListCheck(iPad,false);
+
+ }
+ app.SetTMSAction(iPad,(eTMSAction)iAction);
+
+ ui.HandleTMSBanFileRetrieved(iPad);
+
+ return 0;
+}
+
+void CConsoleMinecraftApp::OverrideFontRenderer(bool set, bool immediate)
+{
+ // 4J Stu - Only relevant to XUI on Xbox360
+#ifdef _XBOX
+ // We don't want to even attempt using our font renderer in the asian languages
+ switch(XGetLanguage())
+ {
+ case XC_LANGUAGE_JAPANESE:
+ case XC_LANGUAGE_TCHINESE:
+ case XC_LANGUAGE_KOREAN:
+ return;
+ break;
+ }
+
+ if(set != m_bFontRendererOverridden)
+ {
+ if( immediate )
+ {
+ XuiElementDiscardResources( m_hObjRoot, XUI_DISCARD_FONTS );
+ if( set )
+ {
+ XuiFontSetRenderer( m_fontRenderer );
+ }
+ else
+ {
+ XuiFontSetRenderer( NULL );
+ }
+ m_bFontRendererOverridden = set;
+
+ if( GetResourcesLoaded() )
+ {
+ // tell the xui scenes the font renderer changed
+ XUIMessage xuiMsg;
+ CustomMessage_FontRendererChange( &xuiMsg);
+
+ // send the message
+ for(int i=0;i<XUSER_MAX_COUNT;i++)
+ {
+ XuiBroadcastMessage( CXuiSceneBase::GetPlayerBaseScene(i), &xuiMsg );
+ }
+ }
+ }
+
+ m_bOverrideFontRenderer = set;
+ }
+#endif
+}
+
+void CConsoleMinecraftApp::RunFrame()
+{
+ OverrideFontRenderer( m_bOverrideFontRenderer );
+ // Do the actual XUI frame
+
+ CXuiModule::RunFrame();
+
+}
+
+void CConsoleMinecraftApp::CaptureSaveThumbnail()
+{
+ MemSect(53);
+ RenderManager.CaptureThumbnail(&m_ThumbnailBuffer);
+ MemSect(0);
+}
+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!=NULL)
+ {
+ if( pbData )
+ {
+ *pbData= new BYTE [m_ThumbnailBuffer->GetBufferSize()];
+ *pdwSize=m_ThumbnailBuffer->GetBufferSize();
+ memcpy(*pbData,m_ThumbnailBuffer->GetBufferPointer(),*pdwSize);
+ }
+ m_ThumbnailBuffer->Release();
+ m_ThumbnailBuffer=NULL;
+ }
+}
+void CConsoleMinecraftApp::ReleaseSaveThumbnail()
+{
+ if(m_ThumbnailBuffer!=NULL)
+ {
+ m_ThumbnailBuffer->Release();
+ m_ThumbnailBuffer=NULL;
+ }
+}
+
+void CConsoleMinecraftApp::GetScreenshot(int iPad,PBYTE *pbData,DWORD *pdwSize)
+{
+ // on a save caused by a create world, the thumbnail capture won't have happened
+ if(m_ScreenshotBuffer[iPad]!=NULL)
+ {
+ *pbData= new BYTE [m_ScreenshotBuffer[iPad]->GetBufferSize()];
+ *pdwSize=m_ScreenshotBuffer[iPad]->GetBufferSize();
+ memcpy(*pbData,m_ScreenshotBuffer[iPad]->GetBufferPointer(),*pdwSize);
+ m_ScreenshotBuffer[iPad]->Release();
+ m_ScreenshotBuffer[iPad]=NULL;
+ }
+}
+
+#ifdef _DEBUG_MENUS_ENABLED
+void CConsoleMinecraftApp::EnableDebugOverlay(bool enable,int iPad)
+{
+ HRESULT hr = S_OK;
+
+ if(enable && !debugOverlayCreated)
+ {
+ const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL);
+
+ const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string
+ WCHAR szResourceLocator[ LOCATOR_SIZE ];
+
+ wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/");
+ hr = XuiSceneCreate(szResourceLocator, L"xuiscene_debugoverlay.xur", NULL, &m_hDebugOverlay);
+ debugContainerScene.AddChild(m_hDebugOverlay);
+ debugContainerScene.SetShow(false);
+
+ debugOverlayCreated = true;
+ }
+ if(enable)
+ {
+ XuiElementSetUserFocus(m_hDebugOverlay, iPad);
+ }
+ else
+ {
+ XuiElementSetUserFocus(m_hCurrentScene[iPad], iPad);
+ }
+ debugContainerScene.SetShow(enable);
+ SetMenuDisplayed(ProfileManager.GetPrimaryPad(),enable);
+}
+#endif
+
+bool CConsoleMinecraftApp::GetMenuDisplayed(int iPad)
+{
+ return m_bMenuDisplayed[iPad];
+}
+
+void CConsoleMinecraftApp::SetMenuDisplayed(int iPad,bool bVal)
+{
+ if(iPad==XUSER_INDEX_ANY) return;
+
+ if(bVal)
+ {
+ if(iPad==XUSER_INDEX_ANY)
+ {
+ for(int i=0;i<XUSER_MAX_COUNT;i++)
+ {
+ InputManager.SetMenuDisplayed(i,true);
+ m_bMenuDisplayed[i]=true;
+ // 4J Stu - Fix for #11018 - Functional: When the controller is unplugged during active gameplay and plugged back in at the resulting pause menu, it will demonstrate dual-functionality.
+ m_bMenuToBeClosed[iPad]=false;
+ SetChatTextDisplayed(i,false);
+ }
+ }
+ else
+ {
+ InputManager.SetMenuDisplayed(iPad,true);
+ m_bMenuDisplayed[iPad]=true;
+ // 4J Stu - Fix for #11018 - Functional: When the controller is unplugged during active gameplay and plugged back in at the resulting pause menu, it will demonstrate dual-functionality.
+ m_bMenuToBeClosed[iPad]=false;
+ SetChatTextDisplayed(iPad,false);
+ }
+ }
+ else
+ {
+ if(iPad==XUSER_INDEX_ANY)
+ {
+ for(int i=0;i<XUSER_MAX_COUNT;i++)
+ {
+ m_bMenuToBeClosed[i]=true;
+ m_iCountDown[i]=4;
+ }
+ }
+ else
+ {
+ m_bMenuToBeClosed[iPad]=true;
+ m_iCountDown[iPad]=4;
+ }
+ }
+}
+
+void CConsoleMinecraftApp::CheckMenuDisplayed()
+{
+ for(int iPad=0;iPad<4;iPad++)
+ {
+ if(m_bMenuToBeClosed[iPad])
+ {
+ if(m_iCountDown[iPad]!=0)
+ {
+ m_iCountDown[iPad]--;
+ }
+ else
+ {
+ m_bMenuToBeClosed[iPad]=false;
+ m_bMenuDisplayed[iPad]=false;
+ InputManager.SetMenuDisplayed(iPad,false);
+ SetChatTextDisplayed(iPad,true);
+ }
+
+ }
+ }
+}
+bool CConsoleMinecraftApp::IsSceneInStack(int iPad, EUIScene eScene)
+{
+ bool inStack = false;
+ int idx = 0;
+ if( m_bGameStarted )
+ {
+ // If the game isn't running treat as user 0, otherwise map index directly from pad
+ if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad;
+ }
+ AUTO_VAR(itEnd, m_sceneStack[idx].end());
+ for (AUTO_VAR(it, m_sceneStack[idx].begin()); it != itEnd; it++)
+ //for(auto it = m_sceneStack[iPad].begin(), end = m_sceneStack[iPad].end(); it != end; ++it)
+ {
+ if(it->first == eScene)
+ {
+ inStack = true;
+ break;
+ }
+ }
+
+ return inStack;
+}
+
+WCHAR *CConsoleMinecraftApp::GetSceneName(EUIScene eScene,bool bAppendToName,bool bSplitscreenScene)
+{
+ wcscpy(m_SceneName,wchSceneA[eScene]);
+ if(bAppendToName)
+ {
+ if(RenderManager.IsHiDef())
+ {
+ if(bSplitscreenScene)
+ {
+ wcscat(m_SceneName,L"_small");
+ }
+ }
+ else
+ {
+ // if it's low def, but widescreen, then use the small scenes
+ if(!RenderManager.IsWidescreen())
+ {
+ wcscat(m_SceneName,L"_480");
+ }
+
+ }
+ }
+ wcscat(m_SceneName,L".xur");
+
+#ifdef _DEBUG
+#ifndef __PS3__
+ OutputDebugStringA("SCENE LOAD - ");
+ OutputDebugStringW(m_SceneName);
+ app.DebugPrintf("\n");
+#endif __PS3__
+#endif
+
+ return m_SceneName;
+}
+
+HRESULT CConsoleMinecraftApp::NavigateToScene(int iPad,EUIScene eScene, void *initData /* = NULL */, bool forceUsePad /*= false*/, BOOL bStayVisible /* = FALSE */, HXUIOBJ *phResultingScene /*= NULL*/ )
+{
+ ASSERT(m_bDefaultTypefaceRegistered);
+ ASSERT(m_bSkinLoaded);
+ static bool bSeenUpdateTextThisSession=false;
+
+ // make sure we've created the main canvas already
+ ASSERT(m_hObjRoot);
+ if (!m_hObjRoot)
+ return E_UNEXPECTED;
+
+ // If you're navigating to the multigamejoinload, and the player hasn't seen the updates message yet, display it now
+ // display this message the first 3 times
+ if((eScene==eUIScene_LoadOrJoinMenu) && (bSeenUpdateTextThisSession==false) && ( app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplayUpdateMessage)!=0))
+ {
+ eScene=eUIScene_NewUpdateMessage;
+ bSeenUpdateTextThisSession=true;
+ }
+ // if you're trying to navigate to the inventory,the crafting, pause or game info or any of the trigger scenes and there's already a menu up (because you were pressing a few buttons at the same time) then ignore the navigate
+ if(GetMenuDisplayed(iPad))
+ {
+ switch(eScene)
+ {
+ case eUIScene_PauseMenu:
+ case eUIScene_Crafting2x2Menu:
+ case eUIScene_Crafting3x3Menu:
+ case eUIScene_FurnaceMenu:
+ case eUIScene_ContainerMenu:
+ case eUIScene_LargeContainerMenu:
+ case eUIScene_InventoryMenu:
+ case eUIScene_CreativeMenu:
+ case eUIScene_DispenserMenu:
+ case eUIScene_SignEntryMenu:
+ case eUIScene_InGameInfoMenu:
+ case eUIScene_EnchantingMenu:
+ case eUIScene_BrewingStandMenu:
+ case eUIScene_AnvilMenu:
+ case eUIScene_TradingMenu:
+ DebugPrintf("IGNORING NAVIGATE - we're trying to navigate to a user selected scene when there's already a scene up: pad:%d, scene:%d\n", iPad, eScene);
+ return S_FALSE;
+ break;
+ }
+ }
+
+ // load from the .xzp file
+ const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL);
+
+ HXUIOBJ hScene;
+ HRESULT hr;
+ const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string
+ WCHAR szResourceLocator[ LOCATOR_SIZE ];
+
+ wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/");
+
+ // If the init data is null, put the player pad in there
+
+ if(initData==NULL)
+ {
+ initData = &iPad;
+ }
+
+ int idx = 0;
+ if( m_bGameStarted || forceUsePad )
+ {
+ // If the game isn't running treat as user 0, otherwise map index directly from pad
+ if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad;
+ }
+ else
+ {
+ // The game isn't running, so make sure this scene is fullscreen
+ CXuiSceneBase::SetPlayerBaseScenePosition( idx, CXuiSceneBase::e_BaseScene_Fullscreen );
+ }
+
+ if( eScene != eUIComponent_TutorialPopup && eScene != eUIComponent_Chat && eScene != eUIScene_HUD )
+ {
+ SetMenuDisplayed(idx,true);
+ }
+
+ PIXBeginNamedEvent(0,"Xui scene create\n");
+ MemSect(4);
+
+ bool bIsHiDef=RenderManager.IsHiDef();
+ bool bIsSplitscreen = GetLocalPlayerCount()>1;
+ BOOL bSceneIsFullscreen = CXuiSceneBase::GetPlayerBasePosition(idx)==CXuiSceneBase::e_BaseScene_Fullscreen;
+
+ switch(eScene)
+ {
+ case eUIScene_Intro:
+ case eUIScene_MainMenu:
+ case eUIScene_LeaderboardsMenu:
+ case eUIScene_Credits:
+ case eUIScene_CreateWorldMenu:
+ case eUIScene_LoadOrJoinMenu:
+ case eUIScene_JoinMenu:
+ case eUIScene_DLCOffersMenu:
+ case eUIScene_DLCMainMenu:
+ case eUIScene_TrialExitUpsell:
+ case eUIScene_SaveMessage:
+ case eUIScene_LoadMenu:
+ case eUIScene_LaunchMoreOptionsMenu:
+ // if we're in low res widescreen, we just want to use the normal scenes for these
+ if(!bIsHiDef && RenderManager.IsWidescreen())
+ {
+ hr = XuiSceneCreate(szResourceLocator,app.GetSceneName(eScene,false, false), initData, &hScene);
+ }
+ else
+ {
+ hr = XuiSceneCreate(szResourceLocator,app.GetSceneName(eScene, true,false), initData, &hScene);
+ }
+ break;
+ default:
+ // some scenes are forced into fullscreen even though we are insplitscreen mode (saving)
+ if(eScene==eUIComponent_TutorialPopup || eScene==eUIComponent_Chat || eScene==eUIScene_HUD)
+ {
+ hr = XuiSceneCreate(szResourceLocator,app.GetSceneName(eScene,true,bIsSplitscreen), initData, &hScene);
+ }
+ else
+ {
+ hr = XuiSceneCreate(szResourceLocator,app.GetSceneName(eScene,true,bIsSplitscreen && !bSceneIsFullscreen), initData, &hScene);
+ }
+ break;
+ }
+ if( FAILED(hr) ) app.FatalLoadError();
+
+ MemSect(0);
+ PIXEndNamedEvent();
+#if 0
+ D3DXVECTOR3 test;
+ test.x = 0.5f;
+ test.y = 0.5f;
+ test.z = 1.0f;
+ XuiElementSetScale(hScene,&test);
+#endif
+
+ if( eScene == eUIComponent_TutorialPopup )
+ {
+ hr = XuiSceneNavigateForward(m_hCurrentTutorialScene[iPad], FALSE, hScene, XUSER_INDEX_NONE);
+ if (FAILED(hr))
+ {
+ app.DebugPrintf("scene navigate fail");
+ XuiDestroyObject(hScene);
+ return hr;
+ }
+
+ m_hCurrentTutorialScene[iPad]=hScene;
+ }
+ else if( eScene == eUIComponent_Chat )
+ {
+ hr = XuiSceneNavigateForward(m_hCurrentChatScene[iPad], FALSE, hScene, XUSER_INDEX_NONE);
+ if (FAILED(hr))
+ {
+ app.DebugPrintf("scene navigate fail");
+ XuiDestroyObject(hScene);
+ return hr;
+ }
+
+ m_hCurrentChatScene[iPad]=hScene;
+ }
+ else if( eScene == eUIScene_HUD )
+ {
+ hr = XuiSceneNavigateForward(m_hCurrentHudScene[iPad], FALSE, hScene, XUSER_INDEX_NONE);
+ if (FAILED(hr))
+ {
+ app.DebugPrintf("scene navigate fail");
+ XuiDestroyObject(hScene);
+ return hr;
+ }
+
+ m_hCurrentHudScene[iPad]=hScene;
+ }
+ else
+ {
+ MemSect(5);
+ hr = XuiSceneNavigateForward(m_hCurrentScene[idx], bStayVisible, hScene, iPad);
+ MemSect(0);
+ if (FAILED(hr))
+ {
+ app.DebugPrintf("scene navigate fail");
+ XuiDestroyObject(hScene);
+ return hr;
+ }
+
+ m_hCurrentScene[idx] = hScene;
+ m_sceneStack[idx].push_back( SceneStackPair(eScene, hScene) );
+
+ if(eScene==eUIScene_Intro)
+ {
+ m_bIntroRunning=true;
+ }
+ }
+
+ switch(eScene)
+ {
+ case eUIScene_PauseMenu:
+ {
+ m_bPauseMenuDisplayed[iPad] = true;
+
+ Minecraft *pMinecraft = Minecraft::GetInstance();
+ if(pMinecraft != NULL && pMinecraft->localgameModes[iPad] != NULL )
+ {
+ TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[iPad];
+
+ // This just allows it to be shown
+ gameMode->getTutorial()->showTutorialPopup(false);
+ }
+ }
+ break;
+ case eUIScene_Crafting2x2Menu:
+ case eUIScene_Crafting3x3Menu:
+ case eUIScene_FurnaceMenu:
+ case eUIScene_ContainerMenu:
+ case eUIScene_LargeContainerMenu:
+ case eUIScene_InventoryMenu:
+ case eUIScene_CreativeMenu:
+ case eUIScene_DispenserMenu:
+ case eUIScene_BrewingStandMenu:
+ case eUIScene_EnchantingMenu:
+ case eUIScene_AnvilMenu:
+ case eUIScene_TradingMenu:
+ m_bContainerMenuDisplayed[iPad]=true;
+
+ // Intentional fall-through
+ case eUIScene_DeathMenu:
+ case eUIScene_FullscreenProgress:
+ case eUIScene_SignEntryMenu:
+ case eUIScene_EndPoem:
+ m_bIgnoreAutosaveMenuDisplayed[iPad] = true;
+ break;
+ }
+
+ switch(eScene)
+ {
+ case eUIScene_FullscreenProgress:
+ case eUIScene_EndPoem:
+ m_bIgnorePlayerJoinMenuDisplayed[iPad] = true;
+ break;
+ }
+
+ if(phResultingScene!=NULL)
+ {
+ *phResultingScene=hScene;
+ }
+
+ if (FAILED(hr))
+ return hr;
+
+ return S_OK;
+}
+
+HRESULT CConsoleMinecraftApp::NavigateBack(int iPad, bool forceUsePad /*= false*/, EUIScene eScene /*= eUIScene_COUNT*/)
+{
+ HXUIOBJ hCur;
+ HXUIOBJ hBack;
+
+ int idx = 0;
+ if( m_bGameStarted || forceUsePad )
+ {
+ // If the game isn't running treat as user 0, otherwise map index directly from pad
+ if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad;
+ }
+
+ hCur=m_hCurrentScene[idx];
+
+ if(eScene == eUIScene_COUNT)
+ {
+ hBack = XuiSceneGetBackScene(m_hCurrentScene[idx]);
+ if (!hBack)
+ return S_FALSE;
+
+ m_sceneStack[idx].pop_back();
+ }
+ else
+ {
+ for(auto it = m_sceneStack[idx].begin(), end = m_sceneStack[idx].end(); it != end; ++it)
+ {
+ if(it->first == eScene)
+ {
+ hBack = it->second;
+ }
+ }
+
+ if (!hBack)
+ return S_FALSE;
+
+ while( !m_sceneStack[idx].empty() && m_sceneStack[idx].back().second != hBack)
+ {
+ m_sceneStack[idx].pop_back();
+ }
+ }
+ m_hCurrentScene[idx]=hBack;
+
+ if( m_hCurrentScene[idx] == this->m_hFirstScene[idx] ) SetMenuDisplayed(idx,false);
+
+ CXuiSceneBase::PlayUISFX(eSFX_Back);
+ return XuiSceneNavigateBack(hCur, hBack,iPad );
+}
+
+HRESULT CConsoleMinecraftApp::TutorialSceneNavigateBack(int iPad, bool forceUsePad /*= false*/)
+{
+ HXUIOBJ hCur;
+ HXUIOBJ hBack;
+
+ int idx = 0;
+ if( m_bGameStarted || forceUsePad )
+ {
+ // If the game isn't running treat as user 0, otherwise map index directly from pad
+ if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad;
+ }
+
+ hCur=m_hCurrentTutorialScene[idx];
+ hBack = XuiSceneGetBackScene(m_hCurrentTutorialScene[idx]);
+ if (!hBack)
+ return S_FALSE;
+ m_hCurrentTutorialScene[idx]=hBack;
+
+ return XuiSceneNavigateBack(hCur, hBack,iPad );
+}
+
+HRESULT CConsoleMinecraftApp::CloseXuiScenes(int iPad, bool forceUsePad /*= false*/)
+{
+ HRESULT hr;
+
+ int idx = 0;
+ if( m_bGameStarted || forceUsePad )
+ {
+ // If the game isn't running treat as user 0, otherwise map index directly from pad
+ if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad;
+ }
+
+ hr=XuiSceneNavigateBackToFirst(m_hCurrentScene[idx],iPad);
+ m_hCurrentScene[idx]=m_hFirstScene[idx];
+ m_sceneStack[idx].clear();
+
+ CXuiSceneBase::ShowBackground(iPad, FALSE );
+ CXuiSceneBase::ShowDarkOverlay(iPad, FALSE );
+ CXuiSceneBase::ShowLogo(iPad, FALSE );
+
+ m_bPauseMenuDisplayed[iPad] = false;
+ m_bContainerMenuDisplayed[iPad] = false;
+ m_bIgnoreAutosaveMenuDisplayed[iPad] = false;
+ m_bIgnorePlayerJoinMenuDisplayed[iPad] = false;
+
+ ui.SetTooltips( iPad, -1, -1, -1, -1 );
+ SetMenuDisplayed(iPad,false);
+
+ // Hide the tutorial popup for this player
+ if(m_bGameStarted)
+ {
+ CScene_TutorialPopup::SetSceneVisible(iPad,FALSE);
+ }
+
+ Minecraft *pMinecraft = Minecraft::GetInstance();
+ if(pMinecraft != NULL && pMinecraft->localgameModes[iPad] != NULL )
+ {
+ TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[iPad];
+
+ // This just allows it to be shown
+ gameMode->getTutorial()->showTutorialPopup(true);
+ }
+
+ // update the rich presence
+ // Are we offline or online, and how many players are there
+ if(g_NetworkManager.GetPlayerCount()>1)
+ {
+ for(int i=0;i<XUSER_MAX_COUNT;i++)
+ {
+ if(pMinecraft->localplayers[i])
+ {
+ if(g_NetworkManager.IsLocalGame())
+ {
+ ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false);
+ }
+ else
+ {
+ ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MULTIPLAYER,false);
+ }
+ }
+ }
+ }
+ else
+ {
+ if(m_bGameStarted && pMinecraft->localplayers[idx])
+ {
+ if(g_NetworkManager.IsLocalGame())
+ {
+ ProfileManager.SetCurrentGameActivity(iPad,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false);
+ }
+ else
+ {
+ ProfileManager.SetCurrentGameActivity(iPad,CONTEXT_PRESENCE_MULTIPLAYER_1P,false);
+ }
+ }
+ }
+ // because a player leaving can cause other players close scenes to be called, and they may have been crafting, I'll run
+ // the presence update for all players
+
+ for(int i=0;i<XUSER_MAX_COUNT;i++)
+ {
+ if(pMinecraft->localplayers[i])
+ {
+ pMinecraft->localplayers[i]->updateRichPresence();
+ }
+ }
+
+ return hr;
+}
+
+HRESULT CConsoleMinecraftApp::CloseAllPlayersXuiScenes()
+{
+ HRESULT hr = S_OK;
+
+ // 4J Stu - Fix for #11211 - TCR 015 BAS Sign In Changes: One time-occurrence where users were unable to access any in-game menus after several sign-in changes
+ // We only hide them during a save, but this could be interrupted
+ CXuiSceneBase::ShowOtherPlayersBaseScene(0, true);
+
+ for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx)
+ {
+ CloseXuiScenes(idx, true);
+ ReloadChatScene(idx, false, true);
+ ReloadHudScene(idx, false, true);
+ }
+
+ return hr;
+}
+
+HRESULT CConsoleMinecraftApp::CloseXuiScenesAndNavigateToScene(int iPad,EUIScene eScene, void *initData, bool forceUsePad /*= false*/)
+{
+ HRESULT hr;
+
+ int idx = 0;
+ if( m_bGameStarted || forceUsePad)
+ {
+ // If the game isn't running treat as user 0, otherwise map index directly from pad
+ if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad;
+ }
+
+ hr=XuiSceneNavigateBackToFirst(m_hCurrentScene[idx],iPad);
+ m_hCurrentScene[idx]=m_hFirstScene[idx];
+ m_sceneStack[idx].clear();
+
+ CXuiSceneBase::ShowBackground(iPad, FALSE );
+ CXuiSceneBase::ShowDarkOverlay(iPad, FALSE );
+ CXuiSceneBase::ShowLogo(iPad, FALSE );
+
+ m_bPauseMenuDisplayed[iPad] = false;
+ m_bContainerMenuDisplayed[iPad] = false;
+ m_bIgnoreAutosaveMenuDisplayed[iPad] = false;
+ m_bIgnorePlayerJoinMenuDisplayed[iPad] = false;
+
+ ui.SetTooltips( iPad, -1, -1, -1, -1 );
+ SetMenuDisplayed(iPad,false);
+
+ NavigateToScene(iPad,eScene,initData);
+
+ return hr;
+}
+
+HRESULT CConsoleMinecraftApp::RemoveBackScene(int iPad)
+{
+ int idx = 0;
+ if( m_bGameStarted)
+ {
+ // If the game isn't running treat as user 0, otherwise map index directly from pad
+ if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad;
+ }
+
+ if( m_hCurrentScene[idx] != m_hFirstScene[idx] )
+ {
+ HXUIOBJ hBack = XuiSceneGetBackScene(m_hCurrentScene[idx]);
+
+ if( hBack != m_hFirstScene[idx] )
+ {
+ HXUIOBJ hNewBack = XuiSceneGetBackScene( hBack );
+
+ if( hNewBack != m_hFirstScene[idx] )
+ {
+ XuiSceneSetBackScene(m_hCurrentScene[idx], hNewBack);
+
+ for(auto it = m_sceneStack[idx].begin(), end = m_sceneStack[idx].end(); it != end; ++it)
+ {
+ if(it->second == hBack)
+ {
+ m_sceneStack[idx].erase(it);
+ break;
+ }
+ }
+
+ XuiSceneSetBackScene(hBack, NULL);
+ XuiDestroyObject( hBack );
+ }
+ }
+ }
+
+ return S_OK;
+}
+
+HRESULT CConsoleMinecraftApp::NavigateToHomeMenu()
+{
+ HRESULT hr = S_OK;
+
+ for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx)
+ {
+ if( m_hFirstTutorialScene[idx] != m_hCurrentTutorialScene[idx] )
+ {
+ XuiSceneNavigateBack(m_hCurrentTutorialScene[idx], m_hFirstTutorialScene[idx],XUSER_INDEX_ANY);
+ m_hCurrentTutorialScene[idx] = m_hFirstTutorialScene[idx];
+ }
+ }
+
+ hr = CloseAllPlayersXuiScenes();
+
+ Minecraft *pMinecraft = Minecraft::GetInstance();
+
+ // 4J-PB - just about to switched to the default texture pack , so clean up anything texture pack related here
+
+ // unload any texture pack audio
+ // if there is audio in use, clear out the audio, and unmount the pack
+ TexturePack *pTexPack=Minecraft::GetInstance()->skins->getSelected();
+ DLCTexturePack *pDLCTexPack=NULL;
+
+ if(pTexPack->hasAudio())
+ {
+ // get the dlc texture pack, and store it
+ pDLCTexPack=(DLCTexturePack *)pTexPack;
+ }
+
+ // change to the default texture pack
+ pMinecraft->skins->selectTexturePackById(TexturePackRepository::DEFAULT_TEXTURE_PACK_ID);
+
+ if(pTexPack->hasAudio())
+ {
+ // need to stop the streaming audio - by playing streaming audio from the default texture pack now
+ pMinecraft->soundEngine->playStreaming(L"", 0, 0, 0, 0, 0);
+
+ if(pDLCTexPack->m_pStreamedWaveBank!=NULL)
+ {
+ pDLCTexPack->m_pStreamedWaveBank->Destroy();
+ }
+ if(pDLCTexPack->m_pSoundBank!=NULL)
+ {
+ pDLCTexPack->m_pSoundBank->Destroy();
+ }
+ DWORD result = StorageManager.UnmountInstalledDLC("TPACK");
+ app.DebugPrintf("Unmount result is %d\n",result);
+ }
+
+ g_NetworkManager.ForceFriendsSessionRefresh();
+
+ hr = NavigateToScene(XUSER_INDEX_ANY,eUIScene_MainMenu,NULL);
+ return hr;
+}
+
+D3DXVECTOR3 CConsoleMinecraftApp::GetElementScreenPosition(HXUIOBJ hObj)
+{
+ D3DXMATRIX matrix;
+ D3DXVECTOR3 elementPosition;
+ XuiElementGetFullXForm( hObj, &matrix);
+
+ elementPosition.x = matrix._41;
+ elementPosition.y = matrix._42;
+ elementPosition.z = matrix._43;
+
+ return elementPosition;
+}
+
+void CConsoleMinecraftApp::SetChatTextDisplayed(int iPad, bool bVal)
+{
+ XuiElementSetShow( m_hCurrentChatScene[iPad] ,bVal );
+}
+
+void CConsoleMinecraftApp::ReloadChatScene(int iPad, bool bJoining /*= false*/, bool bForce /*= false*/)
+{
+ if(m_hFirstChatScene[iPad] == NULL || m_hCurrentChatScene[iPad] == NULL) return;
+
+ // Re-create the chat scene so it is the correct size. It starts without any visible lines.
+ BOOL chatSceneVisible = FALSE;
+ if( m_hFirstChatScene[iPad] != m_hCurrentChatScene[iPad] )
+ {
+ chatSceneVisible = XuiElementIsShown(m_hCurrentChatScene[iPad]);
+ }
+
+ int iLocalPlayerC=GetLocalPlayerCount();
+ // we need to decide whether to close the xui scene or just reposition it
+
+ if( bForce ||
+ (bJoining && iLocalPlayerC==2) ||
+ (!bJoining && iLocalPlayerC==1) ||
+ m_hFirstChatScene[iPad] == m_hCurrentChatScene[iPad])
+ {
+ if( m_hFirstChatScene[iPad] != m_hCurrentChatScene[iPad] ) XuiSceneNavigateBack(m_hCurrentChatScene[iPad], m_hFirstChatScene[iPad],iPad);
+ m_hCurrentChatScene[iPad] = m_hFirstChatScene[iPad];
+ app.NavigateToScene(iPad,eUIComponent_Chat,NULL,true);
+
+ XuiElementSetShow( m_hCurrentChatScene[iPad], chatSceneVisible);
+ }
+
+ D3DXVECTOR3 vPosition;
+ vPosition.x = vPosition.y = vPosition.z = 0.0f;
+
+ float textXOffset = 0;
+ float sceneWidth = (float)Minecraft::GetInstance()->width;
+
+ // For 2-player splitscreen we need to move it around a bit
+ switch( CXuiSceneBase::GetPlayerBasePosition(iPad) )
+ {
+ case CXuiSceneBase::e_BaseScene_Top:
+ case CXuiSceneBase::e_BaseScene_Bottom:
+ {
+ vPosition.x -= Minecraft::GetInstance()->width / 4;
+ textXOffset = SAFEZONE_HALF_WIDTH;
+ }
+ break;
+ case CXuiSceneBase::e_BaseScene_Left:
+ textXOffset = SAFEZONE_HALF_WIDTH;
+ case CXuiSceneBase::e_BaseScene_Right:
+ vPosition.y += Minecraft::GetInstance()->height / 4;
+ sceneWidth = XUI_BASE_SCENE_WIDTH_HALF;
+ break;
+ case CXuiSceneBase::e_BaseScene_Top_Left:
+ textXOffset = SAFEZONE_HALF_WIDTH;
+ sceneWidth = XUI_BASE_SCENE_WIDTH_HALF;
+ break;
+ case CXuiSceneBase::e_BaseScene_Top_Right:
+ textXOffset = 0;
+ sceneWidth = XUI_BASE_SCENE_WIDTH_HALF;
+ break;
+ case CXuiSceneBase::e_BaseScene_Bottom_Left:
+ textXOffset = SAFEZONE_HALF_WIDTH;
+ sceneWidth = XUI_BASE_SCENE_WIDTH_HALF;
+ break;
+ case CXuiSceneBase::e_BaseScene_Bottom_Right:
+ textXOffset = 0;
+ sceneWidth = XUI_BASE_SCENE_WIDTH_HALF;
+ break;
+ default:
+ textXOffset = SAFEZONE_HALF_WIDTH;
+ break;
+ }
+ float fWidth, fHeight;
+ XuiElementGetBounds( m_hCurrentChatScene[iPad], &fWidth, &fHeight );
+ XuiElementSetBounds(m_hCurrentChatScene[iPad],sceneWidth, fHeight );
+
+ CScene_Chat* chatScene;
+ VOID *pObj;
+ XuiObjectFromHandle( m_hCurrentChatScene[iPad], &pObj );
+ chatScene = (CScene_Chat *)pObj;
+ chatScene->OffsetTextPosition( textXOffset );
+
+ XuiElementSetPosition( m_hCurrentChatScene[iPad], &vPosition );
+}
+
+void CConsoleMinecraftApp::ReloadHudScene(int iPad, bool bJoining /*= false*/, bool bForce /*= false*/)
+{
+ if(m_hFirstHudScene[iPad] == NULL || m_hCurrentHudScene[iPad] == NULL) return;
+
+ // Re-create the hud scene so it is the correct size. It starts without any visible lines.
+ BOOL hudSceneVisible = FALSE;
+ if( m_hFirstHudScene[iPad] != m_hCurrentHudScene[iPad] )
+ {
+ hudSceneVisible = XuiElementIsShown(m_hCurrentHudScene[iPad]);
+ }
+
+ int iLocalPlayerC=GetLocalPlayerCount();
+ // we need to decide whether to close the xui scene or just reposition it
+
+ if( bForce ||
+ (bJoining && iLocalPlayerC==2) ||
+ (!bJoining && iLocalPlayerC==1) ||
+ m_hFirstHudScene[iPad] == m_hCurrentHudScene[iPad])
+ {
+ if( m_hFirstHudScene[iPad] != m_hCurrentHudScene[iPad] ) XuiSceneNavigateBack(m_hCurrentHudScene[iPad], m_hFirstHudScene[iPad],iPad);
+ m_hCurrentHudScene[iPad] = m_hFirstHudScene[iPad];
+ app.NavigateToScene(iPad,eUIScene_HUD,NULL,true);
+
+ XuiElementSetShow( m_hCurrentHudScene[iPad], hudSceneVisible);
+ }
+}
+
+void CConsoleMinecraftApp::AdjustSplitscreenScene(HXUIOBJ hScene,D3DXVECTOR3 *pvOriginalPosition, int iPad, bool bAdjustXForSafeArea)
+{
+ D3DXVECTOR3 vec;
+
+ Minecraft *pMinecraft = Minecraft::GetInstance();
+
+ // store this for any change of screensection
+ XuiElementGetPosition(hScene,pvOriginalPosition);
+ vec=*pvOriginalPosition;
+
+ if( pMinecraft->localplayers[iPad] != NULL )
+ {
+ switch( pMinecraft->localplayers[iPad]->m_iScreenSection)
+ {
+ case C4JRender::VIEWPORT_TYPE_SPLIT_TOP:
+ // move the scene down
+ vec.y+=fSafeZoneY;
+ break;
+ case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM:
+ break;
+ case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT:
+ break;
+ case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT:
+ // move the scene left
+ if(bAdjustXForSafeArea) vec.x-=fSafeZoneX;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT:
+ // move the scene down
+ vec.y+=fSafeZoneY;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT:
+ // move the scene down
+ vec.y+=fSafeZoneY;
+ // move the scene left
+ if(bAdjustXForSafeArea) vec.x-=fSafeZoneX;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT:
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT:
+ // move the scene left
+ if(bAdjustXForSafeArea) vec.x-=fSafeZoneX;
+ break;
+ }
+ }
+ XuiElementSetPosition(hScene,&vec);
+}
+
+void CConsoleMinecraftApp::AdjustSplitscreenScene(HXUIOBJ hScene,D3DXVECTOR3 *pvOriginalPosition, int iPad, float fXAdjust)
+{
+ D3DXVECTOR3 vec;
+
+ Minecraft *pMinecraft = Minecraft::GetInstance();
+
+ // store this for any change of screensection
+
+ XuiElementGetPosition(hScene,pvOriginalPosition);
+
+ vec=*pvOriginalPosition;
+
+ if( pMinecraft->localplayers[iPad] != NULL )
+ {
+ switch( pMinecraft->localplayers[iPad]->m_iScreenSection)
+ {
+ case C4JRender::VIEWPORT_TYPE_SPLIT_TOP:
+ // move the scene down
+ vec.y+=fSafeZoneY;
+ // 4J-PB - don't adjust things in horizontal splitscreen
+ //vec.x+=fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM:
+ // 4J-PB - don't adjust things in horizontal splitscreen
+ //vec.x+=fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT:
+ vec.x+=fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT:
+ // move the scene left
+ vec.x-=fSafeZoneX-fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT:
+ // move the scene down
+ vec.y+=fSafeZoneY;
+ vec.x+=fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT:
+ // move the scene down
+ vec.y+=fSafeZoneY;
+ // move the scene left
+ vec.x-=fSafeZoneX-fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT:
+ vec.x+=fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT:
+ // move the scene left
+ vec.x-=fSafeZoneX-fXAdjust;
+ break;
+ }
+ }
+
+ XuiElementSetPosition(hScene,&vec);
+}
+
+HRESULT CConsoleMinecraftApp::AdjustSplitscreenScene_PlayerChanged(HXUIOBJ hScene,D3DXVECTOR3 *pvOriginalPosition, int iPad, bool bJoining, bool bAdjustXForSafeArea)
+{
+ int iLocalPlayerC=GetLocalPlayerCount();
+ Minecraft *pMinecraft=Minecraft::GetInstance();
+
+ // we need to decide whether to close the xui scene or just reposition it
+
+ if((bJoining && iLocalPlayerC==2) ||
+ (!bJoining && iLocalPlayerC==1))
+ {
+ // Fix for #101078 - TCR #15: BAS Sign-in Changes: TU12: Signing out the secondary player's profile during the End Poem in local splitscreen game causes Host invincibility and corruption of End Portal.
+ if(!IsSceneInStack(iPad,eUIScene_EndPoem))
+ {
+ // close the scene!
+ ui.SetTooltips(iPad, -1);
+ // kill the xui
+ ui.CloseUIScenes(iPad);
+ }
+
+ // 4J Stu - Return S_FALSE to inidicate that the scene has been closed
+ return S_FALSE;
+ }
+ else if ( pMinecraft->localplayers[iPad] != NULL )
+ {
+ // we need to reposition the scenes since the players will have moved around
+
+ D3DXVECTOR3 vec=*pvOriginalPosition;
+
+ switch( pMinecraft->localplayers[iPad]->m_iScreenSection)
+ {
+ case C4JRender::VIEWPORT_TYPE_SPLIT_TOP:
+ // move the scene down
+ vec.y+=fSafeZoneY;
+ break;
+ case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM:
+ break;
+ case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT:
+ break;
+ case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT:
+ // move the scene left
+ if(bAdjustXForSafeArea) vec.x-=fSafeZoneX;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT:
+ // move the scene down
+ vec.y+=fSafeZoneY;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT:
+ // move the scene down
+ vec.y+=fSafeZoneY;
+ // move the scene left
+ if(bAdjustXForSafeArea) vec.x-=fSafeZoneX;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT:
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT:
+ // move the scene left
+ if(bAdjustXForSafeArea) vec.x-=fSafeZoneX;
+ break;
+ }
+ XuiElementSetPosition(hScene,&vec);
+ }
+
+ return S_OK;
+}
+
+HRESULT CConsoleMinecraftApp::AdjustSplitscreenScene_PlayerChanged(HXUIOBJ hScene,D3DXVECTOR3 *pvOriginalPosition, int iPad, bool bJoining, float fXAdjust)
+{
+ int iLocalPlayerC=GetLocalPlayerCount();
+ Minecraft *pMinecraft=Minecraft::GetInstance();
+
+ // we need to decide whether to close the xui scene or just reposition it
+
+ if((bJoining && iLocalPlayerC==2) ||
+ (!bJoining && iLocalPlayerC==1))
+ {
+ // close the scene!
+ ui.SetTooltips(iPad, -1);
+ // kill the xui
+ ui.CloseUIScenes(iPad);
+
+ // 4J Stu - Return S_FALSE to inidicate that the scene has been closed
+ return S_FALSE;
+ }
+ else if ( pMinecraft->localplayers[iPad] != NULL )
+ {
+ // we need to reposition the scenes since the players will have moved around
+
+ D3DXVECTOR3 vec=*pvOriginalPosition;
+
+ switch( pMinecraft->localplayers[iPad]->m_iScreenSection)
+ {
+ case C4JRender::VIEWPORT_TYPE_SPLIT_TOP:
+ // move the scene down
+ vec.y+=fSafeZoneY;
+ vec.x+=fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM:
+ vec.x+=fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT:
+ vec.x+=fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT:
+ // move the scene left
+ vec.x-=fSafeZoneX-fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT:
+ // move the scene down
+ vec.y+=fSafeZoneY;
+ vec.x+=fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT:
+ // move the scene down
+ vec.y+=fSafeZoneY;
+ // move the scene left
+ vec.x-=fSafeZoneX-fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT:
+ vec.x+=fXAdjust;
+ break;
+ case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT:
+ // move the scene left
+ vec.x-=fSafeZoneX-fXAdjust;
+ break;
+ }
+ XuiElementSetPosition(hScene,&vec);
+ }
+
+ return S_OK;
+}
+
+void CConsoleMinecraftApp::StoreLaunchData()
+{
+ LD_DEMO* pDemoData = NULL;
+
+
+ DWORD dwStatus = XGetLaunchDataSize( &m_dwLaunchDataSize );
+ if( dwStatus == ERROR_SUCCESS )
+ {
+ m_pLaunchData = new BYTE [ m_dwLaunchDataSize ];
+ dwStatus = XGetLaunchData( m_pLaunchData, m_dwLaunchDataSize );
+ pDemoData = (LD_DEMO*)( m_pLaunchData );
+ if( pDemoData->dwID != LAUNCH_DATA_DEMO_ID )
+ {
+ // custom launch data; must be handled separately
+ }
+ }
+}
+
+void CConsoleMinecraftApp::ExitGame()
+{
+ if(m_pLaunchData!=NULL)
+ {
+ LD_DEMO* pDemoData = (LD_DEMO*)( m_pLaunchData );
+ XSetLaunchData( pDemoData, m_dwLaunchDataSize );
+ XLaunchNewImage( pDemoData->szLauncherXEX, 0 );
+ }
+ else
+ {
+ XLaunchNewImage( XLAUNCH_KEYWORD_DASH_ARCADE, 0 );
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+// FatalLoadError
+//
+// This is called when we can't load one of the required files at startup
+// It tends to mean the files have been corrupted.
+// We have to assume that we've not been able to load the text for the game.
+//
+//////////////////////////////////////////////////////////////////////////
+void CConsoleMinecraftApp::FatalLoadError(void)
+{
+ XOVERLAPPED MessageBoxOverlap;
+
+ memset(&MessageBoxOverlap, 0, sizeof(MessageBoxOverlap));
+
+ //HANDLE messageBoxThread = CreateThread(NULL, 0, &CMinecraftApp::ShowFatalLoadMessageBoxThreadProc, &MessageBoxOverlap, 0, NULL);
+ //
+ //WaitForSingleObjectEx(messageBoxThread, // handle to object
+ // 20000, // time-out interval
+ // FALSE // alertable option
+ //);
+ //XOVERLAPPED *MessageBoxOverlap = (XOVERLAPPED *)lpParameter;
+
+ wchar_t *aStrings[3];
+ LPCWSTR wszButtons[1];
+
+ // IDS_FATAL_ERROR_TITLE
+ // IDS_FATAL_ERROR_TEXT
+ // IDS_EXIT_GAME
+
+ switch (XGetLanguage())
+ {
+ case XC_LANGUAGE_GERMAN:
+ aStrings[0] = L"Ladefehler";
+ aStrings[1] = L"Minecraft: Xbox 360 Edition konnte nicht geladen werden und kann daher nicht fortgesetzt werden.";
+ aStrings[2] = L"Spiel verlassen";
+ break;
+ case XC_LANGUAGE_SPANISH:
+ aStrings[0] = L"Error al cargar";
+ aStrings[1] = L"Minecraft: Xbox 360 Edition ha experimentado un error al cargar y no puede continuar.";
+ aStrings[2] = L"Salir del juego";
+ break;
+ case XC_LANGUAGE_FRENCH:
+ aStrings[0] = L"Échec du chargement";
+ aStrings[1] = L"Le chargement de Minecraft: Xbox 360 Edition a échoué : impossible de continuer.";
+ aStrings[2] = L"Quitter le jeu";
+ break;
+ case XC_LANGUAGE_ITALIAN:
+ aStrings[0] = L"Errore caricamento";
+ aStrings[1] = L"Caricamento \"Minecraft: Xbox 360 Edition\" non riuscito, impossibile continuare.";
+ aStrings[2] = L"Esci dal gioco";
+ break;
+ case XC_LANGUAGE_JAPANESE:
+ aStrings[0] = L"ロード エラー";
+ aStrings[1] = L"Minecraft Xbox 360 版のロードに失敗しました。続行できません";
+ aStrings[2] = L"ゲームを終了";
+ break;
+ case XC_LANGUAGE_KOREAN:
+ aStrings[0] = L"불러오기 오류";
+ aStrings[1] = L"Minecraft: Xbox 360 Edition을 불러오는 중에 오류가 발생하여 계속할 수 없습니다.";
+ aStrings[2] = L"게임 나가기";
+ break;
+ case XC_LANGUAGE_PORTUGUESE:
+ if(XGetLocale()==XC_LOCALE_BRAZIL)
+ {
+ // Brazilian Portuguese
+ aStrings[0] = L"Erro de carregamento";
+ aStrings[1] = L"\"Minecraft: Xbox 360 Edition\" falhou ao carregar e não é possível continuar.";
+ aStrings[2] = L"Sair do Jogo";
+ }
+ else
+ {
+ aStrings[0] = L"Erro de Carregamento";
+ aStrings[1] = L"Não foi possível carregar \"Minecraft: Edição Xbox 360\" e não é possível continuar.";
+ aStrings[2] = L"Sair do Jogo";
+ }
+ break;
+ case XC_LANGUAGE_TCHINESE:
+ aStrings[0] = L"載入錯誤";
+ aStrings[1] = L"無法載入 Minecraft: Xbox 360 Edition,因此無法繼續。";
+ aStrings[2] = L"離開遊戲";
+ break;
+ default:
+ aStrings[0] = L"Loading Error";
+ aStrings[1] = L"\"Minecraft: Xbox 360 Edition\" has failed to load, and cannot continue.";
+ aStrings[2] = L"Exit Game";
+ break;
+ }
+ wszButtons[0] = aStrings[2];
+
+ MESSAGEBOX_RESULT MessageResult;
+
+ while (XShowMessageBoxUI(XUSER_INDEX_ANY, aStrings[0], aStrings[1], 1, wszButtons, 0, XMB_ALERTICON, &MessageResult, &MessageBoxOverlap) == ERROR_ACCESS_DENIED)
+ Sleep(250);
+ while (!XHasOverlappedIoCompleted(&MessageBoxOverlap))
+ {
+ RenderManager.SetClearColour(D3DCOLOR_RGBA(0,0,0,255));
+ RenderManager.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ RenderManager.Present();
+ Sleep(250);
+ }
+
+ ExitGame();
+}
+
+WCHAR *CConsoleMinecraftApp::wchExt[MAX_EXTENSION_TYPES]=
+{
+ L"png",
+ L"inf",
+ L"dat",
+};
+
+int CConsoleMinecraftApp::GetLocalTMSFileIndex(WCHAR *wchTMSFile,bool bFilenameIncludesExtension,eFileExtensionType eEXT)
+{
+ WCHAR wchTemp[ 256 ];
+ WCHAR wchInFile[ 256 ];
+
+ if(bFilenameIncludesExtension)
+ {
+ swprintf(wchInFile, 256, L"%ls",wchTMSFile);
+ }
+ else
+ {
+ swprintf(wchInFile, 256, L"%ls.%ls",wchTMSFile,wchExt[eEXT]);
+ }
+
+ for(int i=0;i<TMS_COUNT;i++)
+ {
+ swprintf(wchTemp, 256, L"%ls.%ls",TMSFileA[i].wchFilename,wchExt[TMSFileA[i].eEXT]);
+ if(wcscmp(wchTemp,wchInFile)==0)
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+int CConsoleMinecraftApp::RetrieveTMSFileListIndex(WCHAR *wchTMSFile)
+{
+ eFileExtensionType eEXT;
+ WCHAR wTemp[256];
+
+ int iIndex=0;
+ // split the file name into name and extension
+ while(wchTMSFile[iIndex]!=L'.')
+ {
+ wTemp[iIndex]=wchTMSFile[iIndex];
+ iIndex++;
+ }
+ wTemp[iIndex]=0;
+
+ for(int i=0;i<MAX_EXTENSION_TYPES;i++)
+ {
+ if(wcscmp(&wchTMSFile[iIndex+1],wchExt[i])==0)
+ {
+ eEXT=(eFileExtensionType)i;
+ }
+ }
+
+ return GetLocalTMSFileIndex(wTemp,false,eEXT);
+}
+
+int CConsoleMinecraftApp::LoadLocalTMSFile(WCHAR *wchTMSFile, eFileExtensionType eExt)
+{
+ WCHAR wcTemp[256];
+
+ wsprintfW(wcTemp,L"%s.%s",wchTMSFile,wchExt[eExt]);
+ return LoadLocalTMSFile(wcTemp);
+}
+
+int CConsoleMinecraftApp::LoadLocalTMSFile(WCHAR *wchTMSFile)
+{
+ const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string
+ WCHAR szResourceLocator[ LOCATOR_SIZE ];
+ HRESULT hr;
+ int iTMSFileIndex;
+
+ // split the file name into file and extension and find it in out tms file list
+
+ iTMSFileIndex=RetrieveTMSFileListIndex(wchTMSFile);
+
+ if(iTMSFileIndex!=-1)
+ {
+ // can we find the tms file in our xzp?
+ if(TMSFileA[iTMSFileIndex].pbData==NULL) // if we haven't already loaded it
+ {
+ swprintf(szResourceLocator, LOCATOR_SIZE, L"%ls#TMSFiles/%ls",m_wchTMSXZP, wchTMSFile);
+
+ hr = XuiResourceLoadAllNoLoc(szResourceLocator, &TMSFileA[iTMSFileIndex].pbData, &TMSFileA[iTMSFileIndex].uiSize);
+ }
+ }
+
+ return iTMSFileIndex;
+}
+
+
+void CConsoleMinecraftApp::FreeLocalTMSFiles(eTMSFileType eType)
+{
+ for(int i=0;i<TMS_COUNT;i++)
+ {
+ if((eType==eTMSFileType_All) ||(eType==TMSFileA[i].eTMSType))
+ {
+ if(TMSFileA[i].pbData!=NULL)
+ {
+ XuiFree(TMSFileA[i].pbData);
+ TMSFileA[i].pbData=NULL;
+ TMSFileA[i].uiSize=0;
+ }
+ }
+ }
+}
+
+// 4J-PB - If any new DLC items are added to the TMSFiles, this array needs updated
+TMS_FILE CConsoleMinecraftApp::TMSFileA[TMS_COUNT] =
+{
+ // skin packs
+ { L"SP1", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"SP2", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"SP3", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"SP4", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"SP5", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"SP6", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"SPF", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"SPB", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"SPC", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"SPZ", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"SPM", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"SPI", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"SPG", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+
+ //themes
+ { L"ThSt", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"ThIr", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"ThGo", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"ThDi", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+ { L"ThAw", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0},
+
+ //gamerpics
+ { L"GPAn", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPCo", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPEn", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPFo", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPTo", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPBA", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPFa", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPME", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPMF", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPMM", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPSE", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+
+ { L"GPOr", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPMi", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPMB", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPBr", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0},
+
+ { L"GPM1", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPM2", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0},
+ { L"GPM3", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0},
+
+//avatar items
+ { L"AH_0001", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AH_0002", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AH_0003", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AH_0004", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AH_0005", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AH_0006", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AH_0007", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AH_0008", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AH_0009", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AH_0010", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AH_0011", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AH_0012", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AH_0013", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+
+ { L"AT_0001", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0002", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0003", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0004", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0005", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0006", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0007", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0008", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0009", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0010", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0011", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0012", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0013", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0014", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0015", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0016", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0017", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0018", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0019", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0020", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0021", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0022", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0023", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0024", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0025", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AT_0026", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+
+ { L"AP_0001", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0002", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0003", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0004", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0005", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0006", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0007", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0009", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0010", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0011", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0012", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0013", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0014", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0015", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0016", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0017", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0018", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+
+ { L"AP_0019", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0020", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0021", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0022", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0023", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0024", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0025", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0026", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0027", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0028", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0029", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0030", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0031", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0032", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"AP_0033", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+
+ { L"AA_0001", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0 },
+
+ // Mash-up Packs
+ { L"MPMA", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"MPMA", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 1024 },
+ { L"MPSR", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"MPSR", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 1025 },
+ { L"MPHA", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"MPHA", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 1026 },
+
+ // Texture Packs
+ { L"TP01", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"TP01", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 2049 },
+ { L"TP02", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"TP02", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 2053 },
+ { L"TP04", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"TP04", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 2051 },
+ { L"TP05", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"TP05", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 2054 },
+ { L"TP06", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"TP06", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 2050 },
+ { L"TP07", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 },
+ { L"TP07", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 2055 },
+
+};
+
+#ifndef _CONTENT_PACKAGE
+WCHAR CConsoleMinecraftApp::m_wchTMSXZP[] = L"file://game:/TMSFiles.xzp";
+#else
+WCHAR CConsoleMinecraftApp::m_wchTMSXZP[] = L"file://UPDATE:/res/TMS/TMSFiles.xzp";
+#endif
+
+
+void CConsoleMinecraftApp::GetFileFromTPD(eTPDFileType eType,PBYTE pbData,DWORD dwBytes,PBYTE *ppbData,DWORD *pdwBytes )
+{
+ PBYTE pbPos=pbData;
+ // icon is the second thing in the file
+ if(pbData && dwBytes>0)
+ {
+ //First is the language
+
+ unsigned int uiDecompSize=*(unsigned int *)pbPos;
+ unsigned int uiCompSize=((unsigned int *)pbPos)[1];
+
+ if(eType==eTPDFileType_Loc)
+ {
+ *pdwBytes= uiDecompSize;
+ *ppbData = new BYTE [uiDecompSize];
+
+ Compression::getCompression()->Decompress(*ppbData,(UINT *)pdwBytes,&((unsigned int *)pbPos)[2],uiCompSize);
+ return;
+ }
+ else
+ {
+ // skip over the data
+ pbPos=(PBYTE)&((unsigned int *)pbPos)[2];
+ pbPos+=uiCompSize;
+ }
+
+ uiDecompSize=*(unsigned int *)pbPos;
+ uiCompSize=((unsigned int *)pbPos)[1];
+
+ // second is the icon
+ if(eType==eTPDFileType_Icon)
+ {
+ *pdwBytes= uiDecompSize;
+ *ppbData = new BYTE [uiDecompSize];
+
+ Compression::getCompression()->Decompress(*ppbData,(UINT *)pdwBytes,&((unsigned int *)pbPos)[2],uiCompSize);
+ return;
+ }
+ else
+ {
+ // skip over the data
+ pbPos=(PBYTE)&((unsigned int *)pbPos)[2];
+ pbPos+=uiCompSize;
+ }
+
+ uiDecompSize=*(unsigned int *)pbPos;
+ uiCompSize=((unsigned int *)pbPos)[1];
+
+ // third is the comparison
+ if(eType==eTPDFileType_Comparison)
+ {
+ *pdwBytes= uiDecompSize;
+ *ppbData = new BYTE [uiDecompSize];
+
+ Compression::getCompression()->Decompress(*ppbData,(UINT *)pdwBytes,&((unsigned int *)pbPos)[2],uiCompSize);
+ return;
+ }
+ }
+
+ return;
+}
+
+
+LPCWSTR CConsoleMinecraftApp::GetString(int iID)
+{
+ return StringTable.Lookup(iID);
+}
+
+CXuiStringTable *CConsoleMinecraftApp::GetStringTable()
+{
+ return &StringTable;
+}