the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 392 lines 12 kB view raw
1#include "stdafx.h" 2 3#include "..\..\..\Minecraft.World\StringHelpers.h" 4#include "..\..\..\Minecraft.World\Slot.h" 5#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" 6#include "..\..\MultiPlayerLocalPlayer.h" 7#include "..\..\Minecraft.h" 8 9#include "XUI_Ctrl_SlotItemCtrlBase.h" 10 11HRESULT CXuiCtrlSlotItemCtrlBase::OnInit( HXUIOBJ hObj, XUIMessageInit* pInitData, BOOL& bHandled ) 12{ 13 HRESULT hr = S_OK; 14 SlotControlUserDataContainer* pvUserData = new SlotControlUserDataContainer(); 15 hr = XuiElementSetUserData(hObj, (void *)pvUserData ); 16 17 // 4J WESTY : Pointer Prototype : Added to support prototype only. 18 m_bSkipDefaultNavigation = false; 19 20 return hr; 21} 22 23HRESULT CXuiCtrlSlotItemCtrlBase::OnDestroy( HXUIOBJ hObj ) 24{ 25 HRESULT hr = S_OK; 26 void* pvUserData; 27 hr = XuiElementGetUserData( hObj, &pvUserData ); 28 29 if( pvUserData != NULL ) 30 { 31 delete pvUserData; 32 } 33 34 return hr; 35} 36 37HRESULT CXuiCtrlSlotItemCtrlBase::OnCustomMessage_GetSlotItem(HXUIOBJ hObj, CustomMessage_GetSlotItem_Struct *pData, BOOL& bHandled) 38{ 39 shared_ptr<ItemInstance> item = shared_ptr<ItemInstance>(); 40 41 void* pvUserData; 42 XuiElementGetUserData( hObj, &pvUserData ); 43 44 SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; 45 46 if( pUserDataContainer->slot != NULL ) 47 { 48 item = pUserDataContainer->slot->getItem(); 49 } 50 else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) 51 { 52 shared_ptr<Player> player = dynamic_pointer_cast<Player>( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); 53 if(player != NULL) item = player->inventory->getCarried(); 54 } 55 56 if( item != NULL ) 57 { 58 pData->item = item; 59 pData->iItemBitField = MAKE_SLOTDISPLAY_ITEM_BITMASK(item->id,item->getAuxValue(),item->isFoil()); 60 //int iAuxVal=item->getAuxValue(); 61 //int iCount = item->GetCount(); 62 // 8 bits - alpha 63 // 1 bit - decorations on 64 // 11 bits - auxval 65 // 6 bits - count 66 // 6 bits - scale 67 pData->iDataBitField = MAKE_SLOTDISPLAY_DATA_BITMASK(pUserDataContainer->m_iPad, (int)(31*pUserDataContainer->m_fAlpha),true,item->GetCount(),7,item->popTime); 68 } 69 else 70 { 71 //pGetSourceImageData->iData = 0; 72 pData->szPath = L""; 73 } 74 75 bHandled = TRUE; 76 77 return S_OK; 78} 79 80void CXuiCtrlSlotItemCtrlBase::SetSlot( HXUIOBJ hObj, Slot* slot ) 81{ 82 void* pvUserData; 83 XuiElementGetUserData( hObj, &pvUserData ); 84 85 SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; 86 87 pUserDataContainer->slot = slot; 88} 89 90void CXuiCtrlSlotItemCtrlBase::SetUserIndex( HXUIOBJ hObj, int iPad ) 91{ 92 void* pvUserData; 93 XuiElementGetUserData( hObj, &pvUserData ); 94 95 SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; 96 97 pUserDataContainer->m_iPad = iPad; 98} 99 100void CXuiCtrlSlotItemCtrlBase::SetAlpha( HXUIOBJ hObj, float fAlpha ) 101{ 102 void* pvUserData; 103 XuiElementGetUserData( hObj, &pvUserData ); 104 105 SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; 106 107 pUserDataContainer->m_fAlpha = fAlpha; 108} 109 110bool CXuiCtrlSlotItemCtrlBase::isEmpty( HXUIOBJ hObj ) 111{ 112 void* pvUserData; 113 XuiElementGetUserData( hObj, &pvUserData ); 114 SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; 115 116 if(pUserDataContainer->slot != NULL) 117 { 118 return !pUserDataContainer->slot->hasItem(); 119 } 120 else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) 121 { 122 shared_ptr<Player> player = dynamic_pointer_cast<Player>( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); 123 if(player != NULL) return player->inventory->getCarried() == NULL; 124 125 } 126 return true; 127} 128 129wstring CXuiCtrlSlotItemCtrlBase::GetItemDescription( HXUIOBJ hObj, vector<wstring> &unformattedStrings ) 130{ 131 void* pvUserData; 132 XuiElementGetUserData( hObj, &pvUserData ); 133 SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; 134 135 if(pUserDataContainer->slot != NULL) 136 { 137 wstring desc = L""; 138 vector<wstring> *strings = pUserDataContainer->slot->getItem()->getHoverText(Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad], false, unformattedStrings); 139 bool firstLine = true; 140 for(AUTO_VAR(it, strings->begin()); it != strings->end(); ++it) 141 { 142 wstring thisString = *it; 143 if(!firstLine) 144 { 145 desc.append( L"<br />" ); 146 } 147 else 148 { 149 firstLine = false; 150 wchar_t formatted[256]; 151 eMinecraftColour rarityColour = pUserDataContainer->slot->getItem()->getRarity()->color; 152 int colour = app.GetHTMLColour(rarityColour); 153 154 if(pUserDataContainer->slot->getItem()->hasCustomHoverName()) 155 { 156 colour = app.GetHTMLColour(eTextColor_RenamedItemTitle); 157 } 158 159 swprintf(formatted, 256, L"<font color=\"#%08x\">%s</font>",colour,thisString.c_str()); 160 thisString = formatted; 161 } 162 desc.append( thisString ); 163 } 164 strings->clear(); 165 delete strings; 166 return desc;//app.GetString( pUserDataContainer->slot->getItem()->getDescriptionId() ); 167 } 168 else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) 169 { 170 shared_ptr<Player> player = dynamic_pointer_cast<Player>( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); 171 if(player != NULL) 172 { 173 shared_ptr<ItemInstance> item = player->inventory->getCarried(); 174 if(item != NULL) return app.GetString( item->getDescriptionId() ); 175 } 176 177 } 178 return L""; 179} 180 181shared_ptr<ItemInstance> CXuiCtrlSlotItemCtrlBase::getItemInstance( HXUIOBJ hObj ) 182{ 183 void* pvUserData; 184 XuiElementGetUserData( hObj, &pvUserData ); 185 SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; 186 187 if(pUserDataContainer->slot != NULL) 188 { 189 return pUserDataContainer->slot->getItem(); 190 } 191 else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) 192 { 193 shared_ptr<Player> player = dynamic_pointer_cast<Player>( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); 194 if(player != NULL) return player->inventory->getCarried(); 195 196 } 197 return nullptr; 198} 199 200Slot *CXuiCtrlSlotItemCtrlBase::getSlot( HXUIOBJ hObj ) 201{ 202 void* pvUserData; 203 XuiElementGetUserData( hObj, &pvUserData ); 204 SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; 205 206 return pUserDataContainer->slot; 207} 208 209HRESULT CXuiCtrlSlotItemCtrlBase::OnKeyDown(HXUIOBJ hObj, XUIMessageInput *pInputData, BOOL& bHandled) 210{ 211 if( pInputData->dwKeyCode == VK_PAD_DPAD_LEFT || 212 pInputData->dwKeyCode == VK_PAD_DPAD_RIGHT || 213 pInputData->dwKeyCode == VK_PAD_DPAD_UP || 214 pInputData->dwKeyCode == VK_PAD_DPAD_DOWN || 215 pInputData->dwKeyCode == VK_PAD_LTRIGGER || 216 pInputData->dwKeyCode == VK_PAD_RTRIGGER) 217 { 218 HXUIOBJ parent; 219 HRESULT hr; 220 hr = XuiElementGetParent( hObj, &parent ); 221 222 XUIMessage message; 223 XUIMessageInput messageInput; 224 225 XuiMessageInput( &message, &messageInput, XUI_KEYDOWN, pInputData->dwKeyCode, pInputData->wch, pInputData->dwFlags, pInputData->UserIndex ); 226 227 if (HRESULT_SUCCEEDED(hr)) 228 { 229 hr = XuiBubbleMessage(parent, &message); 230 231 if (message.bHandled) 232 { 233 bHandled = TRUE; 234 } 235 } 236 } 237 238 return S_OK; 239} 240 241// 4J WESTY : Pointer Prototype : Added to support prototype only. 242HRESULT CXuiCtrlSlotItemCtrlBase::OnControlNavigate( HXUIOBJ hObj, XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) 243{ 244 // Skip default navigation behaviour when navigation is by pointer. 245 if ( m_bSkipDefaultNavigation ) 246 { 247 pControlNavigateData->bSkipNavigate = TRUE; 248 bHandled = TRUE; 249 } 250 return S_OK; 251} 252 253// 4J WESTY : Pointer Prototype : Added to support prototype only. 254int CXuiCtrlSlotItemCtrlBase::GetObjectCount( HXUIOBJ hObj ) 255{ 256 void* pvUserData; 257 XuiElementGetUserData( hObj, &pvUserData ); 258 SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; 259 260 int iCount = 0; 261 262 if(pUserDataContainer->slot != NULL) 263 { 264 if ( pUserDataContainer->slot->hasItem() ) 265 { 266 iCount = pUserDataContainer->slot->getItem()->GetCount(); 267 } 268 } 269 else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) 270 { 271 shared_ptr<Player> player = dynamic_pointer_cast<Player>( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); 272 if(player != NULL && player->inventory->getCarried() != NULL) 273 { 274 iCount = player->inventory->getCarried()->count; 275 } 276 277 } 278 return iCount; 279} 280 281 282// 4J WESTY : Pointer Prototype : Added to support prototype only. 283bool CXuiCtrlSlotItemCtrlBase::IsSameItemAs( HXUIOBJ hThisObj, HXUIOBJ hOtherObj ) 284{ 285 bool bThisItemExists = false; 286 int iThisID = 0; 287 int iThisAux = 0; 288 289 bool bOtherItemExists = false; 290 int iOtherID = 0; 291 int iOtherAux = 0; 292 293 bool bStackedByData = false; 294 295 // Get the info on this item. 296 void* pvThisUserData; 297 XuiElementGetUserData( hThisObj, &pvThisUserData ); 298 SlotControlUserDataContainer* pThisUserDataContainer = (SlotControlUserDataContainer*)pvThisUserData; 299 300 if(pThisUserDataContainer->slot != NULL) 301 { 302 if ( pThisUserDataContainer->slot->hasItem() ) 303 { 304 iThisID = pThisUserDataContainer->slot->getItem()->id; 305 iThisAux = pThisUserDataContainer->slot->getItem()->getAuxValue(); 306 bThisItemExists = true; 307 bStackedByData = pThisUserDataContainer->slot->getItem()->isStackedByData(); 308 } 309 } 310 else if(pThisUserDataContainer->m_iPad >= 0 && pThisUserDataContainer->m_iPad < XUSER_MAX_COUNT) 311 { 312 shared_ptr<Player> player = dynamic_pointer_cast<Player>( Minecraft::GetInstance()->localplayers[pThisUserDataContainer->m_iPad] ); 313 if(player != NULL && player->inventory->getCarried() != NULL) 314 { 315 iThisID = player->inventory->getCarried()->id; 316 iThisAux = player->inventory->getCarried()->getAuxValue(); 317 bThisItemExists = true; 318 bStackedByData = player->inventory->getCarried()->isStackedByData(); 319 } 320 321 } 322 323 // Get the info on other item. 324 void* pvOtherUserData; 325 XuiElementGetUserData( hOtherObj, &pvOtherUserData ); 326 SlotControlUserDataContainer* pOtherUserDataContainer = (SlotControlUserDataContainer*)pvOtherUserData; 327 328 if(pOtherUserDataContainer->slot != NULL) 329 { 330 if ( pOtherUserDataContainer->slot->hasItem() ) 331 { 332 iOtherID = pOtherUserDataContainer->slot->getItem()->id; 333 iOtherAux = pOtherUserDataContainer->slot->getItem()->getAuxValue(); 334 bOtherItemExists = true; 335 } 336 } 337 else if(pOtherUserDataContainer->m_iPad >= 0 && pOtherUserDataContainer->m_iPad < XUSER_MAX_COUNT) 338 { 339 shared_ptr<Player> player = dynamic_pointer_cast<Player>( Minecraft::GetInstance()->localplayers[pOtherUserDataContainer->m_iPad] ); 340 if(player != NULL && player->inventory->getCarried() != NULL) 341 { 342 iOtherID = player->inventory->getCarried()->id; 343 iOtherAux = player->inventory->getCarried()->getAuxValue(); 344 bOtherItemExists = true; 345 } 346 347 } 348 349 if ( bThisItemExists && bOtherItemExists ) 350 { 351 return ( ( iThisID == iOtherID ) && ( (bStackedByData && iThisAux == iOtherAux) || !bStackedByData ) ); 352 } 353 else 354 { 355 return false; 356 } 357} 358 359// 4J WESTY : Pointer Prototype : Added to support prototype only. 360// Returns number of items that can still be stacked into this slot. 361int CXuiCtrlSlotItemCtrlBase::GetEmptyStackSpace( HXUIOBJ hObj ) 362{ 363 int iResult = 0; 364 365 void* pvUserData; 366 XuiElementGetUserData( hObj, &pvUserData ); 367 SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; 368 369 int iCount = 0; 370 int iMaxStackSize = 0; 371 bool bStackable = false; 372 373 if(pUserDataContainer->slot != NULL) 374 { 375 if ( pUserDataContainer->slot->hasItem() ) 376 { 377 bStackable = pUserDataContainer->slot->getItem()->isStackable(); 378 if ( bStackable ) 379 { 380 iCount = pUserDataContainer->slot->getItem()->GetCount(); 381 iMaxStackSize = min(pUserDataContainer->slot->getItem()->getMaxStackSize(), pUserDataContainer->slot->getMaxStackSize() ); 382 383 iResult = iMaxStackSize - iCount; 384 385 if(iResult < 0 ) iResult = 0; 386 } 387 } 388 } 389 390 return iResult; 391} 392