From d426b154578a4cf8fb31bdf30656950b5f65ee3c Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 3 May 2021 21:04:12 -0400 Subject: [PATCH] Core/Chat: Apply language translations to creature chat Port From (https://github.com/TrinityCore/TrinityCore/commit/c8e5f78b823ff8abf1463cfd5ccdf812d3fe6288) --- Source/Game/Entities/Player/Player.cs | 53 +---------------- Source/Game/Text/ChatTextBuilder.cs | 77 ++++++++++++++++++++----- Source/Game/Text/CreatureTextManager.cs | 12 ++-- 3 files changed, 68 insertions(+), 74 deletions(-) diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 3ae3bfd54..f67ec3273 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -6233,13 +6233,13 @@ namespace Game.Entities void SendChatMessageToSetInRange(ChatMsg chatMsg, Language language, string text, float range) { - ChatMessageDistDelivererCustomizer customizer = new(chatMsg, language, this, this, text); + ChatPacketSender customizer = new(chatMsg, language, this, this, text); // Send to self SendPacket(customizer.UntranslatedPacket); // Send to players - MessageDistDeliverer notifier = new(this, customizer, range); + MessageDistDeliverer notifier = new(this, customizer, range); Cell.VisitWorldObjects(this, notifier, range); } @@ -7596,53 +7596,4 @@ namespace Game.Entities //Clears the Menu public void ClearGossipMenu() { PlayerTalkClass.ClearMenus(); } } - - class ChatMessageDistDelivererCustomizer : IDoWork - { - // params - ChatMsg Type; - Language Language; - WorldObject Sender; - WorldObject Receiver; - string Text; - - // caches - public ChatPkt UntranslatedPacket = new(); - public Optional TranslatedPacket; - public uint LanguageSkillId; - - public ChatMessageDistDelivererCustomizer(ChatMsg chatType, Language language, WorldObject sender, WorldObject receiver, string message) - { - Type = chatType; - Language = language; - Sender = sender; - Receiver = receiver; - Text = message; - - UntranslatedPacket.Initialize(Type, Language, Sender, Receiver, Text); - UntranslatedPacket.Write(); - - LanguageDesc languageDesc = Global.LanguageMgr.GetLanguageDescById(language); - if (languageDesc != null) - LanguageSkillId = languageDesc.SkillId; - } - - public void Invoke(Player player) - { - if (player.CanUnderstandLanguageSkillId(LanguageSkillId)) - { - player.SendPacket(UntranslatedPacket); - return; - } - - if (!TranslatedPacket.HasValue) - { - TranslatedPacket.HasValue = true; - TranslatedPacket.Value.Initialize(Type, Language, Sender, Receiver, Global.LanguageMgr.Translate(Text, (uint)Language)); - TranslatedPacket.Value.Write(); - } - - player.SendPacket(TranslatedPacket.Value); - } - } } \ No newline at end of file diff --git a/Source/Game/Text/ChatTextBuilder.cs b/Source/Game/Text/ChatTextBuilder.cs index 42957f9bd..69c682d29 100644 --- a/Source/Game/Text/ChatTextBuilder.cs +++ b/Source/Game/Text/ChatTextBuilder.cs @@ -16,10 +16,10 @@ */ using Framework.Constants; +using Framework.Dynamic; using Game.DataStorage; using Game.Entities; using Game.Maps; -using Game.Networking; using Game.Networking.Packets; using System.Collections.Generic; @@ -30,6 +30,59 @@ namespace Game.Chat public virtual dynamic Invoke(Locale locale = Locale.enUS) { return default; } } + public class ChatPacketSender : IDoWork + { + ChatMsg Type; + Language Language; + WorldObject Sender; + WorldObject Receiver; + string Text; + uint AchievementId; + Locale Locale; + + uint LanguageSkillId; + + // caches + public ChatPkt UntranslatedPacket; + public Optional TranslatedPacket; + + public ChatPacketSender(ChatMsg chatType, Language language, WorldObject sender, WorldObject receiver, string message, uint achievementId = 0, Locale locale = Locale.enUS) + { + Type = chatType; + Language = language; + Sender = sender; + Receiver = receiver; + Text = message; + AchievementId = achievementId; + Locale = locale; + + UntranslatedPacket.Initialize(Type, Language, Sender, Receiver, Text, AchievementId, "", Locale); + UntranslatedPacket.Write(); + + LanguageDesc languageDesc = Global.LanguageMgr.GetLanguageDescById(language); + if (languageDesc != null) + LanguageSkillId = languageDesc.SkillId; + } + + public void Invoke(Player player) + { + if (player.CanUnderstandLanguageSkillId(LanguageSkillId)) + { + player.SendPacket(UntranslatedPacket); + return; + } + + if (!TranslatedPacket.HasValue) + { + TranslatedPacket.HasValue = true; + TranslatedPacket.Value.Initialize(Type, Language, Sender, Receiver, Global.LanguageMgr.Translate(Text, (uint)Language), AchievementId, "", Locale); + TranslatedPacket.Value.Write(); + } + + player.SendPacket(TranslatedPacket.Value); + } + } + public class BroadcastTextBuilder : MessageBuilder { public BroadcastTextBuilder(WorldObject obj, ChatMsg msgtype, uint textId, Gender gender, WorldObject target = null, uint achievementId = 0) @@ -42,12 +95,10 @@ namespace Game.Chat _achievementId = achievementId; } - public override PacketSenderOwning Invoke(Locale locale = Locale.enUS) + public override ChatPacketSender Invoke(Locale locale = Locale.enUS) { BroadcastTextRecord bct = CliDB.BroadcastTextStorage.LookupByKey(_textId); - var chat = new PacketSenderOwning(); - chat.Data.Initialize(_msgType, bct != null ? (Language)bct.LanguageID : Language.Universal, _source, _target, bct != null ? Global.DB2Mgr.GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, "", locale); - return chat; + return new ChatPacketSender(_msgType, bct != null ? (Language)bct.LanguageID : Language.Universal, _source, _target, bct != null ? Global.DB2Mgr.GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, locale); } WorldObject _source; @@ -69,11 +120,9 @@ namespace Game.Chat _target = target; } - public override PacketSenderOwning Invoke(Locale locale) + public override ChatPacketSender Invoke(Locale locale) { - var chat = new PacketSenderOwning(); - chat.Data.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale); - return chat; + return new ChatPacketSender(_msgType, _language, _source, _target, _text, 0, locale); } WorldObject _source; @@ -94,18 +143,14 @@ namespace Game.Chat _args = args; } - public override PacketSenderOwning Invoke(Locale locale) + public override ChatPacketSender Invoke(Locale locale) { - PacketSenderOwning chat = new(); - string text = Global.ObjectMgr.GetCypherString(_textId, locale); if (_args != null) - chat.Data.Initialize(_msgType, Language.Universal, _source, _target, string.Format(text, _args), 0, "", locale); + return new ChatPacketSender(_msgType, Language.Universal, _source, _target, string.Format(text, _args), 0, locale); else - chat.Data.Initialize(_msgType, Language.Universal, _source, _target, text, 0, "", locale); - - return chat; + return new ChatPacketSender(_msgType, Language.Universal, _source, _target, text, 0, locale); } WorldObject _source; diff --git a/Source/Game/Text/CreatureTextManager.cs b/Source/Game/Text/CreatureTextManager.cs index a77409592..9c015483b 100644 --- a/Source/Game/Text/CreatureTextManager.cs +++ b/Source/Game/Text/CreatureTextManager.cs @@ -596,7 +596,7 @@ namespace Game public void Invoke(Player player) { Locale loc_idx = player.GetSession().GetSessionDbLocaleIndex(); - PacketSenderOwning sender; + ChatPacketSender sender; // create if not cached yet if (!_packetCache.ContainsKey(loc_idx)) @@ -611,7 +611,7 @@ namespace Game { case ChatMsg.MonsterWhisper: case ChatMsg.RaidBossWhisper: - ChatPkt message = sender.Data; + ChatPkt message = sender.UntranslatedPacket; message.SetReceiver(player, loc_idx); player.SendPacket(message); break; @@ -622,7 +622,7 @@ namespace Game sender.Invoke(player); } - Dictionary> _packetCache = new(); + Dictionary _packetCache = new(); MessageBuilder _builder; ChatMsg _msgType; } @@ -640,12 +640,10 @@ namespace Game _target = target; } - public override PacketSenderOwning Invoke(Locale locale = Locale.enUS) + public override ChatPacketSender Invoke(Locale locale = Locale.enUS) { string text = Global.CreatureTextMgr.GetLocalizedChatString(_source.GetEntry(), _gender, _textGroup, _textId, locale); - PacketSenderOwning chat = new(); - chat.Data.Initialize(_msgType, _language, _source, _target, text, 0, "", locale); - return chat; + return new ChatPacketSender(_msgType, _language, _source, _target, text, 0, locale); } WorldObject _source;