3034 lines
92 KiB
C++
3034 lines
92 KiB
C++
#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;
|
||
}
|