diff options
| author | Shauren <shauren.trinity@gmail.com> | 2025-09-01 00:11:04 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2025-09-01 00:11:04 +0200 |
| commit | 8b2fc59397ebca720726270dc5319f1d2ffa0150 (patch) | |
| tree | 4259e4ad61b6b0c3ce0db461735b88a266234f70 /src/server/game/Entities | |
| parent | 629d845ae913b9844616c892dd8b2a63c2a0fefb (diff) | |
Core/Players: Fixed buying bank tabs
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 59 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 4 |
2 files changed, 33 insertions, 30 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1d28e4f8aac..6bd0b7c320b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -9249,9 +9249,9 @@ void Player::SendRespecWipeConfirm(ObjectGuid const& guid, uint32 cost, SpecRese /*** STORAGE SYSTEM ***/ /*********************************************************/ -uint8 Player::FindEquipSlot(Item const* item, uint32 slot, bool swap) const +uint8 Player::FindEquipSlot(Item const* item, uint8 slot, bool swap) const { - std::array<uint8, 4> slots = { NULL_SLOT, NULL_SLOT, NULL_SLOT, NULL_SLOT }; + std::array<uint8, 6> slots = { NULL_SLOT, NULL_SLOT, NULL_SLOT, NULL_SLOT, NULL_SLOT, NULL_SLOT }; switch (item->GetTemplate()->GetInventoryType()) { case INVTYPE_HEAD: @@ -9335,8 +9335,12 @@ uint8 Player::FindEquipSlot(Item const* item, uint32 slot, bool swap) const slots[0] = EQUIPMENT_SLOT_MAINHAND; break; case INVTYPE_BAG: - if (item->GetTemplate()->GetClass() != ITEM_CLASS_CONTAINER || item->GetTemplate()->GetSubClass() != ITEM_SUBCLASS_REAGENT_CONTAINER) - slots = { INVENTORY_SLOT_BAG_START + 0, INVENTORY_SLOT_BAG_START + 1, INVENTORY_SLOT_BAG_START + 2, INVENTORY_SLOT_BAG_START + 3 }; + if (item->GetTemplate()->GetId() == ITEM_ACCOUNT_BANK_TAB_BAG) + slots = { ACCOUNT_BANK_SLOT_BAG_START + 0, ACCOUNT_BANK_SLOT_BAG_START + 1, ACCOUNT_BANK_SLOT_BAG_START + 2, ACCOUNT_BANK_SLOT_BAG_START + 3, ACCOUNT_BANK_SLOT_BAG_START + 4, NULL_SLOT }; + else if (item->GetTemplate()->GetId() == ITEM_CHARACTER_BANK_TAB_BAG) + slots = { BANK_SLOT_BAG_START + 0, BANK_SLOT_BAG_START + 1, BANK_SLOT_BAG_START + 2, BANK_SLOT_BAG_START + 3, BANK_SLOT_BAG_START + 4, BANK_SLOT_BAG_START + 5 }; + else if (item->GetTemplate()->GetClass() != ITEM_CLASS_CONTAINER || item->GetTemplate()->GetSubClass() != ITEM_SUBCLASS_REAGENT_CONTAINER) + slots = { INVENTORY_SLOT_BAG_START + 0, INVENTORY_SLOT_BAG_START + 1, INVENTORY_SLOT_BAG_START + 2, INVENTORY_SLOT_BAG_START + 3, NULL_SLOT, NULL_SLOT }; else slots[0] = REAGENT_BAG_SLOT_START; break; @@ -9406,41 +9410,40 @@ uint8 Player::FindEquipSlot(Item const* item, uint32 slot, bool swap) const if (slot != NULL_SLOT) { if (swap || !GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) - for (uint8 i = 0; i < 4; ++i) - if (slots[i] == slot) - return slot; + if (advstd::ranges::contains(slots, slot)) + return slot; } else { // search free slot at first - for (uint8 i = 0; i < 4; ++i) - if (slots[i] != NULL_SLOT && !GetItemByPos(INVENTORY_SLOT_BAG_0, slots[i])) + auto slotItr = std::ranges::find_if(slots, [&](uint8 candidateSlot) + { + if (candidateSlot != NULL_SLOT && !GetItemByPos(INVENTORY_SLOT_BAG_0, candidateSlot)) // in case 2hand equipped weapon (without titan grip) offhand slot empty but not free - if (slots[i] != EQUIPMENT_SLOT_OFFHAND || !IsTwoHandUsed()) - return slots[i]; + if (candidateSlot != EQUIPMENT_SLOT_OFFHAND || !IsTwoHandUsed()) + return true; + return false; + }); + + if (slotItr != slots.end()) + return *slotItr; // if not found free and can swap return slot with lower item level equipped if (swap) { - uint32 minItemLevel = std::numeric_limits<uint32>::max(); - uint8 minItemLevelIndex = 0; - for (uint8 i = 0; i < 4; ++i) + slotItr = std::ranges::min_element(slots, std::ranges::less(), [&](uint8 candidateSlot) { - if (slots[i] != NULL_SLOT) - { - if (Item const* equipped = GetItemByPos(INVENTORY_SLOT_BAG_0, slots[i])) - { - uint32 itemLevel = equipped->GetItemLevel(this); - if (itemLevel < minItemLevel) - { - minItemLevel = itemLevel; - minItemLevelIndex = i; - } - } - } - } + if (candidateSlot == NULL_SLOT) + return std::numeric_limits<uint32>::max(); + + if (Item const* equipped = GetItemByPos(INVENTORY_SLOT_BAG_0, candidateSlot)) + return equipped->GetItemLevel(this); + + return 0u; + }); - return slots[minItemLevelIndex]; + if (slotItr != slots.end()) + return *slotItr; } } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 2a28c516dc0..c12d6cf311d 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1386,7 +1386,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void UpdateAverageItemLevelTotal(); void UpdateAverageItemLevelEquipped(); - uint8 FindEquipSlot(Item const* item, uint32 slot, bool swap) const; + uint8 FindEquipSlot(Item const* item, uint8 slot, bool swap) const; uint32 GetFreeInventorySlotCount(EnumFlag<ItemSearchLocation> location = ItemSearchLocation::Inventory) const; uint32 GetItemCount(uint32 item, bool inBankAlso = false, Item* skipItem = nullptr) const; uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item* skipItem = nullptr) const; @@ -1434,7 +1434,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> auto setter = m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::AccountBankTabSettings, tabId); SetBankTabSettings(setter, name, icon, description, depositFlags); } - void SetBankTabSettings(UF::MutableFieldReferenceWithChangesMask<UF::BankTabSettings, false> setter, std::string const& name, std::string const& icon, std::string const& description, BagSlotFlags depositFlags) + void SetBankTabSettings(UF::MutableFieldReferenceWithChangesMask<UF::BankTabSettings, false> setter, std::string const& name, std::string const& icon, std::string const& description, BagSlotFlags depositFlags) { SetUpdateFieldValue(setter.ModifyValue(&UF::BankTabSettings::Name), name); SetUpdateFieldValue(setter.ModifyValue(&UF::BankTabSettings::Icon), icon); |
