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\net.minecraft.world.inventory.h"
4#include "..\..\..\Minecraft.World\net.minecraft.stats.h"
5#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h"
6#include "..\..\MultiplayerLocalPlayer.h"
7#include "..\..\Common\Tutorial\Tutorial.h"
8#include "..\..\Common\Tutorial\TutorialMode.h"
9#include "..\..\Common\Tutorial\TutorialEnum.h"
10#include "..\..\Minecraft.h"
11#include "XUI_Controls.h"
12#include "XUI_Scene_Inventory.h"
13
14
15//--------------------------------------------------------------------------------------
16// Name: CXuiSceneInventory::OnInit
17// Desc: Message handler for XM_INIT
18//--------------------------------------------------------------------------------------
19HRESULT CXuiSceneInventory::OnInit( XUIMessageInit *pInitData, BOOL &bHandled )
20{
21 D3DXVECTOR3 vec;
22 MapChildControls();
23
24 Minecraft *pMinecraft = Minecraft::GetInstance();
25
26 InventoryScreenInput *initData = (InventoryScreenInput *)pInitData->pvInitData;
27 m_iPad=initData->iPad;
28 m_bSplitscreen=initData->bSplitscreen;
29
30 // if we are in splitscreen, then we need to figure out if we want to move this scene
31
32 if(m_bSplitscreen)
33 {
34 if(m_bSplitscreen)
35 {
36 app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad);
37 }
38 }
39
40#ifdef _XBOX
41 if( pMinecraft->localgameModes[initData->iPad] != NULL )
42 {
43 TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad];
44 m_previousTutorialState = gameMode->getTutorial()->getCurrentState();
45 gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Inventory_Menu, this);
46 }
47#endif
48
49 InventoryMenu *menu = dynamic_cast<InventoryMenu *>( initData->player->inventoryMenu );
50
51#if 0
52 // TODO Inventory dimensions need defined as constants
53 m_armorGroup->SetData( initData->iPad, menu, 4, 1, InventoryMenu::ARMOR_SLOT_START );
54#endif
55 InitDataAssociations(initData->iPad, menu);
56
57 initData->player->awardStat(GenericStats::openInventory(), GenericStats::param_noArgs());
58
59 CXuiSceneAbstractContainer::Initialize( initData->iPad, menu, false, InventoryMenu::INV_SLOT_START, eSectionInventoryUsing, eSectionInventoryMax, initData->bNavigateBack );
60
61 delete initData;
62
63 float fWidth;
64 m_effectsGroup.GetBounds(&fWidth, &m_effectAreaHeight); // Get total height available for effects display
65 m_hEffectDisplayA[0]->GetBounds(&fWidth, &m_effectDisplayHeight); // Get height of one effect
66
67 D3DXVECTOR3 firstEffectPos, secondEffectPos;
68 m_hEffectDisplayA[0]->GetPosition(&firstEffectPos);
69 m_hEffectDisplayA[1]->GetPosition(&secondEffectPos);
70 m_effectDisplaySpacing = firstEffectPos.y - secondEffectPos.y; // Stack from the bottom
71
72 updateEffectsDisplay();
73 XuiSetTimer(m_hObj,INVENTORY_UPDATE_EFFECTS_TIMER_ID,INVENTORY_UPDATE_EFFECTS_TIMER_TIME);
74
75 return S_OK;
76}
77
78HRESULT CXuiSceneInventory::OnDestroy()
79{
80 Minecraft *pMinecraft = Minecraft::GetInstance();
81
82 if( pMinecraft->localgameModes[m_iPad] != NULL )
83 {
84 TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad];
85 if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState);
86 }
87
88 // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss.
89 // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying)
90 if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer();
91 return S_OK;
92}
93
94HRESULT CXuiSceneInventory::handleCustomTimer( XUIMessageTimer *pTimer, BOOL& bHandled )
95{
96 if(pTimer->nId == INVENTORY_UPDATE_EFFECTS_TIMER_ID)
97 {
98 updateEffectsDisplay();
99 bHandled = TRUE;
100 }
101 return S_OK;
102}
103
104CXuiControl* CXuiSceneInventory::GetSectionControl( ESceneSection eSection )
105{
106 switch( eSection )
107 {
108 case eSectionInventoryArmor:
109 return (CXuiControl *)m_armorGroup;
110 break;
111 case eSectionInventoryInventory:
112 return (CXuiControl *)m_inventoryControl;
113 break;
114 case eSectionInventoryUsing:
115 return (CXuiControl *)m_useRowControl;
116 break;
117 default:
118 assert( false );
119 break;
120 }
121 return NULL;
122}
123
124CXuiCtrlSlotList* CXuiSceneInventory::GetSectionSlotList( ESceneSection eSection )
125{
126 switch( eSection )
127 {
128 case eSectionInventoryArmor:
129 return m_armorGroup;
130 break;
131 case eSectionInventoryInventory:
132 return m_inventoryControl;
133 break;
134 case eSectionInventoryUsing:
135 return m_useRowControl;
136 break;
137 default:
138 assert( false );
139 break;
140 }
141 return NULL;
142}
143
144// 4J Stu - Added to support auto-save. Need to re-associate on a navigate back
145void CXuiSceneInventory::InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex /*= 0*/)
146{
147 // TODO Inventory dimensions need defined as constants
148 m_armorGroup->SetData( iPad, menu, 4, 1, InventoryMenu::ARMOR_SLOT_START );
149
150 CXuiSceneAbstractContainer::InitDataAssociations(iPad, menu, InventoryMenu::INV_SLOT_START);
151}
152
153void CXuiSceneInventory::updateEffectsDisplay()
154{
155 // Update with the current effects
156 Minecraft *pMinecraft = Minecraft::GetInstance();
157 shared_ptr<LocalPlayer> player = pMinecraft->localplayers[m_iPad];
158
159 if(player == NULL) return;
160
161 vector<MobEffectInstance *> *activeEffects = player->getActiveEffects();
162
163 // Work out how to arrange the effects
164 int effectCount = (int)activeEffects->size();
165
166 // Total size of all effects + spacing, minus spacing for the last effect
167 float fHeight = (effectCount * m_effectDisplaySpacing) - (m_effectDisplaySpacing - m_effectDisplayHeight);
168 float fNextEffectYOffset = m_effectDisplaySpacing;
169
170 if(fHeight > m_effectAreaHeight)
171 {
172 fNextEffectYOffset = (m_effectAreaHeight + 1) / effectCount;
173 fNextEffectYOffset = floor(fNextEffectYOffset);
174 }
175
176 // Fill out details for display
177 D3DXVECTOR3 position;
178 m_hEffectDisplayA[0]->GetPosition(&position);
179 AUTO_VAR(it, activeEffects->begin());
180 for(unsigned int i = 0; i < MAX_EFFECTS; ++i)
181 {
182 if(it != activeEffects->end())
183 {
184 m_hEffectDisplayA[i]->SetShow(TRUE);
185
186 if(i > 0) position.y -= fNextEffectYOffset; // Stack from the bottom
187 m_hEffectDisplayA[i]->SetPosition(&position);
188
189 MobEffectInstance *effect = *it;
190
191 MobEffect *mobEffect = MobEffect::effects[effect->getId()];
192 if (mobEffect->hasIcon())
193 {
194 m_hEffectDisplayA[i]->setIcon(mobEffect->getIcon());
195 }
196
197 wstring effectString = app.GetString( effect->getDescriptionId() );//I18n.get(effect.getDescriptionId()).trim();
198 if (effect->getAmplifier() > 0)
199 {
200 wstring potencyString = L"";
201 switch(effect->getAmplifier())
202 {
203 case 1:
204 potencyString = L" ";
205 potencyString += app.GetString( IDS_POTION_POTENCY_1 );
206 break;
207 case 2:
208 potencyString = L" ";
209 potencyString += app.GetString( IDS_POTION_POTENCY_2 );
210 break;
211 case 3:
212 potencyString = L" ";
213 potencyString += app.GetString( IDS_POTION_POTENCY_3 );
214 break;
215 default:
216 potencyString = app.GetString( IDS_POTION_POTENCY_0 );
217 break;
218 }
219 effectString += potencyString;
220 }
221 m_hEffectDisplayA[i]->setName(effectString);
222
223 wstring durationString = MobEffect::formatDuration(effect);
224 m_hEffectDisplayA[i]->setDuration(durationString);
225
226 ++it;
227 }
228 else
229 {
230 m_hEffectDisplayA[i]->SetShow(FALSE);
231 }
232 }
233 delete activeEffects;
234}