aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/base/characters_database.sql17
-rw-r--r--sql/updates/characters/master/2024_04_28_00_characters.sql15
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp11
-rw-r--r--src/server/game/Entities/Player/Player.cpp60
-rw-r--r--src/server/game/Entities/Player/Player.h28
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp37
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp29
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h55
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp10
-rw-r--r--src/server/game/Server/WorldSession.h10
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);