mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-23 18:36:31 +01:00
Core/Player: updated inventory slots
This commit is contained in:
@@ -3665,7 +3665,7 @@ void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
|
||||
{
|
||||
if (target == this)
|
||||
{
|
||||
for (uint8 i = EQUIPMENT_SLOT_START; i < BANK_SLOT_BAG_END; ++i)
|
||||
for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
||||
{
|
||||
if (m_items[i] == nullptr)
|
||||
continue;
|
||||
@@ -3673,7 +3673,15 @@ void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
|
||||
m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
|
||||
}
|
||||
|
||||
for (uint8 i = REAGENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i)
|
||||
for (uint8 i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i)
|
||||
{
|
||||
if (m_items[i] == nullptr)
|
||||
continue;
|
||||
|
||||
m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
|
||||
}
|
||||
|
||||
for (uint8 i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; ++i)
|
||||
{
|
||||
if (m_items[i] == nullptr)
|
||||
continue;
|
||||
@@ -3814,7 +3822,7 @@ void Player::DestroyForPlayer(Player* target) const
|
||||
|
||||
if (target == this)
|
||||
{
|
||||
for (uint8 i = EQUIPMENT_SLOT_START; i < BANK_SLOT_BAG_END; ++i)
|
||||
for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
||||
{
|
||||
if (m_items[i] == nullptr)
|
||||
continue;
|
||||
@@ -3822,7 +3830,15 @@ void Player::DestroyForPlayer(Player* target) const
|
||||
m_items[i]->DestroyForPlayer(target);
|
||||
}
|
||||
|
||||
for (uint8 i = REAGENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i)
|
||||
for (uint8 i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i)
|
||||
{
|
||||
if (m_items[i] == nullptr)
|
||||
continue;
|
||||
|
||||
m_items[i]->DestroyForPlayer(target);
|
||||
}
|
||||
|
||||
for (uint8 i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; ++i)
|
||||
{
|
||||
if (m_items[i] == nullptr)
|
||||
continue;
|
||||
@@ -9059,19 +9075,6 @@ uint32 Player::GetFreeInventorySlotCount(EnumFlag<ItemSearchLocation> location /
|
||||
++freeSlotCount;
|
||||
}
|
||||
|
||||
if (location.HasFlag(ItemSearchLocation::ReagentBank))
|
||||
{
|
||||
for (uint8 i = REAGENT_BAG_SLOT_START; i < REAGENT_BAG_SLOT_END; ++i)
|
||||
if (Bag* bag = GetBagByPos(i))
|
||||
for (uint32 j = 0; j < GetBagSize(bag); ++j)
|
||||
if (!GetItemInBag(bag, j))
|
||||
++freeSlotCount;
|
||||
|
||||
for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i)
|
||||
if (!GetItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||
++freeSlotCount;
|
||||
}
|
||||
|
||||
return freeSlotCount;
|
||||
}
|
||||
|
||||
@@ -9106,7 +9109,7 @@ uint32 Player::GetItemCount(uint32 item, bool inBankAlso, Item* skipItem) const
|
||||
{
|
||||
bool countGems = skipItem && skipItem->GetTemplate()->GetGemProperties();
|
||||
|
||||
ItemSearchLocation location = ItemSearchLocation::Equipment | ItemSearchLocation::Inventory | ItemSearchLocation::ReagentBank;
|
||||
ItemSearchLocation location = ItemSearchLocation::Equipment | ItemSearchLocation::Inventory | ItemSearchLocation::KeyRing;
|
||||
if (inBankAlso)
|
||||
location |= ItemSearchLocation::Bank;
|
||||
|
||||
@@ -9205,8 +9208,7 @@ Item* Player::GetUseableItemByPos(uint8 bag, uint8 slot) const
|
||||
Bag* Player::GetBagByPos(uint8 bag) const
|
||||
{
|
||||
if ((bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END)
|
||||
|| (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END)
|
||||
|| (bag >= REAGENT_BAG_SLOT_START && bag < REAGENT_BAG_SLOT_END))
|
||||
|| (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END))
|
||||
if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, bag))
|
||||
return item->ToBag();
|
||||
return nullptr;
|
||||
@@ -9319,8 +9321,6 @@ bool Player::IsInventoryPos(uint8 bag, uint8 slot)
|
||||
return true;
|
||||
if (bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END)
|
||||
return true;
|
||||
if (bag == INVENTORY_SLOT_BAG_0 && (slot >= CHILD_EQUIPMENT_SLOT_START && slot < CHILD_EQUIPMENT_SLOT_END))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -9332,8 +9332,6 @@ bool Player::IsEquipmentPos(uint8 bag, uint8 slot)
|
||||
return true;
|
||||
if (bag == INVENTORY_SLOT_BAG_0 && (slot >= INVENTORY_SLOT_BAG_START && slot < INVENTORY_SLOT_BAG_END))
|
||||
return true;
|
||||
if (bag == INVENTORY_SLOT_BAG_0 && (slot >= REAGENT_BAG_SLOT_START && slot < REAGENT_BAG_SLOT_END))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -9345,15 +9343,6 @@ bool Player::IsBankPos(uint8 bag, uint8 slot)
|
||||
return true;
|
||||
if (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END)
|
||||
return true;
|
||||
if (bag == INVENTORY_SLOT_BAG_0 && (slot >= REAGENT_SLOT_START && slot < REAGENT_SLOT_END))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Player::IsReagentBankPos(uint8 bag, uint8 slot)
|
||||
{
|
||||
if (bag == INVENTORY_SLOT_BAG_0 && (slot >= REAGENT_SLOT_START && slot < REAGENT_SLOT_END))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -9365,16 +9354,9 @@ bool Player::IsBagPos(uint16 pos)
|
||||
return true;
|
||||
if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END))
|
||||
return true;
|
||||
if (bag == INVENTORY_SLOT_BAG_0 && (slot >= REAGENT_BAG_SLOT_START && slot < REAGENT_BAG_SLOT_END))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Player::IsChildEquipmentPos(uint8 bag, uint8 slot)
|
||||
{
|
||||
return bag == INVENTORY_SLOT_BAG_0 && (slot >= CHILD_EQUIPMENT_SLOT_START && slot < CHILD_EQUIPMENT_SLOT_END);
|
||||
}
|
||||
|
||||
bool Player::IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const
|
||||
{
|
||||
// post selected
|
||||
@@ -9399,10 +9381,6 @@ bool Player::IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const
|
||||
if (slot >= INVENTORY_SLOT_BAG_START && slot < INVENTORY_SLOT_BAG_END)
|
||||
return true;
|
||||
|
||||
// reagent bag equip slots
|
||||
if (slot >= REAGENT_BAG_SLOT_START && slot < REAGENT_BAG_SLOT_END)
|
||||
return true;
|
||||
|
||||
// backpack slots
|
||||
if (slot >= INVENTORY_SLOT_ITEM_START && slot < INVENTORY_SLOT_ITEM_START + GetInventorySlotCount())
|
||||
return true;
|
||||
@@ -9415,10 +9393,6 @@ bool Player::IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const
|
||||
if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
|
||||
return true;
|
||||
|
||||
// reagent bank bag slots
|
||||
if (slot >= REAGENT_SLOT_START && slot < REAGENT_SLOT_END)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -9481,7 +9455,7 @@ void Player::SetInventorySlotCount(uint8 slots)
|
||||
|
||||
bool Player::HasItemCount(uint32 item, uint32 count, bool inBankAlso) const
|
||||
{
|
||||
ItemSearchLocation location = ItemSearchLocation::Equipment | ItemSearchLocation::Inventory | ItemSearchLocation::ReagentBank;
|
||||
ItemSearchLocation location = ItemSearchLocation::Equipment | ItemSearchLocation::Inventory | ItemSearchLocation::KeyRing;
|
||||
if (inBankAlso)
|
||||
location |= ItemSearchLocation::Bank;
|
||||
|
||||
@@ -9666,7 +9640,7 @@ bool Player::HasItemTotemCategory(uint32 TotemCategory) const
|
||||
}
|
||||
}
|
||||
|
||||
for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i)
|
||||
for (uint8 i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; ++i)
|
||||
{
|
||||
item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, i);
|
||||
if (item && DB2Manager::IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory))
|
||||
@@ -9690,12 +9664,6 @@ InventoryResult Player::CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemP
|
||||
{
|
||||
if (pSrcItem->IsNotEmptyBag() && !IsBagPos(uint16(bag) << 8 | slot))
|
||||
return EQUIP_ERR_DESTROY_NONEMPTY_BAG;
|
||||
|
||||
if (pSrcItem->HasItemFlag(ITEM_FIELD_FLAG_CHILD) && !IsEquipmentPos(bag, slot) && !IsChildEquipmentPos(bag, slot))
|
||||
return EQUIP_ERR_WRONG_BAG_TYPE_3;
|
||||
|
||||
if (!pSrcItem->HasItemFlag(ITEM_FIELD_FLAG_CHILD) && IsChildEquipmentPos(bag, slot))
|
||||
return EQUIP_ERR_WRONG_BAG_TYPE_3;
|
||||
}
|
||||
|
||||
// empty specific slot - check item fit to slot
|
||||
@@ -9703,12 +9671,12 @@ InventoryResult Player::CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemP
|
||||
{
|
||||
if (bag == INVENTORY_SLOT_BAG_0)
|
||||
{
|
||||
// prevent cheating
|
||||
if ((slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) || slot >= PLAYER_SLOT_END)
|
||||
// keyring case
|
||||
if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_END && !(pProto->GetBagFamily() & BAG_FAMILY_MASK_KEYS))
|
||||
return EQUIP_ERR_WRONG_BAG_TYPE;
|
||||
|
||||
// can't store anything else than crafting reagents in Reagent Bank
|
||||
if (IsReagentBankPos(bag, slot) && (!IsReagentBankUnlocked() || !pProto->IsCraftingReagent()))
|
||||
// prevent cheating
|
||||
if ((slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) || slot >= PLAYER_SLOT_END)
|
||||
return EQUIP_ERR_WRONG_BAG_TYPE;
|
||||
}
|
||||
else
|
||||
@@ -9957,24 +9925,6 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des
|
||||
{
|
||||
if (bag == INVENTORY_SLOT_BAG_0) // inventory
|
||||
{
|
||||
res = CanStoreItem_InInventorySlots(CHILD_EQUIPMENT_SLOT_START, CHILD_EQUIPMENT_SLOT_END, dest, pProto, count, true, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
{
|
||||
if (no_space_count)
|
||||
*no_space_count = count + no_similar_count;
|
||||
return res;
|
||||
}
|
||||
|
||||
if (count == 0)
|
||||
{
|
||||
if (no_similar_count == 0)
|
||||
return EQUIP_ERR_OK;
|
||||
|
||||
if (no_space_count)
|
||||
*no_space_count = count + no_similar_count;
|
||||
return EQUIP_ERR_ITEM_MAX_COUNT;
|
||||
}
|
||||
|
||||
res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, inventoryEnd, dest, pProto, count, true, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
{
|
||||
@@ -10022,27 +9972,6 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des
|
||||
// search free slot in bag for place to
|
||||
if (bag == INVENTORY_SLOT_BAG_0) // inventory
|
||||
{
|
||||
if (pItem && pItem->HasItemFlag(ITEM_FIELD_FLAG_CHILD))
|
||||
{
|
||||
res = CanStoreItem_InInventorySlots(CHILD_EQUIPMENT_SLOT_START, CHILD_EQUIPMENT_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
{
|
||||
if (no_space_count)
|
||||
*no_space_count = count + no_similar_count;
|
||||
return res;
|
||||
}
|
||||
|
||||
if (count == 0)
|
||||
{
|
||||
if (no_similar_count == 0)
|
||||
return EQUIP_ERR_OK;
|
||||
|
||||
if (no_space_count)
|
||||
*no_space_count = count + no_similar_count;
|
||||
return EQUIP_ERR_ITEM_MAX_COUNT;
|
||||
}
|
||||
}
|
||||
|
||||
res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, inventoryEnd, dest, pProto, count, false, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
{
|
||||
@@ -10091,24 +10020,6 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des
|
||||
// search stack for merge to
|
||||
if (pProto->GetMaxStackSize() != 1)
|
||||
{
|
||||
res = CanStoreItem_InInventorySlots(CHILD_EQUIPMENT_SLOT_START, CHILD_EQUIPMENT_SLOT_END, dest, pProto, count, true, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
{
|
||||
if (no_space_count)
|
||||
*no_space_count = count + no_similar_count;
|
||||
return res;
|
||||
}
|
||||
|
||||
if (count == 0)
|
||||
{
|
||||
if (no_similar_count == 0)
|
||||
return EQUIP_ERR_OK;
|
||||
|
||||
if (no_space_count)
|
||||
*no_space_count = count + no_similar_count;
|
||||
return EQUIP_ERR_ITEM_MAX_COUNT;
|
||||
}
|
||||
|
||||
res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, inventoryEnd, dest, pProto, count, true, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
{
|
||||
@@ -10189,27 +10100,6 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des
|
||||
if (pItem && pItem->IsNotEmptyBag())
|
||||
return EQUIP_ERR_BAG_IN_BAG;
|
||||
|
||||
if (pItem && pItem->HasItemFlag(ITEM_FIELD_FLAG_CHILD))
|
||||
{
|
||||
res = CanStoreItem_InInventorySlots(CHILD_EQUIPMENT_SLOT_START, CHILD_EQUIPMENT_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
{
|
||||
if (no_space_count)
|
||||
*no_space_count = count + no_similar_count;
|
||||
return res;
|
||||
}
|
||||
|
||||
if (count == 0)
|
||||
{
|
||||
if (no_similar_count == 0)
|
||||
return EQUIP_ERR_OK;
|
||||
|
||||
if (no_space_count)
|
||||
*no_space_count = count + no_similar_count;
|
||||
return EQUIP_ERR_ITEM_MAX_COUNT;
|
||||
}
|
||||
}
|
||||
|
||||
// search free slot
|
||||
uint8 searchSlotStart = INVENTORY_SLOT_ITEM_START;
|
||||
// new bags can be directly equipped
|
||||
@@ -10763,23 +10653,11 @@ InventoryResult Player::CanUnequipItem(uint16 pos, bool swap) const
|
||||
return EQUIP_ERR_OK;
|
||||
}
|
||||
|
||||
InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap, bool not_loading /*= true*/, bool reagentBankOnly /*= false*/) const
|
||||
InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap, bool not_loading /*= true*/) const
|
||||
{
|
||||
if (!pItem)
|
||||
return swap ? EQUIP_ERR_CANT_SWAP : EQUIP_ERR_ITEM_NOT_FOUND;
|
||||
|
||||
// different slots range if we're trying to store item in Reagent Bank
|
||||
if (reagentBankOnly)
|
||||
{
|
||||
ASSERT(bag == NULL_BAG && slot == NULL_SLOT); // when reagentBankOnly is true then bag & slot must be hardcoded constants, not client input
|
||||
}
|
||||
|
||||
if ((IsReagentBankPos(bag, slot) || reagentBankOnly) && !IsReagentBankUnlocked())
|
||||
return EQUIP_ERR_REAGENT_BANK_LOCKED;
|
||||
|
||||
uint8 slotStart = reagentBankOnly ? uint8(REAGENT_SLOT_START) : uint8(BANK_SLOT_ITEM_START);
|
||||
uint8 slotEnd = reagentBankOnly ? uint8(REAGENT_SLOT_END) : uint8(BANK_SLOT_ITEM_END);
|
||||
|
||||
uint32 count = pItem->GetCount();
|
||||
|
||||
TC_LOG_DEBUG("entities.player.items", "Player::CanBankItem: Player '{}' ({}), Bag: {}, Slot: {}, Item: {}, Count: {}",
|
||||
@@ -10845,7 +10723,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest
|
||||
{
|
||||
if (bag == INVENTORY_SLOT_BAG_0)
|
||||
{
|
||||
res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, count, true, pItem, bag, slot);
|
||||
res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
return res;
|
||||
|
||||
@@ -10869,7 +10747,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest
|
||||
// search free slot in bag
|
||||
if (bag == INVENTORY_SLOT_BAG_0)
|
||||
{
|
||||
res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, count, false, pItem, bag, slot);
|
||||
res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
return res;
|
||||
|
||||
@@ -10896,34 +10774,19 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest
|
||||
if (pProto->GetMaxStackSize() != 1)
|
||||
{
|
||||
// in slots
|
||||
res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, count, true, pItem, bag, slot);
|
||||
res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
return res;
|
||||
|
||||
if (count == 0)
|
||||
return EQUIP_ERR_OK;
|
||||
|
||||
// don't try to store reagents anywhere else than in Reagent Bank if we're on it
|
||||
if (!reagentBankOnly)
|
||||
// in special bags
|
||||
if (pProto->GetBagFamily())
|
||||
{
|
||||
// in special bags
|
||||
if (pProto->GetBagFamily())
|
||||
{
|
||||
for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
|
||||
{
|
||||
res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
continue;
|
||||
|
||||
if (count == 0)
|
||||
return EQUIP_ERR_OK;
|
||||
}
|
||||
}
|
||||
|
||||
// in regular bags
|
||||
for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
|
||||
{
|
||||
res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
|
||||
res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
continue;
|
||||
|
||||
@@ -10931,10 +10794,21 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest
|
||||
return EQUIP_ERR_OK;
|
||||
}
|
||||
}
|
||||
|
||||
// in regular bags
|
||||
for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
|
||||
{
|
||||
res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
continue;
|
||||
|
||||
if (count == 0)
|
||||
return EQUIP_ERR_OK;
|
||||
}
|
||||
}
|
||||
|
||||
// search free space in special bags (don't try to store reagents anywhere else than in Reagent Bank if we're on it)
|
||||
if (!reagentBankOnly && pProto->GetBagFamily())
|
||||
if (pProto->GetBagFamily())
|
||||
{
|
||||
for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
|
||||
{
|
||||
@@ -10948,7 +10822,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest
|
||||
}
|
||||
|
||||
// search free space
|
||||
res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, count, false, pItem, bag, slot);
|
||||
res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
return res;
|
||||
|
||||
@@ -10956,20 +10830,17 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest
|
||||
return EQUIP_ERR_OK;
|
||||
|
||||
// search free space in regular bags (don't try to store reagents anywhere else than in Reagent Bank if we're on it)
|
||||
if (!reagentBankOnly)
|
||||
for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
|
||||
{
|
||||
for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
|
||||
{
|
||||
res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
continue;
|
||||
res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
|
||||
if (res != EQUIP_ERR_OK)
|
||||
continue;
|
||||
|
||||
if (count == 0)
|
||||
return EQUIP_ERR_OK;
|
||||
}
|
||||
if (count == 0)
|
||||
return EQUIP_ERR_OK;
|
||||
}
|
||||
|
||||
return reagentBankOnly ? EQUIP_ERR_REAGENT_BANK_FULL : EQUIP_ERR_BANK_FULL;
|
||||
return EQUIP_ERR_BANK_FULL;
|
||||
}
|
||||
|
||||
InventoryResult Player::CanUseItem(Item* pItem, bool not_loading) const
|
||||
@@ -11175,21 +11046,6 @@ Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool updat
|
||||
if (addToCollection)
|
||||
GetSession()->GetCollectionMgr()->OnItemAdded(item);
|
||||
|
||||
if (ItemChildEquipmentEntry const* childItemEntry = sDB2Manager.GetItemChildEquipment(itemId))
|
||||
{
|
||||
if (ItemTemplate const* childTemplate = sObjectMgr->GetItemTemplate(childItemEntry->ChildItemID))
|
||||
{
|
||||
ItemPosCountVec childDest;
|
||||
CanStoreItem_InInventorySlots(CHILD_EQUIPMENT_SLOT_START, CHILD_EQUIPMENT_SLOT_END, childDest, childTemplate, count, false, nullptr, NULL_BAG, NULL_SLOT);
|
||||
if (Item* childItem = StoreNewItem(childDest, childTemplate->GetId(), update, {}, {}, context, {}, addToCollection))
|
||||
{
|
||||
childItem->SetCreator(item->GetGUID());
|
||||
childItem->SetItemFlag(ITEM_FIELD_FLAG_CHILD);
|
||||
item->SetChildItem(childItem->GetGUID());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (item->GetTemplate()->GetInventoryType() != INVTYPE_NON_EQUIP)
|
||||
UpdateAverageItemLevelTotal();
|
||||
}
|
||||
@@ -11535,23 +11391,6 @@ void Player::EquipChildItem(uint8 parentBag, uint8 parentSlot, Item* parentItem)
|
||||
|
||||
void Player::AutoUnequipChildItem(Item* parentItem)
|
||||
{
|
||||
if (sDB2Manager.GetItemChildEquipment(parentItem->GetEntry()))
|
||||
{
|
||||
if (Item* childItem = GetChildItemByGuid(parentItem->GetChildItem()))
|
||||
{
|
||||
if (IsChildEquipmentPos(childItem->GetPos()))
|
||||
return;
|
||||
|
||||
ItemPosCountVec dest;
|
||||
uint32 count = childItem->GetCount();
|
||||
InventoryResult result = CanStoreItem_InInventorySlots(CHILD_EQUIPMENT_SLOT_START, CHILD_EQUIPMENT_SLOT_END, dest, childItem->GetTemplate(), count, false, childItem, NULL_BAG, NULL_SLOT);
|
||||
if (result != EQUIP_ERR_OK)
|
||||
return;
|
||||
|
||||
RemoveItem(childItem->GetBagSlot(), childItem->GetSlot(), true);
|
||||
StoreItem(dest, childItem, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Player::QuickEquipItem(uint16 pos, Item* pItem)
|
||||
@@ -12058,61 +11897,6 @@ uint32 Player::DestroyItemCount(uint32 itemEntry, uint32 count, bool update, boo
|
||||
}
|
||||
}
|
||||
|
||||
for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i)
|
||||
{
|
||||
if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||
{
|
||||
if (item->GetEntry() == itemEntry && !item->IsInTrade())
|
||||
{
|
||||
if (item->GetCount() + remcount <= count)
|
||||
{
|
||||
// all keys can be unequipped
|
||||
remcount += item->GetCount();
|
||||
DestroyItem(INVENTORY_SLOT_BAG_0, i, update);
|
||||
|
||||
if (remcount >= count)
|
||||
return remcount;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->SetCount(item->GetCount() - count + remcount);
|
||||
ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
|
||||
if (IsInWorld() && update)
|
||||
item->SendUpdateToPlayer(this);
|
||||
item->SetState(ITEM_CHANGED, this);
|
||||
return count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i)
|
||||
{
|
||||
if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||
{
|
||||
if (item->GetEntry() == itemEntry && !item->IsInTrade())
|
||||
{
|
||||
if (item->GetCount() + remcount <= count)
|
||||
{
|
||||
// all keys can be unequipped
|
||||
remcount += item->GetCount();
|
||||
DestroyItem(INVENTORY_SLOT_BAG_0, i, update);
|
||||
|
||||
if (remcount >= count)
|
||||
return remcount;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->SetCount(item->GetCount() - count + remcount);
|
||||
ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
|
||||
if (IsInWorld() && update)
|
||||
item->SendUpdateToPlayer(this);
|
||||
item->SetState(ITEM_CHANGED, this);
|
||||
return count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return remcount;
|
||||
}
|
||||
|
||||
@@ -12190,7 +11974,7 @@ Item* Player::GetItemByEntry(uint32 entry, ItemSearchLocation where /*= ItemSear
|
||||
|
||||
std::vector<Item*> Player::GetItemListByEntry(uint32 entry, bool inBankAlso) const
|
||||
{
|
||||
ItemSearchLocation location = ItemSearchLocation::Equipment | ItemSearchLocation::Inventory | ItemSearchLocation::ReagentBank;
|
||||
ItemSearchLocation location = ItemSearchLocation::Equipment | ItemSearchLocation::Inventory | ItemSearchLocation::KeyRing;
|
||||
if (inBankAlso)
|
||||
location |= ItemSearchLocation::Bank;
|
||||
|
||||
@@ -12440,12 +12224,6 @@ void Player::SwapItem(uint16 src, uint16 dst)
|
||||
}
|
||||
}
|
||||
|
||||
if (IsReagentBankPos(dst) && !IsReagentBankUnlocked())
|
||||
{
|
||||
SendEquipError(EQUIP_ERR_REAGENT_BANK_LOCKED, pSrcItem, pDstItem);
|
||||
return;
|
||||
}
|
||||
|
||||
// NOW this is or item move (swap with empty), or swap with another item (including bags in bag possitions)
|
||||
// or swap empty bag with another empty or not empty bag (with items exchange)
|
||||
|
||||
@@ -12479,8 +12257,7 @@ void Player::SwapItem(uint16 src, uint16 dst)
|
||||
|
||||
RemoveItem(srcbag, srcslot, true);
|
||||
BankItem(dest, pSrcItem, true);
|
||||
if (!IsReagentBankPos(dst))
|
||||
ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
|
||||
ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
|
||||
}
|
||||
else if (IsEquipmentPos(dst))
|
||||
{
|
||||
@@ -19435,7 +19212,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba
|
||||
|
||||
ss.str("");
|
||||
// cache equipment...
|
||||
for (uint32 i = 0; i < REAGENT_BAG_SLOT_END; ++i)
|
||||
for (uint32 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
|
||||
{
|
||||
if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||
{
|
||||
@@ -19572,7 +19349,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba
|
||||
|
||||
ss.str("");
|
||||
// cache equipment...
|
||||
for (uint32 i = 0; i < REAGENT_BAG_SLOT_END; ++i)
|
||||
for (uint32 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
|
||||
{
|
||||
if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||
{
|
||||
|
||||
@@ -669,47 +669,35 @@ enum InventorySlots : uint8 // 4 slots
|
||||
INVENTORY_SLOT_BAG_END = 34
|
||||
};
|
||||
|
||||
enum ReagentBagSlots : uint8 // 1 slot
|
||||
{
|
||||
REAGENT_BAG_SLOT_START = 34,
|
||||
REAGENT_BAG_SLOT_END = 35
|
||||
};
|
||||
|
||||
enum InventoryPackSlots : uint8 // 28 slots
|
||||
{
|
||||
INVENTORY_SLOT_ITEM_START = 35,
|
||||
INVENTORY_SLOT_ITEM_END = 63
|
||||
INVENTORY_SLOT_ITEM_START = 34,
|
||||
INVENTORY_SLOT_ITEM_END = 62
|
||||
};
|
||||
|
||||
enum BankItemSlots // 28 slots
|
||||
{
|
||||
BANK_SLOT_ITEM_START = 63,
|
||||
BANK_SLOT_ITEM_END = 91
|
||||
BANK_SLOT_ITEM_START = 62,
|
||||
BANK_SLOT_ITEM_END = 90
|
||||
};
|
||||
|
||||
enum BankBagSlots // 7 slots
|
||||
{
|
||||
BANK_SLOT_BAG_START = 91,
|
||||
BANK_SLOT_BAG_END = 98
|
||||
BANK_SLOT_BAG_START = 90,
|
||||
BANK_SLOT_BAG_END = 97
|
||||
};
|
||||
|
||||
enum BuyBackSlots // 12 slots
|
||||
{
|
||||
// stored in m_buybackitems
|
||||
BUYBACK_SLOT_START = 98,
|
||||
BUYBACK_SLOT_END = 110
|
||||
BUYBACK_SLOT_START = 97,
|
||||
BUYBACK_SLOT_END = 109
|
||||
};
|
||||
|
||||
enum ReagentSlots // 98 slots
|
||||
enum KeyRingSlots : uint8 // 32 slots
|
||||
{
|
||||
REAGENT_SLOT_START = 110,
|
||||
REAGENT_SLOT_END = 208,
|
||||
};
|
||||
|
||||
enum ChildEquipmentSlots
|
||||
{
|
||||
CHILD_EQUIPMENT_SLOT_START = 208,
|
||||
CHILD_EQUIPMENT_SLOT_END = 211,
|
||||
KEYRING_SLOT_START = 109,
|
||||
KEYRING_SLOT_END = 141
|
||||
};
|
||||
|
||||
// slots past 214 are guessed (unused in client)
|
||||
@@ -747,10 +735,10 @@ enum class ItemSearchLocation
|
||||
Equipment = 0x01,
|
||||
Inventory = 0x02,
|
||||
Bank = 0x04,
|
||||
ReagentBank = 0x08,
|
||||
KeyRing = 0x08,
|
||||
|
||||
Default = Equipment | Inventory,
|
||||
Everywhere = Equipment | Inventory | Bank | ReagentBank
|
||||
Everywhere = Equipment | Inventory | Bank | KeyRing
|
||||
};
|
||||
|
||||
DEFINE_ENUM_FLAG(ItemSearchLocation);
|
||||
@@ -1285,11 +1273,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
|
||||
if (callback(pItem) == ItemSearchCallbackResult::Stop)
|
||||
return false;
|
||||
|
||||
for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i)
|
||||
if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||
if (callback(pItem) == ItemSearchCallbackResult::Stop)
|
||||
return false;
|
||||
|
||||
for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i)
|
||||
if (Bag* pBag = GetBagByPos(i))
|
||||
for (uint32 j = 0; j < GetBagSize(pBag); ++j)
|
||||
@@ -1313,19 +1296,14 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
|
||||
return false;
|
||||
}
|
||||
|
||||
if (flag.HasFlag(ItemSearchLocation::ReagentBank))
|
||||
if (flag.HasFlag(ItemSearchLocation::KeyRing))
|
||||
{
|
||||
for (uint8 i = REAGENT_BAG_SLOT_START; i < REAGENT_BAG_SLOT_END; ++i)
|
||||
for (uint8 i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; ++i)
|
||||
if (Bag* bag = GetBagByPos(i))
|
||||
for (uint32 j = 0; j < GetBagSize(bag); ++j)
|
||||
if (Item* pItem = GetItemInBag(bag, j))
|
||||
if (callback(pItem) == ItemSearchCallbackResult::Stop)
|
||||
return false;
|
||||
|
||||
for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i)
|
||||
if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||
if (callback(pItem) == ItemSearchCallbackResult::Stop)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -1360,10 +1338,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
|
||||
static bool IsBagPos(uint16 pos);
|
||||
static bool IsBankPos(uint16 pos) { return IsBankPos(pos >> 8, pos & 255); }
|
||||
static bool IsBankPos(uint8 bag, uint8 slot);
|
||||
static bool IsReagentBankPos(uint16 pos) { return IsReagentBankPos(pos >> 8, pos & 255); }
|
||||
static bool IsReagentBankPos(uint8 bag, uint8 slot);
|
||||
static bool IsChildEquipmentPos(uint16 pos) { return IsChildEquipmentPos(pos >> 8, pos & 255); }
|
||||
static bool IsChildEquipmentPos(uint8 bag, uint8 slot);
|
||||
bool IsValidPos(uint16 pos, bool explicit_pos) const { return IsValidPos(pos >> 8, pos & 255, explicit_pos); }
|
||||
bool IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const;
|
||||
uint8 GetInventorySlotCount() const { return m_activePlayerData->NumBackpackSlots; }
|
||||
@@ -1396,7 +1370,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
|
||||
InventoryResult CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1) const;
|
||||
InventoryResult CanUnequipItems(uint32 item, uint32 count) const;
|
||||
InventoryResult CanUnequipItem(uint16 src, bool swap) const;
|
||||
InventoryResult CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap, bool not_loading = true, bool reagentBankOnly = false) const;
|
||||
InventoryResult CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap, bool not_loading = true) const;
|
||||
InventoryResult CanUseItem(Item* pItem, bool not_loading = true) const;
|
||||
bool HasItemTotemCategory(uint32 TotemCategory) const;
|
||||
InventoryResult CanUseItem(ItemTemplate const* pItem, bool skipRequiredLevelCheck = false) const;
|
||||
|
||||
@@ -194,7 +194,7 @@ void WorldSession::HandleReagentBankDepositOpcode(WorldPackets::Bank::ReagentBan
|
||||
for (Item* item : _player->GetCraftingReagentItemsToDeposit())
|
||||
{
|
||||
ItemPosCountVec dest;
|
||||
InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, item, false, true, true);
|
||||
InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, item, false, true);
|
||||
if (msg != EQUIP_ERR_OK)
|
||||
{
|
||||
if (msg != EQUIP_ERR_REAGENT_BANK_FULL || !anyDeposited)
|
||||
@@ -234,7 +234,7 @@ void WorldSession::HandleAutoBankReagentOpcode(WorldPackets::Bank::AutoBankReage
|
||||
return;
|
||||
|
||||
ItemPosCountVec dest;
|
||||
InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, item, false, true, true);
|
||||
InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, item, false, true);
|
||||
if (msg != EQUIP_ERR_OK)
|
||||
{
|
||||
_player->SendEquipError(msg, item, nullptr);
|
||||
@@ -269,23 +269,9 @@ void WorldSession::HandleAutoStoreBankReagentOpcode(WorldPackets::Bank::AutoStor
|
||||
if (!pItem)
|
||||
return;
|
||||
|
||||
if (_player->IsReagentBankPos(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot))
|
||||
{
|
||||
ItemPosCountVec dest;
|
||||
InventoryResult msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, dest, pItem, false);
|
||||
if (msg != EQUIP_ERR_OK)
|
||||
{
|
||||
_player->SendEquipError(msg, pItem, nullptr);
|
||||
return;
|
||||
}
|
||||
|
||||
_player->RemoveItem(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot, true);
|
||||
_player->StoreItem(dest, pItem, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ItemPosCountVec dest;
|
||||
InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, pItem, false, true, true);
|
||||
InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, pItem, false, true);
|
||||
if (msg != EQUIP_ERR_OK)
|
||||
{
|
||||
_player->SendEquipError(msg, pItem, nullptr);
|
||||
|
||||
@@ -384,6 +384,14 @@ enum ItemQualities
|
||||
MAX_ITEM_QUALITY
|
||||
};
|
||||
|
||||
constexpr uint8 MIN_TALENT_GROUP = 0;
|
||||
constexpr uint8 MAX_TALENT_GROUP = 1;
|
||||
constexpr uint8 MIN_TALENT_GROUPS = 1;
|
||||
constexpr uint8 MAX_TALENT_GROUPS = 2;
|
||||
constexpr uint8 MAX_GLYPH_SLOT_INDEX = 6;
|
||||
constexpr uint8 MIN_SPECIALIZATION_LEVEL = 10;
|
||||
constexpr uint8 MAX_SPECIALIZATIONS = 4;
|
||||
|
||||
enum SpellCategory
|
||||
{
|
||||
SPELL_CATEGORY_FOOD = 11,
|
||||
|
||||
@@ -192,8 +192,6 @@ public:
|
||||
itemPos = "[equipped]";
|
||||
else if (Player::IsInventoryPos(itemBag, itemSlot))
|
||||
itemPos = "[in inventory]";
|
||||
else if (Player::IsReagentBankPos(itemBag, itemSlot))
|
||||
itemPos = "[in reagent bank]";
|
||||
else if (Player::IsBankPos(itemBag, itemSlot))
|
||||
itemPos = "[in bank]";
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user