diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-04-29 00:06:02 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-04-29 00:06:02 +0200 |
commit | cc9241784491198581a19f3f5502a42d048ea063 (patch) | |
tree | 323d98827c0d81464cd767207e8d523448599351 | |
parent | 9dcc6c020763e5a79e9d73b364a73b00d63ce734 (diff) |
Core/Items: Implemented packets setting up inventory cleanup parameters
-rw-r--r-- | sql/base/characters_database.sql | 17 | ||||
-rw-r--r-- | sql/updates/characters/master/2024_04_28_00_characters.sql | 15 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 60 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 28 | ||||
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 37 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ItemPackets.cpp | 29 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ItemPackets.h | 55 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 10 |
10 files changed, 261 insertions, 11 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index ca06f8a717f..3aa5babc9d9 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1891,7 +1891,21 @@ CREATE TABLE `characters` ( `xp` int unsigned NOT NULL DEFAULT '0', `money` bigint unsigned NOT NULL DEFAULT '0', `inventorySlots` tinyint unsigned NOT NULL DEFAULT '16', + `inventoryBagFlags` int unsigned NOT NULL DEFAULT '0', + `bagSlotFlags1` int unsigned NOT NULL DEFAULT '0', + `bagSlotFlags2` int unsigned NOT NULL DEFAULT '0', + `bagSlotFlags3` int unsigned NOT NULL DEFAULT '0', + `bagSlotFlags4` int unsigned NOT NULL DEFAULT '0', + `bagSlotFlags5` int unsigned NOT NULL DEFAULT '0', `bankSlots` tinyint unsigned NOT NULL DEFAULT '0', + `bankBagFlags` int unsigned NOT NULL DEFAULT '0', + `bankBagSlotFlags1` int unsigned NOT NULL DEFAULT '0', + `bankBagSlotFlags2` int unsigned NOT NULL DEFAULT '0', + `bankBagSlotFlags3` int unsigned NOT NULL DEFAULT '0', + `bankBagSlotFlags4` int unsigned NOT NULL DEFAULT '0', + `bankBagSlotFlags5` int unsigned NOT NULL DEFAULT '0', + `bankBagSlotFlags6` int unsigned NOT NULL DEFAULT '0', + `bankBagSlotFlags7` int unsigned NOT NULL DEFAULT '0', `restState` tinyint unsigned NOT NULL DEFAULT '0', `playerFlags` int unsigned NOT NULL DEFAULT '0', `playerFlagsEx` int unsigned NOT NULL DEFAULT '0', @@ -3725,7 +3739,8 @@ INSERT INTO `updates` VALUES ('2023_11_15_00_characters.sql','441E0F17DE3E3945307AC400DF86FCDF06C61653','ARCHIVED','2023-11-15 00:53:47',0), ('2024_02_08_00_characters.sql','743A11042AA17CDBD5F3D510D24509A10838DB5A','ARCHIVED','2024-02-08 00:56:26',0), ('2024_04_09_00_characters.sql','07AC79B4E489B1CD073852EC57D12939C2A1D4B1','RELEASED','2024-04-09 12:54:11',0), -('2024_04_12_00_characters.sql','043E023F998DA77170C9D2D0162CAA340290B215','RELEASED','2024-04-12 00:23:51',0); +('2024_04_12_00_characters.sql','043E023F998DA77170C9D2D0162CAA340290B215','RELEASED','2024-04-12 00:23:51',0), +('2024_04_28_00_characters.sql','F80F476704BE535B5DCB0BCEBDD56024FCFBBAA2','RELEASED','2024-04-28 19:26:58',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/characters/master/2024_04_28_00_characters.sql b/sql/updates/characters/master/2024_04_28_00_characters.sql new file mode 100644 index 00000000000..c17aa412b08 --- /dev/null +++ b/sql/updates/characters/master/2024_04_28_00_characters.sql @@ -0,0 +1,15 @@ +ALTER TABLE `characters` + ADD `inventoryBagFlags` int unsigned NOT NULL DEFAULT '0' AFTER `inventorySlots`, + ADD `bagSlotFlags1` int unsigned NOT NULL DEFAULT '0' AFTER `inventoryBagFlags`, + ADD `bagSlotFlags2` int unsigned NOT NULL DEFAULT '0' AFTER `bagSlotFlags1`, + ADD `bagSlotFlags3` int unsigned NOT NULL DEFAULT '0' AFTER `bagSlotFlags2`, + ADD `bagSlotFlags4` int unsigned NOT NULL DEFAULT '0' AFTER `bagSlotFlags3`, + ADD `bagSlotFlags5` int unsigned NOT NULL DEFAULT '0' AFTER `bagSlotFlags4`, + ADD `bankBagFlags` int unsigned NOT NULL DEFAULT '0' AFTER `bankSlots`, + ADD `bankBagSlotFlags1` int unsigned NOT NULL DEFAULT '0' AFTER `bankBagFlags`, + ADD `bankBagSlotFlags2` int unsigned NOT NULL DEFAULT '0' AFTER `bankBagSlotFlags1`, + ADD `bankBagSlotFlags3` int unsigned NOT NULL DEFAULT '0' AFTER `bankBagSlotFlags2`, + ADD `bankBagSlotFlags4` int unsigned NOT NULL DEFAULT '0' AFTER `bankBagSlotFlags3`, + ADD `bankBagSlotFlags5` int unsigned NOT NULL DEFAULT '0' AFTER `bankBagSlotFlags4`, + ADD `bankBagSlotFlags6` int unsigned NOT NULL DEFAULT '0' AFTER `bankBagSlotFlags5`, + ADD `bankBagSlotFlags7` int unsigned NOT NULL DEFAULT '0' AFTER `bankBagSlotFlags6`; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index a4f9520ff6b..ff970015a02 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -92,7 +92,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " + PrepareStatement(CHAR_SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, inventoryBagFlags, bagSlotFlags1, bagSlotFlags2, bagSlotFlags3, bagSlotFlags4, bagSlotFlags5, " + "bankSlots, bankBagFlags, bankBagSlotFlags1, bankBagSlotFlags2, bankBagSlotFlags3, bankBagSlotFlags4, bankBagSlotFlags5, bankBagSlotFlags6, bankBagSlotFlags7, restState, playerFlags, playerFlagsEx, " "position_x, position_y, position_z, map, orientation, taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, summonedPetNumber, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " @@ -473,7 +474,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_LFG_DATA, "DELETE FROM lfg_data WHERE guid = ?", CONNECTION_ASYNC); // Player saving - PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " + PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, inventorySlots, inventoryBagFlags, bagSlotFlags1, bagSlotFlags2, bagSlotFlags3, bagSlotFlags4, bagSlotFlags5, " + "bankSlots, bankBagFlags, bankBagSlotFlags1, bankBagSlotFlags2, bankBagSlotFlags3, bankBagSlotFlags4, bankBagSlotFlags5, bankBagSlotFlags6, bankBagSlotFlags7, restState, playerFlags, playerFlagsEx, " "map, instance_id, dungeonDifficulty, raidDifficulty, legacyRaidDifficulty, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, " "taximask, createTime, createMode, cinematic, " "totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " @@ -481,8 +483,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() "death_expire_time, taxi_path, totalKills, " "todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " "power4, power5, power6, power7, power8, power9, power10, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,inventorySlots=?,inventoryBagFlags=?,bagSlotFlags1=?,bagSlotFlags2=?,bagSlotFlags3=?,bagSlotFlags4=?,bagSlotFlags5=?," + "bankSlots=?,bankBagFlags=?,bankBagSlotFlags1=?,bankBagSlotFlags2=?,bankBagSlotFlags3=?,bankBagSlotFlags4=?,bankBagSlotFlags5=?,bankBagSlotFlags6=?,bankBagSlotFlags7=?,restState=?,playerFlags=?,playerFlagsEx=?," "map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,numRespecs=?,primarySpecialization=?,extra_flags=?,summonedPetNumber=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0d59ce555ac..85f9cdaf74d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -17628,7 +17628,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol struct PlayerLoadData { - // "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " + // "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, inventoryBagFlags, bagSlotFlags1, bagSlotFlags2, bagSlotFlags3, bagSlotFlags4, bagSlotFlags5, " + // "bankSlots, bankBagFlags, bankBagSlotFlags1, bankBagSlotFlags2, bankBagSlotFlags3, bankBagSlotFlags4, bankBagSlotFlags5, bankBagSlotFlags6, bankBagSlotFlags7, restState, playerFlags, playerFlagsEx, " // "position_x, position_y, position_z, map, orientation, taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " // "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, summonedPetNumber, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " // "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " @@ -17647,7 +17648,11 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol uint32 xp; uint64 money; uint8 inventorySlots; + EnumFlag<BagSlotFlags> inventoryBagFlags = BagSlotFlags::None; + std::array<BagSlotFlags, 5> bagSlotFlags; uint8 bankSlots; + EnumFlag<BagSlotFlags> bankBagFlags = BagSlotFlags::None; + std::array<BagSlotFlags, 7> bankBagSlotFlags; PlayerRestState restState; PlayerFlags playerFlags; PlayerFlagsEx playerFlagsEx; @@ -17722,7 +17727,13 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol xp = fields[i++].GetUInt32(); money = fields[i++].GetUInt64(); inventorySlots = fields[i++].GetUInt8(); + inventoryBagFlags = static_cast<BagSlotFlags>(fields[i++].GetUInt32()); + for (BagSlotFlags& flags : bagSlotFlags) + flags = static_cast<BagSlotFlags>(fields[i++].GetUInt32()); bankSlots = fields[i++].GetUInt8(); + bankBagFlags = static_cast<BagSlotFlags>(fields[i++].GetUInt32()); + for (BagSlotFlags& flags : bankBagSlotFlags) + flags = static_cast<BagSlotFlags>(fields[i++].GetUInt32()); restState = PlayerRestState(fields[i++].GetUInt8()); playerFlags = PlayerFlags(fields[i++].GetUInt32()); playerFlagsEx = PlayerFlagsEx(fields[i++].GetUInt32()); @@ -17877,7 +17888,14 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol SetCustomizations(Trinity::Containers::MakeIteratorPair(customizations.begin(), customizations.end()), false); SetInventorySlotCount(fields.inventorySlots); + SetBackpackAutoSortDisabled(fields.inventoryBagFlags.HasFlag(BagSlotFlags::DisableAutoSort)); + SetBackpackSellJunkDisabled(fields.inventoryBagFlags.HasFlag(BagSlotFlags::ExcludeJunkSell)); + for (uint32 bagIndex = 0; bagIndex < fields.bagSlotFlags.size(); ++bagIndex) + ReplaceAllBagSlotFlags(bagIndex, fields.bagSlotFlags[bagIndex]); SetBankBagSlotCount(fields.bankSlots); + SetBankAutoSortDisabled(fields.bankBagFlags.HasFlag(BagSlotFlags::DisableAutoSort)); + for (uint32 bagIndex = 0; bagIndex < fields.bankBagSlotFlags.size(); ++bagIndex) + ReplaceAllBankBagSlotFlags(bagIndex, fields.bankBagSlotFlags[bagIndex]); SetNativeGender(fields.gender); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::Inebriation), fields.drunk); ReplaceAllPlayerFlags(fields.playerFlags); @@ -20034,7 +20052,27 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba stmt->setUInt32(index++, GetXP()); stmt->setUInt64(index++, GetMoney()); stmt->setUInt8(index++, GetInventorySlotCount()); + stmt->setUInt32(index++, [&] + { + BagSlotFlags inventoryFlags = BagSlotFlags::None; + if (m_activePlayerData->BackpackAutoSortDisabled) + inventoryFlags |= BagSlotFlags::DisableAutoSort; + if (m_activePlayerData->BackpackSellJunkDisabled) + inventoryFlags |= BagSlotFlags::ExcludeJunkSell; + return AsUnderlyingType(inventoryFlags); + }()); + for (uint32 bagSlotFlag : m_activePlayerData->BagSlotFlags) + stmt->setUInt32(index++, bagSlotFlag); stmt->setUInt8(index++, GetBankBagSlotCount()); + stmt->setUInt32(index++, [&] + { + BagSlotFlags inventoryFlags = BagSlotFlags::None; + if (m_activePlayerData->BankAutoSortDisabled) + inventoryFlags |= BagSlotFlags::DisableAutoSort; + return AsUnderlyingType(inventoryFlags); + }()); + for (uint32 bankBagSlotFlag : m_activePlayerData->BankBagSlotFlags) + stmt->setUInt32(index++, bankBagSlotFlag); stmt->setUInt8(index++, m_activePlayerData->RestInfo[REST_TYPE_XP].StateID); stmt->setUInt32(index++, m_playerData->PlayerFlags); stmt->setUInt32(index++, m_playerData->PlayerFlagsEx); @@ -20151,7 +20189,27 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba stmt->setUInt32(index++, GetXP()); stmt->setUInt64(index++, GetMoney()); stmt->setUInt8(index++, GetInventorySlotCount()); + stmt->setUInt32(index++, [&] + { + BagSlotFlags inventoryFlags = BagSlotFlags::None; + if (m_activePlayerData->BackpackAutoSortDisabled) + inventoryFlags |= BagSlotFlags::DisableAutoSort; + if (m_activePlayerData->BackpackSellJunkDisabled) + inventoryFlags |= BagSlotFlags::ExcludeJunkSell; + return AsUnderlyingType(inventoryFlags); + }()); + for (uint32 bagSlotFlag : m_activePlayerData->BagSlotFlags) + stmt->setUInt32(index++, bagSlotFlag); stmt->setUInt8(index++, GetBankBagSlotCount()); + stmt->setUInt32(index++, [&] + { + BagSlotFlags inventoryFlags = BagSlotFlags::None; + if (m_activePlayerData->BankAutoSortDisabled) + inventoryFlags |= BagSlotFlags::DisableAutoSort; + return AsUnderlyingType(inventoryFlags); + }()); + for (uint32 bankBagSlotFlag : m_activePlayerData->BankBagSlotFlags) + stmt->setUInt32(index++, bankBagSlotFlag); stmt->setUInt8(index++, m_activePlayerData->RestInfo[REST_TYPE_XP].StateID); stmt->setUInt32(index++, m_playerData->PlayerFlags); stmt->setUInt32(index++, m_playerData->PlayerFlagsEx); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 5b8d4ed20e0..758c3ccd28a 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -768,6 +768,20 @@ enum class ItemSearchCallbackResult Continue }; +enum class BagSlotFlags : uint32 +{ + None = 0x00, + DisableAutoSort = 0x01, + PriorityEquipment = 0x02, + PriorityConsumables = 0x04, + PriorityTradeGoods = 0x08, + PriorityJunk = 0x10, + PriorityQuestItems = 0x20, + ExcludeJunkSell = 0x40, +}; + +DEFINE_ENUM_FLAG(BagSlotFlags); + enum NewWorldReason { NEW_WORLD_NORMAL = 16, // Normal map change @@ -1383,6 +1397,20 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void SetInventorySlotCount(uint8 slots); uint8 GetBankBagSlotCount() const { return m_activePlayerData->NumBankSlots; } void SetBankBagSlotCount(uint8 count) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::NumBankSlots), count); } + 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; } + void SetBackpackSellJunkDisabled(bool disabled) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BackpackSellJunkDisabled), disabled); } + bool IsBankAutoSortDisabled() const { return m_activePlayerData->BankAutoSortDisabled; } + void SetBankAutoSortDisabled(bool disabled) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BankAutoSortDisabled), disabled); } + EnumFlag<BagSlotFlags> GetBagSlotFlags(uint32 bagIndex) const { return static_cast<BagSlotFlags>(m_activePlayerData->BagSlotFlags[bagIndex]); } + void SetBagSlotFlag(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BagSlotFlags, bagIndex), flags.AsUnderlyingType()); } + void RemoveBagSlotFlag(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BagSlotFlags, bagIndex), flags.AsUnderlyingType()); } + void ReplaceAllBagSlotFlags(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BagSlotFlags, bagIndex), flags.AsUnderlyingType()); } + EnumFlag<BagSlotFlags> GetBankBagSlotFlags(uint32 bagIndex) const { return static_cast<BagSlotFlags>(m_activePlayerData->BankBagSlotFlags[bagIndex]); } + void SetBankBagSlotFlag(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BankBagSlotFlags, bagIndex), flags.AsUnderlyingType()); } + void RemoveBankBagSlotFlag(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BankBagSlotFlags, bagIndex), flags.AsUnderlyingType()); } + void ReplaceAllBankBagSlotFlags(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BankBagSlotFlags, bagIndex), flags.AsUnderlyingType()); } bool HasItemCount(uint32 item, uint32 count = 1, bool inBankAlso = false) const; bool HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item const* ignoreItem = nullptr) const; bool CanNoReagentCast(SpellInfo const* spellInfo) const; diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 224a5aea0bf..eb7bfa32d7a 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1251,3 +1251,40 @@ void WorldSession::HandleRemoveNewItem(WorldPackets::Item::RemoveNewItem& remove item->SetState(ITEM_CHANGED, _player); } } + +void WorldSession::HandleChangeBagSlotFlag(WorldPackets::Item::ChangeBagSlotFlag const& changeBagSlotFlag) +{ + if (changeBagSlotFlag.BagIndex >= _player->m_activePlayerData->BagSlotFlags.size()) + return; + + if (changeBagSlotFlag.On) + _player->SetBagSlotFlag(changeBagSlotFlag.BagIndex, changeBagSlotFlag.FlagToChange); + else + _player->RemoveBagSlotFlag(changeBagSlotFlag.BagIndex, changeBagSlotFlag.FlagToChange); +} + +void WorldSession::HandleChangeBankBagSlotFlag(WorldPackets::Item::ChangeBankBagSlotFlag const& changeBankBagSlotFlag) +{ + if (changeBankBagSlotFlag.BagIndex >= _player->m_activePlayerData->BankBagSlotFlags.size()) + return; + + if (changeBankBagSlotFlag.On) + _player->SetBankBagSlotFlag(changeBankBagSlotFlag.BagIndex, changeBankBagSlotFlag.FlagToChange); + else + _player->RemoveBankBagSlotFlag(changeBankBagSlotFlag.BagIndex, changeBankBagSlotFlag.FlagToChange); +} + +void WorldSession::HandleSetBackpackAutosortDisabled(WorldPackets::Item::SetBackpackAutosortDisabled const& setBackpackAutosortDisabled) +{ + _player->SetBackpackAutoSortDisabled(setBackpackAutosortDisabled.Disable); +} + +void WorldSession::HandleSetBackpackSellJunkDisabled(WorldPackets::Item::SetBackpackSellJunkDisabled const& setBackpackSellJunkDisabled) +{ + _player->SetBackpackSellJunkDisabled(setBackpackSellJunkDisabled.Disable); +} + +void WorldSession::HandleSetBankAutosortDisabled(WorldPackets::Item::SetBankAutosortDisabled const& setBankAutosortDisabled) +{ + _player->SetBankAutoSortDisabled(setBankAutosortDisabled.Disable); +} diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index ff26b92fd15..b4bb558bac6 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -373,3 +373,32 @@ void WorldPackets::Item::RemoveNewItem::Read() { _worldPacket >> ItemGuid; } + +void WorldPackets::Item::ChangeBagSlotFlag::Read() +{ + _worldPacket >> BagIndex; + FlagToChange = _worldPacket.read<BagSlotFlags, uint32>(); + On = _worldPacket.ReadBit(); +} + +void WorldPackets::Item::ChangeBankBagSlotFlag::Read() +{ + _worldPacket >> BagIndex; + FlagToChange = _worldPacket.read<BagSlotFlags, uint32>(); + On = _worldPacket.ReadBit(); +} + +void WorldPackets::Item::SetBackpackAutosortDisabled::Read() +{ + Disable = _worldPacket.ReadBit(); +} + +void WorldPackets::Item::SetBackpackSellJunkDisabled::Read() +{ + Disable = _worldPacket.ReadBit(); +} + +void WorldPackets::Item::SetBankAutosortDisabled::Read() +{ + Disable = _worldPacket.ReadBit(); +} diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index b57417a5936..f0359be4575 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -28,6 +28,7 @@ #include <array> struct VoidStorageItem; +enum class BagSlotFlags : uint32; namespace WorldPackets { @@ -536,6 +537,60 @@ namespace WorldPackets WorldPacket const* Write() override { return &_worldPacket; } }; + + class ChangeBagSlotFlag final : public ClientPacket + { + public: + explicit ChangeBagSlotFlag(WorldPacket&& packet) : ClientPacket(CMSG_CHANGE_BAG_SLOT_FLAG, std::move(packet)) { } + + void Read() override; + + uint32 BagIndex = 0; + BagSlotFlags FlagToChange = { }; + bool On = false; + }; + + class ChangeBankBagSlotFlag final : public ClientPacket + { + public: + explicit ChangeBankBagSlotFlag(WorldPacket&& packet) : ClientPacket(CMSG_CHANGE_BANK_BAG_SLOT_FLAG, std::move(packet)) { } + + void Read() override; + + uint32 BagIndex = 0; + BagSlotFlags FlagToChange = { }; + bool On = false; + }; + + class SetBackpackAutosortDisabled final : public ClientPacket + { + public: + explicit SetBackpackAutosortDisabled(WorldPacket&& packet) : ClientPacket(CMSG_SET_BACKPACK_AUTOSORT_DISABLED, std::move(packet)) { } + + void Read() override; + + bool Disable = false; + }; + + class SetBackpackSellJunkDisabled final : public ClientPacket + { + public: + explicit SetBackpackSellJunkDisabled(WorldPacket&& packet) : ClientPacket(CMSG_SET_BACKPACK_SELL_JUNK_DISABLED, std::move(packet)) { } + + void Read() override; + + bool Disable = false; + }; + + class SetBankAutosortDisabled final : public ClientPacket + { + public: + explicit SetBankAutosortDisabled(WorldPacket&& packet) : ClientPacket(CMSG_SET_BANK_AUTOSORT_DISABLED, std::move(packet)) { } + + void Read() override; + + bool Disable = false; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 3a7141cb45a..e25b2ef6d74 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -274,8 +274,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleCastSpellOpcode); DEFINE_HANDLER(CMSG_CHALLENGE_MODE_REQUEST_LEADERS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CHANGE_BAG_SLOT_FLAG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CHANGE_BANK_BAG_SLOT_FLAG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + 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::HandleChangeBankBagSlotFlag); DEFINE_HANDLER(CMSG_CHANGE_MONUMENT_APPEARANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_REALM_TICKET, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlenetChangeRealmTicket); DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSubGroupOpcode); @@ -869,9 +869,9 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SET_ACTIVE_MOVER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveMoverOpcode); DEFINE_HANDLER(CMSG_SET_ADVANCED_COMBAT_LOGGING, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetAdvancedCombatLogging); DEFINE_HANDLER(CMSG_SET_ASSISTANT_LEADER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetAssistantLeaderOpcode); - DEFINE_HANDLER(CMSG_SET_BACKPACK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_BACKPACK_SELL_JUNK_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_BANK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_SET_BACKPACK_AUTOSORT_DISABLED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetBackpackAutosortDisabled); + DEFINE_HANDLER(CMSG_SET_BACKPACK_SELL_JUNK_DISABLED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetBackpackSellJunkDisabled); + DEFINE_HANDLER(CMSG_SET_BANK_AUTOSORT_DISABLED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetBankAutosortDisabled); DEFINE_HANDLER(CMSG_SET_CONTACT_NOTES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetContactNotesOpcode); DEFINE_HANDLER(CMSG_SET_CURRENCY_FLAGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_DIFFICULTY_ID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 7b3c8567382..fe569b4a7b2 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -451,6 +451,11 @@ namespace WorldPackets class SortReagentBankBags; struct ItemInstance; class RemoveNewItem; + class ChangeBagSlotFlag; + class ChangeBankBagSlotFlag; + class SetBackpackAutosortDisabled; + class SetBackpackSellJunkDisabled; + class SetBankAutosortDisabled; } namespace LFG @@ -1499,6 +1504,11 @@ class TC_GAME_API WorldSession void HandleBuybackItem(WorldPackets::Item::BuyBackItem& packet); 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); void HandleAttackSwingOpcode(WorldPackets::Combat::AttackSwing& packet); void HandleAttackStopOpcode(WorldPackets::Combat::AttackStop& packet); |