mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/LCE-Revelations.git
synced 2026-05-22 03:54:52 +00:00
---
Minecraft.Client/ClientConnection.cpp
Purpose: Propagate hardcore flag through network level creation
- handleLogin() (2 sites): Changed MultiPlayerLevel constructor calls from hardcoded false for the
hardcore parameter to packet->m_isHardcore, so the client-side level correctly knows it's hardcore
when joining a server.
- handleRespawn(): Same change - when creating a new dimension level on respawn, uses
packet->m_isHardcore instead of querying minecraft->level->getLevelData()->isHardcore() (which could
be stale/wrong).
---
Minecraft.Client/Common/App_Defines.h
Purpose: Define bitmask for hardcore host option
- Added GAME_HOST_OPTION_BITMASK_HARDCORE (0x40000000) - a new bit in the host options bitfield to
store whether the game is hardcore.
---
Minecraft.Client/Common/App_enums.h
Purpose: Add hardcore enum value
- Added eGameHostOption_Hardcore to the eGameHostOption enum so code can get/set the hardcore flag
via SetGameHostOption/GetGameHostOption.
---
Minecraft.Client/Common/Consoles_App.cpp
Purpose: Implement hardcore get/set in host options bitfield
- SetGameHostOption(): Added case eGameHostOption_Hardcore - sets or clears the
GAME_HOST_OPTION_BITMASK_HARDCORE bit.
- GetGameHostOption(): Added case eGameHostOption_Hardcore - returns 1 if the hardcore bit is set, 0
otherwise.
---
Minecraft.Client/Common/Consoles_App.h
Purpose: Store save folder name for hardcore world deletion
- Added SetCurrentSaveFolderName() and GetCurrentSaveFolderName() public methods.
- Added wstring m_currentSaveFolderName private member - stores the save folder name so the hardcore
death handler can find and delete the world.
---
Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp
Purpose: Delete hardcore world's save data on exit
- Added Win64_DeleteSaveDirectory() - a recursive directory deletion helper (Windows64 only).
- In _ExitWorld(): Before the server is torn down, captures whether this is a hardcore death exit
(getDeleteWorldOnExit()). Tries 3 sources for the save folder name: app storage, StorageManager, and
MinecraftServer.
- After the server fully stops, if shouldDeleteHardcoreWorld is true, deletes the entire
Windows64\GameHDD\<savefolder> directory.
---
Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp
Purpose: Hardcore difficulty slider in Create World menu
- Added file-scope s_bHardcore flag to track when the slider is at position 4 (Hardcore).
- Constructor: Extended difficulty slider range from 0-3 to 0-4, resets s_bHardcore to false.
- handleSliderMove(): When slider value >= 4, sets s_bHardcore = true, stores actual difficulty as 3
(Hard), and displays "Hardcore" label. Otherwise behaves normally.
- CreateGame(): Clears the save folder name (new world), and sets eGameHostOption_Hardcore based on
s_bHardcore.
- Minor: Changed RequestErrorMessage to RequestAlertMessage for a content restriction dialog.
---
Minecraft.Client/Common/UI/UIScene_DeathMenu.cpp
Purpose: Hardcore death screen behavior (Iggy UI)
- Constructor: Checks if current level is hardcore. If so, shows IDS_HARDCORE_DEATH_MESSAGE on the
respawn button and hides it. Otherwise shows normal "Respawn" button.
- handlePress() - Respawn: Added safeguard - if hardcore, blocks respawn entirely.
- handlePress() - Exit Game: If hardcore and host, skips save dialog, disables save-on-exit, enables
delete-world-on-exit, and triggers immediate world exit.
---
Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp
Purpose: Show "Difficulty: Hardcore" in Load World menu + persist hardcore through game launch
- Static array: Expanded m_iDifficultyTitleSettingA from 4 to 5 entries, added IDS_GAMEMODE_HARDCORE
at index 4.
- Constructor: Initializes m_bHardcore = false. In Windows64 block: sets up thumbnail name from save
details, and reads isHardcore from params->saveDetails. If hardcore, immediately initializes the
difficulty slider to show "Hardcore" locked at position 4.
- tick(): When host options are read (bHostOptionsRead block), also reads the hardcore flag and
re-initializes the slider if needed (for console path).
- handleSliderMove(): If m_bHardcore, locks the slider at position 4 (prevents changing difficulty).
- StartGameFromSave(): Stores the save folder name in app for later hardcore deletion. Sets
eGameHostOption_Hardcore from m_bHardcore.
---
Minecraft.Client/Common/UI/UIScene_LoadMenu.h
Purpose: Declare hardcore member
- Expanded m_iDifficultyTitleSettingA from [4] to [5].
- Added bool m_bHardcore private member.
---
Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp
Purpose: Read hardcore flag from level.dat when building the save list
- ReadLevelNameFromSaveFile(): Added optional bool *outHardcore parameter. Inside the NBT Data
compound tag parsing, if outHardcore is non-null, reads dataTag->getBoolean(L"hardcore").
- Save enumeration block (Windows64): Passes &saveHardcore to ReadLevelNameFromSaveFile and stores
the result in m_saveDetails[i].isHardcore.
---
Minecraft.Client/Common/UI/UIStructs.h
Purpose: Add isHardcore to save list details struct
- Added bool isHardcore field to _SaveListDetails struct.
- Initialized to false in the constructor.
---
Minecraft.Client/Common/XUI/XUI_Death.cpp
Purpose: Hardcore death screen behavior (XUI/Xbox UI)
- Mirror of the Iggy UIScene_DeathMenu.cpp changes but for the XUI rendering path.
- OnInit(): Checks isHardcore(), hides respawn button and shows death message if true.
- OnNotifyPressEx() - Exit Game: If hardcore and host, skips save, flags world for deletion, exits
immediately.
- OnNotifyPressEx() - Respawn: Safeguard to block respawn in hardcore.
---
Minecraft.Client/Gui.cpp
Purpose: Syntax fix
- Fixed lines.push_back(L"" → lines.push_back(L"") - missing closing quote/paren in debug terrain
feature display.
---
Minecraft.Client/MinecraftServer.cpp
Purpose: Server-side hardcore support
- Constructor: Initializes m_deleteWorldOnExit = false.
- loadLevel(): Captures the save folder name from StorageManager into m_saveFolderName for later use
in hardcore world deletion.
- isHardcore(): Changed from always returning false to returning
app.GetGameHostOption(eGameHostOption_Hardcore) > 0 - this is the key change that makes the server
actually report hardcore mode.
---
Minecraft.Client/MinecraftServer.h
Purpose: Declare hardcore-related members
- Added bool m_deleteWorldOnExit and wstring m_saveFolderName private members.
- Added setDeleteWorldOnExit(), getDeleteWorldOnExit(), and getSaveFolderName() public methods.
---
Minecraft.Client/PlayerConnection.h
Purpose: Thread-safety fix for kicked flag
- Changed m_bWasKicked from bool to std::atomic<bool> (initialized with {false}).
- Changed setWasKicked()/getWasKicked() to use .store()/.load() - fixes a race condition where the
kicked flag is set on one thread and read on another.
---
Minecraft.Client/PlayerList.cpp
Purpose: Hardcore multiplayer - ban, respawn as Adventure, thread-safe bans
- Constructor/Destructor: Added InitializeCriticalSection/DeleteCriticalSection for m_banCS.
- placeNewPlayer(): Passes isHardcore() flag to the LoginPacket constructor so clients joining know
it's hardcore.
- respawn(): After respawn in hardcore, forces the player into Adventure mode (spectate-like: can
look around but not interact). Sends GameEventPacket to sync client.
- respawn() and toggleDimension() (2 sites): Pass isHardcore() to RespawnPacket constructor.
- isXuidBanned(): Wrapped m_bannedXuids iteration with EnterCriticalSection/LeaveCriticalSection for
thread safety.
- banXuid() (new): Thread-safe method to add a player's XUID to the ban list - used when a player
dies in hardcore multiplayer.
---
Minecraft.Client/PlayerList.h
Purpose: Declare ban-related additions
- Added CRITICAL_SECTION m_banCS to protect m_bannedXuids.
- Added void banXuid(PlayerUID xuid) public method.
---
Minecraft.Client/SelectWorldScreen.cpp
Purpose: Show [Hardcore] badge in Java-style world list
- In renderItem(): If levelSummary->isHardcore(), appends [Hardcore] to the world name display.
---
Minecraft.Client/ServerPlayer.cpp
Purpose: Hardcore death behavior on server
- die(): If the level is hardcore, switches the dead player to Adventure mode (so they can't
interact if somehow respawned).
- Minor: Two comment lines changed // → /// (no functional change).
---
Minecraft.Client/Windows64Media/strings.h
Purpose: String IDs for hardcore UI text
- Added 8 new string IDs (2286-2293): IDS_GAMEMODE_HARDCORE, IDS_HARDCORE, IDS_HARDCORE_TOOLTIP,
IDS_HARDCORE_WARNING_TITLE, IDS_HARDCORE_WARNING_TEXT, IDS_HARDCORE_DEATH_MESSAGE,
IDS_LABEL_HARDCORE, IDS_GAMEOPTION_HARDCORE.
---
Minecraft.World/ConsoleSaveFileOriginal.cpp
Purpose: Capture save folder name after first save (for new worlds)
- SaveSaveDataCallback() (Windows64 only): After a successful save, if the app doesn't yet know the
save folder name, attempts to capture it via StorageManager or by scanning Windows64\GameHDD\ for
the newest folder. This handles the case where a newly-created hardcore world hasn't been saved yet
when the folder name is needed.
---
Minecraft.World/DisconnectPacket.h
Purpose: Hardcore disconnect reason
- Added eDisconnect_HardcoreDeath to the disconnect reason enum - used when kicking a player who
died in hardcore multiplayer.
---
Minecraft.World/LoginPacket.cpp & LoginPacket.h
Purpose: Serialize hardcore flag in login packet
- Added bool m_isHardcore member, initialized to false in both constructors.
- Server→Client constructor now accepts bool isHardcore = false parameter.
- read(): Reads m_isHardcore from the stream.
- write(): Writes m_isHardcore to the stream.
- getEstimatedSize(): Added sizeof(bool) for the new field.
---
Minecraft.World/RespawnPacket.cpp & RespawnPacket.h
Purpose: Serialize hardcore flag in respawn packet
- Added bool m_isHardcore member, initialized to false.
- Constructor now accepts bool isHardcore = false parameter.
- read()/write(): Serialize m_isHardcore via readBoolean()/writeBoolean().
- getEstimatedSize(): Changed from 13 to 14 bytes to account for the new boolean.
783 lines
27 KiB
C++
783 lines
27 KiB
C++
#include "stdafx.h"
|
|
#include "IUIScene_PauseMenu.h"
|
|
#include "..\..\Minecraft.h"
|
|
#include "..\..\MinecraftServer.h"
|
|
#include "..\..\MultiPlayerLevel.h"
|
|
#include "..\..\ProgressRenderer.h"
|
|
#include "..\..\..\Minecraft.World\net.minecraft.world.level.h"
|
|
#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h"
|
|
#include "..\..\TexturePackRepository.h"
|
|
#include "..\..\TexturePack.h"
|
|
#include "..\..\DLCTexturePack.h"
|
|
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
|
|
|
#ifndef _XBOX
|
|
#include "UI.h"
|
|
#endif
|
|
|
|
|
|
int IUIScene_PauseMenu::ExitGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
#ifdef _XBOX
|
|
IUIScene_PauseMenu *pScene = (IUIScene_PauseMenu *)pParam;
|
|
#else
|
|
IUIScene_PauseMenu *pScene = dynamic_cast<IUIScene_PauseMenu *>(ui.GetSceneFromCallbackId((size_t)pParam));
|
|
#endif
|
|
|
|
// Results switched for this dialog
|
|
if(result==C4JStorage::EMessage_ResultDecline)
|
|
{
|
|
if(pScene) pScene->SetIgnoreInput(true);
|
|
app.SetAction(iPad,eAppAction_ExitWorld);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
#ifdef _XBOX
|
|
IUIScene_PauseMenu *pScene = (IUIScene_PauseMenu *)pParam;
|
|
#else
|
|
IUIScene_PauseMenu *pScene = dynamic_cast<IUIScene_PauseMenu *>(ui.GetSceneFromCallbackId((size_t)pParam));
|
|
#endif
|
|
|
|
// Exit with or without saving
|
|
// Decline means save in this dialog
|
|
if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption)
|
|
{
|
|
if( result==C4JStorage::EMessage_ResultDecline ) // Save
|
|
{
|
|
// 4J-PB - Is the player trying to save but they are using a trial texturepack ?
|
|
if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin())
|
|
{
|
|
TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected();
|
|
DLCTexturePack *pDLCTexPack=static_cast<DLCTexturePack *>(tPack);
|
|
|
|
DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack();
|
|
if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" ))
|
|
{
|
|
#ifdef _XBOX
|
|
// upsell
|
|
ULONGLONG ullOfferID_Full;
|
|
// get the dlc texture pack
|
|
DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack;
|
|
|
|
app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full);
|
|
|
|
// tell sentient about the upsell of the full version of the skin pack
|
|
TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF);
|
|
#endif
|
|
|
|
UINT uiIDA[2];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
uiIDA[1]=IDS_CONFIRM_CANCEL;
|
|
|
|
// Give the player a warning about the trial version of the texture pack
|
|
ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() , &IUIScene_PauseMenu::WarningTrialTexturePackReturned, pParam);
|
|
|
|
return S_OK;
|
|
}
|
|
}
|
|
|
|
// does the save exist?
|
|
bool bSaveExists;
|
|
StorageManager.DoesSaveExist(&bSaveExists);
|
|
// 4J-PB - we check if the save exists inside the libs
|
|
// we need to ask if they are sure they want to overwrite the existing game
|
|
if(bSaveExists)
|
|
{
|
|
UINT uiIDA[2];
|
|
uiIDA[0]=IDS_CONFIRM_CANCEL;
|
|
uiIDA[1]=IDS_CONFIRM_OK;
|
|
ui.RequestAlertMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameAndSaveReturned, pParam);
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
#if defined(_XBOX_ONE) || defined(__ORBIS__)
|
|
StorageManager.SetSaveDisabled(false);
|
|
#endif
|
|
MinecraftServer::getInstance()->setSaveOnExit( true );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// been a few requests for a confirm on exit without saving
|
|
UINT uiIDA[2];
|
|
uiIDA[0]=IDS_CONFIRM_CANCEL;
|
|
uiIDA[1]=IDS_CONFIRM_OK;
|
|
ui.RequestAlertMessage(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameDeclineSaveReturned, pParam);
|
|
return 0;
|
|
}
|
|
|
|
if(pScene) pScene->SetIgnoreInput(true);
|
|
|
|
app.SetAction(iPad,eAppAction_ExitWorld);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int IUIScene_PauseMenu::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
// 4J-PB - we won't come in here if we have a trial texture pack
|
|
#ifdef _XBOX
|
|
IUIScene_PauseMenu *pScene = (IUIScene_PauseMenu *)pParam;
|
|
#else
|
|
IUIScene_PauseMenu *pScene = dynamic_cast<IUIScene_PauseMenu *>(ui.GetSceneFromCallbackId((size_t)pParam));
|
|
#endif
|
|
|
|
// results switched for this dialog
|
|
if(result==C4JStorage::EMessage_ResultDecline)
|
|
{
|
|
//INT saveOrCheckpointId = 0;
|
|
//bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId);
|
|
//SentientManager.RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId);
|
|
#if defined(_XBOX_ONE) || defined(__ORBIS__)
|
|
StorageManager.SetSaveDisabled(false);
|
|
#endif
|
|
if(pScene) pScene->SetIgnoreInput(true);
|
|
MinecraftServer::getInstance()->setSaveOnExit( true );
|
|
// flag a app action of exit game
|
|
app.SetAction(iPad,eAppAction_ExitWorld);
|
|
}
|
|
else
|
|
{
|
|
// has someone disconnected the ethernet here, causing the pause menu to shut?
|
|
if(ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad()))
|
|
{
|
|
UINT uiIDA[3];
|
|
// you cancelled the save on exit after choosing exit and save? You go back to the Exit choices then.
|
|
uiIDA[0]=IDS_CONFIRM_CANCEL;
|
|
uiIDA[1]=IDS_EXIT_GAME_SAVE;
|
|
uiIDA[2]=IDS_EXIT_GAME_NO_SAVE;
|
|
|
|
if(g_NetworkManager.GetPlayerCount()>1)
|
|
{
|
|
ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam);
|
|
}
|
|
else
|
|
{
|
|
ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam);
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int IUIScene_PauseMenu::ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
#ifdef _XBOX
|
|
IUIScene_PauseMenu *pScene = (IUIScene_PauseMenu *)pParam;
|
|
#else
|
|
IUIScene_PauseMenu *pScene = dynamic_cast<IUIScene_PauseMenu *>(ui.GetSceneFromCallbackId((size_t)pParam));
|
|
#endif
|
|
|
|
// results switched for this dialog
|
|
if(result==C4JStorage::EMessage_ResultDecline)
|
|
{
|
|
#if defined(_XBOX_ONE) || defined(__ORBIS__)
|
|
// Don't do this here, as it will still try and save some things even though it shouldn't!
|
|
//StorageManager.SetSaveDisabled(false);
|
|
#endif
|
|
if(pScene) pScene->SetIgnoreInput(true);
|
|
MinecraftServer::getInstance()->setSaveOnExit( false );
|
|
// flag a app action of exit game
|
|
app.SetAction(iPad,eAppAction_ExitWorld);
|
|
}
|
|
else
|
|
{
|
|
// has someone disconnected the ethernet here, causing the pause menu to shut?
|
|
if(ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad()))
|
|
{
|
|
UINT uiIDA[3];
|
|
// you cancelled the save on exit after choosing exit and save? You go back to the Exit choices then.
|
|
uiIDA[0]=IDS_CONFIRM_CANCEL;
|
|
uiIDA[1]=IDS_EXIT_GAME_SAVE;
|
|
uiIDA[2]=IDS_EXIT_GAME_NO_SAVE;
|
|
|
|
if(g_NetworkManager.GetPlayerCount()>1)
|
|
{
|
|
ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam);
|
|
}
|
|
else
|
|
{
|
|
ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam);
|
|
}
|
|
}
|
|
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int IUIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__)
|
|
if(result==C4JStorage::EMessage_ResultAccept)
|
|
{
|
|
if(!ProfileManager.IsSignedInLive(iPad))
|
|
{
|
|
// you're not signed in to PSN!
|
|
|
|
}
|
|
else
|
|
{
|
|
// 4J-PB - need to check this user can access the store
|
|
bool bContentRestricted;
|
|
ProfileManager.GetChatAndContentRestrictions(iPad,true,nullptr,&bContentRestricted,nullptr);
|
|
if(bContentRestricted)
|
|
{
|
|
UINT uiIDA[1];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad);
|
|
}
|
|
else
|
|
{
|
|
// need to get info on the pack to see if the user has already downloaded it
|
|
TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected();
|
|
DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack;
|
|
|
|
// retrieve the store name for the skin pack
|
|
DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack();
|
|
const char *pchPackName=wstringtofilename(pDLCPack->getName());
|
|
app.DebugPrintf("Texture Pack - %s\n",pchPackName);
|
|
SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo((char *)pchPackName);
|
|
|
|
if(pSONYDLCInfo!=nullptr)
|
|
{
|
|
char chName[42];
|
|
char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN];
|
|
|
|
memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN);
|
|
// find the info on the skin pack
|
|
// we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it.
|
|
// So we assume the first sku for the product is the one we want
|
|
#ifdef __ORBIS__
|
|
sprintf(chName,"%s",pSONYDLCInfo->chDLCKeyname);
|
|
#else
|
|
sprintf(chName,"%s-%s",app.GetCommerceCategory(),pSONYDLCInfo->chDLCKeyname);
|
|
#endif
|
|
app.GetDLCSkuIDFromProductList(chName,chSkuID);
|
|
// 4J-PB - need to check for an empty store
|
|
#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__
|
|
if(app.CheckForEmptyStore(iPad)==false)
|
|
#endif
|
|
{
|
|
if(app.DLCAlreadyPurchased(chSkuID))
|
|
{
|
|
app.DownloadAlreadyPurchased(chSkuID);
|
|
}
|
|
else
|
|
{
|
|
app.Checkout(chSkuID);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif //
|
|
|
|
#ifdef _XBOX_ONE
|
|
IUIScene_PauseMenu* pScene = (IUIScene_PauseMenu*)pParam;
|
|
|
|
if(result==C4JStorage::EMessage_ResultAccept)
|
|
{
|
|
if(ProfileManager.IsSignedIn(iPad))
|
|
{
|
|
if (ProfileManager.IsSignedInLive(iPad))
|
|
{
|
|
TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected();
|
|
// get the dlc texture pack
|
|
DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack;
|
|
|
|
DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();
|
|
|
|
DLC_INFO *pDLCInfo=app.GetDLCInfoForProductName((WCHAR *)pDLCPack->getName().c_str());
|
|
|
|
StorageManager.InstallOffer(1,(WCHAR *)pDLCInfo->wsProductId.c_str(),nullptr,nullptr);
|
|
|
|
// the license change coming in when the offer has been installed will cause this scene to refresh
|
|
}
|
|
else
|
|
{
|
|
// 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why.
|
|
UINT uiIDA[1] = { IDS_CONFIRM_OK };
|
|
ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef _XBOX
|
|
IUIScene_PauseMenu* pScene = (IUIScene_PauseMenu*)pParam;
|
|
|
|
//pScene->m_bIgnoreInput = false;
|
|
pScene->ShowScene( true );
|
|
if(result==C4JStorage::EMessage_ResultAccept)
|
|
{
|
|
if(ProfileManager.IsSignedIn(iPad))
|
|
{
|
|
ULONGLONG ullIndexA[1];
|
|
|
|
TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected();
|
|
// get the dlc texture pack
|
|
DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack;
|
|
|
|
// Need to get the parent packs id, since this may be one of many child packs with their own ids
|
|
app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullIndexA[0]);
|
|
|
|
// need to allow downloads here, or the player would need to quit the game to let the download of a texture 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,nullptr,nullptr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Texture_DLC, ( pScene->m_pDLCPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined);
|
|
}
|
|
#endif
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int IUIScene_PauseMenu::SaveWorldThreadProc( LPVOID lpParameter )
|
|
{
|
|
bool bAutosave=static_cast<bool>(lpParameter);
|
|
if(bAutosave)
|
|
{
|
|
app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_AutoSaveGame);
|
|
}
|
|
else
|
|
{
|
|
app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_SaveGame);
|
|
}
|
|
|
|
// Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running
|
|
AABB::UseDefaultThreadStorage();
|
|
Vec3::UseDefaultThreadStorage();
|
|
Compression::UseDefaultThreadStorage();
|
|
|
|
Minecraft *pMinecraft=Minecraft::GetInstance();
|
|
|
|
//wprintf(L"Loading world on thread\n");
|
|
|
|
if(ProfileManager.IsFullVersion())
|
|
{
|
|
app.SetGameStarted(false);
|
|
|
|
while( app.GetXuiServerAction(ProfileManager.GetPrimaryPad() ) != eXuiServerAction_Idle && !MinecraftServer::serverHalted() )
|
|
{
|
|
Sleep(10);
|
|
}
|
|
|
|
if(!MinecraftServer::serverHalted() && !app.GetChangingSessionType() ) app.SetGameStarted(true);
|
|
|
|
#if defined(_XBOX_ONE) || defined(__ORBIS__)
|
|
if(app.GetGameHostOption(eGameHostOption_DisableSaving)) StorageManager.SetSaveDisabled(true);
|
|
#endif
|
|
}
|
|
|
|
HRESULT hr = S_OK;
|
|
if(app.GetChangingSessionType())
|
|
{
|
|
// 4J Stu - This causes the fullscreenprogress scene to ignore the action it was given
|
|
hr = ERROR_CANCELLED;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
int IUIScene_PauseMenu::ExitWorldThreadProc( void* lpParameter )
|
|
{
|
|
// Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running
|
|
AABB::UseDefaultThreadStorage();
|
|
Vec3::UseDefaultThreadStorage();
|
|
Compression::UseDefaultThreadStorage();
|
|
|
|
//app.SetGameStarted(false);
|
|
|
|
_ExitWorld(lpParameter);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
#ifdef _WINDOWS64
|
|
static bool Win64_DeleteSaveDirectory(const wchar_t* wPath)
|
|
{
|
|
wchar_t wSearch[MAX_PATH];
|
|
swprintf_s(wSearch, MAX_PATH, L"%s\\*", wPath);
|
|
WIN32_FIND_DATAW fd;
|
|
HANDLE hFind = FindFirstFileW(wSearch, &fd);
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
if (wcscmp(fd.cFileName, L".") == 0 || wcscmp(fd.cFileName, L"..") == 0) continue;
|
|
wchar_t wChild[MAX_PATH];
|
|
swprintf_s(wChild, MAX_PATH, L"%s\\%s", wPath, fd.cFileName);
|
|
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
Win64_DeleteSaveDirectory(wChild);
|
|
else
|
|
DeleteFileW(wChild);
|
|
} while (FindNextFileW(hFind, &fd));
|
|
FindClose(hFind);
|
|
}
|
|
return RemoveDirectoryW(wPath) != 0;
|
|
}
|
|
#endif // _WINDOWS64
|
|
|
|
// This function performs the meat of exiting from a level. It should be called from a thread other than the main thread.
|
|
void IUIScene_PauseMenu::_ExitWorld(LPVOID lpParameter)
|
|
{
|
|
Minecraft *pMinecraft=Minecraft::GetInstance();
|
|
|
|
// 4J Added: Capture hardcore delete info before the server is destroyed
|
|
#ifdef _WINDOWS64
|
|
bool shouldDeleteHardcoreWorld = false;
|
|
wstring hardcoreSaveFolderName;
|
|
if (MinecraftServer::getInstance() != nullptr && MinecraftServer::getInstance()->getDeleteWorldOnExit())
|
|
{
|
|
shouldDeleteHardcoreWorld = true;
|
|
// Try 1: Use the save folder name stored by UIScene_LoadMenu::StartGameFromSave (works for existing saves)
|
|
hardcoreSaveFolderName = app.GetCurrentSaveFolderName();
|
|
if (!hardcoreSaveFolderName.empty())
|
|
{
|
|
app.DebugPrintf("Hardcore mode: save folder from app = '%ls'\n", hardcoreSaveFolderName.c_str());
|
|
}
|
|
// Try 2: StorageManager (may work for new saves after first autosave)
|
|
if (hardcoreSaveFolderName.empty())
|
|
{
|
|
char szSaveFolder[MAX_SAVEFILENAME_LENGTH] = {};
|
|
StorageManager.GetSaveUniqueFilename(szSaveFolder);
|
|
if (szSaveFolder[0] != '\0')
|
|
{
|
|
wchar_t wSaveFolder[MAX_SAVEFILENAME_LENGTH] = {};
|
|
mbstowcs(wSaveFolder, szSaveFolder, MAX_SAVEFILENAME_LENGTH - 1);
|
|
hardcoreSaveFolderName = wSaveFolder;
|
|
app.DebugPrintf("Hardcore mode: save folder from StorageManager = '%s'\n", szSaveFolder);
|
|
}
|
|
}
|
|
// Try 3: Stored during loadLevel
|
|
if (hardcoreSaveFolderName.empty())
|
|
{
|
|
hardcoreSaveFolderName = MinecraftServer::getInstance()->getSaveFolderName();
|
|
app.DebugPrintf("Hardcore mode: save folder from server = '%ls'\n", hardcoreSaveFolderName.c_str());
|
|
}
|
|
MinecraftServer::getInstance()->setDeleteWorldOnExit(false);
|
|
}
|
|
#endif
|
|
|
|
int exitReasonStringId = pMinecraft->progressRenderer->getCurrentTitle();
|
|
int exitReasonTitleId = IDS_CONNECTION_LOST;
|
|
|
|
bool saveStats = true;
|
|
if (pMinecraft->isClientSide() || g_NetworkManager.IsInSession())
|
|
{
|
|
if(lpParameter != nullptr )
|
|
{
|
|
// 4J-PB - check if we have lost connection to Live
|
|
if(ProfileManager.GetLiveConnectionStatus()!=XONLINE_S_LOGON_CONNECTION_ESTABLISHED )
|
|
{
|
|
exitReasonStringId = IDS_CONNECTION_LOST_LIVE;
|
|
}
|
|
else
|
|
{
|
|
switch( app.GetDisconnectReason() )
|
|
{
|
|
case DisconnectPacket::eDisconnect_Kicked:
|
|
exitReasonStringId = IDS_DISCONNECTED_KICKED;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_NoUGC_AllLocal:
|
|
exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL;
|
|
exitReasonTitleId = IDS_CONNECTION_FAILED;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_NoUGC_Single_Local:
|
|
exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL;
|
|
exitReasonTitleId = IDS_CONNECTION_FAILED;
|
|
break;
|
|
#if defined(__PS3__) || defined(__ORBIS__)
|
|
case DisconnectPacket::eDisconnect_ContentRestricted_AllLocal:
|
|
exitReasonStringId = IDS_CONTENT_RESTRICTION_MULTIPLAYER;
|
|
exitReasonTitleId = IDS_CONNECTION_FAILED;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_ContentRestricted_Single_Local:
|
|
exitReasonStringId = IDS_CONTENT_RESTRICTION;
|
|
exitReasonTitleId = IDS_CONNECTION_FAILED;
|
|
break;
|
|
#endif
|
|
#ifdef _XBOX
|
|
case DisconnectPacket::eDisconnect_NoUGC_Remote:
|
|
exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE;
|
|
exitReasonTitleId = IDS_CONNECTION_FAILED;
|
|
break;
|
|
#endif
|
|
case DisconnectPacket::eDisconnect_NoFlying:
|
|
exitReasonStringId = IDS_DISCONNECTED_FLYING;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_Quitting:
|
|
exitReasonStringId = IDS_DISCONNECTED_SERVER_QUIT;
|
|
break;
|
|
#ifdef __ORBIS__
|
|
case DisconnectPacket::eDisconnect_NetworkError:
|
|
exitReasonStringId = IDS_ERROR_NETWORK_EXIT;
|
|
exitReasonTitleId = IDS_ERROR_NETWORK_TITLE;
|
|
break;
|
|
#endif
|
|
case DisconnectPacket::eDisconnect_NoFriendsInGame:
|
|
exitReasonStringId = IDS_DISCONNECTED_NO_FRIENDS_IN_GAME;
|
|
exitReasonTitleId = IDS_CANTJOIN_TITLE;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_Banned:
|
|
exitReasonStringId = IDS_DISCONNECTED_BANNED;
|
|
exitReasonTitleId = IDS_CANTJOIN_TITLE;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_NotFriendsWithHost:
|
|
exitReasonStringId = IDS_NOTALLOWED_FRIENDSOFFRIENDS;
|
|
exitReasonTitleId = IDS_CANTJOIN_TITLE;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_OutdatedServer:
|
|
exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD;
|
|
exitReasonTitleId = IDS_CANTJOIN_TITLE;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_OutdatedClient:
|
|
exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD;
|
|
exitReasonTitleId = IDS_CANTJOIN_TITLE;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_ServerFull:
|
|
exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL;
|
|
exitReasonTitleId = IDS_CANTJOIN_TITLE;
|
|
break;
|
|
#ifdef _XBOX_ONE
|
|
case DisconnectPacket::eDisconnect_ExitedGame:
|
|
exitReasonTitleId = IDS_EXIT_GAME;
|
|
exitReasonStringId = IDS_DISCONNECTED_EXITED_GAME;
|
|
break;
|
|
#endif
|
|
|
|
#if defined __ORBIS__ || defined __PS3__ || defined __PSVITA__
|
|
case DisconnectPacket::eDisconnect_NATMismatch:
|
|
exitReasonStringId = IDS_DISCONNECTED_NAT_TYPE_MISMATCH;
|
|
exitReasonTitleId = IDS_CONNECTION_FAILED;
|
|
break;
|
|
#endif
|
|
default:
|
|
exitReasonStringId = IDS_CONNECTION_LOST_SERVER;
|
|
}
|
|
}
|
|
//pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId );
|
|
|
|
UINT uiIDA[1];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
// 4J Stu - Fix for #48669 - TU5: Code: Compliance: TCR #15: Incorrect/misleading messages after signing out a profile during online game session.
|
|
// If the primary player is signed out, then that is most likely the cause of the disconnection so don't display a message box. This will allow the message box requested by the libraries to be brought up
|
|
if( ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad())) ui.RequestErrorMessage( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad());
|
|
exitReasonStringId = -1;
|
|
|
|
// 4J - Force a disconnection, this handles the situation that the server has already disconnected
|
|
if( pMinecraft->levels[0] != nullptr ) pMinecraft->levels[0]->disconnect(false);
|
|
if( pMinecraft->levels[1] != nullptr ) pMinecraft->levels[1]->disconnect(false);
|
|
if( pMinecraft->levels[2] != nullptr ) pMinecraft->levels[2]->disconnect(false);
|
|
}
|
|
else
|
|
{
|
|
exitReasonStringId = IDS_EXITING_GAME;
|
|
pMinecraft->progressRenderer->progressStartNoAbort( IDS_EXITING_GAME );
|
|
if( pMinecraft->levels[0] != nullptr ) pMinecraft->levels[0]->disconnect();
|
|
if( pMinecraft->levels[1] != nullptr ) pMinecraft->levels[1]->disconnect();
|
|
if( pMinecraft->levels[2] != nullptr ) pMinecraft->levels[2]->disconnect();
|
|
}
|
|
|
|
// 4J Stu - This only does something if we actually have a server, so don't need to do any other checks
|
|
MinecraftServer::HaltServer();
|
|
|
|
// We need to call the stats & leaderboards save before we exit the session
|
|
// 4J We need to do this in a QNet callback where it is safe
|
|
//pMinecraft->forceStatsSave();
|
|
saveStats = false;
|
|
|
|
// 4J Stu - Leave the session once the disconnect packet has been sent
|
|
g_NetworkManager.LeaveGame(FALSE);
|
|
}
|
|
else
|
|
{
|
|
if(lpParameter != nullptr && ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad()) )
|
|
{
|
|
switch( app.GetDisconnectReason() )
|
|
{
|
|
case DisconnectPacket::eDisconnect_Kicked:
|
|
exitReasonStringId = IDS_DISCONNECTED_KICKED;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_NoUGC_AllLocal:
|
|
exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL;
|
|
exitReasonTitleId = IDS_CONNECTION_FAILED;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_NoUGC_Single_Local:
|
|
exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL;
|
|
exitReasonTitleId = IDS_CONNECTION_FAILED;
|
|
break;
|
|
#if defined(__PS3__) || defined(__ORBIS__)
|
|
case DisconnectPacket::eDisconnect_ContentRestricted_AllLocal:
|
|
exitReasonStringId = IDS_CONTENT_RESTRICTION_MULTIPLAYER;
|
|
exitReasonTitleId = IDS_CONNECTION_FAILED;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_ContentRestricted_Single_Local:
|
|
exitReasonStringId = IDS_CONTENT_RESTRICTION;
|
|
exitReasonTitleId = IDS_CONNECTION_FAILED;
|
|
break;
|
|
#endif
|
|
#ifdef _XBOX
|
|
case DisconnectPacket::eDisconnect_NoUGC_Remote:
|
|
exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE;
|
|
exitReasonTitleId = IDS_CONNECTION_FAILED;
|
|
break;
|
|
#endif
|
|
case DisconnectPacket::eDisconnect_Quitting:
|
|
exitReasonStringId = IDS_DISCONNECTED_SERVER_QUIT;
|
|
break;
|
|
#ifdef __ORBIS__
|
|
case DisconnectPacket::eDisconnect_NetworkError:
|
|
exitReasonStringId = IDS_ERROR_NETWORK_EXIT;
|
|
exitReasonTitleId = IDS_ERROR_NETWORK_TITLE;
|
|
break;
|
|
#endif
|
|
case DisconnectPacket::eDisconnect_NoMultiplayerPrivilegesJoin:
|
|
exitReasonStringId = IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_OutdatedServer:
|
|
exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD;
|
|
exitReasonTitleId = IDS_CANTJOIN_TITLE;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_OutdatedClient:
|
|
exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD;
|
|
exitReasonTitleId = IDS_CANTJOIN_TITLE;
|
|
break;
|
|
case DisconnectPacket::eDisconnect_ServerFull:
|
|
exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL;
|
|
exitReasonTitleId = IDS_CANTJOIN_TITLE;
|
|
break;
|
|
#if defined __ORBIS__ || defined __PS3__ || defined __PSVITA__
|
|
case DisconnectPacket::eDisconnect_NATMismatch:
|
|
exitReasonStringId = IDS_DISCONNECTED_NAT_TYPE_MISMATCH;
|
|
exitReasonTitleId = IDS_CONNECTION_FAILED;
|
|
break;
|
|
#endif
|
|
default:
|
|
exitReasonStringId = IDS_DISCONNECTED;
|
|
}
|
|
//pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId );
|
|
|
|
UINT uiIDA[1];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
ui.RequestErrorMessage( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad());
|
|
exitReasonStringId = -1;
|
|
}
|
|
}
|
|
// Fix for #93148 - TCR 001: BAS Game Stability: Title will crash for the multiplayer client if host of the game will exit during the clients loading to created world.
|
|
while( g_NetworkManager.IsNetworkThreadRunning() )
|
|
{
|
|
Sleep(1);
|
|
}
|
|
// 4J Added: Hardcore mode — delete world save data now that the server is fully stopped
|
|
#ifdef _WINDOWS64
|
|
if (shouldDeleteHardcoreWorld && !hardcoreSaveFolderName.empty())
|
|
{
|
|
wchar_t wFolderPath[MAX_PATH] = {};
|
|
swprintf_s(wFolderPath, MAX_PATH, L"Windows64\\GameHDD\\%s", hardcoreSaveFolderName.c_str());
|
|
app.DebugPrintf("Hardcore mode: Deleting world save folder '%ls'\n", wFolderPath);
|
|
Win64_DeleteSaveDirectory(wFolderPath);
|
|
}
|
|
#endif
|
|
|
|
pMinecraft->setLevel(nullptr,exitReasonStringId,nullptr,saveStats);
|
|
|
|
TelemetryManager->Flush();
|
|
|
|
app.m_gameRules.unloadCurrentGameRules();
|
|
//app.m_Audio.unloadCurrentAudioDetails();
|
|
|
|
MinecraftServer::resetFlags();
|
|
|
|
// Fix for #48385 - BLACK OPS :TU5: Functional: Client becomes pseudo soft-locked when returned to the main menu after a remote disconnect
|
|
// Make sure there is text explaining why the player is waiting
|
|
pMinecraft->progressRenderer->progressStart(IDS_EXITING_GAME);
|
|
|
|
// Fix for #13259 - CRASH: Gameplay: loading process is halted when player loads saved data
|
|
// We can't start/join a new game until the session is destroyed, so wait for it to be idle again
|
|
while( g_NetworkManager.IsInSession() )
|
|
{
|
|
Sleep(1);
|
|
}
|
|
|
|
app.SetChangingSessionType(false);
|
|
app.SetReallyChangingSessionType(false);
|
|
|
|
#if defined(_XBOX_ONE) || defined(__ORBIS__)
|
|
// Make sure we don't think saving is disabled in the menus
|
|
StorageManager.SetSaveDisabled(false);
|
|
#endif
|
|
}
|
|
|
|
|
|
int IUIScene_PauseMenu::SaveGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
// results switched for this dialog
|
|
if(result==C4JStorage::EMessage_ResultDecline)
|
|
{
|
|
#if defined(_XBOX_ONE) || defined(__ORBIS__)
|
|
UINT uiIDA[2];
|
|
uiIDA[0]=IDS_CONFIRM_CANCEL;
|
|
uiIDA[1]=IDS_CONFIRM_OK;
|
|
ui.RequestAlertMessage(IDS_TITLE_ENABLE_AUTOSAVE, IDS_CONFIRM_ENABLE_AUTOSAVE, uiIDA, 2, iPad,&IUIScene_PauseMenu::EnableAutosaveDialogReturned,pParam);
|
|
#else
|
|
// flag a app action of save game
|
|
app.SetAction(iPad,eAppAction_SaveGame);
|
|
#endif
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int IUIScene_PauseMenu::EnableAutosaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
// results switched for this dialog
|
|
if(result==C4JStorage::EMessage_ResultDecline)
|
|
{
|
|
// Set the global flag, so that we don't disable saving again once the save is complete
|
|
app.SetGameHostOption(eGameHostOption_DisableSaving, 0);
|
|
}
|
|
else
|
|
{
|
|
// Set the global flag, so that we do disable saving again once the save is complete
|
|
// We need to set this on as we may have only disabled it due to having a trial texture pack
|
|
app.SetGameHostOption(eGameHostOption_DisableSaving, 1);
|
|
}
|
|
// Re-enable saving temporarily
|
|
StorageManager.SetSaveDisabled(false);
|
|
|
|
// flag a app action of save game
|
|
app.SetAction(iPad,eAppAction_SaveGame);
|
|
return 0;
|
|
}
|
|
|
|
int IUIScene_PauseMenu::DisableAutosaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
// results switched for this dialog
|
|
if(result==C4JStorage::EMessage_ResultDecline)
|
|
{
|
|
// Set the global flag, so that we disable saving again once the save is complete
|
|
app.SetGameHostOption(eGameHostOption_DisableSaving, 1);
|
|
StorageManager.SetSaveDisabled(false);
|
|
|
|
// flag a app action of save game
|
|
app.SetAction(iPad,eAppAction_SaveGame);
|
|
}
|
|
return 0;
|
|
} |