diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 44 | ||||
-rw-r--r-- | src/server/game/Texts/ChatTextBuilder.cpp | 58 | ||||
-rw-r--r-- | src/server/game/Texts/ChatTextBuilder.h | 46 | ||||
-rw-r--r-- | src/server/game/Texts/CreatureTextMgrImpl.h | 6 |
4 files changed, 72 insertions, 82 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index b18439244db..d66163527a6 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -42,6 +42,7 @@ #include "CharacterPackets.h" #include "Chat.h" #include "ChatPackets.h" +#include "ChatTextBuilder.h" #include "CinematicMgr.h" #include "CombatLogPackets.h" #include "CombatPackets.h" @@ -21969,54 +21970,15 @@ void Player::Say(std::string const& text, Language language, WorldObject const* SendChatMessageToSetInRange(CHAT_MSG_SAY, language, std::move(_text), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY)); } -struct ChatMessageDistDelivererCustomizer -{ - // params - ChatMsg Type; - ::Language Language; - WorldObject const* Sender; - WorldObject const* Receiver; - std::string Text; - - // caches - WorldPackets::Chat::Chat UntranslatedPacket; - mutable Optional<WorldPackets::Chat::Chat> TranslatedPacket; - uint32 LanguageSkillId; - - ChatMessageDistDelivererCustomizer(ChatMsg chatType, ::Language language, WorldObject const* sender, WorldObject const* receiver, std::string message) - : Type(chatType), Language(language), Sender(sender), Receiver(receiver), Text(std::move(message)), LanguageSkillId(0) - { - UntranslatedPacket.Initialize(Type, Language, Sender, Receiver, Text); - UntranslatedPacket.Write(); - if (LanguageDesc const* languageDesc = sLanguageMgr->GetLanguageDescById(language)) - LanguageSkillId = languageDesc->SkillId; - } - - WorldPacket const* operator()(Player* player) const - { - if (player->CanUnderstandLanguageSkillId(LanguageSkillId)) - return UntranslatedPacket.GetRawPacket(); - - if (!TranslatedPacket) - { - TranslatedPacket.emplace(); - TranslatedPacket->Initialize(Type, Language, Sender, Receiver, sLanguageMgr->Translate(Text, Language)); - TranslatedPacket->Write(); - } - - return TranslatedPacket->GetRawPacket(); - } -}; - void Player::SendChatMessageToSetInRange(ChatMsg chatMsg, Language language, std::string&& text, float range) { - ChatMessageDistDelivererCustomizer customizer(chatMsg, language, this, this, std::move(text)); + Trinity::ChatPacketSender customizer(chatMsg, language, this, this, std::move(text)); // Send to self SendDirectMessage(customizer.UntranslatedPacket.GetRawPacket()); // Send to players - Trinity::MessageDistDeliverer<ChatMessageDistDelivererCustomizer> notifier(this, std::move(customizer), range); + Trinity::MessageDistDeliverer<Trinity::ChatPacketSender> notifier(this, customizer, range); Cell::VisitWorldObjects(this, notifier, range); } diff --git a/src/server/game/Texts/ChatTextBuilder.cpp b/src/server/game/Texts/ChatTextBuilder.cpp index 4abaa62392b..6c4b7b3761d 100644 --- a/src/server/game/Texts/ChatTextBuilder.cpp +++ b/src/server/game/Texts/ChatTextBuilder.cpp @@ -18,32 +18,54 @@ #include "ChatTextBuilder.h" #include "CreatureTextMgr.h" #include "DB2Stores.h" -#include "GridNotifiers.h" +#include "LanguageMgr.h" #include "ObjectMgr.h" #include "Player.h" #include <cstdarg> namespace Trinity { -PacketSenderOwning<WorldPackets::Chat::Chat>* BroadcastTextBuilder::operator()(LocaleConstant locale) const +ChatPacketSender::ChatPacketSender(ChatMsg chatType, ::Language language, WorldObject const* sender, WorldObject const* receiver, + std::string message, uint32 achievementId /*= 0*/, LocaleConstant locale /*= LOCALE_enUS*/) + : Type(chatType), Language(language), Sender(sender), Receiver(receiver), Text(std::move(message)), AchievementId(achievementId), Locale(locale), LanguageSkillId(0) { - BroadcastTextEntry const* bct = sBroadcastTextStore.LookupEntry(_textId); - 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; + UntranslatedPacket.Initialize(Type, Language, Sender, Receiver, Text, AchievementId, "", Locale); + UntranslatedPacket.Write(); + if (LanguageDesc const* languageDesc = sLanguageMgr->GetLanguageDescById(language)) + LanguageSkillId = languageDesc->SkillId; } -PacketSenderOwning<WorldPackets::Chat::Chat>* CustomChatTextBuilder::operator()(LocaleConstant locale) const +void ChatPacketSender::operator()(Player const* player) const { - PacketSenderOwning<WorldPackets::Chat::Chat>* chat = new PacketSenderOwning<WorldPackets::Chat::Chat>(); - chat->Data.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale); - return chat; + if (player->CanUnderstandLanguageSkillId(LanguageSkillId)) + { + player->SendDirectMessage(UntranslatedPacket.GetRawPacket()); + return; + } + + if (!TranslatedPacket) + { + TranslatedPacket.emplace(); + TranslatedPacket->Initialize(Type, Language, Sender, Receiver, sLanguageMgr->Translate(Text, Language), AchievementId, "", Locale); + TranslatedPacket->Write(); + } + + player->SendDirectMessage(TranslatedPacket->GetRawPacket()); } -PacketSenderOwning<WorldPackets::Chat::Chat>* TrinityStringChatBuilder::operator()(LocaleConstant locale) const +ChatPacketSender* BroadcastTextBuilder::operator()(LocaleConstant locale) const { - PacketSenderOwning<WorldPackets::Chat::Chat>* chat = new PacketSenderOwning<WorldPackets::Chat::Chat>(); + BroadcastTextEntry const* bct = sBroadcastTextStore.LookupEntry(_textId); + return new ChatPacketSender(_msgType, bct ? Language(bct->LanguageID) : LANG_UNIVERSAL, _source, _target, bct ? DB2Manager::GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, locale); +} + +ChatPacketSender* CustomChatTextBuilder::operator()(LocaleConstant locale) const +{ + return new ChatPacketSender(_msgType, _language, _source, _target, _text, 0, locale); +} +ChatPacketSender* TrinityStringChatBuilder::operator()(LocaleConstant locale) const +{ char const* text = sObjectMgr->GetTrinityString(_textId, locale); if (_args) @@ -57,18 +79,14 @@ PacketSenderOwning<WorldPackets::Chat::Chat>* TrinityStringChatBuilder::operator vsnprintf(strBuffer, BufferSize, text, ap); va_end(ap); - chat->Data.Initialize(_msgType, LANG_UNIVERSAL, _source, _target, strBuffer, 0, "", locale); + return new ChatPacketSender(_msgType, LANG_UNIVERSAL, _source, _target, strBuffer, 0, locale); } - else - chat->Data.Initialize(_msgType, LANG_UNIVERSAL, _source, _target, text, 0, "", locale); - return chat; + return new ChatPacketSender(_msgType, LANG_UNIVERSAL, _source, _target, text, 0, locale); } -PacketSenderOwning<WorldPackets::Chat::Chat>* CreatureTextTextBuilder::operator()(LocaleConstant locale) const +ChatPacketSender* 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; + return new ChatPacketSender(_msgType, _language, _talker, _target, sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale), 0, locale); } } diff --git a/src/server/game/Texts/ChatTextBuilder.h b/src/server/game/Texts/ChatTextBuilder.h index d5304e0c09e..74d677dfbfa 100644 --- a/src/server/game/Texts/ChatTextBuilder.h +++ b/src/server/game/Texts/ChatTextBuilder.h @@ -19,6 +19,7 @@ #define __CHATTEXT_BUILDER_H #include "Common.h" +#include "ChatPackets.h" #include "SharedDefines.h" #include <string> @@ -27,29 +28,38 @@ class WorldObject; namespace Trinity { - template<typename Packet> - struct PacketSenderOwning; -} - -namespace WorldPackets -{ - class Packet; - - namespace Chat + class ChatPacketSender { - class Chat; - } -} + private: + // params + ChatMsg Type; + ::Language Language; + WorldObject const* Sender; + WorldObject const* Receiver; + std::string Text; + uint32 AchievementId; + LocaleConstant Locale; + + uint32 LanguageSkillId; + + public: + // caches + WorldPackets::Chat::Chat UntranslatedPacket; + mutable Optional<WorldPackets::Chat::Chat> TranslatedPacket; + + ChatPacketSender(ChatMsg chatType, ::Language language, WorldObject const* sender, WorldObject const* receiver, std::string message, + uint32 achievementId = 0, LocaleConstant locale = LOCALE_enUS); + + void operator()(Player const* player) const; + }; -namespace Trinity -{ class BroadcastTextBuilder { public: 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) { } - PacketSenderOwning<WorldPackets::Chat::Chat>* operator()(LocaleConstant locale) const; + ChatPacketSender* operator()(LocaleConstant locale) const; private: WorldObject const* _source; @@ -66,7 +76,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) { } - PacketSenderOwning<WorldPackets::Chat::Chat>* operator()(LocaleConstant locale) const; + ChatPacketSender* operator()(LocaleConstant locale) const; private: WorldObject const* _source; @@ -82,7 +92,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) { } - PacketSenderOwning<WorldPackets::Chat::Chat>* operator()(LocaleConstant locale) const; + ChatPacketSender* operator()(LocaleConstant locale) const; private: WorldObject const* _source; @@ -98,7 +108,7 @@ namespace Trinity 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; + ChatPacketSender* operator()(LocaleConstant locale) const; private: WorldObject const* _source; diff --git a/src/server/game/Texts/CreatureTextMgrImpl.h b/src/server/game/Texts/CreatureTextMgrImpl.h index 46b7c8e909c..a4d368457ad 100644 --- a/src/server/game/Texts/CreatureTextMgrImpl.h +++ b/src/server/game/Texts/CreatureTextMgrImpl.h @@ -37,7 +37,7 @@ public: void operator()(Player const* player) const { LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); - Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>* sender; + Trinity::ChatPacketSender* sender; // create if not cached yet if (!_cache[loc_idx]) @@ -53,7 +53,7 @@ public: case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER: { - WorldPackets::Chat::Chat message(sender->Data); + WorldPackets::Chat::Chat message(sender->UntranslatedPacket); message.SetReceiver(player, loc_idx); player->SendDirectMessage(message.Write()); return; @@ -66,7 +66,7 @@ public: } private: - mutable std::array<std::unique_ptr<Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>>, TOTAL_LOCALES> _cache; + mutable std::array<std::unique_ptr<Trinity::ChatPacketSender>, TOTAL_LOCALES> _cache; Builder const& _builder; ChatMsg _msgType; }; |