aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Grids
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-05-01 20:16:10 +0200
committerShauren <shauren.trinity@gmail.com>2021-05-01 20:16:10 +0200
commitfb66575d38d2ba7ffc24c29824fa75d7019de549 (patch)
tree9b263e8914862f92d5e6f2fc23450a2f973df461 /src/server/game/Grids
parentd6dfb6c54c3296461ec73ea5d969f7a5a704541b (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.h89
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiersImpl.h75
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