diff options
author | Shauren <shauren.trinity@gmail.com> | 2017-05-03 13:55:03 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2017-05-03 13:55:03 +0200 |
commit | 0d556dd4af739130d2217ad66b65787bb310c46b (patch) | |
tree | c31c2788868f669656bd27be83f85d238d2b57b3 /src | |
parent | c01d28bc3326cbd649e839cb3ede96eb56d85a7e (diff) |
Core/Chat: Fixed addon whispers and channel messages
Closes #19490
Closes #19534
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Chat/Channels/Channel.cpp | 53 | ||||
-rw-r--r-- | src/server/game/Chat/Channels/Channel.h | 4 | ||||
-rw-r--r-- | src/server/game/Handlers/ChatHandler.cpp | 9 |
3 files changed, 63 insertions, 3 deletions
diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index fd4ca955d27..d587b1fef4e 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -741,6 +741,48 @@ void Channel::Say(ObjectGuid const& guid, std::string const& what, uint32 lang) SendToAll(builder, !playerInfo.IsModerator() ? guid : ObjectGuid::Empty); } +void Channel::AddonSay(ObjectGuid const& guid, std::string const& prefix, std::string const& what) const +{ + if (what.empty()) + return; + + if (!IsOn(guid)) + { + NotMemberAppend appender; + ChannelNameBuilder<NotMemberAppend> builder(this, appender); + SendToOne(builder, guid); + return; + } + + PlayerInfo const& playerInfo = _playersStore.at(guid); + if (playerInfo.IsMuted()) + { + MutedAppend appender; + ChannelNameBuilder<MutedAppend> builder(this, appender); + SendToOne(builder, guid); + return; + } + + auto builder = [&](LocaleConstant locale) + { + LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); + + WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat(); + if (Player* player = ObjectAccessor::FindConnectedPlayer(guid)) + packet->Initialize(CHAT_MSG_CHANNEL, LANG_ADDON, player, player, what, 0, GetName(localeIdx), DEFAULT_LOCALE, prefix); + else + { + packet->Initialize(CHAT_MSG_CHANNEL, LANG_ADDON, nullptr, nullptr, what, 0, GetName(localeIdx), DEFAULT_LOCALE, prefix); + packet->SenderGUID = guid; + packet->TargetGUID = guid; + } + + return packet; + }; + + SendToAllWithAddon(builder, prefix, !playerInfo.IsModerator() ? guid : ObjectGuid::Empty); +} + void Channel::Invite(Player const* player, std::string const& newname) { ObjectGuid const& guid = player->GetGUID(); @@ -974,3 +1016,14 @@ void Channel::SendToOne(Builder& builder, ObjectGuid const& who) const if (Player* player = ObjectAccessor::FindConnectedPlayer(who)) localizer(player); } + +template <class Builder> +void Channel::SendToAllWithAddon(Builder& builder, std::string const& addonPrefix, ObjectGuid const& guid /*= ObjectGuid::Empty*/) const +{ + Trinity::LocalizedPacketDo<Builder> localizer(builder); + + for (PlayerContainer::value_type const& i : _playersStore) + if (Player* player = ObjectAccessor::FindConnectedPlayer(i.first)) + if (player->GetSession()->IsAddonRegistered(addonPrefix) && (guid.IsEmpty() || !player->GetSocial()->HasIgnore(guid))) + localizer(player); +} diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h index 8fb1b946da2..056cf9a4c3f 100644 --- a/src/server/game/Chat/Channels/Channel.h +++ b/src/server/game/Chat/Channels/Channel.h @@ -221,6 +221,7 @@ class TC_GAME_API Channel void List(Player const* player); void Announce(Player const* player); void Say(ObjectGuid const& guid, std::string const& what, uint32 lang) const; + void AddonSay(ObjectGuid const& guid, std::string const& prefix, std::string const& what) const; void DeclineInvite(Player const* player); void Invite(Player const* player, std::string const& newp); void JoinNotify(Player const* player); @@ -238,6 +239,9 @@ class TC_GAME_API Channel template <class Builder> void SendToOne(Builder& builder, ObjectGuid const& who) const; + template <class Builder> + void SendToAllWithAddon(Builder& builder, std::string const& addonPrefix, ObjectGuid const& guid = ObjectGuid::Empty) const; + bool IsOn(ObjectGuid const& who) const { return _playersStore.count(who) != 0; } bool IsBanned(ObjectGuid const& guid) const { return _bannedStore.count(guid) != 0; } diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 40645bc485a..765a071cf29 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -472,10 +472,13 @@ void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std: } case CHAT_MSG_WHISPER: { - if (!normalizePlayerName(target)) + /// @todo implement cross realm whispers (someday) + ExtendedPlayerName extName = ExtractExtendedPlayerName(target); + + if (!normalizePlayerName(extName.Name)) break; - Player* receiver = ObjectAccessor::FindPlayerByName(target); + Player* receiver = ObjectAccessor::FindPlayerByName(extName.Name); if (!receiver) break; @@ -510,7 +513,7 @@ void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std: case CHAT_MSG_CHANNEL: { if (Channel* chn = ChannelMgr::GetChannelForPlayerByNamePart(target, sender)) - chn->Say(sender->GetGUID(), text.c_str(), uint32(LANG_ADDON)); + chn->AddonSay(sender->GetGUID(), prefix, text.c_str()); break; } default: |