Something went wrong. Try again.
the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
Something went wrong. Try again.
15 kB · 566 lines
C++
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567#include "stdafx.h"
#include <assert.h>#include "..\XUI\XUI_HelpControls.h"#include "XUI_Ctrl_4JList.h"
#include "..\..\..\Minecraft.World\net.minecraft.world.level.h"#include "..\..\..\Minecraft.World\LevelData.h"#include "..\..\MultiplayerLocalPlayer.h"
#define ALIGN_START 0#define ALIGN_END 1typedef struct { WCHAR wchName[20]; int iAlign; D3DXVECTOR3 vPos;}CONTROLDETAILS;
LPCWSTR CScene_Controls::m_LayoutNameA[3]={ L"1", L"2", L"3",};CONTROLDETAILS controlDetailsA[MAX_CONTROLS]={ { L"FigA",ALIGN_END // _360_JOY_BUTTON_A }, { L"FigB",ALIGN_END // _360_JOY_BUTTON_B }, { L"FigX",ALIGN_END // _360_JOY_BUTTON_X }, { L"FigY",ALIGN_END // _360_JOY_BUTTON_Y }, { L"FigStart",ALIGN_END // _360_JOY_BUTTON_START }, { L"FigBack",ALIGN_START // _360_JOY_BUTTON_BACK }, { L"FigRB",ALIGN_END // _360_JOY_BUTTON_RB }, { L"FigLB",ALIGN_START // _360_JOY_BUTTON_LB }, { L"FigRStickButton",ALIGN_END // _360_JOY_BUTTON_RTHUMB }, { L"FigLStickButton",ALIGN_START // _360_JOY_BUTTON_LTHUMB }, // Move { L"FigRStick",ALIGN_END // _360_JOY_BUTTON_RSTICK_RIGHT }, // Look { L"FigLStick",ALIGN_START // _360_JOY_BUTTON_LSTICK_RIGHT }, { L"FigRT",ALIGN_END // RT }, { L"FigLT",ALIGN_START // LT }, { L"FigDpadR",ALIGN_START // DpadR }, { L"FigDpadL",ALIGN_START // DpadL }, { L"FigDpad",ALIGN_START // DpadL },
};
//----------------------------------------------------------------------------------// Performs initialization tasks - retrieves controls.//----------------------------------------------------------------------------------HRESULT CScene_Controls::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ){ MapChildControls(); XuiControlSetText(m_SouthPaw,app.GetString(IDS_SOUTHPAW)); XuiControlSetText(m_InvertLook,app.GetString(IDS_INVERT_LOOK));
m_iPad=*(int *)pInitData->pvInitData; // if we're not in the game, we need to use basescene 0 bool bNotInGame=(Minecraft::GetInstance()->level==NULL); bool bSplitscreen=(app.GetLocalPlayerCount()>1); m_iCurrentTextIndex=0; m_bCreativeMode = !bNotInGame && Minecraft::GetInstance()->localplayers[m_iPad] && Minecraft::GetInstance()->localplayers[m_iPad]->abilities.mayfly;
if(!bNotInGame) { // disable the build ver display m_BuildVer.SetShow(FALSE); }
if(bSplitscreen) { app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,32.0f); CXuiSceneBase::ShowLogo( m_iPad, FALSE ); } else { if(bNotInGame) { CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); } else { CXuiSceneBase::ShowLogo( m_iPad, TRUE ); } }
// if we're not in the game, we need to use basescene 0 if(bNotInGame) { ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); } else { ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); } m_iSchemeTextA[0]=IDS_CONTROLS_SCHEME0; m_iSchemeTextA[1]=IDS_CONTROLS_SCHEME1; m_iSchemeTextA[2]=IDS_CONTROLS_SCHEME2;
// get the figures HXUIOBJ hObj; HRESULT hr;
// turn off all the figures to start with for(int i=0;i<MAX_CONTROLS;i++) { m_FigA[i].GetChildById(controlDetailsA[i].wchName,&hObj); hr=XuiElementGetPosition(hObj,&controlDetailsA[i].vPos); if(controlDetailsA[i].iAlign==ALIGN_END) { float fW,fH; hr=XuiElementGetBounds(hObj,&fW,&fH); controlDetailsA[i].vPos.x+=fW; controlDetailsA[i].vPos.y+=fH; }
// if we're in splitscreen, half all the numbers if(bSplitscreen) { controlDetailsA[i].vPos.x/=2.0f; controlDetailsA[i].vPos.y/=2.0f; } m_FigA[i].SetShow(FALSE); m_TextPresenterA[i] = NULL; }
// fill out the layouts list VOID *pObj; XuiObjectFromHandle( m_SchemeList, &pObj ); m_pLayoutList = (CXuiCtrl4JList *)pObj; CXuiCtrl4JList::LIST_ITEM_INFO ListInfo[3]; ZeroMemory(ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)*3);
for(int i=0;i<3;i++) { ListInfo[i].pwszText=m_LayoutNameA[i]; ListInfo[i].hXuiBrush=NULL; ListInfo[i].fEnabled=TRUE; m_pLayoutList->AddData(ListInfo[i]); }
m_bIgnoreNotifies=true; m_bIgnoreNotifies=false; int iSelected=app.GetGameSettings(m_iPad,eGameSetting_ControlScheme); XuiControlSetText(m_SchemeList,app.GetString(IDS_CONTROLS_LAYOUT)); hr=m_pLayoutList->SetCurSelVisible(iSelected); m_iCurrentNavigatedControlsLayout=iSelected;
LPWSTR layoutString = new wchar_t[ 128 ]; swprintf( layoutString, 128, L"%ls : %ls", app.GetString( IDS_CURRENT_LAYOUT ),app.GetString(m_iSchemeTextA[iSelected])); XuiControlSetText(m_CurrentLayout,layoutString);
//PositionAllText(m_iPad);
swprintf( layoutString, 128, L"%ls%ls", VER_PRODUCTVERSION_STR_W,app.DLCInstallProcessCompleted()?L"_DLC":L" ");
m_BuildVer.SetText(layoutString); delete [] layoutString;
// Set check box initial states. BOOL bInvertLook = app.GetGameSettings(m_iPad,eGameSetting_ControlInvertLook); m_InvertLook.SetCheck( bInvertLook );
BOOL bSouthPaw = app.GetGameSettings(m_iPad,eGameSetting_ControlSouthPaw); m_SouthPaw.SetCheck( bSouthPaw );
return S_OK;}
HRESULT CScene_Controls::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ){
if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK;
if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) { int iSelected=app.GetGameSettings(m_iPad,eGameSetting_ControlScheme); // and update the highlight on the current selection m_pLayoutList->SetBorder(iSelected,TRUE);
PositionAllText(m_iPad); }
return S_OK;}
void CScene_Controls::PositionAllText(int iPad){ // turn off all the figures to start with for(int i=0;i<MAX_CONTROLS;i++) { m_FigA[i].SetShow(FALSE); }
m_iCurrentTextIndex=0; if(m_bCreativeMode) { PositionText(iPad,IDS_CONTROLS_JUMPFLY,MINECRAFT_ACTION_JUMP); } else { PositionText(iPad,IDS_CONTROLS_JUMP,MINECRAFT_ACTION_JUMP); } PositionText(iPad,IDS_CONTROLS_INVENTORY,MINECRAFT_ACTION_INVENTORY); PositionText(iPad,IDS_CONTROLS_PAUSE,MINECRAFT_ACTION_PAUSEMENU); if(m_bCreativeMode) { PositionText(iPad,IDS_CONTROLS_SNEAKFLY,MINECRAFT_ACTION_SNEAK_TOGGLE); } else { PositionText(iPad,IDS_CONTROLS_SNEAK,MINECRAFT_ACTION_SNEAK_TOGGLE); } PositionText(iPad,IDS_CONTROLS_USE,MINECRAFT_ACTION_USE); PositionText(iPad,IDS_CONTROLS_ACTION,MINECRAFT_ACTION_ACTION); PositionText(iPad,IDS_CONTROLS_HELDITEM,MINECRAFT_ACTION_RIGHT_SCROLL); PositionText(iPad,IDS_CONTROLS_HELDITEM,MINECRAFT_ACTION_LEFT_SCROLL); PositionText(iPad,IDS_CONTROLS_DROP,MINECRAFT_ACTION_DROP); PositionText(iPad,IDS_CONTROLS_CRAFTING,MINECRAFT_ACTION_CRAFTING);
PositionText(iPad,IDS_CONTROLS_THIRDPERSON,MINECRAFT_ACTION_RENDER_THIRD_PERSON); PositionText(iPad,IDS_CONTROLS_PLAYERS,MINECRAFT_ACTION_GAME_INFO);
// Swap for southpaw. if ( app.GetGameSettings(m_iPad,eGameSetting_ControlSouthPaw) ) { // Move PositionText(iPad,IDS_CONTROLS_LOOK,MINECRAFT_ACTION_RIGHT); // Look PositionText(iPad,IDS_CONTROLS_MOVE,MINECRAFT_ACTION_LOOK_RIGHT); } else // Normal right handed. { // Move PositionText(iPad,IDS_CONTROLS_MOVE,MINECRAFT_ACTION_RIGHT); // Look PositionText(iPad,IDS_CONTROLS_LOOK,MINECRAFT_ACTION_LOOK_RIGHT); }
// If we're in controls mode 1, and creative mode show the dpad for Creative Mode if(m_bCreativeMode && (m_iCurrentNavigatedControlsLayout==0)) { PositionTextDirect(iPad,IDS_CONTROLS_DPAD,16,true); } else { PositionTextDirect(iPad,IDS_CONTROLS_DPAD,16,false); }}
HRESULT CScene_Controls::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled){ 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.CheckGameSettingsChanged(true,pInputData->UserIndex); app.NavigateBack(pInputData->UserIndex); rfHandled = TRUE; break; }
return hr;}
void CScene_Controls::PositionText(int iPad,int iTextID, unsigned char ucAction){ // position the text depending on the control id //int iTextWidth; XUIRect xuiRect; LPCWSTR pwchText; D3DXVECTOR3 vpos,vScale; HXUIOBJ hFigGroup; unsigned int uiVal=InputManager.GetGameJoypadMaps(m_iCurrentNavigatedControlsLayout,ucAction);
// get the visual of the fig group and use any scaling in it to adjust the text positions XuiElementGetChildById(m_hObj,L"FigGroup",&hFigGroup); XuiElementGetScale(hFigGroup,&vScale);
// check the width of the control with the text set in it if(m_TextPresenterA[m_iCurrentTextIndex]==NULL) { HXUIOBJ hObj=NULL; HRESULT hr=XuiControlGetVisual(m_TextA[m_iCurrentTextIndex].m_hObj,&hObj); hr=XuiElementGetChildById(hObj,L"Text",&m_TextPresenterA[m_iCurrentTextIndex]); }
pwchText=app.GetString(iTextID); HRESULT hr=XuiTextPresenterMeasureText(m_TextPresenterA[m_iCurrentTextIndex], pwchText, &xuiRect); m_TextA[m_iCurrentTextIndex].SetBounds(xuiRect.right,xuiRect.bottom);
int iControlDetailsIndex=0; switch(uiVal) { case _360_JOY_BUTTON_A: iControlDetailsIndex=0; break; case _360_JOY_BUTTON_B: iControlDetailsIndex=1; break; case _360_JOY_BUTTON_X: iControlDetailsIndex=2; break; case _360_JOY_BUTTON_Y: iControlDetailsIndex=3; break; case _360_JOY_BUTTON_START: iControlDetailsIndex=4; break; case _360_JOY_BUTTON_BACK: iControlDetailsIndex=5; break; case _360_JOY_BUTTON_RB: iControlDetailsIndex=6; break; case _360_JOY_BUTTON_LB: iControlDetailsIndex=7; break; case _360_JOY_BUTTON_RTHUMB: iControlDetailsIndex=8; break; case _360_JOY_BUTTON_LTHUMB: iControlDetailsIndex=9; break; // Look case _360_JOY_BUTTON_RSTICK_RIGHT: iControlDetailsIndex=10; break; // Move case _360_JOY_BUTTON_LSTICK_RIGHT: iControlDetailsIndex=11; break; case _360_JOY_BUTTON_RT: iControlDetailsIndex=12; break; // Move case _360_JOY_BUTTON_LT: iControlDetailsIndex=13; break; case _360_JOY_BUTTON_DPAD_RIGHT: iControlDetailsIndex=14; break; case _360_JOY_BUTTON_DPAD_LEFT: iControlDetailsIndex=15; break; }
hr=m_FigA[iControlDetailsIndex].SetShow(TRUE); // position the control depending on the text width
if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) { // 480 mode - we need to scale the text positions if(controlDetailsA[iControlDetailsIndex].iAlign==ALIGN_END) { vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x + 5.0f)* vScale.x; } else { vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x - 5.0f)* vScale.x - xuiRect.right; }
vpos.y=(controlDetailsA[iControlDetailsIndex].vPos.y * vScale.y) - (xuiRect.bottom/2.0f); } else { if(controlDetailsA[iControlDetailsIndex].iAlign==ALIGN_END) { vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x + 5.0f); } else { vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x - 5.0f) - xuiRect.right; }
vpos.y=(controlDetailsA[iControlDetailsIndex].vPos.y ) - (xuiRect.bottom/2.0f); }
vpos.x=floor(vpos.x); vpos.y=floor(vpos.y); vpos.z=0.0f;
m_TextA[m_iCurrentTextIndex].SetPosition(&vpos); m_TextA[m_iCurrentTextIndex].SetText(pwchText); m_TextA[m_iCurrentTextIndex].SetShow(TRUE); m_iCurrentTextIndex++;}
void CScene_Controls::PositionTextDirect(int iPad,int iTextID, int iControlDetailsIndex, bool bShow){ // position the text depending on the control id //int iTextWidth; XUIRect xuiRect; LPCWSTR pwchText; D3DXVECTOR3 vpos,vScale; HXUIOBJ hFigGroup;
if(bShow==false) { m_TextA[m_iCurrentTextIndex++].SetShow(FALSE); return; } // get the visual of the fig group and use any scaling in it to adjust the text positions XuiElementGetChildById(m_hObj,L"FigGroup",&hFigGroup); XuiElementGetScale(hFigGroup,&vScale);
// check the width of the control with the text set in it if(m_TextPresenterA[m_iCurrentTextIndex]==NULL) { HXUIOBJ hObj=NULL; HRESULT hr=XuiControlGetVisual(m_TextA[m_iCurrentTextIndex].m_hObj,&hObj); hr=XuiElementGetChildById(hObj,L"Text",&m_TextPresenterA[m_iCurrentTextIndex]); }
pwchText=app.GetString(iTextID); HRESULT hr=XuiTextPresenterMeasureText(m_TextPresenterA[m_iCurrentTextIndex], pwchText, &xuiRect); m_TextA[m_iCurrentTextIndex].SetBounds(xuiRect.right,xuiRect.bottom);
hr=m_FigA[iControlDetailsIndex].SetShow(TRUE); // position the control depending on the text width
if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) { // 480 mode - we need to scale the text positions if(controlDetailsA[iControlDetailsIndex].iAlign==ALIGN_END) { vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x + 5.0f)* vScale.x; } else { vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x - 5.0f)* vScale.x - xuiRect.right; }
vpos.y=(controlDetailsA[iControlDetailsIndex].vPos.y * vScale.y) - (xuiRect.bottom/2.0f); } else { if(controlDetailsA[iControlDetailsIndex].iAlign==ALIGN_END) { vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x + 5.0f); } else { vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x - 5.0f) - xuiRect.right; }
vpos.y=(controlDetailsA[iControlDetailsIndex].vPos.y ) - (xuiRect.bottom/2.0f); }
vpos.x=floor(vpos.x); vpos.y=floor(vpos.y); vpos.z=0.0f;
m_TextA[m_iCurrentTextIndex].SetPosition(&vpos); m_TextA[m_iCurrentTextIndex].SetText(pwchText); m_TextA[m_iCurrentTextIndex].SetShow(TRUE); m_iCurrentTextIndex++;}
HRESULT CScene_Controls::OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ){ if( ( !m_bIgnoreNotifies )&&( hObjSource==m_pLayoutList->m_hObj ) ) { m_iCurrentNavigatedControlsLayout=pNotifySelChangedData->iItem; PositionAllText(m_iPad); } if(pNotifySelChangedData->iOldItem!=-1 && hObjSource==m_SchemeList ) { CXuiSceneBase::PlayUISFX(eSFX_Focus); } return S_OK;}
HRESULT CScene_Controls::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled){ // This assumes all buttons can only be pressed with the A button ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A);
// Handle check box changes. if ( hObjPressed == m_InvertLook.m_hObj ) { BOOL bIsChecked = m_InvertLook.IsChecked(); app.SetGameSettings(m_iPad,eGameSetting_ControlInvertLook,(unsigned char)( bIsChecked ) ); } else if ( hObjPressed == m_SouthPaw.m_hObj ) { BOOL bIsChecked = m_SouthPaw.IsChecked(); app.SetGameSettings(m_iPad,eGameSetting_ControlSouthPaw,(unsigned char)( bIsChecked ) ); PositionAllText(m_iPad); } else if( hObjPressed == m_SchemeList) { // check what's been selected app.SetGameSettings(m_iPad,eGameSetting_ControlScheme,(unsigned char)m_SchemeList.GetCurSel()); LPWSTR layoutString = new wchar_t[ 128 ]; swprintf( layoutString, 128, L"%ls : %ls", app.GetString( IDS_CURRENT_LAYOUT ),app.GetString(m_iSchemeTextA[m_SchemeList.GetCurSel()]) ); XuiControlSetText(m_CurrentLayout,layoutString); delete [] layoutString; // and update the highlight on the current selection for(int i=0;i<m_pLayoutList->GetItemCount();i++) { m_pLayoutList->SetBorder(i,FALSE); } m_pLayoutList->SetBorder(m_SchemeList.GetCurSel(),TRUE); } return S_OK;}
HRESULT CScene_Controls::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled){ bHandled=true; return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining,32.0f);}