4jcraft/Minecraft.Client/Platform/Common/XUI/XUI_DLCOffers.cpp
2026-03-22 12:40:22 -05:00

846 lines
30 KiB
C++

// Minecraft.cpp : Defines the entry point for the application.
//
#include "../../Minecraft.World/Platform/stdafx.h"
#include "../../Minecraft.World/IO/Streams/ByteArrayInputStream.h"
#include "../../Minecraft.World/IO/Streams/BufferedReader.h"
#include "../../Minecraft.World/IO/Streams/InputStreamReader.h"
#include "../../Minecraft.World/Util/ArrayWithLength.h"
#include <assert.h>
#include "XUI_Ctrl_4JIcon.h"
#include "XUI_DLCOffers.h"
#include "../../Minecraft.World/Util/StringHelpers.h"
#ifdef _XBOX
#include <xavatar.h>
#endif
#define TIMER_ID_NETWORK_CONNECTION 1
#define TIMER_ID_NAVIGATE_BACK 2
// Constants
// const std::wstring CScene_DLCOffers::DEFAULT_BANNER = L"Graphics/banner.png";
// DLC Main
HRESULT CScene_DLCMain::OnInit(XUIMessageInit* pInitData, BOOL& bHandled) {
iPad = *(int*)pInitData->pvInitData;
MapChildControls();
app.SetTickTMSDLCFiles(true);
XuiControlSetText(xList, app.GetString(IDS_DOWNLOADABLE_CONTENT_OFFERS));
// if(app.GetTMSDLCInfoRead())
{
m_Timer.SetShow(FALSE);
m_bIgnoreInput = false;
void* pObj;
XuiObjectFromHandle(xList, &pObj);
list = (CXuiCtrl4JList*)pObj;
ui.SetTooltips(DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,
IDS_TOOLTIPS_BACK);
CXuiCtrl4JList::LIST_ITEM_INFO* pListInfo =
new CXuiCtrl4JList::LIST_ITEM_INFO[e_DLC_MAX_MinecraftStore];
ZeroMemory(pListInfo, sizeof(CXuiCtrl4JList::LIST_ITEM_INFO) *
e_DLC_MAX_MinecraftStore);
m_bAllDLCContentRetrieved = false;
pListInfo[e_DLC_SkinPack].pwszText =
app.GetString(IDS_DLC_MENU_SKINPACKS);
pListInfo[e_DLC_SkinPack].fEnabled = TRUE;
list->AddData(pListInfo[e_DLC_SkinPack]);
pListInfo[e_DLC_TexturePacks].pwszText =
app.GetString(IDS_DLC_MENU_TEXTUREPACKS);
pListInfo[e_DLC_TexturePacks].fEnabled = TRUE;
list->AddData(pListInfo[e_DLC_TexturePacks]);
pListInfo[e_DLC_MashupPacks].pwszText =
app.GetString(IDS_DLC_MENU_MASHUPPACKS);
pListInfo[e_DLC_MashupPacks].fEnabled = TRUE;
list->AddData(pListInfo[e_DLC_MashupPacks]);
pListInfo[e_DLC_Themes].pwszText = app.GetString(IDS_DLC_MENU_THEMES);
pListInfo[e_DLC_Themes].fEnabled = TRUE;
list->AddData(pListInfo[e_DLC_Themes]);
pListInfo[e_DLC_AvatarItems].pwszText =
app.GetString(IDS_DLC_MENU_AVATARITEMS);
pListInfo[e_DLC_AvatarItems].fEnabled = TRUE;
list->AddData(pListInfo[e_DLC_AvatarItems]);
pListInfo[e_DLC_Gamerpics].pwszText =
app.GetString(IDS_DLC_MENU_GAMERPICS);
pListInfo[e_DLC_Gamerpics].fEnabled = TRUE;
list->AddData(pListInfo[e_DLC_Gamerpics]);
app.AddDLCRequest(
e_Marketplace_Content); // content is skin packs, texture packs and
// mash-up packs
app.AddDLCRequest(e_Marketplace_Gamerpics);
app.AddDLCRequest(e_Marketplace_Themes);
app.AddDLCRequest(e_Marketplace_AvatarItems);
// start retrieving the images needed from TMS
app.AddTMSPPFileTypeRequest(e_DLC_SkinPack);
app.AddTMSPPFileTypeRequest(e_DLC_Gamerpics);
app.AddTMSPPFileTypeRequest(e_DLC_Themes);
app.AddTMSPPFileTypeRequest(e_DLC_AvatarItems);
app.AddTMSPPFileTypeRequest(e_DLC_TexturePacks);
app.AddTMSPPFileTypeRequest(e_DLC_MashupPacks);
}
XuiElementInitUserFocus(xList, ProfileManager.GetPrimaryPad(), TRUE);
TelemetryManager->RecordMenuShown(iPad, eUIScene_DLCMainMenu,
0); // 4J JEV ?
return S_OK;
}
HRESULT CScene_DLCMain::OnDestroy() { return S_OK; }
HRESULT CScene_DLCMain::OnTimer(XUIMessageTimer* pData, BOOL& rfHandled) {
if (pData->nId == TIMER_ID_NETWORK_CONNECTION) {
if (ProfileManager.GetLiveConnectionStatus() !=
XONLINE_S_LOGON_CONNECTION_ESTABLISHED) {
unsigned int uiIDA[1];
uiIDA[0] = IDS_CONFIRM_OK;
StorageManager.ClearDLCOffers();
app.ClearAndResetDLCDownloadQueue();
}
} else if (pData->nId == TIMER_ID_NAVIGATE_BACK) {
if (app.CheckTMSDLCCanStop()) {
XuiKillTimer(m_hObj, TIMER_ID_NAVIGATE_BACK);
app.NavigateBack(XUSER_INDEX_ANY);
}
}
return S_OK;
}
HRESULT CScene_DLCMain::OnKeyDown(XUIMessageInput* pInputData,
BOOL& rfHandled) {
if (m_bIgnoreInput) return S_OK;
ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
switch (pInputData->dwKeyCode) {
case VK_PAD_B:
case VK_ESCAPE:
app.SetTickTMSDLCFiles(false);
// set the timer running to navigate back when any tms retrieval has
// come in
XuiSetTimer(m_hObj, TIMER_ID_NAVIGATE_BACK, 50);
m_bIgnoreInput = true;
m_Timer.SetShow(TRUE);
// app.NavigateBack(XUSER_INDEX_ANY);
rfHandled = TRUE;
break;
}
return S_OK;
}
HRESULT CScene_DLCMain::OnNotifyPressEx(HXUIOBJ hObjPressed,
XUINotifyPress* pNotifyPressData,
BOOL& rfHandled) {
ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A);
if (hObjPressed == xList) {
int iIndex;
CXuiControl pItem;
iIndex = xList.GetCurSel(&pItem);
DLCOffersParam* param = new DLCOffersParam();
param->iPad = iPad;
param->iType = iIndex;
// promote the DLC content request type
app.AddDLCRequest((eDLCMarketplaceType)iIndex, true);
app.NavigateToScene(iPad, eUIScene_DLCOffersMenu, param);
}
return S_OK;
}
HRESULT CScene_DLCMain::OnNavReturn(HXUIOBJ hObj, BOOL& rfHandled) {
ui.SetTooltips(DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,
IDS_TOOLTIPS_BACK);
return S_OK;
}
// DLC OFFERS
//----------------------------------------------------------------------------------
// Performs initialization tasks - retrieves controls.
//----------------------------------------------------------------------------------
HRESULT CScene_DLCOffers::OnInit(XUIMessageInit* pInitData, BOOL& bHandled) {
DLCOffersParam* param = (DLCOffersParam*)pInitData->pvInitData;
m_iPad = param->iPad;
m_iType = param->iType;
m_iOfferC = app.GetDLCOffersCount();
m_bIsFemale = false;
m_pNoImageFor_DLC = NULL;
bNoDLCToDisplay = true;
// hCostText=NULL;
// 4J JEV: Deleting this here seems simpler.
delete param;
// If this is the avatar items, we need to init the avatar system to allow
// us to find out what the player avatar gender is (since we should only
// display tshirts etc with the right gender) The init reserves 3MB of
// memory, so we shut down on leaving this.
if (m_iType == e_DLC_AvatarItems) {
XAVATAR_METADATA AvatarMetadata;
HRESULT hRes;
hRes = XAvatarInitialize(XAVATAR_COORDINATE_SYSTEM_LEFT_HANDED, 0, 0, 0,
NULL);
// get the avatar gender
hRes = XAvatarGetMetadataLocalUser(m_iPad, &AvatarMetadata, NULL);
m_bIsFemale = (XAVATAR_BODY_TYPE_FEMALE ==
XAvatarMetadataGetBodyType(&AvatarMetadata));
// shutdown the avatar system
XAvatarShutdown();
}
m_bIsSD = !RenderManager.IsHiDef() && !RenderManager.IsWidescreen();
MapChildControls();
XuiControlSetText(m_List, app.GetString(IDS_DOWNLOADABLE_CONTENT_OFFERS));
m_bIgnorePress = true;
void* pObj;
m_hXuiBrush = NULL;
XuiObjectFromHandle(m_List, &pObj);
m_pOffersList = (CXuiCtrl4JList*)pObj;
m_bAllDLCContentRetrieved = false;
XuiElementInitUserFocus(m_hObj, ProfileManager.GetPrimaryPad(), TRUE);
TelemetryManager->RecordMenuShown(m_iPad, eUIScene_DLCOffersMenu, 0);
ui.SetTooltips(DEFAULT_XUI_MENU_USER, -1, IDS_TOOLTIPS_BACK);
// Disable the price tag display
m_PriceTag.SetShow(FALSE);
// If we don't yet have this DLC, we need to display a timer
m_bDLCRequiredIsRetrieved = false;
// Is the DLC we're looking for available?
if (!m_bDLCRequiredIsRetrieved) {
if (app.DLCContentRetrieved((eDLCMarketplaceType)m_iType)) {
m_bDLCRequiredIsRetrieved = true;
// Retrieve the info
GetDLCInfo(app.GetDLCOffersCount(), false);
m_bIgnorePress = false;
}
}
XuiSetTimer(m_hObj, TIMER_ID_NETWORK_CONNECTION, 50);
return S_OK;
}
HRESULT CScene_DLCOffers::GetDLCInfo(int iOfferC, bool bUpdateOnly) {
CXuiCtrl4JList::LIST_ITEM_INFO* pListInfo = NULL;
// XMARKETPLACE_CONTENTOFFER_INFO xOffer;
XMARKETPLACE_CURRENCY_CONTENTOFFER_INFO xOffer;
constexpr int LOCATOR_SIZE =
256; // Use this to allocate space to hold a ResourceLocator string
WCHAR szResourceLocator[LOCATOR_SIZE];
ZeroMemory(szResourceLocator, sizeof(WCHAR) * LOCATOR_SIZE);
const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL);
int iCount = 0;
if (bUpdateOnly) // Just update the info on the current list
{
for (int i = 0; i < iOfferC; i++) {
xOffer = StorageManager.GetOffer(i);
// Check that this is in the list of known DLC
DLC_INFO* pDLC = app.GetDLCInfoForFullOfferID(xOffer.qwOfferID);
if (pDLC == NULL) {
// try the trial version
pDLC = app.GetDLCInfoForTrialOfferID(xOffer.qwOfferID);
}
if (pDLC == NULL) {
// skip this one
#ifdef _DEBUG
app.DebugPrintf("Unknown offer - ");
OutputDebugStringW(xOffer.wszOfferName);
app.DebugPrintf("\n");
#endif
continue;
}
// If the item has a gender, then skip ones that are the other
// gender
if ((pDLC->iGender == 1) && (m_bIsFemale == true)) {
app.DebugPrintf("Wrong gender\n");
continue;
}
// can't trust the offer type - partnernet is giving avatar items
// the CONTENT type
// if(Offer.dwOfferType==app.GetDLCContentType((eDLCContentType)m_iType))
if (pDLC->eDLCType == (eDLCContentType)m_iType) {
if (xOffer.fUserHasPurchased) {
HXUIBRUSH hBrush;
if (RenderManager.IsHiDef() ||
RenderManager.IsWidescreen()) {
swprintf(szResourceLocator, LOCATOR_SIZE,
L"section://%X,%ls#%ls", c_ModuleHandle,
L"media", L"media/Graphics/DLC_Tick.png");
XuiCreateTextureBrush(szResourceLocator, &hBrush);
} else {
swprintf(szResourceLocator, LOCATOR_SIZE,
L"section://%X,%ls#%ls", c_ModuleHandle,
L"media", L"media/Graphics/DLC_TickSmall.png");
XuiCreateTextureBrush(szResourceLocator, &hBrush);
}
m_pOffersList->UpdateGraphic(i, hBrush);
}
iCount++;
}
}
if (iCount > 0) {
bNoDLCToDisplay = false;
}
} else {
if (iOfferC != 0) {
pListInfo = new CXuiCtrl4JList::LIST_ITEM_INFO[iOfferC];
ZeroMemory(pListInfo,
sizeof(CXuiCtrl4JList::LIST_ITEM_INFO) * iOfferC);
}
for (int i = 0; i < iOfferC; i++) {
xOffer = StorageManager.GetOffer(i);
// Check that this is in the list of known DLC
DLC_INFO* pDLC = app.GetDLCInfoForFullOfferID(xOffer.qwOfferID);
if (pDLC == NULL) {
// try the trial version
pDLC = app.GetDLCInfoForTrialOfferID(xOffer.qwOfferID);
}
if (pDLC == NULL) {
// skip this one
#ifdef _DEBUG
app.DebugPrintf("Unknown offer - ");
OutputDebugStringW(xOffer.wszOfferName);
app.DebugPrintf("\n");
#endif
continue;
}
// can't trust the offer type - partnernet is giving avatar items
// the CONTENT type
// if(Offer.dwOfferType==app.GetDLCContentType((eDLCContentType)m_iType))
if (pDLC->eDLCType == (eDLCContentType)m_iType) {
std::wstring wstrTemp = xOffer.wszOfferName;
// If the string starts with Minecraft, removed that
// Bug 49249 - JPN: Code Defect: Missing Text: String
// 'Minecraft' is missing in contents download screen. Looks
// like we shouldn't be removing this text for Japanese, and
// probably Chinese & Korean
unsigned int dwLanguage = XGetLanguage();
switch (dwLanguage) {
case XC_LANGUAGE_KOREAN:
case XC_LANGUAGE_JAPANESE:
case XC_LANGUAGE_TCHINESE:
pListInfo[iCount].pwszText = xOffer.wszOfferName;
break;
default:
if (wstrTemp.compare(0, 10, L"Minecraft ") == 0) {
pListInfo[iCount].pwszText =
&xOffer.wszOfferName[10];
} else {
pListInfo[iCount].pwszText = xOffer.wszOfferName;
}
break;
}
pListInfo[iCount].fEnabled = TRUE;
// store the offer index
pListInfo[iCount].iData = i;
pListInfo[iCount].iSortIndex = (int)pDLC->uiSortIndex;
#ifdef _DEBUG
app.DebugPrintf("Adding ");
OutputDebugStringW(pListInfo[iCount].pwszText);
app.DebugPrintf(" at %d\n", i);
#endif
m_pOffersList->AddData(pListInfo[iCount], 0,
CXuiCtrl4JList::eSortList_Index);
// offerIndexes.push_back(i);
if (xOffer.fUserHasPurchased) {
HXUIBRUSH hBrush;
if (RenderManager.IsHiDef() ||
RenderManager.IsWidescreen()) {
swprintf(szResourceLocator, LOCATOR_SIZE,
L"section://%X,%ls#%ls", c_ModuleHandle,
L"media", L"media/Graphics/DLC_Tick.png");
XuiCreateTextureBrush(szResourceLocator, &hBrush);
} else {
swprintf(szResourceLocator, LOCATOR_SIZE,
L"section://%X,%ls#%ls", c_ModuleHandle,
L"media", L"media/Graphics/DLC_TickSmall.png");
XuiCreateTextureBrush(szResourceLocator, &hBrush);
}
m_pOffersList->UpdateGraphicFromiData(i, hBrush);
}
/** 4J JEV:
* We've filtered results out from the list, need to keep track
* of the 'actual' list index.
*/
iCount++;
}
}
// Check if there is nothing to display, and display the default
// "nothing available at this time"
if (iCount > 0) {
bNoDLCToDisplay = false;
}
}
// turn off the timer display
m_Timer.SetShow(FALSE);
if (iCount != 0) {
// get the right index for the first list item - it will have been
// re-sorted internally in the list
int iIndex = 0;
xOffer = StorageManager.GetOffer(m_pOffersList->GetData(iIndex).iData);
m_pOffersList->SetCurSelVisible(0);
DLC_INFO* dlc = app.GetDLCInfoForFullOfferID(xOffer.qwOfferID);
if (dlc != NULL) {
std::uint8_t* pData = NULL;
unsigned int dwSize = 0;
WCHAR* cString = dlc->wchBanner;
// is the file in the TMS XZP?
int iIndex = app.GetLocalTMSFileIndex(cString, true);
if (iIndex != -1) {
// it's in the xzp
if (m_hXuiBrush != NULL) {
XuiDestroyBrush(m_hXuiBrush);
// clear the TMS XZP vector memory
// app.FreeLocalTMSFiles();
}
app.LoadLocalTMSFile(cString);
XuiCreateTextureBrushFromMemory(app.TMSFileA[iIndex].pbData,
app.TMSFileA[iIndex].uiSize,
&m_hXuiBrush);
} else {
bool bPresent = app.IsFileInMemoryTextures(cString);
if (!bPresent) {
// Image has not come in yet
// Set the item monitored in the timer, so we can set the
// image when it comes in
m_pNoImageFor_DLC = dlc;
} else {
if (m_hXuiBrush != NULL) {
XuiDestroyBrush(m_hXuiBrush);
// clear the TMS XZP vector memory
// app.FreeLocalTMSFiles();
}
app.GetMemFileDetails(cString, &pData, &dwSize);
XuiCreateTextureBrushFromMemory(pData, dwSize,
&m_hXuiBrush);
}
}
}
wchar_t formatting[40];
std::wstring wstrTemp = xOffer.wszSellText;
swprintf(formatting, 40, L"<font size=\"%d\">", m_bIsSD ? 12 : 14);
wstrTemp = formatting + wstrTemp;
m_SellText.SetText(wstrTemp.c_str());
m_SellText.SetShow(TRUE);
// set the price info
m_PriceTag.SetShow(TRUE);
// swprintf(formatting, 40, L"%d",xOffer.dwPointsPrice);
// wstrTemp=std::wstring(formatting);
// m_PriceTag.SetText(wstrTemp.c_str());
m_PriceTag.SetText(xOffer.wszCurrencyPrice);
XuiElementSetShow(m_List, TRUE);
XuiElementSetFocus(m_List);
UpdateTooltips(xOffer);
} else if (bNoDLCToDisplay) {
// set the default text
wchar_t formatting[40];
std::wstring wstrTemp = app.GetString(IDS_NO_DLCOFFERS);
swprintf(formatting, 40, L"<font size=\"%d\">", m_bIsSD ? 12 : 14);
wstrTemp = formatting + wstrTemp;
m_SellText.SetText(wstrTemp.c_str());
m_SellText.SetShow(TRUE);
}
return S_OK;
}
HRESULT CScene_DLCOffers::OnDestroy() {
// 4J-PB - don't cancel the DLC anymore
// StorageManager.CancelGetDLCOffers();
// clear out any TMS images loaded from the XZP
app.FreeLocalTMSFiles(eTMSFileType_MinecraftStore);
return S_OK;
}
//----------------------------------------------------------------------------------
// Handler for the button press message.
//----------------------------------------------------------------------------------
HRESULT CScene_DLCOffers::OnNotifyPressEx(HXUIOBJ hObjPressed,
XUINotifyPress* pNotifyPressData,
BOOL& rfHandled) {
if (m_bIgnorePress) return S_OK;
// This assumes all buttons can only be pressed with the A button
ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A);
if (hObjPressed == m_List) {
CXuiControl pItem;
int iIndex;
CXuiCtrl4JList::LIST_ITEM_INFO ItemInfo;
// get the selected item
iIndex = m_List.GetCurSel(&pItem);
ItemInfo = m_pOffersList->GetData(iIndex);
ULONGLONG ullIndexA[1];
// check if it's already installed
// if(StorageManager.GetOffer(iIndex).fUserHasPurchased)
// {
//
// }
// else
// if it's already been purchased, we need to let the user download it
// anyway
{
ullIndexA[0] = StorageManager.GetOffer(ItemInfo.iData).qwOfferID;
StorageManager.InstallOffer(1, ullIndexA, NULL, NULL);
}
}
return S_OK;
}
HRESULT CScene_DLCOffers::OnKeyDown(XUIMessageInput* pInputData,
BOOL& rfHandled) {
// Fix for Compliance fail -
// On a functional console, the game must not enter an extended unresponsive
// state, cause unintentional loss of player data, crash, or cause an
// unintended reboot of the machine.
// if(m_bIgnorePress) return S_OK;
ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
switch (pInputData->dwKeyCode) {
case VK_PAD_B:
case VK_ESCAPE:
app.NavigateBack(XUSER_INDEX_ANY);
rfHandled = TRUE;
break;
case VK_PAD_RTHUMB_DOWN: {
XUIHtmlScrollInfo ScrollInfo;
XuiHtmlControlGetVScrollInfo(m_SellText.m_hObj, &ScrollInfo);
if (!ScrollInfo.bScrolling) {
XuiHtmlControlVScrollBy(m_SellText.m_hObj, 1);
}
} break;
case VK_PAD_RTHUMB_UP: {
XUIHtmlScrollInfo ScrollInfo;
XuiHtmlControlGetVScrollInfo(m_SellText.m_hObj, &ScrollInfo);
if (!ScrollInfo.bScrolling) {
XuiHtmlControlVScrollBy(m_SellText.m_hObj, -1);
}
} break;
}
return S_OK;
}
HRESULT CScene_DLCOffers::OnNavReturn(HXUIOBJ hObj, BOOL& rfHandled) {
// re-enable button presses
m_bIgnorePress = false;
return S_OK;
}
// void CScene_DLCOffers::UpdateTooltips(XMARKETPLACE_CONTENTOFFER_INFO& xOffer)
void CScene_DLCOffers::UpdateTooltips(
XMARKETPLACE_CURRENCY_CONTENTOFFER_INFO& xOffer) {
// if the current offer hasn't been purchased already, check if there's a
// trial version available
if (xOffer.fUserHasPurchased == false) {
ui.SetTooltips(DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_INSTALL,
IDS_TOOLTIPS_BACK);
} else {
ui.SetTooltips(DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_REINSTALL,
IDS_TOOLTIPS_BACK);
}
}
HRESULT CScene_DLCOffers::OnGetSourceDataImage(
XUIMessageGetSourceImage* pGetSourceImageData, BOOL& bHandled) {
if (pGetSourceImageData->bItemData) {
pGetSourceImageData->hBrush = m_hXuiBrush;
bHandled = TRUE;
}
return S_OK;
}
HRESULT CScene_DLCOffers::OnNotifySelChanged(
HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData,
BOOL& bHandled) {
// int index = pNotifySelChangedData->iItem;
// reset the image monitor, but not for the first selection
if (pNotifySelChangedData->iOldItem != -1) {
m_pNoImageFor_DLC = NULL;
}
if (m_List.TreeHasFocus()) // && offerIndexes.size() > index)
{
CXuiControl pItem;
int iIndex;
CXuiCtrl4JList::LIST_ITEM_INFO ItemInfo;
// get the selected item
iIndex = m_List.GetCurSel(&pItem);
ItemInfo = m_pOffersList->GetData(iIndex);
// XMARKETPLACE_CONTENTOFFER_INFO xOffer=
// StorageManager.GetOffer(ItemInfo.iData);
XMARKETPLACE_CURRENCY_CONTENTOFFER_INFO xOffer =
StorageManager.GetOffer(ItemInfo.iData);
wchar_t formatting[40];
std::wstring wstrTemp = xOffer.wszSellText;
swprintf(formatting, 40, L"<font size=\"%d\">", m_bIsSD ? 12 : 14);
wstrTemp = std::wstring(formatting) + wstrTemp;
m_SellText.SetText(wstrTemp.c_str());
// set the price info
m_PriceTag.SetShow(TRUE);
// swprintf(formatting, 40, L"%d",xOffer.dwPointsPrice);
// wstrTemp=std::wstring(formatting);
// m_PriceTag.SetText(wstrTemp.c_str());
m_PriceTag.SetText(xOffer.wszCurrencyPrice);
DLC_INFO* dlc = app.GetDLCInfoForTrialOfferID(xOffer.qwOfferID);
if (dlc == NULL) {
dlc = app.GetDLCInfoForFullOfferID(xOffer.qwOfferID);
}
if (dlc != NULL) {
std::uint8_t* pImage = NULL;
unsigned int dwSize = 0;
WCHAR* cString = dlc->wchBanner;
int iIndex = app.GetLocalTMSFileIndex(cString, true);
if (iIndex != -1) {
// it's in the xzp
if (m_hXuiBrush != NULL) {
XuiDestroyBrush(m_hXuiBrush);
// clear the TMS XZP vector memory
// app.FreeLocalTMSFiles();
}
app.LoadLocalTMSFile(cString);
XuiCreateTextureBrushFromMemory(app.TMSFileA[iIndex].pbData,
app.TMSFileA[iIndex].uiSize,
&m_hXuiBrush);
} else {
bool bPresent = app.IsFileInMemoryTextures(cString);
if (!bPresent) {
// Image has not come in yet
// Set the item monitored in the timer, so we can set the
// image when it comes in
m_pNoImageFor_DLC = dlc;
// promote it to the top of the queue of images to be
// retrieved We can't trust the dwContentCategory from
// partnernet - it has avatar items as content instead of
// avatars
app.AddTMSPPFileTypeRequest(dlc->eDLCType, true);
} else {
if (m_hXuiBrush != NULL) {
XuiDestroyBrush(m_hXuiBrush);
// clear the TMS XZP vector memory
// app.FreeLocalTMSFiles();
}
app.GetMemFileDetails(cString, &pImage, &dwSize);
XuiCreateTextureBrushFromMemory(pImage, dwSize,
&m_hXuiBrush);
}
}
} else {
if (m_hXuiBrush != NULL) {
XuiDestroyBrush(m_hXuiBrush);
// clear the TMS XZP vector memory
// app.FreeLocalTMSFiles();
m_hXuiBrush = NULL;
}
}
UpdateTooltips(xOffer);
} else {
m_SellText.SetText(L"");
ui.SetTooltips(DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_ACCEPT,
IDS_TOOLTIPS_BACK);
}
return S_OK;
}
HRESULT CScene_DLCOffers::OnTimer(XUIMessageTimer* pData, BOOL& rfHandled) {
// check the ethernet status - if it's disconnected, exit the xui
if (ProfileManager.GetLiveConnectionStatus() !=
XONLINE_S_LOGON_CONNECTION_ESTABLISHED) {
unsigned int uiIDA[1];
uiIDA[0] = IDS_CONFIRM_OK;
m_pOffersList->RemoveAllData();
m_iOfferC = 0;
StorageManager.ClearDLCOffers();
app.ClearAndResetDLCDownloadQueue();
StorageManager.RequestMessageBox(
IDS_CONNECTION_LOST, IDS_CONNECTION_LOST_LIVE, uiIDA, 1,
ProfileManager.GetPrimaryPad(),
&CConsoleMinecraftApp::EthernetDisconnectReturned, this,
app.GetStringTable());
}
// Is the DLC we're looking for available?
if (!m_bDLCRequiredIsRetrieved) {
if (app.DLCContentRetrieved((eDLCMarketplaceType)m_iType)) {
m_bDLCRequiredIsRetrieved = true;
// Retrieve the info
GetDLCInfo(app.GetDLCOffersCount(), false);
m_bIgnorePress = false;
}
}
// Check for any TMS image we're waiting for
if (m_pNoImageFor_DLC != NULL) {
// Is it present now?
WCHAR* cString = m_pNoImageFor_DLC->wchBanner;
bool bPresent = app.IsFileInMemoryTextures(cString);
if (bPresent) {
std::uint8_t* pImage = NULL;
unsigned int dwSize = 0;
if (m_hXuiBrush != NULL) {
XuiDestroyBrush(m_hXuiBrush);
// clear the TMS XZP vector memory
// app.FreeLocalTMSFiles();
}
app.GetMemFileDetails(cString, &pImage, &dwSize);
XuiCreateTextureBrushFromMemory(pImage, dwSize, &m_hXuiBrush);
m_pNoImageFor_DLC = NULL;
}
}
return S_OK;
}
// int CScene_DLCOffers::EthernetDisconnectReturned(void *pParam,int iPad,const
// C4JStorage::EMessageResult)
// {
// CConsoleMinecraftApp* pApp = (CConsoleMinecraftApp*)pParam;
//
// pApp->NavigateBack(XUSER_INDEX_ANY);
//
// return 0;
// }
HRESULT CScene_DLCOffers::OnCustomMessage_DLCInstalled() {
// mounted DLC may have changed - need to re-run the GetDLC
ui.SetTooltips(DEFAULT_XUI_MENU_USER, -1, IDS_TOOLTIPS_BACK);
m_bIgnorePress = true;
m_pOffersList->RemoveAllData();
m_iOfferC = 0;
// Update the dlc info
StorageManager.ClearDLCOffers();
app.ClearAndResetDLCDownloadQueue();
// order these requests so the current DLC comes in first
switch (m_iType) {
case e_DLC_Gamerpics:
app.AddDLCRequest(e_Marketplace_Gamerpics);
app.AddDLCRequest(e_Marketplace_Content);
app.AddDLCRequest(e_Marketplace_Themes);
app.AddDLCRequest(e_Marketplace_AvatarItems);
break;
case e_DLC_Themes:
app.AddDLCRequest(e_Marketplace_Themes);
app.AddDLCRequest(e_Marketplace_Content);
app.AddDLCRequest(e_Marketplace_Gamerpics);
app.AddDLCRequest(e_Marketplace_AvatarItems);
break;
case e_DLC_AvatarItems:
app.AddDLCRequest(e_Marketplace_AvatarItems);
app.AddDLCRequest(e_Marketplace_Content);
app.AddDLCRequest(e_Marketplace_Themes);
app.AddDLCRequest(e_Marketplace_Gamerpics);
break;
default:
app.AddDLCRequest(e_Marketplace_Content);
app.AddDLCRequest(e_Marketplace_Gamerpics);
app.AddDLCRequest(e_Marketplace_Themes);
app.AddDLCRequest(e_Marketplace_AvatarItems);
break;
}
m_Timer.SetShow(TRUE);
m_bDLCRequiredIsRetrieved = false;
return S_OK;
}