the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "XUI_SkinSelect.h"
3#include "XUI_Ctrl_MinecraftSkinPreview.h"
4
5#define SKIN_SELECT_PACK_DEFAULT 0
6#define SKIN_SELECT_PACK_FAVORITES 1
7//#define SKIN_SELECT_PACK_PLAYER_CUSTOM 1
8#define SKIN_SELECT_MAX_DEFAULTS 2
9
10WCHAR *CScene_SkinSelect::wchDefaultNamesA[]=
11{
12 L"USE LOCALISED VERSION", // Server selected
13 L"Steve",
14 L"Tennis Steve",
15 L"Tuxedo Steve",
16 L"Athlete Steve",
17 L"Scottish Steve",
18 L"Prisoner Steve",
19 L"Cyclist Steve",
20 L"Boxer Steve",
21};
22
23
24//----------------------------------------------------------------------------------
25// Performs initialization tasks - retrieves controls.
26//----------------------------------------------------------------------------------
27HRESULT CScene_SkinSelect::OnInit( XUIMessageInit* pInitData, BOOL& bHandled )
28{
29 m_iPad=*(int *)pInitData->pvInitData;
30 // if we're not in the game, we need to use basescene 0
31 bool bNotInGame=(Minecraft::GetInstance()->level==NULL);
32 m_bIgnoreInput=false;
33
34 // 4J Stu - Added this so that we have skins loaded
35 // 4J-PB - Need to check for installed DLC
36 //if( (!app.DLCInstalled() || app.m_dlcManager.NeedsUpdated()) && !app.DLCInstallPending()) app.StartInstallDLCProcess(m_iPad);
37
38 // StartInstallDLCProcess will check for all conditions within the call
39 MapChildControls();
40
41 m_selectedText.SetText( app.GetString( IDS_SELECTED ) );
42
43 updateClipping();
44
45 m_packIndex = SKIN_SELECT_PACK_DEFAULT;
46 m_skinIndex = 0;
47 m_currentSkinPath = app.GetPlayerSkinName(m_iPad);
48 m_originalSkinId = app.GetPlayerSkinId(m_iPad);
49 m_currentPack = NULL;
50 m_bSlidingSkins = false;
51 m_bAnimatingMove = false;
52 currentPackCount = 0;
53
54 m_currentNavigation = eSkinNavigation_Skin;
55 m_normalTabs.SetShow( TRUE );
56 m_selectedTabs.SetShow( FALSE );
57 m_packLeft.SetEnable(FALSE);
58 m_packRight.SetEnable(FALSE);
59
60
61 for(BYTE i = 0; i < sidePreviewControls; ++i)
62 {
63 //m_previewNextControl->SetAutoRotate(true);
64 m_previewNextControls[i]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Left);
65 //m_previewPreviousControl->SetAutoRotate(true);
66 m_previewPreviousControls[i]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Right);
67 }
68
69 // block input if we're waiting for DLC to install. The end of dlc mounting custom message will fill the save list
70 if(app.StartInstallDLCProcess(m_iPad))
71 {
72 // DLC mounting in progress, so disable input
73 m_bIgnoreInput=true;
74 m_timer.SetShow( TRUE );
75 m_charactersGroup.SetShow( FALSE );
76 m_skinDetails.SetShow( FALSE );
77 m_imagePadlock.SetShow( FALSE );
78 m_selectedGroup.SetShow( FALSE );
79 }
80 else
81 {
82 m_timer.SetShow( FALSE );
83
84 if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin)>0)
85 {
86 // Change to display the favorites if there are any. The current skin will be in there (probably) - need to check for it
87 m_currentPack = app.m_dlcManager.getPackContainingSkin(m_currentSkinPath);
88 bool bFound;
89 if(m_currentPack != NULL)
90 {
91 m_packIndex = app.m_dlcManager.getPackIndex(m_currentPack,bFound,DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS;
92 }
93 }
94
95 // If we have any favourites, set this to the favourites
96 // first validate the favorite skins - we might have uninstalled the DLC needed for them
97 app.ValidateFavoriteSkins(m_iPad);
98
99 if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0)
100 {
101 m_packIndex = SKIN_SELECT_PACK_FAVORITES;
102 }
103
104 handlePackIndexChanged();
105 updateCurrentFocus();
106 }
107
108 // Display the tooltips
109
110 // if we're not in the game, we need to use basescene 0
111 if(bNotInGame)
112 {
113 ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE);
114 CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE );
115 }
116 else
117 {
118 ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE);
119 CXuiSceneBase::ShowBackground( m_iPad, FALSE );
120 CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE );
121 }
122
123
124 if(app.GetLocalPlayerCount()>1)
125 {
126 app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad, false);
127 CXuiSceneBase::ShowLogo( m_iPad, FALSE );
128 }
129 else
130 {
131 if(bNotInGame)
132 {
133 CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, FALSE );
134 }
135 else
136 {
137 CXuiSceneBase::ShowLogo( m_iPad, FALSE );
138 }
139 }
140
141 return S_OK;
142}
143
144
145HRESULT CScene_SkinSelect::OnKeyUp(XUIMessageInput* pInputData, BOOL& rfHandled)
146{
147 if(m_bIgnoreInput) return S_OK;
148
149 switch(pInputData->dwKeyCode)
150 {
151 case VK_PAD_RTHUMB_LEFT:
152 m_previewControl->m_incYRot = false;
153 break;
154 case VK_PAD_RTHUMB_RIGHT:
155 m_previewControl->m_decYRot = false;
156 break;
157 case VK_PAD_RTHUMB_UP:
158 //m_previewControl->m_incXRot = false;
159 break;
160 case VK_PAD_RTHUMB_DOWN:
161 //m_previewControl->m_decXRot = false;
162 break;
163 case VK_PAD_RTHUMB_UPLEFT:
164 m_previewControl->m_incYRot = false;
165 //m_previewControl->m_incXRot = false;
166 break;
167 case VK_PAD_RTHUMB_UPRIGHT:
168 m_previewControl->m_decYRot = false;
169 //m_previewControl->m_incXRot = false;
170 break;
171 case VK_PAD_RTHUMB_DOWNRIGHT:
172 m_previewControl->m_decYRot = false;
173 //m_previewControl->m_decXRot = false;
174 break;
175 case VK_PAD_RTHUMB_DOWNLEFT:
176 m_previewControl->m_incYRot = false;
177 //m_previewControl->m_decXRot = false;
178 break;
179 }
180 return S_OK;
181}
182
183
184HRESULT CScene_SkinSelect::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled)
185{
186 if(m_bIgnoreInput) return S_OK;
187
188 // 4J Stu - We don't want the press anim to play for the scrolling unless we are actually scrolling
189 //ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
190
191 // ignore any key press if we are animating a move
192 //if(m_bAnimatingMove) return S_OK;
193
194 HRESULT hr=S_OK;
195
196 // Explicitly handle B button presses
197 switch(pInputData->dwKeyCode)
198 {
199 case VK_PAD_A:
200 ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
201 // if the profile data has been changed, then force a profile write
202 // It seems we're allowed to break the 5 minute rule if it's the result of a user action
203 switch(m_packIndex)
204 {
205 case SKIN_SELECT_PACK_DEFAULT:
206 app.SetPlayerSkin(pInputData->UserIndex, m_skinIndex);
207 app.SetPlayerCape(pInputData->UserIndex, 0);
208 m_currentSkinPath = app.GetPlayerSkinName(m_iPad);
209 m_originalSkinId = app.GetPlayerSkinId(m_iPad);
210 m_selectedGroup.SetShow( TRUE );
211 CXuiSceneBase::PlayUISFX(eSFX_Press);
212 break;
213 case SKIN_SELECT_PACK_FAVORITES:
214 if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0)
215 {
216 // get the pack number from the skin id
217 wchar_t chars[256];
218 swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,m_skinIndex));
219
220 DLCPack *Pack=app.m_dlcManager.getPackContainingSkin(chars);
221
222 if(Pack)
223 {
224 DLCSkinFile *skinFile = Pack->getSkinFile(chars);
225 app.SetPlayerSkin(pInputData->UserIndex, skinFile->getPath());
226 app.SetPlayerCape(pInputData->UserIndex, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape));
227 m_selectedGroup.SetShow( TRUE );
228 m_currentSkinPath = app.GetPlayerSkinName(m_iPad);
229 m_originalSkinId = app.GetPlayerSkinId(m_iPad);
230 app.SetPlayerFavoriteSkinsPos(m_iPad,m_skinIndex);
231 }
232 }
233 break;
234 default:
235 if( m_currentPack != NULL )
236 {
237 DLCSkinFile *skinFile = m_currentPack->getSkinFile(m_skinIndex);
238
239 // Is this a free skin?
240
241 if(!skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ))
242 {
243 // do we have a license?
244 if(!m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, skinFile->getPath() ))
245 {
246 // no
247 UINT uiIDA[1];
248 uiIDA[0]=IDS_OK;
249
250 // We need to upsell the full version
251 if(ProfileManager.IsGuest(m_iPad))
252 {
253 // can't buy
254 StorageManager.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1);
255 }
256 // are we online?
257 else if(!ProfileManager.IsSignedInLive(pInputData->UserIndex))
258 {
259 // need to be signed in to live
260 StorageManager.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1);
261 }
262 else
263 {
264 // upsell
265
266 DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_currentPack->getPurchaseOfferId());
267 ULONGLONG ullOfferID_Full;
268
269 if(pDLCInfo!=NULL)
270 {
271 ullOfferID_Full=pDLCInfo->ullOfferID_Full;
272 }
273 else
274 {
275 ullOfferID_Full=m_currentPack->getPurchaseOfferId();
276 }
277
278 // tell sentient about the upsell of the full version of the skin pack
279 TelemetryManager->RecordUpsellPresented(pInputData->UserIndex, eSet_UpsellID_Skin_DLC, ullOfferID_Full & 0xFFFFFFFF);
280
281 UINT uiIDA[2];
282 uiIDA[0]=IDS_CONFIRM_OK;
283 uiIDA[1]=IDS_CONFIRM_CANCEL;
284
285 StorageManager.RequestMessageBox(IDS_UNLOCK_DLC_TITLE, IDS_UNLOCK_DLC_SKIN, uiIDA, 2, pInputData->UserIndex,&CScene_SkinSelect::UnlockSkinReturned,this,app.GetStringTable());
286 }
287 }
288 else
289 {
290 app.SetPlayerSkin(pInputData->UserIndex, skinFile->getPath());
291 app.SetPlayerCape(pInputData->UserIndex, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape));
292 m_selectedGroup.SetShow( TRUE );
293 m_currentSkinPath = app.GetPlayerSkinName(m_iPad);
294 m_originalSkinId = app.GetPlayerSkinId(m_iPad);
295
296 // push this onto the favorite list
297 AddFavoriteSkin(m_iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId));
298 }
299 }
300 else
301 {
302 app.SetPlayerSkin(pInputData->UserIndex, skinFile->getPath());
303 app.SetPlayerCape(pInputData->UserIndex, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape));
304 m_selectedGroup.SetShow( TRUE );
305 m_currentSkinPath = app.GetPlayerSkinName(m_iPad);
306 m_originalSkinId = app.GetPlayerSkinId(m_iPad);
307
308 // push this onto the favorite list
309 AddFavoriteSkin(m_iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId));
310
311 }
312 }
313
314 CXuiSceneBase::PlayUISFX(eSFX_Press);
315 break;
316 }
317
318 break;
319 case VK_PAD_B:
320 case VK_ESCAPE:
321 ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
322 app.CheckGameSettingsChanged(true,pInputData->UserIndex);
323
324 app.NavigateBack(pInputData->UserIndex);
325 rfHandled = TRUE;
326 break;
327#if 0
328 case VK_PAD_RSHOULDER:
329 {
330 DWORD startingIndex = m_packIndex;
331 m_packIndex = getNextPackIndex(m_packIndex);
332 if(startingIndex != m_packIndex)
333 {
334 handlePackIndexChanged();
335 }
336 }
337 break;
338 case VK_PAD_LSHOULDER:
339 {
340 DWORD startingIndex = m_packIndex;
341 m_packIndex = getPreviousPackIndex(m_packIndex);
342 if(startingIndex != m_packIndex)
343 {
344 handlePackIndexChanged();
345 }
346 }
347 break;
348#endif
349 case VK_PAD_DPAD_UP:
350 case VK_PAD_LTHUMB_UP:
351 case VK_PAD_DPAD_DOWN:
352 case VK_PAD_LTHUMB_DOWN:
353 {
354 if(m_packIndex==SKIN_SELECT_PACK_FAVORITES)
355 {
356 if(app.GetPlayerFavoriteSkinsCount(m_iPad)==0)
357 {
358 // ignore this, since there are no skins being displayed
359 break;
360 }
361 }
362
363 ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
364 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
365 switch(m_currentNavigation)
366 {
367 case eSkinNavigation_Pack:
368 m_currentNavigation = eSkinNavigation_Skin;
369 break;
370 case eSkinNavigation_Skin:
371 m_currentNavigation = eSkinNavigation_Pack;
372 break;
373 };
374 updateCurrentFocus();
375 }
376 break;
377 case VK_PAD_DPAD_LEFT:
378 case VK_PAD_LTHUMB_LEFT:
379 {
380 if( m_currentNavigation == eSkinNavigation_Skin )
381 {
382 if(!m_bAnimatingMove)
383 {
384 ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
385 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
386
387 m_skinIndex = getPreviousSkinIndex(m_skinIndex);
388 //handleSkinIndexChanged();
389
390 m_bSlidingSkins = true;
391 m_bAnimatingMove = true;
392
393 m_previewControl->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Left, true);
394 m_previewPreviousControls[0]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Forward, true);
395
396 int startFrame, endFrame;
397 HRESULT hr = m_charactersGroup.FindNamedFrame(L"CycleRight", &startFrame);
398 hr = m_charactersGroup.FindNamedFrame( L"EndCycleRight", &endFrame);
399 hr = m_charactersGroup.PlayTimeline(startFrame, startFrame,endFrame,FALSE,FALSE);
400 }
401 }
402 else if( m_currentNavigation == eSkinNavigation_Pack )
403 {
404 ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
405 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
406 DWORD startingIndex = m_packIndex;
407 m_packIndex = getPreviousPackIndex(m_packIndex);
408 if(startingIndex != m_packIndex)
409 {
410 handlePackIndexChanged();
411 }
412 }
413 }
414 break;
415 case VK_PAD_DPAD_RIGHT:
416 case VK_PAD_LTHUMB_RIGHT:
417 {
418 if( m_currentNavigation == eSkinNavigation_Skin )
419 {
420 if(!m_bAnimatingMove)
421 {
422 ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
423 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
424 m_skinIndex = getNextSkinIndex(m_skinIndex);
425 //handleSkinIndexChanged();
426
427 m_bSlidingSkins = true;
428 m_bAnimatingMove = true;
429
430 m_previewControl->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Right, true);
431 m_previewNextControls[0]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Forward, true);
432
433 int startFrame, endFrame;
434 HRESULT hr = m_charactersGroup.FindNamedFrame(L"CycleLeft", &startFrame);
435 hr = m_charactersGroup.FindNamedFrame( L"EndCycleLeft", &endFrame);
436 hr = m_charactersGroup.PlayTimeline(startFrame, startFrame,endFrame,FALSE,FALSE);
437 }
438 }
439 else if( m_currentNavigation == eSkinNavigation_Pack )
440 {
441 ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
442 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
443 DWORD startingIndex = m_packIndex;
444 m_packIndex = getNextPackIndex(m_packIndex);
445 if(startingIndex != m_packIndex)
446 {
447 handlePackIndexChanged();
448 }
449 }
450 }
451 break;
452 case VK_PAD_RTHUMB_PRESS:
453 CXuiSceneBase::PlayUISFX(eSFX_Press);
454 if( m_currentNavigation == eSkinNavigation_Skin )
455 {
456 m_previewControl->ResetRotation();
457 }
458 break;
459 case VK_PAD_RTHUMB_LEFT:
460 if( m_currentNavigation == eSkinNavigation_Skin )
461 {
462 m_previewControl->m_incYRot = true;
463 }
464 else
465 {
466 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
467 }
468 break;
469 case VK_PAD_RTHUMB_RIGHT:
470 if( m_currentNavigation == eSkinNavigation_Skin )
471 {
472 m_previewControl->m_decYRot = true;
473 }
474 else
475 {
476 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
477 }
478 break;
479 case VK_PAD_RTHUMB_UP:
480 if( m_currentNavigation == eSkinNavigation_Skin )
481 {
482 //m_previewControl->m_incXRot = true;
483 m_previewControl->CyclePreviousAnimation();
484 }
485 else
486 {
487 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
488 }
489 break;
490 case VK_PAD_RTHUMB_DOWN:
491 if( m_currentNavigation == eSkinNavigation_Skin )
492 {
493 //m_previewControl->m_decXRot = true;
494 m_previewControl->CycleNextAnimation();
495 }
496 else
497 {
498 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
499 }
500 break;
501 case VK_PAD_RTHUMB_UPLEFT:
502 if( m_currentNavigation == eSkinNavigation_Skin )
503 {
504 m_previewControl->m_incYRot = true;
505 //m_previewControl->m_incXRot = true;
506 }
507 else
508 {
509 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
510 }
511 break;
512 case VK_PAD_RTHUMB_UPRIGHT:
513 if( m_currentNavigation == eSkinNavigation_Skin )
514 {
515 m_previewControl->m_decYRot = true;
516 //m_previewControl->m_incXRot = true;
517 }
518 else
519 {
520 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
521 }
522 break;
523 case VK_PAD_RTHUMB_DOWNRIGHT:
524 if( m_currentNavigation == eSkinNavigation_Skin )
525 {
526 m_previewControl->m_decYRot = true;
527 //m_previewControl->m_decXRot = true;
528 }
529 else
530 {
531 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
532 }
533 break;
534 case VK_PAD_RTHUMB_DOWNLEFT:
535 if( m_currentNavigation == eSkinNavigation_Skin )
536 {
537 m_previewControl->m_incYRot = true;
538 //m_previewControl->m_decXRot = true;
539 }
540 else
541 {
542 CXuiSceneBase::PlayUISFX(eSFX_Scroll);
543 }
544 break;
545 }
546
547 return hr;
548}
549
550//----------------------------------------------------------------------------------
551// Handler for the button press message.
552//----------------------------------------------------------------------------------
553HRESULT CScene_SkinSelect::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled)
554{
555 if(m_bIgnoreInput) return S_OK;
556
557 // This assumes all buttons can only be pressed with the A button
558 ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A);
559
560 return S_OK;
561}
562
563HRESULT CScene_SkinSelect::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled )
564{
565 if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK;
566
567 if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO)
568 {
569
570 }
571
572 return S_OK;
573}
574
575HRESULT CScene_SkinSelect::OnTimelineEnd(HXUIOBJ hObjSource, BOOL& bHandled)
576{
577 if( hObjSource == m_charactersGroup )
578 {
579 if(m_bSlidingSkins)
580 {
581 m_bSlidingSkins = false;
582
583 int startFrame, endFrame;
584 HRESULT hr = m_charactersGroup.FindNamedFrame(L"Normal", &startFrame);
585 hr = m_charactersGroup.FindNamedFrame( L"Normal", &endFrame);
586 hr = m_charactersGroup.PlayTimeline(startFrame, startFrame,endFrame,FALSE,FALSE);
587 }
588 else
589 {
590 m_previewControl->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Forward, false);
591 m_previewNextControls[0]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Left, false);
592 m_previewPreviousControls[0]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Right, false);
593
594 handleSkinIndexChanged();
595
596 m_bAnimatingMove = false;
597
598 bHandled = TRUE;
599 }
600 }
601 return S_OK;
602}
603
604
605HRESULT CScene_SkinSelect::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled)
606{
607 bHandled=true;
608 return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining,false);
609}
610
611
612
613
614HRESULT CScene_SkinSelect::OnBasePositionChanged()
615{
616 updateClipping();
617
618 return S_OK;
619}
620
621void CScene_SkinSelect::handleSkinIndexChanged()
622{
623 BOOL showPrevious = FALSE, showNext = FALSE;
624 DWORD previousIndex = 0, nextIndex = 0;
625 wstring skinName = L"";
626 wstring skinOrigin = L"";
627 bool bSkinIsFree=false;
628 bool bLicensed=false;
629 DLCSkinFile *skinFile=NULL;
630 DLCPack *Pack=NULL;
631 BYTE sidePreviewControlsL,sidePreviewControlsR;
632 bool bNoSkinsToShow=false;
633
634 TEXTURE_NAME backupTexture = TN_MOB_CHAR;
635 m_selectedGroup.SetShow( FALSE );
636 m_skinDetails.SetShow( FALSE );
637
638 if( m_currentPack != NULL )
639 {
640 skinFile = m_currentPack->getSkinFile(m_skinIndex);
641 m_selectedSkinPath = skinFile->getPath();
642 m_selectedCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape);
643 m_vAdditionalSkinBoxes = skinFile->getAdditionalBoxes();
644
645 skinName = skinFile->getParameterAsString( DLCManager::e_DLCParamType_DisplayName );
646 skinOrigin = skinFile->getParameterAsString( DLCManager::e_DLCParamType_ThemeName );
647
648 if( m_selectedSkinPath.compare( m_currentSkinPath ) == 0 )
649 {
650 m_selectedGroup.SetShow( TRUE );
651 }
652 else
653 {
654 m_selectedGroup.SetShow( FALSE );
655 }
656
657 bSkinIsFree = skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free );
658 bLicensed = m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, m_selectedSkinPath );
659
660 m_imagePadlock.SetShow( (bSkinIsFree || bLicensed) ?FALSE:TRUE );
661 m_previewControl->SetShow(TRUE);
662 m_skinDetails.SetShow( TRUE );
663 }
664 else
665 {
666 m_selectedSkinPath = L"";
667 m_selectedCapePath = L"";
668 m_vAdditionalSkinBoxes = NULL;
669
670 switch(m_packIndex)
671 {
672 case SKIN_SELECT_PACK_DEFAULT:
673 backupTexture = getTextureId(m_skinIndex);
674
675 if( m_skinIndex == eDefaultSkins_ServerSelected )
676 {
677 skinName = app.GetString(IDS_DEFAULT_SKINS);
678 }
679 else
680 {
681 skinName = wchDefaultNamesA[m_skinIndex];
682 }
683
684 if( m_originalSkinId == m_skinIndex )
685 {
686 m_selectedGroup.SetShow( TRUE );
687 }
688 else
689 {
690 m_selectedGroup.SetShow( FALSE );
691 }
692 m_imagePadlock.SetShow( FALSE );
693 m_previewControl->SetShow(TRUE);
694 m_skinDetails.SetShow( TRUE );
695
696 break;
697 case SKIN_SELECT_PACK_FAVORITES:
698
699 if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0)
700 {
701 // get the pack number from the skin id
702 wchar_t chars[256];
703 swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,m_skinIndex));
704
705 Pack=app.m_dlcManager.getPackContainingSkin(chars);
706 if(Pack)
707 {
708 skinFile = Pack->getSkinFile(chars);
709
710 m_selectedSkinPath = skinFile->getPath();
711 m_selectedCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape);
712 m_vAdditionalSkinBoxes = skinFile->getAdditionalBoxes();
713
714 skinName = skinFile->getParameterAsString( DLCManager::e_DLCParamType_DisplayName );
715 skinOrigin = skinFile->getParameterAsString( DLCManager::e_DLCParamType_ThemeName );
716
717 if( m_selectedSkinPath.compare( m_currentSkinPath ) == 0 )
718 {
719 m_selectedGroup.SetShow( TRUE );
720 }
721 else
722 {
723 m_selectedGroup.SetShow( FALSE );
724 }
725
726 bSkinIsFree = skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free );
727 bLicensed = Pack->hasPurchasedFile( DLCManager::e_DLCType_Skin, m_selectedSkinPath );
728
729 m_imagePadlock.SetShow( (bSkinIsFree || bLicensed) ?FALSE:TRUE );
730 m_skinDetails.SetShow( TRUE );
731 }
732 else
733 {
734 m_selectedGroup.SetShow( FALSE );
735 m_imagePadlock.SetShow( FALSE );
736 }
737 }
738 else
739 {
740 //disable the display
741 m_previewControl->SetShow(FALSE);
742 // change the tooltips
743 bNoSkinsToShow=true;
744 }
745 break;
746
747 }
748 }
749 m_text.SetText(skinName.c_str());
750 m_originText.SetText(skinOrigin.c_str());
751
752 if(m_vAdditionalSkinBoxes && m_vAdditionalSkinBoxes->size()!=0)
753 {
754 // add the boxes to the humanoid model, but only if we've not done this already
755 vector<ModelPart *> *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID());
756 if(pAdditionalModelParts==NULL)
757 {
758 pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),m_vAdditionalSkinBoxes);
759 }
760 }
761
762 if(skinFile!=NULL)
763 {
764 app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask());
765 }
766
767 m_previewControl->SetTexture(m_selectedSkinPath, backupTexture);
768 m_previewControl->SetCapeTexture(m_selectedCapePath);
769
770 showNext = TRUE;
771 showPrevious = TRUE;
772 nextIndex = getNextSkinIndex(m_skinIndex);
773 previousIndex = getPreviousSkinIndex(m_skinIndex);
774
775 wstring otherSkinPath = L"";
776 wstring otherCapePath = L"";
777 vector<SKIN_BOX *> *othervAdditionalSkinBoxes=NULL;
778 wchar_t chars[256];
779
780 // turn off all displays
781 for(BYTE i = 0; i < sidePreviewControls; ++i)
782 {
783 m_previewNextControls[i]->SetShow(FALSE);
784 m_previewPreviousControls[i]->SetShow(FALSE);
785 }
786
787 unsigned int uiCurrentFavoriteC=app.GetPlayerFavoriteSkinsCount(m_iPad);
788
789 if(m_packIndex==SKIN_SELECT_PACK_FAVORITES)
790 {
791 // might not be enough to cycle through
792 if(uiCurrentFavoriteC<((sidePreviewControls*2)+1))
793 {
794 if(uiCurrentFavoriteC==0)
795 {
796 sidePreviewControlsL=sidePreviewControlsR=0;
797 }
798 // might be an odd number
799 else if((uiCurrentFavoriteC-1)%2==1)
800 {
801 sidePreviewControlsL=1+(uiCurrentFavoriteC-1)/2;
802 sidePreviewControlsR=(uiCurrentFavoriteC-1)/2;
803 }
804 else
805 {
806 sidePreviewControlsL=sidePreviewControlsR=(uiCurrentFavoriteC-1)/2;
807 }
808 }
809 else
810 {
811 sidePreviewControlsL=sidePreviewControlsR=sidePreviewControls;
812 }
813 }
814 else
815 {
816 sidePreviewControlsL=sidePreviewControlsR=sidePreviewControls;
817 }
818
819 for(BYTE i = 0; i < sidePreviewControlsR; ++i)
820 {
821 if(showNext)
822 {
823 skinFile=NULL;
824 m_previewNextControls[i]->SetShow(TRUE);
825
826 if( m_currentPack != NULL )
827 {
828 skinFile = m_currentPack->getSkinFile(nextIndex);
829 otherSkinPath = skinFile->getPath();
830 otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape);
831 othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes();
832 backupTexture = TN_MOB_CHAR;
833 }
834 else
835 {
836 otherSkinPath = L"";
837 otherCapePath = L"";
838 othervAdditionalSkinBoxes=NULL;
839 switch(m_packIndex)
840 {
841 case SKIN_SELECT_PACK_DEFAULT:
842 backupTexture = getTextureId(nextIndex);
843 break;
844 case SKIN_SELECT_PACK_FAVORITES:
845 if(uiCurrentFavoriteC>0)
846 {
847 // get the pack number from the skin id
848 swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,nextIndex));
849
850 Pack=app.m_dlcManager.getPackContainingSkin(chars);
851 if(Pack)
852 {
853 skinFile = Pack->getSkinFile(chars);
854
855 otherSkinPath = skinFile->getPath();
856 otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape);
857 othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes();
858 backupTexture = TN_MOB_CHAR;
859 }
860 }
861 break;
862 default:
863 break;
864 }
865
866 }
867 if(othervAdditionalSkinBoxes && othervAdditionalSkinBoxes->size()!=0)
868 {
869 vector<ModelPart *> *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID());
870 if(pAdditionalModelParts==NULL)
871 {
872 pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),othervAdditionalSkinBoxes);
873 }
874 }
875 // 4J-PB - anim override needs set before SetTexture
876 if(skinFile!=NULL)
877 {
878 app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask());
879 }
880 m_previewNextControls[i]->SetTexture(otherSkinPath, backupTexture);
881 m_previewNextControls[i]->SetCapeTexture(otherCapePath);
882
883
884 }
885
886 nextIndex = getNextSkinIndex(nextIndex);
887 }
888
889
890
891 for(BYTE i = 0; i < sidePreviewControlsL; ++i)
892 {
893 if(showPrevious)
894 {
895 skinFile=NULL;
896 m_previewPreviousControls[i]->SetShow(TRUE);
897
898 if( m_currentPack != NULL )
899 {
900 skinFile = m_currentPack->getSkinFile(previousIndex);
901 otherSkinPath = skinFile->getPath();
902 otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape);
903 othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes();
904 backupTexture = TN_MOB_CHAR;
905 }
906 else
907 {
908 otherSkinPath = L"";
909 otherCapePath = L"";
910 othervAdditionalSkinBoxes=NULL;
911 switch(m_packIndex)
912 {
913 case SKIN_SELECT_PACK_DEFAULT:
914 backupTexture = getTextureId(previousIndex);
915 break;
916 case SKIN_SELECT_PACK_FAVORITES:
917 if(uiCurrentFavoriteC>0)
918 {
919 // get the pack number from the skin id
920 swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,previousIndex));
921
922 Pack=app.m_dlcManager.getPackContainingSkin(chars);
923 if(Pack)
924 {
925 skinFile = Pack->getSkinFile(chars);
926
927 otherSkinPath = skinFile->getPath();
928 otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape);
929 othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes();
930 backupTexture = TN_MOB_CHAR;
931 }
932 }
933
934 break;
935 default:
936 break;
937 }
938 }
939 if(othervAdditionalSkinBoxes && othervAdditionalSkinBoxes->size()!=0)
940 {
941 vector<ModelPart *> *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID());
942 if(pAdditionalModelParts==NULL)
943 {
944 pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),othervAdditionalSkinBoxes);
945 }
946 }
947 // 4J-PB - anim override needs set before SetTexture
948 if(skinFile)
949 {
950 app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask());
951 }
952 m_previewPreviousControls[i]->SetTexture(otherSkinPath, backupTexture);
953 m_previewPreviousControls[i]->SetCapeTexture(otherCapePath);
954 }
955
956 previousIndex = getPreviousSkinIndex(previousIndex);
957 }
958
959 // update the tooltips
960 bool bNotInGame=(Minecraft::GetInstance()->level==NULL);
961
962 if(bNoSkinsToShow)
963 {
964 if(bNotInGame)
965 {
966 ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE);
967 CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE );
968 }
969 else
970 {
971 ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE);
972 CXuiSceneBase::ShowBackground( m_iPad, FALSE );
973 CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE );
974 }
975
976 }
977 else
978 {
979 if(bNotInGame)
980 {
981 ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE);
982 CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE );
983 }
984 else
985 {
986 ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE);
987 CXuiSceneBase::ShowBackground( m_iPad, FALSE );
988 CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE );
989 }
990
991 }
992
993 updateCurrentFocus();
994}
995
996void CScene_SkinSelect::handlePackIndexChanged()
997{
998 if(m_packIndex >= SKIN_SELECT_MAX_DEFAULTS)
999 {
1000 m_currentPack = app.m_dlcManager.getPack(m_packIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin);
1001 }
1002 else
1003 {
1004 m_currentPack = NULL;
1005 }
1006 m_skinIndex = 0;
1007 if(m_currentPack != NULL)
1008 {
1009 bool found;
1010 DWORD currentSkinIndex = m_currentPack->getSkinIndexAt(m_currentSkinPath, found);
1011 if(found) m_skinIndex = currentSkinIndex;
1012 }
1013 else
1014 {
1015 switch(m_packIndex)
1016 {
1017 case SKIN_SELECT_PACK_DEFAULT:
1018 if( !GET_IS_DLC_SKIN_FROM_BITMASK(m_originalSkinId) )
1019 {
1020 DWORD ugcSkinIndex = GET_UGC_SKIN_ID_FROM_BITMASK(m_originalSkinId);
1021 DWORD defaultSkinIndex = GET_DEFAULT_SKIN_ID_FROM_BITMASK(m_originalSkinId);
1022 if( ugcSkinIndex == 0 )
1023 {
1024 m_skinIndex = (EDefaultSkins) defaultSkinIndex;
1025 }
1026 }
1027 break;
1028 case SKIN_SELECT_PACK_FAVORITES:
1029 if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0)
1030 {
1031 bool found;
1032 wchar_t chars[256];
1033 // get the pack number from the skin id
1034 swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,app.GetPlayerFavoriteSkinsPos(m_iPad)));
1035
1036 DLCPack *Pack=app.m_dlcManager.getPackContainingSkin(chars);
1037 if(Pack)
1038 {
1039 DWORD currentSkinIndex = Pack->getSkinIndexAt(m_currentSkinPath, found);
1040 if(found) m_skinIndex = app.GetPlayerFavoriteSkinsPos(m_iPad);
1041 }
1042 }
1043 break;
1044 default:
1045 break;
1046 }
1047 }
1048 handleSkinIndexChanged();
1049 updatePackDisplay();
1050}
1051
1052void CScene_SkinSelect::updatePackDisplay()
1053{
1054 currentPackCount = app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS;
1055
1056 m_packLeft.SetShow(TRUE);
1057 m_packRight.SetShow(TRUE);
1058
1059 if(m_packIndex >= SKIN_SELECT_MAX_DEFAULTS)
1060 {
1061 DLCPack *thisPack = app.m_dlcManager.getPack(m_packIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin);
1062 m_packCenter.SetText(thisPack->getName().c_str());
1063 }
1064 else
1065 {
1066 switch(m_packIndex)
1067 {
1068 case SKIN_SELECT_PACK_DEFAULT:
1069 m_packCenter.SetText(app.GetString(IDS_NO_SKIN_PACK));
1070 break;
1071 case SKIN_SELECT_PACK_FAVORITES:
1072 m_packCenter.SetText(app.GetString(IDS_FAVORITES_SKIN_PACK));
1073 break;
1074 }
1075 }
1076
1077 int nextPackIndex = getNextPackIndex(m_packIndex);
1078 if(nextPackIndex >= SKIN_SELECT_MAX_DEFAULTS)
1079 {
1080 DLCPack *thisPack = app.m_dlcManager.getPack(nextPackIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin);
1081 m_packRight.SetText(thisPack->getName().c_str());
1082 }
1083 else
1084 {
1085 switch(nextPackIndex)
1086 {
1087 case SKIN_SELECT_PACK_DEFAULT:
1088 m_packRight.SetText(app.GetString(IDS_NO_SKIN_PACK));
1089 break;
1090 case SKIN_SELECT_PACK_FAVORITES:
1091 m_packRight.SetText(app.GetString(IDS_FAVORITES_SKIN_PACK));
1092 break;
1093 }
1094 }
1095
1096 int previousPackIndex = getPreviousPackIndex(m_packIndex);
1097 if(previousPackIndex >= SKIN_SELECT_MAX_DEFAULTS)
1098 {
1099 DLCPack *thisPack = app.m_dlcManager.getPack(previousPackIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin);
1100 m_packLeft.SetText(thisPack->getName().c_str());
1101 }
1102 else
1103 {
1104 switch(previousPackIndex)
1105 {
1106 case SKIN_SELECT_PACK_DEFAULT:
1107 m_packLeft.SetText(app.GetString(IDS_NO_SKIN_PACK));
1108 break;
1109 case SKIN_SELECT_PACK_FAVORITES:
1110 m_packLeft.SetText(app.GetString(IDS_FAVORITES_SKIN_PACK));
1111 break;
1112 }
1113 }
1114
1115}
1116
1117void CScene_SkinSelect::updateCurrentFocus()
1118{
1119 XUITimeline *timeline;
1120 XUINamedFrame *startFrame;
1121 XuiElementGetTimeline( m_skinDetails.m_hObj, &timeline);
1122 switch(m_currentNavigation)
1123 {
1124 case eSkinNavigation_Pack:
1125 XuiElementSetUserFocus( m_packCenter.m_hObj, m_iPad );
1126 startFrame = timeline->FindNamedFrame( L"Unselected" );
1127 m_normalTabs.SetShow( FALSE );
1128 m_selectedTabs.SetShow( TRUE );
1129 m_packLeft.SetEnable(TRUE);
1130 m_packRight.SetEnable(TRUE);
1131 break;
1132 case eSkinNavigation_Skin:
1133 XuiElementSetUserFocus( m_skinDetails.m_hObj, m_iPad );
1134 startFrame = timeline->FindNamedFrame( L"Selected" );
1135 m_normalTabs.SetShow( TRUE );
1136 m_selectedTabs.SetShow( FALSE );
1137 m_packLeft.SetEnable(FALSE);
1138 m_packRight.SetEnable(FALSE);
1139 break;
1140 };
1141 timeline->Play( startFrame->m_dwFrame, startFrame->m_dwFrame, startFrame->m_dwFrame, FALSE, FALSE );
1142}
1143
1144TEXTURE_NAME CScene_SkinSelect::getTextureId(int skinIndex)
1145{
1146 TEXTURE_NAME texture = TN_MOB_CHAR;
1147 switch(skinIndex)
1148 {
1149 case eDefaultSkins_ServerSelected:
1150 case eDefaultSkins_Skin0:
1151 texture = TN_MOB_CHAR;
1152 break;
1153 case eDefaultSkins_Skin1:
1154 texture = TN_MOB_CHAR1;
1155 break;
1156 case eDefaultSkins_Skin2:
1157 texture = TN_MOB_CHAR2;
1158 break;
1159 case eDefaultSkins_Skin3:
1160 texture = TN_MOB_CHAR3;
1161 break;
1162 case eDefaultSkins_Skin4:
1163 texture = TN_MOB_CHAR4;
1164 break;
1165 case eDefaultSkins_Skin5:
1166 texture = TN_MOB_CHAR5;
1167 break;
1168 case eDefaultSkins_Skin6:
1169 texture = TN_MOB_CHAR6;
1170 break;
1171 case eDefaultSkins_Skin7:
1172 texture = TN_MOB_CHAR7;
1173 break;
1174 };
1175
1176 return texture;
1177}
1178
1179int CScene_SkinSelect::getNextSkinIndex(DWORD sourceIndex)
1180{
1181 int nextSkin = sourceIndex;
1182
1183 // special case for favourites
1184 switch(m_packIndex)
1185 {
1186
1187 case SKIN_SELECT_PACK_FAVORITES:
1188 ++nextSkin;
1189 if(nextSkin>=app.GetPlayerFavoriteSkinsCount(m_iPad))
1190 {
1191 nextSkin=0;
1192 }
1193
1194 break;
1195 default:
1196 ++nextSkin;
1197
1198 if(m_packIndex == SKIN_SELECT_PACK_DEFAULT && nextSkin >= eDefaultSkins_Count)
1199 {
1200 nextSkin = eDefaultSkins_ServerSelected;
1201 }
1202 else if(m_currentPack != NULL && nextSkin>=m_currentPack->getSkinCount())
1203 {
1204 nextSkin = 0;
1205 }
1206 break;
1207 }
1208
1209
1210 return nextSkin;
1211}
1212
1213int CScene_SkinSelect::getPreviousSkinIndex(DWORD sourceIndex)
1214{
1215 int previousSkin = sourceIndex;
1216 switch(m_packIndex)
1217 {
1218
1219 case SKIN_SELECT_PACK_FAVORITES:
1220 if(previousSkin==0)
1221 {
1222 previousSkin = app.GetPlayerFavoriteSkinsCount(m_iPad) - 1;
1223 }
1224 else
1225 {
1226 --previousSkin;
1227 }
1228 break;
1229 default:
1230 if(previousSkin==0)
1231 {
1232 if(m_packIndex == SKIN_SELECT_PACK_DEFAULT)
1233 {
1234 previousSkin = eDefaultSkins_Count - 1;
1235 }
1236 else if(m_currentPack != NULL)
1237 {
1238 previousSkin = m_currentPack->getSkinCount()-1;
1239 }
1240 }
1241 else
1242 {
1243 --previousSkin;
1244 }
1245 break;
1246 }
1247
1248
1249 return previousSkin;
1250}
1251
1252int CScene_SkinSelect::getNextPackIndex(DWORD sourceIndex)
1253{
1254 int nextPack = sourceIndex;
1255 ++nextPack;
1256 if(nextPack > app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) - 1 + SKIN_SELECT_MAX_DEFAULTS)
1257 {
1258 nextPack = SKIN_SELECT_PACK_DEFAULT;
1259 }
1260
1261 return nextPack;
1262}
1263
1264int CScene_SkinSelect::getPreviousPackIndex(DWORD sourceIndex)
1265{
1266 int previousPack = sourceIndex;
1267 if(previousPack == SKIN_SELECT_PACK_DEFAULT)
1268 {
1269 if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) > 0)
1270 {
1271 previousPack = app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) - 1 + SKIN_SELECT_MAX_DEFAULTS;
1272 }
1273 else
1274 {
1275 previousPack = SKIN_SELECT_MAX_DEFAULTS - 1;
1276 }
1277 }
1278 else
1279 {
1280 --previousPack;
1281 }
1282
1283 return previousPack;
1284}
1285
1286void CScene_SkinSelect::updateClipping()
1287{
1288 DWORD dwPropertyId;
1289 XUIElementPropVal propertyVal;
1290 propertyVal.Clear();
1291 HRESULT hr = XuiObjectGetPropertyId( m_charactersGroup.m_hObj, L"ClipChildren", &dwPropertyId);
1292 switch( CXuiSceneBase::GetPlayerBasePosition(m_iPad) )
1293 {
1294 case CXuiSceneBase::e_BaseScene_Left:
1295 case CXuiSceneBase::e_BaseScene_Right:
1296 case CXuiSceneBase::e_BaseScene_Top_Left:
1297 case CXuiSceneBase::e_BaseScene_Top_Right:
1298 case CXuiSceneBase::e_BaseScene_Bottom_Left:
1299 case CXuiSceneBase::e_BaseScene_Bottom_Right:
1300 case CXuiSceneBase::e_BaseScene_Top:
1301 case CXuiSceneBase::e_BaseScene_Bottom:
1302 propertyVal.SetBoolVal(TRUE);
1303 break;
1304 case CXuiSceneBase::e_BaseScene_Fullscreen:
1305 default:
1306 propertyVal.SetBoolVal(FALSE);
1307 break;
1308 };
1309 hr = XuiObjectSetProperty(m_charactersGroup.m_hObj,dwPropertyId,0,&propertyVal);
1310}
1311
1312int CScene_SkinSelect::UnlockSkinReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
1313{
1314 CScene_SkinSelect* pScene = (CScene_SkinSelect*)pParam;
1315#ifdef _XBOX
1316 if(result==C4JStorage::EMessage_ResultAccept)
1317 {
1318 if(ProfileManager.IsSignedIn(iPad))
1319 {
1320 ULONGLONG ullIndexA[1];
1321 DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(pScene->m_currentPack->getPurchaseOfferId());
1322
1323 if(pDLCInfo!=NULL)
1324 {
1325 ullIndexA[0]=pDLCInfo->ullOfferID_Full;
1326 }
1327 else
1328 {
1329 ullIndexA[0]=pScene->m_currentPack->getPurchaseOfferId();
1330 }
1331
1332 // If we're in-game, then we need to enable DLC downloads. They'll be set back to Auto on leaving the pause menu
1333 if(Minecraft::GetInstance()->level!=NULL)
1334 {
1335 // need to allow downloads here, or the player would need to quit the game to let the download of a skin pack happen. This might affect the network traffic, since the download could take all the bandwidth...
1336 XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW);
1337 }
1338
1339 StorageManager.InstallOffer(1,ullIndexA,NULL,NULL);
1340
1341 // the license change coming in when the offer has been installed will cause this scene to refresh
1342 }
1343 }
1344 else
1345 {
1346 TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Skin_DLC, ( pScene->m_currentPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined);
1347 }
1348#endif
1349 return 0;
1350}
1351
1352HRESULT CScene_SkinSelect::OnCustomMessage_DLCInstalled()
1353{
1354 // mounted DLC may have changed
1355 if(app.StartInstallDLCProcess(m_iPad)==false)
1356 {
1357 // not doing a mount, so re-enable input
1358 m_bIgnoreInput=false;
1359 }
1360 else
1361 {
1362 m_bIgnoreInput=true;
1363 m_timer.SetShow( TRUE );
1364 m_charactersGroup.SetShow( FALSE );
1365 m_skinDetails.SetShow( FALSE );
1366 }
1367
1368 // this will send a CustomMessage_DLCMountingComplete when done
1369 return S_OK;
1370}
1371
1372HRESULT CScene_SkinSelect::OnCustomMessage_DLCMountingComplete()
1373{
1374
1375 m_timer.SetShow( FALSE );
1376 m_charactersGroup.SetShow( TRUE );
1377 m_skinDetails.SetShow( TRUE );
1378 m_packIndex = SKIN_SELECT_PACK_DEFAULT;
1379
1380 if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin)>0)
1381 {
1382 m_currentPack = app.m_dlcManager.getPackContainingSkin(m_currentSkinPath);
1383 if(m_currentPack != NULL)
1384 {
1385 bool bFound = false;
1386 m_packIndex = app.m_dlcManager.getPackIndex(m_currentPack,bFound,DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS;
1387 }
1388 }
1389
1390 // If we have any favourites, set this to the favourites
1391 // first validate the favorite skins - we might have uninstalled the DLC needed for them
1392 app.ValidateFavoriteSkins(m_iPad);
1393
1394 if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0)
1395 {
1396 m_packIndex = SKIN_SELECT_PACK_FAVORITES;
1397 }
1398
1399 handlePackIndexChanged();
1400 updateCurrentFocus();
1401 m_bIgnoreInput=false;
1402 app.m_dlcManager.checkForCorruptDLCAndAlert();
1403 bool bInGame=(Minecraft::GetInstance()->level!=NULL);
1404
1405 if(bInGame) XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO);
1406
1407 return S_OK;
1408}
1409
1410void CScene_SkinSelect::AddFavoriteSkin(int iPad,int iSkinID)
1411{
1412 // Is this favorite skin already in the array?
1413 unsigned int uiCurrentFavoriteSkinsCount=app.GetPlayerFavoriteSkinsCount(m_iPad);
1414
1415 for(int i=0;i<uiCurrentFavoriteSkinsCount;i++)
1416 {
1417 if(app.GetPlayerFavoriteSkin(m_iPad,i)==iSkinID)
1418 {
1419 app.SetPlayerFavoriteSkinsPos(m_iPad,i);
1420 return;
1421 }
1422 }
1423
1424 unsigned char ucPos=app.GetPlayerFavoriteSkinsPos(m_iPad);
1425 if(ucPos==(MAX_FAVORITE_SKINS-1))
1426 {
1427 ucPos=0;
1428 }
1429 else
1430 {
1431 if(uiCurrentFavoriteSkinsCount>0)
1432 {
1433 ucPos++;
1434 }
1435 else
1436 {
1437 ucPos=0;
1438 }
1439 }
1440
1441 app.SetPlayerFavoriteSkin(iPad,(int)ucPos,iSkinID);
1442 app.SetPlayerFavoriteSkinsPos(m_iPad,ucPos);
1443
1444}