Core/PacketIO: Implement CMSG_SET_CURRENCY_FLAGS (#31673)

This commit is contained in:
agatho
2026-02-13 12:36:07 +01:00
committed by GitHub
parent 0b6d4eaf8e
commit 08c8314609
7 changed files with 41 additions and 1 deletions

View File

@@ -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)

View File

@@ -1543,6 +1543,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
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); }

View File

@@ -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);
}

View File

@@ -108,6 +108,12 @@ WorldPacket const* SetCurrency::Write()
return &_worldPacket;
}
void SetCurrencyFlags::Read()
{
_worldPacket >> CurrencyID;
_worldPacket >> As<uint8>(Flags);
}
void SetSelection::Read()
{
_worldPacket >> Selection;

View File

@@ -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:

View File

@@ -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);

View File

@@ -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);