Files
MinecraftConsoles/Minecraft.Client/Xbox/Xbox_App.cpp

3035 lines
92 KiB
C++
Raw Permalink Normal View History

2026-03-01 12:16:08 +08:00
#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
// todo: re-enable if we fix this menu, for now its just blank!
if(false && (eScene==eUIScene_LoadOrJoinMenu) && (bSeenUpdateTextThisSession==false) && ( app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplayUpdateMessage)!=0))
2026-03-01 12:16:08 +08:00
{
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;
}