From c8e5f78b823ff8abf1463cfd5ccdf812d3fe6288 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 1 May 2021 22:12:58 +0200 Subject: Core/Chat: Apply language translations to creature chat --- src/server/game/Entities/Player/Player.cpp | 44 ++-------------------- src/server/game/Texts/ChatTextBuilder.cpp | 58 +++++++++++++++++++---------- src/server/game/Texts/ChatTextBuilder.h | 46 ++++++++++++++--------- src/server/game/Texts/CreatureTextMgrImpl.h | 6 +-- 4 files changed, 72 insertions(+), 82 deletions(-) (limited to 'src') 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 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 notifier(this, std::move(customizer), range); + Trinity::MessageDistDeliverer 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 namespace Trinity { -PacketSenderOwning* 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* chat = new PacketSenderOwning(); - 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* CustomChatTextBuilder::operator()(LocaleConstant locale) const +void ChatPacketSender::operator()(Player const* player) const { - PacketSenderOwning* chat = new PacketSenderOwning(); - 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* TrinityStringChatBuilder::operator()(LocaleConstant locale) const +ChatPacketSender* BroadcastTextBuilder::operator()(LocaleConstant locale) const { - PacketSenderOwning* chat = new PacketSenderOwning(); + 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* 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* CreatureTextTextBuilder::operator()(LocaleConstant locale) const +ChatPacketSender* CreatureTextTextBuilder::operator()(LocaleConstant locale) const { - PacketSenderOwning* chat = new PacketSenderOwning(); - 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 @@ -27,29 +28,38 @@ class WorldObject; namespace Trinity { - template - 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 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* 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* 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* 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* 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* 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>, TOTAL_LOCALES> _cache; + mutable std::array, TOTAL_LOCALES> _cache; Builder const& _builder; ChatMsg _msgType; }; -- cgit v1.2.3