aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Chat/Chat.cpp
diff options
context:
space:
mode:
authorIntel <chemicstry@gmail.com>2014-11-16 18:17:08 +0200
committerIntel <chemicstry@gmail.com>2014-11-17 00:08:38 +0200
commit218f14f84b692288e58c292a9808a073e50f96ad (patch)
tree4ec5fe5156a2adea9558a2b09cdeafa6f2d3e49a /src/server/game/Chat/Chat.cpp
parent2c22beaaeff6ec9227e901962db86dc79db75a66 (diff)
Core/Packets: Added some chat message packets
Diffstat (limited to 'src/server/game/Chat/Chat.cpp')
-rw-r--r--src/server/game/Chat/Chat.cpp167
1 files changed, 46 insertions, 121 deletions
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index ec3bc458066..fa89dca294c 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -35,6 +35,8 @@
#include "SpellMgr.h"
#include "ScriptMgr.h"
#include "ChatLink.h"
+#include "Guild.h"
+#include "Group.h"
bool ChatHandler::load_command_table = true;
@@ -202,7 +204,7 @@ bool ChatHandler::hasStringAbbr(const char* name, const char* part)
void ChatHandler::SendSysMessage(const char *str)
{
- WorldPacket data;
+ WorldPackets::Chat::Chat packet;
// need copy to prevent corruption by strtok call in LineFromMessage original string
char* buf = strdup(str);
@@ -210,8 +212,8 @@ void ChatHandler::SendSysMessage(const char *str)
while (char* line = LineFromMessage(pos))
{
- BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
- m_session->SendPacket(&data);
+ BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
+ m_session->SendPacket(packet.Write());
}
free(buf);
@@ -220,7 +222,7 @@ void ChatHandler::SendSysMessage(const char *str)
void ChatHandler::SendGlobalSysMessage(const char *str)
{
// Chat output
- WorldPacket data;
+ WorldPackets::Chat::Chat packet;
// need copy to prevent corruption by strtok call in LineFromMessage original string
char* buf = strdup(str);
@@ -228,8 +230,8 @@ void ChatHandler::SendGlobalSysMessage(const char *str)
while (char* line = LineFromMessage(pos))
{
- BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
- sWorld->SendGlobalMessage(&data);
+ BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
+ sWorld->SendGlobalMessage(packet.Write());
}
free(buf);
@@ -238,7 +240,7 @@ void ChatHandler::SendGlobalSysMessage(const char *str)
void ChatHandler::SendGlobalGMSysMessage(const char *str)
{
// Chat output
- WorldPacket data;
+ WorldPackets::Chat::Chat packet;
// need copy to prevent corruption by strtok call in LineFromMessage original string
char* buf = strdup(str);
@@ -246,8 +248,8 @@ void ChatHandler::SendGlobalGMSysMessage(const char *str)
while (char* line = LineFromMessage(pos))
{
- BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
- sWorld->SendGlobalGMMessage(&data);
+ BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line);
+ sWorld->SendGlobalGMMessage(packet.Write());
}
free(buf);
@@ -628,132 +630,55 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand* table, const char* cmd)
return ShowHelpForSubCommands(table, "", cmd);
}
-size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid 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 /*= ""*/,
- std::string const& addonPrefix /*= ""*/)
+void ChatHandler::BuildChatPacket(WorldPackets::Chat::Chat* packet, 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*/, std::string const& addonPrefix /*= ""*/)
{
- size_t receiverGUIDPos = 0;
- data.Initialize(!gmMessage ? SMSG_MESSAGECHAT : SMSG_GM_MESSAGECHAT);
- data << uint8(chatType);
- data << int32(language);
- data << senderGUID;
- data << uint32(0); // some flags
- switch (chatType)
- {
- 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_EMOTE:
- case CHAT_MSG_RAID_BOSS_WHISPER:
- case CHAT_MSG_BATTLENET:
- data << uint32(senderName.length() + 1);
- data << senderName;
- receiverGUIDPos = data.wpos();
- data << receiverGUID;
- if (!receiverGUID.IsEmpty() && !receiverGUID.IsPlayer() && !receiverGUID.IsPet())
- {
- data << uint32(receiverName.length() + 1);
- data << receiverName;
- }
-
- if (language == LANG_ADDON)
- data << addonPrefix;
- break;
- case CHAT_MSG_WHISPER_FOREIGN:
- data << uint32(senderName.length() + 1);
- data << senderName;
- receiverGUIDPos = data.wpos();
- data << receiverGUID;
- if (language == LANG_ADDON)
- data << addonPrefix;
- break;
- case CHAT_MSG_BG_SYSTEM_NEUTRAL:
- case CHAT_MSG_BG_SYSTEM_ALLIANCE:
- case CHAT_MSG_BG_SYSTEM_HORDE:
- receiverGUIDPos = data.wpos();
- data << receiverGUID;
- if (!receiverGUID.IsEmpty() && !receiverGUID.IsPlayer())
- {
- data << uint32(receiverName.length() + 1);
- data << receiverName;
- }
-
- if (language == LANG_ADDON)
- data << addonPrefix;
- break;
- case CHAT_MSG_ACHIEVEMENT:
- case CHAT_MSG_GUILD_ACHIEVEMENT:
- receiverGUIDPos = data.wpos();
- data << receiverGUID;
- if (language == LANG_ADDON)
- data << addonPrefix;
- break;
- default:
- if (gmMessage)
- {
- data << uint32(senderName.length() + 1);
- data << senderName;
- }
-
- if (chatType == CHAT_MSG_CHANNEL)
- {
- ASSERT(channelName.length() > 0);
- data << channelName;
- }
+ // Clear everything because same packet can be used multiple times
+ packet->SenderGUID.Clear();
+ packet->SenderAccountGUID.Clear();
+ packet->SenderGuildGUID.Clear();
+ packet->PartyGUID.Clear();
+ packet->TargetGUID.Clear();
+ packet->SenderName.clear();
+ packet->TargetName.clear();
+ packet->ChatFlags = CHAT_FLAG_NONE;
+
+ packet->SlashCmd = chatType;
+ packet->Language = language;
- receiverGUIDPos = data.wpos();
- data << receiverGUID;
-
- if (language == LANG_ADDON)
- data << addonPrefix;
- break;
- }
-
- data << uint32(message.length() + 1);
- data << message;
- data << uint8(chatTag);
-
- if (chatType == CHAT_MSG_ACHIEVEMENT || chatType == CHAT_MSG_GUILD_ACHIEVEMENT)
- data << uint32(achievementId);
- else if (chatType == CHAT_MSG_RAID_BOSS_WHISPER || chatType == CHAT_MSG_RAID_BOSS_EMOTE)
+ if (sender)
{
- data << float(0.0f); // Display time in middle of the screen (in seconds), defaults to 10 if not set (cannot be below 1)
- data << uint8(0); // Hide in chat frame (only shows in middle of the screen)
- }
+ packet->SenderGUID = sender->GetGUID();
- return receiverGUIDPos;
-}
+ if (Creature const* creatureSender = sender->ToCreature())
+ packet->SenderName = creatureSender->GetNameForLocaleIdx(locale);
-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*/, std::string const& addonPrefix /*= ""*/)
-{
- ObjectGuid senderGUID;
- std::string senderName = "";
- uint8 chatTag = 0;
- bool gmMessage = false;
- ObjectGuid receiverGUID;
- 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);
+ packet->SenderAccountGUID = ObjectGuid::Create<HighGuid::WowAccount>(playerSender->GetSession()->GetAccountId());
+ packet->ChatFlags = playerSender->GetChatFlags();
+
+ if (Guild const* guild = playerSender->GetGuild())
+ packet->SenderGuildGUID = guild->GetGUID();
+
+ if (Group const* group = playerSender->GetGroup())
+ packet->PartyGUID = group->GetGUID();
}
}
if (receiver)
{
- receiverGUID = receiver->GetGUID();
- receiverName = receiver->GetNameForLocaleIdx(locale);
+ packet->TargetGUID = receiver->GetGUID();
+ if (Creature const* creatureReceiver = receiver->ToCreature())
+ packet->TargetName = creatureReceiver->GetNameForLocaleIdx(locale);
}
- return BuildChatPacket(data, chatType, language, senderGUID, receiverGUID, message, chatTag, senderName, receiverName, achievementId, gmMessage, channelName, addonPrefix);
+ packet->SenderVirtualAddress = GetVirtualRealmAddress();
+ packet->TargetVirtualAddress = GetVirtualRealmAddress();
+ packet->AchievementID = achievementId;
+ packet->Channel = channelName;
+ packet->Prefix = addonPrefix;
+ packet->ChatText = message;
}
Player* ChatHandler::getSelectedPlayer()