From 2d8d7795de974d9bf7c963f99e4dad3a204eadc1 Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Thu, 30 May 2013 10:10:58 +0000 Subject: [PATCH] Implemented right-click inventory painting git-svn-id: http://mc-server.googlecode.com/svn/trunk@1530 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/UI/Window.cpp | 102 +++++++++++++++++++++++++++---------------- source/UI/Window.h | 3 ++ 2 files changed, 67 insertions(+), 38 deletions(-) diff --git a/source/UI/Window.cpp b/source/UI/Window.cpp index 57a565a05..2b279a22c 100644 --- a/source/UI/Window.cpp +++ b/source/UI/Window.cpp @@ -482,45 +482,9 @@ void cWindow::OnLeftPaintEnd(cPlayer & a_Player) const cSlotNums & SlotNums = a_Player.GetInventoryPaintSlots(); cItem ToDistribute(a_Player.GetDraggingItem()); - - if ((size_t)(ToDistribute.m_ItemCount) < SlotNums.size()) - { - LOGWARNING("%s: Distributing less items (%d) than slots (%u)", __FUNCTION__, (int)ToDistribute.m_ItemCount, SlotNums.size()); - // This doesn't seem to happen with the 1.5.1 client, so we don't worry about it for now - } - - // Distribute to individual slots, keep track of how many items were actually distributed (full stacks etc.) - int NumDistributed = 0; int ToEachSlot = (int)ToDistribute.m_ItemCount / SlotNums.size(); - for (cSlotNums::const_iterator itr = SlotNums.begin(), end = SlotNums.end(); itr != end; ++itr) - { - int LocalSlotNum = 0; - cSlotArea * Area = GetSlotArea(*itr, LocalSlotNum); - if (Area == NULL) - { - LOGWARNING("%s: Bad SlotArea for slot %d", __FUNCTION__, *itr); - continue; - } - - // Modify the item at the slot - cItem AtSlot(*Area->GetSlot(LocalSlotNum, a_Player)); - int MaxStack = ItemHandler(AtSlot.m_ItemType)->GetMaxStackSize(); - if (AtSlot.IsEmpty()) - { - // Empty, just move all of it there: - cItem ToStore(ToDistribute); - ToStore.m_ItemCount = std::min(ToEachSlot, (int)MaxStack); - Area->SetSlot(LocalSlotNum, a_Player, ToStore); - NumDistributed += ToStore.m_ItemCount; - } - else - { - int CanStore = std::min(ToEachSlot, (int)MaxStack - AtSlot.m_ItemCount); - AtSlot.m_ItemCount += CanStore; - Area->SetSlot(LocalSlotNum, a_Player, AtSlot); - NumDistributed += CanStore; - } - } // for itr - SlotNums[] + + int NumDistributed = DistributeItemToSlots(a_Player, ToDistribute, ToEachSlot, SlotNums); // Remove the items distributed from the dragging item: a_Player.GetDraggingItem().m_ItemCount -= NumDistributed; @@ -540,6 +504,68 @@ void cWindow::OnRightPaintEnd(cPlayer & a_Player) { // Process the entire action stored in the internal structures for inventory painting // distribute one item into each slot + + const cSlotNums & SlotNums = a_Player.GetInventoryPaintSlots(); + cItem ToDistribute(a_Player.GetDraggingItem()); + + int NumDistributed = DistributeItemToSlots(a_Player, ToDistribute, 1, SlotNums); + + // Remove the items distributed from the dragging item: + a_Player.GetDraggingItem().m_ItemCount -= NumDistributed; + if (a_Player.GetDraggingItem().m_ItemCount == 0) + { + a_Player.GetDraggingItem().Empty(); + } + + SendWholeWindow(*a_Player.GetClientHandle()); +} + + + + + +int cWindow::DistributeItemToSlots(cPlayer & a_Player, const cItem & a_Item, int a_NumToEachSlot, const cSlotNums & a_SlotNums) +{ + if ((size_t)(a_Item.m_ItemCount) < a_SlotNums.size()) + { + LOGWARNING("%s: Distributing less items (%d) than slots (%u)", __FUNCTION__, (int)a_Item.m_ItemCount, a_SlotNums.size()); + // This doesn't seem to happen with the 1.5.1 client, so we don't worry about it for now + return 0; + } + + // Distribute to individual slots, keep track of how many items were actually distributed (full stacks etc.) + int NumDistributed = 0; + for (cSlotNums::const_iterator itr = a_SlotNums.begin(), end = a_SlotNums.end(); itr != end; ++itr) + { + int LocalSlotNum = 0; + cSlotArea * Area = GetSlotArea(*itr, LocalSlotNum); + if (Area == NULL) + { + LOGWARNING("%s: Bad SlotArea for slot %d", __FUNCTION__, *itr); + continue; + } + + // Modify the item at the slot + cItem AtSlot(*Area->GetSlot(LocalSlotNum, a_Player)); + int MaxStack = ItemHandler(AtSlot.m_ItemType)->GetMaxStackSize(); + if (AtSlot.IsEmpty()) + { + // Empty, just move all of it there: + cItem ToStore(a_Item); + ToStore.m_ItemCount = std::min(a_NumToEachSlot, (int)MaxStack); + Area->SetSlot(LocalSlotNum, a_Player, ToStore); + NumDistributed += ToStore.m_ItemCount; + } + else + { + // Occupied, add and cap at MaxStack: + int CanStore = std::min(a_NumToEachSlot, (int)MaxStack - AtSlot.m_ItemCount); + AtSlot.m_ItemCount += CanStore; + Area->SetSlot(LocalSlotNum, a_Player, AtSlot); + NumDistributed += CanStore; + } + } // for itr - SlotNums[] + return NumDistributed; } diff --git a/source/UI/Window.h b/source/UI/Window.h index ae06ecf6a..c31ed8a4d 100644 --- a/source/UI/Window.h +++ b/source/UI/Window.h @@ -170,6 +170,9 @@ protected: /// Processes the entire action stored in the internal structures for inventory painting; distributes one item into each slot void OnRightPaintEnd(cPlayer & a_Player); + + /// Distributes a_NumToEachSlot items into the slots specified in a_SlotNums; returns the total number of items distributed + int DistributeItemToSlots(cPlayer & a_Player, const cItem & a_Item, int a_NumToEachSlot, const cSlotNums & a_SlotNums); } ;