diff options
author | Intel <chemicstry@gmail.com> | 2014-11-17 20:41:16 +0200 |
---|---|---|
committer | Intel <chemicstry@gmail.com> | 2014-11-17 20:49:15 +0200 |
commit | dbb102e6470dd51dbd277f4be9a3d20b977d7afe (patch) | |
tree | 48974dfcb012d64477bc0f97a1b41c2b95d2dfd1 /src | |
parent | da37723b5f6739eb536b3c32676177b3b821c39d (diff) |
Core/Packets: Added most of the chat packets
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Chat/Chat.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 9 | ||||
-rw-r--r-- | src/server/game/Handlers/ChatHandler.cpp | 704 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ChatPackets.cpp | 81 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ChatPackets.h | 129 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 39 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 29 |
11 files changed, 426 insertions, 590 deletions
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index fa89dca294c..0cee5868bb1 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -634,6 +634,7 @@ void ChatHandler::BuildChatPacket(WorldPackets::Chat::Chat* packet, ChatMsg chat uint32 achievementId /*= 0*/, std::string const& channelName /*= ""*/, LocaleConstant locale /*= DEFAULT_LOCALE*/, std::string const& addonPrefix /*= ""*/) { // Clear everything because same packet can be used multiple times + packet->Reset(); packet->SenderGUID.Clear(); packet->SenderAccountGUID.Clear(); packet->SenderGuildGUID.Clear(); @@ -655,7 +656,7 @@ void ChatHandler::BuildChatPacket(WorldPackets::Chat::Chat* packet, ChatMsg chat if (Player const* playerSender = sender->ToPlayer()) { - packet->SenderAccountGUID = ObjectGuid::Create<HighGuid::WowAccount>(playerSender->GetSession()->GetAccountId()); + packet->SenderAccountGUID = playerSender->GetSession()->GetAccountGUID(); packet->ChatFlags = playerSender->GetChatFlags(); if (Guild const* guild = playerSender->GetGuild()) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e5a719b5021..25179c7b62c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1410,10 +1410,10 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) void Unit::HandleEmoteCommand(uint32 anim_id) { - WorldPacket data(SMSG_EMOTE, 4 + 8); - data << uint32(anim_id); - data << GetGUID(); - SendMessageToSet(&data, true); + WorldPackets::Chat::Emote packet; + packet.Guid = GetGUID(); + packet.EmoteID = anim_id; + SendMessageToSet(packet.Write(), true); } bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* spellInfo, uint8 effIndex) diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 5898ba32de7..52cfad8e46c 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -155,6 +155,16 @@ bool normalizePlayerName(std::string& name) return true; } +// Extracts player and realm names delimited by - +ExtendedPlayerName ExtractExtendedPlayerName(std::string& name) +{ + size_t pos = name.find('-'); + if (pos != std::string::npos) + return ExtendedPlayerName(name.substr(0, pos), name.substr(pos+1)); + else + return ExtendedPlayerName(name, ""); +} + LanguageDesc lang_description[LANGUAGES_COUNT] = { { LANG_ADDON, 0, 0 }, diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index bb392caeffb..228b2e69566 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -677,6 +677,15 @@ SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const* rcEntry); bool normalizePlayerName(std::string& name); +struct ExtendedPlayerName +{ + ExtendedPlayerName(std::string name, std::string realm) : Name(name), Realm(realm) {} + std::string Name; + std::string Realm; +}; + +ExtendedPlayerName ExtractExtendedPlayerName(std::string& name); + struct LanguageDesc { Language lang_id; diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index ce1f0f8ea2d..c877a2a19b5 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -41,11 +41,9 @@ #include "AccountMgr.h" #include "ChatPackets.h" -void WorldSession::HandleMessagechatOpcode(WorldPackets::Chat::ChatMessage& packet) +void WorldSession::HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage& packet) { - uint32 type = 0; - uint32 lang = packet.Language; - std::string msg = packet.Text; + ChatMsg type; switch (packet.GetOpcode()) { @@ -75,9 +73,29 @@ void WorldSession::HandleMessagechatOpcode(WorldPackets::Chat::ChatMessage& pack return; } + HandleChatMessage(type, packet.Language, packet.Text); +} + +void WorldSession::HandleChatMessageWhisperOpcode(WorldPackets::Chat::ChatMessageWhisper& packet) +{ + HandleChatMessage(CHAT_MSG_WHISPER, packet.Language, packet.Text, packet.Target); +} + +void WorldSession::HandleChatMessageChannelOpcode(WorldPackets::Chat::ChatMessageChannel& packet) +{ + HandleChatMessage(CHAT_MSG_CHANNEL, packet.Language, packet.Text, packet.Target); +} + +void WorldSession::HandleChatMessageEmoteOpcode(WorldPackets::Chat::ChatMessageEmote& packet) +{ + HandleChatMessage(CHAT_MSG_EMOTE, LANG_UNIVERSAL, packet.Text); +} + +void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, std::string target /*= ""*/) +{ Player* sender = GetPlayer(); - if (packet.Language == LANG_UNIVERSAL) + if (lang == LANG_UNIVERSAL && type != CHAT_MSG_EMOTE) { TC_LOG_ERROR("network", "CMSG_MESSAGECHAT: Possible hacking-attempt: %s tried to send a message in universal language", GetPlayerInfo().c_str()); SendNotification(LANG_UNKNOWN_LANGUAGE); @@ -153,7 +171,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPackets::Chat::ChatMessage& pack return; } - if (sender->HasAura(1852) && type != CHAT_MSG_WHISPER) + if (sender->HasAura(GM_SILENCE_AURA) && type != CHAT_MSG_WHISPER) { SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str()); return; @@ -183,373 +201,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPackets::Chat::ChatMessage& pack switch (type) { case CHAT_MSG_SAY: - case CHAT_MSG_YELL: - { - // Prevent cheating - if (!sender->IsAlive()) - return; - - if (sender->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ)) - { - SendNotification(GetTrinityString(LANG_SAY_REQ), sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ)); - return; - } - - if (type == CHAT_MSG_SAY) - sender->Say(msg, Language(lang)); - else if (type == CHAT_MSG_EMOTE) - sender->TextEmote(msg); - else if (type == CHAT_MSG_YELL) - sender->Yell(msg, Language(lang)); - break; - } - case CHAT_MSG_PARTY: - { - // if player is in battleground, he cannot say to battleground members by /p - Group* group = GetPlayer()->GetOriginalGroup(); - if (!group) - { - group = sender->GetGroup(); - if (!group || group->isBGGroup()) - return; - } - - if (group->IsLeader(GetPlayer()->GetGUID())) - type = CHAT_MSG_PARTY_LEADER; - - sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); - - WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, ChatMsg(type), Language(lang), sender, NULL, msg); - group->BroadcastPacket(packet.Write(), false, group->GetMemberGroup(GetPlayer()->GetGUID())); - break; - } - case CHAT_MSG_GUILD: - { - if (GetPlayer()->GetGuildId()) - { - if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId())) - { - sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild); - - guild->BroadcastToGuild(this, false, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL); - } - } - break; - } - case CHAT_MSG_OFFICER: - { - if (GetPlayer()->GetGuildId()) - { - if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId())) - { - sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild); - - guild->BroadcastToGuild(this, true, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL); - } - } - break; - } - case CHAT_MSG_RAID: - { - // if player is in battleground, he cannot say to battleground members by /ra - Group* group = GetPlayer()->GetOriginalGroup(); - if (!group) - { - group = GetPlayer()->GetGroup(); - if (!group || group->isBGGroup() || !group->isRaidGroup()) - return; - } - - if (group->IsLeader(GetPlayer()->GetGUID())) - type = CHAT_MSG_RAID_LEADER; - - sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); - - WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, ChatMsg(type), Language(lang), sender, NULL, msg); - group->BroadcastPacket(packet.Write(), false); - break; - } - case CHAT_MSG_RAID_WARNING: - { - Group* group = GetPlayer()->GetGroup(); - if (!group || !group->isRaidGroup() || !(group->IsLeader(GetPlayer()->GetGUID()) || group->IsAssistant(GetPlayer()->GetGUID())) || group->isBGGroup()) - return; - - sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); - - WorldPackets::Chat::Chat packet; - //in battleground, raid warning is sent only to players in battleground - code is ok - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_RAID_WARNING, Language(lang), sender, NULL, msg); - group->BroadcastPacket(packet.Write(), false); - break; - } - default: - TC_LOG_ERROR("network", "CHAT: unknown message type %u, lang: %u", type, lang); - break; - } -} - - -/** Left in here until all chat messages are moved to new packets -void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) -{ - uint32 type = 0; - uint32 lang; - - switch (recvData.GetOpcode()) - { - case CMSG_MESSAGECHAT_SAY: - type = CHAT_MSG_SAY; - break; - case CMSG_MESSAGECHAT_YELL: - type = CHAT_MSG_YELL; - break; - case CMSG_MESSAGECHAT_CHANNEL: - type = CHAT_MSG_CHANNEL; - break; - case CMSG_MESSAGECHAT_WHISPER: - type = CHAT_MSG_WHISPER; - break; - case CMSG_MESSAGECHAT_GUILD: - type = CHAT_MSG_GUILD; - break; - case CMSG_MESSAGECHAT_OFFICER: - type = CHAT_MSG_OFFICER; - break; - case CMSG_MESSAGECHAT_AFK: - type = CHAT_MSG_AFK; - break; - case CMSG_MESSAGECHAT_DND: - type = CHAT_MSG_DND; - break; - case CMSG_MESSAGECHAT_EMOTE: - type = CHAT_MSG_EMOTE; - break; - case CMSG_MESSAGECHAT_PARTY: - type = CHAT_MSG_PARTY; - break; - case CMSG_MESSAGECHAT_RAID: - type = CHAT_MSG_RAID; - break; - case CMSG_MESSAGECHAT_BATTLEGROUND: - type = CHAT_MSG_BATTLEGROUND; - break; - case CMSG_MESSAGECHAT_RAID_WARNING: - type = CHAT_MSG_RAID_WARNING; - break; - default: - TC_LOG_ERROR("network", "HandleMessagechatOpcode : Unknown chat opcode (%u)", recvData.GetOpcode()); - recvData.hexlike(); - return; - } - - if (type >= MAX_CHAT_MSG_TYPE) - { - TC_LOG_ERROR("network", "CHAT: Wrong message type received: %u", type); - recvData.rfinish(); - return; - } - - Player* sender = GetPlayer(); - - //TC_LOG_DEBUG("misc", "CHAT: packet received. type %u, lang %u", type, lang); - - // no language sent with emote packet. - if (type != CHAT_MSG_EMOTE && type != CHAT_MSG_AFK && type != CHAT_MSG_DND) - { - recvData >> lang; - - if (lang == LANG_UNIVERSAL) - { - TC_LOG_ERROR("network", "CMSG_MESSAGECHAT: Possible hacking-attempt: %s tried to send a message in universal language", GetPlayerInfo().c_str()); - SendNotification(LANG_UNKNOWN_LANGUAGE); - recvData.rfinish(); - return; - } - - // prevent talking at unknown language (cheating) - LanguageDesc const* langDesc = GetLanguageDescByID(lang); - if (!langDesc) - { - SendNotification(LANG_UNKNOWN_LANGUAGE); - recvData.rfinish(); - return; - } - - if (langDesc->skill_id != 0 && !sender->HasSkill(langDesc->skill_id)) - { - // also check SPELL_AURA_COMPREHEND_LANGUAGE (client offers option to speak in that language) - Unit::AuraEffectList const& langAuras = sender->GetAuraEffectsByType(SPELL_AURA_COMPREHEND_LANGUAGE); - bool foundAura = false; - for (Unit::AuraEffectList::const_iterator i = langAuras.begin(); i != langAuras.end(); ++i) - { - if ((*i)->GetMiscValue() == int32(lang)) - { - foundAura = true; - break; - } - } - if (!foundAura) - { - SendNotification(LANG_NOT_LEARNED_LANGUAGE); - recvData.rfinish(); - return; - } - } - - if (lang == LANG_ADDON) - { - // LANG_ADDON is only valid for the following message types - switch (type) - { - case CHAT_MSG_PARTY: - case CHAT_MSG_RAID: - case CHAT_MSG_GUILD: - case CHAT_MSG_BATTLEGROUND: - case CHAT_MSG_WHISPER: - // check if addon messages are disabled - if (!sWorld->getBoolConfig(CONFIG_ADDON_CHANNEL)) - { - recvData.rfinish(); - return; - } - break; - default: - TC_LOG_ERROR("network", "Player %s (%s) sent a chatmessage with an invalid language/message type combination", - GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str()); - - recvData.rfinish(); - return; - } - } - // LANG_ADDON should not be changed nor be affected by flood control - else - { - // send in universal language if player in .gm on mode (ignore spell effects) - if (sender->IsGameMaster()) - lang = LANG_UNIVERSAL; - else - { - // send in universal language in two side iteration allowed mode - if (HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT)) - lang = LANG_UNIVERSAL; - else - { - switch (type) - { - case CHAT_MSG_PARTY: - case CHAT_MSG_PARTY_LEADER: - case CHAT_MSG_RAID: - case CHAT_MSG_RAID_LEADER: - case CHAT_MSG_RAID_WARNING: - // allow two side chat at group channel if two side group allowed - if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP)) - lang = LANG_UNIVERSAL; - break; - case CHAT_MSG_GUILD: - case CHAT_MSG_OFFICER: - // allow two side chat at guild channel if two side guild allowed - if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD)) - lang = LANG_UNIVERSAL; - break; - } - } - - // but overwrite it by SPELL_AURA_MOD_LANGUAGE auras (only single case used) - Unit::AuraEffectList const& ModLangAuras = sender->GetAuraEffectsByType(SPELL_AURA_MOD_LANGUAGE); - if (!ModLangAuras.empty()) - lang = ModLangAuras.front()->GetMiscValue(); - } - - if (!sender->CanSpeak()) - { - std::string timeStr = secsToTimeString(m_muteTime - time(NULL)); - SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str()); - recvData.rfinish(); // Prevent warnings - return; - } - } - } - else - lang = LANG_UNIVERSAL; - - if (sender->HasAura(1852) && type != CHAT_MSG_WHISPER) - { - SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str()); - recvData.rfinish(); - return; - } - - uint32 textLength = 0; - uint32 receiverLength = 0; - std::string to, channel, msg; - bool ignoreChecks = false; - switch (type) - { - case CHAT_MSG_SAY: - case CHAT_MSG_EMOTE: - case CHAT_MSG_YELL: - case CHAT_MSG_PARTY: - case CHAT_MSG_GUILD: - case CHAT_MSG_OFFICER: - case CHAT_MSG_RAID: - case CHAT_MSG_RAID_WARNING: - case CHAT_MSG_BATTLEGROUND: - textLength = recvData.ReadBits(9); - msg = recvData.ReadString(textLength); - break; - case CHAT_MSG_WHISPER: - receiverLength = recvData.ReadBits(10); - textLength = recvData.ReadBits(9); - to = recvData.ReadString(receiverLength); - msg = recvData.ReadString(textLength); - break; - case CHAT_MSG_CHANNEL: - receiverLength = recvData.ReadBits(10); - textLength = recvData.ReadBits(9); - msg = recvData.ReadString(textLength); - channel = recvData.ReadString(receiverLength); - break; - case CHAT_MSG_AFK: - case CHAT_MSG_DND: - textLength = recvData.ReadBits(9); - msg = recvData.ReadString(textLength); - ignoreChecks = true; - break; - } - - if (!ignoreChecks) - { - if (msg.empty()) - return; - - if (ChatHandler(this).ParseCommands(msg.c_str())) - return; - - if (lang != LANG_ADDON) - { - // Strip invisible characters for non-addon messages - if (sWorld->getBoolConfig(CONFIG_CHAT_FAKE_MESSAGE_PREVENTING)) - stripLineInvisibleChars(msg); - - if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY) && !ChatHandler(this).isValidChatMessage(msg.c_str())) - { - TC_LOG_ERROR("network", "Player %s (%s) sent a chatmessage with an invalid link: %s", GetPlayer()->GetName().c_str(), - GetPlayer()->GetGUID().ToString().c_str(), msg.c_str()); - - if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_KICK)) - KickPlayer(); - - return; - } - } - } - - switch (type) - { - case CHAT_MSG_SAY: case CHAT_MSG_EMOTE: case CHAT_MSG_YELL: { @@ -573,16 +224,19 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) } case CHAT_MSG_WHISPER: { - if (!normalizePlayerName(to)) + /// @todo implement cross realm whispers (someday) + ExtendedPlayerName extName = ExtractExtendedPlayerName(target); + + if (!normalizePlayerName(extName.Name)) { - SendPlayerNotFoundNotice(to); + SendPlayerNotFoundNotice(target); break; } - Player* receiver = ObjectAccessor::FindConnectedPlayerByName(to); + Player* receiver = ObjectAccessor::FindConnectedPlayerByName(extName.Name); if (!receiver || (lang != LANG_ADDON && !receiver->isAcceptWhispers() && receiver->GetSession()->HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !receiver->IsInWhisperWhiteList(sender->GetGUID()))) { - SendPlayerNotFoundNotice(to); + SendPlayerNotFoundNotice(target); return; } if (!sender->IsGameMaster() && sender->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ) && !receiver->IsInWhisperWhiteList(sender->GetGUID())) @@ -613,7 +267,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) break; } case CHAT_MSG_PARTY: - case CHAT_MSG_PARTY_LEADER: { // if player is in battleground, he cannot say to battleground members by /p Group* group = GetPlayer()->GetOriginalGroup(); @@ -629,9 +282,9 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); - WorldPacket data; - ChatHandler::BuildChatPacket(data, ChatMsg(type), Language(lang), sender, NULL, msg); - group->BroadcastPacket(&data, false, group->GetMemberGroup(GetPlayer()->GetGUID())); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, ChatMsg(type), Language(lang), sender, NULL, msg); + group->BroadcastPacket(packet.Write(), false, group->GetMemberGroup(GetPlayer()->GetGUID())); break; } case CHAT_MSG_GUILD: @@ -661,25 +314,19 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) break; } case CHAT_MSG_RAID: - case CHAT_MSG_RAID_LEADER: { - // if player is in battleground, he cannot say to battleground members by /ra Group* group = GetPlayer()->GetOriginalGroup(); if (!group) - { - group = GetPlayer()->GetGroup(); - if (!group || group->isBGGroup() || !group->isRaidGroup()) - return; - } + return; if (group->IsLeader(GetPlayer()->GetGUID())) type = CHAT_MSG_RAID_LEADER; sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); - WorldPacket data; - ChatHandler::BuildChatPacket(data, ChatMsg(type), Language(lang), sender, NULL, msg); - group->BroadcastPacket(&data, false); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, ChatMsg(type), Language(lang), sender, NULL, msg); + group->BroadcastPacket(packet.Write(), false); break; } case CHAT_MSG_RAID_WARNING: @@ -690,28 +337,10 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); - WorldPacket data; + WorldPackets::Chat::Chat packet; //in battleground, raid warning is sent only to players in battleground - code is ok - ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_WARNING, Language(lang), sender, NULL, msg); - group->BroadcastPacket(&data, false); - break; - } - case CHAT_MSG_BATTLEGROUND: - case CHAT_MSG_BATTLEGROUND_LEADER: - { - // battleground raid is always in Player->GetGroup(), never in GetOriginalGroup() - Group* group = GetPlayer()->GetGroup(); - if (!group || !group->isBGGroup()) - return; - - if (group->IsLeader(GetPlayer()->GetGUID())) - type = CHAT_MSG_BATTLEGROUND_LEADER; - - sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); - - WorldPacket data; - ChatHandler::BuildChatPacket(data, ChatMsg(type), Language(lang), sender, NULL, msg); - group->BroadcastPacket(&data, false); + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_RAID_WARNING, Language(lang), sender, NULL, msg); + group->BroadcastPacket(packet.Write(), false); break; } case CHAT_MSG_CHANNEL: @@ -727,7 +356,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) if (ChannelMgr* cMgr = ChannelMgr::forTeam(sender->GetTeam())) { - if (Channel* chn = cMgr->GetChannel(channel, sender)) + if (Channel* chn = cMgr->GetChannel(target, sender)) { sScriptMgr->OnPlayerChat(sender, type, lang, msg, chn); chn->Say(sender->GetGUID(), msg.c_str(), lang); @@ -735,70 +364,18 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) } break; } - case CHAT_MSG_AFK: - { - if (!sender->IsInCombat()) - { - if (sender ->isAFK()) // Already AFK - { - if (msg.empty()) - sender->ToggleAFK(); // Remove AFK - else - sender->autoReplyMsg = msg; // Update message - } - else // New AFK mode - { - sender->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_AFK_DEFAULT) : msg; - - if (sender->isDND()) - sender->ToggleDND(); - - sender->ToggleAFK(); - } - - sScriptMgr->OnPlayerChat(sender, type, lang, msg); - } - break; - } - case CHAT_MSG_DND: - { - if (sender->isDND()) // Already DND - { - if (msg.empty()) - sender->ToggleDND(); // Remove DND - else - sender->autoReplyMsg = msg; // Update message - } - else // New DND mode - { - sender->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_DND_DEFAULT) : msg; - - if (sender->isAFK()) - sender->ToggleAFK(); - - sender->ToggleDND(); - } - - sScriptMgr->OnPlayerChat(sender, type, lang, msg); - break; - } default: TC_LOG_ERROR("network", "CHAT: unknown message type %u, lang: %u", type, lang); break; } -}*/ +} -void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) +void WorldSession::HandleChatAddonMessageOpcode(WorldPackets::Chat::ChatAddonMessage& packet) { - Player* sender = GetPlayer(); ChatMsg type; - switch (recvData.GetOpcode()) + switch (packet.GetOpcode()) { - /* - case CMSG_MESSAGECHAT_ADDON_BATTLEGROUND: - type = CHAT_MSG_BATTLEGROUND; - break; case CMSG_MESSAGECHAT_ADDON_GUILD: type = CHAT_MSG_GUILD; break; @@ -811,95 +388,50 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) case CMSG_MESSAGECHAT_ADDON_RAID: type = CHAT_MSG_RAID; break; - case CMSG_MESSAGECHAT_ADDON_WHISPER: - type = CHAT_MSG_WHISPER; - break; - */ default: - TC_LOG_ERROR("network", "HandleAddonMessagechatOpcode: Unknown addon chat opcode (%u)", recvData.GetOpcode()); - recvData.hexlike(); + TC_LOG_ERROR("network", "HandleChatAddonMessageOpcode: Unknown addon chat opcode (%u)", packet.GetOpcode()); return; } - std::string message; - std::string prefix; - std::string targetName; + HandleChatAddonMessage(type, packet.Prefix, packet.Text); +} - switch (type) - { - case CHAT_MSG_WHISPER: - { - uint32 msgLen = recvData.ReadBits(9); - uint32 prefixLen = recvData.ReadBits(5); - uint32 targetLen = recvData.ReadBits(10); - message = recvData.ReadString(msgLen); - prefix = recvData.ReadString(prefixLen); - targetName = recvData.ReadString(targetLen); - break; - } - case CHAT_MSG_PARTY: - case CHAT_MSG_RAID: - case CHAT_MSG_OFFICER: - { - uint32 prefixLen = recvData.ReadBits(5); - uint32 msgLen = recvData.ReadBits(9); - prefix = recvData.ReadString(prefixLen); - message = recvData.ReadString(msgLen); - break; - } - case CHAT_MSG_GUILD: - case CHAT_MSG_BATTLEGROUND: - { - uint32 msgLen = recvData.ReadBits(9); - uint32 prefixLen = recvData.ReadBits(5); - message = recvData.ReadString(msgLen); - prefix = recvData.ReadString(prefixLen); - break; - } - default: - break; - } +void WorldSession::HandleChatAddonMessageWhisperOpcode(WorldPackets::Chat::ChatAddonMessageWhisper& packet) +{ + HandleChatAddonMessage(CHAT_MSG_WHISPER, packet.Prefix, packet.Text, packet.Target); +} + +void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std::string text, std::string target /*= ""*/) +{ + Player* sender = GetPlayer(); if (prefix.empty() || prefix.length() > 16) return; // Disabled addon channel? if (!sWorld->getBoolConfig(CONFIG_ADDON_CHANNEL)) - { - recvData.rfinish(); return; - } switch (type) { - case CHAT_MSG_BATTLEGROUND: - { - Group* group = sender->GetGroup(); - if (!group || !group->isBGGroup()) - return; - - WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, type, LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix); - group->BroadcastAddonMessagePacket(packet.Write(), prefix, false); - break; - } case CHAT_MSG_GUILD: case CHAT_MSG_OFFICER: { if (sender->GetGuildId()) if (Guild* guild = sGuildMgr->GetGuildById(sender->GetGuildId())) - guild->BroadcastAddonToGuild(this, type == CHAT_MSG_OFFICER, message, prefix); + guild->BroadcastAddonToGuild(this, type == CHAT_MSG_OFFICER, text, prefix); break; } case CHAT_MSG_WHISPER: { - if (!normalizePlayerName(targetName)) + if (!normalizePlayerName(target)) break; - Player* receiver = sObjectAccessor->FindPlayerByName(targetName); + + Player* receiver = sObjectAccessor->FindPlayerByName(target); if (!receiver) break; - sender->WhisperAddon(message, prefix, receiver); + sender->WhisperAddon(text, prefix, receiver); break; } // Messages sent to "RAID" while in a party will get delivered to "PARTY" @@ -908,11 +440,11 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) { Group* group = sender->GetGroup(); - if (!group || group->isBGGroup()) + if (!group) break; WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, type, LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix); + ChatHandler::BuildChatPacket(&packet, type, LANG_ADDON, sender, NULL, text, 0U, "", DEFAULT_LOCALE, prefix); group->BroadcastAddonMessagePacket(packet.Write(), prefix, true, -1, sender->GetGUID()); break; } @@ -924,6 +456,72 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) } } +void WorldSession::HandleChatMessageAFKOpcode(WorldPackets::Chat::ChatMessageAFK& packet) +{ + Player* sender = GetPlayer(); + + if (sender->IsInCombat()) + return; + + if (sender->HasAura(GM_SILENCE_AURA)) + { + SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str()); + return; + } + + if (sender->isAFK()) // Already AFK + { + if (packet.Text.empty()) + sender->ToggleAFK(); // Remove AFK + else + sender->autoReplyMsg = packet.Text; // Update message + } + else // New AFK mode + { + sender->autoReplyMsg = packet.Text.empty() ? GetTrinityString(LANG_PLAYER_AFK_DEFAULT) : packet.Text; + + if (sender->isDND()) + sender->ToggleDND(); + + sender->ToggleAFK(); + } + + sScriptMgr->OnPlayerChat(sender, CHAT_MSG_AFK, LANG_UNIVERSAL, packet.Text); +} + +void WorldSession::HandleChatMessageDNDOpcode(WorldPackets::Chat::ChatMessageDND& packet) +{ + Player* sender = GetPlayer(); + + if (sender->IsInCombat()) + return; + + if (sender->HasAura(GM_SILENCE_AURA)) + { + SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str()); + return; + } + + if (sender->isDND()) // Already DND + { + if (packet.Text.empty()) + sender->ToggleDND(); // Remove DND + else + sender->autoReplyMsg = packet.Text; // Update message + } + else // New DND mode + { + sender->autoReplyMsg = packet.Text.empty() ? GetTrinityString(LANG_PLAYER_DND_DEFAULT) : packet.Text; + + if (sender->isAFK()) + sender->ToggleAFK(); + + sender->ToggleDND(); + } + + sScriptMgr->OnPlayerChat(sender, CHAT_MSG_DND, LANG_UNIVERSAL, packet.Text); +} + void WorldSession::HandleEmoteOpcode(WorldPacket& recvData) { if (!GetPlayer()->IsAlive() || GetPlayer()->HasUnitState(UNIT_STATE_DIED)) @@ -945,18 +543,13 @@ namespace Trinity void operator()(WorldPacket& data, LocaleConstant loc_idx) { - std::string const name(i_target ? i_target->GetNameForLocaleIdx(loc_idx) : ""); - uint32 namlen = name.size(); - - data.Initialize(SMSG_TEXT_EMOTE, 20 + namlen); - data << i_player.GetGUID(); - data << uint32(i_text_emote); - data << uint32(i_emote_num); - data << uint32(namlen); - if (namlen > 1) - data << name; - else - data << uint8(0x00); + WorldPackets::Chat::STextEmote packet; + packet.SourceGUID = i_player.GetGUID(); + packet.SourceAccountGUID = i_player.GetSession()->GetAccountGUID(); + packet.TargetGUID = i_target->GetGUID(); + packet.EmoteID = i_emote_num; + packet.SoundIndex = i_text_emote; + data = *packet.Write(); } private: @@ -965,11 +558,10 @@ namespace Trinity uint32 i_emote_num; Unit const* i_target; }; -} // namespace Trinity +} -void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) +void WorldSession::HandleTextEmoteOpcode(WorldPackets::Chat::CTextEmote& packet) { - /* if (!GetPlayer()->IsAlive()) return; @@ -980,16 +572,9 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) return; } - uint32 text_emote, emoteNum; - ObjectGuid guid; - - recvData >> text_emote; - recvData >> emoteNum; - recvData >> guid; - - sScriptMgr->OnPlayerTextEmote(GetPlayer(), text_emote, emoteNum, guid); + sScriptMgr->OnPlayerTextEmote(GetPlayer(), packet.SoundIndex, packet.EmoteID, packet.Target); - EmotesTextEntry const* em = sEmotesTextStore.LookupEntry(text_emote); + EmotesTextEntry const* em = sEmotesTextStore.LookupEntry(packet.SoundIndex); if (!em) return; @@ -1014,25 +599,24 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) break; } - Unit* unit = ObjectAccessor::GetUnit(*_player, guid); + Unit* unit = ObjectAccessor::GetUnit(*_player, packet.Target); CellCoord p = Trinity::ComputeCellCoord(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY()); Cell cell(p); cell.SetNoCreate(); - Trinity::EmoteChatBuilder emote_builder(*GetPlayer(), text_emote, emoteNum, unit); + Trinity::EmoteChatBuilder emote_builder(*GetPlayer(), packet.SoundIndex, packet.EmoteID, unit); Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder > emote_do(emote_builder); Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder > > emote_worker(GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), emote_do); TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder> >, WorldTypeMapContainer> message(emote_worker); cell.Visit(p, message, *GetPlayer()->GetMap(), *GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE)); - GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, text_emote, 0, 0, unit); + GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, packet.SoundIndex, 0, 0, unit); //Send scripted event call if (unit && unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->AI()) - ((Creature*)unit)->AI()->ReceiveEmote(GetPlayer(), text_emote); - */ + ((Creature*)unit)->AI()->ReceiveEmote(GetPlayer(), packet.SoundIndex); } void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData) diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 09197206fdc..7b6ca00416c 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -4129,6 +4129,8 @@ enum ChatMsg CHAT_MSG_CURRENCY = 0x40 }; +#define GM_SILENCE_AURA 1852 + #define MAX_CHAT_MSG_TYPE 0x41 enum ChatFlags diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp index 6b544480a71..7b6cf236f11 100644 --- a/src/server/game/Server/Packets/ChatPackets.cpp +++ b/src/server/game/Server/Packets/ChatPackets.cpp @@ -24,6 +24,61 @@ void WorldPackets::Chat::ChatMessage::Read() Text = _worldPacket.ReadString(len); } +void WorldPackets::Chat::ChatMessageWhisper::Read() +{ + _worldPacket >> Language; + uint32 targetLen = _worldPacket.ReadBits(9); + uint32 textLen = _worldPacket.ReadBits(8); + Target = _worldPacket.ReadString(targetLen); + Text = _worldPacket.ReadString(textLen); +} + +void WorldPackets::Chat::ChatMessageChannel::Read() +{ + _worldPacket >> Language; + uint32 targetLen = _worldPacket.ReadBits(9); + uint32 textLen = _worldPacket.ReadBits(8); + _worldPacket.ResetBitPos(); + Target = _worldPacket.ReadString(targetLen); + Text = _worldPacket.ReadString(textLen); +} + +void WorldPackets::Chat::ChatAddonMessage::Read() +{ + uint32 prefixLen = _worldPacket.ReadBits(5); + uint32 textLen = _worldPacket.ReadBits(8); + Prefix = _worldPacket.ReadString(prefixLen); + Text = _worldPacket.ReadString(textLen); +} + +void WorldPackets::Chat::ChatAddonMessageWhisper::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); + Text = _worldPacket.ReadString(len); +} + +void WorldPackets::Chat::ChatMessageAFK::Read() +{ + uint32 len = _worldPacket.ReadBits(8); + Text = _worldPacket.ReadString(len); +} + +void WorldPackets::Chat::ChatMessageEmote::Read() +{ + uint32 len = _worldPacket.ReadBits(8); + Text = _worldPacket.ReadString(len); +} + WorldPacket const* WorldPackets::Chat::Chat::Write() { _worldPacket << SlashCmd; @@ -53,3 +108,29 @@ WorldPacket const* WorldPackets::Chat::Chat::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Chat::Emote::Write() +{ + _worldPacket << Guid; + _worldPacket << EmoteID; + + return &_worldPacket; +} + +void WorldPackets::Chat::CTextEmote::Read() +{ + _worldPacket >> Target; + _worldPacket >> EmoteID; + _worldPacket >> SoundIndex; +} + +WorldPacket const* WorldPackets::Chat::STextEmote::Write() +{ + _worldPacket << SourceGUID; + _worldPacket << SourceAccountGUID; + _worldPacket << SoundIndex; + _worldPacket << EmoteID; + _worldPacket << TargetGUID; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h index 4aa49312daf..47735177dd9 100644 --- a/src/server/game/Server/Packets/ChatPackets.h +++ b/src/server/game/Server/Packets/ChatPackets.h @@ -24,6 +24,13 @@ namespace WorldPackets { namespace Chat { + // CMSG_MESSAGECHAT_GUILD + // CMSG_MESSAGECHAT_OFFICER + // CMSG_MESSAGECHAT_YELL + // CMSG_MESSAGECHAT_SAY + // CMSG_MESSAGECHAT_PARTY + // CMSG_MESSAGECHAT_RAID + // CMSG_MESSAGECHAT_RAID_WARNING class ChatMessage final : public ClientPacket { public: @@ -35,6 +42,91 @@ namespace WorldPackets int32 Language = LANG_UNIVERSAL; }; + // CMSG_MESSAGECHAT_WHISPER + class ChatMessageWhisper final : public ClientPacket + { + public: + ChatMessageWhisper(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + + void Read() override; + + int32 Language = LANG_UNIVERSAL; + std::string Text; + std::string Target; + }; + + // CMSG_MESSAGECHAT_CHANNEL + class ChatMessageChannel final : public ClientPacket + { + public: + ChatMessageChannel(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + + void Read() override; + + int32 Language = LANG_UNIVERSAL; + std::string Text; + std::string Target; + }; + + // CMSG_MESSAGECHAT_ADDON_GUILD + // CMSG_MESSAGECHAT_ADDON_OFFICER + // CMSG_MESSAGECHAT_ADDON_PARTY + // CMSG_MESSAGECHAT_ADDON_RAID + class ChatAddonMessage final : public ClientPacket + { + public: + ChatAddonMessage(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + + void Read() override; + + std::string Prefix; + std::string Text; + }; + + // CMSG_MESSAGECHAT_ADDON_WHISPER + class ChatAddonMessageWhisper final : public ClientPacket + { + public: + ChatAddonMessageWhisper(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + + void Read() override; + + std::string Prefix; + std::string Target; + std::string Text; + }; + + class ChatMessageDND final : public ClientPacket + { + public: + ChatMessageDND(WorldPacket&& packet) : ClientPacket(CMSG_MESSAGECHAT_DND, std::move(packet)) { } + + void Read() override; + + std::string Text; + }; + + class ChatMessageAFK final : public ClientPacket + { + public: + ChatMessageAFK(WorldPacket&& packet) : ClientPacket(CMSG_MESSAGECHAT_AFK, std::move(packet)) { } + + void Read() override; + + std::string Text; + }; + + class ChatMessageEmote final : public ClientPacket + { + public: + ChatMessageEmote(WorldPacket&& packet) : ClientPacket(CMSG_MESSAGECHAT_EMOTE, std::move(packet)) { } + + void Read() override; + + std::string Text; + }; + + // SMSG_MESSAGECHAT class Chat final : public ServerPacket { public: @@ -62,6 +154,43 @@ namespace WorldPackets bool HideChatLog = false; bool FakeSenderName = false; }; + + class Emote final : public ServerPacket + { + public: + Emote() : ServerPacket(SMSG_EMOTE, 8+4) { } + + WorldPacket const* Write() override; + + ObjectGuid Guid; + int32 EmoteID; + }; + + class CTextEmote final : public ClientPacket + { + public: + CTextEmote(WorldPacket&& packet) : ClientPacket(CMSG_TEXT_EMOTE, std::move(packet)) { } + + void Read() override; + + ObjectGuid Target; + int32 EmoteID; + int32 SoundIndex; + }; + + class STextEmote final : public ServerPacket + { + public: + STextEmote() : ServerPacket(SMSG_TEXT_EMOTE, 8+8+4+4) { } + + WorldPacket const* Write() override; + + ObjectGuid SourceGUID; + ObjectGuid SourceAccountGUID; // Not in JAM + ObjectGuid TargetGUID; + int32 SoundIndex; + int32 EmoteID; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 99e46f6f591..6e506e2544e 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -19,6 +19,7 @@ #include "Opcodes.h" #include "WorldSession.h" #include "Packets/CharacterPackets.h" +#include "Packets/ChannelPackets.h" #include "Packets/ChatPackets.h" #include "Packets/ClientConfigPackets.h" #include "Packets/CombatPackets.h" @@ -404,25 +405,23 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_RETURN_TO_SENDER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailReturnToSender ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_TAKE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailTakeItem ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_TAKE_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailTakeMoney ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_GUILD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_OFFICER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_PARTY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_RAID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_WHISPER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_AFK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_DND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_EMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); - DEFINE_HANDLER(CMSG_MESSAGECHAT_GUILD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); - DEFINE_HANDLER(CMSG_MESSAGECHAT_OFFICER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); - DEFINE_HANDLER(CMSG_MESSAGECHAT_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); - DEFINE_HANDLER(CMSG_MESSAGECHAT_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); - DEFINE_HANDLER(CMSG_MESSAGECHAT_RAID_WARNING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); - DEFINE_HANDLER(CMSG_MESSAGECHAT_SAY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); - DEFINE_HANDLER(CMSG_MESSAGECHAT_YELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_WHISPER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); + DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_GUILD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_OFFICER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_WHISPER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessageWhisper, &WorldSession::HandleChatAddonMessageWhisperOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_AFK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageAFK, &WorldSession::HandleChatMessageAFKOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageChannel, &WorldSession::HandleChatMessageChannelOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_DND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageDND, &WorldSession::HandleChatMessageDNDOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageEmote, &WorldSession::HandleChatMessageEmoteOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_GUILD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_OFFICER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_RAID_WARNING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_SAY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_YELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_WHISPER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageWhisper, &WorldSession::HandleChatMessageWhisperOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_MINIGAME_MOVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MINIMAP_PING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMinimapPingOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOUNTSPECIAL_ANIM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMountSpecialAnimOpcode ); @@ -623,7 +622,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXINODE_STATUS_QUERY, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiNodeStatusQueryOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXIQUERYAVAILABLENODES, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TELEPORT_TO_UNIT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TEXT_EMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTextEmoteOpcode ); + DEFINE_HANDLER(CMSG_TEXT_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::CTextEmote, &WorldSession::HandleTextEmoteOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_TIME_ADJUSTMENT_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_TIME_SYNC_RESP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::TimeSyncResponse, &WorldSession::HandleTimeSyncResp); DEFINE_OPCODE_HANDLER_OLD(CMSG_TIME_SYNC_RESP_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 413a99bb9c4..3e061cb0192 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -354,14 +354,12 @@ enum OpcodeClient : uint32 CMSG_MAIL_TAKE_ITEM = 0xBADD, CMSG_MAIL_TAKE_MONEY = 0xBADD, CMSG_MEETINGSTONE_INFO = 0xBADD, - CMSG_MESSAGECHAT_ADDON_BATTLEGROUND = 0xBADD, CMSG_MESSAGECHAT_ADDON_GUILD = 0x137C, CMSG_MESSAGECHAT_ADDON_OFFICER = 0x188A, CMSG_MESSAGECHAT_ADDON_PARTY = 0x015C, CMSG_MESSAGECHAT_ADDON_RAID = 0x082C, CMSG_MESSAGECHAT_ADDON_WHISPER = 0x18A2, CMSG_MESSAGECHAT_AFK = 0x1BDC, - CMSG_MESSAGECHAT_BATTLEGROUND = 0xBADD, CMSG_MESSAGECHAT_CHANNEL = 0x0913, CMSG_MESSAGECHAT_DND = 0x0AAB, CMSG_MESSAGECHAT_EMOTE = 0x113C, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 011cfbaf6c4..14513730e84 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -102,9 +102,22 @@ namespace WorldPackets class UserClientUpdateAccountData; } + namespace Channel + { + class JoinChannel; + } + namespace Chat { class ChatMessage; + class ChatMessageWhisper; + class ChatMessageChannel; + class ChatAddonMessage; + class ChatAddonMessageWhisper; + class ChatMessageAFK; + class ChatMessageDND; + class ChatMessageEmote; + class CTextEmote; } namespace Combat @@ -308,7 +321,9 @@ class WorldSession AccountTypes GetSecurity() const { return _security; } uint32 GetAccountId() const { return _accountId; } + ObjectGuid GetAccountGUID() const { return ObjectGuid::Create<HighGuid::WowAccount>(GetAccountId()); } uint32 GetBattlenetAccountId() const { return _battlenetAccountId; } + ObjectGuid GetBattlenetAccountGUID() const { return ObjectGuid::Create<HighGuid::BNetAccount>(GetBattlenetAccountId()); } Player* GetPlayer() const { return _player; } std::string const& GetPlayerName() const; std::string GetPlayerInfo() const; @@ -821,13 +836,21 @@ class WorldSession void HandlePushQuestToParty(WorldPacket& recvPacket); void HandleQuestPushResult(WorldPacket& recvPacket); - void HandleMessagechatOpcode(WorldPackets::Chat::ChatMessage& packet); - void HandleAddonMessagechatOpcode(WorldPacket& recvPacket); + void HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage& packet); + void HandleChatMessageWhisperOpcode(WorldPackets::Chat::ChatMessageWhisper& packet); + void HandleChatMessageChannelOpcode(WorldPackets::Chat::ChatMessageChannel& packet); + void HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, std::string target = ""); + void HandleChatAddonMessageOpcode(WorldPackets::Chat::ChatAddonMessage& packet); + void HandleChatAddonMessageWhisperOpcode(WorldPackets::Chat::ChatAddonMessageWhisper& packet); + void HandleChatAddonMessage(ChatMsg type, std::string prefix, std::string text, std::string target = ""); + void HandleChatMessageAFKOpcode(WorldPackets::Chat::ChatMessageAFK& packet); + void HandleChatMessageDNDOpcode(WorldPackets::Chat::ChatMessageDND& packet); + void HandleChatMessageEmoteOpcode(WorldPackets::Chat::ChatMessageEmote& packet); void SendPlayerNotFoundNotice(std::string const& name); void SendPlayerAmbiguousNotice(std::string const& name); void SendWrongFactionNotice(); void SendChatRestrictedNotice(ChatRestrictionType restriction); - void HandleTextEmoteOpcode(WorldPacket& recvPacket); + void HandleTextEmoteOpcode(WorldPackets::Chat::CTextEmote& packet); void HandleChatIgnoredOpcode(WorldPacket& recvPacket); void HandleUnregisterAddonPrefixesOpcode(WorldPacket& recvPacket); |