the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "UI.h"
3#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h"
4#include "..\..\..\Minecraft.World\net.minecraft.world.item.h"
5#include "..\..\..\Minecraft.World\net.minecraft.world.item.trading.h"
6#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h"
7#include "MultiPlayerLocalPlayer.h"
8#include "..\..\Minecraft.h"
9#include "UIScene_TradingMenu.h"
10
11UIScene_TradingMenu::UIScene_TradingMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer)
12{
13 // Setup all the Iggy references we need for this scene
14 initialiseMovie();
15
16 m_showingLeftArrow = true;
17 m_showingRightArrow = true;
18
19 // 4J-PB - "Villager" appears for a short time on opening the trading menu
20 //m_labelTrading.init( app.GetString(IDS_VILLAGER) );
21 m_labelTrading.init( L"" );
22 m_labelInventory.init( app.GetString(IDS_INVENTORY) );
23 m_labelRequired.init( app.GetString(IDS_REQUIRED_ITEMS_FOR_TRADE) );
24
25 m_labelRequest1.init(L"");
26 m_labelRequest2.init(L"");
27
28 TradingScreenInput *initData = (TradingScreenInput *)_initData;
29 m_merchant = initData->trader;
30
31 Minecraft *pMinecraft = Minecraft::GetInstance();
32 if( pMinecraft->localgameModes[iPad] != NULL )
33 {
34 TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[iPad];
35 m_previousTutorialState = gameMode->getTutorial()->getCurrentState();
36 gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Trading_Menu, this);
37 }
38
39 m_menu = new MerchantMenu( initData->inventory, initData->trader, initData->level );
40
41 Minecraft::GetInstance()->localplayers[iPad]->containerMenu = m_menu;
42
43 m_slotListRequest1.addSlots(BUY_A,1);
44 m_slotListRequest2.addSlots(BUY_B,1);
45
46 m_slotListTrades.addSlots(TRADES_START,DISPLAY_TRADES_COUNT);
47
48 m_slotListInventory.addSlots(MerchantMenu::INV_SLOT_START, 27);
49 m_slotListHotbar.addSlots(MerchantMenu::USE_ROW_SLOT_START, 9);
50
51 if(initData) delete initData;
52
53 // in this scene, we override the press sound with our own for crafting success or fail
54 ui.OverrideSFX(m_iPad,ACTION_MENU_A,true);
55 ui.OverrideSFX(m_iPad,ACTION_MENU_OK,true);
56#ifdef __ORBIS__
57 ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,true);
58#endif
59 ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,true);
60 ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,true);
61 ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,true);
62 ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,true);
63 ui.OverrideSFX(m_iPad,ACTION_MENU_UP,true);
64 ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,true);
65
66 app.SetRichPresenceContext(iPad, CONTEXT_GAME_STATE_TRADING);
67}
68
69wstring UIScene_TradingMenu::getMoviePath()
70{
71 if(app.GetLocalPlayerCount() > 1)
72 {
73 return L"TradingMenuSplit";
74 }
75 else
76 {
77 return L"TradingMenu";
78 }
79}
80
81void UIScene_TradingMenu::updateTooltips()
82{
83 ui.SetTooltips(m_iPad, IDS_TOOLTIPS_TRADE, IDS_TOOLTIPS_BACK);
84}
85
86void UIScene_TradingMenu::handleDestroy()
87{
88 app.DebugPrintf("UIScene_TradingMenu::handleDestroy\n");
89 Minecraft *pMinecraft = Minecraft::GetInstance();
90 if( pMinecraft->localgameModes[m_iPad] != NULL )
91 {
92 TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad];
93 if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState);
94 }
95
96 // 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.
97 // 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)
98 if(pMinecraft->localplayers[m_iPad] != NULL) pMinecraft->localplayers[m_iPad]->closeContainer();
99
100 ui.OverrideSFX(m_iPad,ACTION_MENU_A,false);
101 ui.OverrideSFX(m_iPad,ACTION_MENU_OK,false);
102#ifdef __ORBIS__
103 ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,false);
104#endif
105 ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,false);
106 ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,false);
107 ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,false);
108 ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,false);
109 ui.OverrideSFX(m_iPad,ACTION_MENU_UP,false);
110 ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,false);
111}
112
113void UIScene_TradingMenu::handleReload()
114{
115 m_slotListRequest1.addSlots(BUY_A,1);
116 m_slotListRequest2.addSlots(BUY_B,1);
117
118 m_slotListTrades.addSlots(TRADES_START,DISPLAY_TRADES_COUNT);
119
120 m_slotListInventory.addSlots(MerchantMenu::INV_SLOT_START, 27);
121 m_slotListHotbar.addSlots(MerchantMenu::USE_ROW_SLOT_START, 9);
122
123 updateDisplay();
124
125 IggyDataValue result;
126 IggyDataValue value[1];
127
128 value[0].type = IGGY_DATATYPE_number;
129 value[0].number = m_selectedSlot;
130 IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetActiveSlot , 1 , value );
131}
132
133void UIScene_TradingMenu::tick()
134{
135 UIScene::tick();
136 handleTick();
137}
138
139void UIScene_TradingMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled)
140{
141 //app.DebugPrintf("UIScene_InventoryMenu handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE");
142 ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released);
143
144 switch(key)
145 {
146 default:
147 if(pressed)
148 {
149 handled = handleKeyDown(m_iPad, key, repeat);
150 }
151 break;
152 };
153}
154
155void UIScene_TradingMenu::customDraw(IggyCustomDrawCallbackRegion *region)
156{
157 Minecraft *pMinecraft = Minecraft::GetInstance();
158 if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return;
159
160 shared_ptr<ItemInstance> item = nullptr;
161 int slotId = -1;
162 swscanf((wchar_t*)region->name,L"slot_%d",&slotId);
163
164 if(slotId < MerchantMenu::USE_ROW_SLOT_END)
165 {
166 Slot *slot = m_menu->getSlot(slotId);
167 item = slot->getItem();
168 }
169 else if(slotId >= TRADES_START)
170 {
171 int tradeId = (slotId - TRADES_START) + m_offersStartIndex;
172 if(tradeId < m_activeOffers.size())
173 {
174 item = m_activeOffers.at(tradeId).first->getSellItem();
175 }
176 }
177 else
178 {
179 int tradeId = m_selectedSlot + m_offersStartIndex;
180 if( tradeId < m_activeOffers.size() )
181 {
182 switch(slotId)
183 {
184 case BUY_A:
185 item = m_activeOffers.at(tradeId).first->getBuyAItem();
186 break;
187 case BUY_B:
188 item = m_activeOffers.at(tradeId).first->getBuyBItem();
189 break;
190 };
191 }
192 }
193 if(item != NULL) customDrawSlotControl(region,m_iPad,item,1.0f,item->isFoil(),true);
194}
195
196void UIScene_TradingMenu::showScrollRightArrow(bool show)
197{
198 if(m_showingRightArrow != show)
199 {
200 IggyDataValue result;
201 IggyDataValue value[1];
202
203 value[0].type = IGGY_DATATYPE_boolean;
204 value[0].boolval = show;
205 IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowScrollRightArrow , 1 , value );
206
207 m_showingRightArrow = show;
208 }
209}
210
211void UIScene_TradingMenu::showScrollLeftArrow(bool show)
212{
213 if(m_showingLeftArrow != show)
214 {
215 IggyDataValue result;
216 IggyDataValue value[1];
217
218 value[0].type = IGGY_DATATYPE_boolean;
219 value[0].boolval = show;
220 IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowScrollLeftArrow , 1 , value );
221
222 m_showingLeftArrow = show;
223 }
224}
225
226void UIScene_TradingMenu::moveSelector(bool right)
227{
228 IggyDataValue result;
229 IggyDataValue value[1];
230
231 value[0].type = IGGY_DATATYPE_boolean;
232 value[0].boolval = right;
233 IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcMoveSelector , 1 , value );
234}
235
236void UIScene_TradingMenu::setTitle(const wstring &name)
237{
238 m_labelTrading.setLabel(name);
239}
240
241void UIScene_TradingMenu::setRequest1Name(const wstring &name)
242{
243 m_labelRequest1.setLabel(name);
244}
245
246void UIScene_TradingMenu::setRequest2Name(const wstring &name)
247{
248 m_labelRequest2.setLabel(name);
249}
250
251void UIScene_TradingMenu::setRequest1RedBox(bool show)
252{
253 m_slotListRequest1.showSlotRedBox(0,show);
254}
255
256void UIScene_TradingMenu::setRequest2RedBox(bool show)
257{
258 m_slotListRequest2.showSlotRedBox(0,show);
259}
260
261void UIScene_TradingMenu::setTradeRedBox(int index, bool show)
262{
263 m_slotListTrades.showSlotRedBox(index,show);
264}
265
266void UIScene_TradingMenu::setOfferDescription(vector<HtmlString> *description)
267{
268 wstring descriptionStr = HtmlString::Compose(description);
269
270 IggyDataValue result;
271 IggyDataValue value[1];
272
273 IggyStringUTF16 stringVal;
274 stringVal.string = (IggyUTF16*)descriptionStr.c_str();
275 stringVal.length = descriptionStr.length();
276 value[0].type = IGGY_DATATYPE_string_UTF16;
277 value[0].string16 = stringVal;
278
279 IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetOfferDescription , 1 , value );
280}
281
282void UIScene_TradingMenu::HandleMessage(EUIMessage message, void *data)
283{
284 switch(message)
285 {
286 case eUIMessage_InventoryUpdated:
287 handleInventoryUpdated(data);
288 break;
289 };
290}
291
292void UIScene_TradingMenu::handleInventoryUpdated(LPVOID data)
293{
294 HandleInventoryUpdated();
295}