diff options
-rw-r--r-- | src/server/game/Handlers/ChatHandler.cpp | 51 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 49 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ChatPackets.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ChatPackets.h | 17 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 | ||||
-rw-r--r-- | src/server/scripts/World/chat_log.cpp | 10 |
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; } |