diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/Common/XUI/XUI_SkinSelect.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.Client/Common/XUI/XUI_SkinSelect.cpp')
| -rw-r--r-- | Minecraft.Client/Common/XUI/XUI_SkinSelect.cpp | 1444 |
1 files changed, 1444 insertions, 0 deletions
diff --git a/Minecraft.Client/Common/XUI/XUI_SkinSelect.cpp b/Minecraft.Client/Common/XUI/XUI_SkinSelect.cpp new file mode 100644 index 00000000..ee706610 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SkinSelect.cpp @@ -0,0 +1,1444 @@ +#include "stdafx.h" +#include "XUI_SkinSelect.h" +#include "XUI_Ctrl_MinecraftSkinPreview.h" + +#define SKIN_SELECT_PACK_DEFAULT 0 +#define SKIN_SELECT_PACK_FAVORITES 1 +//#define SKIN_SELECT_PACK_PLAYER_CUSTOM 1 +#define SKIN_SELECT_MAX_DEFAULTS 2 + +WCHAR *CScene_SkinSelect::wchDefaultNamesA[]= +{ + L"USE LOCALISED VERSION", // Server selected + L"Steve", + L"Tennis Steve", + L"Tuxedo Steve", + L"Athlete Steve", + L"Scottish Steve", + L"Prisoner Steve", + L"Cyclist Steve", + L"Boxer Steve", +}; + + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_SkinSelect::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad=*(int *)pInitData->pvInitData; + // if we're not in the game, we need to use basescene 0 + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + m_bIgnoreInput=false; + + // 4J Stu - Added this so that we have skins loaded + // 4J-PB - Need to check for installed DLC + //if( (!app.DLCInstalled() || app.m_dlcManager.NeedsUpdated()) && !app.DLCInstallPending()) app.StartInstallDLCProcess(m_iPad); + + // StartInstallDLCProcess will check for all conditions within the call + MapChildControls(); + + m_selectedText.SetText( app.GetString( IDS_SELECTED ) ); + + updateClipping(); + + m_packIndex = SKIN_SELECT_PACK_DEFAULT; + m_skinIndex = 0; + m_currentSkinPath = app.GetPlayerSkinName(m_iPad); + m_originalSkinId = app.GetPlayerSkinId(m_iPad); + m_currentPack = NULL; + m_bSlidingSkins = false; + m_bAnimatingMove = false; + currentPackCount = 0; + + m_currentNavigation = eSkinNavigation_Skin; + m_normalTabs.SetShow( TRUE ); + m_selectedTabs.SetShow( FALSE ); + m_packLeft.SetEnable(FALSE); + m_packRight.SetEnable(FALSE); + + + for(BYTE i = 0; i < sidePreviewControls; ++i) + { + //m_previewNextControl->SetAutoRotate(true); + m_previewNextControls[i]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Left); + //m_previewPreviousControl->SetAutoRotate(true); + m_previewPreviousControls[i]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Right); + } + + // block input if we're waiting for DLC to install. The end of dlc mounting custom message will fill the save list + if(app.StartInstallDLCProcess(m_iPad)) + { + // DLC mounting in progress, so disable input + m_bIgnoreInput=true; + m_timer.SetShow( TRUE ); + m_charactersGroup.SetShow( FALSE ); + m_skinDetails.SetShow( FALSE ); + m_imagePadlock.SetShow( FALSE ); + m_selectedGroup.SetShow( FALSE ); + } + else + { + m_timer.SetShow( FALSE ); + + if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin)>0) + { + // Change to display the favorites if there are any. The current skin will be in there (probably) - need to check for it + m_currentPack = app.m_dlcManager.getPackContainingSkin(m_currentSkinPath); + bool bFound; + if(m_currentPack != NULL) + { + m_packIndex = app.m_dlcManager.getPackIndex(m_currentPack,bFound,DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS; + } + } + + // If we have any favourites, set this to the favourites + // first validate the favorite skins - we might have uninstalled the DLC needed for them + app.ValidateFavoriteSkins(m_iPad); + + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + m_packIndex = SKIN_SELECT_PACK_FAVORITES; + } + + handlePackIndexChanged(); + updateCurrentFocus(); + } + + // Display the tooltips + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE ); + } + + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad, false); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + if(bNotInGame) + { + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, FALSE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + } + + return S_OK; +} + + +HRESULT CScene_SkinSelect::OnKeyUp(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + switch(pInputData->dwKeyCode) + { + case VK_PAD_RTHUMB_LEFT: + m_previewControl->m_incYRot = false; + break; + case VK_PAD_RTHUMB_RIGHT: + m_previewControl->m_decYRot = false; + break; + case VK_PAD_RTHUMB_UP: + //m_previewControl->m_incXRot = false; + break; + case VK_PAD_RTHUMB_DOWN: + //m_previewControl->m_decXRot = false; + break; + case VK_PAD_RTHUMB_UPLEFT: + m_previewControl->m_incYRot = false; + //m_previewControl->m_incXRot = false; + break; + case VK_PAD_RTHUMB_UPRIGHT: + m_previewControl->m_decYRot = false; + //m_previewControl->m_incXRot = false; + break; + case VK_PAD_RTHUMB_DOWNRIGHT: + m_previewControl->m_decYRot = false; + //m_previewControl->m_decXRot = false; + break; + case VK_PAD_RTHUMB_DOWNLEFT: + m_previewControl->m_incYRot = false; + //m_previewControl->m_decXRot = false; + break; + } + return S_OK; +} + + +HRESULT CScene_SkinSelect::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // 4J Stu - We don't want the press anim to play for the scrolling unless we are actually scrolling + //ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + // ignore any key press if we are animating a move + //if(m_bAnimatingMove) return S_OK; + + HRESULT hr=S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_A: + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + app.SetPlayerSkin(pInputData->UserIndex, m_skinIndex); + app.SetPlayerCape(pInputData->UserIndex, 0); + m_currentSkinPath = app.GetPlayerSkinName(m_iPad); + m_originalSkinId = app.GetPlayerSkinId(m_iPad); + m_selectedGroup.SetShow( TRUE ); + CXuiSceneBase::PlayUISFX(eSFX_Press); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + // get the pack number from the skin id + wchar_t chars[256]; + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,m_skinIndex)); + + DLCPack *Pack=app.m_dlcManager.getPackContainingSkin(chars); + + if(Pack) + { + DLCSkinFile *skinFile = Pack->getSkinFile(chars); + app.SetPlayerSkin(pInputData->UserIndex, skinFile->getPath()); + app.SetPlayerCape(pInputData->UserIndex, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + m_selectedGroup.SetShow( TRUE ); + m_currentSkinPath = app.GetPlayerSkinName(m_iPad); + m_originalSkinId = app.GetPlayerSkinId(m_iPad); + app.SetPlayerFavoriteSkinsPos(m_iPad,m_skinIndex); + } + } + break; + default: + if( m_currentPack != NULL ) + { + DLCSkinFile *skinFile = m_currentPack->getSkinFile(m_skinIndex); + + // Is this a free skin? + + if(!skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free )) + { + // do we have a license? + if(!m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, skinFile->getPath() )) + { + // no + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + // We need to upsell the full version + if(ProfileManager.IsGuest(m_iPad)) + { + // can't buy + StorageManager.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + // are we online? + else if(!ProfileManager.IsSignedInLive(pInputData->UserIndex)) + { + // need to be signed in to live + StorageManager.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + } + else + { + // upsell + + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_currentPack->getPurchaseOfferId()); + ULONGLONG ullOfferID_Full; + + if(pDLCInfo!=NULL) + { + ullOfferID_Full=pDLCInfo->ullOfferID_Full; + } + else + { + ullOfferID_Full=m_currentPack->getPurchaseOfferId(); + } + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(pInputData->UserIndex, eSet_UpsellID_Skin_DLC, ullOfferID_Full & 0xFFFFFFFF); + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + StorageManager.RequestMessageBox(IDS_UNLOCK_DLC_TITLE, IDS_UNLOCK_DLC_SKIN, uiIDA, 2, pInputData->UserIndex,&CScene_SkinSelect::UnlockSkinReturned,this,app.GetStringTable()); + } + } + else + { + app.SetPlayerSkin(pInputData->UserIndex, skinFile->getPath()); + app.SetPlayerCape(pInputData->UserIndex, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + m_selectedGroup.SetShow( TRUE ); + m_currentSkinPath = app.GetPlayerSkinName(m_iPad); + m_originalSkinId = app.GetPlayerSkinId(m_iPad); + + // push this onto the favorite list + AddFavoriteSkin(m_iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId)); + } + } + else + { + app.SetPlayerSkin(pInputData->UserIndex, skinFile->getPath()); + app.SetPlayerCape(pInputData->UserIndex, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + m_selectedGroup.SetShow( TRUE ); + m_currentSkinPath = app.GetPlayerSkinName(m_iPad); + m_originalSkinId = app.GetPlayerSkinId(m_iPad); + + // push this onto the favorite list + AddFavoriteSkin(m_iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId)); + + } + } + + CXuiSceneBase::PlayUISFX(eSFX_Press); + break; + } + + break; + case VK_PAD_B: + case VK_ESCAPE: + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + app.CheckGameSettingsChanged(true,pInputData->UserIndex); + + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; +#if 0 + case VK_PAD_RSHOULDER: + { + DWORD startingIndex = m_packIndex; + m_packIndex = getNextPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + break; + case VK_PAD_LSHOULDER: + { + DWORD startingIndex = m_packIndex; + m_packIndex = getPreviousPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + break; +#endif + case VK_PAD_DPAD_UP: + case VK_PAD_LTHUMB_UP: + case VK_PAD_DPAD_DOWN: + case VK_PAD_LTHUMB_DOWN: + { + if(m_packIndex==SKIN_SELECT_PACK_FAVORITES) + { + if(app.GetPlayerFavoriteSkinsCount(m_iPad)==0) + { + // ignore this, since there are no skins being displayed + break; + } + } + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + switch(m_currentNavigation) + { + case eSkinNavigation_Pack: + m_currentNavigation = eSkinNavigation_Skin; + break; + case eSkinNavigation_Skin: + m_currentNavigation = eSkinNavigation_Pack; + break; + }; + updateCurrentFocus(); + } + break; + case VK_PAD_DPAD_LEFT: + case VK_PAD_LTHUMB_LEFT: + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + if(!m_bAnimatingMove) + { + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + + m_skinIndex = getPreviousSkinIndex(m_skinIndex); + //handleSkinIndexChanged(); + + m_bSlidingSkins = true; + m_bAnimatingMove = true; + + m_previewControl->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Left, true); + m_previewPreviousControls[0]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Forward, true); + + int startFrame, endFrame; + HRESULT hr = m_charactersGroup.FindNamedFrame(L"CycleRight", &startFrame); + hr = m_charactersGroup.FindNamedFrame( L"EndCycleRight", &endFrame); + hr = m_charactersGroup.PlayTimeline(startFrame, startFrame,endFrame,FALSE,FALSE); + } + } + else if( m_currentNavigation == eSkinNavigation_Pack ) + { + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + DWORD startingIndex = m_packIndex; + m_packIndex = getPreviousPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + } + break; + case VK_PAD_DPAD_RIGHT: + case VK_PAD_LTHUMB_RIGHT: + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + if(!m_bAnimatingMove) + { + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + m_skinIndex = getNextSkinIndex(m_skinIndex); + //handleSkinIndexChanged(); + + m_bSlidingSkins = true; + m_bAnimatingMove = true; + + m_previewControl->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Right, true); + m_previewNextControls[0]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Forward, true); + + int startFrame, endFrame; + HRESULT hr = m_charactersGroup.FindNamedFrame(L"CycleLeft", &startFrame); + hr = m_charactersGroup.FindNamedFrame( L"EndCycleLeft", &endFrame); + hr = m_charactersGroup.PlayTimeline(startFrame, startFrame,endFrame,FALSE,FALSE); + } + } + else if( m_currentNavigation == eSkinNavigation_Pack ) + { + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + DWORD startingIndex = m_packIndex; + m_packIndex = getNextPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + } + break; + case VK_PAD_RTHUMB_PRESS: + CXuiSceneBase::PlayUISFX(eSFX_Press); + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->ResetRotation(); + } + break; + case VK_PAD_RTHUMB_LEFT: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->m_incYRot = true; + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_RIGHT: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->m_decYRot = true; + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_UP: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + //m_previewControl->m_incXRot = true; + m_previewControl->CyclePreviousAnimation(); + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_DOWN: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + //m_previewControl->m_decXRot = true; + m_previewControl->CycleNextAnimation(); + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_UPLEFT: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->m_incYRot = true; + //m_previewControl->m_incXRot = true; + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_UPRIGHT: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->m_decYRot = true; + //m_previewControl->m_incXRot = true; + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_DOWNRIGHT: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->m_decYRot = true; + //m_previewControl->m_decXRot = true; + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_DOWNLEFT: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->m_incYRot = true; + //m_previewControl->m_decXRot = true; + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + } + + return hr; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_SkinSelect::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + return S_OK; +} + +HRESULT CScene_SkinSelect::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + + } + + return S_OK; +} + +HRESULT CScene_SkinSelect::OnTimelineEnd(HXUIOBJ hObjSource, BOOL& bHandled) +{ + if( hObjSource == m_charactersGroup ) + { + if(m_bSlidingSkins) + { + m_bSlidingSkins = false; + + int startFrame, endFrame; + HRESULT hr = m_charactersGroup.FindNamedFrame(L"Normal", &startFrame); + hr = m_charactersGroup.FindNamedFrame( L"Normal", &endFrame); + hr = m_charactersGroup.PlayTimeline(startFrame, startFrame,endFrame,FALSE,FALSE); + } + else + { + m_previewControl->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Forward, false); + m_previewNextControls[0]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Left, false); + m_previewPreviousControls[0]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Right, false); + + handleSkinIndexChanged(); + + m_bAnimatingMove = false; + + bHandled = TRUE; + } + } + return S_OK; +} + + +HRESULT CScene_SkinSelect::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining,false); +} + + + + +HRESULT CScene_SkinSelect::OnBasePositionChanged() +{ + updateClipping(); + + return S_OK; +} + +void CScene_SkinSelect::handleSkinIndexChanged() +{ + BOOL showPrevious = FALSE, showNext = FALSE; + DWORD previousIndex = 0, nextIndex = 0; + wstring skinName = L""; + wstring skinOrigin = L""; + bool bSkinIsFree=false; + bool bLicensed=false; + DLCSkinFile *skinFile=NULL; + DLCPack *Pack=NULL; + BYTE sidePreviewControlsL,sidePreviewControlsR; + bool bNoSkinsToShow=false; + + TEXTURE_NAME backupTexture = TN_MOB_CHAR; + m_selectedGroup.SetShow( FALSE ); + m_skinDetails.SetShow( FALSE ); + + if( m_currentPack != NULL ) + { + skinFile = m_currentPack->getSkinFile(m_skinIndex); + m_selectedSkinPath = skinFile->getPath(); + m_selectedCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + m_vAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + + skinName = skinFile->getParameterAsString( DLCManager::e_DLCParamType_DisplayName ); + skinOrigin = skinFile->getParameterAsString( DLCManager::e_DLCParamType_ThemeName ); + + if( m_selectedSkinPath.compare( m_currentSkinPath ) == 0 ) + { + m_selectedGroup.SetShow( TRUE ); + } + else + { + m_selectedGroup.SetShow( FALSE ); + } + + bSkinIsFree = skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ); + bLicensed = m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, m_selectedSkinPath ); + + m_imagePadlock.SetShow( (bSkinIsFree || bLicensed) ?FALSE:TRUE ); + m_previewControl->SetShow(TRUE); + m_skinDetails.SetShow( TRUE ); + } + else + { + m_selectedSkinPath = L""; + m_selectedCapePath = L""; + m_vAdditionalSkinBoxes = NULL; + + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + backupTexture = getTextureId(m_skinIndex); + + if( m_skinIndex == eDefaultSkins_ServerSelected ) + { + skinName = app.GetString(IDS_DEFAULT_SKINS); + } + else + { + skinName = wchDefaultNamesA[m_skinIndex]; + } + + if( m_originalSkinId == m_skinIndex ) + { + m_selectedGroup.SetShow( TRUE ); + } + else + { + m_selectedGroup.SetShow( FALSE ); + } + m_imagePadlock.SetShow( FALSE ); + m_previewControl->SetShow(TRUE); + m_skinDetails.SetShow( TRUE ); + + break; + case SKIN_SELECT_PACK_FAVORITES: + + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + // get the pack number from the skin id + wchar_t chars[256]; + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,m_skinIndex)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + m_selectedSkinPath = skinFile->getPath(); + m_selectedCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + m_vAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + + skinName = skinFile->getParameterAsString( DLCManager::e_DLCParamType_DisplayName ); + skinOrigin = skinFile->getParameterAsString( DLCManager::e_DLCParamType_ThemeName ); + + if( m_selectedSkinPath.compare( m_currentSkinPath ) == 0 ) + { + m_selectedGroup.SetShow( TRUE ); + } + else + { + m_selectedGroup.SetShow( FALSE ); + } + + bSkinIsFree = skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ); + bLicensed = Pack->hasPurchasedFile( DLCManager::e_DLCType_Skin, m_selectedSkinPath ); + + m_imagePadlock.SetShow( (bSkinIsFree || bLicensed) ?FALSE:TRUE ); + m_skinDetails.SetShow( TRUE ); + } + else + { + m_selectedGroup.SetShow( FALSE ); + m_imagePadlock.SetShow( FALSE ); + } + } + else + { + //disable the display + m_previewControl->SetShow(FALSE); + // change the tooltips + bNoSkinsToShow=true; + } + break; + + } + } + m_text.SetText(skinName.c_str()); + m_originText.SetText(skinOrigin.c_str()); + + if(m_vAdditionalSkinBoxes && m_vAdditionalSkinBoxes->size()!=0) + { + // add the boxes to the humanoid model, but only if we've not done this already + vector<ModelPart *> *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID()); + if(pAdditionalModelParts==NULL) + { + pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),m_vAdditionalSkinBoxes); + } + } + + if(skinFile!=NULL) + { + app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask()); + } + + m_previewControl->SetTexture(m_selectedSkinPath, backupTexture); + m_previewControl->SetCapeTexture(m_selectedCapePath); + + showNext = TRUE; + showPrevious = TRUE; + nextIndex = getNextSkinIndex(m_skinIndex); + previousIndex = getPreviousSkinIndex(m_skinIndex); + + wstring otherSkinPath = L""; + wstring otherCapePath = L""; + vector<SKIN_BOX *> *othervAdditionalSkinBoxes=NULL; + wchar_t chars[256]; + + // turn off all displays + for(BYTE i = 0; i < sidePreviewControls; ++i) + { + m_previewNextControls[i]->SetShow(FALSE); + m_previewPreviousControls[i]->SetShow(FALSE); + } + + unsigned int uiCurrentFavoriteC=app.GetPlayerFavoriteSkinsCount(m_iPad); + + if(m_packIndex==SKIN_SELECT_PACK_FAVORITES) + { + // might not be enough to cycle through + if(uiCurrentFavoriteC<((sidePreviewControls*2)+1)) + { + if(uiCurrentFavoriteC==0) + { + sidePreviewControlsL=sidePreviewControlsR=0; + } + // might be an odd number + else if((uiCurrentFavoriteC-1)%2==1) + { + sidePreviewControlsL=1+(uiCurrentFavoriteC-1)/2; + sidePreviewControlsR=(uiCurrentFavoriteC-1)/2; + } + else + { + sidePreviewControlsL=sidePreviewControlsR=(uiCurrentFavoriteC-1)/2; + } + } + else + { + sidePreviewControlsL=sidePreviewControlsR=sidePreviewControls; + } + } + else + { + sidePreviewControlsL=sidePreviewControlsR=sidePreviewControls; + } + + for(BYTE i = 0; i < sidePreviewControlsR; ++i) + { + if(showNext) + { + skinFile=NULL; + m_previewNextControls[i]->SetShow(TRUE); + + if( m_currentPack != NULL ) + { + skinFile = m_currentPack->getSkinFile(nextIndex); + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + else + { + otherSkinPath = L""; + otherCapePath = L""; + othervAdditionalSkinBoxes=NULL; + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + backupTexture = getTextureId(nextIndex); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(uiCurrentFavoriteC>0) + { + // get the pack number from the skin id + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,nextIndex)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + } + break; + default: + break; + } + + } + if(othervAdditionalSkinBoxes && othervAdditionalSkinBoxes->size()!=0) + { + vector<ModelPart *> *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID()); + if(pAdditionalModelParts==NULL) + { + pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),othervAdditionalSkinBoxes); + } + } + // 4J-PB - anim override needs set before SetTexture + if(skinFile!=NULL) + { + app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask()); + } + m_previewNextControls[i]->SetTexture(otherSkinPath, backupTexture); + m_previewNextControls[i]->SetCapeTexture(otherCapePath); + + + } + + nextIndex = getNextSkinIndex(nextIndex); + } + + + + for(BYTE i = 0; i < sidePreviewControlsL; ++i) + { + if(showPrevious) + { + skinFile=NULL; + m_previewPreviousControls[i]->SetShow(TRUE); + + if( m_currentPack != NULL ) + { + skinFile = m_currentPack->getSkinFile(previousIndex); + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + else + { + otherSkinPath = L""; + otherCapePath = L""; + othervAdditionalSkinBoxes=NULL; + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + backupTexture = getTextureId(previousIndex); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(uiCurrentFavoriteC>0) + { + // get the pack number from the skin id + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,previousIndex)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + } + + break; + default: + break; + } + } + if(othervAdditionalSkinBoxes && othervAdditionalSkinBoxes->size()!=0) + { + vector<ModelPart *> *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID()); + if(pAdditionalModelParts==NULL) + { + pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),othervAdditionalSkinBoxes); + } + } + // 4J-PB - anim override needs set before SetTexture + if(skinFile) + { + app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask()); + } + m_previewPreviousControls[i]->SetTexture(otherSkinPath, backupTexture); + m_previewPreviousControls[i]->SetCapeTexture(otherCapePath); + } + + previousIndex = getPreviousSkinIndex(previousIndex); + } + + // update the tooltips + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + if(bNoSkinsToShow) + { + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE ); + } + + } + else + { + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE ); + } + + } + + updateCurrentFocus(); +} + +void CScene_SkinSelect::handlePackIndexChanged() +{ + if(m_packIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + m_currentPack = app.m_dlcManager.getPack(m_packIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + } + else + { + m_currentPack = NULL; + } + m_skinIndex = 0; + if(m_currentPack != NULL) + { + bool found; + DWORD currentSkinIndex = m_currentPack->getSkinIndexAt(m_currentSkinPath, found); + if(found) m_skinIndex = currentSkinIndex; + } + else + { + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + if( !GET_IS_DLC_SKIN_FROM_BITMASK(m_originalSkinId) ) + { + DWORD ugcSkinIndex = GET_UGC_SKIN_ID_FROM_BITMASK(m_originalSkinId); + DWORD defaultSkinIndex = GET_DEFAULT_SKIN_ID_FROM_BITMASK(m_originalSkinId); + if( ugcSkinIndex == 0 ) + { + m_skinIndex = (EDefaultSkins) defaultSkinIndex; + } + } + break; + case SKIN_SELECT_PACK_FAVORITES: + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + bool found; + wchar_t chars[256]; + // get the pack number from the skin id + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,app.GetPlayerFavoriteSkinsPos(m_iPad))); + + DLCPack *Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + DWORD currentSkinIndex = Pack->getSkinIndexAt(m_currentSkinPath, found); + if(found) m_skinIndex = app.GetPlayerFavoriteSkinsPos(m_iPad); + } + } + break; + default: + break; + } + } + handleSkinIndexChanged(); + updatePackDisplay(); +} + +void CScene_SkinSelect::updatePackDisplay() +{ + currentPackCount = app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS; + + m_packLeft.SetShow(TRUE); + m_packRight.SetShow(TRUE); + + if(m_packIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + DLCPack *thisPack = app.m_dlcManager.getPack(m_packIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + m_packCenter.SetText(thisPack->getName().c_str()); + } + else + { + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + m_packCenter.SetText(app.GetString(IDS_NO_SKIN_PACK)); + break; + case SKIN_SELECT_PACK_FAVORITES: + m_packCenter.SetText(app.GetString(IDS_FAVORITES_SKIN_PACK)); + break; + } + } + + int nextPackIndex = getNextPackIndex(m_packIndex); + if(nextPackIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + DLCPack *thisPack = app.m_dlcManager.getPack(nextPackIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + m_packRight.SetText(thisPack->getName().c_str()); + } + else + { + switch(nextPackIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + m_packRight.SetText(app.GetString(IDS_NO_SKIN_PACK)); + break; + case SKIN_SELECT_PACK_FAVORITES: + m_packRight.SetText(app.GetString(IDS_FAVORITES_SKIN_PACK)); + break; + } + } + + int previousPackIndex = getPreviousPackIndex(m_packIndex); + if(previousPackIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + DLCPack *thisPack = app.m_dlcManager.getPack(previousPackIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + m_packLeft.SetText(thisPack->getName().c_str()); + } + else + { + switch(previousPackIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + m_packLeft.SetText(app.GetString(IDS_NO_SKIN_PACK)); + break; + case SKIN_SELECT_PACK_FAVORITES: + m_packLeft.SetText(app.GetString(IDS_FAVORITES_SKIN_PACK)); + break; + } + } + +} + +void CScene_SkinSelect::updateCurrentFocus() +{ + XUITimeline *timeline; + XUINamedFrame *startFrame; + XuiElementGetTimeline( m_skinDetails.m_hObj, &timeline); + switch(m_currentNavigation) + { + case eSkinNavigation_Pack: + XuiElementSetUserFocus( m_packCenter.m_hObj, m_iPad ); + startFrame = timeline->FindNamedFrame( L"Unselected" ); + m_normalTabs.SetShow( FALSE ); + m_selectedTabs.SetShow( TRUE ); + m_packLeft.SetEnable(TRUE); + m_packRight.SetEnable(TRUE); + break; + case eSkinNavigation_Skin: + XuiElementSetUserFocus( m_skinDetails.m_hObj, m_iPad ); + startFrame = timeline->FindNamedFrame( L"Selected" ); + m_normalTabs.SetShow( TRUE ); + m_selectedTabs.SetShow( FALSE ); + m_packLeft.SetEnable(FALSE); + m_packRight.SetEnable(FALSE); + break; + }; + timeline->Play( startFrame->m_dwFrame, startFrame->m_dwFrame, startFrame->m_dwFrame, FALSE, FALSE ); +} + +TEXTURE_NAME CScene_SkinSelect::getTextureId(int skinIndex) +{ + TEXTURE_NAME texture = TN_MOB_CHAR; + switch(skinIndex) + { + case eDefaultSkins_ServerSelected: + case eDefaultSkins_Skin0: + texture = TN_MOB_CHAR; + break; + case eDefaultSkins_Skin1: + texture = TN_MOB_CHAR1; + break; + case eDefaultSkins_Skin2: + texture = TN_MOB_CHAR2; + break; + case eDefaultSkins_Skin3: + texture = TN_MOB_CHAR3; + break; + case eDefaultSkins_Skin4: + texture = TN_MOB_CHAR4; + break; + case eDefaultSkins_Skin5: + texture = TN_MOB_CHAR5; + break; + case eDefaultSkins_Skin6: + texture = TN_MOB_CHAR6; + break; + case eDefaultSkins_Skin7: + texture = TN_MOB_CHAR7; + break; + }; + + return texture; +} + +int CScene_SkinSelect::getNextSkinIndex(DWORD sourceIndex) +{ + int nextSkin = sourceIndex; + + // special case for favourites + switch(m_packIndex) + { + + case SKIN_SELECT_PACK_FAVORITES: + ++nextSkin; + if(nextSkin>=app.GetPlayerFavoriteSkinsCount(m_iPad)) + { + nextSkin=0; + } + + break; + default: + ++nextSkin; + + if(m_packIndex == SKIN_SELECT_PACK_DEFAULT && nextSkin >= eDefaultSkins_Count) + { + nextSkin = eDefaultSkins_ServerSelected; + } + else if(m_currentPack != NULL && nextSkin>=m_currentPack->getSkinCount()) + { + nextSkin = 0; + } + break; + } + + + return nextSkin; +} + +int CScene_SkinSelect::getPreviousSkinIndex(DWORD sourceIndex) +{ + int previousSkin = sourceIndex; + switch(m_packIndex) + { + + case SKIN_SELECT_PACK_FAVORITES: + if(previousSkin==0) + { + previousSkin = app.GetPlayerFavoriteSkinsCount(m_iPad) - 1; + } + else + { + --previousSkin; + } + break; + default: + if(previousSkin==0) + { + if(m_packIndex == SKIN_SELECT_PACK_DEFAULT) + { + previousSkin = eDefaultSkins_Count - 1; + } + else if(m_currentPack != NULL) + { + previousSkin = m_currentPack->getSkinCount()-1; + } + } + else + { + --previousSkin; + } + break; + } + + + return previousSkin; +} + +int CScene_SkinSelect::getNextPackIndex(DWORD sourceIndex) +{ + int nextPack = sourceIndex; + ++nextPack; + if(nextPack > app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) - 1 + SKIN_SELECT_MAX_DEFAULTS) + { + nextPack = SKIN_SELECT_PACK_DEFAULT; + } + + return nextPack; +} + +int CScene_SkinSelect::getPreviousPackIndex(DWORD sourceIndex) +{ + int previousPack = sourceIndex; + if(previousPack == SKIN_SELECT_PACK_DEFAULT) + { + if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) > 0) + { + previousPack = app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) - 1 + SKIN_SELECT_MAX_DEFAULTS; + } + else + { + previousPack = SKIN_SELECT_MAX_DEFAULTS - 1; + } + } + else + { + --previousPack; + } + + return previousPack; +} + +void CScene_SkinSelect::updateClipping() +{ + DWORD dwPropertyId; + XUIElementPropVal propertyVal; + propertyVal.Clear(); + HRESULT hr = XuiObjectGetPropertyId( m_charactersGroup.m_hObj, L"ClipChildren", &dwPropertyId); + switch( CXuiSceneBase::GetPlayerBasePosition(m_iPad) ) + { + case CXuiSceneBase::e_BaseScene_Left: + case CXuiSceneBase::e_BaseScene_Right: + case CXuiSceneBase::e_BaseScene_Top_Left: + case CXuiSceneBase::e_BaseScene_Top_Right: + case CXuiSceneBase::e_BaseScene_Bottom_Left: + case CXuiSceneBase::e_BaseScene_Bottom_Right: + case CXuiSceneBase::e_BaseScene_Top: + case CXuiSceneBase::e_BaseScene_Bottom: + propertyVal.SetBoolVal(TRUE); + break; + case CXuiSceneBase::e_BaseScene_Fullscreen: + default: + propertyVal.SetBoolVal(FALSE); + break; + }; + hr = XuiObjectSetProperty(m_charactersGroup.m_hObj,dwPropertyId,0,&propertyVal); +} + +int CScene_SkinSelect::UnlockSkinReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_SkinSelect* pScene = (CScene_SkinSelect*)pParam; +#ifdef _XBOX + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { + ULONGLONG ullIndexA[1]; + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(pScene->m_currentPack->getPurchaseOfferId()); + + if(pDLCInfo!=NULL) + { + ullIndexA[0]=pDLCInfo->ullOfferID_Full; + } + else + { + ullIndexA[0]=pScene->m_currentPack->getPurchaseOfferId(); + } + + // If we're in-game, then we need to enable DLC downloads. They'll be set back to Auto on leaving the pause menu + if(Minecraft::GetInstance()->level!=NULL) + { + // 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... + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + } + + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + + // the license change coming in when the offer has been installed will cause this scene to refresh + } + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Skin_DLC, ( pScene->m_currentPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined); + } +#endif + return 0; +} + +HRESULT CScene_SkinSelect::OnCustomMessage_DLCInstalled() +{ + // mounted DLC may have changed + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + m_timer.SetShow( TRUE ); + m_charactersGroup.SetShow( FALSE ); + m_skinDetails.SetShow( FALSE ); + } + + // this will send a CustomMessage_DLCMountingComplete when done + return S_OK; +} + +HRESULT CScene_SkinSelect::OnCustomMessage_DLCMountingComplete() +{ + + m_timer.SetShow( FALSE ); + m_charactersGroup.SetShow( TRUE ); + m_skinDetails.SetShow( TRUE ); + m_packIndex = SKIN_SELECT_PACK_DEFAULT; + + if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin)>0) + { + m_currentPack = app.m_dlcManager.getPackContainingSkin(m_currentSkinPath); + if(m_currentPack != NULL) + { + bool bFound = false; + m_packIndex = app.m_dlcManager.getPackIndex(m_currentPack,bFound,DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS; + } + } + + // If we have any favourites, set this to the favourites + // first validate the favorite skins - we might have uninstalled the DLC needed for them + app.ValidateFavoriteSkins(m_iPad); + + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + m_packIndex = SKIN_SELECT_PACK_FAVORITES; + } + + handlePackIndexChanged(); + updateCurrentFocus(); + m_bIgnoreInput=false; + app.m_dlcManager.checkForCorruptDLCAndAlert(); + bool bInGame=(Minecraft::GetInstance()->level!=NULL); + + if(bInGame) XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); + + return S_OK; +} + +void CScene_SkinSelect::AddFavoriteSkin(int iPad,int iSkinID) +{ + // Is this favorite skin already in the array? + unsigned int uiCurrentFavoriteSkinsCount=app.GetPlayerFavoriteSkinsCount(m_iPad); + + for(int i=0;i<uiCurrentFavoriteSkinsCount;i++) + { + if(app.GetPlayerFavoriteSkin(m_iPad,i)==iSkinID) + { + app.SetPlayerFavoriteSkinsPos(m_iPad,i); + return; + } + } + + unsigned char ucPos=app.GetPlayerFavoriteSkinsPos(m_iPad); + if(ucPos==(MAX_FAVORITE_SKINS-1)) + { + ucPos=0; + } + else + { + if(uiCurrentFavoriteSkinsCount>0) + { + ucPos++; + } + else + { + ucPos=0; + } + } + + app.SetPlayerFavoriteSkin(iPad,(int)ucPos,iSkinID); + app.SetPlayerFavoriteSkinsPos(m_iPad,ucPos); + +}
\ No newline at end of file |
