diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/Common/XUI/XUI_HelpControls.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.Client/Common/XUI/XUI_HelpControls.cpp')
| -rw-r--r-- | Minecraft.Client/Common/XUI/XUI_HelpControls.cpp | 566 |
1 files changed, 566 insertions, 0 deletions
diff --git a/Minecraft.Client/Common/XUI/XUI_HelpControls.cpp b/Minecraft.Client/Common/XUI/XUI_HelpControls.cpp new file mode 100644 index 00000000..e7a8b0ca --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_HelpControls.cpp @@ -0,0 +1,566 @@ +#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 1 +typedef 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); +} |
