aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp51
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h49
-rw-r--r--src/server/game/Server/Packets/ChatPackets.cpp10
-rw-r--r--src/server/game/Server/Packets/ChatPackets.h17
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h2
-rw-r--r--src/server/scripts/World/chat_log.cpp10
7 files changed, 110 insertions, 35 deletions
diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
index 998010aa641..2e07664f5c9 100644
--- a/src/server/game/Handlers/ChatHandler.cpp
+++ b/src/server/game/Handlers/ChatHandler.cpp
@@ -68,6 +68,9 @@ void WorldSession::HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage& chat
case CMSG_CHAT_MESSAGE_RAID_WARNING:
type = CHAT_MSG_RAID_WARNING;
break;
+ case CMSG_CHAT_MESSAGE_INSTANCE_CHAT:
+ type = CHAT_MSG_INSTANCE_CHAT;
+ break;
default:
TC_LOG_ERROR("network", "HandleMessagechatOpcode : Unknown chat opcode (%u)", chatMessage.GetOpcode());
return;
@@ -366,6 +369,22 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg,
}
break;
}
+ case CHAT_MSG_INSTANCE_CHAT:
+ {
+ Group* group = GetPlayer()->GetGroup();
+ if (!group)
+ return;
+
+ if (group->IsLeader(GetPlayer()->GetGUID()))
+ type = CHAT_MSG_INSTANCE_CHAT_LEADER;
+
+ sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
+
+ WorldPackets::Chat::Chat packet;
+ packet.Initalize(ChatMsg(type), Language(lang), sender, nullptr, msg);
+ group->BroadcastPacket(packet.Write(), false);
+ break;
+ }
default:
TC_LOG_ERROR("network", "CHAT: unknown message type %u, lang: %u", type, lang);
break;
@@ -390,6 +409,9 @@ void WorldSession::HandleChatAddonMessageOpcode(WorldPackets::Chat::ChatAddonMes
case CMSG_CHAT_ADDON_MESSAGE_RAID:
type = CHAT_MSG_RAID;
break;
+ case CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT:
+ type = CHAT_MSG_INSTANCE_CHAT;
+ break;
default:
TC_LOG_ERROR("network", "HandleChatAddonMessageOpcode: Unknown addon chat opcode (%u)", chatAddonMessage.GetOpcode());
return;
@@ -403,6 +425,11 @@ void WorldSession::HandleChatAddonMessageWhisperOpcode(WorldPackets::Chat::ChatA
HandleChatAddonMessage(CHAT_MSG_WHISPER, chatAddonMessageWhisper.Prefix, chatAddonMessageWhisper.Text, chatAddonMessageWhisper.Target);
}
+void WorldSession::HandleChatAddonMessageChannelOpcode(WorldPackets::Chat::ChatAddonMessageChannel& chatAddonMessageChannel)
+{
+ HandleChatAddonMessage(CHAT_MSG_CHANNEL, chatAddonMessageChannel.Prefix, chatAddonMessageChannel.Text, chatAddonMessageChannel.Target);
+}
+
void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std::string text, std::string target /*= ""*/)
{
Player* sender = GetPlayer();
@@ -439,15 +466,33 @@ void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std:
// Messages sent to "RAID" while in a party will get delivered to "PARTY"
case CHAT_MSG_PARTY:
case CHAT_MSG_RAID:
+ case CHAT_MSG_INSTANCE_CHAT:
{
+ Group* group = nullptr;
+ int32 subGroup = -1;
+ if (type != CHAT_MSG_INSTANCE_CHAT)
+ group = sender->GetOriginalGroup();
- Group* group = sender->GetGroup();
if (!group)
- break;
+ {
+ group = sender->GetGroup();
+ if (!group)
+ break;
+
+ if (type == CHAT_MSG_PARTY)
+ subGroup = sender->GetSubGroup();
+ }
WorldPackets::Chat::Chat packet;
packet.Initalize(type, LANG_ADDON, sender, nullptr, text, 0, "", DEFAULT_LOCALE, prefix);
- group->BroadcastAddonMessagePacket(packet.Write(), prefix, true, -1, sender->GetGUID());
+ group->BroadcastAddonMessagePacket(packet.Write(), prefix, true, subGroup, sender->GetGUID());
+ break;
+ }
+ case CHAT_MSG_CHANNEL:
+ {
+ if (ChannelMgr* cMgr = ChannelMgr::ForTeam(sender->GetTeam()))
+ if (Channel* chn = cMgr->GetChannel(target, sender, false))
+ chn->Say(sender->GetGUID(), text.c_str(), LANG_ADDON);
break;
}
default:
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 1ca4395c91c..90ba0799dd2 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -4264,33 +4264,36 @@ enum ChatMsg
CHAT_MSG_RAID_BOSS_EMOTE = 0x29,
CHAT_MSG_RAID_BOSS_WHISPER = 0x2A,
CHAT_MSG_FILTERED = 0x2B,
- CHAT_MSG_BATTLEGROUND = 0x2C,
- CHAT_MSG_BATTLEGROUND_LEADER = 0x2D,
- CHAT_MSG_RESTRICTED = 0x2E,
- CHAT_MSG_BATTLENET = 0x2F,
- CHAT_MSG_ACHIEVEMENT = 0x30,
- CHAT_MSG_GUILD_ACHIEVEMENT = 0x31,
- CHAT_MSG_ARENA_POINTS = 0x32,
- CHAT_MSG_PARTY_LEADER = 0x33,
- CHAT_MSG_TARGETICONS = 0x34,
- CHAT_MSG_BN_WHISPER = 0x35,
- CHAT_MSG_BN_WHISPER_INFORM = 0x36,
- CHAT_MSG_BN_CONVERSATION = 0x37,
- CHAT_MSG_BN_CONVERSATION_NOTICE = 0x38,
- CHAT_MSG_BN_CONVERSATION_LIST = 0x39,
- CHAT_MSG_BN_INLINE_TOAST_ALERT = 0x3A,
- CHAT_MSG_BN_INLINE_TOAST_BROADCAST = 0x3B,
- CHAT_MSG_BN_INLINE_TOAST_BROADCAST_INFORM = 0x3C,
- CHAT_MSG_BN_INLINE_TOAST_CONVERSATION = 0x3D,
- CHAT_MSG_BN_WHISPER_PLAYER_OFFLINE = 0x3E,
- CHAT_MSG_COMBAT_GUILD_XP_GAIN = 0x3F,
- CHAT_MSG_CURRENCY = 0x40
+ CHAT_MSG_RESTRICTED = 0x2C,
+ CHAT_MSG_BATTLENET = 0x2D,
+ CHAT_MSG_ACHIEVEMENT = 0x2E,
+ CHAT_MSG_GUILD_ACHIEVEMENT = 0x2F,
+ CHAT_MSG_ARENA_POINTS = 0x30,
+ CHAT_MSG_PARTY_LEADER = 0x31,
+ CHAT_MSG_TARGETICONS = 0x32,
+ CHAT_MSG_BN_WHISPER = 0x33,
+ CHAT_MSG_BN_WHISPER_INFORM = 0x34,
+ CHAT_MSG_BN_CONVERSATION = 0x35,
+ CHAT_MSG_BN_CONVERSATION_NOTICE = 0x36,
+ CHAT_MSG_BN_CONVERSATION_LIST = 0x37,
+ CHAT_MSG_BN_INLINE_TOAST_ALERT = 0x38,
+ CHAT_MSG_BN_INLINE_TOAST_BROADCAST = 0x39,
+ CHAT_MSG_BN_INLINE_TOAST_BROADCAST_INFORM = 0x3A,
+ CHAT_MSG_BN_INLINE_TOAST_CONVERSATION = 0x3B,
+ CHAT_MSG_BN_WHISPER_PLAYER_OFFLINE = 0x3C,
+ CHAT_MSG_COMBAT_GUILD_XP_GAIN = 0x3D,
+ CHAT_MSG_CURRENCY = 0x3E,
+ CHAT_MSG_QUEST_BOSS_EMOTE = 0x3F,
+ CHAT_MSG_PET_BATTLE_COMBAT_LOG = 0x40,
+ CHAT_MSG_PET_BATTLE_INFO = 0x41,
+ CHAT_MSG_INSTANCE_CHAT = 0x42,
+ CHAT_MSG_INSTANCE_CHAT_LEADER = 0x43,
+
+ MAX_CHAT_MSG_TYPE
};
#define GM_SILENCE_AURA 1852
-#define MAX_CHAT_MSG_TYPE 0x41
-
enum ChatFlags
{
CHAT_FLAG_NONE = 0x00,
diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp
index 1b93b401a29..8179ee427c8 100644
--- a/src/server/game/Server/Packets/ChatPackets.cpp
+++ b/src/server/game/Server/Packets/ChatPackets.cpp
@@ -64,6 +64,16 @@ void WorldPackets::Chat::ChatAddonMessageWhisper::Read()
Text = _worldPacket.ReadString(textLen);
}
+void WorldPackets::Chat::ChatAddonMessageChannel::Read()
+{
+ uint32 targetLen = _worldPacket.ReadBits(9);
+ uint32 prefixLen = _worldPacket.ReadBits(5);
+ uint32 textLen = _worldPacket.ReadBits(8);
+ Target = _worldPacket.ReadString(targetLen);
+ Prefix = _worldPacket.ReadString(prefixLen);
+ Text = _worldPacket.ReadString(textLen);
+}
+
void WorldPackets::Chat::ChatMessageDND::Read()
{
uint32 len = _worldPacket.ReadBits(8);
diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h
index df87629173c..8cadb88b584 100644
--- a/src/server/game/Server/Packets/ChatPackets.h
+++ b/src/server/game/Server/Packets/ChatPackets.h
@@ -35,6 +35,7 @@ namespace WorldPackets
// CMSG_CHAT_MESSAGE_PARTY
// CMSG_CHAT_MESSAGE_RAID
// CMSG_CHAT_MESSAGE_RAID_WARNING
+ // CMSG_CHAT_MESSAGE_INSTANCE_CHAT
class ChatMessage final : public ClientPacket
{
public:
@@ -76,6 +77,7 @@ namespace WorldPackets
// CMSG_CHAT_ADDON_MESSAGE_OFFICER
// CMSG_CHAT_ADDON_MESSAGE_PARTY
// CMSG_CHAT_ADDON_MESSAGE_RAID
+ // CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT
class ChatAddonMessage final : public ClientPacket
{
public:
@@ -91,7 +93,7 @@ namespace WorldPackets
class ChatAddonMessageWhisper final : public ClientPacket
{
public:
- ChatAddonMessageWhisper(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+ ChatAddonMessageWhisper(WorldPacket&& packet) : ClientPacket(CMSG_CHAT_ADDON_MESSAGE_WHISPER, std::move(packet)) { }
void Read() override;
@@ -100,6 +102,19 @@ namespace WorldPackets
std::string Text;
};
+ // CMSG_CHAT_ADDON_MESSAGE_CHANNEL
+ class ChatAddonMessageChannel final : public ClientPacket
+ {
+ public:
+ ChatAddonMessageChannel(WorldPacket&& packet) : ClientPacket(CMSG_CHAT_ADDON_MESSAGE_CHANNEL, std::move(packet)) { }
+
+ void Read() override;
+
+ std::string Text;
+ std::string Target;
+ std::string Prefix;
+ };
+
class ChatMessageDND final : public ClientPacket
{
public:
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 39db8a46370..bd9f90b8deb 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -261,9 +261,9 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_CHAR_CUSTOMIZE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharCustomize, &WorldSession::HandleCharCustomizeOpcode);
DEFINE_HANDLER(CMSG_CHAR_DELETE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharDelete, &WorldSession::HandleCharDeleteOpcode);
DEFINE_HANDLER(CMSG_CHAR_RACE_OR_FACTION_CHANGE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharRaceOrFactionChange, &WorldSession::HandleCharRaceOrFactionChangeOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAT_ADDON_MESSAGE_CHANNEL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_CHAT_ADDON_MESSAGE_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessageChannel, &WorldSession::HandleChatAddonMessageChannelOpcode);
DEFINE_HANDLER(CMSG_CHAT_ADDON_MESSAGE_GUILD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
DEFINE_HANDLER(CMSG_CHAT_ADDON_MESSAGE_OFFICER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
DEFINE_HANDLER(CMSG_CHAT_ADDON_MESSAGE_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
DEFINE_HANDLER(CMSG_CHAT_ADDON_MESSAGE_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
@@ -297,7 +297,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_CHAT_MESSAGE_DND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageDND, &WorldSession::HandleChatMessageDNDOpcode);
DEFINE_HANDLER(CMSG_CHAT_MESSAGE_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageEmote, &WorldSession::HandleChatMessageEmoteOpcode);
DEFINE_HANDLER(CMSG_CHAT_MESSAGE_GUILD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAT_MESSAGE_INSTANCE_CHAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_CHAT_MESSAGE_INSTANCE_CHAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
DEFINE_HANDLER(CMSG_CHAT_MESSAGE_OFFICER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
DEFINE_HANDLER(CMSG_CHAT_MESSAGE_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
DEFINE_HANDLER(CMSG_CHAT_MESSAGE_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 5045da4870f..0b9e24523fe 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -168,6 +168,7 @@ namespace WorldPackets
class ChatMessageChannel;
class ChatAddonMessage;
class ChatAddonMessageWhisper;
+ class ChatAddonMessageChannel;
class ChatMessageAFK;
class ChatMessageDND;
class ChatMessageEmote;
@@ -1207,6 +1208,7 @@ class WorldSession
void HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, std::string target = "");
void HandleChatAddonMessageOpcode(WorldPackets::Chat::ChatAddonMessage& chatAddonMessage);
void HandleChatAddonMessageWhisperOpcode(WorldPackets::Chat::ChatAddonMessageWhisper& chatAddonMessageWhisper);
+ void HandleChatAddonMessageChannelOpcode(WorldPackets::Chat::ChatAddonMessageChannel& chatAddonMessageChannel);
void HandleChatAddonMessage(ChatMsg type, std::string prefix, std::string text, std::string target = "");
void HandleChatMessageAFKOpcode(WorldPackets::Chat::ChatMessageAFK& chatMessageAFK);
void HandleChatMessageDNDOpcode(WorldPackets::Chat::ChatMessageDND& chatMessageDND);
diff --git a/src/server/scripts/World/chat_log.cpp b/src/server/scripts/World/chat_log.cpp
index 87dba586678..c11d2a0ac14 100644
--- a/src/server/scripts/World/chat_log.cpp
+++ b/src/server/scripts/World/chat_log.cpp
@@ -95,17 +95,17 @@ class ChatLogScript : public PlayerScript
player->GetName().c_str(), msg.c_str());
break;
- case CHAT_MSG_BATTLEGROUND:
+ case CHAT_MSG_INSTANCE_CHAT:
if (lang != LANG_ADDON)
- TC_LOG_DEBUG("chat.log.bg", "Player %s tells battleground with leader %s: %s",
+ TC_LOG_DEBUG("chat.log.bg", "Player %s tells instance with leader %s: %s",
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
else
- TC_LOG_DEBUG("chat.log.addon.bg", "Player %s tells battleground with leader %s: %s",
+ TC_LOG_DEBUG("chat.log.addon.bg", "Player %s tells instance with leader %s: %s",
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
break;
- case CHAT_MSG_BATTLEGROUND_LEADER:
- TC_LOG_DEBUG("chat.log.bg", "Leader player %s tells battleground: %s",
+ case CHAT_MSG_INSTANCE_CHAT_LEADER:
+ TC_LOG_DEBUG("chat.log.bg", "Leader player %s tells instance: %s",
player->GetName().c_str(), msg.c_str());
break;
}