4jcraft/Minecraft.Client/Platform/Common/XUI/XUI_Death.cpp

250 lines
9.7 KiB
C++

// Minecraft.cpp : Defines the entry point for the application.
//
#include "../../Minecraft.World/Platform/stdafx.h"
#include "XUI_Death.h"
#include <assert.h>
#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);
}