Core/Chat: Load chat language data from db2 and implement serverside chat translations

Port From (https://github.com/TrinityCore/TrinityCore/commit/3b578fc6b95bfc812962fcef7930d8646016d184)
This commit is contained in:
hondacrx
2021-05-03 20:50:13 -04:00
parent 7b739de0e9
commit 017a25f179
11 changed files with 343 additions and 72 deletions
+69 -5
View File
@@ -6228,10 +6228,21 @@ namespace Game.Entities
{
Global.ScriptMgr.OnPlayerChat(this, ChatMsg.Say, language, text);
ChatPkt data = new();
data.Initialize(ChatMsg.Say, language, this, this, text);
SendMessageToSetInRange(data, WorldConfig.GetFloatValue(WorldCfg.ListenRangeSay), true);
SendChatMessageToSetInRange(ChatMsg.Say, language, text, WorldConfig.GetFloatValue(WorldCfg.ListenRangeSay));
}
void SendChatMessageToSetInRange(ChatMsg chatMsg, Language language, string text, float range)
{
ChatMessageDistDelivererCustomizer customizer = new(chatMsg, language, this, this, text);
// Send to self
SendPacket(customizer.UntranslatedPacket);
// Send to players
MessageDistDeliverer<ChatMessageDistDelivererCustomizer> notifier = new(this, customizer, range);
Cell.VisitWorldObjects(this, notifier, range);
}
public override void Say(uint textId, WorldObject target = null)
{
Talk(textId, ChatMsg.Say, WorldConfig.GetFloatValue(WorldCfg.ListenRangeSay), target);
@@ -6323,8 +6334,12 @@ namespace Game.Entities
packet.Initialize(ChatMsg.Whisper, Language.Universal, this, target, Global.DB2Mgr.GetBroadcastTextValue(bct, locale, GetGender()));
target.SendPacket(packet);
}
public bool CanUnderstandLanguageSkillId(uint langSkillId)
{
return IsGameMaster() || (langSkillId != 0 && HasSkill((SkillType)langSkillId));
}
#endregion
public void ClearWhisperWhiteList() { WhisperList.Clear(); }
public void AddWhisperWhiteList(ObjectGuid guid) { WhisperList.Add(guid); }
public bool IsInWhisperWhiteList(ObjectGuid guid) { return WhisperList.Contains(guid); }
@@ -7581,4 +7596,53 @@ namespace Game.Entities
//Clears the Menu
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);
}
}
}