summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormadmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2013-05-30 12:10:58 +0200
committermadmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2013-05-30 12:10:58 +0200
commit2d8d7795de974d9bf7c963f99e4dad3a204eadc1 (patch)
treed03ef9b7c04250239acad74981508b0c11a2001d
parentImplemented left-click inventory painting (diff)
downloadcuberite-2d8d7795de974d9bf7c963f99e4dad3a204eadc1.tar
cuberite-2d8d7795de974d9bf7c963f99e4dad3a204eadc1.tar.gz
cuberite-2d8d7795de974d9bf7c963f99e4dad3a204eadc1.tar.bz2
cuberite-2d8d7795de974d9bf7c963f99e4dad3a204eadc1.tar.lz
cuberite-2d8d7795de974d9bf7c963f99e4dad3a204eadc1.tar.xz
cuberite-2d8d7795de974d9bf7c963f99e4dad3a204eadc1.tar.zst
cuberite-2d8d7795de974d9bf7c963f99e4dad3a204eadc1.zip
-rw-r--r--source/UI/Window.cpp78
-rw-r--r--source/UI/Window.h3
2 files changed, 55 insertions, 26 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,17 +482,60 @@ void cWindow::OnLeftPaintEnd(cPlayer & a_Player)
const cSlotNums & SlotNums = a_Player.GetInventoryPaintSlots();
cItem ToDistribute(a_Player.GetDraggingItem());
+ int ToEachSlot = (int)ToDistribute.m_ItemCount / SlotNums.size();
+
+ int NumDistributed = DistributeItemToSlots(a_Player, ToDistribute, ToEachSlot, 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());
+}
+
+
+
+
+
+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();
+ }
- if ((size_t)(ToDistribute.m_ItemCount) < SlotNums.size())
+ 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)ToDistribute.m_ItemCount, 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;
- int ToEachSlot = (int)ToDistribute.m_ItemCount / SlotNums.size();
- for (cSlotNums::const_iterator itr = SlotNums.begin(), end = SlotNums.end(); itr != end; ++itr)
+ for (cSlotNums::const_iterator itr = a_SlotNums.begin(), end = a_SlotNums.end(); itr != end; ++itr)
{
int LocalSlotNum = 0;
cSlotArea * Area = GetSlotArea(*itr, LocalSlotNum);
@@ -508,38 +551,21 @@ void cWindow::OnLeftPaintEnd(cPlayer & a_Player)
if (AtSlot.IsEmpty())
{
// Empty, just move all of it there:
- cItem ToStore(ToDistribute);
- ToStore.m_ItemCount = std::min(ToEachSlot, (int)MaxStack);
+ cItem ToStore(a_Item);
+ ToStore.m_ItemCount = std::min(a_NumToEachSlot, (int)MaxStack);
Area->SetSlot(LocalSlotNum, a_Player, ToStore);
NumDistributed += ToStore.m_ItemCount;
}
else
{
- int CanStore = std::min(ToEachSlot, (int)MaxStack - AtSlot.m_ItemCount);
+ // 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[]
-
- // 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());
-}
-
-
-
-
-
-void cWindow::OnRightPaintEnd(cPlayer & a_Player)
-{
- // Process the entire action stored in the internal structures for inventory painting
- // distribute one item into each slot
+ 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);
} ;