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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user