// Minecraft.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "../XUI/XUI_Death.h" #include #include "../../../Minecraft.World/AABB.h" #include "../../../Minecraft.World/Vec3.h" #include "../../../Minecraft.World/net.minecraft.stats.h" #include "../../../Minecraft.Client/StatsCounter.h" #include "../../../Minecraft.World/Entity.h" #include "../../../Minecraft.Client/MultiplayerLocalPlayer.h" #include "../../../Minecraft.World/Level.h" #include "../../../Minecraft.World/net.minecraft.world.level.storage.h" #include "../../../Minecraft.World/ChunkSource.h" #include "../../../Minecraft.Client/ProgressRenderer.h" #include "../../../Minecraft.Client/GameRenderer.h" #include "../../../Minecraft.Client/LevelRenderer.h" #include "../../../Minecraft.World/Pos.h" #include "../../../Minecraft.World/Dimension.h" #include "../../Minecraft.h" #include "../../MinecraftServer.h" #include "../../Options.h" #include "../../LocalPlayer.h" #include "../../../Minecraft.World/compression.h" //---------------------------------------------------------------------------------- // Performs initialization tasks - retrieves controls. //---------------------------------------------------------------------------------- HRESULT CScene_Death::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) { m_iPad = *static_cast(pInitData->pvInitData); m_bIgnoreInput = false; MapChildControls(); if(app.GetLocalPlayerCount()>1) { app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); } XuiControlSetText(m_Title,app.GetString(IDS_YOU_DIED)); XuiControlSetText(m_Buttons[BUTTON_DEATH_EXITGAME],app.GetString(IDS_EXIT_GAME)); // 4J Added: In hardcore mode, disable respawn and show hardcore death message Minecraft *pMinecraft = Minecraft::GetInstance(); bool isHardcore = false; if (pMinecraft != nullptr && pMinecraft->level != nullptr) { isHardcore = pMinecraft->level->getLevelData()->isHardcore(); } if (isHardcore) { XuiControlSetText(m_Buttons[BUTTON_DEATH_RESPAWN], app.GetString(IDS_HARDCORE_DEATH_MESSAGE)); XuiElementSetShow(m_Buttons[BUTTON_DEATH_RESPAWN], FALSE); } else { XuiControlSetText(m_Buttons[BUTTON_DEATH_RESPAWN], app.GetString(IDS_RESPAWN)); } // Display the tooltips ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT); return S_OK; } //---------------------------------------------------------------------------------- // Updates the UI when the list selection changes. //---------------------------------------------------------------------------------- HRESULT CScene_Death::OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ) { if( hObjSource == m_Scene ) { /*int curSel = m_List.GetCurSel(); // Set the locale with the current language. XuiSetLocale( Languages[curSel].pszLanguagePath ); // Apply the locale to the main scene. XuiApplyLocale( m_hObj, nullptr ); // Update the text for the current value. m_Value.SetText( m_List.GetText( curSel ) );*/ bHandled = TRUE; } return S_OK; } //---------------------------------------------------------------------------------- // Handler for the button press message. //---------------------------------------------------------------------------------- HRESULT CScene_Death::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); unsigned int uiButtonCounter=0; while((uiButtonCounterUserIndex==ProfileManager.GetPrimaryPad()) { int playTime = -1; if( pMinecraft->localplayers[pNotifyPressData->UserIndex] != nullptr ) { playTime = static_cast(pMinecraft->localplayers[pNotifyPressData->UserIndex]->getSessionTimer()); } TelemetryManager->RecordLevelExit(pNotifyPressData->UserIndex, eSen_LevelExitStatus_Failed); // 4J Added: Hardcore mode — skip save dialog, exit without saving, delete world if (pMinecraft->level != nullptr && pMinecraft->level->getLevelData()->isHardcore() && g_NetworkManager.IsHost()) { MinecraftServer::getInstance()->setSaveOnExit(false); MinecraftServer::getInstance()->setDeleteWorldOnExit(true); app.SetAction(pNotifyPressData->UserIndex, eAppAction_ExitWorld); break; } if(StorageManager.GetSaveDisabled()) { uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable()); } else { if( g_NetworkManager.IsHost() ) { uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_EXIT_GAME_SAVE; uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable()); } else { uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable()); } } } else { TelemetryManager->RecordLevelExit(pNotifyPressData->UserIndex, eSen_LevelExitStatus_Failed); // just exit the player app.SetAction(pNotifyPressData->UserIndex,eAppAction_ExitPlayer); } } else { // is it the primary player exiting? if(pNotifyPressData->UserIndex==ProfileManager.GetPrimaryPad()) { TelemetryManager->RecordLevelExit(pNotifyPressData->UserIndex, eSen_LevelExitStatus_Failed); // adjust the trial time played CXuiSceneBase::ReduceTrialTimerValue(); // exit the level UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable()); } else { TelemetryManager->RecordLevelExit(pNotifyPressData->UserIndex, eSen_LevelExitStatus_Failed); // just exit the player app.SetAction(pNotifyPressData->UserIndex,eAppAction_ExitPlayer); } } } break; case BUTTON_DEATH_RESPAWN: { // 4J Added: Safeguard - don't respawn in hardcore mode Minecraft *pMC = Minecraft::GetInstance(); if (pMC != nullptr && pMC->level != nullptr && pMC->level->getLevelData()->isHardcore()) { break; } m_bIgnoreInput = true; app.SetAction(pNotifyPressData->UserIndex,eAppAction_Respawn); } break; default: break; } return S_OK; } HRESULT CScene_Death::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) { ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); switch(pInputData->dwKeyCode) { case VK_PAD_B: case VK_PAD_START: case VK_ESCAPE: // kill the crafting xui // 4J Stu - No back out, must choose //app.CloseXuiScenes(); rfHandled = TRUE; break; } return S_OK; } int CScene_Death::RespawnThreadProc( void* lpParameter ) { AABB::UseDefaultThreadStorage(); Vec3::UseDefaultThreadStorage(); Compression::UseDefaultThreadStorage(); size_t iPad=(size_t)lpParameter; Minecraft *pMinecraft=Minecraft::GetInstance(); pMinecraft->localplayers[iPad]->respawn(); app.SetGameStarted(true); pMinecraft->gameRenderer->EnableUpdateThread(); // If we are online, then we should wait here until the respawn is done // If we are offline, this should release straight away //WaitForSingleObject( pMinecraft->m_hPlayerRespawned, INFINITE ); while(pMinecraft->localplayers[iPad]->GetPlayerRespawned()==false) { Sleep(50); } return S_OK; } HRESULT CScene_Death::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) { bHandled=true; return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); }