Core/Chat: Apply language translations to creature chat

Port From (https://github.com/TrinityCore/TrinityCore/commit/c8e5f78b823ff8abf1463cfd5ccdf812d3fe6288)
This commit is contained in:
hondacrx
2021-05-03 21:04:12 -04:00
parent 017a25f179
commit d426b15457
3 changed files with 68 additions and 74 deletions
+2 -51
View File
@@ -6233,13 +6233,13 @@ namespace Game.Entities
void SendChatMessageToSetInRange(ChatMsg chatMsg, Language language, string text, float range) 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 // Send to self
SendPacket(customizer.UntranslatedPacket); SendPacket(customizer.UntranslatedPacket);
// Send to players // Send to players
MessageDistDeliverer<ChatMessageDistDelivererCustomizer> notifier = new(this, customizer, range); MessageDistDeliverer<ChatPacketSender> notifier = new(this, customizer, range);
Cell.VisitWorldObjects(this, notifier, range); Cell.VisitWorldObjects(this, notifier, range);
} }
@@ -7596,53 +7596,4 @@ namespace Game.Entities
//Clears the Menu //Clears the Menu
public void ClearGossipMenu() { PlayerTalkClass.ClearMenus(); } public void ClearGossipMenu() { PlayerTalkClass.ClearMenus(); }
} }
class ChatMessageDistDelivererCustomizer : IDoWork<Player>
{
// params
ChatMsg Type;
Language Language;
WorldObject Sender;
WorldObject Receiver;
string Text;
// caches
public ChatPkt UntranslatedPacket = new();
public Optional<ChatPkt> 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);
}
}
} }
+61 -16
View File
@@ -16,10 +16,10 @@
*/ */
using Framework.Constants; using Framework.Constants;
using Framework.Dynamic;
using Game.DataStorage; using Game.DataStorage;
using Game.Entities; using Game.Entities;
using Game.Maps; using Game.Maps;
using Game.Networking;
using Game.Networking.Packets; using Game.Networking.Packets;
using System.Collections.Generic; using System.Collections.Generic;
@@ -30,6 +30,59 @@ namespace Game.Chat
public virtual dynamic Invoke(Locale locale = Locale.enUS) { return default; } public virtual dynamic Invoke(Locale locale = Locale.enUS) { return default; }
} }
public class ChatPacketSender : IDoWork<Player>
{
ChatMsg Type;
Language Language;
WorldObject Sender;
WorldObject Receiver;
string Text;
uint AchievementId;
Locale Locale;
uint LanguageSkillId;
// caches
public ChatPkt UntranslatedPacket;
public Optional<ChatPkt> 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 class BroadcastTextBuilder : MessageBuilder
{ {
public BroadcastTextBuilder(WorldObject obj, ChatMsg msgtype, uint textId, Gender gender, WorldObject target = null, uint achievementId = 0) 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; _achievementId = achievementId;
} }
public override PacketSenderOwning<ChatPkt> Invoke(Locale locale = Locale.enUS) public override ChatPacketSender Invoke(Locale locale = Locale.enUS)
{ {
BroadcastTextRecord bct = CliDB.BroadcastTextStorage.LookupByKey(_textId); BroadcastTextRecord bct = CliDB.BroadcastTextStorage.LookupByKey(_textId);
var chat = new PacketSenderOwning<ChatPkt>(); return new ChatPacketSender(_msgType, bct != null ? (Language)bct.LanguageID : Language.Universal, _source, _target, bct != null ? Global.DB2Mgr.GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, locale);
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;
} }
WorldObject _source; WorldObject _source;
@@ -69,11 +120,9 @@ namespace Game.Chat
_target = target; _target = target;
} }
public override PacketSenderOwning<ChatPkt> Invoke(Locale locale) public override ChatPacketSender Invoke(Locale locale)
{ {
var chat = new PacketSenderOwning<ChatPkt>(); return new ChatPacketSender(_msgType, _language, _source, _target, _text, 0, locale);
chat.Data.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale);
return chat;
} }
WorldObject _source; WorldObject _source;
@@ -94,18 +143,14 @@ namespace Game.Chat
_args = args; _args = args;
} }
public override PacketSenderOwning<ChatPkt> Invoke(Locale locale) public override ChatPacketSender Invoke(Locale locale)
{ {
PacketSenderOwning<ChatPkt> chat = new();
string text = Global.ObjectMgr.GetCypherString(_textId, locale); string text = Global.ObjectMgr.GetCypherString(_textId, locale);
if (_args != null) 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 else
chat.Data.Initialize(_msgType, Language.Universal, _source, _target, text, 0, "", locale); return new ChatPacketSender(_msgType, Language.Universal, _source, _target, text, 0, locale);
return chat;
} }
WorldObject _source; WorldObject _source;
+5 -7
View File
@@ -596,7 +596,7 @@ namespace Game
public void Invoke(Player player) public void Invoke(Player player)
{ {
Locale loc_idx = player.GetSession().GetSessionDbLocaleIndex(); Locale loc_idx = player.GetSession().GetSessionDbLocaleIndex();
PacketSenderOwning<ChatPkt> sender; ChatPacketSender sender;
// create if not cached yet // create if not cached yet
if (!_packetCache.ContainsKey(loc_idx)) if (!_packetCache.ContainsKey(loc_idx))
@@ -611,7 +611,7 @@ namespace Game
{ {
case ChatMsg.MonsterWhisper: case ChatMsg.MonsterWhisper:
case ChatMsg.RaidBossWhisper: case ChatMsg.RaidBossWhisper:
ChatPkt message = sender.Data; ChatPkt message = sender.UntranslatedPacket;
message.SetReceiver(player, loc_idx); message.SetReceiver(player, loc_idx);
player.SendPacket(message); player.SendPacket(message);
break; break;
@@ -622,7 +622,7 @@ namespace Game
sender.Invoke(player); sender.Invoke(player);
} }
Dictionary<Locale, PacketSenderOwning<ChatPkt>> _packetCache = new(); Dictionary<Locale, ChatPacketSender> _packetCache = new();
MessageBuilder _builder; MessageBuilder _builder;
ChatMsg _msgType; ChatMsg _msgType;
} }
@@ -640,12 +640,10 @@ namespace Game
_target = target; _target = target;
} }
public override PacketSenderOwning<ChatPkt> Invoke(Locale locale = Locale.enUS) public override ChatPacketSender Invoke(Locale locale = Locale.enUS)
{ {
string text = Global.CreatureTextMgr.GetLocalizedChatString(_source.GetEntry(), _gender, _textGroup, _textId, locale); string text = Global.CreatureTextMgr.GetLocalizedChatString(_source.GetEntry(), _gender, _textGroup, _textId, locale);
PacketSenderOwning<ChatPkt> chat = new(); return new ChatPacketSender(_msgType, _language, _source, _target, text, 0, locale);
chat.Data.Initialize(_msgType, _language, _source, _target, text, 0, "", locale);
return chat;
} }
WorldObject _source; WorldObject _source;