the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 295 lines 8.8 kB view raw
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}