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/Texts | |
| 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/Texts')
| -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 |
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; }; |
