commit
ea24a4f4aa
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue