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/game/Grids | |
| 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/game/Grids')
| -rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 89 | ||||
| -rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiersImpl.h | 75 |
2 files changed, 60 insertions, 104 deletions
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 |
