Core/Chat: Apply language translations to creature chat
Port From (https://github.com/TrinityCore/TrinityCore/commit/c8e5f78b823ff8abf1463cfd5ccdf812d3fe6288)
This commit is contained in:
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user