the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 537 lines 16 kB view raw
1#include "stdafx.h" 2 3#include <assert.h> 4#include "XUI_InGameInfo.h" 5#include "..\..\ServerPlayer.h" 6#include "..\..\PlayerConnection.h" 7#include "..\..\PlayerList.h" 8#include "..\..\MinecraftServer.h" 9#include "..\..\..\Minecraft.World\StringHelpers.h" 10#include "..\..\PlayerRenderer.h" 11#include "XUI_InGamePlayerOptions.h" 12#include "..\..\Minecraft.h" 13#include "..\..\MultiPlayerLocalPlayer.h" 14#include "..\..\ClientConnection.h" 15#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" 16#include "..\..\Xbox\Network\NetworkPlayerXbox.h" 17 18#define IGNORE_KEYPRESS_TIMERID 0 19#define TOOLTIP_TIMERID 1 20#define IGNORE_KEYPRESS_TIME 100 21 22//---------------------------------------------------------------------------------- 23// Performs initialization tasks - retrieves controls. 24//---------------------------------------------------------------------------------- 25HRESULT CScene_InGameInfo::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) 26{ 27 m_bIgnoreKeyPresses=true; 28 m_iPad = *(int *)pInitData->pvInitData; 29 30 MapChildControls(); 31 32 XuiControlSetText(m_gameOptionsButton,app.GetString(IDS_HOST_OPTIONS)); 33 XuiControlSetText(m_title,app.GetString(IDS_PLAYERS_INVITE)); 34 35 if(app.GetLocalPlayerCount()>1) 36 { 37 app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); 38 } 39 40 DWORD playerCount = g_NetworkManager.GetPlayerCount(); 41 42 m_playersCount = 0; 43 for(DWORD i = 0; i < playerCount; ++i) 44 { 45 INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); 46 47 if( player != NULL ) 48 { 49 m_players[i] = player->GetSmallId(); 50 ++m_playersCount; 51 } 52 } 53 54 g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &CScene_InGameInfo::OnPlayerChanged, this); 55 56 INetworkPlayer *thisPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); 57 m_isHostPlayer = false; 58 if(thisPlayer != NULL) m_isHostPlayer = thisPlayer->IsHost() == TRUE; 59 60 Minecraft *pMinecraft = Minecraft::GetInstance(); 61 shared_ptr<MultiplayerLocalPlayer> localPlayer = pMinecraft->localplayers[m_iPad]; 62 if(!m_isHostPlayer && !localPlayer->isModerator() ) 63 { 64 m_gameOptionsButton.SetEnable(FALSE); 65 m_gameOptionsButton.SetShow(FALSE); 66 playersList.SetFocus(m_iPad); 67 } 68 69 int keyX = IDS_TOOLTIPS_INVITE_FRIENDS; 70 XPARTY_USER_LIST partyList; 71 if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) 72 { 73 keyX = IDS_TOOLTIPS_INVITE_PARTY; 74 } 75 if(g_NetworkManager.IsLocalGame()) keyX = -1; 76 77 int keyA = -1; 78 ui.SetTooltips( m_iPad, keyA,IDS_TOOLTIPS_BACK,keyX,-1); 79 80 81 CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE ); 82 83 SetTimer( TOOLTIP_TIMERID , INGAME_INFO_TOOLTIP_TIMER ); 84 85 // get rid of the quadrant display if it's on 86 CXuiSceneBase::HidePressStart(); 87 88 SetTimer(IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME); 89 90 return S_OK; 91} 92 93HRESULT CScene_InGameInfo::OnDestroy() 94{ 95 XuiKillTimer(m_hObj,TOOLTIP_TIMERID); 96 g_NetworkManager.UnRegisterPlayerChangedCallback(m_iPad, &CScene_InGameInfo::OnPlayerChanged, this); 97 return S_OK; 98} 99 100//---------------------------------------------------------------------------------- 101// Updates the UI when the list selection changes. 102//---------------------------------------------------------------------------------- 103HRESULT CScene_InGameInfo::OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ) 104{ 105 if( hObjSource == playersList) 106 { 107 updateTooltips(); 108 109 bHandled = TRUE; 110 } 111 112 return S_OK; 113} 114 115HRESULT CScene_InGameInfo::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) 116{ 117 if(m_bIgnoreKeyPresses) return S_OK; 118 119 // 4J-PB - ignore repeats to stop the scene displaying and quitting right away if you hold the back button down 120 if((pInputData->dwKeyCode==VK_PAD_BACK) &&(pInputData->dwFlags&XUI_INPUT_FLAG_REPEAT )) 121 { 122 rfHandled = TRUE; 123 return S_OK; 124 } 125 ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); 126 127 HRESULT hr = S_OK; 128 switch(pInputData->dwKeyCode) 129 { 130 131 case VK_PAD_B: 132 case VK_PAD_BACK: 133 case VK_ESCAPE: 134 CXuiSceneBase::PlayUISFX(eSFX_Back); 135 app.CloseXuiScenes(pInputData->UserIndex); 136 rfHandled = TRUE; 137 138 break; 139 case VK_PAD_Y: 140 if(playersList.TreeHasFocus() && (playersList.GetItemCount() > 0) && (playersList.GetCurSel() < m_playersCount) ) 141 { 142 INetworkPlayer *player = g_NetworkManager.GetPlayerBySmallId(m_players[playersList.GetCurSel()]); 143 if( player != NULL ) 144 { 145 PlayerUID xuid = ((NetworkPlayerXbox *)player)->GetUID(); 146 if( xuid != INVALID_XUID ) 147 hr = XShowGamerCardUI(pInputData->UserIndex, xuid); 148 } 149 } 150 break; 151 case VK_PAD_X: 152 { 153 if(!g_NetworkManager.IsLocalGame()) 154 { 155 XPARTY_USER_LIST partyList; 156 if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY) && (partyList.dwUserCount>1)) 157 { 158 hr = XShowPartyUI( pInputData->UserIndex ); 159 } 160 else 161 { 162 hr = XShowFriendsUI( pInputData->UserIndex ); 163 } 164 } 165 } 166 break; 167 } 168 169 170 return hr; 171} 172 173//---------------------------------------------------------------------------------- 174// Handler for the button press message. 175//---------------------------------------------------------------------------------- 176HRESULT CScene_InGameInfo::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) 177{ 178 // This assumes all buttons can only be pressed with the A button 179 ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); 180 181 if( hObjPressed == playersList ) 182 { 183 INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ playersList.GetCurSel() ] ); 184 185 Minecraft *pMinecraft = Minecraft::GetInstance(); 186 shared_ptr<MultiplayerLocalPlayer> localPlayer = pMinecraft->localplayers[m_iPad]; 187 188 bool isOp = m_isHostPlayer || localPlayer->isModerator(); 189 bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; 190 bool trust = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; 191 192 if( isOp && selectedPlayer != NULL && playersList.TreeHasFocus() && (playersList.GetItemCount() > 0) && (playersList.GetCurSel() < m_playersCount) ) 193 { 194 bool editingHost = selectedPlayer->IsHost(); 195 if( (cheats && (m_isHostPlayer || !editingHost ) ) 196 || (!trust && (m_isHostPlayer || !editingHost)) 197 || (m_isHostPlayer && !editingHost) 198#if (!defined(_CONTENT_PACKAGE) && !defined(_FINAL_BUILD) && defined(_DEBUG_MENUS_ENABLED)) 199 || (m_isHostPlayer && editingHost) 200#endif 201 ) 202 { 203 InGamePlayerOptionsInitData *pInitData = new InGamePlayerOptionsInitData(); 204 pInitData->iPad = m_iPad; 205 pInitData->networkSmallId = m_players[ playersList.GetCurSel() ]; 206 pInitData->playerPrivileges = app.GetPlayerPrivileges(m_players[ playersList.GetCurSel() ] ); 207 app.NavigateToScene(m_iPad,eUIScene_InGamePlayerOptionsMenu,pInitData); 208 } 209 else if(selectedPlayer->IsLocal() != TRUE && selectedPlayer->IsSameSystem(g_NetworkManager.GetHostPlayer()) != TRUE) 210 { 211 // Only ops will hit this, can kick anyone not local and not local to the host 212 BYTE *smallId = new BYTE(); 213 *smallId = m_players[playersList.GetCurSel()]; 214 UINT uiIDA[2]; 215 uiIDA[0]=IDS_CONFIRM_OK; 216 uiIDA[1]=IDS_CONFIRM_CANCEL; 217 218 StorageManager.RequestMessageBox(IDS_UNLOCK_KICK_PLAYER_TITLE, IDS_UNLOCK_KICK_PLAYER, uiIDA, 2, m_iPad,&CScene_InGameInfo::KickPlayerReturned,smallId,app.GetStringTable()); 219 } 220 } 221 } 222 else if( hObjPressed == m_gameOptionsButton ) 223 { 224 app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_InGameHostOptionsMenu); 225 } 226 return S_OK; 227} 228 229HRESULT CScene_InGameInfo::OnTimer(XUIMessageTimer *pData,BOOL& rfHandled) 230{ 231 if(pData->nId==IGNORE_KEYPRESS_TIMERID) 232 { 233 XuiKillTimer(m_hObj,IGNORE_KEYPRESS_TIMERID); 234 m_bIgnoreKeyPresses=false; 235 } 236 else 237 { 238 updateTooltips(); 239 } 240 241 return S_OK; 242} 243 244HRESULT CScene_InGameInfo::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) 245{ 246 if(pTransition->dwTransType == XUI_TRANSITION_FROM) 247 { 248 KillTimer( TOOLTIP_TIMERID ); 249 } 250 return S_OK; 251} 252 253HRESULT CScene_InGameInfo::OnTransitionEnd( XUIMessageTransition *pTransition, BOOL& bHandled ) 254{ 255 if(pTransition->dwTransType == XUI_TRANSITION_BACKTO) 256 { 257 SetTimer( TOOLTIP_TIMERID , INGAME_INFO_TOOLTIP_TIMER ); 258 g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &CScene_InGameInfo::OnPlayerChanged, this); 259 } 260 return S_OK; 261} 262 263HRESULT CScene_InGameInfo::OnNotifySetFocus( HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled ) 264{ 265 updateTooltips(); 266 return S_OK; 267} 268 269void CScene_InGameInfo::OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving) 270{ 271 CScene_InGameInfo *scene = (CScene_InGameInfo *)callbackParam; 272 bool playerFound = false; 273 274 for(int i = 0; i < scene->m_playersCount; ++i) 275 { 276 if(playerFound) 277 { 278 scene->m_players[i-1] = scene->m_players[i]; 279 } 280 else if( scene->m_players[i] == pPlayer->GetSmallId() ) 281 { 282 if( scene->playersList.GetCurSel() == scene->playersList.GetItemCount() - 1 ) 283 { 284 scene->playersList.SetCurSel( scene->playersList.GetItemCount() - 2 ); 285 } 286 // Player removed 287 playerFound = true; 288 } 289 } 290 291 if( playerFound ) 292 { 293 --scene->m_playersCount; 294 scene->playersList.DeleteItems( scene->playersList.GetItemCount() - 1, 1 ); 295 } 296 297 if( !playerFound ) 298 { 299 // Player added 300 scene->m_players[scene->m_playersCount] = pPlayer->GetSmallId(); 301 ++scene->m_playersCount; 302 scene->playersList.InsertItems( scene->playersList.GetItemCount(), 1 ); 303 } 304} 305 306 307HRESULT CScene_InGameInfo::OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled) 308{ 309 if( pGetSourceTextData->bItemData ) 310 { 311 if( pGetSourceTextData->iItem < m_playersCount ) 312 { 313 INetworkPlayer *player = g_NetworkManager.GetPlayerBySmallId( m_players[pGetSourceTextData->iItem] ); 314 if( player != NULL ) 315 { 316#ifndef _CONTENT_PACKAGE 317 if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<<eDebugSetting_DebugLeaderboards))) 318 { 319 pGetSourceTextData->szText = L"WWWWWWWWWWWWWWWW"; 320 } 321 else 322#endif 323 { 324 pGetSourceTextData->szText = player->GetOnlineName(); 325 } 326 } 327 else 328 { 329 pGetSourceTextData->szText = L""; 330 } 331 332 HRESULT hr; 333 HXUIOBJ hButton, hVisual, hPlayerIcon, hVoiceIcon; 334 hButton = playersList.GetItemControl(pGetSourceTextData->iItem); 335 hr=XuiControlGetVisual(hButton,&hVisual); 336 337 // Set the players icon 338 hr=XuiElementGetChildById(hVisual,L"IconGroup",&hPlayerIcon); 339 short colourIndex = app.GetPlayerColour( m_players[pGetSourceTextData->iItem] ); 340 int playFrame = 0; 341 switch(colourIndex) 342 { 343 case 1: 344 XuiElementFindNamedFrame(hPlayerIcon, L"P1", &playFrame); 345 break; 346 case 2: 347 XuiElementFindNamedFrame(hPlayerIcon, L"P2", &playFrame); 348 break; 349 case 3: 350 XuiElementFindNamedFrame(hPlayerIcon, L"P3", &playFrame); 351 break; 352 case 4: 353 XuiElementFindNamedFrame(hPlayerIcon, L"P4", &playFrame); 354 break; 355 case 5: 356 XuiElementFindNamedFrame(hPlayerIcon, L"P5", &playFrame); 357 break; 358 case 6: 359 XuiElementFindNamedFrame(hPlayerIcon, L"P6", &playFrame); 360 break; 361 case 7: 362 XuiElementFindNamedFrame(hPlayerIcon, L"P7", &playFrame); 363 break; 364 case 8: 365 XuiElementFindNamedFrame(hPlayerIcon, L"P8", &playFrame); 366 break; 367 case 9: 368 XuiElementFindNamedFrame(hPlayerIcon, L"P9", &playFrame); 369 break; 370 case 10: 371 XuiElementFindNamedFrame(hPlayerIcon, L"P10", &playFrame); 372 break; 373 case 11: 374 XuiElementFindNamedFrame(hPlayerIcon, L"P11", &playFrame); 375 break; 376 case 12: 377 XuiElementFindNamedFrame(hPlayerIcon, L"P12", &playFrame); 378 break; 379 case 13: 380 XuiElementFindNamedFrame(hPlayerIcon, L"P13", &playFrame); 381 break; 382 case 14: 383 XuiElementFindNamedFrame(hPlayerIcon, L"P14", &playFrame); 384 break; 385 case 15: 386 XuiElementFindNamedFrame(hPlayerIcon, L"P15", &playFrame); 387 break; 388 case 0: 389 default: 390 XuiElementFindNamedFrame(hPlayerIcon, L"P0", &playFrame); 391 break; 392 }; 393 if(playFrame < 0) playFrame = 0; 394 XuiElementPlayTimeline(hPlayerIcon,playFrame,playFrame,playFrame,FALSE,FALSE); 395 396 // Set the voice icon 397 hr=XuiElementGetChildById(hVisual,L"VoiceGroup",&hVoiceIcon); 398 399 playFrame = -1; 400 if(player != NULL && player->HasVoice() ) 401 { 402 if( player->IsMutedByLocalUser(m_iPad) ) 403 { 404 // Muted image 405 XuiElementFindNamedFrame(hVoiceIcon, L"Muted", &playFrame); 406 } 407 else if( player->IsTalking() ) 408 { 409 // Talking image 410 XuiElementFindNamedFrame(hVoiceIcon, L"Speaking", &playFrame); 411 } 412 else 413 { 414 // Not talking image 415 XuiElementFindNamedFrame(hVoiceIcon, L"NotSpeaking", &playFrame); 416 } 417 } 418 419 if(playFrame < 0) 420 { 421 XuiElementFindNamedFrame(hVoiceIcon, L"Normal", &playFrame); 422 } 423 XuiElementPlayTimeline(hVoiceIcon,playFrame,playFrame,playFrame,FALSE,FALSE); 424 425 pGetSourceTextData->bDisplay = TRUE; 426 427 bHandled = TRUE; 428 } 429 } 430 return S_OK; 431} 432 433HRESULT CScene_InGameInfo::OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled) 434{ 435 if( pGetSourceImageData->bItemData ) 436 { 437 if( pGetSourceImageData->iItem < m_playersCount ) 438 { 439 bHandled = TRUE; 440 } 441 } 442 return S_OK; 443} 444 445HRESULT CScene_InGameInfo::OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled) 446{ 447 pGetItemCountData->cItems = m_playersCount; 448 bHandled = TRUE; 449 return S_OK; 450} 451 452void CScene_InGameInfo::updateTooltips() 453{ 454 int keyX = IDS_TOOLTIPS_INVITE_FRIENDS; 455 int ikeyY = -1; 456 457 XPARTY_USER_LIST partyList; 458 if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) 459 { 460 keyX = IDS_TOOLTIPS_INVITE_PARTY; 461 } 462 if(g_NetworkManager.IsLocalGame()) keyX = -1; 463 464 INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ playersList.GetCurSel() ] ); 465 466 int keyA = -1; 467 Minecraft *pMinecraft = Minecraft::GetInstance(); 468 shared_ptr<MultiplayerLocalPlayer> localPlayer = pMinecraft->localplayers[m_iPad]; 469 470 bool isOp = m_isHostPlayer || localPlayer->isModerator(); 471 bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; 472 bool trust = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; 473 474 if( isOp ) 475 { 476 if(m_gameOptionsButton.HasFocus()) 477 { 478 keyA = IDS_TOOLTIPS_SELECT; 479 } 480 else if( selectedPlayer != NULL) 481 { 482 bool editingHost = selectedPlayer->IsHost(); 483 if( (cheats && (m_isHostPlayer || !editingHost ) ) || (!trust && (m_isHostPlayer || !editingHost)) 484#if (!defined(_CONTENT_PACKAGE) && !defined(_FINAL_BUILD) && defined(_DEBUG_MENUS_ENABLED)) 485 || (m_isHostPlayer && editingHost) 486#endif 487 ) 488 { 489 keyA = IDS_TOOLTIPS_PRIVILEGES; 490 } 491 else if(selectedPlayer->IsLocal() != TRUE && selectedPlayer->IsSameSystem(g_NetworkManager.GetHostPlayer()) != TRUE) 492 { 493 // Only ops will hit this, can kick anyone not local and not local to the host 494 keyA = IDS_TOOLTIPS_KICK; 495 } 496 } 497 } 498 499 if(!m_gameOptionsButton.HasFocus()) 500 { 501 // if the player is me, then view gamer profile 502 if(selectedPlayer != NULL && selectedPlayer->IsLocal() && selectedPlayer->GetUserIndex()==m_iPad) 503 { 504 ikeyY = IDS_TOOLTIPS_VIEW_GAMERPROFILE; 505 } 506 else 507 { 508 ikeyY = IDS_TOOLTIPS_VIEW_GAMERCARD; 509 } 510 } 511 ui.SetTooltips( m_iPad, keyA,IDS_TOOLTIPS_BACK,keyX,ikeyY); 512} 513 514 515HRESULT CScene_InGameInfo::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) 516{ 517 bHandled=true; 518 return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); 519} 520 521int CScene_InGameInfo::KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) 522{ 523 BYTE smallId = *(BYTE *)pParam; 524 delete pParam; 525 526 if(result==C4JStorage::EMessage_ResultAccept) 527 { 528 Minecraft *pMinecraft = Minecraft::GetInstance(); 529 shared_ptr<MultiplayerLocalPlayer> localPlayer = pMinecraft->localplayers[iPad]; 530 if(localPlayer != NULL && localPlayer->connection) 531 { 532 localPlayer->connection->send( shared_ptr<KickPlayerPacket>( new KickPlayerPacket(smallId) ) ); 533 } 534 } 535 536 return 0; 537}