aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp6
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp6
-rw-r--r--src/server/game/Chat/Channels/Channel.cpp93
-rw-r--r--src/server/game/Chat/Channels/ChannelAppenders.h14
-rw-r--r--src/server/game/Entities/Object/Object.cpp6
-rw-r--r--src/server/game/Entities/Player/Player.cpp9
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp16
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h89
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiersImpl.h75
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvP.cpp11
-rw-r--r--src/server/game/Spells/SpellEffects.cpp14
-rw-r--r--src/server/game/Texts/ChatTextBuilder.cpp36
-rw-r--r--src/server/game/Texts/ChatTextBuilder.h38
-rw-r--r--src/server/game/Texts/CreatureTextMgr.cpp55
-rw-r--r--src/server/game/Texts/CreatureTextMgrImpl.h28
-rw-r--r--src/server/game/World/World.cpp27
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