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 | |
parent | 629d845ae913b9844616c892dd8b2a63c2a0fefb (diff) |
Core/Players: Fixed buying bank tabs
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 59 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 4 | ||||
-rw-r--r-- | src/server/game/Handlers/BankHandler.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/Language.h | 2 |
4 files changed, 42 insertions, 38 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); diff --git a/src/server/game/Handlers/BankHandler.cpp b/src/server/game/Handlers/BankHandler.cpp index db3a34e0403..86aeb62e661 100644 --- a/src/server/game/Handlers/BankHandler.cpp +++ b/src/server/game/Handlers/BankHandler.cpp @@ -17,10 +17,12 @@ #include "WorldSession.h" #include "BankPackets.h" +#include "Chat.h" #include "Creature.h" #include "DB2Stores.h" #include "GossipDef.h" #include "Item.h" +#include "Language.h" #include "Log.h" #include "NPCPackets.h" #include "Player.h" @@ -169,12 +171,12 @@ void WorldSession::HandleBuyBankTab(WorldPackets::Bank::BuyBankTab const& buyBan case BankType::Character: itemId = ITEM_CHARACTER_BANK_TAB_BAG; slot = _player->GetCharacterBankTabCount(); - inventorySlot = BANK_SLOT_BAG_START; + inventorySlot = BANK_SLOT_BAG_START + slot; break; case BankType::Account: itemId = ITEM_ACCOUNT_BANK_TAB_BAG; slot = _player->GetAccountBankTabCount(); - inventorySlot = ACCOUNT_BANK_SLOT_BAG_START; + inventorySlot = ACCOUNT_BANK_SLOT_BAG_START + slot; break; default: TC_LOG_DEBUG("network", "WorldSession::HandleBuyBankTab {} - Bank type {} is not supported.", @@ -182,9 +184,6 @@ void WorldSession::HandleBuyBankTab(WorldPackets::Bank::BuyBankTab const& buyBan return; } - // next slot - ++slot; - auto bankTab = std::ranges::find(sBankTabStore, std::pair(buyBankTab.BankType, int8(slot)), [](BankTabEntry const* bankTab) { return std::pair(BankType(bankTab->BankType), bankTab->OrderIndex); }); @@ -210,10 +209,12 @@ void WorldSession::HandleBuyBankTab(WorldPackets::Bank::BuyBankTab const& buyBan switch (buyBankTab.BankType) { case BankType::Character: - _player->SetCharacterBankTabCount(slot); + _player->SetCharacterBankTabCount(slot + 1); + _player->SetCharacterBankTabSettings(slot, ChatHandler(this).PGetParseString(LANG_BANK_TAB_NAME, slot + 1), "", "", BagSlotFlags::None); break; case BankType::Account: - _player->SetAccountBankTabCount(slot); + _player->SetAccountBankTabCount(slot + 1); + _player->SetAccountBankTabSettings(slot, ChatHandler(this).PGetParseString(LANG_BANK_TAB_NAME, slot + 1), "", "", BagSlotFlags::None); break; default: break; diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 5b17f33b7fd..cb9e33f304c 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -762,7 +762,7 @@ enum TrinityStrings LANG_NEED_CHARACTER_NAME = 807, LANG_PLAYER_NOT_EXIST_OR_OFFLINE = 808, LANG_ACCOUNT_FOR_PLAYER_NOT_FOUND = 809, - // unused = 810, + LANG_BANK_TAB_NAME = 810, LANG_GUILD_MASTER = 811, LANG_GUILD_OFFICER = 812, LANG_GUILD_VETERAN = 813, |