// Minecraft.cpp : Defines the entry point for the application. // #include "../../Minecraft.World/Platform/stdafx.h" #include "XUI_Death.h" #include #include "../../Minecraft.World/Util/AABB.h" #include "../../Minecraft.World/Util/Vec3.h" #include "../../Minecraft.World/Headers/net.minecraft.stats.h" #include "../../Minecraft.Client/GameState/StatsCounter.h" #include "../../Minecraft.World/Entities/Entity.h" #include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" #include "../../Minecraft.World/Level/Level.h" #include "../../Minecraft.World/Level/ChunkSource.h" #include "../../Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.h" #include "../../Minecraft.Client/Rendering/GameRenderer.h" #include "../../Minecraft.Client/Rendering/LevelRenderer.h" #include "../../Minecraft.World/Util/Pos.h" #include "../../Minecraft.World/Level/Dimensions/Dimension.h" #include "../../Minecraft.Client/Minecraft.h" #include "../../Minecraft.Client/GameState/Options.h" #include "../../Minecraft.Client/Player/LocalPlayer.h" #include "../../Minecraft.World/IO/Streams/Compression.h" //---------------------------------------------------------------------------------- // Performs initialization tasks - retrieves controls. //---------------------------------------------------------------------------------- HRESULT CScene_Death::OnInit(XUIMessageInit* pInitData, BOOL& bHandled) { m_iPad = *(int*)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_RESPAWN], app.GetString(IDS_RESPAWN)); XuiControlSetText(m_Buttons[BUTTON_DEATH_EXITGAME], app.GetString(IDS_EXIT_GAME)); // 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, NULL ); // 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 ((uiButtonCounter < BUTTONS_DEATH_MAX) && (m_Buttons[uiButtonCounter] != hObjPressed)) uiButtonCounter++; Minecraft* pMinecraft = Minecraft::GetInstance(); // Determine which button was pressed, // and call the appropriate function. switch (uiButtonCounter) { case BUTTON_DEATH_EXITGAME: { // 4J-PB - fix for #8333 - BLOCKER: If player decides to exit game, // then cancels the exit player becomes stuck at game over screen // m_bIgnoreInput = true; // Check if it's the trial version if (ProfileManager.IsFullVersion()) { unsigned int uiIDA[3]; // is it the primary player exiting? if (pNotifyPressData->UserIndex == ProfileManager.GetPrimaryPad()) { int playTime = -1; if (pMinecraft->localplayers[pNotifyPressData->UserIndex] != NULL) { playTime = (int)pMinecraft ->localplayers[pNotifyPressData->UserIndex] ->getSessionTimer(); } TelemetryManager->RecordLevelExit( pNotifyPressData->UserIndex, eSen_LevelExitStatus_Failed); 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 unsigned int 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: { 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); }