From 08c831460929046cc9c07ae5b471572ba62d303b Mon Sep 17 00:00:00 2001 From: agatho Date: Fri, 13 Feb 2026 12:36:07 +0100 Subject: [PATCH] Core/PacketIO: Implement CMSG_SET_CURRENCY_FLAGS (#31673) --- src/server/game/Entities/Player/Player.cpp | 15 +++++++++++++++ src/server/game/Entities/Player/Player.h | 1 + src/server/game/Handlers/MiscHandler.cpp | 5 +++++ src/server/game/Server/Packets/MiscPackets.cpp | 6 ++++++ src/server/game/Server/Packets/MiscPackets.h | 11 +++++++++++ src/server/game/Server/Protocol/Opcodes.cpp | 2 +- src/server/game/Server/WorldSession.h | 2 ++ 7 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 276a8d6f7b..a0d307e8bb 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7446,6 +7446,21 @@ bool Player::HasCurrency(uint32 id, uint32 amount) const return itr != _currencyStorage.end() && itr->second.Quantity >= amount; } +void Player::SetCurrencyFlagsFromClient(uint32 id, CurrencyDbFlags flags) +{ + PlayerCurrenciesMap::iterator itr = _currencyStorage.find(id); + if (itr == _currencyStorage.end()) + return; + + CurrencyDbFlags newValue = (flags & CurrencyDbFlags::ClientFlags) | (itr->second.Flags & ~CurrencyDbFlags::ClientFlags); + if (itr->second.Flags == newValue) + return; + + itr->second.Flags = newValue; + if (itr->second.state != PLAYERCURRENCY_NEW) + itr->second.state = PLAYERCURRENCY_CHANGED; +} + void Player::SetInGuild(ObjectGuid::LowType guildId) { if (guildId) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 6b3680eecd..db19970162 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1543,6 +1543,7 @@ class TC_GAME_API Player final : public Unit, public GridObject uint32 GetCurrencyWeeklyCap(uint32 id) const; uint32 GetCurrencyWeeklyCap(CurrencyTypesEntry const* currency) const; bool HasCurrency(uint32 id, uint32 amount) const; + void SetCurrencyFlagsFromClient(uint32 id, CurrencyDbFlags flags); void SetInvSlot(uint32 slot, ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::InvSlots, slot), guid); } diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 8087463d58..b2c6ef8cbf 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1222,3 +1222,8 @@ void WorldSession::HandleQueryCountdownTimer(WorldPackets::Misc::QueryCountdownT _player->SendDirectMessage(startTimer.Write()); } + +void WorldSession::HandleSetCurrencyFlags(WorldPackets::Misc::SetCurrencyFlags const& setCurrenctFlags) +{ + _player->SetCurrencyFlagsFromClient(setCurrenctFlags.CurrencyID, setCurrenctFlags.Flags); +} diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index a288dc3d84..f4eefab796 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -108,6 +108,12 @@ WorldPacket const* SetCurrency::Write() return &_worldPacket; } +void SetCurrencyFlags::Read() +{ + _worldPacket >> CurrencyID; + _worldPacket >> As(Flags); +} + void SetSelection::Read() { _worldPacket >> Selection; diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index bde4c02d4f..5df03d8c2f 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -123,6 +123,17 @@ namespace WorldPackets bool SuppressChatLog = false; }; + class SetCurrencyFlags final : public ClientPacket + { + public: + explicit SetCurrencyFlags(WorldPacket&& packet) : ClientPacket(CMSG_SET_CURRENCY_FLAGS, std::move(packet)) { } + + void Read() override; + + uint32 CurrencyID = 0; + CurrencyDbFlags Flags = { }; + }; + class SetSelection final : public ClientPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 7e64670d18..65a34431c0 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1011,7 +1011,7 @@ void OpcodeTable::InitializeClientOpcodes() 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_CURRENCY_FLAGS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetCurrencyFlags); DEFINE_HANDLER(CMSG_SET_DIFFICULTY_ID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_DUNGEON_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetDungeonDifficultyOpcode); DEFINE_HANDLER(CMSG_SET_EMPOWER_MIN_HOLD_STAGE_PERCENT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetEmpowerMinHoldStagePercent); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 894835e81f..cef8e827f5 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -537,6 +537,7 @@ namespace WorldPackets class ConversationLineStarted; class RequestLatestSplashScreen; class QueryCountdownTimer; + class SetCurrencyFlags; } namespace Movement @@ -1805,6 +1806,7 @@ class TC_GAME_API WorldSession void HandleConversationLineStarted(WorldPackets::Misc::ConversationLineStarted& conversationLineStarted); void HandleKeyboundOverride(WorldPackets::Spells::KeyboundOverride& keyboundOverride); void HandleQueryCountdownTimer(WorldPackets::Misc::QueryCountdownTimer& queryCountdownTimer); + void HandleSetCurrencyFlags(WorldPackets::Misc::SetCurrencyFlags const& setCurrenctFlags); // Adventure Journal void HandleAdventureJournalOpenQuest(WorldPackets::AdventureJournal::AdventureJournalOpenQuest& openQuest);