diff options
author | madmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6> | 2012-08-14 16:18:24 +0200 |
---|---|---|
committer | madmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6> | 2012-08-14 16:18:24 +0200 |
commit | 8f79074c421fb69c29511acd829e777c4ceba706 (patch) | |
tree | 866c2527af4cfe0af7482a21e6f2a45f6c820078 /source/cCraftingWindow.cpp | |
parent | Shift-clicking the crafting grid in curvival inventory tries placing things in inventory first, then the hotbar. (diff) | |
download | cuberite-8f79074c421fb69c29511acd829e777c4ceba706.tar cuberite-8f79074c421fb69c29511acd829e777c4ceba706.tar.gz cuberite-8f79074c421fb69c29511acd829e777c4ceba706.tar.bz2 cuberite-8f79074c421fb69c29511acd829e777c4ceba706.tar.lz cuberite-8f79074c421fb69c29511acd829e777c4ceba706.tar.xz cuberite-8f79074c421fb69c29511acd829e777c4ceba706.tar.zst cuberite-8f79074c421fb69c29511acd829e777c4ceba706.zip |
Diffstat (limited to 'source/cCraftingWindow.cpp')
-rw-r--r-- | source/cCraftingWindow.cpp | 79 |
1 files changed, 78 insertions, 1 deletions
diff --git a/source/cCraftingWindow.cpp b/source/cCraftingWindow.cpp index 03102123b..a41eede70 100644 --- a/source/cCraftingWindow.cpp +++ b/source/cCraftingWindow.cpp @@ -32,8 +32,19 @@ cCraftingWindow::cCraftingWindow( cWindowOwner* a_Owner, bool a_bInventoryVisibl void cCraftingWindow::Clicked( cPacket_WindowClick* a_ClickPacket, cPlayer & a_Player ) { bool bDontCook = false; + + cItem * DraggingItem = GetDraggingItem(&a_Player); + if ( + a_ClickPacket->m_IsShiftPressed && + ((DraggingItem == NULL) || DraggingItem->IsEmpty()) + ) + { + ShiftClicked(a_ClickPacket, a_Player); + return; + } + // Override for craft result slot - if( a_ClickPacket->m_SlotNum == 0 ) + if (a_ClickPacket->m_SlotNum == 0) { LOG("In craft slot: %i x %i !!", GetSlot(0)->m_ItemID, GetSlot(0)->m_ItemCount ); cItem* DraggingItem = GetDraggingItem( &a_Player ); @@ -126,3 +137,69 @@ void cCraftingWindow::Close(cPlayer & a_Player) + +void cCraftingWindow::ShiftClicked(cPacket_WindowClick * a_ClickPacket, cPlayer & a_Player) +{ + short Slot = a_ClickPacket->m_SlotNum; + if (Slot == SLOT_CRAFTING_RESULT) + { + ShiftClickedCraftingResult(Slot, a_Player); + } + else if ((Slot >= SLOT_CRAFTING_MIN) && (Slot <= SLOT_CRAFTING_MAX)) + { + ShiftClickedCraftingGrid(Slot, a_Player); + } + else + { + // No need to handle inventory shift-click, it is handled by the underlying cSurvivalInventory, surprise surprise ;) + } + SendWholeWindow(a_Player.GetClientHandle()); +} + + + + + +void cCraftingWindow::ShiftClickedCraftingResult(short a_Slot, cPlayer & a_Player) +{ + // TODO +} + + + + + +void cCraftingWindow::ShiftClickedCraftingGrid(short a_Slot, cPlayer & a_Player) +{ + enum + { + SLOT_INVENTORY_MIN = 9, + SLOT_INVENTORY_MAX = 35, + SLOT_HOTBAR_MIN = 36, + SLOT_HOTBAR_MAX = 44 + } ; + + cInventory & Inventory = a_Player.GetInventory(); + cItem * Item = GetSlot(a_Slot); + if ((Item == NULL) || Item->IsEmpty()) + { + return; + } + + // First try the main inventory: + Item->m_ItemCount -= Inventory.MoveItem(Item->m_ItemID, Item->m_ItemHealth, Item->m_ItemCount, SLOT_INVENTORY_MIN, SLOT_INVENTORY_MAX); + + // If anything left, try the hotbar: + if (Item->m_ItemCount > 0) + { + Item->m_ItemCount -= Inventory.MoveItem(Item->m_ItemID, Item->m_ItemHealth, Item->m_ItemCount, SLOT_HOTBAR_MIN, SLOT_HOTBAR_MAX); + } + if (Item->m_ItemCount == 0) + { + Item->Empty(); + } +} + + + + |