mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-25 03:13:41 +00:00
You will now be able to leave the world from all places where you'd usually be able to (Pause screen, death screen) Should be identical to the way it's done on Iggy/XUI
693 lines
24 KiB
C++
693 lines
24 KiB
C++
#include "../../Minecraft.World/Platform/stdafx.h"
|
|
#include "IUIScene_PauseMenu.h"
|
|
#include "../../Minecraft.Client/Minecraft.h"
|
|
#include "../../Minecraft.Client/MinecraftServer.h"
|
|
#include "../../Minecraft.Client/Level/MultiPlayerLevel.h"
|
|
#include "../../Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.h"
|
|
#include "../../Minecraft.World/Headers/net.minecraft.world.level.h"
|
|
#include "../../Minecraft.World/Headers/net.minecraft.world.phys.h"
|
|
#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h"
|
|
#include "../../Minecraft.Client/Textures/Packs/TexturePack.h"
|
|
#include "../../Minecraft.Client/Textures/Packs/DLCTexturePack.h"
|
|
#include "../../Minecraft.World/Util/StringHelpers.h"
|
|
|
|
|
|
int IUIScene_PauseMenu::ExitGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam;
|
|
|
|
// Results switched for this dialog
|
|
if(result==C4JStorage::EMessage_ResultDecline)
|
|
{
|
|
scene->SetIgnoreInput(true);
|
|
app.SetAction(iPad,eAppAction_ExitWorld);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam;
|
|
|
|
// 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=(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
|
|
|
|
unsigned int 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.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() , &IUIScene_PauseMenu::WarningTrialTexturePackReturned, scene,app.GetStringTable(), NULL, 0, false);
|
|
|
|
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)
|
|
{
|
|
unsigned int uiIDA[2];
|
|
uiIDA[0]=IDS_CONFIRM_CANCEL;
|
|
uiIDA[1]=IDS_CONFIRM_OK;
|
|
ui.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameAndSaveReturned, scene, app.GetStringTable(), NULL, 0, false);
|
|
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
|
|
unsigned int uiIDA[2];
|
|
uiIDA[0]=IDS_CONFIRM_CANCEL;
|
|
uiIDA[1]=IDS_CONFIRM_OK;
|
|
ui.RequestMessageBox(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameDeclineSaveReturned, scene, app.GetStringTable(), NULL, 0, false);
|
|
return 0;
|
|
}
|
|
|
|
scene->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
|
|
IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam;
|
|
|
|
// 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
|
|
scene->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()))
|
|
{
|
|
unsigned int 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.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false);
|
|
}
|
|
else
|
|
{
|
|
ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false);
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int IUIScene_PauseMenu::ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam;
|
|
|
|
// 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
|
|
scene->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()))
|
|
{
|
|
unsigned int 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.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false);
|
|
}
|
|
else
|
|
{
|
|
ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false);
|
|
}
|
|
}
|
|
|
|
}
|
|
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,NULL,&bContentRestricted,NULL);
|
|
if(bContentRestricted)
|
|
{
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad,NULL,&app, app.GetStringTable(), NULL, 0, false);
|
|
}
|
|
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!=NULL)
|
|
{
|
|
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(const_cast<wchar_t *>(pDLCPack->getName().c_str()));
|
|
|
|
StorageManager.InstallOffer(1, const_cast<wchar_t *>(pDLCInfo->wsProductId.c_str()), NULL, NULL);
|
|
|
|
// 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.
|
|
unsigned int uiIDA[1] = { IDS_CONFIRM_OK };
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable());
|
|
}
|
|
}
|
|
}
|
|
|
|
#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,NULL,NULL);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Texture_DLC, ( pScene->m_pDLCPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined);
|
|
}
|
|
#endif
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int IUIScene_PauseMenu::SaveWorldThreadProc(void *lpParameter)
|
|
{
|
|
bool bAutosave=(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;
|
|
}
|
|
|
|
// 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(void *lpParameter)
|
|
{
|
|
Minecraft *pMinecraft=Minecraft::GetInstance();
|
|
|
|
int exitReasonStringId = pMinecraft->progressRenderer->getCurrentTitle();
|
|
int exitReasonTitleId = IDS_CONNECTION_LOST;
|
|
|
|
bool saveStats = true;
|
|
if (pMinecraft->isClientSide() || g_NetworkManager.IsInSession())
|
|
{
|
|
if(lpParameter != NULL )
|
|
{
|
|
// 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 );
|
|
|
|
unsigned int 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.RequestMessageBox( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable());
|
|
exitReasonStringId = -1;
|
|
|
|
// 4J - Force a disconnection, this handles the situation that the server has already disconnected
|
|
if( pMinecraft->levels[0] != NULL ) pMinecraft->levels[0]->disconnect(false);
|
|
if( pMinecraft->levels[1] != NULL ) pMinecraft->levels[1]->disconnect(false);
|
|
if( pMinecraft->levels[2] != NULL ) pMinecraft->levels[2]->disconnect(false);
|
|
}
|
|
else
|
|
{
|
|
exitReasonStringId = IDS_EXITING_GAME;
|
|
pMinecraft->progressRenderer->progressStartNoAbort( IDS_EXITING_GAME );
|
|
if( pMinecraft->levels[0] != NULL ) pMinecraft->levels[0]->disconnect();
|
|
if( pMinecraft->levels[1] != NULL ) pMinecraft->levels[1]->disconnect();
|
|
if( pMinecraft->levels[2] != NULL ) 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 != NULL && 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 );
|
|
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
ui.RequestMessageBox( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable());
|
|
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);
|
|
}
|
|
pMinecraft->setLevel(NULL,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);
|
|
pMinecraft->exitingWorldRightNow = 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__)
|
|
unsigned int uiIDA[2];
|
|
uiIDA[0]=IDS_CONFIRM_CANCEL;
|
|
uiIDA[1]=IDS_CONFIRM_OK;
|
|
ui.RequestMessageBox(IDS_TITLE_ENABLE_AUTOSAVE, IDS_CONFIRM_ENABLE_AUTOSAVE, uiIDA, 2, iPad,&IUIScene_PauseMenu::EnableAutosaveDialogReturned,pParam, app.GetStringTable(), NULL, 0, false);
|
|
#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;
|
|
}
|