aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Chat/Chat.cpp
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2013-12-29 15:13:14 -0500
committerSubv <subv2112@gmail.com>2013-12-29 15:13:14 -0500
commitd234d0f3d0889e799eb066ba39c9b1edbc964d6e (patch)
tree17d6281266900fe843573d03eff46a3b2beabedb /src/server/game/Chat/Chat.cpp
parent8658b5338c905c79daf50cb56dbe739f82d25acc (diff)
parentc40cdc2968c58d952878c09a60926af74f782867 (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into mmaps_rw
Diffstat (limited to 'src/server/game/Chat/Chat.cpp')
-rw-r--r--src/server/game/Chat/Chat.cpp160
1 files changed, 95 insertions, 65 deletions
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 99dd23aa649..e446b18e78d 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -210,7 +210,7 @@ void ChatHandler::SendSysMessage(const char *str)
while (char* line = LineFromMessage(pos))
{
- FillSystemMessageData(&data, line);
+ BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
m_session->SendPacket(&data);
}
@@ -228,7 +228,7 @@ void ChatHandler::SendGlobalSysMessage(const char *str)
while (char* line = LineFromMessage(pos))
{
- FillSystemMessageData(&data, line);
+ BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
sWorld->SendGlobalMessage(&data);
}
@@ -246,9 +246,10 @@ void ChatHandler::SendGlobalGMSysMessage(const char *str)
while (char* line = LineFromMessage(pos))
{
- FillSystemMessageData(&data, line);
+ BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
sWorld->SendGlobalGMMessage(&data);
- }
+ }
+
free(buf);
}
@@ -628,84 +629,113 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand* table, const char* cmd)
return ShowHelpForSubCommands(table, "", cmd);
}
-//Note: target_guid used only in CHAT_MSG_WHISPER_INFORM mode (in this case channelName ignored)
-void ChatHandler::FillMessageData(WorldPacket* data, WorldSession* session, uint8 type, uint32 language, const char *channelName, uint64 target_guid, const char *message, Unit* speaker)
+size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, uint64 senderGUID, uint64 receiverGUID, std::string const& message, uint8 chatTag,
+ std::string const& senderName /*= ""*/, std::string const& receiverName /*= ""*/,
+ uint32 achievementId /*= 0*/, bool gmMessage /*= false*/, std::string const& channelName /*= ""*/)
{
- uint32 messageLength = (message ? strlen(message) : 0) + 1;
-
- data->Initialize(SMSG_MESSAGECHAT, 100); // guess size
- *data << uint8(type);
- if ((type != CHAT_MSG_CHANNEL && type != CHAT_MSG_WHISPER) || language == LANG_ADDON)
- *data << uint32(language);
- else
- *data << uint32(LANG_UNIVERSAL);
-
- switch (type)
+ size_t receiverGUIDPos = 0;
+ data.Initialize(!gmMessage ? SMSG_MESSAGECHAT : SMSG_GM_MESSAGECHAT);
+ data << uint8(chatType);
+ data << int32(language);
+ data << uint64(senderGUID);
+ data << uint32(0); // some flags
+ switch (chatType)
{
- case CHAT_MSG_SAY:
- case CHAT_MSG_PARTY:
- case CHAT_MSG_PARTY_LEADER:
- case CHAT_MSG_RAID:
- case CHAT_MSG_GUILD:
- case CHAT_MSG_OFFICER:
- case CHAT_MSG_YELL:
- case CHAT_MSG_WHISPER:
- case CHAT_MSG_CHANNEL:
- case CHAT_MSG_RAID_LEADER:
- case CHAT_MSG_RAID_WARNING:
- case CHAT_MSG_BG_SYSTEM_NEUTRAL:
- case CHAT_MSG_BG_SYSTEM_ALLIANCE:
- case CHAT_MSG_BG_SYSTEM_HORDE:
- case CHAT_MSG_BATTLEGROUND:
- case CHAT_MSG_BATTLEGROUND_LEADER:
- target_guid = session ? session->GetPlayer()->GetGUID() : 0;
- break;
case CHAT_MSG_MONSTER_SAY:
case CHAT_MSG_MONSTER_PARTY:
case CHAT_MSG_MONSTER_YELL:
case CHAT_MSG_MONSTER_WHISPER:
case CHAT_MSG_MONSTER_EMOTE:
- case CHAT_MSG_RAID_BOSS_WHISPER:
case CHAT_MSG_RAID_BOSS_EMOTE:
+ case CHAT_MSG_RAID_BOSS_WHISPER:
case CHAT_MSG_BATTLENET:
- {
- *data << uint64(speaker->GetGUID());
- *data << uint32(0); // 2.1.0
- *data << uint32(speaker->GetName().size() + 1);
- *data << speaker->GetName();
- *data << uint64(0); // listener_guid
- //if (listener_guid && !IS_PLAYER_GUID(listener_guid))
- //{
- // *data << uint32(1); // string listener_name_length
- // *data << uint8(0); // string listener_name
- //}
- *data << uint32(messageLength);
- *data << message;
- *data << uint8(0);
- return;
- }
+ data << uint32(senderName.length() + 1);
+ data << senderName;
+ receiverGUIDPos = data.wpos();
+ data << uint64(receiverGUID);
+ if (receiverGUID && !IS_PLAYER_GUID(receiverGUID) && !IS_PET_GUID(receiverGUID))
+ {
+ data << uint32(receiverName.length() + 1);
+ data << receiverName;
+ }
+ break;
+ case CHAT_MSG_WHISPER_FOREIGN:
+ data << uint32(senderName.length() + 1);
+ data << senderName;
+ receiverGUIDPos = data.wpos();
+ data << uint64(receiverGUID);
+ break;
+ case CHAT_MSG_BG_SYSTEM_NEUTRAL:
+ case CHAT_MSG_BG_SYSTEM_ALLIANCE:
+ case CHAT_MSG_BG_SYSTEM_HORDE:
+ receiverGUIDPos = data.wpos();
+ data << uint64(receiverGUID);
+ if (receiverGUID && !IS_PLAYER_GUID(receiverGUID))
+ {
+ data << uint32(receiverName.length() + 1);
+ data << receiverName;
+ }
+ break;
+ case CHAT_MSG_ACHIEVEMENT:
+ case CHAT_MSG_GUILD_ACHIEVEMENT:
+ receiverGUIDPos = data.wpos();
+ data << uint64(receiverGUID);
+ break;
default:
- if (type != CHAT_MSG_WHISPER_INFORM && type != CHAT_MSG_IGNORED && type != CHAT_MSG_DND && type != CHAT_MSG_AFK)
- target_guid = 0; // only for CHAT_MSG_WHISPER_INFORM used original value target_guid
+ if (gmMessage)
+ {
+ data << uint32(senderName.length() + 1);
+ data << senderName;
+ }
+
+ if (chatType == CHAT_MSG_CHANNEL)
+ {
+ ASSERT(channelName.length() > 0);
+ data << channelName;
+ }
+
+ receiverGUIDPos = data.wpos();
+ data << uint64(receiverGUID);
break;
}
- *data << uint64(target_guid); // there 0 for BG messages
- *data << uint32(0); // can be chat msg group or something
+ data << uint32(message.length() + 1);
+ data << message;
+ data << uint8(chatTag);
- if (type == CHAT_MSG_CHANNEL)
+ if (chatType == CHAT_MSG_ACHIEVEMENT || chatType == CHAT_MSG_GUILD_ACHIEVEMENT)
+ data << uint32(achievementId);
+
+ return receiverGUIDPos;
+}
+
+size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string const& message,
+ uint32 achievementId /*= 0*/, std::string const& channelName /*= ""*/, LocaleConstant locale /*= DEFAULT_LOCALE*/)
+{
+ uint64 senderGUID = 0;
+ std::string senderName = "";
+ uint8 chatTag = 0;
+ bool gmMessage = false;
+ uint64 receiverGUID = 0;
+ std::string receiverName = "";
+ if (sender)
+ {
+ senderGUID = sender->GetGUID();
+ senderName = sender->GetNameForLocaleIdx(locale);
+ if (Player const* playerSender = sender->ToPlayer())
+ {
+ chatTag = playerSender->GetChatTag();
+ gmMessage = playerSender->GetSession()->HasPermission(rbac::RBAC_PERM_COMMAND_GM_CHAT);
+ }
+ }
+
+ if (receiver)
{
- ASSERT(channelName);
- *data << channelName;
+ receiverGUID = receiver->GetGUID();
+ receiverName = receiver->GetNameForLocaleIdx(locale);
}
- *data << uint64(target_guid);
- *data << uint32(messageLength);
- *data << message;
- if (session != 0 && type != CHAT_MSG_WHISPER_INFORM && type != CHAT_MSG_DND && type != CHAT_MSG_AFK)
- *data << uint8(session->GetPlayer()->GetChatTag());
- else
- *data << uint8(0);
+ return BuildChatPacket(data, chatType, language, senderGUID, receiverGUID, message, chatTag, senderName, receiverName, achievementId, gmMessage, channelName);
}
Player* ChatHandler::getSelectedPlayer()