CMSG_CHANGE_BANK_BAG_SLOT_FLAG and housing fix

This commit is contained in:
luis
2026-10-09 15:52:46 -03:00
parent 8b0d745c52
commit b34c83d2ea
5 changed files with 47 additions and 2 deletions
+17
View File
@@ -1593,6 +1593,23 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
SetUpdateFieldValue(setter.ModifyValue(&UF::BankTabSettings::Description), description);
SetUpdateFieldValue(setter.ModifyValue(&UF::BankTabSettings::DepositFlags), int32(depositFlags));
}
// CMSG_CHANGE_BANK_BAG_SLOT_FLAG flips one deposit flag without resending the tab's name, icon and
// description, which SetBankTabSettings would rewrite as well.
void SetCharacterBankTabDepositFlag(uint32 tabId, BagSlotFlags flag, bool on)
{
SetBankTabDepositFlag(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::CharacterBankTabSettings, tabId), flag, on);
}
void SetAccountBankTabDepositFlag(uint32 tabId, BagSlotFlags flag, bool on)
{
SetBankTabDepositFlag(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::AccountBankTabSettings, tabId), flag, on);
}
void SetBankTabDepositFlag(UF::MutableFieldReferenceWithChangesMask<UF::BankTabSettings, false> setter, BagSlotFlags flag, bool on)
{
if (on)
SetUpdateFieldFlagValue(setter.ModifyValue(&UF::BankTabSettings::DepositFlags), int32(flag));
else
RemoveUpdateFieldFlagValue(setter.ModifyValue(&UF::BankTabSettings::DepositFlags), int32(flag));
}
bool IsBackpackAutoSortDisabled() const { return m_activePlayerData->BackpackAutoSortDisabled; }
void SetBackpackAutoSortDisabled(bool disabled) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BackpackAutoSortDisabled), disabled); }
bool IsBackpackSellJunkDisabled() const { return m_activePlayerData->BackpackSellJunkDisabled; }
+1 -1
View File
@@ -2655,7 +2655,7 @@ void WorldSession::HandleHousingRoomRemove(WorldPackets::Housing::HousingRoomRem
// claiming a player standing over the removed floors: drop them one storey below
// the cut instead of letting them fall through the shaft.
bool relocated = false;
if (!removedCells.empty())
if (housing->GetEditorMode() != HOUSING_EDITOR_MODE_LAYOUT && !removedCells.empty())
if (NeighborhoodMapData const* interiorData = sHousingMgr.GetNeighborhoodMapDataForWorldMap(HOUSE_INTERIOR_MAP_ID))
{
constexpr float FLOOR_HEIGHT = 12.0f;
+26
View File
@@ -1344,6 +1344,32 @@ void WorldSession::HandleChangeBagSlotFlag(WorldPackets::Item::ChangeBagSlotFlag
_player->RemoveBagSlotFlag(changeBagSlotFlag.BagIndex, changeBagSlotFlag.FlagToChange);
}
void WorldSession::HandleChangeBankBagSlotFlag(WorldPackets::Item::ChangeBankBagSlotFlag const& changeBankBagSlotFlag)
{
// The bank twin of HandleChangeBagSlotFlag. A bank bag slot is a bank tab server-side: tab i occupies
// BANK_SLOT_BAG_START + i for the character bank and ACCOUNT_BANK_SLOT_BAG_START + i for the account
// bank (Player::CanBankItem, TryAutoDepositItem), and DepositFlags - a BagSlotFlags bitset, the same
// type FlagToChange is declared as - is the only flag state such a slot carries. Those flags decide
// where AutoBankItem puts an item (PickAutoDepositTab), so leaving this opcode unwired meant the
// per-tab deposit priorities the client lets you set could never change after the tab was bought.
//
// Unlike CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS this packet carries no BankType, so both spellings of
// the index are accepted: a 0-based tab index, which is what the client uses in its other bank packets,
// and an absolute bag slot. The ranges cannot collide - a bank never holds BANK_SLOT_BAG_START tabs -
// so a value resolves one way only. A 0-based index meant for the account bank is indistinguishable
// from a character one and is left unhandled (CAPTURE-BLOCKED).
uint32 const characterTabCount = _player->m_activePlayerData->CharacterBankTabSettings.size();
uint32 const accountTabCount = _player->m_activePlayerData->AccountBankTabSettings.size();
uint8 const bagIndex = changeBankBagSlotFlag.BagIndex;
if (bagIndex < characterTabCount)
_player->SetCharacterBankTabDepositFlag(bagIndex, changeBankBagSlotFlag.FlagToChange, changeBankBagSlotFlag.On);
else if (bagIndex >= BANK_SLOT_BAG_START && uint32(bagIndex - BANK_SLOT_BAG_START) < characterTabCount)
_player->SetCharacterBankTabDepositFlag(bagIndex - BANK_SLOT_BAG_START, changeBankBagSlotFlag.FlagToChange, changeBankBagSlotFlag.On);
else if (bagIndex >= ACCOUNT_BANK_SLOT_BAG_START && uint32(bagIndex - ACCOUNT_BANK_SLOT_BAG_START) < accountTabCount)
_player->SetAccountBankTabDepositFlag(bagIndex - ACCOUNT_BANK_SLOT_BAG_START, changeBankBagSlotFlag.FlagToChange, changeBankBagSlotFlag.On);
}
void WorldSession::HandleSetBackpackAutosortDisabled(WorldPackets::Item::SetBackpackAutosortDisabled const& setBackpackAutosortDisabled)
{
_player->SetBackpackAutoSortDisabled(setBackpackAutosortDisabled.Disable);
+1 -1
View File
@@ -288,7 +288,7 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_CATALOG_SHOP_LICENSE_GAME_DATA_REQUEST, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCatalogShopLicenseGameDataRequest);
DEFINE_HANDLER(CMSG_CHALLENGE_MODE_REQUEST_LEADERS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChallengeModeRequestLeaders);
DEFINE_HANDLER(CMSG_CHANGE_BAG_SLOT_FLAG, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChangeBagSlotFlag);
DEFINE_HANDLER(CMSG_CHANGE_BANK_BAG_SLOT_FLAG, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CHANGE_BANK_BAG_SLOT_FLAG, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChangeBankBagSlotFlag);
DEFINE_HANDLER(CMSG_CHANGE_MONUMENT_APPEARANCE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChangeMonumentAppearance);
DEFINE_HANDLER(CMSG_CHANGE_REALM_TICKET, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlenetChangeRealmTicket);
DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSubGroupOpcode);
+2
View File
@@ -698,6 +698,7 @@ namespace WorldPackets
struct ItemInstance;
class RemoveNewItem;
class ChangeBagSlotFlag;
class ChangeBankBagSlotFlag;
class SetBackpackAutosortDisabled;
class SetBackpackSellJunkDisabled;
class SetBankAutosortDisabled;
@@ -2216,6 +2217,7 @@ public:
void HandleWrapItem(WorldPackets::Item::WrapItem& packet);
void HandleUseCritterItem(WorldPackets::Item::UseCritterItem& packet);
void HandleChangeBagSlotFlag(WorldPackets::Item::ChangeBagSlotFlag const& changeBagSlotFlag);
void HandleChangeBankBagSlotFlag(WorldPackets::Item::ChangeBankBagSlotFlag const& changeBankBagSlotFlag);
void HandleSetBackpackAutosortDisabled(WorldPackets::Item::SetBackpackAutosortDisabled const& setBackpackAutosortDisabled);
void HandleSetBackpackSellJunkDisabled(WorldPackets::Item::SetBackpackSellJunkDisabled const& setBackpackSellJunkDisabled);
void HandleSetBankAutosortDisabled(WorldPackets::Item::SetBankAutosortDisabled const& setBankAutosortDisabled);