From 218f14f84b692288e58c292a9808a073e50f96ad Mon Sep 17 00:00:00 2001 From: Intel Date: Sun, 16 Nov 2014 18:17:08 +0200 Subject: Core/Packets: Added some chat message packets --- src/server/game/Handlers/ChatHandler.cpp | 277 +++++++++++++++++++++++++++++-- 1 file changed, 265 insertions(+), 12 deletions(-) (limited to 'src/server/game/Handlers/ChatHandler.cpp') diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index a2fc248bb61..ce1f0f8ea2d 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -39,7 +39,260 @@ #include "Util.h" #include "ScriptMgr.h" #include "AccountMgr.h" +#include "ChatPackets.h" +void WorldSession::HandleMessagechatOpcode(WorldPackets::Chat::ChatMessage& packet) +{ + uint32 type = 0; + uint32 lang = packet.Language; + std::string msg = packet.Text; + + switch (packet.GetOpcode()) + { + case CMSG_MESSAGECHAT_SAY: + type = CHAT_MSG_SAY; + break; + case CMSG_MESSAGECHAT_YELL: + type = CHAT_MSG_YELL; + break; + case CMSG_MESSAGECHAT_GUILD: + type = CHAT_MSG_GUILD; + break; + case CMSG_MESSAGECHAT_OFFICER: + type = CHAT_MSG_OFFICER; + break; + case CMSG_MESSAGECHAT_PARTY: + type = CHAT_MSG_PARTY; + break; + case CMSG_MESSAGECHAT_RAID: + type = CHAT_MSG_RAID; + break; + case CMSG_MESSAGECHAT_RAID_WARNING: + type = CHAT_MSG_RAID_WARNING; + break; + default: + TC_LOG_ERROR("network", "HandleMessagechatOpcode : Unknown chat opcode (%u)", packet.GetOpcode()); + return; + } + + Player* sender = GetPlayer(); + + if (packet.Language == 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); + return; + } + + // prevent talking at unknown language (cheating) + LanguageDesc const* langDesc = GetLanguageDescByID(lang); + if (!langDesc) + { + SendNotification(LANG_UNKNOWN_LANGUAGE); + 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); + return; + } + } + + // 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_RAID: + 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()); + return; + } + + if (sender->HasAura(1852) && type != CHAT_MSG_WHISPER) + { + SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str()); + return; + } + + if (msg.empty()) + return; + + if (ChatHandler(this).ParseCommands(msg.c_str())) + return; + + // 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_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; @@ -47,7 +300,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) switch (recvData.GetOpcode()) { - /* case CMSG_MESSAGECHAT_SAY: type = CHAT_MSG_SAY; break; @@ -87,7 +339,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) 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(); @@ -535,7 +786,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) TC_LOG_ERROR("network", "CHAT: unknown message type %u, lang: %u", type, lang); break; } -} +}*/ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) { @@ -627,9 +878,9 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) if (!group || !group->isBGGroup()) return; - WorldPacket data; - ChatHandler::BuildChatPacket(data, type, LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix); - group->BroadcastAddonMessagePacket(&data, prefix, false); + 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: @@ -660,9 +911,9 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) if (!group || group->isBGGroup()) break; - WorldPacket data; - ChatHandler::BuildChatPacket(data, type, LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix); - group->BroadcastAddonMessagePacket(&data, prefix, true, -1, sender->GetGUID()); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, type, LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix); + group->BroadcastAddonMessagePacket(packet.Write(), prefix, true, -1, sender->GetGUID()); break; } default: @@ -718,6 +969,7 @@ namespace Trinity void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) { + /* if (!GetPlayer()->IsAlive()) return; @@ -780,6 +1032,7 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) //Send scripted event call if (unit && unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->AI()) ((Creature*)unit)->AI()->ReceiveEmote(GetPlayer(), text_emote); + */ } void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData) @@ -811,9 +1064,9 @@ void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData) if (!player || !player->GetSession()) return; - WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_IGNORED, LANG_UNIVERSAL, _player, _player, GetPlayer()->GetName()); - player->GetSession()->SendPacket(&data); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_IGNORED, LANG_UNIVERSAL, _player, _player, GetPlayer()->GetName()); + player->GetSession()->SendPacket(packet.Write()); } void WorldSession::HandleChannelDeclineInvite(WorldPacket &recvPacket) -- cgit v1.2.3 From dbb102e6470dd51dbd277f4be9a3d20b977d7afe Mon Sep 17 00:00:00 2001 From: Intel Date: Mon, 17 Nov 2014 20:41:16 +0200 Subject: Core/Packets: Added most of the chat packets --- src/server/game/Chat/Chat.cpp | 3 +- src/server/game/Entities/Unit/Unit.cpp | 8 +- src/server/game/Globals/ObjectMgr.cpp | 10 + src/server/game/Globals/ObjectMgr.h | 9 + src/server/game/Handlers/ChatHandler.cpp | 704 +++++-------------------- src/server/game/Miscellaneous/SharedDefines.h | 2 + src/server/game/Server/Packets/ChatPackets.cpp | 81 +++ src/server/game/Server/Packets/ChatPackets.h | 129 +++++ src/server/game/Server/Protocol/Opcodes.cpp | 39 +- src/server/game/Server/Protocol/Opcodes.h | 2 - src/server/game/Server/WorldSession.h | 29 +- 11 files changed, 426 insertions(+), 590 deletions(-) (limited to 'src/server/game/Handlers/ChatHandler.cpp') 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(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; @@ -180,373 +198,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPackets::Chat::ChatMessage& pack return; } - 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: @@ -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 emote_do(emote_builder); Trinity::PlayerDistWorker > emote_worker(GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), emote_do); TypeContainerVisitor >, 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(GetAccountId()); } uint32 GetBattlenetAccountId() const { return _battlenetAccountId; } + ObjectGuid GetBattlenetAccountGUID() const { return ObjectGuid::Create(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); -- cgit v1.2.3 From abff9de719ac189fc82da87f077a24dba69cfdbb Mon Sep 17 00:00:00 2001 From: joschiwald Date: Wed, 19 Nov 2014 21:09:30 +0100 Subject: Core/Packets: updated EquipmentSet save packets --- src/server/game/Entities/Creature/Creature.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 161 +++++++++------------ src/server/game/Entities/Player/Player.h | 28 ++-- src/server/game/Entities/Unit/Unit.cpp | 2 +- src/server/game/Handlers/CharacterHandler.cpp | 70 ++++----- src/server/game/Handlers/ChatHandler.cpp | 2 +- src/server/game/Handlers/QuestHandler.cpp | 18 +-- .../game/Server/Packets/EquipmentSetPackets.cpp | 43 ++++-- .../game/Server/Packets/EquipmentSetPackets.h | 25 +++- src/server/game/Server/Packets/MovementPackets.cpp | 34 +++-- src/server/game/Server/Packets/MovementPackets.h | 2 +- src/server/game/Server/Packets/QuestPackets.h | 8 +- src/server/game/Server/Packets/SpellPackets.cpp | 2 + src/server/game/Server/Protocol/Opcodes.cpp | 7 +- src/server/game/Server/WorldSession.h | 7 +- 15 files changed, 213 insertions(+), 198 deletions(-) (limited to 'src/server/game/Handlers/ChatHandler.cpp') diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 3765c54b42a..3a74d2cc045 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1832,7 +1832,7 @@ void Creature::SendAIReaction(AiReaction reactionType) packet.UnitGUID = GetGUID(); packet.Reaction = reactionType; - ((WorldObject*)this)->SendMessageToSet(packet.Write(), true); + SendMessageToSet(packet.Write(), true); TC_LOG_DEBUG("network", "WORLD: Sent SMSG_AI_REACTION, type %u.", reactionType); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a11c75a2c6f..96ab5c860c6 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2166,7 +2166,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati packet.Pos = m_teleport_dest; packet.Reason = 16; - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); SendSavedInstances(); } @@ -6217,7 +6217,7 @@ void Player::SendActionButtons(uint32 state) const packet.Reason = state; - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); TC_LOG_INFO("network", "Action Buttons for '%s' group '%u' Sent", GetGUID().ToString().c_str(), GetActiveTalentGroup()); } @@ -16745,28 +16745,25 @@ void Player::_LoadEquipmentSets(PreparedQueryResult result) if (!result) return; - uint32 count = 0; do { Field* fields = result->Fetch(); - EquipmentSet eqSet; + EquipmentSetInfo eqSet; - eqSet.Guid = fields[0].GetUInt64(); - uint8 index = fields[1].GetUInt8(); - eqSet.Name = fields[2].GetString(); - eqSet.IconName = fields[3].GetString(); - eqSet.IgnoreMask = fields[4].GetUInt32(); - eqSet.state = EQUIPMENT_SET_UNCHANGED; + eqSet.Data.Guid = fields[0].GetUInt64(); + eqSet.Data.SetID = fields[1].GetUInt8(); + eqSet.Data.SetName = fields[2].GetString(); + eqSet.Data.SetIcon = fields[3].GetString(); + eqSet.Data.IgnoreMask = fields[4].GetUInt32(); + eqSet.State = EQUIPMENT_SET_UNCHANGED; for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) - eqSet.Items[i] = fields[5 + i].GetUInt64(); + eqSet.Data.Pieces[i] = ObjectGuid::Create(fields[5 + i].GetUInt64()); - m_EquipmentSets[index] = eqSet; - - ++count; + if (eqSet.Data.SetID >= MAX_EQUIPMENT_SET_INDEX) // client limit + continue; - if (count >= MAX_EQUIPMENT_SET_INDEX) // client limit - break; + _equipmentSets[eqSet.Data.SetID] = eqSet; } while (result->NextRow()); } @@ -20463,7 +20460,7 @@ void Player::WhisperAddon(std::string const& text, const std::string& prefix, Pl WorldPackets::Chat::Chat packet; ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER, LANG_ADDON, this, this, text, 0, "", DEFAULT_LOCALE, prefix); - receiver->GetSession()->SendPacket(packet.Write()); + receiver->SendDirectMessage(packet.Write()); } void Player::Whisper(std::string const& text, Language language, Player* target, bool /*= false*/) @@ -20480,14 +20477,14 @@ void Player::Whisper(std::string const& text, Language language, Player* target, WorldPackets::Chat::Chat packet; ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER, Language(language), this, this, _text); - target->GetSession()->SendPacket(packet.Write()); + target->SendDirectMessage(packet.Write()); // rest stuff shouldn't happen in case of addon message if (isAddonMessage) return; ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text); - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster()) { @@ -20980,7 +20977,7 @@ void Player::SendProficiency(ItemClass itemClass, uint32 itemSubclassMask) WorldPackets::Item::SetProficiency packet; packet.ProficiencyMask = itemSubclassMask; packet.ProficiencyClass = itemClass; - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); } void Player::RemovePetitionsAndSigns(ObjectGuid guid, uint32 type) @@ -25627,7 +25624,7 @@ void Player::SendTalentsInfoData() packet.Info.TalentGroups.push_back(groupInfoPkt); } - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); } void Player::BuildEnchantmentsInfoData(WorldPacket* data) @@ -25677,117 +25674,98 @@ void Player::SendEquipmentSetList() { WorldPackets::EquipmentSet::LoadEquipmentSet data; - for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr) + for (EquipmentSetContainer::value_type const& eqSet : _equipmentSets) { - if (itr->second.state == EQUIPMENT_SET_DELETED) + if (eqSet.second.State == EQUIPMENT_SET_DELETED) continue; - WorldPackets::EquipmentSet::EquipmentSetData setData; - setData.Guid = itr->second.Guid; - setData.SetID = itr->first; - setData.IgnoreMask = itr->second.IgnoreMask; - setData.SetName = itr->second.Name; - setData.SetIcon = itr->second.IconName; - - for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) - { - if (!(itr->second.IgnoreMask & (1 << i))) - setData.Pieces[i] = ObjectGuid::Create(itr->second.Items[i]); - } - - data.SetData.emplace_back(setData); + data.SetData.push_back(&eqSet.second.Data); } SendDirectMessage(data.Write()); } -void Player::SetEquipmentSet(uint32 index, EquipmentSet eqset) +void Player::SetEquipmentSet(EquipmentSetInfo::EquipmentSetData&& newEqSet) { - if (eqset.Guid != 0) + if (newEqSet.Guid != 0) { - bool found = false; - - for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr) - { - if ((itr->second.Guid == eqset.Guid) && (itr->first == index)) - { - found = true; - break; - } - } - - if (!found) // something wrong... + // something wrong... + EquipmentSetContainer::const_iterator itr = _equipmentSets.find(newEqSet.SetID); + if (itr == _equipmentSets.end() || itr->second.Data.Guid != newEqSet.Guid) { - TC_LOG_ERROR("entities.player", "Player %s tried to save equipment set " UI64FMTD " (index %u), but that equipment set not found!", GetName().c_str(), eqset.Guid, index); + TC_LOG_ERROR("entities.player", "Player %s tried to save equipment set " UI64FMTD " (index: %u), but that equipment set not found!", GetName().c_str(), newEqSet.Guid, newEqSet.SetID); return; } } - EquipmentSet& eqslot = m_EquipmentSets[index]; + EquipmentSetInfo& eqSlot = _equipmentSets[newEqSet.SetID]; - EquipmentSetUpdateState old_state = eqslot.state; + EquipmentSetUpdateState oldState = eqSlot.State; - eqslot = eqset; + eqSlot.Data = newEqSet; - if (eqset.Guid == 0) + if (eqSlot.Data.Guid == 0) { - eqslot.Guid = sObjectMgr->GenerateEquipmentSetGuid(); + eqSlot.Data.Guid = sObjectMgr->GenerateEquipmentSetGuid(); - WorldPacket data(SMSG_EQUIPMENT_SET_SAVED, 4 + 1); - data << uint32(index); - data.AppendPackedUInt64(eqslot.Guid); - GetSession()->SendPacket(&data); + WorldPackets::EquipmentSet::EquipmentSetID data; + data.GUID = eqSlot.Data.Guid; + data.SetID = eqSlot.Data.SetID; + SendDirectMessage(data.Write()); } - eqslot.state = old_state == EQUIPMENT_SET_NEW ? EQUIPMENT_SET_NEW : EQUIPMENT_SET_CHANGED; + eqSlot.State = oldState == EQUIPMENT_SET_NEW ? EQUIPMENT_SET_NEW : EQUIPMENT_SET_CHANGED; } void Player::_SaveEquipmentSets(SQLTransaction& trans) { - for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end();) + for (EquipmentSetContainer::iterator itr = _equipmentSets.begin(); itr != _equipmentSets.end();) { - uint32 index = itr->first; - EquipmentSet& eqset = itr->second; - PreparedStatement* stmt = NULL; + EquipmentSetInfo& eqSet = itr->second; + PreparedStatement* stmt = nullptr; uint8 j = 0; - switch (eqset.state) + switch (eqSet.State) { case EQUIPMENT_SET_UNCHANGED: ++itr; break; // nothing do case EQUIPMENT_SET_CHANGED: stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_EQUIP_SET); - stmt->setString(j++, eqset.Name.c_str()); - stmt->setString(j++, eqset.IconName.c_str()); - stmt->setUInt32(j++, eqset.IgnoreMask); - for (uint8 i=0; isetUInt64(j++, eqset.Items[i]); + stmt->setString(j++, eqSet.Data.SetName); + stmt->setString(j++, eqSet.Data.SetIcon); + stmt->setUInt32(j++, eqSet.Data.IgnoreMask); + + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + stmt->setUInt64(j++, eqSet.Data.Pieces[i].GetCounter()); + stmt->setUInt64(j++, GetGUID().GetCounter()); - stmt->setUInt64(j++, eqset.Guid); - stmt->setUInt32(j, index); + stmt->setUInt64(j++, eqSet.Data.Guid); + stmt->setUInt32(j, eqSet.Data.SetID); trans->Append(stmt); - eqset.state = EQUIPMENT_SET_UNCHANGED; + eqSet.State = EQUIPMENT_SET_UNCHANGED; ++itr; break; case EQUIPMENT_SET_NEW: stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_EQUIP_SET); stmt->setUInt64(j++, GetGUID().GetCounter()); - stmt->setUInt64(j++, eqset.Guid); - stmt->setUInt32(j++, index); - stmt->setString(j++, eqset.Name.c_str()); - stmt->setString(j++, eqset.IconName.c_str()); - stmt->setUInt32(j++, eqset.IgnoreMask); - for (uint8 i=0; isetUInt64(j++, eqset.Items[i]); + stmt->setUInt64(j++, eqSet.Data.Guid); + stmt->setUInt32(j++, eqSet.Data.SetID); + stmt->setString(j++, eqSet.Data.SetName); + stmt->setString(j++, eqSet.Data.SetIcon); + stmt->setUInt32(j++, eqSet.Data.IgnoreMask); + + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + stmt->setUInt64(j++, eqSet.Data.Pieces[i].GetCounter()); + trans->Append(stmt); - eqset.state = EQUIPMENT_SET_UNCHANGED; + eqSet.State = EQUIPMENT_SET_UNCHANGED; ++itr; break; case EQUIPMENT_SET_DELETED: stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EQUIP_SET); - stmt->setUInt64(0, eqset.Guid); + stmt->setUInt64(0, eqSet.Data.Guid); trans->Append(stmt); - m_EquipmentSets.erase(itr++); + itr = _equipmentSets.erase(itr); break; } } @@ -25816,16 +25794,17 @@ void Player::_SaveBGData(SQLTransaction& trans) void Player::DeleteEquipmentSet(uint64 setGuid) { - for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr) + for (EquipmentSetContainer::iterator itr = _equipmentSets.begin(); itr != _equipmentSets.end();) { - if (itr->second.Guid == setGuid) + if (itr->second.Data.Guid == setGuid) { - if (itr->second.state == EQUIPMENT_SET_NEW) - m_EquipmentSets.erase(itr); + if (itr->second.State == EQUIPMENT_SET_NEW) + itr = _equipmentSets.erase(itr); else - itr->second.state = EQUIPMENT_SET_DELETED; + itr->second.State = EQUIPMENT_SET_DELETED; break; } + ++itr; } } @@ -26191,7 +26170,7 @@ void Player::SendTimeSync() WorldPackets::Misc::TimeSyncRequest packet; packet.SequenceIndex = m_timeSyncQueue.back(); - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); // Schedule next sync in 10 sec m_timeSyncTimer = 10000; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ac3becd987a..165819a5eaf 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -747,24 +747,26 @@ enum EquipmentSetUpdateState EQUIPMENT_SET_DELETED = 3 }; -struct EquipmentSet +struct EquipmentSetInfo { - EquipmentSet() : Guid(0), IgnoreMask(0), state(EQUIPMENT_SET_NEW) + /// Data sent in EquipmentSet related packets + struct EquipmentSetData { - memset(Items, 0, sizeof(Items)); - } + uint64 Guid = 0; ///< Set Identifier + uint32 SetID = 0; ///< Index + uint32 IgnoreMask = 0; ///< Mask of EquipmentSlot + std::string SetName; + std::string SetIcon; + ObjectGuid Pieces[EQUIPMENT_SLOT_END]; + } Data; - uint64 Guid; - std::string Name; - std::string IconName; - uint32 IgnoreMask; - ObjectGuid::LowType Items[EQUIPMENT_SLOT_END]; - EquipmentSetUpdateState state; + /// Server-side data + EquipmentSetUpdateState State = EQUIPMENT_SET_NEW; }; #define MAX_EQUIPMENT_SET_INDEX 10 // client limit -typedef std::map EquipmentSets; +typedef std::map EquipmentSetContainer; struct ItemPosCount { @@ -2229,7 +2231,7 @@ class Player : public Unit, public GridObject void CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item* item, ItemTemplate const* proto); void SendEquipmentSetList(); - void SetEquipmentSet(uint32 index, EquipmentSet eqset); + void SetEquipmentSet(EquipmentSetInfo::EquipmentSetData&& newEqSet); void DeleteEquipmentSet(uint64 setGuid); void SendInitWorldStates(uint32 zone, uint32 area); @@ -2842,7 +2844,7 @@ class Player : public Unit, public GridObject DeclinedName *m_declinedname; Runes *m_runes; - EquipmentSets m_EquipmentSets; + EquipmentSetContainer _equipmentSets; bool CanAlwaysSee(WorldObject const* obj) const override; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 77d5a28b1ce..121eed89e3c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12868,7 +12868,7 @@ void Unit::SendPetAIReaction(ObjectGuid guid) WorldPackets::Combat::AIReaction packet; packet.UnitGUID = guid; packet.Reaction = AI_REACTION_HOSTILE; - owner->ToPlayer()->GetSession()->SendPacket(packet.Write()); + owner->ToPlayer()->SendDirectMessage(packet.Write()); } ///----------End of Pet responses methods---------- diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index a2e6f4b0340..42db4f42953 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -29,6 +29,7 @@ #include "ClientConfigPackets.h" #include "Common.h" #include "DatabaseEnv.h" +#include "EquipmentSetPackets.h" #include "Group.h" #include "Guild.h" #include "GuildFinderMgr.h" @@ -857,6 +858,16 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) /// Send FeatureSystemStatus { WorldPackets::System::FeatureSystemStatus features; + + /// START OF DUMMY VALUES + features.ComplaintStatus = 2; + features.ScrollOfResurrectionRequestsRemaining = 1; + features.ScrollOfResurrectionMaxRequestsPerDay = 1; + features.CfgRealmID = 2; + features.CfgRealmRecID = 0; + features.VoiceEnabled = true; + /// END OF DUMMY VALUES + features.CharUndeleteEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED); features.BpayStoreEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_BPAY_STORE_ENABLED); @@ -1525,59 +1536,36 @@ void WorldSession::HandleCharCustomizeCallback(PreparedQueryResult result, World GetAccountId(), GetRemoteAddress().c_str(), oldName.c_str(), customizeInfo->CharGUID.ToString().c_str(), customizeInfo->CharName.c_str()); } -void WorldSession::HandleEquipmentSetSave(WorldPacket& recvData) +void WorldSession::HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& packet) { TC_LOG_DEBUG("network", "CMSG_EQUIPMENT_SET_SAVE"); - uint64 setGuid; - recvData.ReadPackedUInt64(setGuid); - - uint32 index; - recvData >> index; - if (index >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount + if (packet.Set.SetID >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount return; - std::string name; - recvData >> name; - - std::string iconName; - recvData >> iconName; - - EquipmentSet eqSet; - - eqSet.Guid = setGuid; - eqSet.Name = name; - eqSet.IconName = iconName; - eqSet.state = EQUIPMENT_SET_NEW; - - ObjectGuid ignoredItemGuid; - ignoredItemGuid.SetRawValue(0, 1); - - for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) { - ObjectGuid itemGuid; - recvData >> itemGuid.ReadAsPacked(); - - // equipment manager sends "1" (as raw GUID) for slots set to "ignore" (don't touch slot at equip set) - if (itemGuid == ignoredItemGuid) + if (!(packet.Set.IgnoreMask & (1 << i))) { - // ignored slots saved as bit mask because we have no free special values for Items[i] - eqSet.IgnoreMask |= 1 << i; - continue; - } - - Item* item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i); + ObjectGuid const& itemGuid = packet.Set.Pieces[i]; - if (!item && !itemGuid.IsEmpty()) // cheating check 1 - return; + Item* item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i); - if (item && item->GetGUID() != itemGuid) // cheating check 2 - return; + /// cheating check 1 (item equipped but sent empty guid) + if (!item && !itemGuid.IsEmpty()) + return; - eqSet.Items[i] = itemGuid.GetCounter(); + /// cheating check 2 (sent guid does not match equipped item) + if (item && item->GetGUID() != itemGuid) + return; + } + else + packet.Set.Pieces[i].Clear(); } - _player->SetEquipmentSet(index, eqSet); + packet.Set.IgnoreMask &= 0x7FFFF; /// clear invalid bits (i > EQUIPMENT_SLOT_END) + + _player->SetEquipmentSet(std::move(packet.Set)); } void WorldSession::HandleEquipmentSetDelete(WorldPacket& recvData) diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index c877a2a19b5..a2485d7854b 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -650,7 +650,7 @@ void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData) WorldPackets::Chat::Chat packet; ChatHandler::BuildChatPacket(&packet, CHAT_MSG_IGNORED, LANG_UNIVERSAL, _player, _player, GetPlayer()->GetName()); - player->GetSession()->SendPacket(packet.Write()); + player->SendDirectMessage(packet.Write()); } void WorldSession::HandleChannelDeclineInvite(WorldPacket &recvPacket) diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index e259af0b604..f591a5fa988 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -642,14 +642,10 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::Ques { TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY"); - uint32 count = 0; - WorldPackets::Quest::QuestGiverStatusMultiple response; for (GuidSet::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) { - uint32 questStatus = DIALOG_STATUS_NONE; - if (itr->IsAnyTypeCreature()) { // need also pet quests case support @@ -659,12 +655,7 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::Ques if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) continue; - questStatus = _player->GetQuestDialogStatus(questgiver); - - WorldPackets::Quest::QuestGiverInfo info; - info.Guid = questgiver->GetGUID(); - info.Status = questStatus; - response.QuestGiver.push_back(info); + response.QuestGiver.emplace_back(questgiver->GetGUID(), _player->GetQuestDialogStatus(questgiver)); } else if (itr->IsGameObject()) { @@ -672,12 +663,7 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::Ques if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) continue; - questStatus = _player->GetQuestDialogStatus(questgiver); - - WorldPackets::Quest::QuestGiverInfo info; - info.Guid = questgiver->GetGUID(); - info.Status = questStatus; - response.QuestGiver.push_back(info); + response.QuestGiver.emplace_back(questgiver->GetGUID(), _player->GetQuestDialogStatus(questgiver)); } } diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.cpp b/src/server/game/Server/Packets/EquipmentSetPackets.cpp index ea8df38bcd1..07cab20debf 100644 --- a/src/server/game/Server/Packets/EquipmentSetPackets.cpp +++ b/src/server/game/Server/Packets/EquipmentSetPackets.cpp @@ -17,24 +17,49 @@ #include "EquipmentSetPackets.h" +WorldPacket const* WorldPackets::EquipmentSet::EquipmentSetID::Write() +{ + _worldPacket << uint64(GUID); + _worldPacket << uint32(SetID); + + return &_worldPacket; +} + WorldPacket const* WorldPackets::EquipmentSet::LoadEquipmentSet::Write() { _worldPacket << uint32(SetData.size()); - for (EquipmentSetData const& equipSet : SetData) + for (EquipmentSetInfo::EquipmentSetData const* equipSet : SetData) { - _worldPacket << uint64(equipSet.Guid); - _worldPacket << uint32(equipSet.SetID); - _worldPacket << uint32(equipSet.IgnoreMask); + _worldPacket << uint64(equipSet->Guid); + _worldPacket << uint32(equipSet->SetID); + _worldPacket << uint32(equipSet->IgnoreMask); - for (ObjectGuid const& guid : equipSet.Pieces) + for (ObjectGuid const& guid : equipSet->Pieces) _worldPacket << guid; - _worldPacket.WriteBits(equipSet.SetName.length(), 8); - _worldPacket.WriteBits(equipSet.SetIcon.length(), 9); - _worldPacket.WriteString(equipSet.SetName); - _worldPacket.WriteString(equipSet.SetIcon); + _worldPacket.WriteBits(equipSet->SetName.length(), 8); + _worldPacket.WriteBits(equipSet->SetIcon.length(), 9); + _worldPacket.WriteString(equipSet->SetName); + _worldPacket.WriteString(equipSet->SetIcon); + _worldPacket.FlushBits(); } return &_worldPacket; } + +void WorldPackets::EquipmentSet::SaveEquipmentSet::Read() +{ + _worldPacket >> Set.Guid; + _worldPacket >> Set.SetID; + _worldPacket >> Set.IgnoreMask; + + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + _worldPacket >> Set.Pieces[i]; + + uint32 setNameLength = _worldPacket.ReadBits(8); + uint32 setIconLength = _worldPacket.ReadBits(9); + + Set.SetName = _worldPacket.ReadString(setNameLength); + Set.SetIcon = _worldPacket.ReadString(setIconLength); +} diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.h b/src/server/game/Server/Packets/EquipmentSetPackets.h index 530a8b0efad..b01c483f5ac 100644 --- a/src/server/game/Server/Packets/EquipmentSetPackets.h +++ b/src/server/game/Server/Packets/EquipmentSetPackets.h @@ -24,14 +24,15 @@ namespace WorldPackets { namespace EquipmentSet { - struct EquipmentSetData + class EquipmentSetID final : public ServerPacket { - uint64 Guid = 0; ///< Set Identifier + public: + EquipmentSetID() : ServerPacket(SMSG_EQUIPMENT_SET_SAVED, 8 + 4) { } + + WorldPacket const* Write() override; + + uint64 GUID = 0; ///< Set Identifier uint32 SetID = 0; ///< Index - uint32 IgnoreMask = 0; - std::string SetName; - std::string SetIcon; - ObjectGuid Pieces[EQUIPMENT_SLOT_END]; }; class LoadEquipmentSet final : public ServerPacket @@ -41,7 +42,17 @@ namespace WorldPackets WorldPacket const* Write() override; - std::vector SetData; + std::vector SetData; + }; + + class SaveEquipmentSet final : public ClientPacket + { + public: + SaveEquipmentSet(WorldPacket&& packet) : ClientPacket(CMSG_EQUIPMENT_SET_SAVE, std::move(packet)) { } + + void Read() override; + + EquipmentSetInfo::EquipmentSetData Set; }; } } diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 010631c0529..659b3eaaf2b 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -18,14 +18,16 @@ #include "MovementPackets.h" #include "MovementTypedefs.h" -ByteBuffer& operator << (ByteBuffer& data, const G3D::Vector3& v) +ByteBuffer& operator<<(ByteBuffer& data, G3D::Vector3 const& v) { data << v.x << v.y << v.z; + return data; } -ByteBuffer& operator >> (ByteBuffer& data, G3D::Vector3& v) +ByteBuffer& operator>>(ByteBuffer& data, G3D::Vector3& v) { data >> v.x >> v.y >> v.z; + return data; } ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo) @@ -53,8 +55,6 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo) data << ObjectGuid; }*/ - data.FlushBits(); - data.WriteBits(movementInfo.flags, 30); data.WriteBits(movementInfo.flags2, 15); @@ -86,8 +86,6 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo) data << movementInfo.jump.fallTime; data << movementInfo.jump.zspeed; - data.FlushBits(); - data.WriteBit(hasFallDirection); if (hasFallDirection) { @@ -98,6 +96,8 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo) } data.FlushBits(); + + return data; } ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo) @@ -161,6 +161,8 @@ ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo) data >> movementInfo.jump.xyspeed; } } + + return data; } void WorldPackets::Movement::ClientPlayerMovement::Read() @@ -172,6 +174,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineFi { data << monsterSplineFilterKey.Idx; data << monsterSplineFilterKey.Speed; + + return data; } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineFilter& monsterSplineFilter) @@ -183,8 +187,10 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineFi for (WorldPackets::Movement::MonsterSplineFilterKey& filterKey : monsterSplineFilter.FilterKeys) data << filterKey; data << monsterSplineFilter.AddedToStart; - data.FlushBits(); data.WriteBits(monsterSplineFilter.FilterFlags, 2); + data.FlushBits(); + + return data; } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementSpline& movementSpline) @@ -202,13 +208,14 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementSpline& data << movementSpline.TransportGUID; data << movementSpline.VehicleSeat; data << int32(movementSpline.PackedDeltas.size()); - for (G3D::Vector3& pos : movementSpline.Points) + for (G3D::Vector3 const& pos : movementSpline.Points) data << pos; - for (G3D::Vector3& pos : movementSpline.PackedDeltas) + for (G3D::Vector3 const& pos : movementSpline.PackedDeltas) data.appendPackXYZ(pos.x, pos.y, pos.z); - data.FlushBits(); data.WriteBits(movementSpline.Face, 2); data.WriteBit(movementSpline.SplineFilter.HasValue); + data.FlushBits(); + switch (movementSpline.Face) { case MONSTER_MOVE_FACING_SPOT: @@ -222,8 +229,11 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementSpline& data << movementSpline.FaceDirection; break; } + if (movementSpline.SplineFilter.HasValue) data << movementSpline.SplineFilter.value; + + return data; } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementMonsterSpline& movementMonsterSpline) @@ -231,8 +241,10 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementMonster data << movementMonsterSpline.ID; data << movementMonsterSpline.Destination; data << movementMonsterSpline.Move; - data.FlushBits(); data.WriteBit(movementMonsterSpline.CrzTeleport); + data.FlushBits(); + + return data; } WorldPacket const* WorldPackets::Movement::MonsterMove::Write() diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 8aebb1db9fc..ee8a4d12c01 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -148,7 +148,7 @@ namespace WorldPackets } } -ByteBuffer& operator<<(ByteBuffer& data, const G3D::Vector3& v); +ByteBuffer& operator<<(ByteBuffer& data, G3D::Vector3 const& v); ByteBuffer& operator>>(ByteBuffer& data, G3D::Vector3& v); ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo); diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index c656662761d..8fc5fe000f1 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -41,11 +41,15 @@ namespace WorldPackets public: QuestGiverStatusMultipleQuery(WorldPacket&& packet) : ClientPacket(CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY, std::move(packet)) { } - void Read() override {}; + void Read() override { } }; struct QuestGiverInfo { + QuestGiverInfo() { } + QuestGiverInfo(ObjectGuid const& guid, uint32 status) + : Guid(guid), Status(status) { } + ObjectGuid Guid; uint32 Status = DIALOG_STATUS_NONE; }; @@ -53,7 +57,7 @@ namespace WorldPackets class QuestGiverStatus final : public ServerPacket { public: - QuestGiverStatus() : ServerPacket(SMSG_QUESTGIVER_STATUS, 12) { } + QuestGiverStatus() : ServerPacket(SMSG_QUESTGIVER_STATUS, 22) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 37738f4033c..2e345d5b9a4 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -78,5 +78,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spell::SpellCastLogData& data.WriteBit(false); // data << float // Unk data if bit is true data.FlushBits(); + + return data; } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ab4b768cfd4..de9b3d0746b 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -23,6 +23,7 @@ #include "Packets/ChatPackets.h" #include "Packets/ClientConfigPackets.h" #include "Packets/CombatPackets.h" +#include "Packets/EquipmentSetPackets.h" #include "Packets/GuildPackets.h" #include "Packets/MiscPackets.h" #include "Packets/MovementPackets.h" @@ -278,7 +279,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_ENABLETAXI, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes ); DEFINE_OPCODE_HANDLER_OLD(CMSG_ENABLE_NAGLE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess ); DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetDelete ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_SAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetSave ); + DEFINE_HANDLER(CMSG_EQUIPMENT_SET_SAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::SaveEquipmentSet, &WorldSession::HandleEquipmentSetSave); DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_USE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetUse ); DEFINE_OPCODE_HANDLER_OLD(CMSG_FACTION_BONUS_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_FAR_SIGHT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleFarSightOpcode ); @@ -889,8 +890,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_BARBER_SHOP, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCHANTMENTLOG, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENVIRONMENTALDAMAGELOG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_LIST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_SAVED, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_LIST, STATUS_NEVER); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_SAVED, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_USE_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPECTED_SPAM_RECORDS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPLORATION_EXPERIENCE, STATUS_UNHANDLED); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index c176bf5a3b1..eae081f2b74 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -126,6 +126,11 @@ namespace WorldPackets class AttackStop; } + namespace EquipmentSet + { + class SaveEquipmentSet; + } + namespace Guild { class QueryGuildInfo; @@ -1095,7 +1100,7 @@ class WorldSession void HandleRemoveGlyph(WorldPacket& recvData); void HandleQueryInspectAchievements(WorldPacket& recvData); void HandleGuildAchievementProgressQuery(WorldPacket& recvData); - void HandleEquipmentSetSave(WorldPacket& recvData); + void HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& packet); void HandleEquipmentSetDelete(WorldPacket& recvData); void HandleEquipmentSetUse(WorldPacket& recvData); void HandleWorldStateUITimerUpdate(WorldPacket& recvData); -- cgit v1.2.3 From 7f96163c94a3fab3da492c5d4ec91976c0fd4391 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Sun, 23 Nov 2014 04:25:47 +0100 Subject: Core/Packets: - updated/enabled CMSG_CHANNEL_DISPLAY_LIST, CMSG_CHANNEL_LIST, CMSG_JOIN_CHANNEL, CMSG_LEAVE_CHANNEL, SMSG_CHANNEL_LIST, SMSG_CHANNEL_NOTIFY_JOINED, SMSG_CHANNEL_NOTIFY_LEFT - updated CMSG_SET_SELECTION - updated CMSG_TUTORIAL_FLAG (removed CMSG_TUTORIAL_CLEAR, CMSG_TUTORIAL_RESET) - fixed null guid in EquipmentSetList - fixed struct of MonsterMove --- src/server/game/Chat/Channels/Channel.cpp | 650 ++++++++++----------- src/server/game/Chat/Channels/Channel.h | 185 +++--- src/server/game/Chat/Channels/ChannelMgr.cpp | 53 +- src/server/game/Chat/Channels/ChannelMgr.h | 21 +- src/server/game/Entities/Creature/Creature.cpp | 2 +- src/server/game/Entities/Creature/Creature.h | 2 +- src/server/game/Entities/Player/Player.cpp | 16 +- src/server/game/Entities/Player/Player.h | 4 +- src/server/game/Entities/Unit/Unit.h | 2 +- src/server/game/Handlers/ChannelHandler.cpp | 103 ++-- src/server/game/Handlers/CharacterHandler.cpp | 56 +- src/server/game/Handlers/ChatHandler.cpp | 2 +- src/server/game/Handlers/MiscHandler.cpp | 7 +- src/server/game/Server/Packets/ChannelPackets.cpp | 15 +- src/server/game/Server/Packets/ChannelPackets.h | 38 +- src/server/game/Server/Packets/MiscPackets.cpp | 11 + src/server/game/Server/Packets/MiscPackets.h | 21 + src/server/game/Server/Packets/MovementPackets.cpp | 16 +- src/server/game/Server/Packets/MovementPackets.h | 2 +- src/server/game/Server/Protocol/Opcodes.cpp | 37 +- src/server/game/Server/Protocol/Opcodes.h | 51 +- src/server/game/Server/WorldSession.h | 54 +- src/server/scripts/Commands/cs_message.cpp | 2 +- 23 files changed, 721 insertions(+), 629 deletions(-) (limited to 'src/server/game/Handlers/ChatHandler.cpp') diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 7695ab45de0..e2b6b16c9f2 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -31,18 +31,16 @@ Channel::Channel(std::string const& name, uint32 channelId, uint32 team): _IsSaved(false), _flags(0), _channelId(channelId), - _Team(team), - _ownerGUID(), - _name(name), - _password("") + _team(team), + _name(name) { // set special flags if built-in channel if (ChatChannelsEntry const* ch = sChatChannelsStore.LookupEntry(channelId)) // check whether it's a built-in channel { - _announce = false; // no join/leave announces - _ownership = false; // no ownership handout + _announce = false; // no join/leave announces + _ownership = false; // no ownership handout - _flags |= CHANNEL_FLAG_GENERAL; // for all built-in channels + _flags |= CHANNEL_FLAG_GENERAL; // for all built-in channels if (ch->Flags & CHANNEL_DBC_FLAG_TRADE) // for trade channel _flags |= CHANNEL_FLAG_TRADE; @@ -62,31 +60,31 @@ Channel::Channel(std::string const& name, uint32 channelId, uint32 team): // If storing custom channels in the db is enabled either load or save the channel if (sWorld->getBoolConfig(CONFIG_PRESERVE_CUSTOM_CHANNELS)) { - PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHANNEL); - stmt->setString(0, name); - stmt->setUInt32(1, _Team); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHANNEL); + stmt->setString(0, _name); + stmt->setUInt32(1, _team); PreparedQueryResult result = CharacterDatabase.Query(stmt); - if (result) //load + if (result) // load { Field* fields = result->Fetch(); _announce = fields[0].GetBool(); _ownership = fields[1].GetBool(); _password = fields[2].GetString(); - const char* db_BannedList = fields[3].GetCString(); + std::string bannedList = fields[3].GetString(); - if (db_BannedList) + if (!bannedList.empty()) { - Tokenizer tokens(db_BannedList, ' '); + Tokenizer tokens(bannedList, ' '); for (Tokenizer::const_iterator i = tokens.begin(); i != tokens.end(); ++i) { std::string bannedGuidStr(*i); - ObjectGuid banned_guid; - banned_guid.SetRawValue(uint64(strtoull(bannedGuidStr.substr(0, 16).c_str(), NULL, 16)), uint64(strtoull(bannedGuidStr.substr(16).c_str(), NULL, 16))); - if (!banned_guid.IsEmpty()) + ObjectGuid bannedGuid; + bannedGuid.SetRawValue(uint64(strtoull(bannedGuidStr.substr(0, 16).c_str(), nullptr, 16)), uint64(strtoull(bannedGuidStr.substr(16).c_str(), nullptr, 16))); + if (!bannedGuid.IsEmpty()) { - TC_LOG_DEBUG("chat.system", "Channel(%s) loaded bannedStore %s", name.c_str(), banned_guid.ToString().c_str()); - bannedStore.insert(banned_guid); + TC_LOG_DEBUG("chat.system", "Channel (%s) loaded bannedStore %s", _name.c_str(), bannedGuid.ToString().c_str()); + _bannedStore.insert(bannedGuid); } } } @@ -94,10 +92,10 @@ Channel::Channel(std::string const& name, uint32 channelId, uint32 team): else // save { stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHANNEL); - stmt->setString(0, name); - stmt->setUInt32(1, _Team); + stmt->setString(0, _name); + stmt->setUInt32(1, _team); CharacterDatabase.Execute(stmt); - TC_LOG_DEBUG("chat.system", "Channel(%s) saved in database", name.c_str()); + TC_LOG_DEBUG("chat.system", "Channel (%s) saved in database", _name.c_str()); } _IsSaved = true; @@ -110,22 +108,19 @@ void Channel::UpdateChannelInDB() const if (_IsSaved) { std::ostringstream banlist; - BannedContainer::const_iterator iter; - for (iter = bannedStore.begin(); iter != bannedStore.end(); ++iter) - banlist << *iter << ' '; - - std::string banListStr = banlist.str(); + for (ObjectGuid const& guid : _bannedStore) + banlist << guid << ' '; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL); stmt->setBool(0, _announce); stmt->setBool(1, _ownership); stmt->setString(2, _password); - stmt->setString(3, banListStr); + stmt->setString(3, banlist.str()); stmt->setString(4, _name); - stmt->setUInt32(5, _Team); + stmt->setUInt32(5, _team); CharacterDatabase.Execute(stmt); - TC_LOG_DEBUG("chat.system", "Channel(%s) updated in database", _name.c_str()); + TC_LOG_DEBUG("chat.system", "Channel (%s) updated in database", _name.c_str()); } } @@ -133,7 +128,7 @@ void Channel::UpdateChannelUseageInDB() const { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL_USAGE); stmt->setString(0, _name); - stmt->setUInt32(1, _Team); + stmt->setUInt32(1, _team); CharacterDatabase.Execute(stmt); } @@ -151,32 +146,32 @@ void Channel::CleanOldChannelsInDB() void Channel::JoinChannel(Player* player, std::string const& pass) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (IsOn(guid)) { // Do not send error message for built-in channels if (!IsConstant()) { - WorldPacket data; - MakePlayerAlreadyMember(&data, guid); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerAlreadyMember(notify, guid); + player->SendDirectMessage(notify.Write()); } return; } if (IsBanned(guid)) { - WorldPacket data; - MakeBanned(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeBanned(notify); + player->SendDirectMessage(notify.Write()); return; } if (!_password.empty() && pass != _password) { - WorldPacket data; - MakeWrongPassword(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeWrongPassword(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -185,9 +180,9 @@ void Channel::JoinChannel(Player* player, std::string const& pass) AccountMgr::IsPlayerAccount(player->GetSession()->GetSecurity()) && //FIXME: Move to RBAC player->GetGroup()) { - WorldPacket data; - MakeNotInLfg(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotInLfg(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -195,73 +190,90 @@ void Channel::JoinChannel(Player* player, std::string const& pass) if (_announce && !player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { - WorldPacket data; - MakeJoined(&data, guid); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakeJoined(notify, guid); + SendToAll(notify.Write()); } - PlayerInfo pinfo; - pinfo.player = guid; - pinfo.flags = MEMBER_FLAG_NONE; - playersStore[guid] = pinfo; + PlayerInfo playerInfo; + playerInfo.PlayerGuid = guid; + _playersStore[guid] = playerInfo; - WorldPacket data; - MakeYouJoined(&data); - SendToOne(&data, guid); + /* + WorldPackets::Channel::ChannelNotify notify; + MakeYouJoined(notify); + player->SendDirectMessage(notify.Write()); + */ - JoinNotify(guid); + WorldPackets::Channel::ChannelNotifyJoined notify; + //notify.ChannelWelcomeMsg = ""; + notify.ChatChannelID = _channelId; + //notify.InstanceID = 0; + notify.ChannelFlags = _flags; + notify.Channel = _name; + player->SendDirectMessage(notify.Write()); + + JoinNotify(player); // Custom channel handling if (!IsConstant()) { // Update last_used timestamp in db - if (!playersStore.empty()) + if (!_playersStore.empty()) UpdateChannelUseageInDB(); // If the channel has no owner yet and ownership is allowed, set the new owner. - if (!_ownerGUID && _ownership) + if (_ownerGUID.IsEmpty() && _ownership) { - SetOwner(guid, playersStore.size() > 1); - playersStore[guid].SetModerator(true); + SetOwner(guid, _playersStore.size() > 1); + _playersStore[guid].SetModerator(true); } } } void Channel::LeaveChannel(Player* player, bool send) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { if (send) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); } return; } + player->LeftChannel(this); + if (send) { - WorldPacket data; - MakeYouLeft(&data); - SendToOne(&data, guid); - player->LeftChannel(this); - data.clear(); + /* + WorldPackets::Channel::ChannelNotify notify; + MakeYouLeft(notify); + player->SendDirectMessage(notify.Write()); + */ + + WorldPackets::Channel::ChannelNotifyLeft notify; + notify.Channel = _name; + notify.ChatChannelID = 0; + //notify.Suspended = false; + player->SendDirectMessage(notify.Write()); } - bool changeowner = playersStore[guid].IsOwner(); + bool changeowner = _playersStore[guid].IsOwner(); - playersStore.erase(guid); + _playersStore.erase(guid); if (_announce && !player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { - WorldPacket data; - MakeLeft(&data, guid); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakeLeft(notify, guid); + SendToAll(notify.Write()); } - LeaveNotify(guid); + LeaveNotify(player); if (!IsConstant()) { @@ -269,10 +281,10 @@ void Channel::LeaveChannel(Player* player, bool send) UpdateChannelUseageInDB(); // If the channel owner left and there are still playersStore inside, pick a new owner - if (changeowner && _ownership && !playersStore.empty()) + if (changeowner && _ownership && !_playersStore.empty()) { - ObjectGuid newowner = playersStore.begin()->second.player; - playersStore[newowner].SetModerator(true); + ObjectGuid const& newowner = _playersStore.begin()->second.PlayerGuid; + _playersStore[newowner].SetModerator(true); SetOwner(newowner); } } @@ -280,21 +292,21 @@ void Channel::LeaveChannel(Player* player, bool send) void Channel::KickOrBan(Player const* player, std::string const& badname, bool ban) { - ObjectGuid good = player->GetGUID(); + ObjectGuid const& good = player->GetGUID(); if (!IsOn(good)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -302,9 +314,9 @@ void Channel::KickOrBan(Player const* player, std::string const& badname, bool b ObjectGuid victim = bad ? bad->GetGUID() : ObjectGuid::Empty; if (!victim || !IsOn(victim)) { - WorldPacket data; - MakePlayerNotFound(&data, badname); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, badname); + player->SendDirectMessage(notify.Write()); return; } @@ -312,154 +324,152 @@ void Channel::KickOrBan(Player const* player, std::string const& badname, bool b if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR) && changeowner && good != _ownerGUID) { - WorldPacket data; - MakeNotOwner(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotOwner(notify); + player->SendDirectMessage(notify.Write()); return; } if (ban && !IsBanned(victim)) { - bannedStore.insert(victim); + _bannedStore.insert(victim); UpdateChannelInDB(); if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { - WorldPacket data; - MakePlayerBanned(&data, victim, good); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerBanned(notify, victim, good); + SendToAll(notify.Write()); } } else if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { - WorldPacket data; - MakePlayerKicked(&data, victim, good); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerKicked(notify, victim, good); + SendToAll(notify.Write()); } - playersStore.erase(victim); + _playersStore.erase(victim); bad->LeftChannel(this); - if (changeowner && _ownership && !playersStore.empty()) + if (changeowner && _ownership && !_playersStore.empty()) { - ObjectGuid newowner = good; - playersStore[newowner].SetModerator(true); - SetOwner(newowner); + _playersStore[good].SetModerator(true); + SetOwner(good); } } void Channel::UnBan(Player const* player, std::string const& badname) { - ObjectGuid good = player->GetGUID(); + ObjectGuid const& good = player->GetGUID(); if (!IsOn(good)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } Player* bad = ObjectAccessor::FindConnectedPlayerByName(badname); ObjectGuid victim = bad ? bad->GetGUID() : ObjectGuid::Empty; - if (!victim || !IsBanned(victim)) + if (victim.IsEmpty() || !IsBanned(victim)) { - WorldPacket data; - MakePlayerNotFound(&data, badname); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, badname); + player->SendDirectMessage(notify.Write()); return; } - bannedStore.erase(victim); + _bannedStore.erase(victim); - WorldPacket data; - MakePlayerUnbanned(&data, victim, good); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerUnbanned(notify, victim, good); + SendToAll(notify.Write()); UpdateChannelInDB(); } void Channel::Password(Player const* player, std::string const& pass) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); - ChatHandler chat(player->GetSession()); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } _password = pass; - WorldPacket data; - MakePasswordChanged(&data, guid); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakePasswordChanged(notify, guid); + SendToAll(notify.Write()); UpdateChannelInDB(); } void Channel::SetMode(Player const* player, std::string const& p2n, bool mod, bool set) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } - if (guid == _ownerGUID && std::string(p2n) == player->GetName() && mod) + if (guid == _ownerGUID && p2n == player->GetName() && mod) return; Player* newp = ObjectAccessor::FindConnectedPlayerByName(p2n); ObjectGuid victim = newp ? newp->GetGUID() : ObjectGuid::Empty; - if (!victim || !IsOn(victim) || + if (victim.IsEmpty() || !IsOn(victim) || (player->GetTeam() != newp->GetTeam() && (!player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL) || !newp->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL)))) { - WorldPacket data; - MakePlayerNotFound(&data, p2n); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, p2n); + player->SendDirectMessage(notify.Write()); return; } if (_ownerGUID == victim && _ownerGUID != guid) { - WorldPacket data; - MakeNotOwner(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotOwner(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -471,21 +481,21 @@ void Channel::SetMode(Player const* player, std::string const& p2n, bool mod, bo void Channel::SetOwner(Player const* player, std::string const& newname) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR) && guid != _ownerGUID) { - WorldPacket data; - MakeNotOwner(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotOwner(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -497,55 +507,49 @@ void Channel::SetOwner(Player const* player, std::string const& newname) (!player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL) || !newp->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL)))) { - WorldPacket data; - MakePlayerNotFound(&data, newname); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, newname); + player->SendDirectMessage(notify.Write()); return; } - playersStore[victim].SetModerator(true); + _playersStore[victim].SetModerator(true); SetOwner(victim); } -void Channel::SendWhoOwner(ObjectGuid guid) +void Channel::SendWhoOwner(Player const* player) { - WorldPacket data; - if (IsOn(guid)) - MakeChannelOwner(&data); + WorldPackets::Channel::ChannelNotify notify; + if (IsOn(player->GetGUID())) + MakeChannelOwner(notify); else - MakeNotMember(&data); - SendToOne(&data, guid); + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); } void Channel::List(Player const* player) { - ObjectGuid guid = player->GetGUID(); - - if (!IsOn(guid)) + if (!IsOn(player->GetGUID())) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } TC_LOG_DEBUG("chat.system", "SMSG_CHANNEL_LIST %s Channel: %s", player->GetSession()->GetPlayerInfo().c_str(), GetName().c_str()); - WorldPacket data(SMSG_CHANNEL_LIST, 1+(GetName().size()+1)+1+4+playersStore.size()*(8+1)); - data << uint8(1); // channel type? - data << GetName(); // channel name - data << uint8(GetFlags()); // channel flags? - - size_t pos = data.wpos(); - data << uint32(0); // size of list, placeholder + WorldPackets::Channel::ChannelListResponse list; + list.Display = true; /// always true? + list.Channel = GetName(); + list.ChannelFlags = GetFlags(); uint32 gmLevelInWhoList = sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_WHO_LIST); - uint32 count = 0; - for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) + for (PlayerContainer::value_type const& i : _playersStore) { - Player* member = ObjectAccessor::FindConnectedPlayer(i->first); + Player* member = ObjectAccessor::FindConnectedPlayer(i.first); // PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters // MODERATOR, GAME MASTER, ADMINISTRATOR can see all @@ -554,50 +558,46 @@ void Channel::List(Player const* player) member->GetSession()->GetSecurity() <= AccountTypes(gmLevelInWhoList)) && member->IsVisibleGloballyFor(player)) { - data << i->first; - data << uint8(i->second.flags); // flags seems to be changed... - ++count; + list.Members.emplace_back(i.second.PlayerGuid, GetVirtualRealmAddress(), i.second.GetFlags()); } } - data.put(pos, count); - - SendToOne(&data, guid); + player->SendDirectMessage(list.Write()); } void Channel::Announce(Player const* player) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } _announce = !_announce; - WorldPacket data; + WorldPackets::Channel::ChannelNotify notify; if (_announce) - MakeAnnouncementsOn(&data, guid); + MakeAnnouncementsOn(notify, guid); else - MakeAnnouncementsOff(&data, guid); - SendToAll(&data); + MakeAnnouncementsOff(notify, guid); + SendToAll(notify.Write()); UpdateChannelInDB(); } -void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang) +void Channel::Say(ObjectGuid const& guid, std::string const& what, uint32 lang) { if (what.empty()) return; @@ -608,17 +608,17 @@ void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang) if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + SendToOne(notify.Write(), guid); return; } - if (playersStore[guid].IsMuted()) + if (_playersStore[guid].IsMuted()) { - WorldPacket data; - MakeMuted(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeMuted(notify); + SendToOne(notify.Write(), guid); return; } @@ -632,35 +632,35 @@ void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang) packet.TargetGUID = guid; } - SendToAll(packet.Write(), !playersStore[guid].IsModerator() ? guid : ObjectGuid::Empty); + SendToAll(packet.Write(), !_playersStore[guid].IsModerator() ? guid : ObjectGuid::Empty); } void Channel::Invite(Player const* player, std::string const& newname) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } Player* newp = ObjectAccessor::FindConnectedPlayerByName(newname); if (!newp || !newp->isGMVisible()) { - WorldPacket data; - MakePlayerNotFound(&data, newname); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, newname); + player->SendDirectMessage(notify.Write()); return; } if (IsBanned(newp->GetGUID())) { - WorldPacket data; - MakePlayerInviteBanned(&data, newname); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerInviteBanned(notify, newname); + player->SendDirectMessage(notify.Write()); return; } @@ -668,169 +668,167 @@ void Channel::Invite(Player const* player, std::string const& newname) (!player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL) || !newp->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL))) { - WorldPacket data; - MakeInviteWrongFaction(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeInviteWrongFaction(notify); + player->SendDirectMessage(notify.Write()); return; } if (IsOn(newp->GetGUID())) { - WorldPacket data; - MakePlayerAlreadyMember(&data, newp->GetGUID()); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerAlreadyMember(notify, newp->GetGUID()); + player->SendDirectMessage(notify.Write()); return; } if (!newp->GetSocial()->HasIgnore(guid)) { - WorldPacket data; - MakeInvite(&data, guid); - SendToOne(&data, newp->GetGUID()); - data.clear(); + WorldPackets::Channel::ChannelNotify notify; + MakeInvite(notify, guid); + newp->SendDirectMessage(notify.Write()); } - WorldPacket data; - MakePlayerInvited(&data, newp->GetName()); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerInvited(notify, newp->GetName()); + player->SendDirectMessage(notify.Write()); } -void Channel::SetOwner(ObjectGuid guid, bool exclaim) +void Channel::SetOwner(ObjectGuid const& guid, bool exclaim) { if (!_ownerGUID.IsEmpty()) { // [] will re-add player after it possible removed - PlayerContainer::iterator p_itr = playersStore.find(_ownerGUID); - if (p_itr != playersStore.end()) - p_itr->second.SetOwner(false); + PlayerContainer::iterator itr = _playersStore.find(_ownerGUID); + if (itr != _playersStore.end()) + itr->second.SetOwner(false); } _ownerGUID = guid; if (!_ownerGUID.IsEmpty()) { - uint8 oldFlag = GetPlayerFlags(_ownerGUID); - playersStore[_ownerGUID].SetModerator(true); - playersStore[_ownerGUID].SetOwner(true); + uint8 oldFlag = _playersStore[_ownerGUID].GetFlags(); + _playersStore[_ownerGUID].SetModerator(true); + _playersStore[_ownerGUID].SetOwner(true); - WorldPacket data; - MakeModeChange(&data, _ownerGUID, oldFlag); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakeModeChange(notify, _ownerGUID, oldFlag, _playersStore[_ownerGUID].GetFlags()); + SendToAll(notify.Write()); if (exclaim) { - MakeOwnerChanged(&data, _ownerGUID); - SendToAll(&data); + MakeOwnerChanged(notify, _ownerGUID); + SendToAll(notify.Write()); } UpdateChannelInDB(); } } -void Channel::SendToAll(WorldPacket const* data, ObjectGuid guid) +void Channel::SendToAll(WorldPacket const* data, ObjectGuid const& guid) { - for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) - if (Player* player = ObjectAccessor::FindConnectedPlayer(i->first)) - if (!guid || !player->GetSocial()->HasIgnore(guid)) - player->GetSession()->SendPacket(data); + for (PlayerContainer::value_type const& i : _playersStore) + if (Player* player = ObjectAccessor::FindConnectedPlayer(i.first)) + if (guid.IsEmpty() || !player->GetSocial()->HasIgnore(guid)) + player->SendDirectMessage(data); } -void Channel::SendToAllButOne(WorldPacket const* data, ObjectGuid who) +void Channel::SendToAllButOne(WorldPacket const* data, ObjectGuid const& who) { - for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) - if (i->first != who) - if (Player* player = ObjectAccessor::FindConnectedPlayer(i->first)) - player->GetSession()->SendPacket(data); + for (PlayerContainer::value_type const& i : _playersStore) + if (i.first != who) + if (Player* player = ObjectAccessor::FindConnectedPlayer(i.first)) + player->SendDirectMessage(data); } -void Channel::SendToOne(WorldPacket const* data, ObjectGuid who) +void Channel::SendToOne(WorldPacket const* data, ObjectGuid const& who) { if (Player* player = ObjectAccessor::FindConnectedPlayer(who)) - player->GetSession()->SendPacket(data); + player->SendDirectMessage(data); } -void Channel::Voice(ObjectGuid /*guid1*/, ObjectGuid /*guid2*/) +void Channel::Voice(ObjectGuid const& /*guid1*/, ObjectGuid const& /*guid2*/) { } -void Channel::DeVoice(ObjectGuid /*guid1*/, ObjectGuid /*guid2*/) +void Channel::DeVoice(ObjectGuid const& /*guid1*/, ObjectGuid const& /*guid2*/) { } -void Channel::MakeNotifyPacket(WorldPacket* data, uint8 notify_type) +void Channel::MakeNotifyPacket(WorldPackets::Channel::ChannelNotify& data, uint8 notifyType) { - data->Initialize(SMSG_CHANNEL_NOTIFY, 1 + _name.size()); - *data << uint8(notify_type); - *data << _name; + data.Type = notifyType; + data.Channel = _name; } -void Channel::MakeJoined(WorldPacket* data, ObjectGuid guid) +void Channel::MakeJoined(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_JOINED_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeLeft(WorldPacket* data, ObjectGuid guid) +void Channel::MakeLeft(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_LEFT_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeYouJoined(WorldPacket* data) +void Channel::MakeYouJoined(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_YOU_JOINED_NOTICE); - *data << uint8(GetFlags()); - *data << uint32(GetChannelId()); - *data << uint32(0); + //*data << uint8(GetFlags()); + data.ChatChannelID = GetChannelId(); + //*data << uint32(0); } -void Channel::MakeYouLeft(WorldPacket* data) +void Channel::MakeYouLeft(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_YOU_LEFT_NOTICE); - *data << uint32(GetChannelId()); - *data << uint8(IsConstant()); + data.ChatChannelID = GetChannelId(); + //*data << uint8(IsConstant()); } -void Channel::MakeWrongPassword(WorldPacket* data) +void Channel::MakeWrongPassword(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_WRONG_PASSWORD_NOTICE); } -void Channel::MakeNotMember(WorldPacket* data) +void Channel::MakeNotMember(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_MEMBER_NOTICE); } -void Channel::MakeNotModerator(WorldPacket* data) +void Channel::MakeNotModerator(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_MODERATOR_NOTICE); } -void Channel::MakePasswordChanged(WorldPacket* data, ObjectGuid guid) +void Channel::MakePasswordChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_PASSWORD_CHANGED_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeOwnerChanged(WorldPacket* data, ObjectGuid guid) +void Channel::MakeOwnerChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_OWNER_CHANGED_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakePlayerNotFound(WorldPacket* data, std::string const& name) +void Channel::MakePlayerNotFound(WorldPackets::Channel::ChannelNotify& data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_NOT_FOUND_NOTICE); - *data << name; + data.Sender = name; } -void Channel::MakeNotOwner(WorldPacket* data) +void Channel::MakeNotOwner(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_OWNER_NOTICE); } -void Channel::MakeChannelOwner(WorldPacket* data) +void Channel::MakeChannelOwner(WorldPackets::Channel::ChannelNotify& data) { std::string name; @@ -838,139 +836,140 @@ void Channel::MakeChannelOwner(WorldPacket* data) name = "PLAYER_NOT_FOUND"; MakeNotifyPacket(data, CHAT_CHANNEL_OWNER_NOTICE); - *data << ((IsConstant() || !_ownerGUID) ? "Nobody" : name); + data.Sender = ((IsConstant() || !_ownerGUID) ? "Nobody" : name); } -void Channel::MakeModeChange(WorldPacket* data, ObjectGuid guid, uint8 oldflags) +void Channel::MakeModeChange(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid, uint8 oldFlags, uint8 newFlags) { MakeNotifyPacket(data, CHAT_MODE_CHANGE_NOTICE); - *data << guid; - *data << uint8(oldflags); - *data << uint8(GetPlayerFlags(guid)); + data.SenderGuid = guid; + data.OldFlags = oldFlags; + data.NewFlags = newFlags; } -void Channel::MakeAnnouncementsOn(WorldPacket* data, ObjectGuid guid) +void Channel::MakeAnnouncementsOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_ANNOUNCEMENTS_ON_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeAnnouncementsOff(WorldPacket* data, ObjectGuid guid) +void Channel::MakeAnnouncementsOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_ANNOUNCEMENTS_OFF_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeMuted(WorldPacket* data) +void Channel::MakeMuted(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_MUTED_NOTICE); } -void Channel::MakePlayerKicked(WorldPacket* data, ObjectGuid bad, ObjectGuid good) +void Channel::MakePlayerKicked(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good) { MakeNotifyPacket(data, CHAT_PLAYER_KICKED_NOTICE); - *data << bad; - *data << good; + data.SenderGuid = good; + data.TargetGuid = bad; } -void Channel::MakeBanned(WorldPacket* data) +void Channel::MakeBanned(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_BANNED_NOTICE); } -void Channel::MakePlayerBanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good) +void Channel::MakePlayerBanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good) { MakeNotifyPacket(data, CHAT_PLAYER_BANNED_NOTICE); - *data << bad; - *data << good; + data.SenderGuid = good; + data.TargetGuid = bad; } -void Channel::MakePlayerUnbanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good) +void Channel::MakePlayerUnbanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good) { MakeNotifyPacket(data, CHAT_PLAYER_UNBANNED_NOTICE); - *data << bad; - *data << good; + data.SenderGuid = good; + data.TargetGuid = bad; } -void Channel::MakePlayerNotBanned(WorldPacket* data, const std::string &name) +void Channel::MakePlayerNotBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_NOT_BANNED_NOTICE); - *data << name; + data.Sender = name; } -void Channel::MakePlayerAlreadyMember(WorldPacket* data, ObjectGuid guid) +void Channel::MakePlayerAlreadyMember(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_PLAYER_ALREADY_MEMBER_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeInvite(WorldPacket* data, ObjectGuid guid) +void Channel::MakeInvite(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_INVITE_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeInviteWrongFaction(WorldPacket* data) +void Channel::MakeInviteWrongFaction(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_INVITE_WRONG_FACTION_NOTICE); } -void Channel::MakeWrongFaction(WorldPacket* data) +void Channel::MakeWrongFaction(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_WRONG_FACTION_NOTICE); } -void Channel::MakeInvalidName(WorldPacket* data) +void Channel::MakeInvalidName(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_INVALID_NAME_NOTICE); } -void Channel::MakeNotModerated(WorldPacket* data) +void Channel::MakeNotModerated(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_MODERATED_NOTICE); } -void Channel::MakePlayerInvited(WorldPacket* data, const std::string& name) +void Channel::MakePlayerInvited(WorldPackets::Channel::ChannelNotify& data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_INVITED_NOTICE); - *data << name; + data.Sender = name; } -void Channel::MakePlayerInviteBanned(WorldPacket* data, const std::string& name) +void Channel::MakePlayerInviteBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_INVITE_BANNED_NOTICE); - *data << name; + data.Sender = name; } -void Channel::MakeThrottled(WorldPacket* data) +void Channel::MakeThrottled(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_THROTTLED_NOTICE); } -void Channel::MakeNotInArea(WorldPacket* data) +void Channel::MakeNotInArea(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_IN_AREA_NOTICE); } -void Channel::MakeNotInLfg(WorldPacket* data) +void Channel::MakeNotInLfg(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_IN_LFG_NOTICE); } -void Channel::MakeVoiceOn(WorldPacket* data, ObjectGuid guid) +void Channel::MakeVoiceOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_VOICE_ON_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeVoiceOff(WorldPacket* data, ObjectGuid guid) +void Channel::MakeVoiceOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_VOICE_OFF_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::JoinNotify(ObjectGuid guid) +void Channel::JoinNotify(Player const* player) { + ObjectGuid const& guid = player->GetGUID(); WorldPacket data(IsConstant() ? SMSG_USERLIST_ADD : SMSG_USERLIST_UPDATE, 8 + 1 + 1 + 4 + GetName().size()); data << guid; data << uint8(GetPlayerFlags(guid)); @@ -984,8 +983,9 @@ void Channel::JoinNotify(ObjectGuid guid) SendToAll(&data); } -void Channel::LeaveNotify(ObjectGuid guid) +void Channel::LeaveNotify(Player const* player) { + ObjectGuid const& guid = player->GetGUID(); WorldPacket data(SMSG_USERLIST_REMOVE, 8 + 1 + 4 + GetName().size()); data << guid; data << uint8(GetFlags()); diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h index f1f01e64f44..4ee83b8fbb2 100644 --- a/src/server/game/Chat/Channels/Channel.h +++ b/src/server/game/Chat/Channels/Channel.h @@ -19,14 +19,11 @@ #ifndef _CHANNEL_H #define _CHANNEL_H -#include -#include -#include - #include "Common.h" #include "WorldSession.h" -#include "WorldPacket.h" + +#include "Packets/ChannelPackets.h" class Player; @@ -122,33 +119,47 @@ class Channel { struct PlayerInfo { - ObjectGuid player; - uint8 flags; + ObjectGuid PlayerGuid; + + uint8 GetFlags() const { return _flags; } + inline bool HasFlag(uint8 flag) const { return (_flags & flag) != 0; } + inline void SetFlag(uint8 flag) { _flags |= flag; } + inline void RemoveFlag(uint8 flag) { _flags &= ~flag; } - bool HasFlag(uint8 flag) const { return (flags & flag) != 0; } - void SetFlag(uint8 flag) { flags |= flag; } - bool IsOwner() const { return (flags & MEMBER_FLAG_OWNER) != 0; } + bool IsOwner() const { return HasFlag(MEMBER_FLAG_OWNER); } void SetOwner(bool state) { - if (state) flags |= MEMBER_FLAG_OWNER; - else flags &= ~MEMBER_FLAG_OWNER; + if (state) + SetFlag(MEMBER_FLAG_OWNER); + else + RemoveFlag(MEMBER_FLAG_OWNER); } - bool IsModerator() const { return (flags & MEMBER_FLAG_MODERATOR) != 0; } + + bool IsModerator() const { return HasFlag(MEMBER_FLAG_MODERATOR); } void SetModerator(bool state) { - if (state) flags |= MEMBER_FLAG_MODERATOR; - else flags &= ~MEMBER_FLAG_MODERATOR; + if (state) + SetFlag(MEMBER_FLAG_MODERATOR); + else + RemoveFlag(MEMBER_FLAG_MODERATOR); } - bool IsMuted() const { return (flags & MEMBER_FLAG_MUTED) != 0; } + + bool IsMuted() const { return HasFlag(MEMBER_FLAG_MUTED); } void SetMuted(bool state) { - if (state) flags |= MEMBER_FLAG_MUTED; - else flags &= ~MEMBER_FLAG_MUTED; + if (state) + SetFlag(MEMBER_FLAG_MUTED); + else + RemoveFlag(MEMBER_FLAG_MUTED); } + + private: + uint8 _flags = MEMBER_FLAG_NONE; }; public: Channel(std::string const& name, uint32 channel_id, uint32 Team = 0); + std::string const& GetName() const { return _name; } uint32 GetChannelId() const { return _channelId; } bool IsConstant() const { return _channelId != 0; } @@ -157,7 +168,7 @@ class Channel std::string const& GetPassword() const { return _password; } void SetPassword(std::string const& npassword) { _password = npassword; } void SetAnnounce(bool nannounce) { _announce = nannounce; } - uint32 GetNumPlayers() const { return playersStore.size(); } + uint32 GetNumPlayers() const { return _playersStore.size(); } uint8 GetFlags() const { return _flags; } bool HasFlag(uint8 flag) const { return (_flags & flag) != 0; } @@ -169,102 +180,102 @@ class Channel void UnBan(Player const* player, std::string const& badname); void Password(Player const* player, std::string const& pass); void SetMode(Player const* player, std::string const& p2n, bool mod, bool set); - void SetOwner(ObjectGuid guid, bool exclaim = true); + void SetOwner(ObjectGuid const& guid, bool exclaim = true); void SetOwner(Player const* player, std::string const& name); - void SendWhoOwner(ObjectGuid guid); + void SendWhoOwner(Player const* player); void SetModerator(Player const* player, std::string const& newname) { SetMode(player, newname, true, true); } void UnsetModerator(Player const* player, std::string const& newname) { SetMode(player, newname, true, false); } void SetMute(Player const* player, std::string const& newname) { SetMode(player, newname, false, true); } void UnsetMute(Player const* player, std::string const& newname) { SetMode(player, newname, false, false); } void List(Player const* player); void Announce(Player const* player); - void Say(ObjectGuid guid, std::string const& what, uint32 lang); + void Say(ObjectGuid const& guid, std::string const& what, uint32 lang); void Invite(Player const* player, std::string const& newp); - void Voice(ObjectGuid guid1, ObjectGuid guid2); - void DeVoice(ObjectGuid guid1, ObjectGuid guid2); - void JoinNotify(ObjectGuid guid); // invisible notify - void LeaveNotify(ObjectGuid guid); // invisible notify + void Voice(ObjectGuid const& guid1, ObjectGuid const& guid2); + void DeVoice(ObjectGuid const& guid1, ObjectGuid const& guid2); + void JoinNotify(Player const* player); + void LeaveNotify(Player const* player); void SetOwnership(bool ownership) { _ownership = ownership; }; static void CleanOldChannelsInDB(); private: // initial packet data (notify type and channel name) - void MakeNotifyPacket(WorldPacket* data, uint8 notify_type); + void MakeNotifyPacket(WorldPackets::Channel::ChannelNotify& data, uint8 notifyType); // type specific packet data - void MakeJoined(WorldPacket* data, ObjectGuid guid); //+ 0x00 - void MakeLeft(WorldPacket* data, ObjectGuid guid); //+ 0x01 - void MakeYouJoined(WorldPacket* data); //+ 0x02 - void MakeYouLeft(WorldPacket* data); //+ 0x03 - void MakeWrongPassword(WorldPacket* data); //? 0x04 - void MakeNotMember(WorldPacket* data); //? 0x05 - void MakeNotModerator(WorldPacket* data); //? 0x06 - void MakePasswordChanged(WorldPacket* data, ObjectGuid guid); //+ 0x07 - void MakeOwnerChanged(WorldPacket* data, ObjectGuid guid); //? 0x08 - void MakePlayerNotFound(WorldPacket* data, std::string const& name); //+ 0x09 - void MakeNotOwner(WorldPacket* data); //? 0x0A - void MakeChannelOwner(WorldPacket* data); //? 0x0B - void MakeModeChange(WorldPacket* data, ObjectGuid guid, uint8 oldflags);//+ 0x0C - void MakeAnnouncementsOn(WorldPacket* data, ObjectGuid guid); //+ 0x0D - void MakeAnnouncementsOff(WorldPacket* data, ObjectGuid guid); //+ 0x0E - void MakeMuted(WorldPacket* data); //? 0x11 - void MakePlayerKicked(WorldPacket* data, ObjectGuid bad, ObjectGuid good);//? 0x12 - void MakeBanned(WorldPacket* data); //? 0x13 - void MakePlayerBanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good);//? 0x14 - void MakePlayerUnbanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good);//? 0x15 - void MakePlayerNotBanned(WorldPacket* data, std::string const& name); //? 0x16 - void MakePlayerAlreadyMember(WorldPacket* data, ObjectGuid guid); //+ 0x17 - void MakeInvite(WorldPacket* data, ObjectGuid guid); //? 0x18 - void MakeInviteWrongFaction(WorldPacket* data); //? 0x19 - void MakeWrongFaction(WorldPacket* data); //? 0x1A - void MakeInvalidName(WorldPacket* data); //? 0x1B - void MakeNotModerated(WorldPacket* data); //? 0x1C - void MakePlayerInvited(WorldPacket* data, std::string const& name); //+ 0x1D - void MakePlayerInviteBanned(WorldPacket* data, std::string const& name);//? 0x1E - void MakeThrottled(WorldPacket* data); //? 0x1F - void MakeNotInArea(WorldPacket* data); //? 0x20 - void MakeNotInLfg(WorldPacket* data); //? 0x21 - void MakeVoiceOn(WorldPacket* data, ObjectGuid guid); //+ 0x22 - void MakeVoiceOff(WorldPacket* data, ObjectGuid guid); //+ 0x23 + void MakeJoined(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x00 + void MakeLeft(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x01 + void MakeYouJoined(WorldPackets::Channel::ChannelNotify& data); //+ 0x02 + void MakeYouLeft(WorldPackets::Channel::ChannelNotify& data); //+ 0x03 + void MakeWrongPassword(WorldPackets::Channel::ChannelNotify& data); //? 0x04 + void MakeNotMember(WorldPackets::Channel::ChannelNotify& data); //? 0x05 + void MakeNotModerator(WorldPackets::Channel::ChannelNotify& data); //? 0x06 + void MakePasswordChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x07 + void MakeOwnerChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //? 0x08 + void MakePlayerNotFound(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //+ 0x09 + void MakeNotOwner(WorldPackets::Channel::ChannelNotify& data); //? 0x0A + void MakeChannelOwner(WorldPackets::Channel::ChannelNotify& data); //? 0x0B + void MakeModeChange(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid, uint8 oldFlags, uint8 newFlags); //+ 0x0C + void MakeAnnouncementsOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x0D + void MakeAnnouncementsOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x0E + void MakeMuted(WorldPackets::Channel::ChannelNotify& data); //? 0x11 + void MakePlayerKicked(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good); //? 0x12 + void MakeBanned(WorldPackets::Channel::ChannelNotify& data); //? 0x13 + void MakePlayerBanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good); //? 0x14 + void MakePlayerUnbanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good); //? 0x15 + void MakePlayerNotBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //? 0x16 + void MakePlayerAlreadyMember(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x17 + void MakeInvite(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //? 0x18 + void MakeInviteWrongFaction(WorldPackets::Channel::ChannelNotify& data); //? 0x19 + void MakeWrongFaction(WorldPackets::Channel::ChannelNotify& data); //? 0x1A + void MakeInvalidName(WorldPackets::Channel::ChannelNotify& data); //? 0x1B + void MakeNotModerated(WorldPackets::Channel::ChannelNotify& data); //? 0x1C + void MakePlayerInvited(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //+ 0x1D + void MakePlayerInviteBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //? 0x1E + void MakeThrottled(WorldPackets::Channel::ChannelNotify& data); //? 0x1F + void MakeNotInArea(WorldPackets::Channel::ChannelNotify& data); //? 0x20 + void MakeNotInLfg(WorldPackets::Channel::ChannelNotify& data); //? 0x21 + void MakeVoiceOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x22 + void MakeVoiceOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x23 - void SendToAll(WorldPacket const* data, ObjectGuid guid = ObjectGuid::Empty); - void SendToAllButOne(WorldPacket const* data, ObjectGuid who); - void SendToOne(WorldPacket const* data, ObjectGuid who); + void SendToAll(WorldPacket const* data, ObjectGuid const& guid = ObjectGuid::Empty); + void SendToAllButOne(WorldPacket const* data, ObjectGuid const& who); + void SendToOne(WorldPacket const* data, ObjectGuid const& who); - bool IsOn(ObjectGuid who) const { return playersStore.find(who) != playersStore.end(); } - bool IsBanned(ObjectGuid guid) const { return bannedStore.find(guid) != bannedStore.end(); } + bool IsOn(ObjectGuid const& who) const { return _playersStore.find(who) != _playersStore.end(); } + bool IsBanned(ObjectGuid const& guid) const { return _bannedStore.find(guid) != _bannedStore.end(); } void UpdateChannelInDB() const; void UpdateChannelUseageInDB() const; - uint8 GetPlayerFlags(ObjectGuid guid) const + uint8 GetPlayerFlags(ObjectGuid const& guid) const { - PlayerContainer::const_iterator itr = playersStore.find(guid); - return itr != playersStore.end() ? itr->second.flags : 0; + PlayerContainer::const_iterator itr = _playersStore.find(guid); + return itr != _playersStore.end() ? itr->second.GetFlags() : 0; } - void SetModerator(ObjectGuid guid, bool set) + void SetModerator(ObjectGuid const& guid, bool set) { - if (playersStore[guid].IsModerator() != set) + if (_playersStore[guid].IsModerator() != set) { - uint8 oldFlag = GetPlayerFlags(guid); - playersStore[guid].SetModerator(set); + uint8 oldFlag = _playersStore[guid].GetFlags(); + _playersStore[guid].SetModerator(set); - WorldPacket data; - MakeModeChange(&data, guid, oldFlag); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify data; + MakeModeChange(data, guid, oldFlag, _playersStore[guid].GetFlags()); + SendToAll(data.Write()); } } - void SetMute(ObjectGuid guid, bool set) + void SetMute(ObjectGuid const& guid, bool set) { - if (playersStore[guid].IsMuted() != set) + if (_playersStore[guid].IsMuted() != set) { - uint8 oldFlag = GetPlayerFlags(guid); - playersStore[guid].SetMuted(set); + uint8 oldFlag = _playersStore[guid].GetFlags(); + _playersStore[guid].SetMuted(set); - WorldPacket data; - MakeModeChange(&data, guid, oldFlag); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify data; + MakeModeChange(data, guid, oldFlag, _playersStore[guid].GetFlags()); + SendToAll(data.Write()); } } @@ -276,12 +287,12 @@ class Channel bool _IsSaved; uint8 _flags; uint32 _channelId; - uint32 _Team; + uint32 _team; ObjectGuid _ownerGUID; std::string _name; std::string _password; - PlayerContainer playersStore; - BannedContainer bannedStore; + PlayerContainer _playersStore; + BannedContainer _bannedStore; }; -#endif +#endif diff --git a/src/server/game/Chat/Channels/ChannelMgr.cpp b/src/server/game/Chat/Channels/ChannelMgr.cpp index a3a4ef69e63..ca664abffd9 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.cpp +++ b/src/server/game/Chat/Channels/ChannelMgr.cpp @@ -23,11 +23,11 @@ ChannelMgr::~ChannelMgr() { - for (ChannelMap::iterator itr = channels.begin(); itr != channels.end(); ++itr) + for (ChannelMap::iterator itr = _channels.begin(); itr != _channels.end(); ++itr) delete itr->second; } -ChannelMgr* ChannelMgr::forTeam(uint32 team) +ChannelMgr* ChannelMgr::ForTeam(uint32 team) { static ChannelMgr allianceChannelMgr; static ChannelMgr hordeChannelMgr; @@ -40,49 +40,43 @@ ChannelMgr* ChannelMgr::forTeam(uint32 team) if (team == HORDE) return &hordeChannelMgr; - return NULL; + return nullptr; } Channel* ChannelMgr::GetJoinChannel(std::string const& name, uint32 channelId) { std::wstring wname; if (!Utf8toWStr(name, wname)) - return NULL; + return nullptr; wstrToLower(wname); - ChannelMap::const_iterator i = channels.find(wname); - - if (i == channels.end()) + ChannelMap::const_iterator i = _channels.find(wname); + if (i == _channels.end()) { - Channel* nchan = new Channel(name, channelId, team); - channels[wname] = nchan; + Channel* nchan = new Channel(name, channelId, _team); + _channels[wname] = nchan; return nchan; } return i->second; } -Channel* ChannelMgr::GetChannel(std::string const& name, Player* player, bool pkt) +Channel* ChannelMgr::GetChannel(std::string const& name, Player* player, bool notify /*= true*/) { std::wstring wname; if (!Utf8toWStr(name, wname)) - return NULL; + return nullptr; wstrToLower(wname); - ChannelMap::const_iterator i = channels.find(wname); - - if (i == channels.end()) + ChannelMap::const_iterator i = _channels.find(wname); + if (i == _channels.end()) { - if (pkt) - { - WorldPacket data; - MakeNotOnPacket(&data, name); - player->GetSession()->SendPacket(&data); - } - - return NULL; + if (notify) + SendNotOnChannelNotify(player, name); + + return nullptr; } return i->second; @@ -96,22 +90,23 @@ void ChannelMgr::LeftChannel(std::string const& name) wstrToLower(wname); - ChannelMap::const_iterator i = channels.find(wname); - - if (i == channels.end()) + ChannelMap::const_iterator i = _channels.find(wname); + if (i == _channels.end()) return; Channel* channel = i->second; if (!channel->GetNumPlayers() && !channel->IsConstant()) { - channels.erase(wname); + _channels.erase(i); delete channel; } } -void ChannelMgr::MakeNotOnPacket(WorldPacket* data, std::string const& name) +void ChannelMgr::SendNotOnChannelNotify(Player const* player, std::string const& name) { - data->Initialize(SMSG_CHANNEL_NOTIFY, 1 + name.size()); - (*data) << uint8(5) << name; + WorldPackets::Channel::ChannelNotify notify; + notify.Type = CHAT_NOT_MEMBER_NOTICE; + notify.Channel = name; + player->SendDirectMessage(notify.Write()); } diff --git a/src/server/game/Chat/Channels/ChannelMgr.h b/src/server/game/Chat/Channels/ChannelMgr.h index eee45ba5b97..9a8fdb10767 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.h +++ b/src/server/game/Chat/Channels/ChannelMgr.h @@ -21,11 +21,6 @@ #include "Common.h" #include "Channel.h" -#include -#include - -#include "World.h" - #define MAX_CHANNEL_PASS_STR 31 class ChannelMgr @@ -33,22 +28,22 @@ class ChannelMgr typedef std::map ChannelMap; protected: - ChannelMgr() : team(0) { } + ChannelMgr() : _team(0) { } ~ChannelMgr(); public: - static ChannelMgr* forTeam(uint32 team); - void setTeam(uint32 newTeam) { team = newTeam; } + static ChannelMgr* ForTeam(uint32 team); + void SetTeam(uint32 newTeam) { _team = newTeam; } - Channel* GetJoinChannel(std::string const& name, uint32 channel_id); - Channel* GetChannel(std::string const& name, Player* p, bool pkt = true); + Channel* GetJoinChannel(std::string const& name, uint32 channelId); + Channel* GetChannel(std::string const& name, Player* player, bool notify = true); void LeftChannel(std::string const& name); private: - ChannelMap channels; - uint32 team; + ChannelMap _channels; + uint32 _team; - void MakeNotOnPacket(WorldPacket* data, std::string const& name); + static void SendNotOnChannelNotify(Player const* player, std::string const& name); }; #endif diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 3a74d2cc045..6bf579fff14 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2574,7 +2574,7 @@ void Creature::SetDisplayId(uint32 modelId) } } -void Creature::SetTarget(ObjectGuid guid) +void Creature::SetTarget(ObjectGuid const& guid) { if (!_focusSpell) SetGuidValue(UNIT_FIELD_TARGET, guid); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index ef171e311ae..4f805088548 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -674,7 +674,7 @@ class Creature : public Unit, public GridObject, public MapObject bool m_isTempWorldObject; //true when possessed // Handling caster facing during spellcast - void SetTarget(ObjectGuid guid) override; + void SetTarget(ObjectGuid const& guid) override; void FocusTarget(Spell const* focusSpell, WorldObject const* target); void ReleaseFocus(Spell const* focusSpell); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 7e6d56279b2..29d4e12604c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5225,8 +5225,8 @@ void Player::CleanupChannels() { Channel* ch = *m_channels.begin(); m_channels.erase(m_channels.begin()); // remove from player's channel list - ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetTeam())) + ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetTeam())) cMgr->LeftChannel(ch->GetName()); // deleted channel if empty } TC_LOG_DEBUG("chat.system", "Player %s: channels cleaned up!", GetName().c_str()); @@ -5241,12 +5241,10 @@ void Player::UpdateLocalChannels(uint32 newZone) if (!current_zone) return; - ChannelMgr* cMgr = ChannelMgr::forTeam(GetTeam()); + ChannelMgr* cMgr = ChannelMgr::ForTeam(GetTeam()); if (!cMgr) return; - std::string current_zone_name = current_zone->ZoneName; - for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i) { if (ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(i)) @@ -5279,7 +5277,7 @@ void Player::UpdateLocalChannels(uint32 newZone) if (channel->Flags & CHANNEL_DBC_FLAG_CITY_ONLY) currentNameExt = sObjectMgr->GetTrinityStringForDBCLocale(LANG_CHANNEL_CITY); else - currentNameExt = current_zone_name.c_str(); + currentNameExt = current_zone->ZoneName; snprintf(new_channel_name_buf, 100, channel->Name_lang, currentNameExt); @@ -16757,7 +16755,8 @@ void Player::_LoadEquipmentSets(PreparedQueryResult result) eqSet.State = EQUIPMENT_SET_UNCHANGED; for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) - eqSet.Data.Pieces[i] = ObjectGuid::Create(fields[5 + i].GetUInt64()); + if (uint64 guid = fields[5 + i].GetUInt64()) + eqSet.Data.Pieces[i] = ObjectGuid::Create(guid); if (eqSet.Data.SetID >= MAX_EQUIPMENT_SET_INDEX) // client limit continue; @@ -22997,6 +22996,9 @@ void Player::SendInitialPacketsBeforeAddToMap() /// SMSG_SEND_UNLEARN_SPELLS SendDirectMessage(WorldPackets::Spell::SendUnlearnSpells().Write()); + /// @todo: SMSG_SEND_SPELL_HISTORY + /// @todo: SMSG_SEND_SPELL_CHARGES + /// SMSG_ACTION_BUTTONS SendInitialActionButtons(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8a90204b70f..1dcd75a156e 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1758,8 +1758,8 @@ class Player : public Unit, public GridObject Unit* GetSelectedUnit() const; Player* GetSelectedPlayer() const; - void SetTarget(ObjectGuid /*guid*/) override { } /// Used for serverside target changes, does not apply to players - void SetSelection(ObjectGuid guid) { SetGuidValue(UNIT_FIELD_TARGET, guid); } + void SetTarget(ObjectGuid const& /*guid*/) override { } /// Used for serverside target changes, does not apply to players + void SetSelection(ObjectGuid const& guid) { SetGuidValue(UNIT_FIELD_TARGET, guid); } uint8 GetComboPoints() const { return m_comboPoints; } ObjectGuid GetComboTarget() const { return m_comboTarget; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 1905f41e84e..1418dc2ad35 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2164,7 +2164,7 @@ class Unit : public WorldObject TempSummon const* ToTempSummon() const { if (IsSummon()) return reinterpret_cast(this); else return NULL; } ObjectGuid GetTarget() const { return GetGuidValue(UNIT_FIELD_TARGET); } - virtual void SetTarget(ObjectGuid /*guid*/) = 0; + virtual void SetTarget(ObjectGuid const& /*guid*/) = 0; // Movement info Movement::MoveSpline * movespline; diff --git a/src/server/game/Handlers/ChannelHandler.cpp b/src/server/game/Handlers/ChannelHandler.cpp index 5826415a201..c6cd5337c5b 100644 --- a/src/server/game/Handlers/ChannelHandler.cpp +++ b/src/server/game/Handlers/ChannelHandler.cpp @@ -18,31 +18,20 @@ #include "ObjectMgr.h" // for normalizePlayerName #include "ChannelMgr.h" +#include "ChannelPackets.h" #include "Player.h" #include "WorldSession.h" #include -void WorldSession::HandleJoinChannel(WorldPacket& recvPacket) +void WorldSession::HandleJoinChannel(WorldPackets::Channel::JoinChannel& packet) { - uint32 channelId; - uint32 channelLength, passLength; - std::string channelName, password; + TC_LOG_DEBUG("chat.system", "CMSG_JOIN_CHANNEL %s ChatChannelId: %u, CreateVoiceSession: %u, Internal: %u, ChannelName: %s, Password: %s", + GetPlayerInfo().c_str(), packet.ChatChannelId, packet.CreateVoiceSession, packet.Internal, packet.ChannelName.c_str(), packet.Password.c_str()); - recvPacket >> channelId; - uint8 unknown1 = recvPacket.ReadBit(); // unknowns - uint8 unknown2 = recvPacket.ReadBit(); - channelLength = recvPacket.ReadBits(8); - passLength = recvPacket.ReadBits(8); - channelName = recvPacket.ReadString(channelLength); - password = recvPacket.ReadString(passLength); - - TC_LOG_DEBUG("chat.system", "CMSG_JOIN_CHANNEL %s Channel: %u, unk1: %u, unk2: %u, channel: %s, password: %s", - GetPlayerInfo().c_str(), channelId, unknown1, unknown2, channelName.c_str(), password.c_str()); - - if (channelId) + if (packet.ChatChannelId) { - ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(channelId); + ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(packet.ChatChannelId); if (!channel) return; @@ -51,53 +40,43 @@ void WorldSession::HandleJoinChannel(WorldPacket& recvPacket) return; } - if (channelName.empty()) + if (packet.ChannelName.empty()) return; - if (isdigit(channelName[0])) + if (isdigit(packet.ChannelName[0])) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) { - cMgr->setTeam(GetPlayer()->GetTeam()); - if (Channel* channel = cMgr->GetJoinChannel(channelName, channelId)) - channel->JoinChannel(GetPlayer(), password); + cMgr->SetTeam(GetPlayer()->GetTeam()); + if (Channel* channel = cMgr->GetJoinChannel(packet.ChannelName, packet.ChatChannelId)) + channel->JoinChannel(GetPlayer(), packet.Password); } } -void WorldSession::HandleLeaveChannel(WorldPacket& recvPacket) +void WorldSession::HandleLeaveChannel(WorldPackets::Channel::LeaveChannel& packet) { - uint32 unk; - std::string channelName; - recvPacket >> unk; // channel id? - uint32 length = recvPacket.ReadBits(8); - channelName = recvPacket.ReadString(length); + TC_LOG_DEBUG("chat.system", "CMSG_LEAVE_CHANNEL %s ChannelName: %s, ZoneChannelID: %u", + GetPlayerInfo().c_str(), packet.ChannelName.c_str(), packet.ZoneChannelID); - TC_LOG_DEBUG("chat.system", "CMSG_LEAVE_CHANNEL %s Channel: %s, unk1: %u", - GetPlayerInfo().c_str(), channelName.c_str(), unk); - - if (channelName.empty()) + if (packet.ChannelName.empty()) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) { - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + if (Channel* channel = cMgr->GetChannel(packet.ChannelName, GetPlayer())) channel->LeaveChannel(GetPlayer(), true); - cMgr->LeftChannel(channelName); + cMgr->LeftChannel(packet.ChannelName); } } -void WorldSession::HandleChannelList(WorldPacket& recvPacket) +void WorldSession::HandleChannelList(WorldPackets::Channel::ChannelListRequest& packet) { - uint32 length = recvPacket.ReadBits(8); - std::string channelName = recvPacket.ReadString(length); - - TC_LOG_DEBUG("chat.system", "%s %s Channel: %s", - recvPacket.GetOpcode() == CMSG_CHANNEL_DISPLAY_LIST ? "CMSG_CHANNEL_DISPLAY_LIST" : "CMSG_CHANNEL_LIST", - GetPlayerInfo().c_str(), channelName.c_str()); + TC_LOG_DEBUG("chat.system", "%s %s ChannelName: %s", + GetOpcodeNameForLogging(packet.GetOpcode()).c_str(), GetPlayerInfo().c_str(), packet.ChannelName.c_str()); - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) + if (Channel* channel = cMgr->GetChannel(packet.ChannelName, GetPlayer())) channel->List(GetPlayer()); } @@ -115,7 +94,7 @@ void WorldSession::HandleChannelPassword(WorldPacket& recvPacket) if (password.length() > MAX_CHANNEL_PASS_STR) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Password(GetPlayer(), password); } @@ -134,7 +113,7 @@ void WorldSession::HandleChannelSetOwner(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->SetOwner(GetPlayer(), targetName); } @@ -147,9 +126,9 @@ void WorldSession::HandleChannelOwner(WorldPacket& recvPacket) TC_LOG_DEBUG("chat.system", "CMSG_CHANNEL_OWNER %s Channel: %s", GetPlayerInfo().c_str(), channelName.c_str()); - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->SendWhoOwner(GetPlayer()->GetGUID()); + channel->SendWhoOwner(GetPlayer()); } void WorldSession::HandleChannelModerator(WorldPacket& recvPacket) @@ -166,7 +145,7 @@ void WorldSession::HandleChannelModerator(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->SetModerator(GetPlayer(), targetName); } @@ -185,7 +164,7 @@ void WorldSession::HandleChannelUnmoderator(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->UnsetModerator(GetPlayer(), targetName); } @@ -204,7 +183,7 @@ void WorldSession::HandleChannelMute(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->SetMute(GetPlayer(), targetName); } @@ -223,7 +202,7 @@ void WorldSession::HandleChannelUnmute(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->UnsetMute(GetPlayer(), targetName); } @@ -242,7 +221,7 @@ void WorldSession::HandleChannelInvite(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Invite(GetPlayer(), targetName); } @@ -261,7 +240,7 @@ void WorldSession::HandleChannelKick(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Kick(GetPlayer(), targetName); } @@ -283,7 +262,7 @@ void WorldSession::HandleChannelBan(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Ban(GetPlayer(), targetName); } @@ -302,7 +281,7 @@ void WorldSession::HandleChannelUnban(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->UnBan(GetPlayer(), targetName); } @@ -315,17 +294,11 @@ void WorldSession::HandleChannelAnnouncements(WorldPacket& recvPacket) TC_LOG_DEBUG("chat.system", "CMSG_CHANNEL_ANNOUNCEMENTS %s Channel: %s", GetPlayerInfo().c_str(), channelName.c_str()); - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Announce(GetPlayer()); } -void WorldSession::HandleChannelDisplayListQuery(WorldPacket &recvPacket) -{ - // this should be OK because the 2 function _were_ the same - HandleChannelList(recvPacket); -} - void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket) { std::string channelName; @@ -334,7 +307,7 @@ void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket) TC_LOG_DEBUG("chat.system", "CMSG_GET_CHANNEL_MEMBER_COUNT %s Channel: %s", GetPlayerInfo().c_str(), channelName.c_str()); - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) { if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) { diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 83844a257cc..2c98d6c1bd6 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -37,6 +37,7 @@ #include "Language.h" #include "LFGMgr.h" #include "Log.h" +#include "MiscPackets.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Opcodes.h" @@ -836,6 +837,8 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) return; } + SendTutorialsData(); + pCurrChar->GetMotionMaster()->Initialize(); pCurrChar->SendDungeonDifficulty(false); @@ -1107,32 +1110,35 @@ void WorldSession::HandleSetFactionCheat(WorldPacket& /*recvData*/) GetPlayer()->GetReputationMgr().SendStates(); } -void WorldSession::HandleTutorialFlag(WorldPacket& recvData) -{ - uint32 data; - recvData >> data; - - uint8 index = uint8(data / 32); - if (index >= MAX_ACCOUNT_TUTORIAL_VALUES) - return; - - uint32 value = (data % 32); - - uint32 flag = GetTutorialInt(index); - flag |= (1 << value); - SetTutorialInt(index, flag); -} - -void WorldSession::HandleTutorialClear(WorldPacket& /*recvData*/) -{ - for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) - SetTutorialInt(i, 0xFFFFFFFF); -} - -void WorldSession::HandleTutorialReset(WorldPacket& /*recvData*/) +void WorldSession::HandleTutorialFlag(WorldPackets::Misc::TutorialSetFlag& packet) { - for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) - SetTutorialInt(i, 0x00000000); + switch (packet.Action) + { + case TUTORIAL_ACTION_UPDATE: + { + uint8 index = uint8(packet.TutorialBit >> 5); + if (index >= MAX_ACCOUNT_TUTORIAL_VALUES) + { + TC_LOG_ERROR("network", "CMSG_TUTORIAL_FLAG received bad TutorialBit %u.", packet.TutorialBit); + return; + } + uint32 flag = GetTutorialInt(index); + flag |= (1 << (packet.TutorialBit & 0x1F)); + SetTutorialInt(index, flag); + break; + } + case TUTORIAL_ACTION_CLEAR: + for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) + SetTutorialInt(i, 0xFFFFFFFF); + break; + case TUTORIAL_ACTION_RESET: + for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) + SetTutorialInt(i, 0x00000000); + break; + default: + TC_LOG_ERROR("network", "CMSG_TUTORIAL_FLAG received unknown TutorialAction %u.", packet.Action); + return; + } } void WorldSession::HandleSetWatchedFactionOpcode(WorldPacket& recvData) diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index a2485d7854b..b51f0d52480 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -354,7 +354,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, } } - if (ChannelMgr* cMgr = ChannelMgr::forTeam(sender->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(sender->GetTeam())) { if (Channel* chn = cMgr->GetChannel(target, sender)) { diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 613f1e46d7b..91ffa3aff87 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -538,12 +538,9 @@ void WorldSession::HandleRequestCemeteryList(WorldPacket& /*recvPacket*/) SendPacket(&data); } -void WorldSession::HandleSetSelectionOpcode(WorldPacket& recvData) +void WorldSession::HandleSetSelectionOpcode(WorldPackets::Misc::SetSelection& packet) { - ObjectGuid guid; - recvData >> guid; - - _player->SetSelection(guid); + _player->SetSelection(packet.Selection); } void WorldSession::HandleStandStateChangeOpcode(WorldPacket& recvData) diff --git a/src/server/game/Server/Packets/ChannelPackets.cpp b/src/server/game/Server/Packets/ChannelPackets.cpp index 28a50a6c9aa..2ece521b42b 100644 --- a/src/server/game/Server/Packets/ChannelPackets.cpp +++ b/src/server/game/Server/Packets/ChannelPackets.cpp @@ -18,7 +18,12 @@ #include "ChannelPackets.h" #include "Channel.h" -WorldPacket const* WorldPackets::Channel::ChannelList::Write() +void WorldPackets::Channel::ChannelListRequest::Read() +{ + ChannelName = _worldPacket.ReadString(_worldPacket.ReadBits(7)); +} + +WorldPacket const* WorldPackets::Channel::ChannelListResponse::Write() { _worldPacket.WriteBit(Display); _worldPacket.WriteBits(Channel.length(), 7); @@ -43,7 +48,7 @@ WorldPacket const* WorldPackets::Channel::ChannelNotify::Write() _worldPacket.WriteBits(Sender.length(), 6); _worldPacket << SenderGuid; - _worldPacket << SenderBnetAccountID; + _worldPacket << SenderAccountID; _worldPacket << uint32(SenderVirtualRealm); _worldPacket << TargetGuid; _worldPacket << uint32(TargetVirtualRealm); @@ -94,3 +99,9 @@ void WorldPackets::Channel::JoinChannel::Read() ChannelName = _worldPacket.ReadString(channelLength); Password = _worldPacket.ReadString(passwordLength); } + +void WorldPackets::Channel::LeaveChannel::Read() +{ + _worldPacket >> ZoneChannelID; + ChannelName = _worldPacket.ReadString(_worldPacket.ReadBits(7)); +} diff --git a/src/server/game/Server/Packets/ChannelPackets.h b/src/server/game/Server/Packets/ChannelPackets.h index 3fe2a353070..36a0a516928 100644 --- a/src/server/game/Server/Packets/ChannelPackets.h +++ b/src/server/game/Server/Packets/ChannelPackets.h @@ -25,7 +25,20 @@ namespace WorldPackets { namespace Channel { - class ChannelList final : public ServerPacket + class ChannelListRequest final : public ClientPacket + { + public: + ChannelListRequest(WorldPacket&& packet) : ClientPacket(std::move(packet)) + { + ASSERT(packet.GetOpcode() == CMSG_CHANNEL_LIST || packet.GetOpcode() == CMSG_CHANNEL_DISPLAY_LIST); + } + + void Read() override; + + std::string ChannelName; + }; + + class ChannelListResponse final : public ServerPacket { public: struct ChannelPlayer @@ -38,7 +51,7 @@ namespace WorldPackets uint8 Flags = 0; ///< @see enum ChannelMemberFlags }; - ChannelList() : ServerPacket(SMSG_CHANNEL_LIST) { } + ChannelListResponse() : ServerPacket(SMSG_CHANNEL_LIST) { } WorldPacket const* Write() override; @@ -57,11 +70,11 @@ namespace WorldPackets std::string Sender; ObjectGuid SenderGuid; - ObjectGuid SenderBnetAccountID; + ObjectGuid SenderAccountID; uint8 Type = 0; ///< @see enum ChatNotify uint8 OldFlags = 0; ///< @see enum ChannelMemberFlags uint8 NewFlags = 0; ///< @see enum ChannelMemberFlags - std::string Channel; + std::string Channel; ///< Channel Name uint32 SenderVirtualRealm = 0; ObjectGuid TargetGuid; uint32 TargetVirtualRealm = 0; @@ -79,7 +92,7 @@ namespace WorldPackets int32 ChatChannelID = 0; int32 InstanceID = 0; uint8 ChannelFlags = 0; ///< @see enum ChannelFlags - std::string Channel; + std::string Channel; ///< Channel Name }; class ChannelNotifyLeft final : public ServerPacket @@ -89,9 +102,9 @@ namespace WorldPackets WorldPacket const* Write() override; - std::string Channel; + std::string Channel; ///< Channel Name int32 ChatChannelID = 0; - bool Suspended = false; + bool Suspended = false; ///< User Leave - false, On Zone Change - true }; class JoinChannel final : public ClientPacket @@ -107,6 +120,17 @@ namespace WorldPackets int32 ChatChannelId = 0; bool Internal = false; }; + + class LeaveChannel final : public ClientPacket + { + public: + LeaveChannel(WorldPacket&& packet) : ClientPacket(CMSG_LEAVE_CHANNEL, std::move(packet)) { } + + void Read() override; + + int32 ZoneChannelID = 0; + std::string ChannelName; + }; } } diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index e406829a760..154ff134a6a 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -46,6 +46,11 @@ WorldPacket const* WorldPackets::Misc::LoginSetTimeSpeed::Write() return &_worldPacket; } +void WorldPackets::Misc::SetSelection::Read() +{ + _worldPacket >> Selection; +} + void WorldPackets::Misc::ViolenceLevel::Read() { _worldPacket >> ViolenceLvl; @@ -78,6 +83,12 @@ WorldPacket const* WorldPackets::Misc::TutorialFlags::Write() return &_worldPacket; } +void WorldPackets::Misc::TutorialSetFlag::Read() +{ + Action = _worldPacket.ReadBits(2); + _worldPacket >> TutorialBit; +} + WorldPacket const* WorldPackets::Misc::WorldServerInfo::Write() { _worldPacket << uint32(DifficultyID); diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 7bb2cb3fb9b..c25370505d3 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -62,6 +62,16 @@ namespace WorldPackets int32 GameTimeHolidayOffset = 0; }; + class SetSelection final : public ClientPacket + { + public: + SetSelection(WorldPacket&& packet) : ClientPacket(CMSG_SET_SELECTION, std::move(packet)) { } + + void Read() override; + + ObjectGuid Selection; ///< Target + }; + class ViolenceLevel final : public ClientPacket { public: @@ -116,6 +126,17 @@ namespace WorldPackets uint32 TutorialData[MAX_ACCOUNT_TUTORIAL_VALUES]; }; + class TutorialSetFlag final : public ClientPacket + { + public: + TutorialSetFlag(WorldPacket&& packet) : ClientPacket(CMSG_TUTORIAL_FLAG, std::move(packet)) { } + + void Read() override; + + uint8 Action = 0; + uint32 TutorialBit = 0; + }; + class WorldServerInfo final : public ServerPacket { public: diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index c3f7906e0fd..bab7ad89ce4 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -242,6 +242,13 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementMonster data << movementMonsterSpline.Destination; data << movementMonsterSpline.Move; data.WriteBit(movementMonsterSpline.CrzTeleport); + + // Unk bits. 0 if monster is moving, 1 or 2 if stopped + if (movementMonsterSpline.Move.Flags) + data.WriteBits(0, 2); + else + data.WriteBits(2, 2); + data.FlushBits(); return data; @@ -252,15 +259,6 @@ WorldPacket const* WorldPackets::Movement::MonsterMove::Write() _worldPacket << MoverGUID; _worldPacket << Pos; _worldPacket << SplineData; - - // Unk bits. 0 if monster is moving, 1 or 2 if stopped - if (SplineData.Move.Flags) - _worldPacket.WriteBits(0, 2); - else - _worldPacket.WriteBits(2, 2); - - _worldPacket.FlushBits(); - return &_worldPacket; } diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 2b92fe4fed9..6f3b19a661d 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -171,7 +171,7 @@ namespace WorldPackets class WorldPortAck final : public ClientPacket { public: - WorldPortAck(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + WorldPortAck(WorldPacket&& packet) : ClientPacket(CMSG_MOVE_WORLDPORT_ACK, std::move(packet)) { } void Read() override { } }; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index acc3b67f12c..9d6ab2514b8 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -215,10 +215,10 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_ANNOUNCEMENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelAnnouncements ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_BAN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelBan ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_DISPLAY_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelDisplayListQuery ); + DEFINE_HANDLER(CMSG_CHANNEL_DISPLAY_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::ChannelListRequest, &WorldSession::HandleChannelList); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelInvite ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_KICK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelKick ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelList ); + DEFINE_HANDLER(CMSG_CHANNEL_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::ChannelListRequest, &WorldSession::HandleChannelList); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_MODERATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_MODERATOR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelModerator ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_MUTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelMute ); @@ -364,12 +364,12 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_REFUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefund ); DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_REFUND_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefundInfoRequest ); DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemTextQuery ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_JOIN_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleJoinChannel ); + DEFINE_HANDLER(CMSG_JOIN_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::JoinChannel, &WorldSession::HandleJoinChannel); DEFINE_OPCODE_HANDLER_OLD(CMSG_KEEP_ALIVE, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_EarlyProccess ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LEARN_PREVIEW_TALENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnPreviewTalents ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LEARN_PREVIEW_TALENTS_PET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnPreviewTalentsPet ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LEARN_TALENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnTalentOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LEAVE_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveChannel ); + DEFINE_HANDLER(CMSG_LEAVE_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::LeaveChannel, &WorldSession::HandleLeaveChannel); DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_GET_STATUS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleLfgGetStatus ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LEAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode ); @@ -594,7 +594,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PREFERED_CEMETERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_RELATIVE_POSITION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SAVED_INSTANCE_EXTEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetSavedInstanceExtend ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SELECTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleSetSelectionOpcode ); + DEFINE_HANDLER(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetSelection, &WorldSession::HandleSetSelectionOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SKILL_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_SET_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Talent::SetSpecialization, &WorldSession::HandleSetSpecializationOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TAXI_BENCHMARK_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTaxiBenchmarkOpcode ); @@ -634,16 +634,14 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_TRAINER_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTrainerListOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TRANSMOGRIFY_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTransmogrifyItems ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TURN_IN_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTurnInPetitionOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_CLEAR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialClear ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_FLAG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialFlag ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_RESET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialReset ); + DEFINE_HANDLER(CMSG_TUTORIAL_FLAG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TutorialSetFlag, &WorldSession::HandleTutorialFlag); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode ); DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::UndeleteCharacter, &WorldSession::HandleCharUndeleteOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNDELETE_COOLDOWN_STATUS_QUERY, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUndeleteCooldownStatusQuery); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SKILL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnlearnSkillOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnregisterAddonPrefixesOpcode); - DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::UserClientUpdateAccountData, &WorldSession::HandleUpdateAccountData ); + DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::UserClientUpdateAccountData, &WorldSession::HandleUpdateAccountData); DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory ); DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_PROJECTILE_POSITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateProjectilePosition ); DEFINE_OPCODE_HANDLER_OLD(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -697,12 +695,14 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_INFO_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_MOUNT_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_RESTRICTED_WARNING, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTION_BUTTONS, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATETAXIREPLY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADDON_INFO, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_RUNE_POWER, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADJUST_SPLINE_DURATION, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_UNHANDLED); @@ -762,6 +762,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_INFO_THROTTLED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_JOINED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_LEFT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE, STATUS_UNHANDLED); @@ -800,11 +801,11 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_AUTO_REPEAT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_COMBAT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_LIST, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_LIST, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_MEMBER_COUNT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_JOINED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_LEFT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_JOINED, STATUS_NEVER); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_LEFT, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_START, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_LOGIN_FAILED, STATUS_UNHANDLED); @@ -921,6 +922,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMETIME_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_EVENT_DEBUG_LOG, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_MISSION_RESULT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOTE_INFO, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_DB_ERROR, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_RECEIVED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_STATUS_UPDATE, STATUS_UNHANDLED); @@ -933,6 +935,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_PLAYER_INFO, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_STATUS_UPDATE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_SYSTEM_STATUS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GODMODE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_COMPLETE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_UNHANDLED); @@ -964,6 +967,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_DECLINE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_BANK_MONEY_CHANGED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_LOG_QUERY_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_PRESENCE_CHANGE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_FLAGGED_FOR_RENAME, STATUS_UNHANDLED); @@ -1075,6 +1079,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_SLOT_CHANGED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_START_ROLL, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJ_EVENTS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MEETINGSTONE_IN_PROGRESS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGECHAT, STATUS_NEVER); @@ -1244,6 +1249,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_EXPIRED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFORGE_RESULT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_SPELL_HISTORY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVED_SPELL, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPORT_PVP_AFK_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_UNHANDLED); @@ -1261,6 +1267,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RWHOIS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_ITEM, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_MAIL_RESULT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_CHARGES, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_HISTORY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_UNLEARN_SPELLS, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVERTIME, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENT, STATUS_UNHANDLED); @@ -1268,6 +1276,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_MESSAGE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_PERF, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_AI_ANIM_KIT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ALL_TASK_PROGRESS, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_CURRENCY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_DF_FAST_LAUNCH_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_ATWAR, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_NOT_VISIBLE, STATUS_UNHANDLED); @@ -1275,6 +1285,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MAX_WEEKLY_QUANTITY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MELEE_ANIM_KIT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MOVEMENT_ANIM_KIT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_UNHANDLED); @@ -1341,6 +1352,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNSET_HOVER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STABLE_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STANDSTATE_UPDATE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMERS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_MIRROR_TIMER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_TIMER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_DANCE, STATUS_UNHANDLED); @@ -1391,6 +1403,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_LAST_INSTANCE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_OBJECT, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_SERVER_PLAYER_POSITION, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_TASK_PROGRESS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_WORLD_STATE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_ADD, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_REMOVE, STATUS_UNHANDLED); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 06654acb0bc..cf98d5335db 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -149,10 +149,10 @@ enum OpcodeClient : uint32 CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0xBADD, CMSG_CHANNEL_ANNOUNCEMENTS = 0xBADD, CMSG_CHANNEL_BAN = 0xBADD, - CMSG_CHANNEL_DISPLAY_LIST = 0xBADD, + CMSG_CHANNEL_DISPLAY_LIST = 0x093B, CMSG_CHANNEL_INVITE = 0xBADD, CMSG_CHANNEL_KICK = 0xBADD, - CMSG_CHANNEL_LIST = 0xBADD, + CMSG_CHANNEL_LIST = 0x093B, CMSG_CHANNEL_MODERATE = 0xBADD, CMSG_CHANNEL_MODERATOR = 0xBADD, CMSG_CHANNEL_MUTE = 0xBADD, @@ -193,7 +193,7 @@ enum OpcodeClient : uint32 CMSG_COMPLAIN = 0xBADD, CMSG_COMPLETE_CINEMATIC = 0xBADD, CMSG_COMPLETE_MOVIE = 0xBADD, - CMSG_CONNECT_TO_FAILED = 0xBADD, + CMSG_CONNECT_TO_FAILED = 0x0135, CMSG_CONTACT_LIST = 0xBADD, CMSG_CORPSE_MAP_POSITION_QUERY = 0xBADD, CMSG_CREATURE_QUERY = 0x0505, @@ -315,7 +315,7 @@ enum OpcodeClient : uint32 CMSG_LEARN_PREVIEW_TALENTS = 0xBADD, CMSG_LEARN_PREVIEW_TALENTS_PET = 0xBADD, CMSG_LEARN_TALENT = 0xBADD, - CMSG_LEAVE_CHANNEL = 0xBADD, + CMSG_LEAVE_CHANNEL = 0x19F2, CMSG_LFG_GET_STATUS = 0xBADD, CMSG_LFG_JOIN = 0xBADD, CMSG_LFG_LEAVE = 0xBADD, @@ -459,7 +459,7 @@ enum OpcodeClient : uint32 CMSG_PET_SPELL_AUTOCAST = 0xBADD, CMSG_PET_STOP_ATTACK = 0xBADD, CMSG_PING = 0x0416, - CMSG_PLAYED_TIME = 0xBADD, + CMSG_PLAYED_TIME = 0x1BB2, CMSG_PLAYER_DIFFICULTY_CHANGE = 0xBADD, CMSG_PLAYER_LOGIN = 0x0B1D, CMSG_PLAYER_LOGOUT = 0xBADD, @@ -508,7 +508,7 @@ enum OpcodeClient : uint32 CMSG_REPORT_PVP_AFK = 0xBADD, CMSG_REQUEST_ACCOUNT_DATA = 0x0F3E, CMSG_REQUEST_CATEGORY_COOLDOWNS = 0xBADD, - CMSG_REQUEST_CEMETERY_LIST = 0xBADD, + CMSG_REQUEST_CEMETERY_LIST = 0x10A2, CMSG_REQUEST_HOTFIX = 0xBADD, CMSG_REQUEST_INSPECT_RATED_BG_STATS = 0xBADD, CMSG_REQUEST_PARTY_MEMBER_STATS = 0xBADD, @@ -543,7 +543,7 @@ enum OpcodeClient : uint32 CMSG_SET_ACTIONBAR_TOGGLES = 0xBADD, CMSG_SET_ACTION_BUTTON = 0x0599, CMSG_SET_ACTIVE_MOVER = 0xBADD, - CMSG_SET_ACTIVE_VOICE_CHANNEL = 0xBADD, + CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x031E, CMSG_SET_ALLOW_LOW_LEVEL_RAID1 = 0xBADD, CMSG_SET_ALLOW_LOW_LEVEL_RAID2 = 0xBADD, CMSG_SET_CHANNEL_WATCH = 0xBADD, @@ -608,9 +608,7 @@ enum OpcodeClient : uint32 CMSG_TRANSMOGRIFY_ITEMS = 0x0A85, CMSG_TRIGGER_CINEMATIC_CHEAT = 0xBADD, CMSG_TURN_IN_PETITION = 0xBADD, - CMSG_TUTORIAL_CLEAR = 0xBADD, - CMSG_TUTORIAL_FLAG = 0xBADD, - CMSG_TUTORIAL_RESET = 0xBADD, + CMSG_TUTORIAL_FLAG = 0x0B16, CMSG_UNACCEPT_TRADE = 0xBADD, CMSG_UNDELETE_CHARACTER = 0x0D99, CMSG_UNDELETE_COOLDOWN_STATUS_QUERY = 0x19A9, @@ -623,7 +621,7 @@ enum OpcodeClient : uint32 CMSG_USED_FOLLOW = 0xBADD, CMSG_USE_ITEM = 0x08B6, CMSG_VIOLENCE_LEVEL = 0x098D, - CMSG_VOICE_SESSION_ENABLE = 0xBADD, + CMSG_VOICE_SESSION_ENABLE = 0x1102, CMSG_VOID_STORAGE_QUERY = 0x019E, CMSG_VOID_STORAGE_TRANSFER = 0x0463, CMSG_VOID_STORAGE_UNLOCK = 0x13BB, @@ -685,12 +683,14 @@ enum OpcodeServer : uint32 SMSG_ACCOUNT_INFO_RESPONSE = 0xBADD, SMSG_ACCOUNT_MOUNT_UPDATE = 0x0140, SMSG_ACCOUNT_RESTRICTED_WARNING = 0xBADD, + SMSG_ACCOUNT_TOYS_UPDATE = 0x0590, SMSG_ACHIEVEMENT_DELETED = 0xBADD, SMSG_ACHIEVEMENT_EARNED = 0xBADD, SMSG_ACTION_BUTTONS = 0x1D1F, SMSG_ACTIVATETAXIREPLY = 0xBADD, SMSG_ADDON_INFO = 0x1D9F, SMSG_ADD_RUNE_POWER = 0xBADD, + SMSG_ADJUST_SPLINE_DURATION = 0x0104, SMSG_AI_REACTION = 0x0BA1, SMSG_ALL_ACHIEVEMENT_DATA = 0xBADD, SMSG_ALL_ACHIEVEMENT_DATA_ACCOUNT = 0x0123, @@ -724,12 +724,12 @@ enum OpcodeServer : uint32 SMSG_AUCTION_OWNER_NOTIFICATION = 0xBADD, SMSG_AUCTION_REMOVED_NOTIFICATION = 0xBADD, SMSG_AURACASTLOG = 0xBADD, - SMSG_AURA_POINTS_DEPLETED = 0xBADD, + SMSG_AURA_POINTS_DEPLETED = 0x093B, SMSG_AURA_UPDATE = 0x091C, SMSG_AURA_UPDATE_ALL = 0xBADD, SMSG_AUTH_CHALLENGE = 0x1759, SMSG_AUTH_RESPONSE = 0x0DA9, - SMSG_AVAILABLE_VOICE_CHANNEL = 0xBADD, + SMSG_AVAILABLE_VOICE_CHANNEL = 0x04D4, SMSG_AVERAGE_ITEM_LEVEL_INFORM = 0xBADD, SMSG_BARBER_SHOP_RESULT = 0xBADD, SMSG_BATTLEFIELD_LIST = 0xBADD, @@ -753,6 +753,7 @@ enum OpcodeServer : uint32 SMSG_BATTLEGROUND_INFO_THROTTLED = 0xBADD, SMSG_BATTLEGROUND_PLAYER_JOINED = 0xBADD, SMSG_BATTLEGROUND_PLAYER_LEFT = 0xBADD, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x0BE3, SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x0F2A, SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x12A4, SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x168A, @@ -787,7 +788,7 @@ enum OpcodeServer : uint32 SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0xBADD, SMSG_CALENDAR_SEND_CALENDAR = 0xBADD, SMSG_CALENDAR_SEND_EVENT = 0xBADD, - SMSG_CALENDAR_SEND_NUM_PENDING = 0xBADD, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x1B3A, SMSG_CALENDAR_UPDATE_INVITE_LIST = 0xBADD, SMSG_CAMERA_SHAKE = 0xBADD, SMSG_CANCEL_AUTO_REPEAT = 0xBADD, @@ -922,6 +923,7 @@ enum OpcodeServer : uint32 SMSG_GAMETIME_UPDATE = 0xBADD, SMSG_GAME_EVENT_DEBUG_LOG = 0xBADD, SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x0952, + SMSG_GARRISON_REMOTE_INFO = 0x0151, SMSG_GMRESPONSE_DB_ERROR = 0xBADD, SMSG_GMRESPONSE_RECEIVED = 0xBADD, SMSG_GMRESPONSE_STATUS_UPDATE = 0xBADD, @@ -934,6 +936,7 @@ enum OpcodeServer : uint32 SMSG_GM_PLAYER_INFO = 0xBADD, SMSG_GM_TICKET_CASE_STATUS = 0x1D8D, SMSG_GM_TICKET_STATUS_UPDATE = 0xBADD, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x1229, SMSG_GODMODE = 0xBADD, SMSG_GOSSIP_COMPLETE = 0x15D1, SMSG_GOSSIP_MESSAGE = 0x1746, @@ -966,6 +969,7 @@ enum OpcodeServer : uint32 SMSG_GUILD_CRITERIA_UPDATE = 0x1208, SMSG_GUILD_DECLINE = 0xBADD, SMSG_GUILD_EVENT = 0x1027, + SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x1077, SMSG_GUILD_EVENT_LOG_QUERY_RESULT = 0xBADD, SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x1228, SMSG_GUILD_FLAGGED_FOR_RENAME = 0xBADD, @@ -992,7 +996,7 @@ enum OpcodeServer : uint32 SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0xBADD, SMSG_GUILD_REPUTATION_WEEKLY_CAP = 0xBADD, SMSG_GUILD_RESET = 0xBADD, - SMSG_GUILD_REWARDS_LIST = 0xBADD, + SMSG_GUILD_REWARDS_LIST = 0x1818, SMSG_GUILD_ROSTER = 0x1026, SMSG_GUILD_SET_NOTE = 0xBADD, SMSG_GUILD_TRADESKILL_UPDATE = 0xBADD, @@ -1088,6 +1092,7 @@ enum OpcodeServer : uint32 SMSG_LOOT_SLOT_CHANGED = 0xBADD, SMSG_LOOT_START_ROLL = 0xBADD, SMSG_MAIL_LIST_RESULT = 0x0B3F, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x153D, SMSG_MAP_OBJ_EVENTS = 0xBADD, SMSG_MEETINGSTONE_COMPLETE = 0xBADD, SMSG_MEETINGSTONE_IN_PROGRESS = 0xBADD, @@ -1267,9 +1272,10 @@ enum OpcodeServer : uint32 SMSG_REFER_A_FRIEND_EXPIRED = 0xBADD, SMSG_REFER_A_FRIEND_FAILURE = 0xBADD, SMSG_REFORGE_RESULT = 0xBADD, + SMSG_REFRESH_SPELL_HISTORY = 0x0A2A, SMSG_REMOVED_SPELL = 0xBADD, SMSG_REPORT_PVP_AFK_RESULT = 0xBADD, - SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0xBADD, + SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x059E, SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0xBADD, SMSG_RESEARCH_COMPLETE = 0xBADD, SMSG_RESEARCH_SETUP_HISTORY = 0x0A25, @@ -1285,13 +1291,17 @@ enum OpcodeServer : uint32 SMSG_RWHOIS = 0xBADD, SMSG_SELL_ITEM = 0xBADD, SMSG_SEND_MAIL_RESULT = 0x0302, - SMSG_SEND_UNLEARN_SPELLS = 0x1A82, + SMSG_SEND_SPELL_CHARGES = 0x1A82, + SMSG_SEND_SPELL_HISTORY = 0x1933, + SMSG_SEND_UNLEARN_SPELLS = 0x0BCB, SMSG_SERVERTIME = 0xBADD, SMSG_SERVER_FIRST_ACHIEVEMENT = 0xBADD, SMSG_SERVER_INFO_RESPONSE = 0xBADD, SMSG_SERVER_MESSAGE = 0x0683, SMSG_SERVER_PERF = 0xBADD, SMSG_SET_AI_ANIM_KIT = 0x0335, + SMSG_SET_ALL_TASK_PROGRESS = 0x1B52, + SMSG_SET_CURRENCY = 0x17BE, SMSG_SET_DF_FAST_LAUNCH_RESULT = 0xBADD, SMSG_SET_FACTION_ATWAR = 0xBADD, SMSG_SET_FACTION_NOT_VISIBLE = 0xBADD, @@ -1299,6 +1309,7 @@ enum OpcodeServer : uint32 SMSG_SET_FACTION_VISIBLE = 0x138B, SMSG_SET_FLAT_SPELL_MODIFIER = 0x1884, SMSG_SET_FORCED_REACTIONS = 0x09A9, + SMSG_SET_MAX_WEEKLY_QUANTITY = 0x1489, SMSG_SET_MELEE_ANIM_KIT = 0xBADD, SMSG_SET_MOVEMENT_ANIM_KIT = 0xBADD, SMSG_SET_PCT_SPELL_MODIFIER = 0x113C, @@ -1367,6 +1378,7 @@ enum OpcodeServer : uint32 SMSG_SPLINE_MOVE_WATER_WALK = 0xBADD, SMSG_STABLE_RESULT = 0xBADD, SMSG_STANDSTATE_UPDATE = 0x1311, + SMSG_START_ELAPSED_TIMERS = 0x093F, SMSG_START_MIRROR_TIMER = 0xBADD, SMSG_START_TIMER = 0xBADD, SMSG_STOP_DANCE = 0xBADD, @@ -1381,7 +1393,7 @@ enum OpcodeServer : uint32 SMSG_TALENTS_ERROR = 0xBADD, SMSG_TALENTS_INFO = 0x012D, SMSG_TALENTS_INVOLUNTARILY_RESET = 0xBADD, - SMSG_TAXINODE_STATUS = 0xBADD, + SMSG_TAXINODE_STATUS = 0x0338, SMSG_TEST_DROP_RATE_RESULT = 0xBADD, SMSG_TEXT_EMOTE = 0x0383, SMSG_THREAT_CLEAR = 0xBADD, @@ -1417,6 +1429,7 @@ enum OpcodeServer : uint32 SMSG_UPDATE_LAST_INSTANCE = 0xBADD, SMSG_UPDATE_OBJECT = 0x122C, SMSG_UPDATE_SERVER_PLAYER_POSITION = 0xBADD, + SMSG_UPDATE_TASK_PROGRESS = 0x1209, SMSG_UPDATE_WORLD_STATE = 0x03EC, SMSG_USERLIST_ADD = 0xBADD, SMSG_USERLIST_REMOVE = 0xBADD, @@ -1424,7 +1437,7 @@ enum OpcodeServer : uint32 SMSG_VOICESESSION_FULL = 0xBADD, SMSG_VOICE_CHAT_STATUS = 0xBADD, SMSG_VOICE_PARENTAL_CONTROLS = 0xBADD, - SMSG_VOICE_SESSION_LEAVE = 0xBADD, + SMSG_VOICE_SESSION_LEAVE = 0x0403, SMSG_VOICE_SESSION_ROSTER_UPDATE = 0xBADD, SMSG_VOICE_SET_TALKER_MUTED = 0xBADD, SMSG_VOID_ITEM_SWAP_RESPONSE = 0x1131, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index eae081f2b74..6bb4daf9fc3 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -104,7 +104,9 @@ namespace WorldPackets namespace Channel { + class ChannelListRequest; class JoinChannel; + class LeaveChannel; } namespace Chat @@ -148,8 +150,10 @@ namespace WorldPackets namespace Misc { + class SetSelection; class ViolenceLevel; class TimeSyncResponse; + class TutorialSetFlag; } namespace Query @@ -191,17 +195,38 @@ enum AccountDataType #define REGISTERED_ADDON_PREFIX_SOFTCAP 64 +enum TutorialAction +{ + TUTORIAL_ACTION_UPDATE = 0, + TUTORIAL_ACTION_CLEAR = 1, + TUTORIAL_ACTION_RESET = 2 +}; + +/* enum Tutorials { - TUTORIAL_TALENT = 0, - TUTORIAL_SPEC = 1, - TUTORIAL_GLYPH = 2, - TUTORIAL_SPELLBOOK = 3, - TUTORIAL_PROFESSIONS = 4, - TUTORIAL_CORE_ABILITITES = 5, - TUTORIAL_PET_JOURNAL = 6, - TUTORIAL_WHAT_HAS_CHANGED = 7 + TUTORIAL_TALENT = 0, + TUTORIAL_SPEC = 1, + TUTORIAL_GLYPH = 2, + TUTORIAL_SPELLBOOK = 3, + TUTORIAL_PROFESSIONS = 4, + TUTORIAL_CORE_ABILITITES = 5, + TUTORIAL_PET_JOURNAL = 6, + TUTORIAL_WHAT_HAS_CHANGED = 7, + TUTORIAL_GARRISON_BUILDING = 8, + TUTORIAL_GARRISON_MISSION_LIST = 9, + TUTORIAL_GARRISON_MISSION_PAGE = 10, + TUTORIAL_GARRISON_LANDING = 11, + TUTORIAL_GARRISON_ZONE_ABILITY = 12, + TUTORIAL_WORLD_MAP_FRAME = 13, + TUTORIAL_CLEAN_UP_BAGS = 14, + TUTORIAL_BAG_SETTINGS = 15, + TUTORIAL_REAGENT_BANK_UNLOCK = 16, + TUTORIAL_TOYBOX_FAVORITE = 17, + TUTORIAL_TOYBOX_MOUSEWHEEL_PAGING = 18, + TUTORIAL_LFG_LIST = 19 }; +*/ #define MAX_ACCOUNT_TUTORIAL_VALUES 8 @@ -621,7 +646,7 @@ class WorldSession void HandleTogglePvP(WorldPacket& recvPacket); void HandleZoneUpdateOpcode(WorldPacket& recvPacket); - void HandleSetSelectionOpcode(WorldPacket& recvPacket); + void HandleSetSelectionOpcode(WorldPackets::Misc::SetSelection& packet); void HandleStandStateChangeOpcode(WorldPacket& recvPacket); void HandleEmoteOpcode(WorldPacket& recvPacket); void HandleContactListOpcode(WorldPacket& recvPacket); @@ -887,9 +912,9 @@ class WorldSession void HandleResurrectResponseOpcode(WorldPacket& recvPacket); void HandleSummonResponseOpcode(WorldPacket& recvData); - void HandleJoinChannel(WorldPacket& recvPacket); - void HandleLeaveChannel(WorldPacket& recvPacket); - void HandleChannelList(WorldPacket& recvPacket); + void HandleJoinChannel(WorldPackets::Channel::JoinChannel& packet); + void HandleLeaveChannel(WorldPackets::Channel::LeaveChannel& packet); + void HandleChannelList(WorldPackets::Channel::ChannelListRequest& packet); void HandleChannelPassword(WorldPacket& recvPacket); void HandleChannelSetOwner(WorldPacket& recvPacket); void HandleChannelOwner(WorldPacket& recvPacket); @@ -904,7 +929,6 @@ class WorldSession void HandleChannelAnnouncements(WorldPacket& recvPacket); void HandleChannelModerate(WorldPacket& recvPacket); void HandleChannelDeclineInvite(WorldPacket& recvPacket); - void HandleChannelDisplayListQuery(WorldPacket& recvPacket); void HandleGetChannelMemberCount(WorldPacket& recvPacket); void HandleSetChannelWatch(WorldPacket& recvPacket); @@ -913,9 +937,7 @@ class WorldSession void HandlePageTextQueryOpcode(WorldPackets::Query::QueryPageText& packet); - void HandleTutorialFlag (WorldPacket& recvData); - void HandleTutorialClear(WorldPacket& recvData); - void HandleTutorialReset(WorldPacket& recvData); + void HandleTutorialFlag(WorldPackets::Misc::TutorialSetFlag& packet); //Pet void HandlePetAction(WorldPacket& recvData); diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp index 715487eff99..664c8f3d216 100644 --- a/src/server/scripts/Commands/cs_message.cpp +++ b/src/server/scripts/Commands/cs_message.cpp @@ -74,7 +74,7 @@ public: Player* player = handler->GetSession()->GetPlayer(); Channel* channcel = NULL; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(player->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(player->GetTeam())) channcel = cMgr->GetChannel(channelStr, player); if (strcmp(argStr, "on") == 0) -- cgit v1.2.3 From 92085d5deaaa0dc441c6b0c26d58b862972a7fbf Mon Sep 17 00:00:00 2001 From: Intel Date: Mon, 24 Nov 2014 04:25:10 +0200 Subject: Core/Packets: Fixed SMSG_EMOTE and SMSG_TEXT_EMOTE --- src/server/game/Handlers/ChatHandler.cpp | 51 ++++++++++++++------------ src/server/game/Server/Packets/ChatPackets.cpp | 2 +- src/server/game/Server/Protocol/Opcodes.cpp | 4 +- 3 files changed, 30 insertions(+), 27 deletions(-) (limited to 'src/server/game/Handlers/ChatHandler.cpp') diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index b51f0d52480..2c0fe333b00 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -538,43 +538,46 @@ namespace Trinity class EmoteChatBuilder { public: - EmoteChatBuilder(Player const& player, uint32 text_emote, uint32 emote_num, Unit const* target) - : i_player(player), i_text_emote(text_emote), i_emote_num(emote_num), i_target(target) { } + EmoteChatBuilder(Player const& player, uint32 soundIndex, uint32 emoteID, Unit const* target) + : _player(player), _soundIndex(soundIndex), _emoteID(emoteID), _target(target) { } void operator()(WorldPacket& data, LocaleConstant loc_idx) { 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; + packet.SourceGUID = _player.GetGUID(); + packet.SourceAccountGUID = _player.GetSession()->GetAccountGUID(); + if (_target) + packet.TargetGUID = _target->GetGUID(); + packet.EmoteID = _emoteID; + packet.SoundIndex = _soundIndex; data = *packet.Write(); } private: - Player const& i_player; - uint32 i_text_emote; - uint32 i_emote_num; - Unit const* i_target; + Player const& _player; + uint32 _soundIndex; + uint32 _emoteID; + Unit const* _target; }; } void WorldSession::HandleTextEmoteOpcode(WorldPackets::Chat::CTextEmote& packet) { - if (!GetPlayer()->IsAlive()) + Player* player = GetPlayer(); + + if (!player->IsAlive()) return; - if (!GetPlayer()->CanSpeak()) + if (!player->CanSpeak()) { std::string timeStr = secsToTimeString(m_muteTime - time(NULL)); SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str()); return; } - sScriptMgr->OnPlayerTextEmote(GetPlayer(), packet.SoundIndex, packet.EmoteID, packet.Target); + sScriptMgr->OnPlayerTextEmote(player, packet.SoundIndex, packet.EmoteID, packet.Target); - EmotesTextEntry const* em = sEmotesTextStore.LookupEntry(packet.SoundIndex); + EmotesTextEntry const* em = sEmotesTextStore.LookupEntry(packet.EmoteID); if (!em) return; @@ -589,34 +592,34 @@ void WorldSession::HandleTextEmoteOpcode(WorldPackets::Chat::CTextEmote& packet) break; case EMOTE_STATE_DANCE: case EMOTE_STATE_READ: - GetPlayer()->SetUInt32Value(UNIT_NPC_EMOTESTATE, emote_anim); + player->SetUInt32Value(UNIT_NPC_EMOTESTATE, emote_anim); break; default: // Only allow text-emotes for "dead" entities (feign death included) - if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) + if (player->HasUnitState(UNIT_STATE_DIED)) break; - GetPlayer()->HandleEmoteCommand(emote_anim); + player->HandleEmoteCommand(emote_anim); break; } Unit* unit = ObjectAccessor::GetUnit(*_player, packet.Target); - CellCoord p = Trinity::ComputeCellCoord(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY()); + CellCoord p = Trinity::ComputeCellCoord(player->GetPositionX(), player->GetPositionY()); Cell cell(p); cell.SetNoCreate(); - Trinity::EmoteChatBuilder emote_builder(*GetPlayer(), packet.SoundIndex, packet.EmoteID, unit); + Trinity::EmoteChatBuilder emote_builder(*player, packet.SoundIndex, packet.EmoteID, unit); Trinity::LocalizedPacketDo emote_do(emote_builder); - Trinity::PlayerDistWorker > emote_worker(GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), emote_do); + Trinity::PlayerDistWorker > emote_worker(player, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), emote_do); TypeContainerVisitor >, WorldTypeMapContainer> message(emote_worker); - cell.Visit(p, message, *GetPlayer()->GetMap(), *GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE)); + cell.Visit(p, message, *player->GetMap(), *player, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE)); - GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, packet.SoundIndex, 0, 0, unit); + player->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(), packet.SoundIndex); + ((Creature*)unit)->AI()->ReceiveEmote(player, packet.SoundIndex); } void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData) diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp index 7b6cf236f11..7590a092b2c 100644 --- a/src/server/game/Server/Packets/ChatPackets.cpp +++ b/src/server/game/Server/Packets/ChatPackets.cpp @@ -128,8 +128,8 @@ WorldPacket const* WorldPackets::Chat::STextEmote::Write() { _worldPacket << SourceGUID; _worldPacket << SourceAccountGUID; - _worldPacket << SoundIndex; _worldPacket << EmoteID; + _worldPacket << SoundIndex; _worldPacket << TargetGUID; return &_worldPacket; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 9d6ab2514b8..bb97c1b3e38 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -887,7 +887,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUMP_RIDE_TICKETS_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DURABILITY_DAMAGE_DEATH, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ECHO_PARTY_SQUELCH, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_EMOTE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EMOTE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_BARBER_SHOP, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCHANTMENTLOG, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENVIRONMENTALDAMAGELOG, STATUS_UNHANDLED); @@ -1369,7 +1369,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INVOLUNTARILY_RESET, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TAXINODE_STATUS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TEST_DROP_RATE_RESULT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TEXT_EMOTE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TEXT_EMOTE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_CLEAR, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_REMOVE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_UPDATE, STATUS_NEVER); -- cgit v1.2.3