the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 378 lines 11 kB view raw
1#include "stdafx.h" 2#include "UI.h" 3#include "UIScene_FullscreenProgress.h" 4#include "..\..\Minecraft.h" 5#include "..\..\ProgressRenderer.h" 6 7 8UIScene_FullscreenProgress::UIScene_FullscreenProgress(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) 9{ 10 // Setup all the Iggy references we need for this scene 11 initialiseMovie(); 12 13 parentLayer->addComponent(iPad,eUIComponent_Panorama); 14 parentLayer->addComponent(iPad,eUIComponent_Logo); 15 parentLayer->showComponent(iPad,eUIComponent_Logo,true); 16 parentLayer->showComponent(iPad,eUIComponent_MenuBackground,false); 17 18 m_controlTimer.setVisible( false ); 19 20 m_titleText = L""; 21 m_statusText = L""; 22 23 m_lastTitle = -1; 24 m_lastStatus = -1; 25 m_lastProgress = 0; 26 27 m_buttonConfirm.init( app.GetString( IDS_CONFIRM_OK ), eControl_Confirm ); 28 m_buttonConfirm.setVisible(false); 29 30 LoadingInputParams *params = (LoadingInputParams *)initData; 31 32 m_CompletionData = params->completionData; 33 m_iPad=params->completionData->iPad; 34 m_cancelFunc = params->cancelFunc; 35 m_cancelFuncParam = params->m_cancelFuncParam; 36 m_completeFunc = params->completeFunc; 37 m_completeFuncParam = params->m_completeFuncParam; 38 39 m_cancelText = params->cancelText; 40 m_bWasCancelled=false; 41 m_bWaitForThreadToDelete = params->waitForThreadToDelete; 42 43 // Clear the progress text 44 Minecraft *pMinecraft=Minecraft::GetInstance(); 45 pMinecraft->progressRenderer->progressStart(-1); 46 pMinecraft->progressRenderer->progressStage(-1); 47 m_progressBar.init(L"",0,0,100,0); 48 49 // set the tip 50 wstring wsText= app.FormatHTMLString(m_iPad,app.GetString(app.GetNextTip())); 51 52 wchar_t startTags[64]; 53 swprintf(startTags,64,L"<font color=\"#%08x\"><p align=center>",app.GetHTMLColour(eHTMLColor_White)); 54 wsText= startTags + wsText + L"</p>"; 55 m_labelTip.init(wsText); 56 57 addTimer(TIMER_FULLSCREEN_TIPS, TIMER_FULLSCREEN_TIPS_TIME); 58 59 m_labelTitle.init(L""); 60 61 m_labelTip.setVisible( m_CompletionData->bShowTips ); 62 63 thread = new C4JThread(params->func, params->lpParam, "FullscreenProgress"); 64 thread->SetProcessor(CPU_CORE_UI_SCENE); // TODO 4J Stu - Make sure this is a good thread/core to use 65 66 m_threadCompleted = false; 67 thread->Run(); 68 threadStarted = true; 69 70#ifdef __PSVITA__ 71 ui.TouchBoxRebuild(this); 72#endif 73 74#ifdef _XBOX_ONE 75 ui.ShowPlayerDisplayname(false); 76#endif 77} 78 79UIScene_FullscreenProgress::~UIScene_FullscreenProgress() 80{ 81 m_parentLayer->removeComponent(eUIComponent_Panorama); 82 m_parentLayer->removeComponent(eUIComponent_Logo); 83 84 delete thread; 85 86 delete m_CompletionData; 87} 88 89wstring UIScene_FullscreenProgress::getMoviePath() 90{ 91 return L"FullscreenProgress"; 92} 93 94void UIScene_FullscreenProgress::updateTooltips() 95{ 96 ui.SetTooltips( m_parentLayer->IsFullscreenGroup()?XUSER_INDEX_ANY:m_iPad, m_threadCompleted?IDS_TOOLTIPS_SELECT:-1, m_threadCompleted?-1:m_cancelText, -1, -1 ); 97} 98 99void UIScene_FullscreenProgress::handleDestroy() 100{ 101 int code = thread->GetExitCode(); 102 DWORD exitcode = *((DWORD *)&code); 103 104 // If we're active, have a cancel func, and haven't already cancelled, call cancel func 105 if( exitcode == STILL_ACTIVE && m_cancelFunc != NULL && !m_bWasCancelled) 106 { 107 m_bWasCancelled = true; 108 m_cancelFunc(m_cancelFuncParam); 109 } 110} 111 112void UIScene_FullscreenProgress::tick() 113{ 114 UIScene::tick(); 115 116 Minecraft *pMinecraft=Minecraft::GetInstance(); 117 118 int currentProgress = pMinecraft->progressRenderer->getCurrentPercent(); 119 if(currentProgress < 0) currentProgress = 0; 120 if(currentProgress != m_lastProgress) 121 { 122 m_lastProgress = currentProgress; 123 m_progressBar.setProgress(currentProgress); 124 //app.DebugPrintf("Updated progress value\n"); 125 } 126 127 int title = pMinecraft->progressRenderer->getCurrentTitle(); 128 if(title >= 0 && title != m_lastTitle) 129 { 130 m_lastTitle = title; 131 m_titleText = app.GetString( title ); 132 m_labelTitle.setLabel(m_titleText); 133 } 134 135 ProgressRenderer::eProgressStringType eProgressType=pMinecraft->progressRenderer->getType(); 136 137 if(eProgressType==ProgressRenderer::eProgressStringType_ID) 138 { 139 int status = pMinecraft->progressRenderer->getCurrentStatus(); 140 if(status >= 0 && status != m_lastStatus) 141 { 142 m_lastStatus = status; 143 m_statusText = app.GetString( status ); 144 m_progressBar.setLabel(m_statusText.c_str()); 145 } 146 } 147 else 148 { 149 wstring& wstrText = pMinecraft->progressRenderer->getProgressString(); 150 m_progressBar.setLabel(wstrText.c_str()); 151 } 152 153 154 int code = thread->GetExitCode(); 155 DWORD exitcode = *((DWORD *)&code); 156 157 //app.DebugPrintf("CScene_FullscreenProgress Timer %d\n",pTimer->nId); 158 159 if( exitcode != STILL_ACTIVE ) 160 { 161 // If we failed (currently used by network connection thread), navigate back 162 if( exitcode != S_OK ) 163 { 164 if( exitcode == ERROR_CANCELLED ) 165 { 166 // Current thread cancelled for whatever reason 167 // Currently used only for the CConsoleMinecraftApp::RemoteSaveThreadProc thread 168 // Assume to just ignore this thread as something else is now running that will 169 // cause another action 170 } 171 else 172 { 173 /*m_threadCompleted = true; 174 m_buttonConfirm.SetShow( TRUE ); 175 m_buttonConfirm.SetFocus( m_CompletionData->iPad ); 176 m_CompletionData->type = e_ProgressCompletion_NavigateToHomeMenu; 177 178 int exitReasonStringId; 179 switch( app.GetDisconnectReason() ) 180 { 181 default: 182 exitReasonStringId = IDS_CONNECTION_FAILED; 183 } 184 Minecraft *pMinecraft=Minecraft::GetInstance(); 185 pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId );*/ 186 //app.NavigateBack(m_CompletionData->iPad); 187 188 UINT uiIDA[1]; 189 uiIDA[0]=IDS_CONFIRM_OK; 190 ui.RequestErrorMessage( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_FAILED), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_SERVER), uiIDA,1, XUSER_INDEX_ANY); 191 192 ui.NavigateToHomeMenu(); 193 ui.UpdatePlayerBasePositions(); 194 } 195 } 196 else 197 { 198 if(( m_CompletionData->bRequiresUserAction == TRUE ) && (!m_bWasCancelled)) 199 { 200 m_threadCompleted = true; 201 m_buttonConfirm.setVisible( true ); 202 // 4J-TomK - rebuild touch after confirm button made visible again 203#ifdef __PSVITA__ 204 ui.TouchBoxRebuild(this); 205#endif 206 updateTooltips(); 207 } 208 else 209 { 210 if(m_bWasCancelled) 211 { 212 m_threadCompleted = true; 213 } 214 app.DebugPrintf("FullScreenProgress complete with action: "); 215 switch(m_CompletionData->type) 216 { 217 case e_ProgressCompletion_AutosaveNavigateBack: 218 app.DebugPrintf("e_ProgressCompletion_AutosaveNavigateBack\n"); 219 { 220 // 4J Stu - Fix for #65437 - Customer Encountered: Code: Settings: Autosave option doesn't work when the Host goes into idle state during gameplay. 221 // Autosave obviously cannot occur if an ignore autosave menu is displayed, so even if we navigate back to a scene and not empty 222 // then we still want to reset this flag which was set true by the navigate to the fullscreen progress 223 ui.SetIgnoreAutosaveMenuDisplayed(m_iPad, false); 224 225 // This just allows it to be shown 226 Minecraft *pMinecraft = Minecraft::GetInstance(); 227 if(pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(true); 228 ui.UpdatePlayerBasePositions(); 229 navigateBack(); 230 } 231 break; 232 233 case e_ProgressCompletion_NavigateBack: 234 app.DebugPrintf("e_ProgressCompletion_NavigateBack\n"); 235 { 236 ui.UpdatePlayerBasePositions(); 237 navigateBack(); 238 } 239 break; 240 case e_ProgressCompletion_NavigateBackToScene: 241 app.DebugPrintf("e_ProgressCompletion_NavigateBackToScene\n"); 242 ui.UpdatePlayerBasePositions(); 243 // 4J Stu - If used correctly this scene will not have interfered with any other scene at all, so just navigate back 244 navigateBack(); 245 break; 246 case e_ProgressCompletion_CloseUIScenes: 247 app.DebugPrintf("e_ProgressCompletion_CloseUIScenes\n"); 248 ui.CloseUIScenes(m_CompletionData->iPad); 249 ui.UpdatePlayerBasePositions(); 250 break; 251 case e_ProgressCompletion_CloseAllPlayersUIScenes: 252 app.DebugPrintf("e_ProgressCompletion_CloseAllPlayersUIScenes\n"); 253 ui.CloseAllPlayersScenes(); 254 ui.UpdatePlayerBasePositions(); 255 break; 256 case e_ProgressCompletion_NavigateToHomeMenu: 257 app.DebugPrintf("e_ProgressCompletion_NavigateToHomeMenu\n"); 258 ui.NavigateToHomeMenu(); 259 ui.UpdatePlayerBasePositions(); 260 break; 261 default: 262 app.DebugPrintf("Default\n"); 263 break; 264 } 265 } 266 } 267 } 268} 269 270void UIScene_FullscreenProgress::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) 271{ 272 //if( m_showTooltips ) 273 { 274 //ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); 275 276 switch(key) 277 { 278 case ACTION_MENU_OK: 279#ifdef __ORBIS__ 280 case ACTION_MENU_TOUCHPAD_PRESS: 281#endif 282 if(pressed) 283 { 284 sendInputToMovie(key, repeat, pressed, released); 285 } 286 break; 287 case ACTION_MENU_B: 288 case ACTION_MENU_CANCEL: 289 if( pressed && m_cancelFunc != NULL && !m_bWasCancelled ) 290 { 291 m_bWasCancelled = true; 292 m_cancelFunc( m_cancelFuncParam ); 293 } 294 break; 295 } 296 } 297} 298 299void UIScene_FullscreenProgress::handlePress(F64 controlId, F64 childId) 300{ 301 if(m_threadCompleted && (int)controlId == eControl_Confirm) 302 { 303 // This assumes all buttons can only be pressed with the A button 304 ui.AnimateKeyPress(m_iPad, ACTION_MENU_A, false, true, false); 305 306 // if there's a complete function, call it 307 if(m_completeFunc) 308 { 309 m_completeFunc(m_completeFuncParam); 310 } 311 312 switch(m_CompletionData->type) 313 { 314 case e_ProgressCompletion_NavigateBack: 315 app.DebugPrintf("e_ProgressCompletion_NavigateBack\n"); 316 { 317 ui.UpdatePlayerBasePositions(); 318 navigateBack(); 319 } 320 break; 321 case e_ProgressCompletion_NavigateBackToScene: 322 app.DebugPrintf("e_ProgressCompletion_NavigateBackToScene\n"); 323 ui.UpdatePlayerBasePositions(); 324 // 4J Stu - If used correctly this scene will not have interfered with any other scene at all, so just navigate back 325 navigateBack(); 326 break; 327 case e_ProgressCompletion_CloseUIScenes: 328 app.DebugPrintf("e_ProgressCompletion_CloseUIScenes\n"); 329 ui.CloseUIScenes(m_CompletionData->iPad); 330 ui.UpdatePlayerBasePositions(); 331 break; 332 case e_ProgressCompletion_CloseAllPlayersUIScenes: 333 app.DebugPrintf("e_ProgressCompletion_CloseAllPlayersUIScenes\n"); 334 ui.CloseAllPlayersScenes(); 335 ui.UpdatePlayerBasePositions(); 336 break; 337 case e_ProgressCompletion_NavigateToHomeMenu: 338 app.DebugPrintf("e_ProgressCompletion_NavigateToHomeMenu\n"); 339 ui.NavigateToHomeMenu(); 340 ui.UpdatePlayerBasePositions(); 341 break; 342 } 343 } 344} 345 346void UIScene_FullscreenProgress::handleTimerComplete(int id) 347{ 348 switch(id) 349 { 350 case TIMER_FULLSCREEN_TIPS: 351 { 352 // display the next tip 353 wstring wsText=app.FormatHTMLString(m_iPad,app.GetString(app.GetNextTip())); 354 wchar_t startTags[64]; 355 swprintf(startTags,64,L"<font color=\"#%08x\"><p align=center>",app.GetHTMLColour(eHTMLColor_White)); 356 wsText= startTags + wsText + L"</p>"; 357 m_labelTip.setLabel(wsText); 358 } 359 break; 360 } 361} 362 363void UIScene_FullscreenProgress::SetWasCancelled(bool wasCancelled) 364{ 365 m_bWasCancelled = wasCancelled; 366} 367 368bool UIScene_FullscreenProgress::isReadyToDelete() 369{ 370 if( m_bWaitForThreadToDelete ) 371 { 372 return !thread->isRunning(); 373 } 374 else 375 { 376 return true; 377 } 378}