aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Common/XUI/XUI_MultiGameInfo.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/Common/XUI/XUI_MultiGameInfo.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.Client/Common/XUI/XUI_MultiGameInfo.cpp')
-rw-r--r--Minecraft.Client/Common/XUI/XUI_MultiGameInfo.cpp392
1 files changed, 392 insertions, 0 deletions
diff --git a/Minecraft.Client/Common/XUI/XUI_MultiGameInfo.cpp b/Minecraft.Client/Common/XUI/XUI_MultiGameInfo.cpp
new file mode 100644
index 00000000..bbfa243b
--- /dev/null
+++ b/Minecraft.Client/Common/XUI/XUI_MultiGameInfo.cpp
@@ -0,0 +1,392 @@
+#include "stdafx.h"
+#include <xuiresource.h>
+#include <xuiapp.h>
+#include <assert.h>
+#include "..\..\..\Minecraft.World\LevelSettings.h"
+#include "..\..\..\Minecraft.World\StringHelpers.h"
+#include "XUI_MultiGameInfo.h"
+#include "XUI_MultiGameJoinLoad.h"
+#include "..\..\..\Minecraft.World\LevelSettings.h"
+#include "..\..\..\Minecraft.World\Difficulty.h"
+
+#define UPDATE_PLAYERS_TIMER_ID 0
+#define UPDATE_PLAYERS_TIMER_TIME 30000
+
+//----------------------------------------------------------------------------------
+// Performs initialization tasks - retrieves controls.
+//----------------------------------------------------------------------------------
+HRESULT CScene_MultiGameInfo::OnInit( XUIMessageInit* pInitData, BOOL& bHandled )
+{
+ MapChildControls();
+
+ XuiControlSetText(playersList,app.GetString(IDS_PLAYERS));
+ XuiControlSetText(m_JoinGame,app.GetString(IDS_JOIN_GAME));
+ XuiControlSetText(m_labelDifficulty,app.GetString(IDS_LABEL_DIFFICULTY));
+ XuiControlSetText(m_labelGameType,app.GetString(IDS_LABEL_GAME_TYPE));
+ XuiControlSetText(m_labelGamertagsOn,app.GetString(IDS_LABEL_GAMERTAGS));
+ XuiControlSetText(m_labelStructuresOn,app.GetString(IDS_LABEL_STRUCTURES));
+ XuiControlSetText(m_labelLevelType,app.GetString(IDS_LABEL_LEVEL_TYPE));
+ XuiControlSetText(m_labelPvP,app.GetString(IDS_LABEL_PvP));
+ XuiControlSetText(m_labelTrust,app.GetString(IDS_LABEL_TRUST));
+ XuiControlSetText(m_labelTNTOn,app.GetString(IDS_LABEL_TNT));
+ XuiControlSetText(m_labelFireOn,app.GetString(IDS_LABEL_FIRE_SPREADS));
+
+ JoinMenuInitData *initData = (JoinMenuInitData *)pInitData->pvInitData;
+ m_selectedSession = initData->selectedSession;
+ m_iPad = initData->iPad;
+ // 4J-PB - don't delete this - it's part of the joinload structure
+ //delete initData;
+
+ for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i)
+ {
+ if( m_selectedSession->data.players[i] != NULL )
+ {
+ playersList.InsertItems(i,1);
+#ifndef _CONTENT_PACKAGE
+ if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<<eDebugSetting_DebugLeaderboards)))
+ {
+ playersList.SetText(i, L"WWWWWWWWWWWWWWWW" );
+ }
+ else
+#endif
+ {
+ playersList.SetText(i, convStringToWstring( m_selectedSession->data.szPlayers[i] ).c_str() );
+ }
+ }
+ else
+ {
+ // Leave the loop when we hit the first NULL player
+ break;
+ }
+ }
+
+ unsigned int uiGameHostSettings = m_selectedSession->data.m_uiGameHostSettings;
+ switch(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_Difficulty))
+ {
+ case Difficulty::EASY:
+ m_difficulty.SetText( app.GetString(IDS_DIFFICULTY_TITLE_EASY) );
+ break;
+ case Difficulty::NORMAL:
+ m_difficulty.SetText( app.GetString(IDS_DIFFICULTY_TITLE_NORMAL) );
+ break;
+ case Difficulty::HARD:
+ m_difficulty.SetText( app.GetString(IDS_DIFFICULTY_TITLE_HARD) );
+ break;
+ case Difficulty::PEACEFUL:
+ default:
+ m_difficulty.SetText( app.GetString(IDS_DIFFICULTY_TITLE_PEACEFUL) );
+ break;
+ }
+
+ unsigned int hostOption = app.GetGameHostOption(uiGameHostSettings,eGameHostOption_GameType);
+
+ if (hostOption == GameType::CREATIVE->getId())
+ {
+ m_GameType.SetText( app.GetString(IDS_CREATIVE) );
+ }
+ else if (hostOption == GameType::SURVIVAL->getId())
+ {
+ m_GameType.SetText( app.GetString(IDS_SURVIVAL) );
+ }
+ else
+ {
+ m_GameType.SetText( app.GetString(IDS_SURVIVAL) );
+ }
+
+ if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_Gamertags)) m_gamertagsOn.SetText( app.GetString(IDS_ON) );
+ else m_gamertagsOn.SetText( app.GetString(IDS_OFF) );
+
+ if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_Structures)) m_structuresOn.SetText( app.GetString(IDS_ON) );
+ else m_structuresOn.SetText( app.GetString(IDS_OFF) );
+
+ if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_LevelType)) m_levelType.SetText( app.GetString(IDS_LEVELTYPE_SUPERFLAT) );
+ else m_levelType.SetText( app.GetString(IDS_LEVELTYPE_NORMAL) );
+
+ if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_PvP)) m_pvpOn.SetText( app.GetString(IDS_ON) );
+ else m_pvpOn.SetText( app.GetString(IDS_OFF) );
+
+ if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_TrustPlayers)) m_trustPlayers.SetText( app.GetString(IDS_ON) );
+ else m_trustPlayers.SetText( app.GetString(IDS_OFF) );
+
+ if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_TNT)) m_tntOn.SetText( app.GetString(IDS_ON) );
+ else m_tntOn.SetText( app.GetString(IDS_OFF) );
+
+ if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_FireSpreads)) m_fireOn.SetText( app.GetString(IDS_ON) );
+ else m_fireOn.SetText( app.GetString(IDS_OFF) );
+
+ m_bIgnoreInput = false;
+
+ // Alert the app the we want to be informed of ethernet connections
+ app.SetLiveLinkRequired( true );
+
+ TelemetryManager->RecordMenuShown(m_iPad, eUIScene_JoinMenu, 0);
+
+ ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK );
+
+ XuiSetTimer(m_hObj,UPDATE_PLAYERS_TIMER_ID,UPDATE_PLAYERS_TIMER_TIME);
+
+ return S_OK;
+}
+
+
+
+//----------------------------------------------------------------------------------
+// Handler for the button press message.
+//----------------------------------------------------------------------------------
+HRESULT CScene_MultiGameInfo::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);
+
+ if ( hObjPressed == m_JoinGame )
+ {
+ // check we have the texture pack required for the game
+
+
+ SetShow( FALSE );
+ m_bIgnoreInput=true;
+
+ // 4J Stu - If we only have one controller connected, then don't show the sign-in UI again
+ DWORD connectedControllers = 0;
+ for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i)
+ {
+ if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers;
+ }
+
+ if(connectedControllers == 1 || !RenderManager.IsHiDef())
+ {
+ JoinGame( this );
+ }
+ else
+ {
+ ProfileManager.RequestSignInUI(false, false, false, true, false,&CScene_MultiGameInfo::StartGame_SignInReturned, this,ProfileManager.GetPrimaryPad());
+ }
+ }
+
+ return S_OK;
+}
+
+HRESULT CScene_MultiGameInfo::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled)
+{
+ if(m_bIgnoreInput) return S_OK;
+
+ ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
+
+ HRESULT hr = S_OK;
+
+ // Explicitly handle B button presses
+ switch(pInputData->dwKeyCode)
+ {
+ case VK_PAD_B:
+ case VK_ESCAPE:
+ app.NavigateBack(pInputData->UserIndex);
+ rfHandled = TRUE;
+ break;
+ case VK_PAD_Y:
+ if(m_selectedSession != NULL && playersList.TreeHasFocus() && playersList.GetItemCount() > 0)
+ {
+ PlayerUID xuid = m_selectedSession->data.players[playersList.GetCurSel()];
+ if( xuid != INVALID_XUID )
+ hr = XShowGamerCardUI(ProfileManager.GetLockedProfile(), xuid);
+ }
+ break;
+ }
+
+ return hr;
+}
+
+HRESULT CScene_MultiGameInfo::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled)
+{
+ ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK);
+
+ return S_OK;
+}
+
+HRESULT CScene_MultiGameInfo::OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled)
+{
+ if(pNotifySelChangedData->iOldItem!=-1)
+ {
+ CXuiSceneBase::PlayUISFX(eSFX_Focus);
+ }
+ bHandled = TRUE;
+
+ return S_OK;
+}
+
+HRESULT CScene_MultiGameInfo::OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled)
+{
+ if( playersList.TreeHasFocus() && playersList.GetItemCount() > 0 )
+ {
+ ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1, IDS_TOOLTIPS_BACK, -1, IDS_TOOLTIPS_VIEW_GAMERCARD );
+ bHandled = TRUE;
+ }
+ return S_OK;
+}
+
+HRESULT CScene_MultiGameInfo::OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled)
+{
+ if( pNotifyFocusData->hObjOther == m_JoinGame )
+ {
+ ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK );
+ bHandled = TRUE;
+ }
+ return S_OK;
+}
+
+int CScene_MultiGameInfo::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad)
+{
+ CScene_MultiGameInfo* pClass = (CScene_MultiGameInfo*)pParam;
+
+ if(bContinue==true)
+ {
+ // It's possible that the player has not signed in - they can back out
+ if(ProfileManager.IsSignedIn(iPad))
+ {
+ JoinGame(pClass);
+ }
+ }
+ else
+ {
+ pClass->SetShow( TRUE );
+ pClass->m_bIgnoreInput=false;
+ }
+ return 0;
+}
+
+// Shared function to join the game that is the same whether we used the sign-in UI or not
+void CScene_MultiGameInfo::JoinGame(CScene_MultiGameInfo* pClass)
+{
+ DWORD dwLocalUsersMask = 0;
+ bool noPrivileges = false;
+ DWORD dwSignedInUsers = 0;
+
+ // if we're in SD mode, then only the primary player gets to play
+ if(RenderManager.IsHiDef())
+ {
+ for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index)
+ {
+ if(ProfileManager.IsSignedIn(index) )
+ {
+ ++dwSignedInUsers;
+ if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true;
+ dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(index);
+ }
+ }
+ }
+ else
+ {
+ if(ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad()) )
+ {
+ ++dwSignedInUsers;
+ if( !ProfileManager.AllowedToPlayMultiplayer(ProfileManager.GetPrimaryPad()) ) noPrivileges = true;
+ dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(ProfileManager.GetPrimaryPad());
+ }
+ }
+
+ // Check if user-created content is allowed, as we cannot play multiplayer if it's not
+ bool noUGC = false;
+ BOOL pccAllowed = TRUE;
+ BOOL pccFriendsAllowed = TRUE;
+ ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed);
+ if(!pccAllowed && !pccFriendsAllowed) noUGC = true;
+
+ if(noUGC)
+ {
+ pClass->SetShow( TRUE );
+ pClass->m_bIgnoreInput=false;
+ UINT uiIDA[1];
+ uiIDA[0]=IDS_CONFIRM_OK;
+
+ int messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL;
+ if(dwSignedInUsers > 1) messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL;
+
+ StorageManager.RequestMessageBox( IDS_CONNECTION_FAILED, messageText, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable());
+
+ }
+ else if(noPrivileges)
+ {
+ pClass->SetShow( TRUE );
+ pClass->m_bIgnoreInput=false;
+ UINT uiIDA[1];
+ uiIDA[0]=IDS_CONFIRM_OK;
+ StorageManager.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable());
+ }
+ else
+ {
+ CGameNetworkManager::eJoinGameResult result = g_NetworkManager.JoinGame( pClass->m_selectedSession, dwLocalUsersMask );
+
+ // Alert the app the we no longer want to be informed of ethernet connections
+ app.SetLiveLinkRequired( false );
+
+ if( result != CGameNetworkManager::JOINGAME_SUCCESS )
+ {
+ int exitReasonStringId = -1;
+ switch(result)
+ {
+ case CGameNetworkManager::JOINGAME_FAIL_SERVER_FULL:
+ exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL;
+ break;
+ }
+
+ if( exitReasonStringId == -1 )
+ {
+ app.NavigateBack(ProfileManager.GetPrimaryPad());
+ }
+ else
+ {
+ UINT uiIDA[1];
+ uiIDA[0]=IDS_CONFIRM_OK;
+ StorageManager.RequestMessageBox( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable());
+ exitReasonStringId = -1;
+
+ app.NavigateToHomeMenu();
+ }
+ }
+ }
+}
+
+HRESULT CScene_MultiGameInfo::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled )
+{
+ if ( pTimer->nId == UPDATE_PLAYERS_TIMER_ID)
+ {
+ PlayerUID selectedPlayerXUID = m_selectedSession->data.players[playersList.GetCurSel()];
+
+ bool success = g_NetworkManager.GetGameSessionInfo(m_iPad, m_selectedSession->sessionId,m_selectedSession);
+
+ if( success )
+ {
+ playersList.DeleteItems(0, playersList.GetItemCount());
+ int selectedIndex = 0;
+ for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i)
+ {
+ if( m_selectedSession->data.players[i] != NULL )
+ {
+ if(m_selectedSession->data.players[i] == selectedPlayerXUID) selectedIndex = i;
+ playersList.InsertItems(i,1);
+#ifndef _CONTENT_PACKAGE
+ if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<<eDebugSetting_DebugLeaderboards)))
+ {
+ playersList.SetText(i, L"WWWWWWWWWWWWWWWW" );
+ }
+ else
+#endif
+ {
+ playersList.SetText(i, convStringToWstring( m_selectedSession->data.szPlayers[i] ).c_str() );
+ }
+ }
+ else
+ {
+ // Leave the loop when we hit the first NULL player
+ break;
+ }
+ }
+ playersList.SetCurSel(selectedIndex);
+ }
+ }
+
+ return S_OK;
+}
+
+