aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp')
-rw-r--r--Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp307
1 files changed, 307 insertions, 0 deletions
diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp
new file mode 100644
index 00000000..a1bd8270
--- /dev/null
+++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp
@@ -0,0 +1,307 @@
+#include "stdafx.h"
+#include "UI.h"
+#include "UIScene_AbstractContainerMenu.h"
+
+#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h"
+#include "..\..\..\Minecraft.World\net.minecraft.world.item.h"
+#include "..\..\MultiplayerLocalPlayer.h"
+
+UIScene_AbstractContainerMenu::UIScene_AbstractContainerMenu(int iPad, UILayer *parentLayer) : UIScene(iPad, parentLayer)
+{
+ m_focusSection = eSectionNone;
+ // in this scene, we override the press sound with our own for crafting success or fail
+ ui.OverrideSFX(m_iPad,ACTION_MENU_A,true);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_OK,true);
+#ifdef __ORBIS__
+ ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,true);
+#endif
+ ui.OverrideSFX(m_iPad,ACTION_MENU_X,true);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_Y,true);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,true);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,true);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,true);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,true);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_UP,true);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,true);
+
+ m_bIgnoreInput=false;
+}
+
+UIScene_AbstractContainerMenu::~UIScene_AbstractContainerMenu()
+{
+ app.DebugPrintf("UIScene_AbstractContainerMenu::~UIScene_AbstractContainerMenu\n");
+}
+
+void UIScene_AbstractContainerMenu::handleDestroy()
+{
+ app.DebugPrintf("UIScene_AbstractContainerMenu::handleDestroy\n");
+ Minecraft *pMinecraft = Minecraft::GetInstance();
+ if( pMinecraft->localgameModes[m_iPad] != NULL )
+ {
+ TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad];
+ if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState);
+ }
+
+ // 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.
+ // 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)
+ if(pMinecraft->localplayers[m_iPad] != NULL) pMinecraft->localplayers[m_iPad]->closeContainer();
+
+ ui.OverrideSFX(m_iPad,ACTION_MENU_A,false);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_OK,false);
+#ifdef __ORBIS__
+ ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,false);
+#endif
+ ui.OverrideSFX(m_iPad,ACTION_MENU_X,false);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_Y,false);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,false);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,false);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,false);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,false);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_UP,false);
+ ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,false);
+}
+
+void UIScene_AbstractContainerMenu::InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex)
+{
+}
+
+void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex)
+{
+
+ m_labelInventory.init( app.GetString(IDS_INVENTORY) );
+
+ if(startIndex >= 0)
+ {
+ m_slotListInventory.addSlots(startIndex, 27);
+ m_slotListHotbar.addSlots(startIndex + 27, 9);
+ }
+
+ // Determine min and max extents for pointer, it needs to be able to move off the container to drop items.
+ float fPanelWidth, fPanelHeight;
+ float fPanelX, fPanelY;
+ float fPointerWidth, fPointerHeight;
+
+ // We may have varying depths of controls here, so base off the pointers parent
+#if TO_BE_IMPLEMENTED
+ HXUIOBJ parent;
+ XuiElementGetBounds( m_pointerControl->m_hObj, &fPointerWidth, &fPointerHeight );
+#else
+ fPointerWidth = 50;
+ fPointerHeight = 50;
+#endif
+
+ fPanelWidth = m_controlBackgroundPanel.getWidth();
+ fPanelHeight = m_controlBackgroundPanel.getHeight();
+ fPanelX = m_controlBackgroundPanel.getXPos();
+ fPanelY = m_controlBackgroundPanel.getYPos();
+ // Get size of pointer
+ m_fPointerImageOffsetX = 0; //floor(fPointerWidth/2.0f);
+ m_fPointerImageOffsetY = 0; //floor(fPointerHeight/2.0f);
+
+ m_fPanelMinX = fPanelX;
+ m_fPanelMaxX = fPanelX + fPanelWidth;
+ m_fPanelMinY = fPanelY;
+ m_fPanelMaxY = fPanelY + fPanelHeight;
+
+#ifdef __ORBIS__
+ // we need to map the touchpad rectangle to the UI rectangle. While it works great for the creative menu, it is much too sensitive for the smaller menus.
+ //X coordinate of the touch point (0 to 1919)
+ //Y coordinate of the touch point (0 to 941: DUALSHOCK®4 wireless controllers and the CUH-ZCT1J/CAP-ZCT1J/CAP-ZCT1U controllers for the PlayStation®4 development tool,
+ //0 to 753: JDX-1000x series controllers for the PlayStation®4 development tool,)
+ m_fTouchPadMulX=fPanelWidth/1919.0f;
+ m_fTouchPadMulY=fPanelHeight/941.0f;
+ m_fTouchPadDeadZoneX=15.0f*m_fTouchPadMulX;
+ m_fTouchPadDeadZoneY=15.0f*m_fTouchPadMulY;
+
+#endif
+
+ // 4J-PB - need to limit this in splitscreen
+ if(app.GetLocalPlayerCount()>1)
+ {
+ // don't let the pointer go into someone's screen
+ m_fPointerMinY = floor(fPointerHeight/2.0f);
+ }
+ else
+ {
+ m_fPointerMinY = fPanelY -fPointerHeight;
+ }
+ m_fPointerMinX = fPanelX - fPointerWidth;
+ m_fPointerMaxX = m_fPanelMaxX + fPointerWidth;
+ m_fPointerMaxY = m_fPanelMaxY + (fPointerHeight/2);
+
+// m_hPointerText=NULL;
+// m_hPointerTextBkg=NULL;
+
+ // Put the pointer over first item in use row to start with.
+ UIVec2D itemPos;
+ UIVec2D itemSize;
+ GetItemScreenData( m_eCurrSection, 0, &( itemPos ), &( itemSize ) );
+
+ UIVec2D sectionPos;
+ GetPositionOfSection( m_eCurrSection, &( sectionPos ) );
+
+ UIVec2D vPointerPos = sectionPos;
+ vPointerPos += itemPos;
+ vPointerPos.x += ( itemSize.x / 2.0f );
+ vPointerPos.y += ( itemSize.y / 2.0f );
+
+ vPointerPos.x -= m_fPointerImageOffsetX;
+ vPointerPos.y -= m_fPointerImageOffsetY;
+
+ //m_pointerControl->SetPosition( &vPointerPos );
+ m_pointerPos = vPointerPos;
+
+ IggyEvent mouseEvent;
+ S32 width, height;
+ m_parentLayer->getRenderDimensions(width, height);
+ S32 x = m_pointerPos.x*((float)width/m_movieWidth);
+ S32 y = m_pointerPos.y*((float)height/m_movieHeight);
+ IggyMakeEventMouseMove( &mouseEvent, x, y);
+
+ IggyEventResult result;
+ IggyPlayerDispatchEventRS ( getMovie() , &mouseEvent , &result );
+
+#ifdef USE_POINTER_ACCEL
+ m_fPointerVelX = 0.0f;
+ m_fPointerVelY = 0.0f;
+ m_fPointerAccelX = 0.0f;
+ m_fPointerAccelY = 0.0f;
+#endif
+}
+
+void UIScene_AbstractContainerMenu::tick()
+{
+ UIScene::tick();
+
+ onMouseTick();
+
+ IggyEvent mouseEvent;
+ S32 width, height;
+ m_parentLayer->getRenderDimensions(width, height);
+ S32 x = m_pointerPos.x*((float)width/m_movieWidth);
+ S32 y = m_pointerPos.y*((float)height/m_movieHeight);
+ IggyMakeEventMouseMove( &mouseEvent, x, y);
+
+ // 4J Stu - This seems to be broken on Durango, so do it ourself
+#ifdef _DURANGO
+ //mouseEvent.x = x;
+ //mouseEvent.y = y;
+#endif
+
+ IggyEventResult result;
+ IggyPlayerDispatchEventRS ( getMovie() , &mouseEvent , &result );
+}
+
+void UIScene_AbstractContainerMenu::render(S32 width, S32 height, C4JRender::eViewportType viewpBort)
+{
+ m_cacheSlotRenders = true;
+
+ m_needsCacheRendered = m_needsCacheRendered || m_menu->needsRendered();
+
+ if(m_needsCacheRendered)
+ {
+ m_expectedCachedSlotCount = 0;
+ unsigned int count = m_menu->getSize();
+ for(unsigned int i = 0; i < count; ++i)
+ {
+ if(m_menu->getSlot(i)->hasItem())
+ {
+ ++m_expectedCachedSlotCount;
+ }
+ }
+ }
+
+ UIScene::render(width, height, viewpBort);
+
+ m_needsCacheRendered = false;
+}
+
+void UIScene_AbstractContainerMenu::customDraw(IggyCustomDrawCallbackRegion *region)
+{
+ Minecraft *pMinecraft = Minecraft::GetInstance();
+ if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return;
+
+ shared_ptr<ItemInstance> item = nullptr;
+ if(wcscmp((wchar_t *)region->name,L"pointerIcon")==0)
+ {
+ m_cacheSlotRenders = false;
+ item = pMinecraft->localplayers[m_iPad]->inventory->getCarried();
+ }
+ else
+ {
+ int slotId = -1;
+ swscanf((wchar_t*)region->name,L"slot_%d",&slotId);
+ if (slotId == -1)
+ {
+ app.DebugPrintf("This is not the control we are looking for\n");
+ }
+ else
+ {
+ m_cacheSlotRenders = true;
+ Slot *slot = m_menu->getSlot(slotId);
+ item = slot->getItem();
+ }
+ }
+
+ if(item != NULL) customDrawSlotControl(region,m_iPad,item,1.0f,item->isFoil(),true);
+}
+
+void UIScene_AbstractContainerMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled)
+{
+ if(m_bIgnoreInput) return;
+
+ //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");
+ ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released);
+
+ if(pressed)
+ {
+ handled = handleKeyDown(m_iPad, key, repeat);
+ }
+}
+
+void UIScene_AbstractContainerMenu::SetPointerText(const wstring &description, vector<wstring> &unformattedStrings, bool newSlot)
+{
+ //app.DebugPrintf("Setting pointer text\n");
+ m_cursorPath.setLabel(description,false,newSlot);
+}
+
+void UIScene_AbstractContainerMenu::setSectionFocus(ESceneSection eSection, int iPad)
+{
+ if(m_focusSection != eSectionNone)
+ {
+ UIControl *currentFocus = getSection(m_focusSection);
+ if(currentFocus) currentFocus->setFocus(false);
+ }
+ UIControl *newFocus = getSection(eSection);
+ if(newFocus) newFocus->setFocus(true);
+ m_focusSection = eSection;
+}
+
+void UIScene_AbstractContainerMenu::setFocusToPointer(int iPad)
+{
+ if(m_focusSection != eSectionNone)
+ {
+ UIControl *currentFocus = getSection(m_focusSection);
+ if(currentFocus) currentFocus->setFocus(false);
+ }
+ m_focusSection = eSectionNone;
+}
+
+shared_ptr<ItemInstance> UIScene_AbstractContainerMenu::getSlotItem(ESceneSection eSection, int iSlot)
+{
+ Slot *slot = m_menu->getSlot( getSectionStartOffset(eSection) + iSlot );
+ if(slot) return slot->getItem();
+ else return nullptr;
+}
+
+bool UIScene_AbstractContainerMenu::isSlotEmpty(ESceneSection eSection, int iSlot)
+{
+ Slot *slot = m_menu->getSlot( getSectionStartOffset(eSection) + iSlot );
+ if(slot) return !slot->hasItem();
+ else return false;
+}
+
+void UIScene_AbstractContainerMenu::adjustPointerForSafeZone()
+{
+ // Handled by AS
+}