Skip to content

Commit c8a0be1

Browse files
committed
2 parents 074dece + b2f1066 commit c8a0be1

19 files changed

Lines changed: 407 additions & 297 deletions

File tree

src/server/game/Chat/Channels/Channel.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "AccountMgr.h"
2020
#include "ChannelAppenders.h"
2121
#include "Chat.h"
22+
#include "ChatPackets.h"
2223
#include "DatabaseEnv.h"
2324
#include "DBCStores.h"
2425
#include "GameTime.h"
@@ -705,14 +706,25 @@ void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang) const
705706
return;
706707
}
707708

709+
Player* player = ObjectAccessor::FindConnectedPlayer(guid);
710+
708711
auto builder = [&](WorldPacket& data, LocaleConstant locale)
709712
{
710713
LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale);
711714

712-
if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
713-
ChatHandler::BuildChatPacket(data, CHAT_MSG_CHANNEL, Language(lang), player, player, what, 0, GetName(localeIdx));
715+
WorldPackets::Chat::Chat packet;
716+
if (player)
717+
packet.Initialize(CHAT_MSG_CHANNEL, Language(lang), player, player, what, 0, GetName(localeIdx), DEFAULT_LOCALE);
714718
else
715-
ChatHandler::BuildChatPacket(data, CHAT_MSG_CHANNEL, Language(lang), guid, guid, what, 0, "", "", 0, false, GetName(localeIdx));
719+
{
720+
packet.Initialize(CHAT_MSG_CHANNEL, Language(lang), nullptr, nullptr, what, 0, GetName(localeIdx), DEFAULT_LOCALE);
721+
packet.SenderGUID = guid;
722+
packet.TargetGUID = guid;
723+
}
724+
725+
packet.Write();
726+
727+
data = packet.Move();
716728
};
717729

718730
SendToAll(builder, !info.IsModerator() ? guid : ObjectGuid::Empty);

src/server/game/Chat/Chat.cpp

Lines changed: 26 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "AccountMgr.h"
2020
#include "CellImpl.h"
2121
#include "CharacterCache.h"
22+
#include "ChatPackets.h"
2223
#include "GridNotifiersImpl.h"
2324
#include "Language.h"
2425
#include "ObjectAccessor.h"
@@ -114,31 +115,31 @@ void ChatHandler::SendSysMessage(std::string_view str, bool escapeCharacters)
114115
msg = stream.str();
115116
}
116117

117-
WorldPacket data;
118+
WorldPackets::Chat::Chat packet;
118119
for (std::string_view line : Trinity::Tokenize(str, '\n', true))
119120
{
120-
BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line);
121-
m_session->SendPacket(&data);
121+
packet.Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line);
122+
m_session->SendPacket(packet.Write());
122123
}
123124
}
124125

125126
void ChatHandler::SendGlobalSysMessage(const char *str)
126127
{
127-
WorldPacket data;
128+
WorldPackets::Chat::Chat packet;
128129
for (std::string_view line : Trinity::Tokenize(str, '\n', true))
129130
{
130-
BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line);
131-
sWorld->SendGlobalMessage(&data);
131+
packet.Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line);
132+
sWorld->SendGlobalMessage(packet.Write());
132133
}
133134
}
134135

135136
void ChatHandler::SendGlobalGMSysMessage(const char *str)
136137
{
137-
WorldPacket data;
138+
WorldPackets::Chat::Chat packet;
138139
for (std::string_view line : Trinity::Tokenize(str, '\n', true))
139140
{
140-
BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line);
141-
sWorld->SendGlobalGMMessage(&data);
141+
packet.Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line);
142+
sWorld->SendGlobalGMMessage(packet.Write());
142143
}
143144
}
144145

@@ -190,115 +191,6 @@ bool ChatHandler::ParseCommands(std::string_view text)
190191
return _ParseCommands(text.substr(1));
191192
}
192193

193-
size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag,
194-
std::string const& senderName /*= ""*/, std::string const& receiverName /*= ""*/,
195-
uint32 achievementId /*= 0*/, bool gmMessage /*= false*/, std::string const& channelName /*= ""*/)
196-
{
197-
size_t receiverGUIDPos = 0;
198-
data.Initialize(!gmMessage ? SMSG_MESSAGECHAT : SMSG_GM_MESSAGECHAT);
199-
data << uint8(chatType);
200-
data << int32(language);
201-
data << senderGUID;
202-
data << uint32(0); // some flags
203-
switch (chatType)
204-
{
205-
case CHAT_MSG_MONSTER_SAY:
206-
case CHAT_MSG_MONSTER_PARTY:
207-
case CHAT_MSG_MONSTER_YELL:
208-
case CHAT_MSG_MONSTER_WHISPER:
209-
case CHAT_MSG_MONSTER_EMOTE:
210-
case CHAT_MSG_RAID_BOSS_EMOTE:
211-
case CHAT_MSG_RAID_BOSS_WHISPER:
212-
case CHAT_MSG_BATTLENET:
213-
data << uint32(senderName.length() + 1);
214-
data << senderName;
215-
receiverGUIDPos = data.wpos();
216-
data << receiverGUID;
217-
if (!receiverGUID.IsEmpty() && !receiverGUID.IsPlayer() && !receiverGUID.IsPet())
218-
{
219-
data << uint32(receiverName.length() + 1);
220-
data << receiverName;
221-
}
222-
break;
223-
case CHAT_MSG_WHISPER_FOREIGN:
224-
data << uint32(senderName.length() + 1);
225-
data << senderName;
226-
receiverGUIDPos = data.wpos();
227-
data << receiverGUID;
228-
break;
229-
case CHAT_MSG_BG_SYSTEM_NEUTRAL:
230-
case CHAT_MSG_BG_SYSTEM_ALLIANCE:
231-
case CHAT_MSG_BG_SYSTEM_HORDE:
232-
receiverGUIDPos = data.wpos();
233-
data << receiverGUID;
234-
if (!receiverGUID.IsEmpty() && !receiverGUID.IsPlayer())
235-
{
236-
data << uint32(receiverName.length() + 1);
237-
data << receiverName;
238-
}
239-
break;
240-
case CHAT_MSG_ACHIEVEMENT:
241-
case CHAT_MSG_GUILD_ACHIEVEMENT:
242-
receiverGUIDPos = data.wpos();
243-
data << receiverGUID;
244-
break;
245-
default:
246-
if (gmMessage)
247-
{
248-
data << uint32(senderName.length() + 1);
249-
data << senderName;
250-
}
251-
252-
if (chatType == CHAT_MSG_CHANNEL)
253-
{
254-
ASSERT(channelName.length() > 0);
255-
data << channelName;
256-
}
257-
258-
receiverGUIDPos = data.wpos();
259-
data << receiverGUID;
260-
break;
261-
}
262-
263-
data << uint32(message.length() + 1);
264-
data << message;
265-
data << uint8(chatTag);
266-
267-
if (chatType == CHAT_MSG_ACHIEVEMENT || chatType == CHAT_MSG_GUILD_ACHIEVEMENT)
268-
data << uint32(achievementId);
269-
270-
return receiverGUIDPos;
271-
}
272-
273-
size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string_view message,
274-
uint32 achievementId /*= 0*/, std::string const& channelName /*= ""*/, LocaleConstant locale /*= DEFAULT_LOCALE*/)
275-
{
276-
ObjectGuid senderGUID;
277-
std::string senderName = "";
278-
uint8 chatTag = 0;
279-
bool gmMessage = false;
280-
ObjectGuid receiverGUID;
281-
std::string receiverName = "";
282-
if (sender)
283-
{
284-
senderGUID = sender->GetGUID();
285-
senderName = sender->GetNameForLocaleIdx(locale);
286-
if (Player const* playerSender = sender->ToPlayer())
287-
{
288-
chatTag = playerSender->GetChatTag();
289-
gmMessage = playerSender->GetSession()->HasPermission(rbac::RBAC_PERM_COMMAND_GM_CHAT);
290-
}
291-
}
292-
293-
if (receiver)
294-
{
295-
receiverGUID = receiver->GetGUID();
296-
receiverName = receiver->GetNameForLocaleIdx(locale);
297-
}
298-
299-
return BuildChatPacket(data, chatType, language, senderGUID, receiverGUID, message, chatTag, senderName, receiverName, achievementId, gmMessage, channelName);
300-
}
301-
302194
Player* ChatHandler::getSelectedPlayer()
303195
{
304196
if (!m_session)
@@ -789,6 +681,8 @@ int CliHandler::GetSessionDbLocaleIndex() const
789681
return sObjectMgr->GetDBCLocaleIndex();
790682
}
791683

684+
std::string_view const AddonChannelCommandHandler::PREFIX = "TrinityCore";
685+
792686
bool AddonChannelCommandHandler::ParseCommands(std::string_view str)
793687
{
794688
if (str.length() < 17)
@@ -831,39 +725,36 @@ bool AddonChannelCommandHandler::ParseCommands(std::string_view str)
831725
}
832726
}
833727

834-
void AddonChannelCommandHandler::Send(std::string const& msg)
728+
void AddonChannelCommandHandler::Send(std::string_view msg)
835729
{
836-
WorldPacket data;
837-
ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, LANG_ADDON, GetSession()->GetPlayer(), GetSession()->GetPlayer(), msg);
838-
GetSession()->SendPacket(&data);
730+
WorldPackets::Chat::Chat chat;
731+
chat.Initialize(CHAT_MSG_WHISPER, LANG_ADDON, GetSession()->GetPlayer(), GetSession()->GetPlayer(), msg, 0, "", LOCALE_enUS, PREFIX);
732+
GetSession()->SendPacket(chat.Write());
839733
}
840734

841735
void AddonChannelCommandHandler::SendAck() // a Command acknowledged, no body
842736
{
843737
ASSERT(echo);
844-
char ack[18] = "TrinityCore\ta";
845-
memcpy(ack+13, echo, 4);
846-
ack[17] = '\0';
847-
Send(ack);
738+
char ack[5] = "a";
739+
memcpy(ack + 1, echo, 4);
740+
Send(std::string_view(ack, 5));
848741
hadAck = true;
849742
}
850743

851744
void AddonChannelCommandHandler::SendOK() // o Command OK, no body
852745
{
853746
ASSERT(echo);
854-
char ok[18] = "TrinityCore\to";
855-
memcpy(ok+13, echo, 4);
856-
ok[17] = '\0';
857-
Send(ok);
747+
char ok[5] = "o";
748+
memcpy(ok + 1, echo, 4);
749+
Send(std::string_view(ok, 5));
858750
}
859751

860752
void AddonChannelCommandHandler::SendFailed() // f Command failed, no body
861753
{
862754
ASSERT(echo);
863-
char fail[18] = "TrinityCore\tf";
864-
memcpy(fail + 13, echo, 4);
865-
fail[17] = '\0';
866-
Send(fail);
755+
char fail[5] = "f";
756+
memcpy(fail + 1, echo, 4);
757+
Send(std::string_view(fail, 5));
867758
}
868759

869760
// m Command message, message in body
@@ -873,7 +764,7 @@ void AddonChannelCommandHandler::SendSysMessage(std::string_view str, bool escap
873764
if (!hadAck)
874765
SendAck();
875766

876-
std::string msg = "TrinityCore\tm";
767+
std::string msg = "m";
877768
msg.append(echo, 4);
878769
std::string body(str);
879770
if (escapeCharacters)

src/server/game/Chat/Chat.h

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,6 @@ class TC_GAME_API ChatHandler
4949
explicit ChatHandler(WorldSession* session) : m_session(session), sentErrorMessage(false) { }
5050
virtual ~ChatHandler() { }
5151

52-
// Builds chat packet and returns receiver guid position in the packet to substitute in whisper builders
53-
static size_t BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag,
54-
std::string const& senderName = "", std::string const& receiverName = "",
55-
uint32 achievementId = 0, bool gmMessage = false, std::string const& channelName = "");
56-
57-
// Builds chat packet and returns receiver guid position in the packet to substitute in whisper builders
58-
static size_t BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string_view message, uint32 achievementId = 0, std::string const& channelName = "", LocaleConstant locale = DEFAULT_LOCALE);
59-
6052
static char* LineFromMessage(char*& pos) { char* start = strtok(pos, "\n"); pos = nullptr; return start; }
6153

6254
// function with different implementation for chat/console
@@ -166,14 +158,16 @@ class TC_GAME_API CliHandler : public ChatHandler
166158
class TC_GAME_API AddonChannelCommandHandler : public ChatHandler
167159
{
168160
public:
161+
static std::string_view const PREFIX;
162+
169163
using ChatHandler::ChatHandler;
170164
bool ParseCommands(std::string_view str) override;
171165
void SendSysMessage(std::string_view, bool escapeCharacters) override;
172166
using ChatHandler::SendSysMessage;
173167
bool IsHumanReadable() const override { return humanReadable; }
174168

175169
private:
176-
void Send(std::string const& msg);
170+
void Send(std::string_view msg);
177171
void SendAck();
178172
void SendOK();
179173
void SendFailed();

0 commit comments

Comments
 (0)