aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Texts
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/Texts
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/Texts')
-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
4 files changed, 72 insertions, 85 deletions
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;
};