Implemented right-click inventory painting
git-svn-id: http://mc-server.googlecode.com/svn/trunk@1530 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
191479cd81
commit
2d8d7795de
@ -482,45 +482,9 @@ void cWindow::OnLeftPaintEnd(cPlayer & a_Player)
|
|||||||
|
|
||||||
const cSlotNums & SlotNums = a_Player.GetInventoryPaintSlots();
|
const cSlotNums & SlotNums = a_Player.GetInventoryPaintSlots();
|
||||||
cItem ToDistribute(a_Player.GetDraggingItem());
|
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();
|
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
|
int NumDistributed = DistributeItemToSlots(a_Player, ToDistribute, ToEachSlot, SlotNums);
|
||||||
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[]
|
|
||||||
|
|
||||||
// Remove the items distributed from the dragging item:
|
// Remove the items distributed from the dragging item:
|
||||||
a_Player.GetDraggingItem().m_ItemCount -= NumDistributed;
|
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
|
// Process the entire action stored in the internal structures for inventory painting
|
||||||
// distribute one item into each slot
|
// 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -170,6 +170,9 @@ protected:
|
|||||||
|
|
||||||
/// Processes the entire action stored in the internal structures for inventory painting; distributes one item into each slot
|
/// Processes the entire action stored in the internal structures for inventory painting; distributes one item into each slot
|
||||||
void OnRightPaintEnd(cPlayer & a_Player);
|
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);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user