aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/BankHandler.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-08-13 00:31:39 +0200
committerShauren <shauren.trinity@gmail.com>2025-08-13 00:31:39 +0200
commit5cf0c6c8bb2c4e58a2d66ba5f304af34d18a4782 (patch)
tree0616f3e83f511aae0e10916f0c22161017e09c24 /src/server/game/Handlers/BankHandler.cpp
parent82f19c898815e3bc5bb6288b0191ee897594f9b5 (diff)
Core: Updated to 11.2.0
Diffstat (limited to 'src/server/game/Handlers/BankHandler.cpp')
-rw-r--r--src/server/game/Handlers/BankHandler.cpp210
1 files changed, 95 insertions, 115 deletions
diff --git a/src/server/game/Handlers/BankHandler.cpp b/src/server/game/Handlers/BankHandler.cpp
index 91a65dfb58b..db3a34e0403 100644
--- a/src/server/game/Handlers/BankHandler.cpp
+++ b/src/server/game/Handlers/BankHandler.cpp
@@ -31,7 +31,7 @@ void WorldSession::HandleAutoBankItemOpcode(WorldPackets::Bank::AutoBankItem& pa
if (!CanUseBank())
{
- TC_LOG_ERROR("network", "WORLD: HandleAutoBankItemOpcode - Unit ({}) not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid.ToString());
+ TC_LOG_ERROR("network", "WORLD: HandleAutoBankItemOpcode - Unit ({}) not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid);
return;
}
@@ -106,7 +106,7 @@ void WorldSession::HandleAutoStoreBankItemOpcode(WorldPackets::Bank::AutoStoreBa
if (!CanUseBank())
{
- TC_LOG_ERROR("network", "WORLD: HandleAutoStoreBankItemOpcode - Unit ({}) not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid.ToString());
+ TC_LOG_ERROR("network", "WORLD: HandleAutoStoreBankItemOpcode - Unit ({}) not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid);
return;
}
@@ -144,67 +144,129 @@ void WorldSession::HandleAutoStoreBankItemOpcode(WorldPackets::Bank::AutoStoreBa
}
}
-void WorldSession::HandleBuyBankSlotOpcode(WorldPackets::Bank::BuyBankSlot& packet)
+void WorldSession::HandleBuyBankTab(WorldPackets::Bank::BuyBankTab const& buyBankTab)
{
- if (!CanUseBank(packet.Guid))
+ if (!CanUseBank(buyBankTab.Banker))
{
- TC_LOG_ERROR("network", "WORLD: HandleBuyBankSlotOpcode - {} not found or you can't interact with him.", packet.Guid.ToString());
+ TC_LOG_ERROR("network", "WorldSession::HandleBuyBankTab {} - Banker {} not found or can't interact with him.",
+ _player->GetGUID(), buyBankTab.Banker);
return;
}
- uint32 slot = _player->GetBankBagSlotCount();
+ if (buyBankTab.BankType != BankType::Character)
+ {
+ TC_LOG_DEBUG("network", "WorldSession::HandleBuyBankTab {} - Bank type {} is not supported.",
+ _player->GetGUID(), buyBankTab.BankType);
+ return;
+ }
+
+ uint32 itemId = 0;
+ uint8 slot = 0;
+ uint8 inventorySlot = 0;
+
+ switch (buyBankTab.BankType)
+ {
+ case BankType::Character:
+ itemId = ITEM_CHARACTER_BANK_TAB_BAG;
+ slot = _player->GetCharacterBankTabCount();
+ inventorySlot = BANK_SLOT_BAG_START;
+ break;
+ case BankType::Account:
+ itemId = ITEM_ACCOUNT_BANK_TAB_BAG;
+ slot = _player->GetAccountBankTabCount();
+ inventorySlot = ACCOUNT_BANK_SLOT_BAG_START;
+ break;
+ default:
+ TC_LOG_DEBUG("network", "WorldSession::HandleBuyBankTab {} - Bank type {} is not supported.",
+ _player->GetGUID(), buyBankTab.BankType);
+ return;
+ }
// next slot
++slot;
- TC_LOG_INFO("network", "PLAYER: Buy bank bag slot, slot number = {}", slot);
+ auto bankTab = std::ranges::find(sBankTabStore, std::pair(buyBankTab.BankType, int8(slot)),
+ [](BankTabEntry const* bankTab) { return std::pair(BankType(bankTab->BankType), bankTab->OrderIndex); });
- BankBagSlotPricesEntry const* slotEntry = sBankBagSlotPricesStore.LookupEntry(slot);
- if (!slotEntry)
+ if (bankTab == sBankTabStore.end())
return;
- uint32 price = slotEntry->Cost;
-
- if (!_player->HasEnoughMoney(uint64(price)))
+ uint64 price = bankTab->Cost;
+ if (!_player->HasEnoughMoney(price))
return;
- _player->SetBankBagSlotCount(slot);
- _player->ModifyMoney(-int64(price));
-
- _player->UpdateCriteria(CriteriaType::BankSlotsPurchased);
-}
-
-void WorldSession::HandleBuyReagentBankOpcode(WorldPackets::Bank::ReagentBank& reagentBank)
-{
- if (!CanUseBank(reagentBank.Banker))
+ uint16 inventoryPos = 0;
+ InventoryResult msg = _player->CanEquipNewItem(inventorySlot, inventoryPos, itemId, false);
+ if (msg != EQUIP_ERR_OK)
{
- TC_LOG_DEBUG("network", "WORLD: HandleBuyReagentBankOpcode - {} not found or you can't interact with him.", reagentBank.Banker.ToString());
+ _player->SendEquipError(msg, nullptr, nullptr, itemId);
return;
}
- if (_player->IsReagentBankUnlocked())
- {
- TC_LOG_DEBUG("network", "WORLD: HandleBuyReagentBankOpcode - Player ({}, name: {}) tried to unlock reagent bank a 2nd time.", _player->GetGUID().ToString(), _player->GetName());
+ Item* bag = _player->EquipNewItem(inventoryPos, itemId, ItemContext::NONE, true);
+ if (!bag)
return;
+
+ switch (buyBankTab.BankType)
+ {
+ case BankType::Character:
+ _player->SetCharacterBankTabCount(slot);
+ break;
+ case BankType::Account:
+ _player->SetAccountBankTabCount(slot);
+ break;
+ default:
+ break;
}
- constexpr int64 price = 100 * GOLD;
+ _player->ModifyMoney(-int64(price));
- if (!_player->HasEnoughMoney(price))
+ _player->UpdateCriteria(CriteriaType::BankTabPurchased, uint64(buyBankTab.BankType));
+}
+
+void WorldSession::HandleUpdateBankTabSettings(WorldPackets::Bank::UpdateBankTabSettings const& updateBankTabSettings)
+{
+ if (!CanUseBank(updateBankTabSettings.Banker))
{
- TC_LOG_DEBUG("network", "WORLD: HandleBuyReagentBankOpcode - Player ({}, name: {}) without enough gold.", _player->GetGUID().ToString(), _player->GetName());
+ TC_LOG_ERROR("network", "WorldSession::HandleUpdateBankTabSettings {} - Banker {} not found or can't interact with him.",
+ _player->GetGUID(), updateBankTabSettings.Banker);
return;
}
- _player->ModifyMoney(-price);
- _player->UnlockReagentBank();
+ switch (updateBankTabSettings.BankType)
+ {
+ case BankType::Character:
+ if (updateBankTabSettings.Tab >= _player->m_activePlayerData->CharacterBankTabSettings.size())
+ {
+ TC_LOG_DEBUG("network", "WorldSession::HandleUpdateBankTabSettings {} doesn't have bank tab {} in bank type {}.",
+ _player->GetGUID(), updateBankTabSettings.Tab, updateBankTabSettings.BankType);
+ return;
+ }
+ _player->SetCharacterBankTabSettings(updateBankTabSettings.Tab, updateBankTabSettings.Settings.Name,
+ updateBankTabSettings.Settings.Icon, updateBankTabSettings.Settings.Description, updateBankTabSettings.Settings.DepositFlags);
+ break;
+ case BankType::Account:
+ if (updateBankTabSettings.Tab >= _player->m_activePlayerData->AccountBankTabSettings.size())
+ {
+ TC_LOG_DEBUG("network", "WorldSession::HandleUpdateBankTabSettings {} doesn't have bank tab {} in bank type {}.",
+ _player->GetGUID(), updateBankTabSettings.Tab, updateBankTabSettings.BankType);
+ return;
+ }
+ _player->SetAccountBankTabSettings(updateBankTabSettings.Tab, updateBankTabSettings.Settings.Name,
+ updateBankTabSettings.Settings.Icon, updateBankTabSettings.Settings.Description, updateBankTabSettings.Settings.DepositFlags);
+ break;
+ default:
+ TC_LOG_DEBUG("network", "WorldSession::HandleUpdateBankTabSettings {} - Bank type {} is not supported.",
+ _player->GetGUID(), updateBankTabSettings.BankType);
+ break;
+ }
}
-void WorldSession::HandleReagentBankDepositOpcode(WorldPackets::Bank::ReagentBank& reagentBank)
+void WorldSession::HandleAutoDepositCharacterBank(WorldPackets::Bank::AutoDepositCharacterBank const& autoDepositCharacterBank)
{
- if (!CanUseBank(reagentBank.Banker))
+ if (!CanUseBank(autoDepositCharacterBank.Banker))
{
- TC_LOG_DEBUG("network", "WORLD: HandleReagentBankDepositOpcode - {} not found or you can't interact with him.", reagentBank.Banker.ToString());
+ TC_LOG_DEBUG("network", "WORLD: HandleReagentBankDepositOpcode - {} not found or you can't interact with him.", autoDepositCharacterBank.Banker);
return;
}
@@ -240,88 +302,6 @@ void WorldSession::HandleReagentBankDepositOpcode(WorldPackets::Bank::ReagentBan
}
}
-void WorldSession::HandleAutoBankReagentOpcode(WorldPackets::Bank::AutoBankReagent& autoBankReagent)
-{
- if (!CanUseBank())
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAutoBankReagentOpcode - {} not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid.ToString());
- return;
- }
-
- if (!_player->IsReagentBankUnlocked())
- {
- _player->SendEquipError(EQUIP_ERR_REAGENT_BANK_LOCKED);
- return;
- }
-
- Item* item = _player->GetItemByPos(autoBankReagent.PackSlot, autoBankReagent.Slot);
- if (!item)
- return;
-
- ItemPosCountVec dest;
- InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, item, false, true, true);
- if (msg != EQUIP_ERR_OK)
- {
- _player->SendEquipError(msg, item, nullptr);
- return;
- }
-
- if (dest.size() == 1 && dest[0].pos == item->GetPos())
- {
- _player->SendEquipError(EQUIP_ERR_CANT_SWAP, item, nullptr);
- return;
- }
-
- _player->RemoveItem(autoBankReagent.PackSlot, autoBankReagent.Slot, true);
- _player->BankItem(dest, item, true);
-}
-
-void WorldSession::HandleAutoStoreBankReagentOpcode(WorldPackets::Bank::AutoStoreBankReagent& autoStoreBankReagent)
-{
- if (!CanUseBank())
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAutoBankReagentOpcode - {} not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid.ToString());
- return;
- }
-
- if (!_player->IsReagentBankUnlocked())
- {
- _player->SendEquipError(EQUIP_ERR_REAGENT_BANK_LOCKED);
- return;
- }
-
- Item* pItem = _player->GetItemByPos(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot);
- 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);
- if (msg != EQUIP_ERR_OK)
- {
- _player->SendEquipError(msg, pItem, nullptr);
- return;
- }
-
- _player->RemoveItem(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot, true);
- _player->BankItem(dest, pItem, true);
- }
-}
-
void WorldSession::SendShowBank(ObjectGuid guid, PlayerInteractionType interactionType)
{
_player->PlayerTalkClass->GetInteractionData().StartInteraction(guid, interactionType);