/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "ChatPackets.h" #include "Creature.h" #include "PacketOperators.h" #include "Player.h" #include "World.h" namespace WorldPackets::Chat { void ChatMessage::Read() { _worldPacket >> Language; _worldPacket >> SizedString::BitsSize<11>(Text); switch (GetOpcode()) { case CMSG_CHAT_MESSAGE_SAY: case CMSG_CHAT_MESSAGE_PARTY: case CMSG_CHAT_MESSAGE_RAID: case CMSG_CHAT_MESSAGE_RAID_WARNING: case CMSG_CHAT_MESSAGE_INSTANCE_CHAT: _worldPacket >> Bits<1>(IsSecure); break; default: break; } _worldPacket >> SizedString::Data(Text); } void ChatMessageWhisper::Read() { _worldPacket >> Language; _worldPacket >> TargetGUID; _worldPacket >> TargetVirtualRealmAddress; _worldPacket >> SizedCString::BitsSize<9>(Target); _worldPacket >> SizedCString::BitsSize<11>(Text); _worldPacket >> SizedCString::Data(Target); _worldPacket >> SizedCString::Data(Text); } void ChatMessageChannel::Read() { _worldPacket >> Language; _worldPacket >> ChannelGUID; _worldPacket >> SizedString::BitsSize<9>(Target); _worldPacket >> SizedString::BitsSize<11>(Text); _worldPacket >> OptionalInit(IsSecure); if (IsSecure) _worldPacket >> Bits<1>(*IsSecure); _worldPacket >> SizedString::Data(Target); _worldPacket >> SizedString::Data(Text); } ByteBuffer& operator>>(ByteBuffer& data, ChatAddonMessageParams& params) { data >> SizedString::BitsSize<5>(params.Prefix); data >> SizedString::BitsSize<8>(params.Text); data >> Bits<1>(params.IsLogged); data >> As(params.Type); data >> SizedString::Data(params.Prefix); data >> SizedString::Data(params.Text); return data; } void ChatAddonMessage::Read() { _worldPacket >> Params; } void ChatAddonMessageTargeted::Read() { _worldPacket >> Params; _worldPacket >> ChannelGUID; _worldPacket >> PlayerGUID; _worldPacket >> PlayerVirtualRealmAddress; _worldPacket >> SizedCString::BitsSize<9>(PlayerName); _worldPacket >> SizedCString::BitsSize<8>(ChannelName); _worldPacket >> SizedCString::Data(PlayerName); _worldPacket >> SizedCString::Data(ChannelName); } void ChatMessageDND::Read() { _worldPacket >> SizedString::BitsSize<11>(Text); _worldPacket >> SizedString::Data(Text); } void ChatMessageAFK::Read() { _worldPacket >> SizedString::BitsSize<11>(Text); _worldPacket >> SizedString::Data(Text); } void ChatMessageEmote::Read() { _worldPacket >> SizedString::BitsSize<11>(Text); _worldPacket >> SizedString::Data(Text); } Chat::Chat(Chat const& chat) : ServerPacket(SMSG_CHAT, chat._worldPacket.size()), SlashCmd(chat.SlashCmd), _Language(chat._Language), SenderGUID(chat.SenderGUID), SenderGuildGUID(chat.SenderGuildGUID), SenderWowAccount(chat.SenderWowAccount), TargetGUID(chat.TargetGUID), SenderVirtualAddress(chat.SenderVirtualAddress), TargetVirtualAddress(chat.TargetVirtualAddress), SenderName(chat.SenderName), TargetName(chat.TargetName), Prefix(chat.Prefix), _Channel(chat._Channel), ChatText(chat.ChatText), AchievementID(chat.AchievementID), _ChatFlags(chat._ChatFlags), DisplayTime(chat.DisplayTime), SpellID(chat.SpellID), BroadcastTextID(chat.BroadcastTextID), HideChatLog(chat.HideChatLog), FakeSenderName(chat.FakeSenderName), ChannelGUID(chat.ChannelGUID) { } void Chat::Initialize(ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string_view message, uint32 achievementId /*= 0*/, std::string_view channelName /*= ""*/, LocaleConstant locale /*= DEFAULT_LOCALE*/, std::string_view addonPrefix /*= ""*/) { // Clear everything because same packet can be used multiple times Clear(); SenderGUID.Clear(); SenderWowAccount.Clear(); SenderGuildGUID.Clear(); TargetGUID.Clear(); SenderName.clear(); TargetName.clear(); _ChatFlags = CHAT_FLAG_NONE; SlashCmd = chatType; _Language = language; if (sender) SetSender(sender, locale); if (receiver) SetReceiver(receiver, locale); SenderVirtualAddress = GetVirtualRealmAddress(); TargetVirtualAddress = GetVirtualRealmAddress(); AchievementID = achievementId; _Channel = channelName; Prefix = addonPrefix; ChatText = message; } void Chat::SetSender(WorldObject const* sender, LocaleConstant locale) { SenderGUID = sender->GetGUID(); if (Creature const* creatureSender = sender->ToCreature()) SenderName = creatureSender->GetNameForLocaleIdx(locale); if (Player const* playerSender = sender->ToPlayer()) { SenderGuildGUID = playerSender->m_unitData->GuildGUID; SenderWowAccount = playerSender->m_playerData->WowAccount; _ChatFlags = playerSender->GetChatFlags(); } } void Chat::SetReceiver(WorldObject const* receiver, LocaleConstant locale) { TargetGUID = receiver->GetGUID(); if (Creature const* creatureReceiver = receiver->ToCreature()) TargetName = creatureReceiver->GetNameForLocaleIdx(locale); } WorldPacket const* Chat::Write() { _worldPacket << uint8(SlashCmd); _worldPacket << uint32(_Language); _worldPacket << SenderGUID; _worldPacket << SenderGuildGUID; _worldPacket << SenderWowAccount; _worldPacket << TargetGUID; _worldPacket << uint32(TargetVirtualAddress); _worldPacket << uint32(SenderVirtualAddress); _worldPacket << int32(AchievementID); _worldPacket << uint16(_ChatFlags); _worldPacket << float(DisplayTime); _worldPacket << int32(SpellID); _worldPacket << SizedString::BitsSize<11>(SenderName); _worldPacket << SizedString::BitsSize<11>(TargetName); _worldPacket << SizedString::BitsSize<5>(Prefix); _worldPacket << SizedString::BitsSize<7>(_Channel); _worldPacket << SizedString::BitsSize<12>(ChatText); _worldPacket << Bits<1>(HideChatLog); _worldPacket << Bits<1>(FakeSenderName); _worldPacket << OptionalInit(BroadcastTextID); _worldPacket << OptionalInit(ChannelGUID); _worldPacket.FlushBits(); _worldPacket << SizedString::Data(SenderName); _worldPacket << SizedString::Data(TargetName); _worldPacket << SizedString::Data(Prefix); _worldPacket << SizedString::Data(_Channel); _worldPacket << SizedString::Data(ChatText); if (BroadcastTextID) _worldPacket << uint32(*BroadcastTextID); if (ChannelGUID) _worldPacket << *ChannelGUID; return &_worldPacket; } WorldPacket const* Emote::Write() { _worldPacket << Guid; _worldPacket << uint32(EmoteID); _worldPacket << Size(SpellVisualKitIDs); _worldPacket << int32(SequenceVariation); if (!SpellVisualKitIDs.empty()) _worldPacket.append(SpellVisualKitIDs.data(), SpellVisualKitIDs.size()); return &_worldPacket; } void CTextEmote::Read() { _worldPacket >> Target; _worldPacket >> EmoteID; _worldPacket >> SoundIndex; _worldPacket >> Size(SpellVisualKitIDs); _worldPacket >> SequenceVariation; for (int32& spellVisualKitId : SpellVisualKitIDs) _worldPacket >> spellVisualKitId; } WorldPacket const* STextEmote::Write() { _worldPacket << SourceGUID; _worldPacket << SourceAccountGUID; _worldPacket << EmoteID; _worldPacket << SoundIndex; _worldPacket << TargetGUID; return &_worldPacket; } WorldPacket const* PrintNotification::Write() { _worldPacket << SizedString::BitsSize<12>(NotifyText); _worldPacket.FlushBits(); _worldPacket << SizedString::Data(NotifyText); return &_worldPacket; } WorldPacket const* ChatPlayerNotfound::Write() { _worldPacket << SizedString::BitsSize<9>(Name); _worldPacket.FlushBits(); _worldPacket << SizedString::Data(Name); return &_worldPacket; } WorldPacket const* ChatServerMessage::Write() { _worldPacket << int32(MessageID); _worldPacket << SizedString::BitsSize<11>(StringParam); _worldPacket.FlushBits(); _worldPacket << SizedString::Data(StringParam); return &_worldPacket; } void ChatRegisterAddonPrefixes::Read() { _worldPacket >> Size(Prefixes); for (std::string& prefix : Prefixes) { _worldPacket >> SizedString::BitsSize<5>(prefix); _worldPacket >> SizedString::Data(prefix); } } WorldPacket const* DefenseMessage::Write() { _worldPacket << int32(ZoneID); _worldPacket << SizedString::BitsSize<12>(MessageText); _worldPacket.FlushBits(); _worldPacket << SizedString::Data(MessageText); return &_worldPacket; } void ChatReportIgnored::Read() { _worldPacket >> IgnoredGUID; _worldPacket >> Reason; } WorldPacket const* ChatPlayerAmbiguous::Write() { _worldPacket << SizedString::BitsSize<9>(Name); _worldPacket << SizedString::Data(Name); return &_worldPacket; } WorldPacket const* ChatRestricted::Write() { _worldPacket << int32(Reason); return &_worldPacket; } void CanLocalWhisperTargetRequest::Read() { _worldPacket >> WhisperTarget; } WorldPacket const* CanLocalWhisperTargetResponse::Write() { _worldPacket << WhisperTarget; _worldPacket << int32(Status); return &_worldPacket; } void UpdateAADCStatus::Read() { _worldPacket >> Bits<1>(ChatDisabled); } WorldPacket const* UpdateAADCStatusResponse::Write() { _worldPacket << Bits<1>(Success); _worldPacket << Bits<1>(ChatDisabled); _worldPacket.FlushBits(); return &_worldPacket; } }