the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
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}