mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-25 14:43:36 +00:00
250 lines
9.7 KiB
C++
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);
|
|
}
|