1
0
Fork 0

Off-hand/shield slot functional, save and load slot, bow + arrow functional (#3725)

Fixes #3714.
This commit is contained in:
Pablo Beltrán 2017-05-24 08:09:58 +02:00 committed by Mattes D
parent 8a890cf945
commit 84bdba345d
6 changed files with 126 additions and 9 deletions

View File

@ -7970,6 +7970,16 @@ These ItemGrids are available in the API and can be manipulated by the plugins,
},
Notes = "Returns the specified hotbar slot contents. Note that the returned item is read-only",
},
GetShieldSlot =
{
Returns =
{
{
Type = "cItem",
},
},
Notes = "Returns current item in shield slot.",
},
GetInventoryGrid =
{
Returns =
@ -8177,6 +8187,17 @@ These ItemGrids are available in the API and can be manipulated by the plugins,
},
Notes = "Sets the specified hotbar slot contents",
},
SetShieldSlot =
{
Params =
{
{
Name = "Item",
Type = "cItem",
},
},
Notes = "Sets the shield slot content",
},
SetInventorySlot =
{
Params =
@ -8234,6 +8255,14 @@ These ItemGrids are available in the API and can be manipulated by the plugins,
{
Notes = "Starting slot number of the main inventory part",
},
invShieldCount =
{
Notes = "Number of slots in the Shield part",
},
invShieldOffset =
{
Notes = "Starting slot number of the Shield part",
},
invNumSlots =
{
Notes = "Total number of slots in a cInventory",

View File

@ -1111,6 +1111,11 @@ void cClientHandle::HandleLeftClick(int a_BlockX, int a_BlockY, int a_BlockZ, eB
// A plugin doesn't agree with the action. The plugin itself is responsible for handling the consequences (possible inventory mismatch)
return;
}
// When bow is in off-hand / shield slot
if (m_Player->GetInventory().GetShieldSlot().m_ItemType == E_ITEM_BOW)
{
ItemHandler = cItemHandler::GetItemHandler(m_Player->GetInventory().GetShieldSlot());
}
ItemHandler->OnItemShoot(m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
}
return;
@ -1524,6 +1529,11 @@ void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, e
ItemHandler->OnItemUse(World, m_Player, PluginInterface, Equipped, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
PlgMgr->CallHookPlayerUsedItem(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ);
}
// Charge bow when it's in slot off-hand / shield
if ((a_BlockFace == BLOCK_FACE_NONE) && (m_Player->GetInventory().GetShieldSlot().m_ItemType == E_ITEM_BOW))
{
m_Player->StartChargingBow();
}
}

View File

@ -21,6 +21,7 @@ cInventory::cInventory(cPlayer & a_Owner) :
m_ArmorSlots (1, 4), // 1 x 4 slots
m_InventorySlots(9, 3), // 9 x 3 slots
m_HotbarSlots (9, 1), // 9 x 1 slots
m_ShieldSlots (1, 1), // 1 x 1 slots
m_Owner(a_Owner)
{
// Ask each ItemGrid to report changes to us:
@ -40,6 +41,7 @@ void cInventory::Clear(void)
m_ArmorSlots.Clear();
m_InventorySlots.Clear();
m_HotbarSlots.Clear();
m_ShieldSlots.Clear();
}
@ -178,7 +180,12 @@ int cInventory::AddItems(cItems & a_ItemStackList, bool a_AllowNewStacks)
int cInventory::RemoveItem(const cItem & a_ItemStack)
{
int RemovedItems = m_HotbarSlots.RemoveItem(a_ItemStack);
int RemovedItems = m_ShieldSlots.RemoveItem(a_ItemStack);
if (RemovedItems < a_ItemStack.m_ItemCount)
{
RemovedItems += m_HotbarSlots.RemoveItem(a_ItemStack);
}
if (RemovedItems < a_ItemStack.m_ItemCount)
{
@ -214,7 +221,8 @@ int cInventory::HowManyItems(const cItem & a_Item)
return
m_ArmorSlots.HowManyItems(a_Item) +
m_InventorySlots.HowManyItems(a_Item) +
m_HotbarSlots.HowManyItems(a_Item);
m_HotbarSlots.HowManyItems(a_Item) +
m_ShieldSlots.HowManyItems(a_Item);
}
@ -280,6 +288,15 @@ void cInventory::SetHotbarSlot(int a_HotBarSlotNum, const cItem & a_Item)
void cInventory::SetShieldSlot(const cItem & a_Item)
{
m_ShieldSlots.SetSlot(0, a_Item);
}
void cInventory::SendEquippedSlot()
{
int EquippedSlotNum = cInventory::invArmorCount + cInventory::invInventoryCount + GetEquippedSlotNum();
@ -354,6 +371,15 @@ const cItem & cInventory::GetHotbarSlot(int a_SlotNum) const
const cItem & cInventory::GetShieldSlot() const
{
return m_ShieldSlots.GetSlot(0);
}
const cItem & cInventory::GetEquippedItem(void) const
{
return GetHotbarSlot(m_EquippedSlotNum);
@ -617,13 +643,18 @@ void cInventory::SaveToJson(Json::Value & a_Value)
a_Value.append(JSON_Item);
}
// The hotbar is the last:
// The hotbar:
for (int i = 0; i < invHotbarCount; i++)
{
Json::Value JSON_Item;
m_HotbarSlots.GetSlot(i).GetJson(JSON_Item);
a_Value.append(JSON_Item);
}
// Shield slot is the last
Json::Value JSON_Item;
m_ShieldSlots.GetSlot(0).GetJson(JSON_Item);
a_Value.append(JSON_Item);
}
@ -678,8 +709,14 @@ const cItemGrid * cInventory::GetGridForSlotNum(int a_SlotNum, int & a_GridSlotN
a_GridSlotNum = a_SlotNum;
return &m_InventorySlots;
}
a_GridSlotNum = a_SlotNum - invInventoryCount;
return &m_HotbarSlots;
a_SlotNum -= invInventoryCount;
if (a_SlotNum < invHotbarCount)
{
a_GridSlotNum = a_SlotNum;
return &m_HotbarSlots;
}
a_GridSlotNum = a_SlotNum - invHotbarCount;
return &m_ShieldSlots;
}
@ -701,8 +738,14 @@ cItemGrid * cInventory::GetGridForSlotNum(int a_SlotNum, int & a_GridSlotNum)
a_GridSlotNum = a_SlotNum;
return &m_InventorySlots;
}
a_GridSlotNum = a_SlotNum - invInventoryCount;
return &m_HotbarSlots;
a_SlotNum -= invInventoryCount;
if (a_SlotNum < invHotbarCount)
{
a_GridSlotNum = a_SlotNum;
return &m_HotbarSlots;
}
a_GridSlotNum = a_SlotNum - invHotbarCount;
return &m_ShieldSlots;
}

View File

@ -43,11 +43,13 @@ public:
invArmorCount = 4,
invInventoryCount = 9 * 3,
invHotbarCount = 9,
invShieldCount = 1, // Number of slots in shield slots grid
invArmorOffset = 0,
invInventoryOffset = invArmorOffset + invArmorCount,
invHotbarOffset = invInventoryOffset + invInventoryCount,
invNumSlots = invHotbarOffset + invHotbarCount
invShieldOffset = invHotbarOffset + invHotbarCount, // Offset where shield slots start
invNumSlots = invShieldOffset + invShieldCount
} ;
// tolua_end
@ -120,17 +122,31 @@ public:
// tolua_begin
/** Returns current item in a_SlotNum slot */
const cItem & GetSlot(int a_SlotNum) const;
/** Returns current item in a_ArmorSlotNum in armor slots */
const cItem & GetArmorSlot(int a_ArmorSlotNum) const;
/** Returns current item in a_ArmorSlotNum in inventory slots */
const cItem & GetInventorySlot(int a_InventorySlotNum) const;
/** Returns current item in a_ArmorSlotNum in hotbar slots */
const cItem & GetHotbarSlot(int a_HotBarSlotNum) const;
/** Returns current item in shield slot */
const cItem & GetShieldSlot() const;
/** Returns current equiped item */
const cItem & GetEquippedItem(void) const;
/** Puts a_Item item in a_SlotNum slot number */
void SetSlot(int a_SlotNum, const cItem & a_Item);
/** Puts a_Item item in a_ArmorSlotNum slot number in armor slots */
void SetArmorSlot(int a_ArmorSlotNum, const cItem & a_Item);
/** Puts a_Item item in a_InventorySlotNum slot number in inventory slots */
void SetInventorySlot(int a_InventorySlotNum, const cItem & a_Item);
/** Puts a_Item item in a_HotBarSlotNum slot number in hotbar slots */
void SetHotbarSlot(int a_HotBarSlotNum, const cItem & a_Item);
/** Sets current item in shield slot */
void SetShieldSlot(const cItem & a_Item);
/** Sets equiped item to the a_SlotNum slot number */
void SetEquippedSlotNum(int a_SlotNum);
/** Returns slot number of equiped item */
int GetEquippedSlotNum(void) { return m_EquippedSlotNum; }
/** Adds (or subtracts, if a_AddToCount is negative) to the count of items in the specified slot.
@ -170,6 +186,7 @@ protected:
cItemGrid m_ArmorSlots;
cItemGrid m_InventorySlots;
cItemGrid m_HotbarSlots;
cItemGrid m_ShieldSlots;
int m_EquippedSlotNum;

View File

@ -19,6 +19,7 @@ cInventoryWindow::cInventoryWindow(cPlayer & a_Player) :
m_SlotAreas.push_back(new cSlotAreaArmor(*this));
m_SlotAreas.push_back(new cSlotAreaInventory(*this));
m_SlotAreas.push_back(new cSlotAreaHotBar(*this));
m_SlotAreas.push_back(new cSlotAreaShield(*this));
}

View File

@ -145,6 +145,23 @@ public:
/** Handles the shield of each player */
class cSlotAreaShield :
public cSlotAreaInventoryBase
{
typedef cSlotAreaInventoryBase super;
public:
cSlotAreaShield(cWindow & a_ParentWindow) :
cSlotAreaInventoryBase(cInventory::invShieldCount, cInventory::invShieldOffset, a_ParentWindow)
{
}
};
/** Handles the armor area of the player's inventory */
class cSlotAreaArmor :
public cSlotAreaInventoryBase