the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 3033 lines 94 kB view raw
1#include "stdafx.h" 2 3#include "..\Common\UI\UIStructs.h" 4 5#include "..\Common\XUI\XUI_Intro.h" 6#include "..\Common\XUI\XUI_MainMenu.h" 7#include "..\Common\XUI\XUI_NewUpdateMessage.h" 8#include "..\Common\XUI\XUI_HelpAndOptions.h" 9#include "..\Common\XUI\XUI_TextEntry.h" 10#include "..\Common\XUI\XUI_HelpHowToPlay.h" 11#include "..\Common\XUI\XUI_HowToPlayMenu.h" 12#include "..\Common\XUI\XUI_HelpControls.h" 13#include "..\Common\XUI\XUI_TextEntry.h" 14#include "..\Common\XUI\XUI_LoadSettings.h" 15#include "..\Common\XUI\XUI_SettingsAll.h" 16#include "..\Common\XUI\XUI_SettingsOptions.h" 17#include "..\Common\XUI\XUI_SettingsAudio.h" 18#include "..\Common\XUI\XUI_SettingsControl.h" 19#include "..\Common\XUI\XUI_SettingsGraphics.h" 20#include "..\Common\XUI\XUI_SettingsUI.h" 21#include "..\Common\XUI\XUI_Leaderboards.h" 22#include "..\Common\XUI\XUI_Debug.h" 23#include "..\Common\XUI\XUI_DebugTips.h" 24#include "..\Common\XUI\XUI_Reinstall.h" 25#include "..\Common\XUI\XUI_Death.h" 26#include "..\Common\XUI\XUI_DebugOverlay.h" 27#include "..\Common\XUI\XUI_DLCOffers.h" 28#include "..\Common\XUI\XUI_SocialPost.h" 29#include "..\Common\XUI\XUI_Scene_Container.h" 30#include "..\Common\XUI\XUI_Scene_Furnace.h" 31#include "..\Common\XUI\XUI_Scene_Inventory.h" 32#include "..\Common\XUI\XUI_Scene_Trap.h" 33#include "..\Common\XUI\XUI_Control_ComboBox.h" 34#include "..\Common\XUI\XUI_MultiGameInfo.h" 35#include "..\Common\XUI\XUI_MultiGameJoinLoad.h" 36#include "..\Common\XUI\XUI_MultiGameCreate.h" 37#include "..\Common\XUI\XUI_MultiGameLaunchMoreOptions.h" 38#include "..\Common\XUI\XUI_SignEntry.h" 39#include "..\Common\XUI\XUI_InGameInfo.h" 40#include "..\Common\XUI\XUI_TrialExitUpsell.h" 41#include "..\Common\XUI\XUI_BasePlayer.h" 42#include "..\Common\XUI\XUI_PartnernetPassword.h" 43#include "..\Common\XUI\XUI_SaveMessage.h" 44#include "..\Common\XUI\XUI_Chat.h" 45#include "..\Common\XUI\XUI_SkinSelect.h" 46#include "..\Common\XUI\XUI_InGameHostOptions.h" 47#include "..\Common\XUI\XUI_InGamePlayerOptions.h" 48#include "..\Common\XUI\XUI_Scene_Enchant.h" 49#include "..\Common\XUI\XUI_Scene_BrewingStand.h" 50#include "..\Common\XUI\XUI_XZP_Icons.h" 51#include "..\Common\XUI\XUI_Controls.h" 52#include "..\Common\XUI\XUI_Scene_Win.h" 53#include "..\Common\XUI\XUI_HUD.h" 54#include "..\Common\XUI\XUI_DebugSetCamera.h" 55//#include "..\Common\XUI\XUI_TransferToXboxOne.h" 56 57#ifdef _DEBUG_MENUS_ENABLED 58#include "..\Common\XUI\XUI_DebugItemEditor.h" 59#endif 60#ifndef _CONTENT_PACKAGE 61#include "..\Common\XUI\XUI_DebugSchematicCreator.h" 62#endif 63 64#include "..\..\Minecraft.World\Recipy.h" 65#include "GameConfig\Minecraft.spa.h" 66#include "..\..\Minecraft.Client\Options.h" 67#include "..\..\Minecraft.World\AABB.h" 68#include "..\..\Minecraft.World\Vec3.h" 69#include "..\MinecraftServer.h" 70#include "..\GameRenderer.h" 71#include "..\ProgressRenderer.h" 72#include "..\..\Minecraft.Client\LevelRenderer.h" 73#include "..\..\Minecraft.Client\MobSkinMemTextureProcessor.h" 74 75#include "..\..\Minecraft.Client\Minecraft.h" 76 77#include "..\ClientConnection.h" 78#include "..\MultiPlayerLocalPlayer.h" 79#include "..\..\Minecraft.Client\LocalPlayer.h" 80#include "..\..\Minecraft.World\Player.h" 81#include "..\..\Minecraft.World\Inventory.h" 82#include "..\..\Minecraft.World\Level.h" 83#include "..\..\Minecraft.World\FurnaceTileEntity.h" 84#include "..\..\Minecraft.World\Container.h" 85#include "..\..\Minecraft.World\DispenserTileEntity.h" 86#include "..\..\Minecraft.World\SignTileEntity.h" 87#include "..\..\Minecraft.Client\StatsCounter.h" 88#include "..\GameMode.h" 89#include "Social\SocialManager.h" 90#include <xgraphics.h> 91#include "..\Common\Tutorial\TutorialMode.h" 92#include "..\..\Minecraft.Client\Xbox\XML\ATGXmlParser.h" 93#include "..\..\Minecraft.Client\Xbox\XML\xmlFilesCallback.h" 94#include "4JLibs\inc\4J_Input.h" 95#include "Font\XUI_FontRenderer.h" 96#include "..\Common\Minecraft_Macros.h" 97#include "..\..\Minecraft.Client\PlayerList.h" 98#include "..\..\Minecraft.Client\ServerPlayer.h" 99#include "..\Common\GameRules\ConsoleGameRules.h" 100#include "..\Common\GameRules\ConsoleSchematicFile.h" 101#include "..\..\Minecraft.World\InputOutputStream.h" 102#include "..\..\Minecraft.World\LevelSettings.h" 103#include "..\User.h" 104 105#include "Sentient\SentientManager.h" 106#include "..\..\Minecraft.World\LevelData.h" 107#include "..\..\Minecraft.World\net.minecraft.world.entity.player.h" 108#include "..\..\Minecraft.Client\EntityRenderDispatcher.h" 109#include "..\..\Minecraft.World\compression.h" 110#include "..\TexturePackRepository.h" 111#include "..\TexturePack.h" 112#include "..\Common\DLC\DLCAudioFile.h" 113#include "..\DLCTexturePack.h" 114 115#include "..\Common\XUI\XUI_Intro.h" 116#include "..\Common\XUI\XUI_MainMenu.h" 117#include "..\Common\XUI\XUI_NewUpdateMessage.h" 118#include "..\Common\XUI\XUI_HelpAndOptions.h" 119#include "..\Common\XUI\XUI_TextEntry.h" 120#include "..\Common\XUI\XUI_HelpHowToPlay.h" 121#include "..\Common\XUI\XUI_HowToPlayMenu.h" 122#include "..\Common\XUI\XUI_HelpControls.h" 123#include "..\Common\XUI\XUI_TextEntry.h" 124#include "..\Common\XUI\XUI_LoadSettings.h" 125#include "..\Common\XUI\XUI_SettingsAll.h" 126#include "..\Common\XUI\XUI_SettingsOptions.h" 127#include "..\Common\XUI\XUI_SettingsAudio.h" 128#include "..\Common\XUI\XUI_SettingsControl.h" 129#include "..\Common\XUI\XUI_SettingsGraphics.h" 130#include "..\Common\XUI\XUI_SettingsUI.h" 131#include "..\Common\XUI\XUI_Leaderboards.h" 132#include "..\Common\XUI\XUI_Debug.h" 133#include "..\Common\XUI\XUI_DebugTips.h" 134#include "..\Common\XUI\XUI_Reinstall.h" 135#include "..\Common\XUI\XUI_Death.h" 136#include "..\Common\XUI\XUI_DebugOverlay.h" 137#include "..\Common\XUI\XUI_DLCOffers.h" 138#include "..\Common\XUI\XUI_SocialPost.h" 139#include "..\Common\XUI\XUI_Scene_Container.h" 140#include "..\Common\XUI\XUI_Scene_Furnace.h" 141#include "..\Common\XUI\XUI_Scene_Inventory.h" 142#include "..\Common\XUI\XUI_Scene_Trap.h" 143#include "..\Common\XUI\XUI_Control_ComboBox.h" 144#include "..\Common\XUI\XUI_MultiGameInfo.h" 145#include "..\Common\XUI\XUI_MultiGameJoinLoad.h" 146#include "..\Common\XUI\XUI_MultiGameCreate.h" 147#include "..\Common\XUI\XUI_MultiGameLaunchMoreOptions.h" 148#include "..\Common\XUI\XUI_SignEntry.h" 149#include "..\Common\XUI\XUI_InGameInfo.h" 150#include "..\Common\XUI\XUI_TrialExitUpsell.h" 151#include "..\Common\XUI\XUI_BasePlayer.h" 152#include "..\Common\XUI\XUI_PartnernetPassword.h" 153#include "..\Common\XUI\XUI_SaveMessage.h" 154#include "..\Common\XUI\XUI_Chat.h" 155#include "..\Common\XUI\XUI_SkinSelect.h" 156#include "..\Common\XUI\XUI_InGameHostOptions.h" 157#include "..\Common\XUI\XUI_InGamePlayerOptions.h" 158#include "..\Common\XUI\XUI_Scene_Enchant.h" 159#include "..\Common\XUI\XUI_Scene_BrewingStand.h" 160#include "..\Common\XUI\XUI_XZP_Icons.h" 161#include "..\Common\XUI\XUI_Controls.h" 162#include "..\Common\XUI\XUI_Scene_Win.h" 163#include "..\Common\XUI\XUI_HUD.h" 164#include "..\Common\XUI\XUI_Scene_Anvil.h" 165#include "..\Common\XUI\XUI_Scene_Trading.h" 166#include "..\Common\XUI\XUI_Teleport.h" 167 168#ifdef _DEBUG_MENUS_ENABLED 169#include "..\Common\XUI\XUI_DebugItemEditor.h" 170#endif 171#ifndef _CONTENT_PACKAGE 172#include "..\Common\XUI\XUI_DebugSchematicCreator.h" 173#endif 174 175#include "Xbox_App.h" 176 177CConsoleMinecraftApp app; 178 179LPCWSTR apwstrLocale[10] = 180{ 181 L"", // the default locale 182 L"", // English 183 L"ja-JP", // Japanese 184 L"de-DE", // German 185 L"fr-FR", // French 186 L"es-ES", // Spanish 187 L"it-IT", // Italian 188 L"ko-KR", // Korean 189 L"zh-CHT",// Traditional Chinese 190 L"pt-PT" // Portuguese 191}; 192 193WCHAR *CConsoleMinecraftApp::wchTypefaceA[]= 194{ 195 L"Mojangles", 196 L"SDBookM", 197 L"DFGMaruGothic-Md", 198 L"DFHeiMedium-B5", 199}; 200 201WCHAR *CConsoleMinecraftApp::wchTypefaceLocatorA[]= 202{ 203 L"media/font/Mojangles.ttf", 204 L"media/font/KOR/BOKMSD.ttf", 205 L"media/font/JPN/DFGMaruGothic-Md.ttf", 206 L"media/font/CHT/DFHeiMedium-B5.ttf", 207}; 208 209WCHAR *CConsoleMinecraftApp::wchSceneA[]= 210{ 211 L"xuiscene_partnernetpassword", 212 L"xuiscene_intro", 213 L"xuiscene_savemessage", 214 L"xuiscene_main", 215 L"xuiscene_fullscreenprogress", 216 L"xuiscene_pause", 217 L"xuiscene_craftingpanel_2x2", 218 L"xuiscene_craftingpanel_3x3", 219 L"xuiscene_furnace", 220 L"xuiscene_container", 221 L"xuiscene_container_large", 222 L"xuiscene_inventory", 223 L"xuiscene_trap", 224 L"xuiscene_debug", 225 L"xuiScene_DebugTips", 226 L"xuiscene_helpandoptions", 227 L"xuiscene_howtoplay", 228 L"xuiscene_howtoplay_menu", 229 L"xuiscene_controls", 230 L"xuiscene_settings_options", 231 L"xuiscene_settings_audio", 232 L"xuiscene_settings_control", 233 L"xuiscene_settings_graphics", 234 L"xuiscene_settings_UI", 235 L"xuiscene_settings_all", 236 L"xuiscene_leaderboards", 237 L"xuiscene_credits", 238 L"xuiscene_death", 239 L"xuiscene_tutorialpopup", 240 L"xuiscene_multi_create", 241 L"xuiscene_multi_joinload", 242 L"xuiscene_multi_gameinfo", 243 L"xuiscene_signentry", 244 L"xuiscene_ingameinfo", 245 L"xuiscene_connectingprogress", 246 L"xuiscene_DLCOffers", 247 L"xuiscene_socialpost", 248 L"xuiscene_trialexitupsell", 249 L"xuiscene_load_settings", 250 L"xuiscene_chat", 251 L"xuiscene_reinstall", 252 L"xuiscene_skinselect", 253 L"xuiscene_text_entry", 254 L"xuiscene_ingame_host_options", 255 L"xuiscene_ingame_player_options", 256 L"xuiscene_inventory_creative", 257 L"xuiscene_multi_launch_more_options", 258 259 L"xuiscene_DLCMain", 260 L"xuiscene_NewUpdateMessage", 261 L"xuiscene_enchant", 262 L"xuiscene_brewingstand", 263 L"xuiscene_win", 264 L"xuiscene_hud", 265 L"xuiscene_trading", 266 L"xuiscene_anvil", 267 L"xuiscene_teleportmenu", 268// L"xuiscene_TransferToXboxOne", 269 270#ifdef _DEBUG_MENUS_ENABLED 271 L"xuiscene_debugoverlay", 272 L"xuiscene_debug_item_editor", 273#endif 274#ifndef _CONTENT_PACKAGE 275 L"xuiscene_debug_schematic_create", 276 L"xuiscene_debug_set_camera", 277#endif 278}; 279 280CConsoleMinecraftApp::CConsoleMinecraftApp() : CMinecraftApp() 281{ 282 ZeroMemory(m_PreviewBuffer,sizeof(XSOCIAL_PREVIEWIMAGE)*XUSER_MAX_COUNT); 283 m_bTMSPP_GlobalFileListRead=false; 284 m_bRead_TMS_XUIDS_XML=false; 285 m_bRead_TMS_Config_XML=false; 286 m_bRead_TMS_DLCINFO_XML=false; 287 m_pXuidsFileBuffer=NULL; 288 m_dwXuidsFileSize=0; 289 ZeroMemory(m_ScreenshotBuffer,sizeof(LPD3DXBUFFER)*XUSER_MAX_COUNT); 290 m_ThumbnailBuffer=NULL; 291#ifdef _DEBUG_MENUS_ENABLED 292 debugOverlayCreated = false; 293#endif 294 295 for(int i=0;i<XUSER_MAX_COUNT;i++) 296 { 297 m_iCountDown[i]=0; 298 m_bMenuToBeClosed[i]=false; 299 m_bMenuDisplayed[i]=false; 300 m_bPauseMenuDisplayed[i] = false; 301 m_bContainerMenuDisplayed[i]=false; 302 m_bIgnoreAutosaveMenuDisplayed[i]=false; 303 m_bIgnorePlayerJoinMenuDisplayed[i]=false; 304 m_hCurrentScene[i]=NULL; 305 m_hFirstScene[i]=NULL; 306 } 307 308 m_titleDeploymentType = XTITLE_DEPLOYMENT_DOWNLOAD; 309 DWORD dwResult = XTitleGetDeploymentType(&m_titleDeploymentType, NULL); 310 if( dwResult == ERROR_SUCCESS ) 311 { 312 switch( m_titleDeploymentType ) 313 { 314 case XTITLE_DEPLOYMENT_OPTICAL_DISC: 315 DebugPrintf("Deployment type is: Disc\n"); 316 // Disc-based title. 317 break; 318 case XTITLE_DEPLOYMENT_INSTALLED_TO_HDD: 319 DebugPrintf("Deployment type is: Installed to HDD\n"); 320 // Disc-based title has been installed to the hard drive. 321 break; 322 case XTITLE_DEPLOYMENT_DOWNLOAD: 323 DebugPrintf("Deployment type is: Download\n"); 324 // Title is deployed as a downloadable title. 325 break; 326 case XTITLE_DEPLOYMENT_OTHER: 327 // Drop through. 328 default: 329 DebugPrintf("Deployment type is: Other/Default\n"); 330 // Unknown deployment type. 331 } 332 } 333 334} 335 336void CConsoleMinecraftApp::SetRichPresenceContext(int iPad, int contextId) 337{ 338 ProfileManager.SetRichPresenceContextValue(iPad,CONTEXT_GAME_STATE,contextId); 339} 340 341 342//-------------------------------------------------------------------------------------- 343// Name: RegisterXuiClasses() 344// Desc: Registers all the scene classes. 345//-------------------------------------------------------------------------------------- 346HRESULT CConsoleMinecraftApp::RegisterXuiClasses() 347{ 348 // Register any other classes necessary for the app/scene 349 HRESULT hr; 350 351#ifdef _CONTENT_PACKAGE 352#ifndef _FINAL_BUILD 353 hr= CScene_PartnernetPassword::Register(); 354 if( FAILED( hr ) ) return hr; 355#endif 356#endif 357 358 hr = CXuiSceneInventoryCreative::Register(); 359 if( FAILED( hr ) ) return hr; 360 361 hr = CScene_NewUpdateMessage::Register(); 362 if( FAILED( hr ) ) return hr; 363 364#ifdef _DEBUG_MENUS_ENABLED 365 hr = CScene_DebugItemEditor::Register(); 366 if( FAILED( hr ) ) return hr; 367 hr = CScene_DebugTips::Register(); 368 if( FAILED( hr ) ) return hr; 369 hr = CScene_DebugOverlay::Register(); 370 if( FAILED( hr ) ) return hr; 371#endif 372#ifndef _CONTENT_PACKAGE 373 hr = CScene_DebugSchematicCreator::Register(); 374 if( FAILED( hr ) ) return hr; 375 hr = CScene_DebugSetCamera::Register(); 376 if( FAILED( hr) ) return hr; 377#endif 378 379 hr = CScene_Reinstall::Register(); 380 if( FAILED( hr ) ) return hr; 381 hr = CScene_SaveMessage::Register(); 382 if( FAILED( hr ) ) return hr; 383 hr = CScene_Intro::Register(); 384 if( FAILED( hr ) ) return hr; 385 hr = CScene_Main::Register(); 386 if( FAILED( hr ) ) return hr; 387 hr = CScene_Debug::Register(); 388 if( FAILED( hr ) ) return hr; 389 hr = CScene_HelpAndOptions::Register(); 390 if( FAILED( hr ) ) return hr; 391 hr = CScene_HowToPlay::Register(); 392 if( FAILED( hr ) ) return hr; 393 hr = CScene_HowToPlayMenu::Register(); 394 if( FAILED( hr ) ) return hr; 395 hr = CScene_Controls::Register(); 396 if( FAILED( hr ) ) return hr; 397 398 // Settings scenes 399 hr = CScene_SettingsAll::Register(); 400 if( FAILED( hr ) ) return hr; 401 hr = CScene_SettingsOptions::Register(); 402 if( FAILED( hr ) ) return hr; 403 hr = CScene_SettingsAudio::Register(); 404 if( FAILED( hr ) ) return hr; 405 hr = CScene_SettingsControl::Register(); 406 if( FAILED( hr ) ) return hr; 407 hr = CScene_SettingsGraphics::Register(); 408 if( FAILED( hr ) ) return hr; 409 hr = CScene_SettingsUI::Register(); 410 if( FAILED( hr ) ) return hr; 411 412 hr = CScene_Leaderboards::Register(); 413 if( FAILED( hr ) ) return hr; 414 hr = CScene_Credits::Register(); 415 if( FAILED( hr ) ) return hr; 416 hr = UIScene_PauseMenu::Register(); 417 if( FAILED( hr ) ) return hr; 418 hr = CXuiSceneCraftingPanel::Register(); 419 if( FAILED( hr ) ) return hr; 420 hr = CXuiSceneBase::Register(); 421 if( FAILED( hr ) ) return hr; 422 hr = CXuiCtrlBurnProgress::Register(); 423 if( FAILED( hr ) ) return hr; 424 hr = CXuiCtrlFireProgress::Register(); 425 if( FAILED( hr ) ) return hr; 426 hr = CXuiCtrlSlotItem::Register(); 427 if( FAILED( hr ) ) return hr; 428 hr = CXuiCtrlSlotList::Register(); 429 if( FAILED( hr ) ) return hr; 430 hr = CXuiCtrlSlotItemListItem::Register(); 431 if( FAILED( hr ) ) return hr; 432 hr = CXuiSceneContainer::Register(); 433 if( FAILED( hr ) ) return hr; 434 hr = CXuiSceneFurnace::Register(); 435 if( FAILED( hr ) ) return hr; 436 hr = CXuiSceneInventory::Register(); 437 if( FAILED( hr ) ) return hr; 438 hr = CXuiSceneTrap::Register(); 439 if( FAILED( hr ) ) return hr; 440 hr = CXuiCtrl4JEdit::Register(); 441 if( FAILED( hr ) ) return hr; 442 hr = CScene_FullscreenProgress::Register(); 443 if( FAILED( hr ) ) return hr; 444 hr = CXuiCtrlLoadingProgress::Register(); 445 if( FAILED( hr ) ) return hr; 446 hr = CXuiCtrlMinecraftSlot::Register(); 447 if( FAILED( hr ) ) return hr; 448 hr = CXuiCtrlMinecraftPlayer::Register(); 449 if( FAILED( hr ) ) return hr; 450 hr = CScene_Death::Register(); 451 if( FAILED( hr ) ) return hr; 452 hr = CScene_TutorialPopup::Register(); 453 if( FAILED( hr ) ) return hr; 454 hr = CXuiCtrl4JList::Register(); 455 if( FAILED( hr ) ) return hr; 456 hr = CXuiCtrlCraftIngredientSlot::Register(); 457 if( FAILED( hr ) ) return hr; 458 hr = CXuiCtrlSliderWrapper::Register(); 459 if( FAILED( hr ) ) return hr; 460 hr = CXuiCtrlPassThroughList::Register(); 461 if( FAILED( hr ) ) return hr; 462 hr = CScene_MultiGameCreate::Register(); 463 if( FAILED( hr ) ) return hr; 464 hr = CScene_MultiGameLaunchMoreOptions::Register(); 465 if( FAILED( hr ) ) return hr; 466 hr = CScene_MultiGameJoinLoad::Register(); 467 if( FAILED( hr ) ) return hr; 468 hr = CScene_MultiGameInfo::Register(); 469 if( FAILED( hr ) ) return hr; 470 hr = CScene_SignEntry::Register(); 471 if( FAILED( hr ) ) return hr; 472 hr = CScene_InGameInfo::Register(); 473 if( FAILED( hr ) ) return hr; 474 hr = CScene_ConnectingProgress::Register(); 475 if( FAILED( hr ) ) return hr; 476 hr = CXuiSceneBasePlayer::Register(); 477 if( FAILED( hr ) ) return hr; 478 hr = CScene_DLCOffers::Register(); 479 if( FAILED( hr ) ) return hr; 480 hr = CScene_SocialPost::Register(); 481 if( FAILED( hr ) ) return hr; 482 hr = CScene_TrialExitUpsell::Register(); 483 if( FAILED( hr ) ) return hr; 484 hr = CScene_LoadGameSettings::Register(); 485 if( FAILED( hr ) ) return hr; 486 hr = CScene_Chat::Register(); 487 if( FAILED( hr ) ) return hr; 488 hr = CXuiCtrlSplashPulser::Register(); 489 if( FAILED( hr ) ) return hr; 490 hr = CScene_SkinSelect::Register(); 491 if( FAILED( hr ) ) return hr; 492 hr = CXuiCtrlMinecraftSkinPreview::Register(); 493 if( FAILED( hr ) ) return hr; 494 hr = CScene_TextEntry::Register(); 495 if( FAILED( hr ) ) return hr; 496 hr = CScene_InGameHostOptions::Register(); 497 if( FAILED( hr ) ) return hr; 498 hr = CScene_InGamePlayerOptions::Register(); 499 if( FAILED( hr ) ) return hr; 500 hr = CScene_DLCMain::Register(); 501 if( FAILED( hr) ) return hr; 502 hr = CXuiSceneEnchant::Register(); 503 if( FAILED( hr) ) return hr; 504 hr = CXuiCtrlEnchantmentBook::Register(); 505 if( FAILED( hr) ) return hr; 506 hr = CXuiCtrlEnchantmentButton::Register(); 507 if( FAILED( hr) ) return hr; 508 hr = CXuiSceneBrewingStand::Register(); 509 if( FAILED( hr) ) return hr; 510 hr = CXuiCtrlBrewProgress::Register(); 511 if( FAILED( hr) ) return hr; 512 hr = CXuiCtrlBubblesProgress::Register(); 513 if( FAILED( hr) ) return hr; 514 hr = CXuiCtrlEnchantmentButtonText::Register(); 515 if( FAILED( hr) ) return hr; 516 hr = CXuiCtrlMobEffect::Register(); 517 if( FAILED( hr) ) return hr; 518 hr = CScene_Win::Register(); 519 if( FAILED( hr) ) return hr; 520 hr = CXuiSceneHud::Register(); 521 if( FAILED( hr) ) return hr; 522 hr = CXuiSceneAnvil::Register(); 523 if( FAILED( hr) ) return hr; 524 hr = CXuiSceneTrading::Register(); 525 if( FAILED( hr) ) return hr; 526 hr = CScene_Teleport::Register(); 527 if( FAILED( hr) ) return hr; 528 529 530 hr = CXuiCtrl4JIcon::Register(); 531 if( FAILED( hr ) ) return hr; 532 hr = XuiHtmlRegister(); 533 if( FAILED( hr ) ) return hr; 534 535// hr = CScene_TransferToXboxOne::Register(); 536 if( FAILED( hr ) ) return hr; 537 538 539 return S_OK; 540} 541 542 543//-------------------------------------------------------------------------------------- 544// Name: UnregisterXuiClasses() 545// Desc: Unregisters all the scene classes. 546//-------------------------------------------------------------------------------------- 547HRESULT CConsoleMinecraftApp::UnregisterXuiClasses() 548{ 549 XuiHtmlUnregister(); 550 551 CScene_TextEntry::Unregister(); 552 553#ifndef _CONTENT_PACKAGE 554 CScene_DebugSchematicCreator::Unregister(); 555 CScene_DebugSetCamera::Unregister(); 556#endif 557#ifdef _DEBUG_MENUS_ENABLED 558 CScene_DebugItemEditor::Unregister(); 559 CScene_DebugTips::Unregister(); 560 CScene_DebugOverlay::Unregister(); 561#endif 562 CScene_Teleport::Unregister(); 563 CXuiSceneTrading::Unregister(); 564 CXuiSceneAnvil::Unregister(); 565// CScene_TransferToXboxOne::Unregister(); 566 CXuiSceneHud::Unregister(); 567 CScene_Win::Unregister(); 568 CXuiCtrlMobEffect::Unregister(); 569 CXuiCtrlEnchantmentButtonText::Unregister(); 570 CXuiCtrlBubblesProgress::Unregister(); 571 CXuiCtrlBrewProgress::Unregister(); 572 CXuiSceneBrewingStand::Unregister(); 573 CXuiCtrlEnchantmentButton::Unregister(); 574 CXuiCtrlEnchantmentBook::Unregister(); 575 CXuiSceneEnchant::Unregister(); 576 CScene_InGamePlayerOptions::Unregister(); 577 CScene_InGameHostOptions::Unregister(); 578 CXuiCtrl4JIcon::Unregister(); 579 CXuiCtrlMinecraftSkinPreview::Unregister(); 580 CScene_SkinSelect::Unregister(); 581 CXuiCtrlSplashPulser::Unregister(); 582 CScene_Chat::Unregister(); 583 CScene_LoadGameSettings::Unregister(); 584 CScene_TrialExitUpsell::Unregister(); 585 CScene_SocialPost::Unregister(); 586 CScene_DLCOffers::Unregister(); 587 CXuiSceneBasePlayer::Unregister(); 588 CScene_ConnectingProgress::Unregister(); 589 CScene_InGameInfo::Unregister(); 590 CScene_SignEntry::Unregister(); 591 CScene_MultiGameInfo::Unregister(); 592 CScene_MultiGameJoinLoad::Unregister(); 593 CScene_MultiGameLaunchMoreOptions::Unregister(); 594 CScene_MultiGameCreate::Unregister(); 595 CXuiCtrlPassThroughList::Unregister(); 596 CXuiCtrlSliderWrapper::Unregister(); 597 CXuiCtrlCraftIngredientSlot::Unregister(); 598 CXuiCtrl4JList::Unregister(); 599 CScene_TutorialPopup::Unregister(); 600 CScene_Death::Unregister(); 601 CXuiCtrlMinecraftPlayer::Unregister(); 602 CXuiCtrlMinecraftSlot::Unregister(); 603 CXuiCtrlLoadingProgress::Unregister(); 604 CScene_FullscreenProgress::Unregister(); 605 CXuiCtrl4JEdit::Unregister(); 606 CXuiCtrlBurnProgress::Unregister(); 607 CXuiCtrlFireProgress::Unregister(); 608 CXuiCtrlSlotItem::Unregister(); 609 CXuiCtrlSlotList::Unregister(); 610 CXuiCtrlSlotItemListItem::Unregister(); 611 CXuiSceneContainer::Unregister(); 612 CXuiSceneFurnace::Unregister(); 613 CXuiSceneInventory::Unregister(); 614 CXuiSceneTrap::Unregister(); 615 CXuiSceneBase::Unregister(); 616 CXuiSceneCraftingPanel::Unregister(); 617 UIScene_PauseMenu::Unregister(); 618 CScene_Credits::Unregister(); 619 CScene_Leaderboards::Unregister(); 620 CScene_Controls::Unregister(); 621 CScene_HowToPlay::Unregister(); 622 CScene_HowToPlayMenu::Unregister(); 623 CScene_HelpAndOptions::Unregister(); 624 CScene_Main::Unregister(); 625 CScene_Debug::Unregister(); 626 CScene_Intro::Unregister(); 627 CScene_SaveMessage::Unregister(); 628 CScene_Reinstall::Unregister(); 629 CScene_DLCMain::Unregister(); 630 631 CScene_SettingsAll::Unregister(); 632 CScene_SettingsOptions::Unregister(); 633 CScene_SettingsAudio::Unregister(); 634 CScene_SettingsControl::Unregister(); 635 CScene_SettingsGraphics::Unregister(); 636 CScene_SettingsUI::Unregister(); 637 638 CScene_NewUpdateMessage::Unregister(); 639 640#ifdef _CONTENT_PACKAGE 641#ifndef _FINAL_BUILD 642 CScene_PartnernetPassword::Unregister(); 643#endif 644#endif 645 646 return S_OK; 647} 648 649 650 651void CConsoleMinecraftApp::GetPreviewImage(int iPad,XSOCIAL_PREVIEWIMAGE *preview) 652{ 653 preview->Pitch = m_PreviewBuffer[iPad].Pitch; 654 preview->Width = m_PreviewBuffer[iPad].Width; 655 preview->Height = m_PreviewBuffer[iPad].Height; 656 preview->Format = m_PreviewBuffer[iPad].Format; 657 unsigned int sizeBytes = XGAddress2DTiledExtent(m_PreviewBuffer[iPad].Width, m_PreviewBuffer[iPad].Height, 4) * 4; 658 preview->pBytes = (BYTE *)XPhysicalAlloc(sizeBytes, MAXULONG_PTR, 0, PAGE_READWRITE | PAGE_WRITECOMBINE ); 659 memcpy( (void *)preview->pBytes, (void *)m_PreviewBuffer[iPad].pBytes, sizeBytes ); 660 XPhysicalFree((LPVOID)m_PreviewBuffer[iPad].pBytes); 661 m_PreviewBuffer[iPad].pBytes = NULL; 662} 663 664void CConsoleMinecraftApp::CaptureScreenshot(int iPad) 665{ 666 RenderManager.CaptureScreen(&m_ScreenshotBuffer[iPad], &m_PreviewBuffer[iPad]); 667} 668 669 670HRESULT CConsoleMinecraftApp::LoadXuiResources() 671{ 672 m_fontRenderer = new XUI_FontRenderer(); 673 674 OverrideFontRenderer(true); 675 676 const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string 677 WCHAR szResourceLocator[ LOCATOR_SIZE ]; 678 HRESULT hr; 679 680 // load from the .xzp file 681 const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); 682 683 684 //#ifdef _CONTENT_PACKAGE 685 // Get the current language setting from the console 686 DWORD dwLanguage = XGetLanguage( ); 687 688// if( dwLanguage>=sizeof( apwstrLocale )/sizeof( apwstrLocale[0] ) ) 689// { 690// // Use default locale if out of bounds 691// dwLanguage = 0; 692// } 693 // force default to English for now 694 //dwLanguage=1; 695 // Tell XUI what the locale is 696 697 // 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 698 699 switch(dwLanguage) 700 { 701 702 case XC_LANGUAGE_KOREAN: 703 //fallback to Japanese, Chinese 704 RegisterFont(eFont_Chinese,eFont_None); 705 RegisterFont(eFont_Japanese,eFont_Chinese); 706 RegisterFont(eFont_Korean,eFont_Japanese,true); 707 XuiSetLocale( L"ko-KR" ); 708 break; 709 case XC_LANGUAGE_JAPANESE: 710 //fallback to Korean, Chinese 711 RegisterFont(eFont_Chinese,eFont_None); 712 RegisterFont(eFont_Korean,eFont_Chinese); 713 RegisterFont(eFont_Japanese,eFont_Korean,true); 714 XuiSetLocale( L"ja-JP" ); 715 break; 716 case XC_LANGUAGE_TCHINESE: 717 //fallback to Korean, Japanese 718 RegisterFont(eFont_Japanese,eFont_None); 719 RegisterFont(eFont_Korean,eFont_Japanese); 720 RegisterFont(eFont_Chinese,eFont_Korean,true); 721 XuiSetLocale( L"zh-CHT" ); 722 break; 723 724 725 default: 726 //fallback to Korean,Japanese, Chinese 727 RegisterFont(eFont_Chinese,eFont_None); 728 RegisterFont(eFont_Japanese,eFont_Chinese); 729 RegisterFont(eFont_Korean,eFont_Japanese); 730 RegisterFont(eFont_European,eFont_Korean,true); 731 732 // some locales can override the language setting 733 bool bOverrideLanguage=true; 734 735 // 4J-PB - removing all the new languages until a future TU 736 737 switch(XGetLocale()) 738 { 739#ifdef NEW_LANGUAGES 740 case XC_LOCALE_CZECH_REPUBLIC: 741 XuiSetLocale( L"cs-CZ" ); 742 break; 743 case XC_LOCALE_DENMARK: 744 XuiSetLocale( L"da-DK" ); 745 break; 746 case XC_LOCALE_FINLAND: 747 XuiSetLocale( L"fi-FI" ); 748 break; 749 case XC_LOCALE_GREECE: 750 XuiSetLocale( L"el-GR" ); 751 break; 752 case XC_LOCALE_SLOVAK_REPUBLIC: 753 XuiSetLocale( L"sk-SK" ); 754 break; 755#endif 756 default: 757 bOverrideLanguage=false; 758 break; 759 } 760 761 if(bOverrideLanguage==false) 762 { 763 switch(dwLanguage) 764 { 765 case XC_LANGUAGE_ENGLISH: 766 switch(XGetLocale()) 767 { 768#ifdef NEW_LANGUAGES 769 case XC_LOCALE_AUSTRALIA: 770 case XC_LOCALE_CANADA: 771 case XC_LOCALE_CZECH_REPUBLIC: 772 case XC_LOCALE_GREECE: 773 case XC_LOCALE_HONG_KONG: 774 case XC_LOCALE_HUNGARY: 775 case XC_LOCALE_INDIA: 776 case XC_LOCALE_IRELAND: 777 case XC_LOCALE_ISRAEL: 778 case XC_LOCALE_NEW_ZEALAND: 779 case XC_LOCALE_SAUDI_ARABIA: 780 case XC_LOCALE_SINGAPORE: 781 case XC_LOCALE_SLOVAK_REPUBLIC: 782 case XC_LOCALE_SOUTH_AFRICA: 783 case XC_LOCALE_UNITED_ARAB_EMIRATES: 784 case XC_LOCALE_GREAT_BRITAIN: 785 XuiSetLocale( L"en-GB" ); 786 break; 787#endif 788 default: 789 XuiSetLocale( L"" ); 790 break; 791 } 792 break; 793 case XC_LANGUAGE_PORTUGUESE: 794 if(XGetLocale()==XC_LOCALE_BRAZIL) 795 { 796 // Brazilian Portuguese 797 XuiSetLocale( L"pt-BR" ); 798 } 799 else 800 { 801 XuiSetLocale( L"pt-PT" ); 802 } 803 break; 804 case XC_LANGUAGE_GERMAN: 805 XuiSetLocale( L"de-DE" ); 806 break; 807 case XC_LANGUAGE_FRENCH: 808 XuiSetLocale( L"fr-FR" ); 809 break; 810 case XC_LANGUAGE_SPANISH: 811 switch(XGetLocale()) 812 { 813#ifdef NEW_LANGUAGES 814 case XC_LOCALE_ARGENTINA: 815 case XC_LOCALE_CHILE: 816 case XC_LOCALE_COLOMBIA: 817 case XC_LOCALE_MEXICO: 818 case XC_LOCALE_UNITED_STATES: 819 XuiSetLocale( L"es-MX" ); 820 break; 821#endif 822 default: 823 XuiSetLocale( L"es-ES" ); 824 break; 825 } 826 break; 827 case XC_LANGUAGE_ITALIAN: 828 XuiSetLocale( L"it-IT" ); 829 break; 830#ifdef NEW_LANGUAGES 831 case XC_LANGUAGE_POLISH: 832 XuiSetLocale( L"pl-PL" ); 833 break; 834 case XC_LANGUAGE_RUSSIAN: 835 XuiSetLocale( L"ru-RU" ); 836 break; 837 case XC_LANGUAGE_SWEDISH: 838 XuiSetLocale( L"sv-SE" ); 839 break; 840 case XC_LANGUAGE_TURKISH: 841 XuiSetLocale( L"tr-TR" ); 842 break; 843 case XC_LANGUAGE_BNORWEGIAN: 844 XuiSetLocale( L"nb-NO" ); 845 break; 846 case XC_LANGUAGE_DUTCH: 847 // 4J-PB - the loc people gave us nl-BE but no nl-NL. They claim they are identical, so use nl-BE. 848 //if(XGetLocale()==XC_LOCALE_BELGIUM) 849 { 850 // Belgian Dutch 851 XuiSetLocale( L"nl-BE" ); 852 } 853// else 854// { 855// XuiSetLocale( L"nl-NL" ); 856// } 857 break; 858 case XC_LANGUAGE_SCHINESE: 859 // fall back to English until we have a font, and Microsoft are happy with the Chinese Simplified text 860 //XuiSetLocale( L"zh-CHS" ); 861 XuiSetLocale( L"" ); 862 break; 863#endif 864 } 865 } 866 } 867 868 869 //#endif 870 871 XuiSoundXACTRegister(); 872 XuiSoundXAudioRegister(); 873 874 // Register a default typeface 875 // wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/font/Mojangles.ttf"); 876 // hr = RegisterDefaultTypeface( L"Mojangles",szResourceLocator); 877 878 // Load the skin file used for the scene. 879 wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/skin_Minecraft.xur"); 880 hr=LoadSkin( szResourceLocator ); 881 if( FAILED(hr) ) app.FatalLoadError(); 882 883 // Storage strings 884 wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/4J_strings.xus"); 885 hr=StorageManager.m_pStringTable->Load( szResourceLocator ); 886 if( FAILED(hr) ) app.FatalLoadError(); 887 888 wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/strings.xus"); 889 hr=StringTable.Load( szResourceLocator ); 890 if( FAILED(hr) ) app.FatalLoadError(); 891 892 // #ifdef _DEBUG 893 // // dump out the text 894 // int iStringC=0; 895 // LPCWSTR lpTempString; 896 // 897 // while((lpTempString=StringTable.Lookup(iStringC))!=NULL) 898 // { 899 // DebugPrintf("STRING %d = ",iStringC); 900 // OutputDebugStringW(lpTempString); 901 // DebugPrintf("\n"); 902 // iStringC++; 903 // } 904 // #endif 905 906 907 908 // Load the xui scenes 909 910 // 4J Stu - Add the tooltip/container scene to the root object 911 // Load the scene. 912 ASSERT(m_hObjRoot); 913 HXUIOBJ mainBaseScene; 914 wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/"); 915 if(RenderManager.IsHiDef()) 916 { 917 hr=LoadFirstScene( szResourceLocator, L"xuiscene_base.xur", NULL, &mainBaseScene ); 918 } 919 else 920 { 921 if(RenderManager.IsWidescreen()) 922 { 923 hr=LoadFirstScene( szResourceLocator, L"xuiscene_base.xur", NULL, &mainBaseScene ); 924 } 925 else 926 { 927 hr=LoadFirstScene( szResourceLocator, L"xuiscene_base_480.xur", NULL, &mainBaseScene ); 928 } 929 } 930 if( FAILED(hr) ) app.FatalLoadError(); 931 932 XuiElementGetChildById( mainBaseScene, L"BasePlayer0", &m_PlayerBaseScene[0] ); 933 XuiElementGetChildById( mainBaseScene, L"BasePlayer1", &m_PlayerBaseScene[1] ); 934 XuiElementGetChildById( mainBaseScene, L"BasePlayer2", &m_PlayerBaseScene[2] ); 935 XuiElementGetChildById( mainBaseScene, L"BasePlayer3", &m_PlayerBaseScene[3] ); 936 937 for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) 938 { 939 XuiElementGetChildById( m_PlayerBaseScene[idx], L"XuiSceneContainer", &m_hCurrentScene[idx]); 940 m_hFirstScene[idx]=m_hCurrentScene[idx]; 941 942 XuiElementGetChildById( m_PlayerBaseScene[idx], L"XuiSceneTutorialContainer", &m_hCurrentTutorialScene[idx]); 943 m_hFirstTutorialScene[idx]=m_hCurrentTutorialScene[idx]; 944 945 XuiElementGetChildById( m_PlayerBaseScene[idx], L"XuiSceneChatRoot", &m_hCurrentChatScene[idx]); 946 m_hFirstChatScene[idx]=m_hCurrentChatScene[idx]; 947 948 WCHAR szResourceLocator[ LOCATOR_SIZE ]; 949 wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/"); 950 HXUIOBJ hScene; 951 HRESULT hr = XuiSceneCreate(szResourceLocator,app.GetSceneName(eUIComponent_Chat, true,false), &idx, &hScene); 952 if( FAILED(hr) ) app.FatalLoadError(); 953 954 hr = XuiSceneNavigateForward(m_hCurrentChatScene[idx], FALSE, hScene, idx); 955 if (FAILED(hr)) 956 { 957 app.DebugPrintf("chat scene navigate fail"); 958 XuiDestroyObject(hScene); 959 return hr; 960 } 961 962 m_hCurrentChatScene[idx]=hScene; 963 964 XuiElementGetChildById( m_PlayerBaseScene[idx], L"XuiSceneHudRoot", &m_hCurrentHudScene[idx]); 965 m_hFirstHudScene[idx]=m_hCurrentHudScene[idx]; 966 967 ReloadHudScene(idx, false, true); 968 } 969 970 // get the "Press START to join in" message 971 HXUIOBJ hPressStartMessage; 972 973 XuiElementGetChildById( mainBaseScene, L"XuiPressStartMessage", &hPressStartMessage ); 974 // set the text 975 XuiControlSetText(hPressStartMessage, GetString(IDS_PRESS_START_TO_JOIN)); 976 977 HXUIOBJ debugContainerObj; 978 XuiElementGetChildById( mainBaseScene, L"XuiSceneDebugContainer", &debugContainerObj ); 979 debugContainerScene.Attach( debugContainerObj ); 980 981 SetResourcesLoaded(true); 982 983 return S_OK; 984 985} 986 987HRESULT CConsoleMinecraftApp::RegisterFont(eFont eFontLanguage,eFont eFontFallback, bool bSetAsDefault) 988{ 989 HRESULT hr=S_OK; 990 const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string 991 WCHAR szResourceLocator[ LOCATOR_SIZE ]; 992 const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); 993 994 wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", wchTypefaceLocatorA[eFontLanguage]); 995 // 4J Stu - Check that the font file actually exists 996 HXUIRESOURCE fontTempResource; 997 BOOL isMemoryResource; 998 hr = XuiResourceOpenNoLoc(szResourceLocator, &fontTempResource, &isMemoryResource); 999 if( FAILED(hr) ) app.FatalLoadError(); 1000 XuiResourceClose(fontTempResource); 1001 1002 if(bSetAsDefault) 1003 { 1004 if(eFontFallback!=eFont_None) 1005 { 1006 hr = RegisterDefaultTypeface( wchTypefaceA[eFontLanguage],szResourceLocator,NULL,0.0f,wchTypefaceA[eFontFallback]); 1007 } 1008 else 1009 { 1010 hr = RegisterDefaultTypeface( wchTypefaceA[eFontLanguage],szResourceLocator); 1011 } 1012 } 1013 else 1014 { 1015 TypefaceDescriptor typefaceDescriptorStruct; 1016 ZeroMemory(&typefaceDescriptorStruct,sizeof(TypefaceDescriptor)); 1017 typefaceDescriptorStruct.szTypeface=wchTypefaceA[eFontLanguage]; 1018 typefaceDescriptorStruct.szLocator=szResourceLocator; 1019 if(eFontFallback!=eFont_None) 1020 { 1021 typefaceDescriptorStruct.szFallbackTypeface= wchTypefaceA[eFontFallback]; 1022 } 1023 hr = XuiRegisterTypeface(&typefaceDescriptorStruct,FALSE); 1024 } 1025 return hr; 1026} 1027 1028 1029// TMS++ 1030 1031void CConsoleMinecraftApp::TMSPP_SetTitleGroupID(LPCSTR szTitleGroupID) 1032{ 1033 StorageManager.TMSPP_SetTitleGroupID(szTitleGroupID); 1034} 1035 1036void CConsoleMinecraftApp::TMSPP_RetrieveFileList(int iPad,C4JStorage::eGlobalStorage eStorageFacility,CHAR *szPath,eTMSAction NextAction) 1037{ 1038 app.DebugPrintf("CConsoleMinecraftApp::TMSPP_RetrieveFileList\n"); 1039 1040 if(eStorageFacility==C4JStorage::eGlobalStorage_Title) 1041 { 1042 if(m_bTMSPP_GlobalFileListRead==false) 1043 { 1044 m_bTMSPP_GlobalFileListRead=true; 1045 StorageManager.TMSPP_ReadFileList(iPad,eStorageFacility,szPath,&CConsoleMinecraftApp::Callback_TMSPPReadFileList,this,NextAction); 1046 } 1047 else 1048 { 1049 SetTMSAction(iPad,NextAction); 1050 } 1051 } 1052 else 1053 { 1054 StorageManager.TMSPP_ReadFileList(iPad,eStorageFacility,szPath,&CConsoleMinecraftApp::Callback_TMSPPReadFileList,this,NextAction); 1055 } 1056 1057 1058} 1059 1060int CConsoleMinecraftApp::Callback_TMSPPReadFileList(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILE_LIST pTmsFileList) 1061{ 1062 app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadFileList\n"); 1063 CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam; 1064 1065#ifdef _DEBUG 1066 // dump out the file list 1067 app.DebugPrintf("TMSPP filecount - %d\n",pTmsFileList->iCount); 1068 for(int i=0;i<pTmsFileList->iCount;i++) 1069 { 1070 app.DebugPrintf("TMSPP - %s\n",pTmsFileList->FileDetailsA[i].szFilename); 1071 } 1072#endif 1073 // change the state to the next action 1074 pClass->SetTMSAction(iPad,(eTMSAction)iUserData); 1075 return 0; 1076} 1077 1078void CConsoleMinecraftApp::TMSPP_ReadXuidsFile(int iPad,eTMSAction NextAction) 1079{ 1080 app.DebugPrintf("CConsoleMinecraftApp::TMSPP_ReadXuidsFile\n"); 1081 C4JStorage::ETMSStatus eResult; 1082 // 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 1083 1084 if(m_bRead_TMS_XUIDS_XML==false) 1085 { 1086 m_bRead_TMS_XUIDS_XML=true; 1087 1088 eResult=StorageManager.TMSPP_ReadFile(iPad,C4JStorage::eGlobalStorage_Title,C4JStorage::TMS_FILETYPE_BINARY,"xuids.xml",&CConsoleMinecraftApp::Callback_TMSPPReadXuidsFile,this,NextAction); 1089 1090 if(eResult!=C4JStorage::ETMSStatus_ReadInProgress) 1091 { 1092 // something went wrong 1093 app.SetTMSAction(iPad,(eTMSAction)NextAction); 1094 } 1095 } 1096 else 1097 { 1098 app.SetTMSAction(iPad,(eTMSAction)NextAction); 1099 } 1100} 1101 1102int CConsoleMinecraftApp::Callback_TMSPPReadXuidsFile(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename) 1103{ 1104 app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadXuidsFile\n"); 1105 CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam; 1106 if(pFileData) 1107 { 1108 ATG::XMLParser xmlParser; 1109 xmlMojangCallback xmlCallback; 1110 1111 xmlParser.RegisterSAXCallbackInterface( &xmlCallback ); 1112 xmlParser.ParseXMLBuffer((CHAR *)pFileData->pbData,pFileData->dwSize); 1113 delete [] pFileData->pbData; 1114 delete [] pFileData; 1115 } 1116 1117 // change the state to the next action 1118 pClass->SetTMSAction(iPad,(eTMSAction)iUserData); 1119 1120 return 0; 1121} 1122 1123void CConsoleMinecraftApp::TMSPP_ReadConfigFile(int iPad,eTMSAction NextAction) 1124{ 1125 app.DebugPrintf("CConsoleMinecraftApp::TMSPP_ReadConfigFile\n"); 1126 C4JStorage::ETMSStatus eResult; 1127 // 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 1128 1129 if(m_bRead_TMS_Config_XML==false) 1130 { 1131 m_bRead_TMS_Config_XML=true; 1132 1133 eResult=StorageManager.TMSPP_ReadFile(iPad,C4JStorage::eGlobalStorage_Title,C4JStorage::TMS_FILETYPE_BINARY,"Config.xml",&CConsoleMinecraftApp::Callback_TMSPPReadConfigFile,this,NextAction); 1134 1135 if(eResult!=C4JStorage::ETMSStatus_ReadInProgress) 1136 { 1137 // something went wrong - probably no Config.xml file exists in TMS++ 1138 app.SetTMSAction(iPad,(eTMSAction)NextAction); 1139 } 1140 } 1141 else 1142 { 1143 app.SetTMSAction(iPad,(eTMSAction)NextAction); 1144 } 1145} 1146 1147int CConsoleMinecraftApp::Callback_TMSPPReadConfigFile(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename) 1148{ 1149 app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadConfigFile\n"); 1150 CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam; 1151 if(pFileData) 1152 { 1153 ATG::XMLParser xmlParser; 1154 xmlConfigCallback xmlCallback; 1155 1156 xmlParser.RegisterSAXCallbackInterface( &xmlCallback ); 1157 xmlParser.ParseXMLBuffer((CHAR *)pFileData->pbData,pFileData->dwSize); 1158 delete [] pFileData->pbData; 1159 delete [] pFileData; 1160 } 1161 1162 // change the state to the next action 1163 pClass->SetTMSAction(iPad,(eTMSAction)iUserData); 1164 1165 return 0; 1166} 1167 1168 1169 1170bool CConsoleMinecraftApp::TMSPP_ReadBannedList(int iPad,eTMSAction NextAction) 1171{ 1172 app.DebugPrintf("CConsoleMinecraftApp::TMSPP_ReadBannedList\n"); 1173 C4JStorage::ETMSStatus eResult; 1174 bool bSendBanFileRetrievedMsg=false; 1175 1176 if(GetBanListRead(iPad)==false) 1177 { 1178 // do we have one in our user filelist? 1179 if(StorageManager.TMSPP_InFileList(C4JStorage::eGlobalStorage_TitleUser,iPad,L"BannedList")) 1180 { 1181 SetBanListRead(iPad,true); 1182 ClearBanList(iPad); 1183 1184 eResult=StorageManager.TMSPP_ReadFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,"BannedList",&CConsoleMinecraftApp::Callback_TMSPPReadBannedList,this,NextAction); 1185 if(eResult!=C4JStorage::ETMSStatus_ReadInProgress) 1186 { 1187 // something went wrong 1188 app.SetTMSAction(iPad,(eTMSAction)NextAction); 1189 bSendBanFileRetrievedMsg=true; 1190 } 1191 } 1192 else 1193 { 1194 // not in the list - we'll need to fall back to TMS 1195 return false; 1196 } 1197 1198 } 1199 else 1200 { 1201 bSendBanFileRetrievedMsg=true; 1202 } 1203 1204 if(bSendBanFileRetrievedMsg) 1205 { 1206 ui.HandleTMSBanFileRetrieved(iPad); 1207 } 1208 1209 app.SetTMSAction(iPad,(eTMSAction)NextAction); 1210 1211 return true; 1212} 1213 1214int CConsoleMinecraftApp::Callback_TMSPPReadBannedList(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILEDATA pFileData,LPCSTR szFilename) 1215{ 1216 app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadBannedList\n"); 1217 1218 CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam; 1219 1220 if(pFileData) 1221 { 1222 1223 // put the entries into the vector 1224 int iEntries=pFileData->dwSize/sizeof(BANNEDLISTDATA); 1225 PBANNEDLISTDATA pData=(PBANNEDLISTDATA)pFileData->pbData; 1226 1227 for(int i=0;i<iEntries;i++) 1228 { 1229 pClass->AddLevelToBannedLevelList(iPad,pData[i].xuid,pData[i].pszLevelName, false); 1230 } 1231 // mark the level as not checked against banned levels - it'll be checked once the level starts 1232 app.SetBanListCheck(iPad,false); 1233 1234 delete [] pFileData->pbData; 1235 delete [] pFileData; 1236 } 1237 ui.HandleTMSBanFileRetrieved(iPad); 1238 1239 // change the state to the next action 1240 pClass->SetTMSAction(iPad,(eTMSAction)iUserData); 1241 1242 return 0; 1243} 1244 1245void CConsoleMinecraftApp::TMSPP_ReadDLCFile(int iPad,eTMSAction NextAction) 1246{ 1247 app.DebugPrintf("CConsoleMinecraftApp::TMSPP_ReadDLCFile\n"); 1248 bool bRetrievedDLCFile=false; 1249 // 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 1250 C4JStorage::ETMSStatus eResult; 1251 if(m_bRead_TMS_DLCINFO_XML==false) 1252 { 1253 //m_bRead_TMS_DLCINFO_XML=true; 1254 1255 eResult=StorageManager.TMSPP_ReadFile(iPad,C4JStorage::eGlobalStorage_Title,C4JStorage::TMS_FILETYPE_BINARY,"DLC.cmp",&CConsoleMinecraftApp::Callback_TMSPPReadDLCFile,this,NextAction); 1256 if(eResult!=C4JStorage::ETMSStatus_ReadInProgress) 1257 { 1258 // something went wrong 1259 app.SetTMSAction(iPad,(eTMSAction)NextAction); 1260 bRetrievedDLCFile=true; 1261 } 1262 } 1263 else 1264 { 1265 bRetrievedDLCFile=true; 1266 } 1267 1268 if(bRetrievedDLCFile) 1269 { 1270 ui.HandleTMSDLCFileRetrieved(iPad); 1271 1272 app.SetTMSAction(iPad,(eTMSAction)NextAction); 1273 } 1274} 1275 1276int CConsoleMinecraftApp::Callback_TMSPPReadDLCFile(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILEDATA pFileData,LPCSTR szFilename) 1277{ 1278 app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadDLCFile\n"); 1279 CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam; 1280 1281 if(pFileData && pFileData->dwSize>0) 1282 { 1283 // the DLC.xml file is now compressed 1284 1285 unsigned int uiDecompSize=*(unsigned int *)pFileData->pbData; 1286 unsigned int uiCompSize=((unsigned int *)pFileData->pbData)[1]; 1287 1288 BYTE *pDecompressedData = new BYTE [uiDecompSize]; 1289 1290 Compression::getCompression()->Decompress(pDecompressedData,&uiDecompSize,&((unsigned int *)pFileData->pbData)[2],uiCompSize); 1291 delete [] pFileData->pbData; 1292 delete [] pFileData; 1293 1294 ATG::XMLParser xmlParser; 1295 xmlDLCInfoCallback xmlCallback; 1296 1297 xmlParser.RegisterSAXCallbackInterface( &xmlCallback ); 1298 xmlParser.ParseXMLBuffer((CHAR *)pDecompressedData,uiDecompSize); 1299 1300 pClass->m_bRead_TMS_DLCINFO_XML=true; 1301 1302 delete pDecompressedData; 1303 } 1304 1305 ui.HandleTMSDLCFileRetrieved(iPad); 1306 1307 // change the state to the next action 1308 pClass->SetTMSAction(iPad,(eTMSAction)iUserData); 1309 1310 return 0; 1311} 1312 1313 1314void CConsoleMinecraftApp::ReadBannedList(int iPad,eTMSAction NextAction, bool bCallback) 1315{ 1316 // 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 1317 1318 if(GetBanListCheck(iPad)==false) 1319 { 1320 SetBanListCheck(iPad,true); 1321 ClearBanList(iPad); 1322 1323 //StorageManager.DeleteTMSFile(iPad,C4JStorage::eGlobalStorage_TitleUser,L"BannedList"); 1324 C4JStorage::ETMSStatus eTMSStatus; 1325 if(bCallback) 1326 { 1327 eTMSStatus=StorageManager.ReadTMSFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::eTMS_FileType_Normal,L"BannedList",&BannedListA[iPad].pBannedList, &BannedListA[iPad].dwBytes,&CConsoleMinecraftApp::CallbackBannedListFileFromTMS,this,NextAction); 1328 } 1329 else 1330 { 1331 eTMSStatus=StorageManager.ReadTMSFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::eTMS_FileType_Normal,L"BannedList",&BannedListA[iPad].pBannedList, &BannedListA[iPad].dwBytes); 1332 1333 if(eTMSStatus==C4JStorage::ETMSStatus_Idle) 1334 { 1335 // put the entries into the vector 1336 int iEntries=BannedListA[iPad].dwBytes/sizeof(BANNEDLISTDATA); 1337 PBANNEDLISTDATA pData=(PBANNEDLISTDATA)BannedListA[iPad].pBannedList; 1338 1339 for(int i=0;i<iEntries;i++) 1340 { 1341 AddLevelToBannedLevelList(iPad,pData[i].xuid,pData[i].pszLevelName, false); 1342 } 1343 // mark the level as not checked against banned levels - it'll be checked once the level starts 1344 app.SetBanListCheck(iPad,false); 1345 } 1346 } 1347 } 1348 else 1349 { 1350 app.SetTMSAction(iPad,(eTMSAction)NextAction); 1351 // 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. 1352 1353 // 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 1354 1355 if(bCallback) 1356 { 1357 ui.HandleTMSBanFileRetrieved(iPad); 1358 } 1359 } 1360} 1361 1362int CConsoleMinecraftApp::CallbackBannedListFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction) 1363{ 1364 CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)lpParam; 1365 1366 if(pClass->BannedListA[iPad].dwBytes>0) 1367 { 1368 // put the entries into the vector 1369 int iEntries=pClass->BannedListA[iPad].dwBytes/sizeof(BANNEDLISTDATA); 1370 PBANNEDLISTDATA pData=(PBANNEDLISTDATA)pClass->BannedListA[iPad].pBannedList; 1371 1372 for(int i=0;i<iEntries;i++) 1373 { 1374 pClass->AddLevelToBannedLevelList(iPad,pData[i].xuid,pData[i].pszLevelName, false); 1375 } 1376 1377 // mark the level as not checked against banned levels - it'll be checked once the level starts 1378 app.SetBanListCheck(iPad,false); 1379 1380 } 1381 app.SetTMSAction(iPad,(eTMSAction)iAction); 1382 1383 ui.HandleTMSBanFileRetrieved(iPad); 1384 1385 return 0; 1386} 1387 1388void CConsoleMinecraftApp::OverrideFontRenderer(bool set, bool immediate) 1389{ 1390 // 4J Stu - Only relevant to XUI on Xbox360 1391#ifdef _XBOX 1392 // We don't want to even attempt using our font renderer in the asian languages 1393 switch(XGetLanguage()) 1394 { 1395 case XC_LANGUAGE_JAPANESE: 1396 case XC_LANGUAGE_TCHINESE: 1397 case XC_LANGUAGE_KOREAN: 1398 return; 1399 break; 1400 } 1401 1402 if(set != m_bFontRendererOverridden) 1403 { 1404 if( immediate ) 1405 { 1406 XuiElementDiscardResources( m_hObjRoot, XUI_DISCARD_FONTS ); 1407 if( set ) 1408 { 1409 XuiFontSetRenderer( m_fontRenderer ); 1410 } 1411 else 1412 { 1413 XuiFontSetRenderer( NULL ); 1414 } 1415 m_bFontRendererOverridden = set; 1416 1417 if( GetResourcesLoaded() ) 1418 { 1419 // tell the xui scenes the font renderer changed 1420 XUIMessage xuiMsg; 1421 CustomMessage_FontRendererChange( &xuiMsg); 1422 1423 // send the message 1424 for(int i=0;i<XUSER_MAX_COUNT;i++) 1425 { 1426 XuiBroadcastMessage( CXuiSceneBase::GetPlayerBaseScene(i), &xuiMsg ); 1427 } 1428 } 1429 } 1430 1431 m_bOverrideFontRenderer = set; 1432 } 1433#endif 1434} 1435 1436void CConsoleMinecraftApp::RunFrame() 1437{ 1438 OverrideFontRenderer( m_bOverrideFontRenderer ); 1439 // Do the actual XUI frame 1440 1441 CXuiModule::RunFrame(); 1442 1443} 1444 1445void CConsoleMinecraftApp::CaptureSaveThumbnail() 1446{ 1447 MemSect(53); 1448 RenderManager.CaptureThumbnail(&m_ThumbnailBuffer); 1449 MemSect(0); 1450} 1451void CConsoleMinecraftApp::GetSaveThumbnail(PBYTE *pbData,DWORD *pdwSize) 1452{ 1453 // on a save caused by a create world, the thumbnail capture won't have happened 1454 if(m_ThumbnailBuffer!=NULL) 1455 { 1456 if( pbData ) 1457 { 1458 *pbData= new BYTE [m_ThumbnailBuffer->GetBufferSize()]; 1459 *pdwSize=m_ThumbnailBuffer->GetBufferSize(); 1460 memcpy(*pbData,m_ThumbnailBuffer->GetBufferPointer(),*pdwSize); 1461 } 1462 m_ThumbnailBuffer->Release(); 1463 m_ThumbnailBuffer=NULL; 1464 } 1465} 1466void CConsoleMinecraftApp::ReleaseSaveThumbnail() 1467{ 1468 if(m_ThumbnailBuffer!=NULL) 1469 { 1470 m_ThumbnailBuffer->Release(); 1471 m_ThumbnailBuffer=NULL; 1472 } 1473} 1474 1475void CConsoleMinecraftApp::GetScreenshot(int iPad,PBYTE *pbData,DWORD *pdwSize) 1476{ 1477 // on a save caused by a create world, the thumbnail capture won't have happened 1478 if(m_ScreenshotBuffer[iPad]!=NULL) 1479 { 1480 *pbData= new BYTE [m_ScreenshotBuffer[iPad]->GetBufferSize()]; 1481 *pdwSize=m_ScreenshotBuffer[iPad]->GetBufferSize(); 1482 memcpy(*pbData,m_ScreenshotBuffer[iPad]->GetBufferPointer(),*pdwSize); 1483 m_ScreenshotBuffer[iPad]->Release(); 1484 m_ScreenshotBuffer[iPad]=NULL; 1485 } 1486} 1487 1488#ifdef _DEBUG_MENUS_ENABLED 1489void CConsoleMinecraftApp::EnableDebugOverlay(bool enable,int iPad) 1490{ 1491 HRESULT hr = S_OK; 1492 1493 if(enable && !debugOverlayCreated) 1494 { 1495 const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); 1496 1497 const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string 1498 WCHAR szResourceLocator[ LOCATOR_SIZE ]; 1499 1500 wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/"); 1501 hr = XuiSceneCreate(szResourceLocator, L"xuiscene_debugoverlay.xur", NULL, &m_hDebugOverlay); 1502 debugContainerScene.AddChild(m_hDebugOverlay); 1503 debugContainerScene.SetShow(false); 1504 1505 debugOverlayCreated = true; 1506 } 1507 if(enable) 1508 { 1509 XuiElementSetUserFocus(m_hDebugOverlay, iPad); 1510 } 1511 else 1512 { 1513 XuiElementSetUserFocus(m_hCurrentScene[iPad], iPad); 1514 } 1515 debugContainerScene.SetShow(enable); 1516 SetMenuDisplayed(ProfileManager.GetPrimaryPad(),enable); 1517} 1518#endif 1519 1520bool CConsoleMinecraftApp::GetMenuDisplayed(int iPad) 1521{ 1522 return m_bMenuDisplayed[iPad]; 1523} 1524 1525void CConsoleMinecraftApp::SetMenuDisplayed(int iPad,bool bVal) 1526{ 1527 if(iPad==XUSER_INDEX_ANY) return; 1528 1529 if(bVal) 1530 { 1531 if(iPad==XUSER_INDEX_ANY) 1532 { 1533 for(int i=0;i<XUSER_MAX_COUNT;i++) 1534 { 1535 InputManager.SetMenuDisplayed(i,true); 1536 m_bMenuDisplayed[i]=true; 1537 // 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. 1538 m_bMenuToBeClosed[iPad]=false; 1539 SetChatTextDisplayed(i,false); 1540 } 1541 } 1542 else 1543 { 1544 InputManager.SetMenuDisplayed(iPad,true); 1545 m_bMenuDisplayed[iPad]=true; 1546 // 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. 1547 m_bMenuToBeClosed[iPad]=false; 1548 SetChatTextDisplayed(iPad,false); 1549 } 1550 } 1551 else 1552 { 1553 if(iPad==XUSER_INDEX_ANY) 1554 { 1555 for(int i=0;i<XUSER_MAX_COUNT;i++) 1556 { 1557 m_bMenuToBeClosed[i]=true; 1558 m_iCountDown[i]=4; 1559 } 1560 } 1561 else 1562 { 1563 m_bMenuToBeClosed[iPad]=true; 1564 m_iCountDown[iPad]=4; 1565 } 1566 } 1567} 1568 1569void CConsoleMinecraftApp::CheckMenuDisplayed() 1570{ 1571 for(int iPad=0;iPad<4;iPad++) 1572 { 1573 if(m_bMenuToBeClosed[iPad]) 1574 { 1575 if(m_iCountDown[iPad]!=0) 1576 { 1577 m_iCountDown[iPad]--; 1578 } 1579 else 1580 { 1581 m_bMenuToBeClosed[iPad]=false; 1582 m_bMenuDisplayed[iPad]=false; 1583 InputManager.SetMenuDisplayed(iPad,false); 1584 SetChatTextDisplayed(iPad,true); 1585 } 1586 1587 } 1588 } 1589} 1590bool CConsoleMinecraftApp::IsSceneInStack(int iPad, EUIScene eScene) 1591{ 1592 bool inStack = false; 1593 int idx = 0; 1594 if( m_bGameStarted ) 1595 { 1596 // If the game isn't running treat as user 0, otherwise map index directly from pad 1597 if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad; 1598 } 1599 AUTO_VAR(itEnd, m_sceneStack[idx].end()); 1600 for (AUTO_VAR(it, m_sceneStack[idx].begin()); it != itEnd; it++) 1601 //for(auto it = m_sceneStack[iPad].begin(), end = m_sceneStack[iPad].end(); it != end; ++it) 1602 { 1603 if(it->first == eScene) 1604 { 1605 inStack = true; 1606 break; 1607 } 1608 } 1609 1610 return inStack; 1611} 1612 1613WCHAR *CConsoleMinecraftApp::GetSceneName(EUIScene eScene,bool bAppendToName,bool bSplitscreenScene) 1614{ 1615 wcscpy(m_SceneName,wchSceneA[eScene]); 1616 if(bAppendToName) 1617 { 1618 if(RenderManager.IsHiDef()) 1619 { 1620 if(bSplitscreenScene) 1621 { 1622 wcscat(m_SceneName,L"_small"); 1623 } 1624 } 1625 else 1626 { 1627 // if it's low def, but widescreen, then use the small scenes 1628 if(!RenderManager.IsWidescreen()) 1629 { 1630 wcscat(m_SceneName,L"_480"); 1631 } 1632 1633 } 1634 } 1635 wcscat(m_SceneName,L".xur"); 1636 1637#ifdef _DEBUG 1638#ifndef __PS3__ 1639 OutputDebugStringA("SCENE LOAD - "); 1640 OutputDebugStringW(m_SceneName); 1641 app.DebugPrintf("\n"); 1642#endif __PS3__ 1643#endif 1644 1645 return m_SceneName; 1646} 1647 1648HRESULT CConsoleMinecraftApp::NavigateToScene(int iPad,EUIScene eScene, void *initData /* = NULL */, bool forceUsePad /*= false*/, BOOL bStayVisible /* = FALSE */, HXUIOBJ *phResultingScene /*= NULL*/ ) 1649{ 1650 ASSERT(m_bDefaultTypefaceRegistered); 1651 ASSERT(m_bSkinLoaded); 1652 static bool bSeenUpdateTextThisSession=false; 1653 1654 // make sure we've created the main canvas already 1655 ASSERT(m_hObjRoot); 1656 if (!m_hObjRoot) 1657 return E_UNEXPECTED; 1658 1659 // If you're navigating to the multigamejoinload, and the player hasn't seen the updates message yet, display it now 1660 // display this message the first 3 times 1661 if((eScene==eUIScene_LoadOrJoinMenu) && (bSeenUpdateTextThisSession==false) && ( app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplayUpdateMessage)!=0)) 1662 { 1663 eScene=eUIScene_NewUpdateMessage; 1664 bSeenUpdateTextThisSession=true; 1665 } 1666 // 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 1667 if(GetMenuDisplayed(iPad)) 1668 { 1669 switch(eScene) 1670 { 1671 case eUIScene_PauseMenu: 1672 case eUIScene_Crafting2x2Menu: 1673 case eUIScene_Crafting3x3Menu: 1674 case eUIScene_FurnaceMenu: 1675 case eUIScene_ContainerMenu: 1676 case eUIScene_LargeContainerMenu: 1677 case eUIScene_InventoryMenu: 1678 case eUIScene_CreativeMenu: 1679 case eUIScene_DispenserMenu: 1680 case eUIScene_SignEntryMenu: 1681 case eUIScene_InGameInfoMenu: 1682 case eUIScene_EnchantingMenu: 1683 case eUIScene_BrewingStandMenu: 1684 case eUIScene_AnvilMenu: 1685 case eUIScene_TradingMenu: 1686 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); 1687 return S_FALSE; 1688 break; 1689 } 1690 } 1691 1692 // load from the .xzp file 1693 const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); 1694 1695 HXUIOBJ hScene; 1696 HRESULT hr; 1697 const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string 1698 WCHAR szResourceLocator[ LOCATOR_SIZE ]; 1699 1700 wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/"); 1701 1702 // If the init data is null, put the player pad in there 1703 1704 if(initData==NULL) 1705 { 1706 initData = &iPad; 1707 } 1708 1709 int idx = 0; 1710 if( m_bGameStarted || forceUsePad ) 1711 { 1712 // If the game isn't running treat as user 0, otherwise map index directly from pad 1713 if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad; 1714 } 1715 else 1716 { 1717 // The game isn't running, so make sure this scene is fullscreen 1718 CXuiSceneBase::SetPlayerBaseScenePosition( idx, CXuiSceneBase::e_BaseScene_Fullscreen ); 1719 } 1720 1721 if( eScene != eUIComponent_TutorialPopup && eScene != eUIComponent_Chat && eScene != eUIScene_HUD ) 1722 { 1723 SetMenuDisplayed(idx,true); 1724 } 1725 1726 PIXBeginNamedEvent(0,"Xui scene create\n"); 1727 MemSect(4); 1728 1729 bool bIsHiDef=RenderManager.IsHiDef(); 1730 bool bIsSplitscreen = GetLocalPlayerCount()>1; 1731 BOOL bSceneIsFullscreen = CXuiSceneBase::GetPlayerBasePosition(idx)==CXuiSceneBase::e_BaseScene_Fullscreen; 1732 1733 switch(eScene) 1734 { 1735 case eUIScene_Intro: 1736 case eUIScene_MainMenu: 1737 case eUIScene_LeaderboardsMenu: 1738 case eUIScene_Credits: 1739 case eUIScene_CreateWorldMenu: 1740 case eUIScene_LoadOrJoinMenu: 1741 case eUIScene_JoinMenu: 1742 case eUIScene_DLCOffersMenu: 1743 case eUIScene_DLCMainMenu: 1744 case eUIScene_TrialExitUpsell: 1745 case eUIScene_SaveMessage: 1746 case eUIScene_LoadMenu: 1747 case eUIScene_LaunchMoreOptionsMenu: 1748 // if we're in low res widescreen, we just want to use the normal scenes for these 1749 if(!bIsHiDef && RenderManager.IsWidescreen()) 1750 { 1751 hr = XuiSceneCreate(szResourceLocator,app.GetSceneName(eScene,false, false), initData, &hScene); 1752 } 1753 else 1754 { 1755 hr = XuiSceneCreate(szResourceLocator,app.GetSceneName(eScene, true,false), initData, &hScene); 1756 } 1757 break; 1758 default: 1759 // some scenes are forced into fullscreen even though we are insplitscreen mode (saving) 1760 if(eScene==eUIComponent_TutorialPopup || eScene==eUIComponent_Chat || eScene==eUIScene_HUD) 1761 { 1762 hr = XuiSceneCreate(szResourceLocator,app.GetSceneName(eScene,true,bIsSplitscreen), initData, &hScene); 1763 } 1764 else 1765 { 1766 hr = XuiSceneCreate(szResourceLocator,app.GetSceneName(eScene,true,bIsSplitscreen && !bSceneIsFullscreen), initData, &hScene); 1767 } 1768 break; 1769 } 1770 if( FAILED(hr) ) app.FatalLoadError(); 1771 1772 MemSect(0); 1773 PIXEndNamedEvent(); 1774#if 0 1775 D3DXVECTOR3 test; 1776 test.x = 0.5f; 1777 test.y = 0.5f; 1778 test.z = 1.0f; 1779 XuiElementSetScale(hScene,&test); 1780#endif 1781 1782 if( eScene == eUIComponent_TutorialPopup ) 1783 { 1784 hr = XuiSceneNavigateForward(m_hCurrentTutorialScene[iPad], FALSE, hScene, XUSER_INDEX_NONE); 1785 if (FAILED(hr)) 1786 { 1787 app.DebugPrintf("scene navigate fail"); 1788 XuiDestroyObject(hScene); 1789 return hr; 1790 } 1791 1792 m_hCurrentTutorialScene[iPad]=hScene; 1793 } 1794 else if( eScene == eUIComponent_Chat ) 1795 { 1796 hr = XuiSceneNavigateForward(m_hCurrentChatScene[iPad], FALSE, hScene, XUSER_INDEX_NONE); 1797 if (FAILED(hr)) 1798 { 1799 app.DebugPrintf("scene navigate fail"); 1800 XuiDestroyObject(hScene); 1801 return hr; 1802 } 1803 1804 m_hCurrentChatScene[iPad]=hScene; 1805 } 1806 else if( eScene == eUIScene_HUD ) 1807 { 1808 hr = XuiSceneNavigateForward(m_hCurrentHudScene[iPad], FALSE, hScene, XUSER_INDEX_NONE); 1809 if (FAILED(hr)) 1810 { 1811 app.DebugPrintf("scene navigate fail"); 1812 XuiDestroyObject(hScene); 1813 return hr; 1814 } 1815 1816 m_hCurrentHudScene[iPad]=hScene; 1817 } 1818 else 1819 { 1820 MemSect(5); 1821 hr = XuiSceneNavigateForward(m_hCurrentScene[idx], bStayVisible, hScene, iPad); 1822 MemSect(0); 1823 if (FAILED(hr)) 1824 { 1825 app.DebugPrintf("scene navigate fail"); 1826 XuiDestroyObject(hScene); 1827 return hr; 1828 } 1829 1830 m_hCurrentScene[idx] = hScene; 1831 m_sceneStack[idx].push_back( SceneStackPair(eScene, hScene) ); 1832 1833 if(eScene==eUIScene_Intro) 1834 { 1835 m_bIntroRunning=true; 1836 } 1837 } 1838 1839 switch(eScene) 1840 { 1841 case eUIScene_PauseMenu: 1842 { 1843 m_bPauseMenuDisplayed[iPad] = true; 1844 1845 Minecraft *pMinecraft = Minecraft::GetInstance(); 1846 if(pMinecraft != NULL && pMinecraft->localgameModes[iPad] != NULL ) 1847 { 1848 TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[iPad]; 1849 1850 // This just allows it to be shown 1851 gameMode->getTutorial()->showTutorialPopup(false); 1852 } 1853 } 1854 break; 1855 case eUIScene_Crafting2x2Menu: 1856 case eUIScene_Crafting3x3Menu: 1857 case eUIScene_FurnaceMenu: 1858 case eUIScene_ContainerMenu: 1859 case eUIScene_LargeContainerMenu: 1860 case eUIScene_InventoryMenu: 1861 case eUIScene_CreativeMenu: 1862 case eUIScene_DispenserMenu: 1863 case eUIScene_BrewingStandMenu: 1864 case eUIScene_EnchantingMenu: 1865 case eUIScene_AnvilMenu: 1866 case eUIScene_TradingMenu: 1867 m_bContainerMenuDisplayed[iPad]=true; 1868 1869 // Intentional fall-through 1870 case eUIScene_DeathMenu: 1871 case eUIScene_FullscreenProgress: 1872 case eUIScene_SignEntryMenu: 1873 case eUIScene_EndPoem: 1874 m_bIgnoreAutosaveMenuDisplayed[iPad] = true; 1875 break; 1876 } 1877 1878 switch(eScene) 1879 { 1880 case eUIScene_FullscreenProgress: 1881 case eUIScene_EndPoem: 1882 m_bIgnorePlayerJoinMenuDisplayed[iPad] = true; 1883 break; 1884 } 1885 1886 if(phResultingScene!=NULL) 1887 { 1888 *phResultingScene=hScene; 1889 } 1890 1891 if (FAILED(hr)) 1892 return hr; 1893 1894 return S_OK; 1895} 1896 1897HRESULT CConsoleMinecraftApp::NavigateBack(int iPad, bool forceUsePad /*= false*/, EUIScene eScene /*= eUIScene_COUNT*/) 1898{ 1899 HXUIOBJ hCur; 1900 HXUIOBJ hBack; 1901 1902 int idx = 0; 1903 if( m_bGameStarted || forceUsePad ) 1904 { 1905 // If the game isn't running treat as user 0, otherwise map index directly from pad 1906 if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad; 1907 } 1908 1909 hCur=m_hCurrentScene[idx]; 1910 1911 if(eScene == eUIScene_COUNT) 1912 { 1913 hBack = XuiSceneGetBackScene(m_hCurrentScene[idx]); 1914 if (!hBack) 1915 return S_FALSE; 1916 1917 m_sceneStack[idx].pop_back(); 1918 } 1919 else 1920 { 1921 for(auto it = m_sceneStack[idx].begin(), end = m_sceneStack[idx].end(); it != end; ++it) 1922 { 1923 if(it->first == eScene) 1924 { 1925 hBack = it->second; 1926 } 1927 } 1928 1929 if (!hBack) 1930 return S_FALSE; 1931 1932 while( !m_sceneStack[idx].empty() && m_sceneStack[idx].back().second != hBack) 1933 { 1934 m_sceneStack[idx].pop_back(); 1935 } 1936 } 1937 m_hCurrentScene[idx]=hBack; 1938 1939 if( m_hCurrentScene[idx] == this->m_hFirstScene[idx] ) SetMenuDisplayed(idx,false); 1940 1941 CXuiSceneBase::PlayUISFX(eSFX_Back); 1942 return XuiSceneNavigateBack(hCur, hBack,iPad ); 1943} 1944 1945HRESULT CConsoleMinecraftApp::TutorialSceneNavigateBack(int iPad, bool forceUsePad /*= false*/) 1946{ 1947 HXUIOBJ hCur; 1948 HXUIOBJ hBack; 1949 1950 int idx = 0; 1951 if( m_bGameStarted || forceUsePad ) 1952 { 1953 // If the game isn't running treat as user 0, otherwise map index directly from pad 1954 if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad; 1955 } 1956 1957 hCur=m_hCurrentTutorialScene[idx]; 1958 hBack = XuiSceneGetBackScene(m_hCurrentTutorialScene[idx]); 1959 if (!hBack) 1960 return S_FALSE; 1961 m_hCurrentTutorialScene[idx]=hBack; 1962 1963 return XuiSceneNavigateBack(hCur, hBack,iPad ); 1964} 1965 1966HRESULT CConsoleMinecraftApp::CloseXuiScenes(int iPad, bool forceUsePad /*= false*/) 1967{ 1968 HRESULT hr; 1969 1970 int idx = 0; 1971 if( m_bGameStarted || forceUsePad ) 1972 { 1973 // If the game isn't running treat as user 0, otherwise map index directly from pad 1974 if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad; 1975 } 1976 1977 hr=XuiSceneNavigateBackToFirst(m_hCurrentScene[idx],iPad); 1978 m_hCurrentScene[idx]=m_hFirstScene[idx]; 1979 m_sceneStack[idx].clear(); 1980 1981 CXuiSceneBase::ShowBackground(iPad, FALSE ); 1982 CXuiSceneBase::ShowDarkOverlay(iPad, FALSE ); 1983 CXuiSceneBase::ShowLogo(iPad, FALSE ); 1984 1985 m_bPauseMenuDisplayed[iPad] = false; 1986 m_bContainerMenuDisplayed[iPad] = false; 1987 m_bIgnoreAutosaveMenuDisplayed[iPad] = false; 1988 m_bIgnorePlayerJoinMenuDisplayed[iPad] = false; 1989 1990 ui.SetTooltips( iPad, -1, -1, -1, -1 ); 1991 SetMenuDisplayed(iPad,false); 1992 1993 // Hide the tutorial popup for this player 1994 if(m_bGameStarted) 1995 { 1996 CScene_TutorialPopup::SetSceneVisible(iPad,FALSE); 1997 } 1998 1999 Minecraft *pMinecraft = Minecraft::GetInstance(); 2000 if(pMinecraft != NULL && pMinecraft->localgameModes[iPad] != NULL ) 2001 { 2002 TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[iPad]; 2003 2004 // This just allows it to be shown 2005 gameMode->getTutorial()->showTutorialPopup(true); 2006 } 2007 2008 // update the rich presence 2009 // Are we offline or online, and how many players are there 2010 if(g_NetworkManager.GetPlayerCount()>1) 2011 { 2012 for(int i=0;i<XUSER_MAX_COUNT;i++) 2013 { 2014 if(pMinecraft->localplayers[i]) 2015 { 2016 if(g_NetworkManager.IsLocalGame()) 2017 { 2018 ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); 2019 } 2020 else 2021 { 2022 ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MULTIPLAYER,false); 2023 } 2024 } 2025 } 2026 } 2027 else 2028 { 2029 if(m_bGameStarted && pMinecraft->localplayers[idx]) 2030 { 2031 if(g_NetworkManager.IsLocalGame()) 2032 { 2033 ProfileManager.SetCurrentGameActivity(iPad,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); 2034 } 2035 else 2036 { 2037 ProfileManager.SetCurrentGameActivity(iPad,CONTEXT_PRESENCE_MULTIPLAYER_1P,false); 2038 } 2039 } 2040 } 2041 // because a player leaving can cause other players close scenes to be called, and they may have been crafting, I'll run 2042 // the presence update for all players 2043 2044 for(int i=0;i<XUSER_MAX_COUNT;i++) 2045 { 2046 if(pMinecraft->localplayers[i]) 2047 { 2048 pMinecraft->localplayers[i]->updateRichPresence(); 2049 } 2050 } 2051 2052 return hr; 2053} 2054 2055HRESULT CConsoleMinecraftApp::CloseAllPlayersXuiScenes() 2056{ 2057 HRESULT hr = S_OK; 2058 2059 // 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 2060 // We only hide them during a save, but this could be interrupted 2061 CXuiSceneBase::ShowOtherPlayersBaseScene(0, true); 2062 2063 for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) 2064 { 2065 CloseXuiScenes(idx, true); 2066 ReloadChatScene(idx, false, true); 2067 ReloadHudScene(idx, false, true); 2068 } 2069 2070 return hr; 2071} 2072 2073HRESULT CConsoleMinecraftApp::CloseXuiScenesAndNavigateToScene(int iPad,EUIScene eScene, void *initData, bool forceUsePad /*= false*/) 2074{ 2075 HRESULT hr; 2076 2077 int idx = 0; 2078 if( m_bGameStarted || forceUsePad) 2079 { 2080 // If the game isn't running treat as user 0, otherwise map index directly from pad 2081 if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad; 2082 } 2083 2084 hr=XuiSceneNavigateBackToFirst(m_hCurrentScene[idx],iPad); 2085 m_hCurrentScene[idx]=m_hFirstScene[idx]; 2086 m_sceneStack[idx].clear(); 2087 2088 CXuiSceneBase::ShowBackground(iPad, FALSE ); 2089 CXuiSceneBase::ShowDarkOverlay(iPad, FALSE ); 2090 CXuiSceneBase::ShowLogo(iPad, FALSE ); 2091 2092 m_bPauseMenuDisplayed[iPad] = false; 2093 m_bContainerMenuDisplayed[iPad] = false; 2094 m_bIgnoreAutosaveMenuDisplayed[iPad] = false; 2095 m_bIgnorePlayerJoinMenuDisplayed[iPad] = false; 2096 2097 ui.SetTooltips( iPad, -1, -1, -1, -1 ); 2098 SetMenuDisplayed(iPad,false); 2099 2100 NavigateToScene(iPad,eScene,initData); 2101 2102 return hr; 2103} 2104 2105HRESULT CConsoleMinecraftApp::RemoveBackScene(int iPad) 2106{ 2107 int idx = 0; 2108 if( m_bGameStarted) 2109 { 2110 // If the game isn't running treat as user 0, otherwise map index directly from pad 2111 if( ( iPad != 255 ) && ( iPad >= 0 ) ) idx = iPad; 2112 } 2113 2114 if( m_hCurrentScene[idx] != m_hFirstScene[idx] ) 2115 { 2116 HXUIOBJ hBack = XuiSceneGetBackScene(m_hCurrentScene[idx]); 2117 2118 if( hBack != m_hFirstScene[idx] ) 2119 { 2120 HXUIOBJ hNewBack = XuiSceneGetBackScene( hBack ); 2121 2122 if( hNewBack != m_hFirstScene[idx] ) 2123 { 2124 XuiSceneSetBackScene(m_hCurrentScene[idx], hNewBack); 2125 2126 for(auto it = m_sceneStack[idx].begin(), end = m_sceneStack[idx].end(); it != end; ++it) 2127 { 2128 if(it->second == hBack) 2129 { 2130 m_sceneStack[idx].erase(it); 2131 break; 2132 } 2133 } 2134 2135 XuiSceneSetBackScene(hBack, NULL); 2136 XuiDestroyObject( hBack ); 2137 } 2138 } 2139 } 2140 2141 return S_OK; 2142} 2143 2144HRESULT CConsoleMinecraftApp::NavigateToHomeMenu() 2145{ 2146 HRESULT hr = S_OK; 2147 2148 for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) 2149 { 2150 if( m_hFirstTutorialScene[idx] != m_hCurrentTutorialScene[idx] ) 2151 { 2152 XuiSceneNavigateBack(m_hCurrentTutorialScene[idx], m_hFirstTutorialScene[idx],XUSER_INDEX_ANY); 2153 m_hCurrentTutorialScene[idx] = m_hFirstTutorialScene[idx]; 2154 } 2155 } 2156 2157 hr = CloseAllPlayersXuiScenes(); 2158 2159 Minecraft *pMinecraft = Minecraft::GetInstance(); 2160 2161 // 4J-PB - just about to switched to the default texture pack , so clean up anything texture pack related here 2162 2163 // unload any texture pack audio 2164 // if there is audio in use, clear out the audio, and unmount the pack 2165 TexturePack *pTexPack=Minecraft::GetInstance()->skins->getSelected(); 2166 DLCTexturePack *pDLCTexPack=NULL; 2167 2168 if(pTexPack->hasAudio()) 2169 { 2170 // get the dlc texture pack, and store it 2171 pDLCTexPack=(DLCTexturePack *)pTexPack; 2172 } 2173 2174 // change to the default texture pack 2175 pMinecraft->skins->selectTexturePackById(TexturePackRepository::DEFAULT_TEXTURE_PACK_ID); 2176 2177 if(pTexPack->hasAudio()) 2178 { 2179 // need to stop the streaming audio - by playing streaming audio from the default texture pack now 2180 pMinecraft->soundEngine->playStreaming(L"", 0, 0, 0, 0, 0); 2181 2182 if(pDLCTexPack->m_pStreamedWaveBank!=NULL) 2183 { 2184 pDLCTexPack->m_pStreamedWaveBank->Destroy(); 2185 } 2186 if(pDLCTexPack->m_pSoundBank!=NULL) 2187 { 2188 pDLCTexPack->m_pSoundBank->Destroy(); 2189 } 2190 DWORD result = StorageManager.UnmountInstalledDLC("TPACK"); 2191 app.DebugPrintf("Unmount result is %d\n",result); 2192 } 2193 2194 g_NetworkManager.ForceFriendsSessionRefresh(); 2195 2196 hr = NavigateToScene(XUSER_INDEX_ANY,eUIScene_MainMenu,NULL); 2197 return hr; 2198} 2199 2200D3DXVECTOR3 CConsoleMinecraftApp::GetElementScreenPosition(HXUIOBJ hObj) 2201{ 2202 D3DXMATRIX matrix; 2203 D3DXVECTOR3 elementPosition; 2204 XuiElementGetFullXForm( hObj, &matrix); 2205 2206 elementPosition.x = matrix._41; 2207 elementPosition.y = matrix._42; 2208 elementPosition.z = matrix._43; 2209 2210 return elementPosition; 2211} 2212 2213void CConsoleMinecraftApp::SetChatTextDisplayed(int iPad, bool bVal) 2214{ 2215 XuiElementSetShow( m_hCurrentChatScene[iPad] ,bVal ); 2216} 2217 2218void CConsoleMinecraftApp::ReloadChatScene(int iPad, bool bJoining /*= false*/, bool bForce /*= false*/) 2219{ 2220 if(m_hFirstChatScene[iPad] == NULL || m_hCurrentChatScene[iPad] == NULL) return; 2221 2222 // Re-create the chat scene so it is the correct size. It starts without any visible lines. 2223 BOOL chatSceneVisible = FALSE; 2224 if( m_hFirstChatScene[iPad] != m_hCurrentChatScene[iPad] ) 2225 { 2226 chatSceneVisible = XuiElementIsShown(m_hCurrentChatScene[iPad]); 2227 } 2228 2229 int iLocalPlayerC=GetLocalPlayerCount(); 2230 // we need to decide whether to close the xui scene or just reposition it 2231 2232 if( bForce || 2233 (bJoining && iLocalPlayerC==2) || 2234 (!bJoining && iLocalPlayerC==1) || 2235 m_hFirstChatScene[iPad] == m_hCurrentChatScene[iPad]) 2236 { 2237 if( m_hFirstChatScene[iPad] != m_hCurrentChatScene[iPad] ) XuiSceneNavigateBack(m_hCurrentChatScene[iPad], m_hFirstChatScene[iPad],iPad); 2238 m_hCurrentChatScene[iPad] = m_hFirstChatScene[iPad]; 2239 app.NavigateToScene(iPad,eUIComponent_Chat,NULL,true); 2240 2241 XuiElementSetShow( m_hCurrentChatScene[iPad], chatSceneVisible); 2242 } 2243 2244 D3DXVECTOR3 vPosition; 2245 vPosition.x = vPosition.y = vPosition.z = 0.0f; 2246 2247 float textXOffset = 0; 2248 float sceneWidth = (float)Minecraft::GetInstance()->width; 2249 2250 // For 2-player splitscreen we need to move it around a bit 2251 switch( CXuiSceneBase::GetPlayerBasePosition(iPad) ) 2252 { 2253 case CXuiSceneBase::e_BaseScene_Top: 2254 case CXuiSceneBase::e_BaseScene_Bottom: 2255 { 2256 vPosition.x -= Minecraft::GetInstance()->width / 4; 2257 textXOffset = SAFEZONE_HALF_WIDTH; 2258 } 2259 break; 2260 case CXuiSceneBase::e_BaseScene_Left: 2261 textXOffset = SAFEZONE_HALF_WIDTH; 2262 case CXuiSceneBase::e_BaseScene_Right: 2263 vPosition.y += Minecraft::GetInstance()->height / 4; 2264 sceneWidth = XUI_BASE_SCENE_WIDTH_HALF; 2265 break; 2266 case CXuiSceneBase::e_BaseScene_Top_Left: 2267 textXOffset = SAFEZONE_HALF_WIDTH; 2268 sceneWidth = XUI_BASE_SCENE_WIDTH_HALF; 2269 break; 2270 case CXuiSceneBase::e_BaseScene_Top_Right: 2271 textXOffset = 0; 2272 sceneWidth = XUI_BASE_SCENE_WIDTH_HALF; 2273 break; 2274 case CXuiSceneBase::e_BaseScene_Bottom_Left: 2275 textXOffset = SAFEZONE_HALF_WIDTH; 2276 sceneWidth = XUI_BASE_SCENE_WIDTH_HALF; 2277 break; 2278 case CXuiSceneBase::e_BaseScene_Bottom_Right: 2279 textXOffset = 0; 2280 sceneWidth = XUI_BASE_SCENE_WIDTH_HALF; 2281 break; 2282 default: 2283 textXOffset = SAFEZONE_HALF_WIDTH; 2284 break; 2285 } 2286 float fWidth, fHeight; 2287 XuiElementGetBounds( m_hCurrentChatScene[iPad], &fWidth, &fHeight ); 2288 XuiElementSetBounds(m_hCurrentChatScene[iPad],sceneWidth, fHeight ); 2289 2290 CScene_Chat* chatScene; 2291 VOID *pObj; 2292 XuiObjectFromHandle( m_hCurrentChatScene[iPad], &pObj ); 2293 chatScene = (CScene_Chat *)pObj; 2294 chatScene->OffsetTextPosition( textXOffset ); 2295 2296 XuiElementSetPosition( m_hCurrentChatScene[iPad], &vPosition ); 2297} 2298 2299void CConsoleMinecraftApp::ReloadHudScene(int iPad, bool bJoining /*= false*/, bool bForce /*= false*/) 2300{ 2301 if(m_hFirstHudScene[iPad] == NULL || m_hCurrentHudScene[iPad] == NULL) return; 2302 2303 // Re-create the hud scene so it is the correct size. It starts without any visible lines. 2304 BOOL hudSceneVisible = FALSE; 2305 if( m_hFirstHudScene[iPad] != m_hCurrentHudScene[iPad] ) 2306 { 2307 hudSceneVisible = XuiElementIsShown(m_hCurrentHudScene[iPad]); 2308 } 2309 2310 int iLocalPlayerC=GetLocalPlayerCount(); 2311 // we need to decide whether to close the xui scene or just reposition it 2312 2313 if( bForce || 2314 (bJoining && iLocalPlayerC==2) || 2315 (!bJoining && iLocalPlayerC==1) || 2316 m_hFirstHudScene[iPad] == m_hCurrentHudScene[iPad]) 2317 { 2318 if( m_hFirstHudScene[iPad] != m_hCurrentHudScene[iPad] ) XuiSceneNavigateBack(m_hCurrentHudScene[iPad], m_hFirstHudScene[iPad],iPad); 2319 m_hCurrentHudScene[iPad] = m_hFirstHudScene[iPad]; 2320 app.NavigateToScene(iPad,eUIScene_HUD,NULL,true); 2321 2322 XuiElementSetShow( m_hCurrentHudScene[iPad], hudSceneVisible); 2323 } 2324} 2325 2326void CConsoleMinecraftApp::AdjustSplitscreenScene(HXUIOBJ hScene,D3DXVECTOR3 *pvOriginalPosition, int iPad, bool bAdjustXForSafeArea) 2327{ 2328 D3DXVECTOR3 vec; 2329 2330 Minecraft *pMinecraft = Minecraft::GetInstance(); 2331 2332 // store this for any change of screensection 2333 XuiElementGetPosition(hScene,pvOriginalPosition); 2334 vec=*pvOriginalPosition; 2335 2336 if( pMinecraft->localplayers[iPad] != NULL ) 2337 { 2338 switch( pMinecraft->localplayers[iPad]->m_iScreenSection) 2339 { 2340 case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: 2341 // move the scene down 2342 vec.y+=fSafeZoneY; 2343 break; 2344 case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: 2345 break; 2346 case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: 2347 break; 2348 case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: 2349 // move the scene left 2350 if(bAdjustXForSafeArea) vec.x-=fSafeZoneX; 2351 break; 2352 case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: 2353 // move the scene down 2354 vec.y+=fSafeZoneY; 2355 break; 2356 case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: 2357 // move the scene down 2358 vec.y+=fSafeZoneY; 2359 // move the scene left 2360 if(bAdjustXForSafeArea) vec.x-=fSafeZoneX; 2361 break; 2362 case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: 2363 break; 2364 case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: 2365 // move the scene left 2366 if(bAdjustXForSafeArea) vec.x-=fSafeZoneX; 2367 break; 2368 } 2369 } 2370 XuiElementSetPosition(hScene,&vec); 2371} 2372 2373void CConsoleMinecraftApp::AdjustSplitscreenScene(HXUIOBJ hScene,D3DXVECTOR3 *pvOriginalPosition, int iPad, float fXAdjust) 2374{ 2375 D3DXVECTOR3 vec; 2376 2377 Minecraft *pMinecraft = Minecraft::GetInstance(); 2378 2379 // store this for any change of screensection 2380 2381 XuiElementGetPosition(hScene,pvOriginalPosition); 2382 2383 vec=*pvOriginalPosition; 2384 2385 if( pMinecraft->localplayers[iPad] != NULL ) 2386 { 2387 switch( pMinecraft->localplayers[iPad]->m_iScreenSection) 2388 { 2389 case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: 2390 // move the scene down 2391 vec.y+=fSafeZoneY; 2392 // 4J-PB - don't adjust things in horizontal splitscreen 2393 //vec.x+=fXAdjust; 2394 break; 2395 case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: 2396 // 4J-PB - don't adjust things in horizontal splitscreen 2397 //vec.x+=fXAdjust; 2398 break; 2399 case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: 2400 vec.x+=fXAdjust; 2401 break; 2402 case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: 2403 // move the scene left 2404 vec.x-=fSafeZoneX-fXAdjust; 2405 break; 2406 case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: 2407 // move the scene down 2408 vec.y+=fSafeZoneY; 2409 vec.x+=fXAdjust; 2410 break; 2411 case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: 2412 // move the scene down 2413 vec.y+=fSafeZoneY; 2414 // move the scene left 2415 vec.x-=fSafeZoneX-fXAdjust; 2416 break; 2417 case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: 2418 vec.x+=fXAdjust; 2419 break; 2420 case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: 2421 // move the scene left 2422 vec.x-=fSafeZoneX-fXAdjust; 2423 break; 2424 } 2425 } 2426 2427 XuiElementSetPosition(hScene,&vec); 2428} 2429 2430HRESULT CConsoleMinecraftApp::AdjustSplitscreenScene_PlayerChanged(HXUIOBJ hScene,D3DXVECTOR3 *pvOriginalPosition, int iPad, bool bJoining, bool bAdjustXForSafeArea) 2431{ 2432 int iLocalPlayerC=GetLocalPlayerCount(); 2433 Minecraft *pMinecraft=Minecraft::GetInstance(); 2434 2435 // we need to decide whether to close the xui scene or just reposition it 2436 2437 if((bJoining && iLocalPlayerC==2) || 2438 (!bJoining && iLocalPlayerC==1)) 2439 { 2440 // 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. 2441 if(!IsSceneInStack(iPad,eUIScene_EndPoem)) 2442 { 2443 // close the scene! 2444 ui.SetTooltips(iPad, -1); 2445 // kill the xui 2446 ui.CloseUIScenes(iPad); 2447 } 2448 2449 // 4J Stu - Return S_FALSE to inidicate that the scene has been closed 2450 return S_FALSE; 2451 } 2452 else if ( pMinecraft->localplayers[iPad] != NULL ) 2453 { 2454 // we need to reposition the scenes since the players will have moved around 2455 2456 D3DXVECTOR3 vec=*pvOriginalPosition; 2457 2458 switch( pMinecraft->localplayers[iPad]->m_iScreenSection) 2459 { 2460 case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: 2461 // move the scene down 2462 vec.y+=fSafeZoneY; 2463 break; 2464 case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: 2465 break; 2466 case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: 2467 break; 2468 case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: 2469 // move the scene left 2470 if(bAdjustXForSafeArea) vec.x-=fSafeZoneX; 2471 break; 2472 case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: 2473 // move the scene down 2474 vec.y+=fSafeZoneY; 2475 break; 2476 case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: 2477 // move the scene down 2478 vec.y+=fSafeZoneY; 2479 // move the scene left 2480 if(bAdjustXForSafeArea) vec.x-=fSafeZoneX; 2481 break; 2482 case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: 2483 break; 2484 case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: 2485 // move the scene left 2486 if(bAdjustXForSafeArea) vec.x-=fSafeZoneX; 2487 break; 2488 } 2489 XuiElementSetPosition(hScene,&vec); 2490 } 2491 2492 return S_OK; 2493} 2494 2495HRESULT CConsoleMinecraftApp::AdjustSplitscreenScene_PlayerChanged(HXUIOBJ hScene,D3DXVECTOR3 *pvOriginalPosition, int iPad, bool bJoining, float fXAdjust) 2496{ 2497 int iLocalPlayerC=GetLocalPlayerCount(); 2498 Minecraft *pMinecraft=Minecraft::GetInstance(); 2499 2500 // we need to decide whether to close the xui scene or just reposition it 2501 2502 if((bJoining && iLocalPlayerC==2) || 2503 (!bJoining && iLocalPlayerC==1)) 2504 { 2505 // close the scene! 2506 ui.SetTooltips(iPad, -1); 2507 // kill the xui 2508 ui.CloseUIScenes(iPad); 2509 2510 // 4J Stu - Return S_FALSE to inidicate that the scene has been closed 2511 return S_FALSE; 2512 } 2513 else if ( pMinecraft->localplayers[iPad] != NULL ) 2514 { 2515 // we need to reposition the scenes since the players will have moved around 2516 2517 D3DXVECTOR3 vec=*pvOriginalPosition; 2518 2519 switch( pMinecraft->localplayers[iPad]->m_iScreenSection) 2520 { 2521 case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: 2522 // move the scene down 2523 vec.y+=fSafeZoneY; 2524 vec.x+=fXAdjust; 2525 break; 2526 case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: 2527 vec.x+=fXAdjust; 2528 break; 2529 case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: 2530 vec.x+=fXAdjust; 2531 break; 2532 case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: 2533 // move the scene left 2534 vec.x-=fSafeZoneX-fXAdjust; 2535 break; 2536 case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: 2537 // move the scene down 2538 vec.y+=fSafeZoneY; 2539 vec.x+=fXAdjust; 2540 break; 2541 case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: 2542 // move the scene down 2543 vec.y+=fSafeZoneY; 2544 // move the scene left 2545 vec.x-=fSafeZoneX-fXAdjust; 2546 break; 2547 case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: 2548 vec.x+=fXAdjust; 2549 break; 2550 case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: 2551 // move the scene left 2552 vec.x-=fSafeZoneX-fXAdjust; 2553 break; 2554 } 2555 XuiElementSetPosition(hScene,&vec); 2556 } 2557 2558 return S_OK; 2559} 2560 2561void CConsoleMinecraftApp::StoreLaunchData() 2562{ 2563 LD_DEMO* pDemoData = NULL; 2564 2565 2566 DWORD dwStatus = XGetLaunchDataSize( &m_dwLaunchDataSize ); 2567 if( dwStatus == ERROR_SUCCESS ) 2568 { 2569 m_pLaunchData = new BYTE [ m_dwLaunchDataSize ]; 2570 dwStatus = XGetLaunchData( m_pLaunchData, m_dwLaunchDataSize ); 2571 pDemoData = (LD_DEMO*)( m_pLaunchData ); 2572 if( pDemoData->dwID != LAUNCH_DATA_DEMO_ID ) 2573 { 2574 // custom launch data; must be handled separately 2575 } 2576 } 2577} 2578 2579void CConsoleMinecraftApp::ExitGame() 2580{ 2581 if(m_pLaunchData!=NULL) 2582 { 2583 LD_DEMO* pDemoData = (LD_DEMO*)( m_pLaunchData ); 2584 XSetLaunchData( pDemoData, m_dwLaunchDataSize ); 2585 XLaunchNewImage( pDemoData->szLauncherXEX, 0 ); 2586 } 2587 else 2588 { 2589 XLaunchNewImage( XLAUNCH_KEYWORD_DASH_ARCADE, 0 ); 2590 } 2591} 2592 2593////////////////////////////////////////////////////////////////////////// 2594// 2595// FatalLoadError 2596// 2597// This is called when we can't load one of the required files at startup 2598// It tends to mean the files have been corrupted. 2599// We have to assume that we've not been able to load the text for the game. 2600// 2601////////////////////////////////////////////////////////////////////////// 2602void CConsoleMinecraftApp::FatalLoadError(void) 2603{ 2604 XOVERLAPPED MessageBoxOverlap; 2605 2606 memset(&MessageBoxOverlap, 0, sizeof(MessageBoxOverlap)); 2607 2608 //HANDLE messageBoxThread = CreateThread(NULL, 0, &CMinecraftApp::ShowFatalLoadMessageBoxThreadProc, &MessageBoxOverlap, 0, NULL); 2609 // 2610 //WaitForSingleObjectEx(messageBoxThread, // handle to object 2611 // 20000, // time-out interval 2612 // FALSE // alertable option 2613 //); 2614 //XOVERLAPPED *MessageBoxOverlap = (XOVERLAPPED *)lpParameter; 2615 2616 wchar_t *aStrings[3]; 2617 LPCWSTR wszButtons[1]; 2618 2619 // IDS_FATAL_ERROR_TITLE 2620 // IDS_FATAL_ERROR_TEXT 2621 // IDS_EXIT_GAME 2622 2623 switch (XGetLanguage()) 2624 { 2625 case XC_LANGUAGE_GERMAN: 2626 aStrings[0] = L"Ladefehler"; 2627 aStrings[1] = L"Minecraft: Xbox 360 Edition konnte nicht geladen werden und kann daher nicht fortgesetzt werden."; 2628 aStrings[2] = L"Spiel verlassen"; 2629 break; 2630 case XC_LANGUAGE_SPANISH: 2631 aStrings[0] = L"Error al cargar"; 2632 aStrings[1] = L"Minecraft: Xbox 360 Edition ha experimentado un error al cargar y no puede continuar."; 2633 aStrings[2] = L"Salir del juego"; 2634 break; 2635 case XC_LANGUAGE_FRENCH: 2636 aStrings[0] = L"Échec du chargement"; 2637 aStrings[1] = L"Le chargement de Minecraft: Xbox 360 Edition a échoué : impossible de continuer."; 2638 aStrings[2] = L"Quitter le jeu"; 2639 break; 2640 case XC_LANGUAGE_ITALIAN: 2641 aStrings[0] = L"Errore caricamento"; 2642 aStrings[1] = L"Caricamento \"Minecraft: Xbox 360 Edition\" non riuscito, impossibile continuare."; 2643 aStrings[2] = L"Esci dal gioco"; 2644 break; 2645 case XC_LANGUAGE_JAPANESE: 2646 aStrings[0] = L"ロード エラー"; 2647 aStrings[1] = L"Minecraft Xbox 360 版のロードに失敗しました。続行できません"; 2648 aStrings[2] = L"ゲームを終了"; 2649 break; 2650 case XC_LANGUAGE_KOREAN: 2651 aStrings[0] = L"불러오기 오류"; 2652 aStrings[1] = L"Minecraft: Xbox 360 Edition을 불러오는 중에 오류가 발생하여 계속할 수 없습니다."; 2653 aStrings[2] = L"게임 나가기"; 2654 break; 2655 case XC_LANGUAGE_PORTUGUESE: 2656 if(XGetLocale()==XC_LOCALE_BRAZIL) 2657 { 2658 // Brazilian Portuguese 2659 aStrings[0] = L"Erro de carregamento"; 2660 aStrings[1] = L"\"Minecraft: Xbox 360 Edition\" falhou ao carregar e não é possível continuar."; 2661 aStrings[2] = L"Sair do Jogo"; 2662 } 2663 else 2664 { 2665 aStrings[0] = L"Erro de Carregamento"; 2666 aStrings[1] = L"Não foi possível carregar \"Minecraft: Edição Xbox 360\" e não é possível continuar."; 2667 aStrings[2] = L"Sair do Jogo"; 2668 } 2669 break; 2670 case XC_LANGUAGE_TCHINESE: 2671 aStrings[0] = L"載入錯誤"; 2672 aStrings[1] = L"無法載入 Minecraft: Xbox 360 Edition,因此無法繼續。"; 2673 aStrings[2] = L"離開遊戲"; 2674 break; 2675 default: 2676 aStrings[0] = L"Loading Error"; 2677 aStrings[1] = L"\"Minecraft: Xbox 360 Edition\" has failed to load, and cannot continue."; 2678 aStrings[2] = L"Exit Game"; 2679 break; 2680 } 2681 wszButtons[0] = aStrings[2]; 2682 2683 MESSAGEBOX_RESULT MessageResult; 2684 2685 while (XShowMessageBoxUI(XUSER_INDEX_ANY, aStrings[0], aStrings[1], 1, wszButtons, 0, XMB_ALERTICON, &MessageResult, &MessageBoxOverlap) == ERROR_ACCESS_DENIED) 2686 Sleep(250); 2687 while (!XHasOverlappedIoCompleted(&MessageBoxOverlap)) 2688 { 2689 RenderManager.SetClearColour(D3DCOLOR_RGBA(0,0,0,255)); 2690 RenderManager.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 2691 RenderManager.Present(); 2692 Sleep(250); 2693 } 2694 2695 ExitGame(); 2696} 2697 2698WCHAR *CConsoleMinecraftApp::wchExt[MAX_EXTENSION_TYPES]= 2699{ 2700 L"png", 2701 L"inf", 2702 L"dat", 2703}; 2704 2705int CConsoleMinecraftApp::GetLocalTMSFileIndex(WCHAR *wchTMSFile,bool bFilenameIncludesExtension,eFileExtensionType eEXT) 2706{ 2707 WCHAR wchTemp[ 256 ]; 2708 WCHAR wchInFile[ 256 ]; 2709 2710 if(bFilenameIncludesExtension) 2711 { 2712 swprintf(wchInFile, 256, L"%ls",wchTMSFile); 2713 } 2714 else 2715 { 2716 swprintf(wchInFile, 256, L"%ls.%ls",wchTMSFile,wchExt[eEXT]); 2717 } 2718 2719 for(int i=0;i<TMS_COUNT;i++) 2720 { 2721 swprintf(wchTemp, 256, L"%ls.%ls",TMSFileA[i].wchFilename,wchExt[TMSFileA[i].eEXT]); 2722 if(wcscmp(wchTemp,wchInFile)==0) 2723 { 2724 return i; 2725 } 2726 } 2727 2728 return -1; 2729} 2730 2731int CConsoleMinecraftApp::RetrieveTMSFileListIndex(WCHAR *wchTMSFile) 2732{ 2733 eFileExtensionType eEXT; 2734 WCHAR wTemp[256]; 2735 2736 int iIndex=0; 2737 // split the file name into name and extension 2738 while(wchTMSFile[iIndex]!=L'.') 2739 { 2740 wTemp[iIndex]=wchTMSFile[iIndex]; 2741 iIndex++; 2742 } 2743 wTemp[iIndex]=0; 2744 2745 for(int i=0;i<MAX_EXTENSION_TYPES;i++) 2746 { 2747 if(wcscmp(&wchTMSFile[iIndex+1],wchExt[i])==0) 2748 { 2749 eEXT=(eFileExtensionType)i; 2750 } 2751 } 2752 2753 return GetLocalTMSFileIndex(wTemp,false,eEXT); 2754} 2755 2756int CConsoleMinecraftApp::LoadLocalTMSFile(WCHAR *wchTMSFile, eFileExtensionType eExt) 2757{ 2758 WCHAR wcTemp[256]; 2759 2760 wsprintfW(wcTemp,L"%s.%s",wchTMSFile,wchExt[eExt]); 2761 return LoadLocalTMSFile(wcTemp); 2762} 2763 2764int CConsoleMinecraftApp::LoadLocalTMSFile(WCHAR *wchTMSFile) 2765{ 2766 const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string 2767 WCHAR szResourceLocator[ LOCATOR_SIZE ]; 2768 HRESULT hr; 2769 int iTMSFileIndex; 2770 2771 // split the file name into file and extension and find it in out tms file list 2772 2773 iTMSFileIndex=RetrieveTMSFileListIndex(wchTMSFile); 2774 2775 if(iTMSFileIndex!=-1) 2776 { 2777 // can we find the tms file in our xzp? 2778 if(TMSFileA[iTMSFileIndex].pbData==NULL) // if we haven't already loaded it 2779 { 2780 swprintf(szResourceLocator, LOCATOR_SIZE, L"%ls#TMSFiles/%ls",m_wchTMSXZP, wchTMSFile); 2781 2782 hr = XuiResourceLoadAllNoLoc(szResourceLocator, &TMSFileA[iTMSFileIndex].pbData, &TMSFileA[iTMSFileIndex].uiSize); 2783 } 2784 } 2785 2786 return iTMSFileIndex; 2787} 2788 2789 2790void CConsoleMinecraftApp::FreeLocalTMSFiles(eTMSFileType eType) 2791{ 2792 for(int i=0;i<TMS_COUNT;i++) 2793 { 2794 if((eType==eTMSFileType_All) ||(eType==TMSFileA[i].eTMSType)) 2795 { 2796 if(TMSFileA[i].pbData!=NULL) 2797 { 2798 XuiFree(TMSFileA[i].pbData); 2799 TMSFileA[i].pbData=NULL; 2800 TMSFileA[i].uiSize=0; 2801 } 2802 } 2803 } 2804} 2805 2806// 4J-PB - If any new DLC items are added to the TMSFiles, this array needs updated 2807TMS_FILE CConsoleMinecraftApp::TMSFileA[TMS_COUNT] = 2808{ 2809 // skin packs 2810 { L"SP1", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2811 { L"SP2", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2812 { L"SP3", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2813 { L"SP4", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2814 { L"SP5", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2815 { L"SP6", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2816 { L"SPF", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2817 { L"SPB", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2818 { L"SPC", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2819 { L"SPZ", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2820 { L"SPM", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2821 { L"SPI", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2822 { L"SPG", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2823 2824 //themes 2825 { L"ThSt", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2826 { L"ThIr", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2827 { L"ThGo", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2828 { L"ThDi", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2829 { L"ThAw", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0}, 2830 2831 //gamerpics 2832 { L"GPAn", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2833 { L"GPCo", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2834 { L"GPEn", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2835 { L"GPFo", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2836 { L"GPTo", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2837 { L"GPBA", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2838 { L"GPFa", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2839 { L"GPME", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2840 { L"GPMF", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2841 { L"GPMM", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2842 { L"GPSE", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2843 2844 { L"GPOr", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2845 { L"GPMi", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2846 { L"GPMB", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2847 { L"GPBr", eFileExtensionType_PNG , eTMSFileType_MinecraftStore, NULL, 0, 0}, 2848 2849 { L"GPM1", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0}, 2850 { L"GPM2", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0}, 2851 { L"GPM3", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0}, 2852 2853//avatar items 2854 { L"AH_0001", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2855 { L"AH_0002", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2856 { L"AH_0003", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2857 { L"AH_0004", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2858 { L"AH_0005", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2859 { L"AH_0006", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2860 { L"AH_0007", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2861 { L"AH_0008", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2862 { L"AH_0009", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2863 { L"AH_0010", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2864 { L"AH_0011", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2865 { L"AH_0012", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2866 { L"AH_0013", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2867 2868 { L"AT_0001", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2869 { L"AT_0002", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2870 { L"AT_0003", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2871 { L"AT_0004", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2872 { L"AT_0005", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2873 { L"AT_0006", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2874 { L"AT_0007", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2875 { L"AT_0008", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2876 { L"AT_0009", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2877 { L"AT_0010", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2878 { L"AT_0011", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2879 { L"AT_0012", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2880 { L"AT_0013", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2881 { L"AT_0014", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2882 { L"AT_0015", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2883 { L"AT_0016", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2884 { L"AT_0017", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2885 { L"AT_0018", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2886 { L"AT_0019", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2887 { L"AT_0020", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2888 { L"AT_0021", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2889 { L"AT_0022", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2890 { L"AT_0023", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2891 { L"AT_0024", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2892 { L"AT_0025", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2893 { L"AT_0026", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2894 2895 { L"AP_0001", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2896 { L"AP_0002", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2897 { L"AP_0003", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2898 { L"AP_0004", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2899 { L"AP_0005", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2900 { L"AP_0006", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2901 { L"AP_0007", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2902 { L"AP_0009", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2903 { L"AP_0010", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2904 { L"AP_0011", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2905 { L"AP_0012", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2906 { L"AP_0013", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2907 { L"AP_0014", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2908 { L"AP_0015", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2909 { L"AP_0016", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2910 { L"AP_0017", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2911 { L"AP_0018", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2912 2913 { L"AP_0019", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2914 { L"AP_0020", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2915 { L"AP_0021", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2916 { L"AP_0022", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2917 { L"AP_0023", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2918 { L"AP_0024", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2919 { L"AP_0025", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2920 { L"AP_0026", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2921 { L"AP_0027", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2922 { L"AP_0028", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2923 { L"AP_0029", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2924 { L"AP_0030", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2925 { L"AP_0031", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2926 { L"AP_0032", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2927 { L"AP_0033", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2928 2929 { L"AA_0001", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0 , 0 }, 2930 2931 // Mash-up Packs 2932 { L"MPMA", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2933 { L"MPMA", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 1024 }, 2934 { L"MPSR", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2935 { L"MPSR", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 1025 }, 2936 { L"MPHA", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2937 { L"MPHA", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 1026 }, 2938 2939 // Texture Packs 2940 { L"TP01", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2941 { L"TP01", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 2049 }, 2942 { L"TP02", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2943 { L"TP02", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 2053 }, 2944 { L"TP04", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2945 { L"TP04", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 2051 }, 2946 { L"TP05", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2947 { L"TP05", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 2054 }, 2948 { L"TP06", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2949 { L"TP06", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 2050 }, 2950 { L"TP07", eFileExtensionType_PNG, eTMSFileType_MinecraftStore, NULL, 0, 0 }, 2951 { L"TP07", eFileExtensionType_DAT, eTMSFileType_TexturePack, NULL, 0, 2055 }, 2952 2953}; 2954 2955#ifndef _CONTENT_PACKAGE 2956WCHAR CConsoleMinecraftApp::m_wchTMSXZP[] = L"file://game:/TMSFiles.xzp"; 2957#else 2958WCHAR CConsoleMinecraftApp::m_wchTMSXZP[] = L"file://UPDATE:/res/TMS/TMSFiles.xzp"; 2959#endif 2960 2961 2962void CConsoleMinecraftApp::GetFileFromTPD(eTPDFileType eType,PBYTE pbData,DWORD dwBytes,PBYTE *ppbData,DWORD *pdwBytes ) 2963{ 2964 PBYTE pbPos=pbData; 2965 // icon is the second thing in the file 2966 if(pbData && dwBytes>0) 2967 { 2968 //First is the language 2969 2970 unsigned int uiDecompSize=*(unsigned int *)pbPos; 2971 unsigned int uiCompSize=((unsigned int *)pbPos)[1]; 2972 2973 if(eType==eTPDFileType_Loc) 2974 { 2975 *pdwBytes= uiDecompSize; 2976 *ppbData = new BYTE [uiDecompSize]; 2977 2978 Compression::getCompression()->Decompress(*ppbData,(UINT *)pdwBytes,&((unsigned int *)pbPos)[2],uiCompSize); 2979 return; 2980 } 2981 else 2982 { 2983 // skip over the data 2984 pbPos=(PBYTE)&((unsigned int *)pbPos)[2]; 2985 pbPos+=uiCompSize; 2986 } 2987 2988 uiDecompSize=*(unsigned int *)pbPos; 2989 uiCompSize=((unsigned int *)pbPos)[1]; 2990 2991 // second is the icon 2992 if(eType==eTPDFileType_Icon) 2993 { 2994 *pdwBytes= uiDecompSize; 2995 *ppbData = new BYTE [uiDecompSize]; 2996 2997 Compression::getCompression()->Decompress(*ppbData,(UINT *)pdwBytes,&((unsigned int *)pbPos)[2],uiCompSize); 2998 return; 2999 } 3000 else 3001 { 3002 // skip over the data 3003 pbPos=(PBYTE)&((unsigned int *)pbPos)[2]; 3004 pbPos+=uiCompSize; 3005 } 3006 3007 uiDecompSize=*(unsigned int *)pbPos; 3008 uiCompSize=((unsigned int *)pbPos)[1]; 3009 3010 // third is the comparison 3011 if(eType==eTPDFileType_Comparison) 3012 { 3013 *pdwBytes= uiDecompSize; 3014 *ppbData = new BYTE [uiDecompSize]; 3015 3016 Compression::getCompression()->Decompress(*ppbData,(UINT *)pdwBytes,&((unsigned int *)pbPos)[2],uiCompSize); 3017 return; 3018 } 3019 } 3020 3021 return; 3022} 3023 3024 3025LPCWSTR CConsoleMinecraftApp::GetString(int iID) 3026{ 3027 return StringTable.Lookup(iID); 3028} 3029 3030CXuiStringTable *CConsoleMinecraftApp::GetStringTable() 3031{ 3032 return &StringTable; 3033}