public static void OnChat(ServerChatEventArgs args) { TSPlayer plr = TShock.Players[args.Who]; string text; if (SurvivalCore.IsChatEvent && SurvivalCore.ChatEventWord == args.Text) { SurvivalCore.ChatEventStoper.Stop(); TSPlayer.All.SendMessage($"[i:889] [c/595959:;] [c/00cc66:Event] [c/595959:;] [c/00cc66:{TShock.Players[args.Who].Name}] napisal najszybciej [c/00cc66:{SurvivalCore.ChatEventWord}] i wygral {chatEventWinAmount} €. [c/595959:(]{Math.Round(SurvivalCore.ChatEventStoper.Elapsed.TotalSeconds, 3)} sec[c/595959:)]", new Color(128, 255, 191)); TSPlayer.All.SendData(PacketTypes.CreateCombatTextExtended, "Brawo!", (int)Color.LimeGreen.PackedValue, TShock.Players[args.Who].X, TShock.Players[args.Who].Y); SurvivalCore.SrvPlayers[args.Who].Money += chatEventWinAmount; SurvivalCore.IsChatEvent = false; SurvivalCore.ChatEventTimer = DateTime.UtcNow; SurvivalCore.ChatEventStoper.Reset(); } try { try { text = string.Format(ChatFormat, (SurvivalCore.SrvPlayers[args.Who].PrefixItem == -1) ? PowelderAPI.Utils.GetGroupItem(plr.Group.Name) : SurvivalCore.SrvPlayers[args.Who].PrefixItem, PowelderAPI.Utils.GetGroupColor(plr.Group.Name), (plr.Group.Name == "Xedlefix" || plr.Group.Name == "Iwobos") ? "Zalozyciel" : plr.Group.Name, SurvivalCore.SrvPlayers[args.Who].NickColor ?? PowelderAPI.Utils.GetGroupColor(plr.Group.Name), plr.Name, args.Text); } catch (NullReferenceException) { text = string.Format(ChatFormat, PowelderAPI.Utils.GetGroupItem(plr.Group.Name), PowelderAPI.Utils.GetGroupColor(plr.Group.Name), plr.Group.Name, PowelderAPI.Utils.GetGroupColor(plr.Group.Name), plr.Name, args.Text); } PlayerHooks.OnPlayerChat(plr, args.Text, ref text); TSPlayer.All.SendMessage(text, plr.Group.R, plr.Group.G, plr.Group.B); TSPlayer.Server.SendMessage(string.Format(((plr.Group.Name == "Xedlefix" || plr.Group.Name == "Iwobos") ? "Zalozyciel" : plr.Group.Name) + " " + plr.Name + ": " + args.Text), byte.MaxValue, byte.MaxValue, byte.MaxValue); TShock.Log.Info(((plr.Group.Name == "Xedlefix" || plr.Group.Name == "Iwobos") ? "Zalozyciel" : plr.Group.Name) + " " + plr.Name + ": " + args.Text); args.Handled = true; } catch (FormatException) { args.Handled = true; } }
void OnChat(ServerChatEventArgs e) { if (e.Handled) { return; } // A quick check to reduce DB work when this feature isn't in use if (String.IsNullOrWhiteSpace(Config.ContributorChatFormat)) { return; } var player = TShock.Players[e.Who]; if (player == null || !player.Active || !player.IsLoggedIn || !player.ContainsData(Contributor.DataKey)) { return; } if (e.Text.Length > 500) { return; } // If true, the message is a command, so we skip it if ((e.Text.StartsWith(TShockAPI.Commands.Specifier) || e.Text.StartsWith(TShockAPI.Commands.SilentSpecifier)) && !String.IsNullOrWhiteSpace(e.Text.Substring(1))) { return; } // Player needs to be able to talk, not be muted, and must be logged in if (!player.HasPermission(TShockAPI.Permissions.canchat) || player.mute || !player.IsLoggedIn) { return; } // At this point, ChatAboveHeads is not supported, but it could be a thing in the future if (!TShock.Config.EnableChatAboveHeads) { Contributor con = player.GetData <Contributor>(Contributor.DataKey); Tier tier = Tiers.Get(con.Tier); /* Contributor chat format: * {0} - group name * {1} - group prefix * {2} - player name * {3} - group suffix * {4} - message text * {5} - tier shortname * {6} - tier name * {7} - webID */ var text = String.Format(Config.ContributorChatFormat, player.Group.Name, player.Group.Prefix, player.Name, player.Group.Suffix, e.Text, tier.ShortName ?? "", tier.Name ?? "", con.XenforoId ?? -1); PlayerHooks.OnPlayerChat(player, e.Text, ref text); Color?color = con.ChatColor; if (!color.HasValue) { #region DEBUG #if DEBUG TShock.Log.ConsoleInfo("OnChat: Contributor color was null"); #endif #endregion // If the contributor doesn't have a custom chat color, check their tier color = tier.ChatColor; if (!color.HasValue) { // As neither the tier nor the contributor have a custom chat color, use the group's default color = new Color(player.Group.R, player.Group.G, player.Group.B); } } TShock.Utils.Broadcast(text, color.Value.R, color.Value.G, color.Value.B); #region #if DEBUG TShock.Log.ConsoleInfo("OnChat: Contributor was handled by CTRS"); #endif #endregion e.Handled = true; } }
internal static async Task Broadcast(string PreNSuf, string Message, byte r, byte g, byte b, TSPlayer tsplr, ServerChatEventArgs args) { args.Handled = true; string OriginalMessage = $"{PreNSuf}{Message}"; TShock.Log.Info(string.Format("Broadcast: {0}", OriginalMessage)); string text = String.Format(PConfig.ChatFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix, args.Text); bool[] PlayerLangOn = new bool[3]; //0 = EN | 1 = PT | 2 = ES string[] TrMessage = new string[3]; //0 = EN | 1 = PT | 2 = ES if (!PConfig.Enabled) { Color c = new Color(r, g, b); TShockB.AllSendMessage(OriginalMessage, c); Logger.WriteLine($"[{Logger.DateTimeNow}] [CHAT] {System.Text.RegularExpressions.Regex.Replace(OriginalMessage, @"\[c\/[a-f0-9]{6}:([^\]]+)]", @"$1")}", ConsoleColor.DarkGreen); PlayerHooks.OnPlayerChat(tsplr, args.Text, ref text); return; } TSPlayerB.SendMessage(tsplr.Index, OriginalMessage, r, g, b); if (!PConfig.ConsoleChatTranslate) { Logger.WriteLine($"[{Logger.DateTimeNow}] [CHAT] {System.Text.RegularExpressions.Regex.Replace(OriginalMessage, @"\[c\/[a-f0-9]{6}:([^\]]+)]", @"$1")}", ConsoleColor.DarkGreen); } foreach (var plr in TShockB.Players.Where(p => p != null && p.Active)) { PlayerLangOn[(int)Enum.Parse(typeof(TSPlayerB.Language), Base.Config.DefaultHydraLanguage)] = true; if (PlayerLangOn[0] && PlayerLangOn[1] && PlayerLangOn[2]) { break; } switch (TSPlayerB.PlayerLanguage[plr.Index]) { case TSPlayerB.Language.English: PlayerLangOn[0] = true; break; case TSPlayerB.Language.Portuguese: PlayerLangOn[1] = true; break; case TSPlayerB.Language.Spanish: PlayerLangOn[2] = true; break; } } try { if (!string.IsNullOrWhiteSpace(Message)) { foreach (var Data in PConfig.WordsReplaces) { Message = System.Text.RegularExpressions.Regex.Replace(Message, $@"\b{Data.From}\b", Data.To); } var translator = new GoogleTranslateFreeApi.GoogleTranslator(); GoogleTranslateFreeApi.Language from = GoogleTranslateFreeApi.Language.Auto; for (int i = 0; i < PlayerLangOn.Count(); i++) { if (i == (int)TSPlayerB.PlayerLanguage[tsplr.Index]) { TrMessage[i] = $"{OriginalMessage}{SuccessTag()}"; continue; } if (PlayerLangOn[i]) { GoogleTranslateFreeApi.Language to = GoogleTranslateFreeApi.Language.English; switch (i) { case 1: to = GoogleTranslateFreeApi.Language.Portuguese; break; case 2: to = GoogleTranslateFreeApi.Language.Spanish; break; } var result = await translator.TranslateLiteAsync(Message, from, to); TrMessage[i] = $"{PreNSuf}{result.MergedTranslation}{SuccessTag()}"; } } if (PConfig.ConsoleChatTranslate) { Logger.WriteLine($"[{Logger.DateTimeNow}] [CHAT] {System.Text.RegularExpressions.Regex.Replace(TrMessage[(int)Enum.Parse(typeof(TSPlayerB.Language), Base.Config.DefaultHydraLanguage)], @"\[c\/[a-f0-9]{6}:([^\]]+)]", @"$1")}", ConsoleColor.DarkGreen); } } else { return; } } catch (Exception ex) { for (int i = 0; i < PlayerLangOn.Count(); i++) { if (PlayerLangOn[i]) { TrMessage[i] = $"{OriginalMessage}{ErrorTag()}"; } } if (PConfig.ConsoleChatTranslate) { Logger.WriteLine($"[{Logger.DateTimeNow}] [CHAT] {System.Text.RegularExpressions.Regex.Replace(TrMessage[(int)Enum.Parse(typeof(TSPlayerB.Language), Base.Config.DefaultHydraLanguage)], @"\[c\/[a-f0-9]{6}:([^\]]+)]", @"$1")}", ConsoleColor.DarkRed); } Logger.doLog($"[Hydra.ChatTranslator] {ex.Message}", Hydra.Config.DebugLevel.Error, _name); } Parallel.ForEach(TShock.Players.Where(p => p != null && p != tsplr /*&& p.Active*/), fchplr => { if (DisableTr[fchplr.Index]) { TSPlayerB.SendMessage(fchplr.Index, OriginalMessage, r, g, b); } else if (TSPlayerB.PlayerLanguage[tsplr.Index] == TSPlayerB.PlayerLanguage[fchplr.Index]) { TSPlayerB.SendMessage(fchplr.Index, $"{OriginalMessage}{(TrMessage[(int)TSPlayerB.PlayerLanguage[fchplr.Index]].Contains("[c/ff0000:(X)])") ? "[c/ff0000:(X)])" : "")}" /*TrMessage[(int)TSPlayerB.PlayerLanguage[fchplr.Index]]*/, r, g, b); } else if (TSPlayerB.PlayerLanguage[tsplr.Index] != TSPlayerB.PlayerLanguage[fchplr.Index]) { TSPlayerB.SendMessage(fchplr.Index, TrMessage[(int)TSPlayerB.PlayerLanguage[fchplr.Index]], r, g, b); } }); PlayerHooks.OnPlayerChat(tsplr, args.Text, ref text); }