From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- .../Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp | 392 +++++++++++++++++++++ 1 file changed, 392 insertions(+) create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp (limited to 'Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp') diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp new file mode 100644 index 00000000..87abbcd3 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp @@ -0,0 +1,392 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\Slot.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\Minecraft.h" + +#include "XUI_Ctrl_SlotItemCtrlBase.h" + +HRESULT CXuiCtrlSlotItemCtrlBase::OnInit( HXUIOBJ hObj, XUIMessageInit* pInitData, BOOL& bHandled ) +{ + HRESULT hr = S_OK; + SlotControlUserDataContainer* pvUserData = new SlotControlUserDataContainer(); + hr = XuiElementSetUserData(hObj, (void *)pvUserData ); + + // 4J WESTY : Pointer Prototype : Added to support prototype only. + m_bSkipDefaultNavigation = false; + + return hr; +} + +HRESULT CXuiCtrlSlotItemCtrlBase::OnDestroy( HXUIOBJ hObj ) +{ + HRESULT hr = S_OK; + void* pvUserData; + hr = XuiElementGetUserData( hObj, &pvUserData ); + + if( pvUserData != NULL ) + { + delete pvUserData; + } + + return hr; +} + +HRESULT CXuiCtrlSlotItemCtrlBase::OnCustomMessage_GetSlotItem(HXUIOBJ hObj, CustomMessage_GetSlotItem_Struct *pData, BOOL& bHandled) +{ + shared_ptr item = shared_ptr(); + + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + if( pUserDataContainer->slot != NULL ) + { + item = pUserDataContainer->slot->getItem(); + } + else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + if(player != NULL) item = player->inventory->getCarried(); + } + + if( item != NULL ) + { + pData->item = item; + pData->iItemBitField = MAKE_SLOTDISPLAY_ITEM_BITMASK(item->id,item->getAuxValue(),item->isFoil()); + //int iAuxVal=item->getAuxValue(); + //int iCount = item->GetCount(); + // 8 bits - alpha + // 1 bit - decorations on + // 11 bits - auxval + // 6 bits - count + // 6 bits - scale + pData->iDataBitField = MAKE_SLOTDISPLAY_DATA_BITMASK(pUserDataContainer->m_iPad, (int)(31*pUserDataContainer->m_fAlpha),true,item->GetCount(),7,item->popTime); + } + else + { + //pGetSourceImageData->iData = 0; + pData->szPath = L""; + } + + bHandled = TRUE; + + return S_OK; +} + +void CXuiCtrlSlotItemCtrlBase::SetSlot( HXUIOBJ hObj, Slot* slot ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + pUserDataContainer->slot = slot; +} + +void CXuiCtrlSlotItemCtrlBase::SetUserIndex( HXUIOBJ hObj, int iPad ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + pUserDataContainer->m_iPad = iPad; +} + +void CXuiCtrlSlotItemCtrlBase::SetAlpha( HXUIOBJ hObj, float fAlpha ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + pUserDataContainer->m_fAlpha = fAlpha; +} + +bool CXuiCtrlSlotItemCtrlBase::isEmpty( HXUIOBJ hObj ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + if(pUserDataContainer->slot != NULL) + { + return !pUserDataContainer->slot->hasItem(); + } + else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + if(player != NULL) return player->inventory->getCarried() == NULL; + + } + return true; +} + +wstring CXuiCtrlSlotItemCtrlBase::GetItemDescription( HXUIOBJ hObj, vector &unformattedStrings ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + if(pUserDataContainer->slot != NULL) + { + wstring desc = L""; + vector *strings = pUserDataContainer->slot->getItem()->getHoverText(Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad], false, unformattedStrings); + bool firstLine = true; + for(AUTO_VAR(it, strings->begin()); it != strings->end(); ++it) + { + wstring thisString = *it; + if(!firstLine) + { + desc.append( L"
" ); + } + else + { + firstLine = false; + wchar_t formatted[256]; + eMinecraftColour rarityColour = pUserDataContainer->slot->getItem()->getRarity()->color; + int colour = app.GetHTMLColour(rarityColour); + + if(pUserDataContainer->slot->getItem()->hasCustomHoverName()) + { + colour = app.GetHTMLColour(eTextColor_RenamedItemTitle); + } + + swprintf(formatted, 256, L"%s",colour,thisString.c_str()); + thisString = formatted; + } + desc.append( thisString ); + } + strings->clear(); + delete strings; + return desc;//app.GetString( pUserDataContainer->slot->getItem()->getDescriptionId() ); + } + else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + if(player != NULL) + { + shared_ptr item = player->inventory->getCarried(); + if(item != NULL) return app.GetString( item->getDescriptionId() ); + } + + } + return L""; +} + +shared_ptr CXuiCtrlSlotItemCtrlBase::getItemInstance( HXUIOBJ hObj ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + if(pUserDataContainer->slot != NULL) + { + return pUserDataContainer->slot->getItem(); + } + else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + if(player != NULL) return player->inventory->getCarried(); + + } + return nullptr; +} + +Slot *CXuiCtrlSlotItemCtrlBase::getSlot( HXUIOBJ hObj ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + return pUserDataContainer->slot; +} + +HRESULT CXuiCtrlSlotItemCtrlBase::OnKeyDown(HXUIOBJ hObj, XUIMessageInput *pInputData, BOOL& bHandled) +{ + if( pInputData->dwKeyCode == VK_PAD_DPAD_LEFT || + pInputData->dwKeyCode == VK_PAD_DPAD_RIGHT || + pInputData->dwKeyCode == VK_PAD_DPAD_UP || + pInputData->dwKeyCode == VK_PAD_DPAD_DOWN || + pInputData->dwKeyCode == VK_PAD_LTRIGGER || + pInputData->dwKeyCode == VK_PAD_RTRIGGER) + { + HXUIOBJ parent; + HRESULT hr; + hr = XuiElementGetParent( hObj, &parent ); + + XUIMessage message; + XUIMessageInput messageInput; + + XuiMessageInput( &message, &messageInput, XUI_KEYDOWN, pInputData->dwKeyCode, pInputData->wch, pInputData->dwFlags, pInputData->UserIndex ); + + if (HRESULT_SUCCEEDED(hr)) + { + hr = XuiBubbleMessage(parent, &message); + + if (message.bHandled) + { + bHandled = TRUE; + } + } + } + + return S_OK; +} + +// 4J WESTY : Pointer Prototype : Added to support prototype only. +HRESULT CXuiCtrlSlotItemCtrlBase::OnControlNavigate( HXUIOBJ hObj, XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + // Skip default navigation behaviour when navigation is by pointer. + if ( m_bSkipDefaultNavigation ) + { + pControlNavigateData->bSkipNavigate = TRUE; + bHandled = TRUE; + } + return S_OK; +} + +// 4J WESTY : Pointer Prototype : Added to support prototype only. +int CXuiCtrlSlotItemCtrlBase::GetObjectCount( HXUIOBJ hObj ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + int iCount = 0; + + if(pUserDataContainer->slot != NULL) + { + if ( pUserDataContainer->slot->hasItem() ) + { + iCount = pUserDataContainer->slot->getItem()->GetCount(); + } + } + else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + if(player != NULL && player->inventory->getCarried() != NULL) + { + iCount = player->inventory->getCarried()->count; + } + + } + return iCount; +} + + +// 4J WESTY : Pointer Prototype : Added to support prototype only. +bool CXuiCtrlSlotItemCtrlBase::IsSameItemAs( HXUIOBJ hThisObj, HXUIOBJ hOtherObj ) +{ + bool bThisItemExists = false; + int iThisID = 0; + int iThisAux = 0; + + bool bOtherItemExists = false; + int iOtherID = 0; + int iOtherAux = 0; + + bool bStackedByData = false; + + // Get the info on this item. + void* pvThisUserData; + XuiElementGetUserData( hThisObj, &pvThisUserData ); + SlotControlUserDataContainer* pThisUserDataContainer = (SlotControlUserDataContainer*)pvThisUserData; + + if(pThisUserDataContainer->slot != NULL) + { + if ( pThisUserDataContainer->slot->hasItem() ) + { + iThisID = pThisUserDataContainer->slot->getItem()->id; + iThisAux = pThisUserDataContainer->slot->getItem()->getAuxValue(); + bThisItemExists = true; + bStackedByData = pThisUserDataContainer->slot->getItem()->isStackedByData(); + } + } + else if(pThisUserDataContainer->m_iPad >= 0 && pThisUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pThisUserDataContainer->m_iPad] ); + if(player != NULL && player->inventory->getCarried() != NULL) + { + iThisID = player->inventory->getCarried()->id; + iThisAux = player->inventory->getCarried()->getAuxValue(); + bThisItemExists = true; + bStackedByData = player->inventory->getCarried()->isStackedByData(); + } + + } + + // Get the info on other item. + void* pvOtherUserData; + XuiElementGetUserData( hOtherObj, &pvOtherUserData ); + SlotControlUserDataContainer* pOtherUserDataContainer = (SlotControlUserDataContainer*)pvOtherUserData; + + if(pOtherUserDataContainer->slot != NULL) + { + if ( pOtherUserDataContainer->slot->hasItem() ) + { + iOtherID = pOtherUserDataContainer->slot->getItem()->id; + iOtherAux = pOtherUserDataContainer->slot->getItem()->getAuxValue(); + bOtherItemExists = true; + } + } + else if(pOtherUserDataContainer->m_iPad >= 0 && pOtherUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pOtherUserDataContainer->m_iPad] ); + if(player != NULL && player->inventory->getCarried() != NULL) + { + iOtherID = player->inventory->getCarried()->id; + iOtherAux = player->inventory->getCarried()->getAuxValue(); + bOtherItemExists = true; + } + + } + + if ( bThisItemExists && bOtherItemExists ) + { + return ( ( iThisID == iOtherID ) && ( (bStackedByData && iThisAux == iOtherAux) || !bStackedByData ) ); + } + else + { + return false; + } +} + +// 4J WESTY : Pointer Prototype : Added to support prototype only. +// Returns number of items that can still be stacked into this slot. +int CXuiCtrlSlotItemCtrlBase::GetEmptyStackSpace( HXUIOBJ hObj ) +{ + int iResult = 0; + + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + int iCount = 0; + int iMaxStackSize = 0; + bool bStackable = false; + + if(pUserDataContainer->slot != NULL) + { + if ( pUserDataContainer->slot->hasItem() ) + { + bStackable = pUserDataContainer->slot->getItem()->isStackable(); + if ( bStackable ) + { + iCount = pUserDataContainer->slot->getItem()->GetCount(); + iMaxStackSize = min(pUserDataContainer->slot->getItem()->getMaxStackSize(), pUserDataContainer->slot->getMaxStackSize() ); + + iResult = iMaxStackSize - iCount; + + if(iResult < 0 ) iResult = 0; + } + } + } + + return iResult; +} + -- cgit v1.2.3