Core/Chat: Apply language translations to creature chat

This commit is contained in:
Shauren
2021-05-01 22:12:58 +02:00
parent 3b578fc6b9
commit c8e5f78b82
4 changed files with 72 additions and 82 deletions

View File

@@ -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);
}

View File

@@ -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)
{
UntranslatedPacket.Initialize(Type, Language, Sender, Receiver, Text, AchievementId, "", Locale);
UntranslatedPacket.Write();
if (LanguageDesc const* languageDesc = sLanguageMgr->GetLanguageDescById(language))
LanguageSkillId = languageDesc->SkillId;
}
void ChatPacketSender::operator()(Player const* player) const
{
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());
}
ChatPacketSender* BroadcastTextBuilder::operator()(LocaleConstant locale) const
{
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;
return new ChatPacketSender(_msgType, bct ? Language(bct->LanguageID) : LANG_UNIVERSAL, _source, _target, bct ? DB2Manager::GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, locale);
}
PacketSenderOwning<WorldPackets::Chat::Chat>* CustomChatTextBuilder::operator()(LocaleConstant locale) const
ChatPacketSender* CustomChatTextBuilder::operator()(LocaleConstant locale) const
{
PacketSenderOwning<WorldPackets::Chat::Chat>* chat = new PacketSenderOwning<WorldPackets::Chat::Chat>();
chat->Data.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale);
return chat;
return new ChatPacketSender(_msgType, _language, _source, _target, _text, 0, locale);
}
PacketSenderOwning<WorldPackets::Chat::Chat>* TrinityStringChatBuilder::operator()(LocaleConstant locale) const
ChatPacketSender* TrinityStringChatBuilder::operator()(LocaleConstant locale) const
{
PacketSenderOwning<WorldPackets::Chat::Chat>* chat = new PacketSenderOwning<WorldPackets::Chat::Chat>();
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);
}
}

View File

@@ -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;

View File

@@ -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;
};