Merge pull request #1157 from Howaner/Window

Add more inventory actions.
master
Mattes D 2014-07-09 23:27:02 +02:00
commit ea24a4f4aa
3 changed files with 237 additions and 41 deletions

View File

@ -60,12 +60,35 @@ void cSlotArea::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickA
ShiftClicked(a_Player, a_SlotNum, a_ClickedItem); ShiftClicked(a_Player, a_SlotNum, a_ClickedItem);
return; return;
} }
case caDblClick: case caDblClick:
{ {
DblClicked(a_Player, a_SlotNum); DblClicked(a_Player, a_SlotNum);
return; return;
} }
case caMiddleClick:
{
MiddleClicked(a_Player, a_SlotNum);
return;
}
case caDropKey:
case caCtrlDropKey:
{
DropClicked(a_Player, a_SlotNum, (a_ClickAction == caCtrlDropKey));
return;
}
case caNumber1:
case caNumber2:
case caNumber3:
case caNumber4:
case caNumber5:
case caNumber6:
case caNumber7:
case caNumber8:
case caNumber9:
{
NumberClicked(a_Player, a_SlotNum, a_ClickAction);
return;
}
default: default:
{ {
break; break;
@ -226,6 +249,77 @@ void cSlotArea::DblClicked(cPlayer & a_Player, int a_SlotNum)
void cSlotArea::MiddleClicked(cPlayer & a_Player, int a_SlotNum)
{
cItem Slot(*GetSlot(a_SlotNum, a_Player));
cItem & DraggingItem = a_Player.GetDraggingItem();
if (!a_Player.IsGameModeCreative() || Slot.IsEmpty() || !DraggingItem.IsEmpty())
{
return;
}
DraggingItem = Slot;
DraggingItem.m_ItemCount = DraggingItem.GetMaxStackSize();
}
void cSlotArea::DropClicked(cPlayer & a_Player, int a_SlotNum, bool a_DropStack)
{
cItem Slot(*GetSlot(a_SlotNum, a_Player));
if (Slot.IsEmpty())
{
return;
}
cItem ItemToDrop = Slot.CopyOne();
if (a_DropStack)
{
ItemToDrop.m_ItemCount = Slot.m_ItemCount;
}
Slot.m_ItemCount -= ItemToDrop.m_ItemCount;
if (Slot.m_ItemCount <= 0)
{
Slot.Empty();
}
SetSlot(a_SlotNum, a_Player, Slot);
a_Player.TossPickup(ItemToDrop);
}
void cSlotArea::NumberClicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction)
{
if ((a_ClickAction < caNumber1) || (a_ClickAction > caNumber9))
{
return;
}
int HotbarSlot = (int)a_ClickAction - (int)caNumber1;
cItem ItemInHotbar(a_Player.GetInventory().GetHotbarSlot(HotbarSlot));
cItem ItemInSlot(*GetSlot(a_SlotNum, a_Player));
// The items are equal. Do nothing.
if (ItemInHotbar.IsEqual(ItemInSlot))
{
return;
}
a_Player.GetInventory().SetHotbarSlot(HotbarSlot, ItemInSlot);
SetSlot(a_SlotNum, a_Player, ItemInHotbar);
}
void cSlotArea::OnPlayerAdded(cPlayer & a_Player) void cSlotArea::OnPlayerAdded(cPlayer & a_Player)
{ {
UNUSED(a_Player); UNUSED(a_Player);
@ -410,6 +504,12 @@ cSlotAreaCrafting::cSlotAreaCrafting(int a_GridSize, cWindow & a_ParentWindow) :
void cSlotAreaCrafting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) void cSlotAreaCrafting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem)
{ {
if (a_ClickAction == caMiddleClick)
{
MiddleClicked(a_Player, a_SlotNum);
return;
}
// Override for craft result slot // Override for craft result slot
if (a_SlotNum == 0) if (a_SlotNum == 0)
{ {
@ -417,12 +517,17 @@ void cSlotAreaCrafting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction
{ {
ShiftClickedResult(a_Player); ShiftClickedResult(a_Player);
} }
else if ((a_ClickAction == caDropKey) || (a_ClickAction == caCtrlDropKey))
{
DropClickedResult(a_Player);
}
else else
{ {
ClickedResult(a_Player); ClickedResult(a_Player);
} }
return; return;
} }
super::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem); super::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem);
UpdateRecipe(a_Player); UpdateRecipe(a_Player);
} }
@ -582,6 +687,27 @@ void cSlotAreaCrafting::ShiftClickedResult(cPlayer & a_Player)
void cSlotAreaCrafting::DropClickedResult(cPlayer & a_Player)
{
// Get the current recipe:
cCraftingRecipe & Recipe = GetRecipeForPlayer(a_Player);
const cItem & Result = Recipe.GetResult();
cItem * PlayerSlots = GetPlayerSlots(a_Player) + 1;
cCraftingGrid Grid(PlayerSlots, m_GridSize, m_GridSize);
a_Player.TossPickup(Result);
Recipe.ConsumeIngredients(Grid);
Grid.CopyToItems(PlayerSlots);
HandleCraftItem(Result, a_Player);
UpdateRecipe(a_Player);
}
void cSlotAreaCrafting::UpdateRecipe(cPlayer & a_Player) void cSlotAreaCrafting::UpdateRecipe(cPlayer & a_Player)
{ {
cCraftingGrid Grid(GetPlayerSlots(a_Player) + 1, m_GridSize, m_GridSize); cCraftingGrid Grid(GetPlayerSlots(a_Player) + 1, m_GridSize, m_GridSize);
@ -669,15 +795,37 @@ void cSlotAreaAnvil::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_C
return; return;
} }
if (a_ClickAction == caDblClick) switch (a_ClickAction)
{ {
return; case caDblClick:
} {
return;
if ((a_ClickAction == caShiftLeftClick) || (a_ClickAction == caShiftRightClick)) }
{ case caShiftLeftClick:
ShiftClicked(a_Player, a_SlotNum, a_ClickedItem); case caShiftRightClick:
return; {
ShiftClicked(a_Player, a_SlotNum, a_ClickedItem);
return;
}
case caMiddleClick:
{
MiddleClicked(a_Player, a_SlotNum);
return;
}
case caDropKey:
case caCtrlDropKey:
{
if (CanTakeResultItem(a_Player))
{
DropClicked(a_Player, a_SlotNum, true);
OnTakeResult(a_Player);
}
return;
}
default:
{
break;
}
} }
cItem Slot(*GetSlot(a_SlotNum, a_Player)); cItem Slot(*GetSlot(a_SlotNum, a_Player));
@ -1075,12 +1223,16 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio
ShiftClicked(a_Player, a_SlotNum, a_ClickedItem); ShiftClicked(a_Player, a_SlotNum, a_ClickedItem);
return; return;
} }
case caDblClick: case caDblClick:
{ {
DblClicked(a_Player, a_SlotNum); DblClicked(a_Player, a_SlotNum);
return; return;
} }
case caMiddleClick:
{
MiddleClicked(a_Player, a_SlotNum);
return;
}
default: default:
{ {
break; break;
@ -1425,11 +1577,32 @@ void cSlotAreaFurnace::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a
bAsync = true; bAsync = true;
} }
if ((a_ClickAction == caShiftLeftClick) || (a_ClickAction == caShiftRightClick)) switch (a_ClickAction)
{ {
HandleSmeltItem(Slot, a_Player); case caShiftLeftClick:
ShiftClicked(a_Player, a_SlotNum, Slot); case caShiftRightClick:
return; {
HandleSmeltItem(Slot, a_Player);
ShiftClicked(a_Player, a_SlotNum, Slot);
return;
}
case caMiddleClick:
{
MiddleClicked(a_Player, a_SlotNum);
return;
}
case caDropKey:
case caCtrlDropKey:
{
DropClicked(a_Player, a_SlotNum, (a_SlotNum == caCtrlDropKey));
Slot.m_ItemCount = Slot.m_ItemCount - GetSlot(a_SlotNum, a_Player)->m_ItemCount;
HandleSmeltItem(Slot, a_Player);
return;
}
default:
{
break;
}
} }
cItem & DraggingItem = a_Player.GetDraggingItem(); cItem & DraggingItem = a_Player.GetDraggingItem();
@ -1607,6 +1780,12 @@ void cSlotAreaInventoryBase::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAc
{ {
if (a_Player.IsGameModeCreative() && (m_ParentWindow.GetWindowType() == cWindow::wtInventory)) if (a_Player.IsGameModeCreative() && (m_ParentWindow.GetWindowType() == cWindow::wtInventory))
{ {
if ((a_ClickAction == caDropKey) || (a_ClickAction == caCtrlDropKey))
{
DropClicked(a_Player, a_SlotNum, (a_ClickAction == caCtrlDropKey));
return;
}
// Creative inventory must treat a_ClickedItem as a DraggedItem instead, replacing the inventory slot with it // Creative inventory must treat a_ClickedItem as a DraggedItem instead, replacing the inventory slot with it
SetSlot(a_SlotNum, a_Player, a_ClickedItem); SetSlot(a_SlotNum, a_Player, a_ClickedItem);
return; return;
@ -1694,16 +1873,28 @@ void cSlotAreaArmor::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_C
return; return;
} }
if ((a_ClickAction == caShiftLeftClick) || (a_ClickAction == caShiftRightClick)) switch (a_ClickAction)
{ {
ShiftClicked(a_Player, a_SlotNum, a_ClickedItem); case caDblClick:
return; {
} // Armors haven't a dbl click
return;
// Armors haven't a dbl click }
if (a_ClickAction == caDblClick) case caShiftLeftClick:
{ case caShiftRightClick:
return; {
ShiftClicked(a_Player, a_SlotNum, a_ClickedItem);
return;
}
case caMiddleClick:
{
MiddleClicked(a_Player, a_SlotNum);
return;
}
default:
{
break;
}
} }
cItem Slot(*GetSlot(a_SlotNum, a_Player)); cItem Slot(*GetSlot(a_SlotNum, a_Player));

View File

@ -46,10 +46,19 @@ public:
/// Called from Clicked when the action is a shiftclick (left or right) /// Called from Clicked when the action is a shiftclick (left or right)
virtual void ShiftClicked(cPlayer & a_Player, int a_SlotNum, const cItem & a_ClickedItem); virtual void ShiftClicked(cPlayer & a_Player, int a_SlotNum, const cItem & a_ClickedItem);
/// Called from Clicked when the action is a caDblClick /// Called from Clicked when the action is a caDblClick
virtual void DblClicked(cPlayer & a_Player, int a_SlotNum); virtual void DblClicked(cPlayer & a_Player, int a_SlotNum);
/** Called from Clicked when the action is a middleclick */
virtual void MiddleClicked(cPlayer & a_Player, int a_SlotNum);
/** Called from Clicked when the action is a drop click. */
virtual void DropClicked(cPlayer & a_Player, int a_SlotNum, bool a_DropStack);
/** Called from Clicked when the action is a number click. */
virtual void NumberClicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction);
/// Called when a new player opens the same parent window. The window already tracks the player. CS-locked. /// Called when a new player opens the same parent window. The window already tracks the player. CS-locked.
virtual void OnPlayerAdded(cPlayer & a_Player); virtual void OnPlayerAdded(cPlayer & a_Player);
@ -237,6 +246,7 @@ public:
// Distributing items into this area is completely disabled // Distributing items into this area is completely disabled
virtual void DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots) override; virtual void DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots) override;
protected: protected:
/// Maps player's EntityID -> current recipe; not a std::map because cCraftingGrid needs proper constructor params /// Maps player's EntityID -> current recipe; not a std::map because cCraftingGrid needs proper constructor params
typedef std::list<std::pair<int, cCraftingRecipe> > cRecipeMap; typedef std::list<std::pair<int, cCraftingRecipe> > cRecipeMap;
@ -249,7 +259,10 @@ protected:
/// Handles a shift-click in the result slot. Crafts using the current recipe until it changes or no more space for result. /// Handles a shift-click in the result slot. Crafts using the current recipe until it changes or no more space for result.
void ShiftClickedResult(cPlayer & a_Player); void ShiftClickedResult(cPlayer & a_Player);
/** Handles a drop-click in the result slot. */
void DropClickedResult(cPlayer & a_Player);
/// Updates the current recipe and result slot based on the ingredients currently in the crafting grid of the specified player /// Updates the current recipe and result slot based on the ingredients currently in the crafting grid of the specified player
void UpdateRecipe(cPlayer & a_Player); void UpdateRecipe(cPlayer & a_Player);

View File

@ -178,6 +178,7 @@ void cWindow::Clicked(
switch (a_ClickAction) switch (a_ClickAction)
{ {
case caLeftClickOutside:
case caRightClickOutside: case caRightClickOutside:
{ {
if (PlgMgr->CallHookPlayerTossingItem(a_Player)) if (PlgMgr->CallHookPlayerTossingItem(a_Player))
@ -190,25 +191,16 @@ void cWindow::Clicked(
a_Player.TossPickup(a_ClickedItem); a_Player.TossPickup(a_ClickedItem);
} }
// Toss one of the dragged items: if (a_ClickAction == caLeftClickOutside)
a_Player.TossHeldItem();
return;
}
case caLeftClickOutside:
{
if (PlgMgr->CallHookPlayerTossingItem(a_Player))
{ {
// A plugin doesn't agree with the tossing. The plugin itself is responsible for handling the consequences (possible inventory mismatch) // Toss all dragged items:
return; a_Player.TossHeldItem(a_Player.GetDraggingItem().m_ItemCount);
} }
else
if (a_Player.IsGameModeCreative())
{ {
a_Player.TossPickup(a_ClickedItem); // Toss one of the dragged items:
a_Player.TossHeldItem();
} }
// Toss all dragged items:
a_Player.TossHeldItem(a_Player.GetDraggingItem().m_ItemCount);
return; return;
} }
case caLeftClickOutsideHoldNothing: case caLeftClickOutsideHoldNothing: