diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-05-01 20:16:10 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-05-01 20:16:10 +0200 |
commit | fb66575d38d2ba7ffc24c29824fa75d7019de549 (patch) | |
tree | 9b263e8914862f92d5e6f2fc23450a2f973df461 /src/server | |
parent | d6dfb6c54c3296461ec73ea5d969f7a5a704541b (diff) |
Core/Grids: Move packet sending functionality out of MessageDistDeliverer and into separate, customizable class and unify LocalizedPacketDo, LocalizedPacketListDo as generic localizable action
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Chat/Channels/Channel.cpp | 93 | ||||
-rw-r--r-- | src/server/game/Chat/Channels/ChannelAppenders.h | 14 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 89 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiersImpl.h | 75 | ||||
-rw-r--r-- | src/server/game/OutdoorPvP/OutdoorPvP.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Texts/ChatTextBuilder.cpp | 36 | ||||
-rw-r--r-- | src/server/game/Texts/ChatTextBuilder.h | 38 | ||||
-rw-r--r-- | src/server/game/Texts/CreatureTextMgr.cpp | 55 | ||||
-rw-r--r-- | src/server/game/Texts/CreatureTextMgrImpl.h | 28 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 27 |
16 files changed, 249 insertions, 274 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 63d202e1c27..c57d723eb25 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -641,7 +641,7 @@ void PlayerAchievementMgr::SendAchievementEarned(AchievementEntry const* achieve if (Guild* guild = sGuildMgr->GetGuildById(_owner->GetGuildId())) { Trinity::BroadcastTextBuilder _builder(_owner, CHAT_MSG_GUILD_ACHIEVEMENT, BROADCAST_TEXT_ACHIEVEMENT_EARNED, _owner->getGender(), _owner, achievement->ID); - Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> _localizer(_builder); + Trinity::LocalizedDo<Trinity::BroadcastTextBuilder> _localizer(_builder); guild->BroadcastWorker(_localizer, _owner); } @@ -658,8 +658,8 @@ void PlayerAchievementMgr::SendAchievementEarned(AchievementEntry const* achieve else if (_owner->IsInWorld()) { Trinity::BroadcastTextBuilder _builder(_owner, CHAT_MSG_ACHIEVEMENT, BROADCAST_TEXT_ACHIEVEMENT_EARNED, _owner->getGender(), _owner, achievement->ID); - Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> _localizer(_builder); - Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder>> _worker(_owner, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), _localizer); + Trinity::LocalizedDo<Trinity::BroadcastTextBuilder> _localizer(_builder); + Trinity::PlayerDistWorker<Trinity::LocalizedDo<Trinity::BroadcastTextBuilder>> _worker(_owner, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), _localizer); Cell::VisitWorldObjects(_owner, _worker, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY)); } } diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 245a563e46e..b9cac4f0254 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -626,7 +626,7 @@ void Battleground::SendBroadcastText(uint32 id, ChatMsg msgType, WorldObject con } Trinity::BroadcastTextBuilder builder(nullptr, msgType, id, GENDER_MALE, target); - Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> localizer(builder); + Trinity::LocalizedDo<Trinity::BroadcastTextBuilder> localizer(builder); BroadcastWorker(localizer); } @@ -1666,7 +1666,7 @@ void Battleground::SendMessageToAll(uint32 entry, ChatMsg msgType, Player const* return; Trinity::TrinityStringChatBuilder builder(nullptr, msgType, entry, source); - Trinity::LocalizedPacketDo<Trinity::TrinityStringChatBuilder> localizer(builder); + Trinity::LocalizedDo<Trinity::TrinityStringChatBuilder> localizer(builder); BroadcastWorker(localizer); } @@ -1679,7 +1679,7 @@ void Battleground::PSendMessageToAll(uint32 entry, ChatMsg msgType, Player const va_start(ap, source); Trinity::TrinityStringChatBuilder builder(nullptr, msgType, entry, source, &ap); - Trinity::LocalizedPacketDo<Trinity::TrinityStringChatBuilder> localizer(builder); + Trinity::LocalizedDo<Trinity::TrinityStringChatBuilder> localizer(builder); BroadcastWorker(localizer); va_end(ap); diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 11fe3deb710..318c7b76108 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -247,13 +247,14 @@ void Channel::JoinChannel(Player* player, std::string const& pass) { LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); - WorldPackets::Channel::ChannelNotifyJoined* notify = new WorldPackets::Channel::ChannelNotifyJoined(); - //notify->ChannelWelcomeMsg = ""; - notify->ChatChannelID = _channelId; - //notify->InstanceID = 0; - notify->_ChannelFlags = _channelFlags; - notify->_Channel = GetName(localeIdx); - notify->ChannelGUID = _channelGuid; + Trinity::PacketSenderOwning<WorldPackets::Channel::ChannelNotifyJoined>* notify = new Trinity::PacketSenderOwning<WorldPackets::Channel::ChannelNotifyJoined>(); + //notify->Data.ChannelWelcomeMsg = ""; + notify->Data.ChatChannelID = _channelId; + //notify->Data.InstanceID = 0; + notify->Data._ChannelFlags = _channelFlags; + notify->Data._Channel = GetName(localeIdx); + notify->Data.ChannelGUID = _channelGuid; + notify->Data.Write(); return notify; }; @@ -309,10 +310,11 @@ void Channel::LeaveChannel(Player* player, bool send, bool suspend) { LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); - WorldPackets::Channel::ChannelNotifyLeft* notify = new WorldPackets::Channel::ChannelNotifyLeft(); - notify->Channel = GetName(localeIdx); - notify->ChatChannelID = _channelId; - notify->Suspended = suspend; + Trinity::PacketSenderOwning<WorldPackets::Channel::ChannelNotifyLeft>* notify = new Trinity::PacketSenderOwning<WorldPackets::Channel::ChannelNotifyLeft>(); + notify->Data.Channel = GetName(localeIdx); + notify->Data.ChatChannelID = _channelId; + notify->Data.Suspended = suspend; + notify->Data.Write(); return notify; }; @@ -736,16 +738,18 @@ void Channel::Say(ObjectGuid const& guid, std::string const& what, uint32 lang) { LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); - WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat(); + Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>* packet = new Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>(); if (Player* player = ObjectAccessor::FindConnectedPlayer(guid)) - packet->Initialize(CHAT_MSG_CHANNEL, Language(lang), player, player, what, 0, GetName(localeIdx)); + packet->Data.Initialize(CHAT_MSG_CHANNEL, Language(lang), player, player, what, 0, GetName(localeIdx)); else { - packet->Initialize(CHAT_MSG_CHANNEL, Language(lang), nullptr, nullptr, what, 0, GetName(localeIdx)); - packet->SenderGUID = guid; - packet->TargetGUID = guid; + packet->Data.Initialize(CHAT_MSG_CHANNEL, Language(lang), nullptr, nullptr, what, 0, GetName(localeIdx)); + packet->Data.SenderGUID = guid; + packet->Data.TargetGUID = guid; } + packet->Data.Write(); + return packet; }; @@ -778,16 +782,18 @@ void Channel::AddonSay(ObjectGuid const& guid, std::string const& prefix, std::s { LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); - WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat(); + Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>* packet = new Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>(); if (Player* player = ObjectAccessor::FindConnectedPlayer(guid)) - packet->Initialize(CHAT_MSG_CHANNEL, isLogged ? LANG_ADDON_LOGGED : LANG_ADDON, player, player, what, 0, GetName(localeIdx), DEFAULT_LOCALE, prefix); + packet->Data.Initialize(CHAT_MSG_CHANNEL, isLogged ? LANG_ADDON_LOGGED : LANG_ADDON, player, player, what, 0, GetName(localeIdx), DEFAULT_LOCALE, prefix); else { - packet->Initialize(CHAT_MSG_CHANNEL, isLogged ? LANG_ADDON_LOGGED : LANG_ADDON, nullptr, nullptr, what, 0, GetName(localeIdx), DEFAULT_LOCALE, prefix); - packet->SenderGUID = guid; - packet->TargetGUID = guid; + packet->Data.Initialize(CHAT_MSG_CHANNEL, isLogged ? LANG_ADDON_LOGGED : LANG_ADDON, nullptr, nullptr, what, 0, GetName(localeIdx), DEFAULT_LOCALE, prefix); + packet->Data.SenderGUID = guid; + packet->Data.TargetGUID = guid; } + packet->Data.Write(); + return packet; }; @@ -911,12 +917,13 @@ void Channel::JoinNotify(Player const* player) { LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); - WorldPackets::Channel::UserlistAdd* userlistAdd = new WorldPackets::Channel::UserlistAdd(); - userlistAdd->AddedUserGUID = guid; - userlistAdd->_ChannelFlags = GetFlags(); - userlistAdd->UserFlags = GetPlayerFlags(guid); - userlistAdd->ChannelID = GetChannelId(); - userlistAdd->ChannelName = GetName(localeIdx); + Trinity::PacketSenderOwning<WorldPackets::Channel::UserlistAdd>* userlistAdd = new Trinity::PacketSenderOwning<WorldPackets::Channel::UserlistAdd>(); + userlistAdd->Data.AddedUserGUID = guid; + userlistAdd->Data._ChannelFlags = GetFlags(); + userlistAdd->Data.UserFlags = GetPlayerFlags(guid); + userlistAdd->Data.ChannelID = GetChannelId(); + userlistAdd->Data.ChannelName = GetName(localeIdx); + userlistAdd->Data.Write(); return userlistAdd; }; @@ -928,12 +935,13 @@ void Channel::JoinNotify(Player const* player) { LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); - WorldPackets::Channel::UserlistUpdate* userlistUpdate = new WorldPackets::Channel::UserlistUpdate(); - userlistUpdate->UpdatedUserGUID = guid; - userlistUpdate->_ChannelFlags = GetFlags(); - userlistUpdate->UserFlags = GetPlayerFlags(guid); - userlistUpdate->ChannelID = GetChannelId(); - userlistUpdate->ChannelName = GetName(localeIdx); + Trinity::PacketSenderOwning<WorldPackets::Channel::UserlistUpdate>* userlistUpdate = new Trinity::PacketSenderOwning<WorldPackets::Channel::UserlistUpdate>(); + userlistUpdate->Data.UpdatedUserGUID = guid; + userlistUpdate->Data._ChannelFlags = GetFlags(); + userlistUpdate->Data.UserFlags = GetPlayerFlags(guid); + userlistUpdate->Data.ChannelID = GetChannelId(); + userlistUpdate->Data.ChannelName = GetName(localeIdx); + userlistUpdate->Data.Write(); return userlistUpdate; }; @@ -949,11 +957,12 @@ void Channel::LeaveNotify(Player const* player) { LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); - WorldPackets::Channel::UserlistRemove* userlistRemove = new WorldPackets::Channel::UserlistRemove(); - userlistRemove->RemovedUserGUID = guid; - userlistRemove->_ChannelFlags = GetFlags(); - userlistRemove->ChannelID = GetChannelId(); - userlistRemove->ChannelName = GetName(localeIdx); + Trinity::PacketSenderOwning<WorldPackets::Channel::UserlistRemove>* userlistRemove = new Trinity::PacketSenderOwning<WorldPackets::Channel::UserlistRemove>(); + userlistRemove->Data.RemovedUserGUID = guid; + userlistRemove->Data._ChannelFlags = GetFlags(); + userlistRemove->Data.ChannelID = GetChannelId(); + userlistRemove->Data.ChannelName = GetName(localeIdx); + userlistRemove->Data.Write(); return userlistRemove; }; @@ -1000,7 +1009,7 @@ void Channel::SetMute(ObjectGuid const& guid, bool set) template <class Builder> void Channel::SendToAll(Builder& builder, ObjectGuid const& guid) const { - Trinity::LocalizedPacketDo<Builder> localizer(builder); + Trinity::LocalizedDo<Builder> localizer(builder); for (PlayerContainer::value_type const& i : _playersStore) if (Player* player = ObjectAccessor::FindConnectedPlayer(i.first)) @@ -1011,7 +1020,7 @@ void Channel::SendToAll(Builder& builder, ObjectGuid const& guid) const template <class Builder> void Channel::SendToAllButOne(Builder& builder, ObjectGuid const& who) const { - Trinity::LocalizedPacketDo<Builder> localizer(builder); + Trinity::LocalizedDo<Builder> localizer(builder); for (PlayerContainer::value_type const& i : _playersStore) if (i.first != who) @@ -1022,7 +1031,7 @@ void Channel::SendToAllButOne(Builder& builder, ObjectGuid const& who) const template <class Builder> void Channel::SendToOne(Builder& builder, ObjectGuid const& who) const { - Trinity::LocalizedPacketDo<Builder> localizer(builder); + Trinity::LocalizedDo<Builder> localizer(builder); if (Player* player = ObjectAccessor::FindConnectedPlayer(who)) localizer(player); @@ -1031,7 +1040,7 @@ void Channel::SendToOne(Builder& builder, ObjectGuid const& who) const template <class Builder> void Channel::SendToAllWithAddon(Builder& builder, std::string const& addonPrefix, ObjectGuid const& guid /*= ObjectGuid::Empty*/) const { - Trinity::LocalizedPacketDo<Builder> localizer(builder); + Trinity::LocalizedDo<Builder> localizer(builder); for (PlayerContainer::value_type const& i : _playersStore) if (Player* player = ObjectAccessor::FindConnectedPlayer(i.first)) diff --git a/src/server/game/Chat/Channels/ChannelAppenders.h b/src/server/game/Chat/Channels/ChannelAppenders.h index eb7b9d70c4c..b520f3e8b2a 100644 --- a/src/server/game/Chat/Channels/ChannelAppenders.h +++ b/src/server/game/Chat/Channels/ChannelAppenders.h @@ -21,6 +21,7 @@ #include "Channel.h" #include "ChannelPackets.h" #include "CharacterCache.h" +#include "GridNotifiers.h" #include "World.h" // initial packet data (notify type and channel name) @@ -31,16 +32,17 @@ class ChannelNameBuilder ChannelNameBuilder(Channel const* source, PacketModifier const& modifier) : _source(source), _modifier(modifier){ } - WorldPackets::Packet* operator()(LocaleConstant locale) const + Trinity::PacketSenderOwning<WorldPackets::Channel::ChannelNotify>* operator()(LocaleConstant locale) const { // LocalizedPacketDo sends client DBC locale, we need to get available to server locale LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); - WorldPackets::Channel::ChannelNotify* data = new WorldPackets::Channel::ChannelNotify(); - data->Type = _modifier.NotificationType; - data->_Channel = _source->GetName(localeIdx); - _modifier.Append(*data); - return data; + Trinity::PacketSenderOwning<WorldPackets::Channel::ChannelNotify>* sender = new Trinity::PacketSenderOwning<WorldPackets::Channel::ChannelNotify>(); + sender->Data.Type = _modifier.NotificationType; + sender->Data._Channel = _source->GetName(localeIdx); + _modifier.Append(sender->Data); + sender->Data.Write(); + return sender; } private: diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index d1634c70148..44e63f22155 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1657,13 +1657,15 @@ void WorldObject::SendMessageToSet(WorldPacket const* data, bool self) const void WorldObject::SendMessageToSetInRange(WorldPacket const* data, float dist, bool /*self*/) const { - Trinity::MessageDistDeliverer<> notifier(this, data, dist); + Trinity::PacketSenderRef sender(data); + Trinity::MessageDistDeliverer<Trinity::PacketSenderRef> notifier(this, sender, dist); Cell::VisitWorldObjects(this, notifier, dist); } void WorldObject::SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) const { - Trinity::MessageDistDeliverer<> notifier(this, data, GetVisibilityRange(), false, skipped_rcvr); + Trinity::PacketSenderRef sender(data); + Trinity::MessageDistDeliverer<Trinity::PacketSenderRef> notifier(this, sender, GetVisibilityRange(), false, skipped_rcvr); Cell::VisitWorldObjects(this, notifier, GetVisibilityRange()); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 5581fdd8e4f..8a8ec028fa1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6094,7 +6094,8 @@ void Player::SendMessageToSetInRange(WorldPacket const* data, float dist, bool s if (self) SendDirectMessage(data); - Trinity::MessageDistDeliverer<> notifier(this, data, dist); + Trinity::PacketSenderRef sender(data); + Trinity::MessageDistDeliverer<Trinity::PacketSenderRef> notifier(this, sender, dist); Cell::VisitWorldObjects(this, notifier, dist); } @@ -6103,7 +6104,8 @@ void Player::SendMessageToSetInRange(WorldPacket const* data, float dist, bool s if (self) SendDirectMessage(data); - Trinity::MessageDistDeliverer<> notifier(this, data, dist, own_team_only); + Trinity::PacketSenderRef sender(data); + Trinity::MessageDistDeliverer<Trinity::PacketSenderRef> notifier(this, sender, dist, own_team_only); Cell::VisitWorldObjects(this, notifier, dist); } @@ -6114,7 +6116,8 @@ void Player::SendMessageToSet(WorldPacket const* data, Player const* skipped_rcv // we use World::GetMaxVisibleDistance() because i cannot see why not use a distance // update: replaced by GetMap()->GetVisibilityDistance() - Trinity::MessageDistDeliverer<> notifier(this, data, GetVisibilityRange(), false, skipped_rcvr); + Trinity::PacketSenderRef sender(data); + Trinity::MessageDistDeliverer<Trinity::PacketSenderRef> notifier(this, sender, GetVisibilityRange(), false, skipped_rcvr); Cell::VisitWorldObjects(this, notifier, GetVisibilityRange()); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 88ebe46999a..93c2e725fca 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -14356,8 +14356,8 @@ bool Unit::IsHighestExclusiveAura(Aura const* aura, bool removeOtherAuraApplicat void Unit::Talk(std::string const& text, ChatMsg msgType, Language language, float textRange, WorldObject const* target) { Trinity::CustomChatTextBuilder builder(this, msgType, text, language, target); - Trinity::LocalizedPacketDo<Trinity::CustomChatTextBuilder> localizer(builder); - Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::CustomChatTextBuilder> > worker(this, textRange, localizer); + Trinity::LocalizedDo<Trinity::CustomChatTextBuilder> localizer(builder); + Trinity::PlayerDistWorker<Trinity::LocalizedDo<Trinity::CustomChatTextBuilder> > worker(this, textRange, localizer); Cell::VisitWorldObjects(this, worker, textRange); } @@ -14423,8 +14423,8 @@ void Unit::Talk(uint32 textId, ChatMsg msgType, float textRange, WorldObject con } Trinity::BroadcastTextBuilder builder(this, msgType, textId, getGender(), target); - Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> localizer(builder); - Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> > worker(this, textRange, localizer); + Trinity::LocalizedDo<Trinity::BroadcastTextBuilder> localizer(builder); + Trinity::PlayerDistWorker<Trinity::LocalizedDo<Trinity::BroadcastTextBuilder> > worker(this, textRange, localizer); Cell::VisitWorldObjects(this, worker, textRange); } @@ -14513,19 +14513,19 @@ struct CombatLogSender msg->Write(); } - WorldPacket const* operator()(Player* player) const + void operator()(Player const* player) const { if (player->IsAdvancedCombatLoggingEnabled()) - return i_message->GetFullLogPacket(); + player->SendDirectMessage(i_message->GetFullLogPacket()); else - return i_message->GetBasicLogPacket(); + player->SendDirectMessage(i_message->GetBasicLogPacket()); } }; void Unit::SendCombatLogMessage(WorldPackets::CombatLog::CombatLogServerPacket* combatLog) const { CombatLogSender combatLogCustomizer(combatLog); - Trinity::MessageDistDeliverer<CombatLogSender> notifier(this, std::move(combatLogCustomizer), GetVisibilityRange()); + Trinity::MessageDistDeliverer<CombatLogSender> notifier(this, combatLogCustomizer, GetVisibilityRange()); Cell::VisitWorldObjects(this, notifier, GetVisibilityRange()); } diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 0b0b2e24354..366abe3e8c5 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -118,28 +118,39 @@ namespace Trinity void Visit(ConversationMapType &m) { updateObjects<Conversation>(m); } }; - struct MessageDistDelivererCustomizer + struct PacketSenderRef { - WorldPacket const* i_message; + WorldPacket const* Data; - MessageDistDelivererCustomizer(WorldPacket const* message) : i_message(message) { } + PacketSenderRef(WorldPacket const* message) : Data(message) { } - WorldPacket const* operator()(Player* /*player*/) const + void operator()(Player const* player) const { - return i_message; + player->SendDirectMessage(Data); } }; - template<typename PacketCustomizer = MessageDistDelivererCustomizer> + template<typename Packet> + struct PacketSenderOwning + { + Packet Data; + + void operator()(Player const* player) const + { + player->SendDirectMessage(Data.GetRawPacket()); + } + }; + + template<typename PacketSender> struct MessageDistDeliverer { WorldObject const* i_source; - PacketCustomizer i_messageCustomizer; + PacketSender& i_packetSender; float i_distSq; uint32 team; Player const* skipped_receiver; - MessageDistDeliverer(WorldObject const* src, PacketCustomizer packetCustomizer, float dist, bool own_team_only = false, Player const* skipped = nullptr) - : i_source(src), i_messageCustomizer(std::move(packetCustomizer)), i_distSq(dist * dist) + MessageDistDeliverer(WorldObject const* src, PacketSender& packetSender, float dist, bool own_team_only = false, Player const* skipped = nullptr) + : i_source(src), i_packetSender(packetSender), i_distSq(dist * dist) , team(0) , skipped_receiver(skipped) { @@ -153,7 +164,7 @@ namespace Trinity void Visit(DynamicObjectMapType &m) const; template<class SKIP> void Visit(GridRefManager<SKIP> &) const { } - void SendPacket(Player* player) const + void SendPacket(Player const* player) const { // never send packet to self if (player == i_source || (team && player->GetTeam() != team) || skipped_receiver == player) @@ -162,19 +173,19 @@ namespace Trinity if (!player->HaveAtClient(i_source)) return; - player->SendDirectMessage(i_messageCustomizer(player)); + i_packetSender(player); } }; - template<typename PacketCustomizer = MessageDistDelivererCustomizer> + template<typename PacketSender> struct MessageDistDelivererToHostile { Unit* i_source; - PacketCustomizer i_messageCustomizer; + PacketSender& i_packetSender; float i_distSq; - MessageDistDelivererToHostile(Unit* src, PacketCustomizer packetCustomizer, float dist) - : i_source(src), i_messageCustomizer(std::move(packetCustomizer)), i_distSq(dist * dist) + MessageDistDelivererToHostile(Unit* src, PacketSender& packetSender, float dist) + : i_source(src), i_packetSender(packetSender), i_distSq(dist * dist) { } @@ -183,13 +194,13 @@ namespace Trinity void Visit(DynamicObjectMapType &m) const; template<class SKIP> void Visit(GridRefManager<SKIP> &) const { } - void SendPacket(Player* player) const + void SendPacket(Player const* player) const { // never send packet to self if (player == i_source || !player->HaveAtClient(i_source) || player->IsFriendlyTo(i_source)) return; - player->SendDirectMessage(i_messageCustomizer(player)); + i_packetSender(player); } }; @@ -1593,45 +1604,19 @@ namespace Trinity // Player checks and do // Prepare using Builder localized packets with caching and send to player - template<class Builder> - class LocalizedPacketDo + template<typename Localizer> + class LocalizedDo { - public: - explicit LocalizedPacketDo(Builder& builder) : i_builder(builder) { } - - ~LocalizedPacketDo() - { - for (size_t i = 0; i < i_data_cache.size(); ++i) - delete i_data_cache[i]; - } - - void operator()(Player* p); + using LocalizedAction = std::remove_pointer_t<decltype(std::declval<Localizer>()(LocaleConstant{}))>; - private: - Builder& i_builder; - std::vector<WorldPackets::Packet*> i_data_cache; // 0 = default, i => i-1 locale index - }; - - // Prepare using Builder localized packets with caching and send to player - template<class Builder> - class LocalizedPacketListDo - { - public: - typedef std::vector<WorldPackets::Packet*> WorldPacketList; - explicit LocalizedPacketListDo(Builder& builder) : i_builder(builder) { } + public: + explicit LocalizedDo(Localizer& localizer) : _localizer(localizer) { } - ~LocalizedPacketListDo() - { - for (size_t i = 0; i < i_data_cache.size(); ++i) - for (size_t j = 0; j < i_data_cache[i].size(); ++j) - delete i_data_cache[i][j]; - } - void operator()(Player* p); + void operator()(Player* p); - private: - Builder& i_builder; - std::vector<WorldPacketList> i_data_cache; - // 0 = default, i => i-1 locale index + private: + Localizer& _localizer; + std::vector<std::unique_ptr<LocalizedAction>> _localizedCache; // 0 = default, i => i-1 locale index }; } #endif diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h index 1d0d644aba6..60c7f43a207 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -37,8 +37,8 @@ inline void Trinity::VisibleNotifier::Visit(GridRefManager<T> &m) } } -template<typename PacketCustomizer> -void Trinity::MessageDistDeliverer<PacketCustomizer>::Visit(PlayerMapType& m) const +template<typename PacketSender> +void Trinity::MessageDistDeliverer<PacketSender>::Visit(PlayerMapType& m) const { for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter) { @@ -63,8 +63,8 @@ void Trinity::MessageDistDeliverer<PacketCustomizer>::Visit(PlayerMapType& m) co } } -template<typename PacketCustomizer> -void Trinity::MessageDistDeliverer<PacketCustomizer>::Visit(CreatureMapType& m) const +template<typename PacketSender> +void Trinity::MessageDistDeliverer<PacketSender>::Visit(CreatureMapType& m) const { for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter) { @@ -86,8 +86,8 @@ void Trinity::MessageDistDeliverer<PacketCustomizer>::Visit(CreatureMapType& m) } } -template<typename PacketCustomizer> -void Trinity::MessageDistDeliverer<PacketCustomizer>::Visit(DynamicObjectMapType& m) const +template<typename PacketSender> +void Trinity::MessageDistDeliverer<PacketSender>::Visit(DynamicObjectMapType& m) const { for (DynamicObjectMapType::iterator iter = m.begin(); iter != m.end(); ++iter) { @@ -108,8 +108,8 @@ void Trinity::MessageDistDeliverer<PacketCustomizer>::Visit(DynamicObjectMapType } } -template<typename PacketCustomizer> -void Trinity::MessageDistDelivererToHostile<PacketCustomizer>::Visit(PlayerMapType& m) const +template<typename PacketSender> +void Trinity::MessageDistDelivererToHostile<PacketSender>::Visit(PlayerMapType& m) const { for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter) { @@ -134,8 +134,8 @@ void Trinity::MessageDistDelivererToHostile<PacketCustomizer>::Visit(PlayerMapTy } } -template<typename PacketCustomizer> -void Trinity::MessageDistDelivererToHostile<PacketCustomizer>::Visit(CreatureMapType& m) const +template<typename PacketSender> +void Trinity::MessageDistDelivererToHostile<PacketSender>::Visit(CreatureMapType& m) const { for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter) { @@ -157,8 +157,8 @@ void Trinity::MessageDistDelivererToHostile<PacketCustomizer>::Visit(CreatureMap } } -template<typename PacketCustomizer> -void Trinity::MessageDistDelivererToHostile<PacketCustomizer>::Visit(DynamicObjectMapType& m) const +template<typename PacketSender> +void Trinity::MessageDistDelivererToHostile<PacketSender>::Visit(DynamicObjectMapType& m) const { for (DynamicObjectMapType::iterator iter = m.begin(); iter != m.end(); ++iter) { @@ -749,55 +749,26 @@ void Trinity::PlayerLastSearcher<Check>::Visit(PlayerMapType& m) } } -template<class Builder> -void Trinity::LocalizedPacketDo<Builder>::operator()(Player* p) +template<typename Localizer> +void Trinity::LocalizedDo<Localizer>::operator()(Player* p) { LocaleConstant loc_idx = p->GetSession()->GetSessionDbLocaleIndex(); - uint32 cache_idx = loc_idx+1; - WorldPackets::Packet* data; + uint32 cache_idx = loc_idx + 1; + LocalizedAction* action; // create if not cached yet - if (i_data_cache.size() < cache_idx + 1 || !i_data_cache[cache_idx]) + if (_localizedCache.size() < cache_idx + 1 || !_localizedCache[cache_idx]) { - if (i_data_cache.size() < cache_idx + 1) - i_data_cache.resize(cache_idx + 1); + if (_localizedCache.size() < cache_idx + 1) + _localizedCache.resize(cache_idx + 1); - data = i_builder(loc_idx); - - ASSERT(data->GetSize() == 0); - - data->Write(); - - i_data_cache[cache_idx] = data; - } - else - data = i_data_cache[cache_idx]; - - p->SendDirectMessage(data->GetRawPacket()); -} - -template<class Builder> -void Trinity::LocalizedPacketListDo<Builder>::operator()(Player* p) -{ - LocaleConstant loc_idx = p->GetSession()->GetSessionDbLocaleIndex(); - uint32 cache_idx = loc_idx+1; - WorldPacketList* data_list; - - // create if not cached yet - if (i_data_cache.size() < cache_idx+1 || i_data_cache[cache_idx].empty()) - { - if (i_data_cache.size() < cache_idx+1) - i_data_cache.resize(cache_idx+1); - - data_list = &i_data_cache[cache_idx]; - - i_builder(*data_list, loc_idx); + action = _localizer(loc_idx); + _localizedCache[cache_idx].reset(action); } else - data_list = &i_data_cache[cache_idx]; + action = _localizedCache[cache_idx].get(); - for (size_t i = 0; i < data_list->size(); ++i) - p->SendDirectMessage((*data_list)[i]->GetRawPacket()); + (*action)(p); } #endif // TRINITY_GRIDNOTIFIERSIMPL_H diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index b85f344d244..3effc60e53e 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -37,13 +37,14 @@ class DefenseMessageBuilder DefenseMessageBuilder(uint32 zoneId, uint32 id) : _zoneId(zoneId), _id(id) { } - WorldPackets::Chat::DefenseMessage* operator()(LocaleConstant locale) const + Trinity::PacketSenderOwning<WorldPackets::Chat::DefenseMessage>* operator()(LocaleConstant locale) const { std::string text = sOutdoorPvPMgr->GetDefenseMessage(_zoneId, _id, locale); - WorldPackets::Chat::DefenseMessage* defenseMessage = new WorldPackets::Chat::DefenseMessage(); - defenseMessage->ZoneID = _zoneId; - defenseMessage->MessageText = text; + Trinity::PacketSenderOwning<WorldPackets::Chat::DefenseMessage>* defenseMessage = new Trinity::PacketSenderOwning<WorldPackets::Chat::DefenseMessage>(); + defenseMessage->Data.ZoneID = _zoneId; + defenseMessage->Data.MessageText = text; + defenseMessage->Data.Write(); return defenseMessage; } @@ -636,7 +637,7 @@ void OutdoorPvP::OnGameObjectRemove(GameObject* go) void OutdoorPvP::SendDefenseMessage(uint32 zoneId, uint32 id) { DefenseMessageBuilder builder(zoneId, id); - Trinity::LocalizedPacketDo<DefenseMessageBuilder> localizer(builder); + Trinity::LocalizedDo<DefenseMessageBuilder> localizer(builder); BroadcastWorker(localizer, zoneId); } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index f713991563c..83c6b37b925 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -4005,15 +4005,17 @@ void Spell::EffectForceDeselect(SpellEffIndex /*effIndex*/) float dist = m_caster->GetVisibilityRange(); // clear focus - WorldPackets::Combat::BreakTarget breakTarget; - breakTarget.UnitGUID = m_caster->GetGUID(); - Trinity::MessageDistDelivererToHostile<> notifierBreak(m_caster, breakTarget.Write(), dist); + Trinity::PacketSenderOwning<WorldPackets::Combat::BreakTarget> breakTarget; + breakTarget.Data.UnitGUID = m_caster->GetGUID(); + breakTarget.Data.Write(); + Trinity::MessageDistDelivererToHostile<Trinity::PacketSenderOwning<WorldPackets::Combat::BreakTarget>> notifierBreak(m_caster, breakTarget, dist); Cell::VisitWorldObjects(m_caster, notifierBreak, dist); // and selection - WorldPackets::Spells::ClearTarget clearTarget; - clearTarget.Guid = m_caster->GetGUID(); - Trinity::MessageDistDelivererToHostile<> notifierClear(m_caster, clearTarget.Write(), dist); + Trinity::PacketSenderOwning<WorldPackets::Spells::ClearTarget> clearTarget; + clearTarget.Data.Guid = m_caster->GetGUID(); + clearTarget.Data.Write(); + Trinity::MessageDistDelivererToHostile<Trinity::PacketSenderOwning<WorldPackets::Spells::ClearTarget>> notifierClear(m_caster, clearTarget, dist); Cell::VisitWorldObjects(m_caster, notifierClear, dist); // we should also force pets to remove us from current target diff --git a/src/server/game/Texts/ChatTextBuilder.cpp b/src/server/game/Texts/ChatTextBuilder.cpp index 414ebe0ebd2..4abaa62392b 100644 --- a/src/server/game/Texts/ChatTextBuilder.cpp +++ b/src/server/game/Texts/ChatTextBuilder.cpp @@ -16,29 +16,33 @@ */ #include "ChatTextBuilder.h" -#include "ChatPackets.h" +#include "CreatureTextMgr.h" #include "DB2Stores.h" +#include "GridNotifiers.h" #include "ObjectMgr.h" +#include "Player.h" #include <cstdarg> -WorldPackets::Packet* Trinity::BroadcastTextBuilder::operator()(LocaleConstant locale) const +namespace Trinity +{ +PacketSenderOwning<WorldPackets::Chat::Chat>* BroadcastTextBuilder::operator()(LocaleConstant locale) const { BroadcastTextEntry const* bct = sBroadcastTextStore.LookupEntry(_textId); - WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat(); - chat->Initialize(_msgType, bct ? Language(bct->LanguageID) : LANG_UNIVERSAL, _source, _target, bct ? DB2Manager::GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, "", locale); + PacketSenderOwning<WorldPackets::Chat::Chat>* chat = new PacketSenderOwning<WorldPackets::Chat::Chat>(); + chat->Data.Initialize(_msgType, bct ? Language(bct->LanguageID) : LANG_UNIVERSAL, _source, _target, bct ? DB2Manager::GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, "", locale); return chat; } -WorldPackets::Packet* Trinity::CustomChatTextBuilder::operator()(LocaleConstant locale) const +PacketSenderOwning<WorldPackets::Chat::Chat>* CustomChatTextBuilder::operator()(LocaleConstant locale) const { - WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat(); - chat->Initialize(_msgType, _language, _source, _target, _text, 0, "", locale); + PacketSenderOwning<WorldPackets::Chat::Chat>* chat = new PacketSenderOwning<WorldPackets::Chat::Chat>(); + chat->Data.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale); return chat; } -WorldPackets::Packet* Trinity::TrinityStringChatBuilder::operator()(LocaleConstant locale) const +PacketSenderOwning<WorldPackets::Chat::Chat>* TrinityStringChatBuilder::operator()(LocaleConstant locale) const { - WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat(); + PacketSenderOwning<WorldPackets::Chat::Chat>* chat = new PacketSenderOwning<WorldPackets::Chat::Chat>(); char const* text = sObjectMgr->GetTrinityString(_textId, locale); @@ -53,10 +57,18 @@ WorldPackets::Packet* Trinity::TrinityStringChatBuilder::operator()(LocaleConsta vsnprintf(strBuffer, BufferSize, text, ap); va_end(ap); - packet->Initialize(_msgType, LANG_UNIVERSAL, _source, _target, strBuffer, 0, "", locale); + chat->Data.Initialize(_msgType, LANG_UNIVERSAL, _source, _target, strBuffer, 0, "", locale); } else - packet->Initialize(_msgType, LANG_UNIVERSAL, _source, _target, text, 0, "", locale); + chat->Data.Initialize(_msgType, LANG_UNIVERSAL, _source, _target, text, 0, "", locale); + + return chat; +} - return packet; +PacketSenderOwning<WorldPackets::Chat::Chat>* CreatureTextTextBuilder::operator()(LocaleConstant locale) const +{ + PacketSenderOwning<WorldPackets::Chat::Chat>* chat = new PacketSenderOwning<WorldPackets::Chat::Chat>(); + chat->Data.Initialize(_msgType, _language, _talker, _target, sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale), 0, "", locale); + return chat; +} } diff --git a/src/server/game/Texts/ChatTextBuilder.h b/src/server/game/Texts/ChatTextBuilder.h index aeec413a245..df24bbed18e 100644 --- a/src/server/game/Texts/ChatTextBuilder.h +++ b/src/server/game/Texts/ChatTextBuilder.h @@ -19,14 +19,27 @@ #define __CHATTEXT_BUILDER_H #include "Common.h" +#include "ChatPackets.h" #include "SharedDefines.h" #include <string> +class Player; class WorldObject; +namespace Trinity +{ + template<typename Packet> + struct PacketSenderOwning; +} + namespace WorldPackets { class Packet; + + namespace Chat + { + class Chat; + } } namespace Trinity @@ -37,7 +50,7 @@ namespace Trinity BroadcastTextBuilder(WorldObject const* obj, ChatMsg msgType, uint32 textId, uint8 gender, WorldObject const* target = nullptr, uint32 achievementId = 0) : _source(obj), _msgType(msgType), _textId(textId), _gender(gender), _target(target), _achievementId(achievementId) { } - WorldPackets::Packet* operator()(LocaleConstant locale) const; + PacketSenderOwning<WorldPackets::Chat::Chat>* operator()(LocaleConstant locale) const; private: WorldObject const* _source; @@ -54,7 +67,7 @@ namespace Trinity CustomChatTextBuilder(WorldObject const* obj, ChatMsg msgType, std::string const& text, Language language = LANG_UNIVERSAL, WorldObject const* target = nullptr) : _source(obj), _msgType(msgType), _text(text), _language(language), _target(target) { } - WorldPackets::Packet* operator()(LocaleConstant locale) const; + PacketSenderOwning<WorldPackets::Chat::Chat>* operator()(LocaleConstant locale) const; private: WorldObject const* _source; @@ -70,7 +83,7 @@ namespace Trinity TrinityStringChatBuilder(WorldObject const* obj, ChatMsg msgType, uint32 textId, WorldObject const* target = nullptr, va_list* args = nullptr) : _source(obj), _msgType(msgType), _textId(textId), _target(target), _args(args) { } - WorldPackets::Packet* operator()(LocaleConstant locale) const; + PacketSenderOwning<WorldPackets::Chat::Chat>* operator()(LocaleConstant locale) const; private: WorldObject const* _source; @@ -79,6 +92,25 @@ namespace Trinity WorldObject const* _target; va_list* _args; }; + + class CreatureTextTextBuilder + { + public: + CreatureTextTextBuilder(WorldObject const* obj, WorldObject const* speaker, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, Language language, WorldObject const* target) + : _source(obj), _talker(speaker), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { } + + PacketSenderOwning<WorldPackets::Chat::Chat>* operator()(LocaleConstant locale) const; + + private: + WorldObject const* _source; + WorldObject const* _talker; + uint8 _gender; + ChatMsg _msgType; + uint8 _textGroup; + uint32 _textId; + Language _language; + WorldObject const* _target; + }; } // namespace Trinity diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index e388e5f80a0..5bd16c95c20 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -19,7 +19,7 @@ #include "CreatureTextMgrImpl.h" #include "CellImpl.h" #include "Chat.h" -#include "ChatPackets.h" +#include "ChatTextBuilder.h" #include "Common.h" #include "DatabaseEnv.h" #include "DB2Stores.h" @@ -29,55 +29,6 @@ #include "ObjectMgr.h" #include "World.h" -class CreatureTextBuilder -{ - public: - CreatureTextBuilder(WorldObject const* obj, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, WorldObject const* target) - : _source(obj), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { } - - WorldPackets::Packet* operator()(LocaleConstant locale) const - { - std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale); - WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat(); - chat->Initialize(_msgType, Language(_language), _source, _target, text, 0, "", locale); - return chat; - } - - private: - WorldObject const* _source; - uint8 _gender; - ChatMsg _msgType; - uint8 _textGroup; - uint32 _textId; - uint32 _language; - WorldObject const* _target; -}; - -class PlayerTextBuilder -{ - public: - PlayerTextBuilder(WorldObject const* obj, WorldObject const* speaker, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, WorldObject const* target) - : _source(obj), _talker(speaker), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { } - - WorldPackets::Packet* operator()(LocaleConstant locale) const - { - std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale); - WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat(); - chat->Initialize(_msgType, Language(_language), _talker, _target, text, 0, "", locale); - return chat; - } - - private: - WorldObject const* _source; - WorldObject const* _talker; - uint8 _gender; - ChatMsg _msgType; - uint8 _textGroup; - uint32 _textId; - uint32 _language; - WorldObject const* _target; -}; - CreatureTextMgr* CreatureTextMgr::instance() { static CreatureTextMgr instance; @@ -270,12 +221,12 @@ uint32 CreatureTextMgr::SendChat(Creature* source, uint8 textGroup, WorldObject if (srcPlr) { - PlayerTextBuilder builder(source, finalSource, finalSource->getGender(), finalType, iter->groupId, iter->id, finalLang, whisperTarget); + Trinity::CreatureTextTextBuilder builder(source, finalSource, finalSource->getGender(), finalType, iter->groupId, iter->id, finalLang, whisperTarget); SendChatPacket(finalSource, builder, finalType, whisperTarget, range, team, gmOnly); } else { - CreatureTextBuilder builder(finalSource, finalSource->getGender(), finalType, iter->groupId, iter->id, finalLang, whisperTarget); + Trinity::CreatureTextTextBuilder builder(finalSource, finalSource, finalSource->getGender(), finalType, iter->groupId, iter->id, finalLang, whisperTarget); SendChatPacket(finalSource, builder, finalType, whisperTarget, range, team, gmOnly); } diff --git a/src/server/game/Texts/CreatureTextMgrImpl.h b/src/server/game/Texts/CreatureTextMgrImpl.h index 046a022c3fb..46b7c8e909c 100644 --- a/src/server/game/Texts/CreatureTextMgrImpl.h +++ b/src/server/game/Texts/CreatureTextMgrImpl.h @@ -20,7 +20,7 @@ #include "CreatureTextMgr.h" #include "CellImpl.h" -#include "ChatPackets.h" +#include "ChatTextBuilder.h" #include "GridNotifiers.h" #include "Group.h" #include "World.h" @@ -30,38 +30,30 @@ template<class Builder> class CreatureTextLocalizer { public: - CreatureTextLocalizer(Builder const& builder, ChatMsg msgType) : _builder(builder), _msgType(msgType) + CreatureTextLocalizer(Builder const& builder, ChatMsg msgType) : _cache(), _builder(builder), _msgType(msgType) { - _packetCache.resize(TOTAL_LOCALES, nullptr); - } - - ~CreatureTextLocalizer() - { - for (size_t i = 0; i < _packetCache.size(); ++i) - delete _packetCache[i]; } void operator()(Player const* player) const { LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); - WorldPackets::Chat::Chat* messageTemplate; + Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>* sender; // create if not cached yet - if (!_packetCache[loc_idx]) + if (!_cache[loc_idx]) { - messageTemplate = static_cast<WorldPackets::Chat::Chat*>(_builder(loc_idx)); - messageTemplate->Write(); - _packetCache[loc_idx] = messageTemplate; + sender = _builder(loc_idx); + _cache[loc_idx].reset(sender); } else - messageTemplate = _packetCache[loc_idx]; + sender = _cache[loc_idx].get(); switch (_msgType) { case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER: { - WorldPackets::Chat::Chat message(*messageTemplate); + WorldPackets::Chat::Chat message(sender->Data); message.SetReceiver(player, loc_idx); player->SendDirectMessage(message.Write()); return; @@ -70,11 +62,11 @@ public: break; } - player->SendDirectMessage(messageTemplate->GetRawPacket()); + (*sender)(player); } private: - mutable std::vector<WorldPackets::Chat::Chat*> _packetCache; + mutable std::array<std::unique_ptr<Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>>, TOTAL_LOCALES> _cache; Builder const& _builder; ChatMsg _msgType; }; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index a60cd591993..d7a35ef9af3 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2737,13 +2737,24 @@ namespace Trinity { class WorldWorldTextBuilder { + class MultiplePacketSender + { + public: + void operator()(Player const* receiver) const + { + for (std::unique_ptr<WorldPackets::Packet> const& packet : Packets) + receiver->SendDirectMessage(packet->GetRawPacket()); + } + + std::vector<std::unique_ptr<WorldPackets::Packet>> Packets; + }; + public: - typedef std::vector<WorldPackets::Packet*> WorldPacketList; static size_t const BufferSize = 2048; explicit WorldWorldTextBuilder(uint32 textId, va_list* args = nullptr) : i_textId(textId), i_args(args) { } - void operator()(WorldPacketList& dataList, LocaleConstant locale) + MultiplePacketSender* operator()(LocaleConstant locale) { char const* text = sObjectMgr->GetTrinityString(i_textId, locale); @@ -2762,18 +2773,20 @@ namespace Trinity strBuffer[BufferSize - 1] = '\0'; } - do_helper(dataList, strBuffer); + MultiplePacketSender* sender = new MultiplePacketSender(); + do_helper(sender->Packets, strBuffer); + return sender; } private: - void do_helper(WorldPacketList& dataList, char* text) + void do_helper(std::vector<std::unique_ptr<WorldPackets::Packet>>& dataList, char* text) { while (char* line = ChatHandler::LineFromMessage(text)) { WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat(); packet->Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); packet->Write(); - dataList.push_back(packet); + dataList.emplace_back(packet); } } @@ -2789,7 +2802,7 @@ void World::SendWorldText(uint32 string_id, ...) va_start(ap, string_id); Trinity::WorldWorldTextBuilder wt_builder(string_id, &ap); - Trinity::LocalizedPacketListDo<Trinity::WorldWorldTextBuilder> wt_do(wt_builder); + Trinity::LocalizedDo<Trinity::WorldWorldTextBuilder> wt_do(wt_builder); for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr) { if (!itr->second || !itr->second->GetPlayer() || !itr->second->GetPlayer()->IsInWorld()) @@ -2808,7 +2821,7 @@ void World::SendGMText(uint32 string_id, ...) va_start(ap, string_id); Trinity::WorldWorldTextBuilder wt_builder(string_id, &ap); - Trinity::LocalizedPacketListDo<Trinity::WorldWorldTextBuilder> wt_do(wt_builder); + Trinity::LocalizedDo<Trinity::WorldWorldTextBuilder> wt_do(wt_builder); for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr) { // Session should have permissions to receive global gm messages |