the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
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