private static void TranslatorToggle(CommandArgs args) { DisableTr[args.Player.Index] = !DisableTr[args.Player.Index]; TSPlayerB.SendSuccessMessage(args.Player.Index, DefaultMessage: string.Format("Now you {0} receive messages translated from other languages", !DisableTr[args.Player.Index] ? "[c/98C807:will]" : "[c/ffa500:will not]"), PortugueseMessage: string.Format("Agora você {0} receber mensagens traduzidas de outros idiomas", !DisableTr[args.Player.Index] ? "[c/98C807:irá]" : "[c/ffa500:não irá]"), SpanishMessage: string.Format("Ahora {0} mensajes traducidos de otros idiomas.", !DisableTr[args.Player.Index] ? "[c/98C807:recibirá]" : "[c/ffa500:no recibirá]")); }
private static void SyncLocalArea(CommandArgs args) { args.Player.SendTileSquare((int)args.Player.TileX, (int)args.Player.TileY, 32); TSPlayerB.SendWarningMessage(args.Player.Index, DefaultMessage: "[Hydra] Sync'd!", PortugueseMessage: "[Hydra] Sincronizado!", SpanishMessage: "[Hydra] Sincronizado!"); }
public static void OnGreetPlayer(GreetPlayerEventArgs args) { var player = TShock.Players[args.Who]; if (player == null || TShock.Users.GetUsers().Where(u => u != null && u.Name.ToLowerInvariant() == player.Name.ToLowerInvariant()).Count() >= 1 || !PConfig.EnableAutoRegister) { return; } Task.Run(() => { System.Threading.Thread.Sleep(2000); if (PConfig.AnnounceNewAccount) { foreach (TSPlayer tsplayer in TShockB.Players.Where(p => p != null && p != player)) { TSPlayerB.SendMessage(tsplayer.Index, DefaultMessage: tsplayer.TPlayer.Male ? $"yay! [c/FFD700:We have a new Terrarian with us! Be very welcome,] [c/00a0dd:{player.Name}]" : $"yay! [c/FFD700:We have a new Terrarian with us! Be very welcome,] [c/ed177a:{player.Name}]", Color.Magenta, PortugueseMessage: tsplayer.TPlayer.Male ? $"Oba! [c/FFD700:Temos um novo Terrariano conosco! Seja muito bem vindo,] [c/00a0dd:{player.Name}]" : $"Oba! [c/FFD700:Temos uma nova Terrariana conosco! Seja muito bem vinda,] [c/ed177a:{player.Name}]", SpanishMessage: tsplayer.TPlayer.Male ? $"Hurra! [c/FFD700:Tenemos un nuevo Terrario con nosotros! Sea muy bienvenido,] [c/00a0dd:{player.Name}]" : $"Hurra! [c/FFD700:Tenemos un nuevo Terrario con nosotros! Sea muy bienvenida,] [c/ed177a:{player.Name}]", EnglishMessageIfNotDefault: tsplayer.TPlayer.Male ? $"yay! [c/FFD700:We have a new Terrarian with us! Be very welcome,] [c/00a0dd:{player.Name}]" : $"yay! [c/FFD700:We have a new Terrarian with us! Be very welcome,] [c/ed177a:{player.Name}]"); } } string newPass = CreatePassword(6); Logger.doLogLang(DefaultMessage: $"Creating a new account for: {player.Name}", Hydra.Config.DebugLevel.Info, Base.CurrentHydraLanguage, _name, PortugueseMessage: $"Criando uma nova conta para: {player.Name}", SpanishMessage: $"Creando una nueva cuenta para el: {player.Name}", EnglishMessageIfNotDefault: $"Creating a new account for: {player.Name}"); try { TShock.Users.AddUser(new User( player.Name, BCrypt.Net.BCrypt.HashPassword(newPass.Trim()), player.UUID, PConfig.SelectRegisterGroupAccordingGender ? (player.TPlayer.Male ? PConfig.DefaultGroup : PConfig.FemaleDefaultGroup) : PConfig.DefaultGroup, DateTime.UtcNow.ToString("s"), DateTime.UtcNow.ToString("s"), "")); //auto login User user = TShock.Users.GetUserByName(player.Name); if (user.VerifyPassword(newPass)) { player.PlayerData = TShock.CharacterDB.GetPlayerData(player, user.ID); var group = TShock.Utils.GetGroup(user.Group); player.Group = group; player.tempGroup = null; player.User = user; player.IsLoggedIn = true; player.IgnoreActionsForInventory = "none"; if (Main.ServerSideCharacter) { if (player.HasPermission(TShockAPI.Permissions.bypassssc)) { player.PlayerData.CopyCharacter(player); TShock.CharacterDB.InsertPlayerData(player); } player.PlayerData.RestoreCharacter(player); } player.LoginFailsBySsi = false; if (player.HasPermission(TShockAPI.Permissions.ignorestackhackdetection)) { player.IgnoreActionsForCheating = "none"; } if (player.HasPermission(TShockAPI.Permissions.usebanneditem)) { player.IgnoreActionsForDisabledArmor = "none"; } player.LoginHarassed = false; TShock.Users.SetUserUUID(user, player.UUID); Logger.doLogLang(DefaultMessage: $"'{player.Name}' was automatically authenticated with the new registered account.", Hydra.Config.DebugLevel.Info, Base.CurrentHydraLanguage, _name, PortugueseMessage: $"'{player.Name}' foi autenticado automaticamente com a nova conta cadastrada.", SpanishMessage: $"'{player.Name}' se autenticó automáticamente con la nueva cuenta registrada.", EnglishMessageIfNotDefault: $"'{player.Name}' was automatically authenticated with the new registered account."); TSPlayerB.SendMessage(player.Index, DefaultMessage: "Hello! We saw that you are new so we already created your account!", Color.DeepPink, PortugueseMessage: $"Olá! Vimos que você é {(player.TPlayer.Male ? "novo" : "nova")} então já criamos a sua conta!", SpanishMessage: $"Hola! Vimos que eres {(player.TPlayer.Male ? "nuevo" : "nueva")}, así que ya creamos tu cuenta", EnglishMessageIfNotDefault: "Hello! We saw that you are new so we already created your account!"); TSPlayerB.SendMessage(player.Index, DefaultMessage: $"Your password is [c/ffa500:{newPass}], change it with [c/ffd700:/password].", Color.Red, PortugueseMessage: $"Sua senha é [c/ffa500:{newPass}], altere-a com [c/ffd700:/senha].", SpanishMessage: $"Tu contraseña es [c/ffa500:{newPass}], cambiarlo con [c/ffd700:contraseña].", EnglishMessageIfNotDefault: $"Your password is [c/ffa500:{newPass}], change it with [c/ffd700:/password]."); PlayerHooks.OnPlayerPostLogin(player); } } catch (Exception ex) { Logger.doLog(ex.ToString(), Hydra.Config.DebugLevel.Critical, _name); } }); }
internal static async void OnServerChat(ServerChatEventArgs args) { if (args.Handled) { return; } var tsplr = TShockB.Players[args.Who]; if (tsplr == null) { args.Handled = true; return; } if (args.Text.Length > 500) { TSPlayerB.SendWarningMessage(tsplr.Index, DefaultMessage: "Crash attempt via long chat packet.", PortugueseMessage: "Tentativa de exploit através de um pacote de bate-papo longo", SpanishMessage: "Intento de explotación a través de un paquete de chat largo"); //Utils.Kick(tsplr, "Crash attempt via long chat packet.", true); args.Handled = true; return; } string text = args.Text; // Terraria now has chat commands on the client side. // These commands remove the commands prefix (e.g. /me /playing) and send the command id instead // In order for us to keep legacy code we must reverse this and get the prefix using the command id //Not in Terraria 1.3.0 //foreach (var item in Terraria.UI.Chat.ChatManager.Commands._localizedCommands) //{ // if (item.Value._name == args.CommandId._name) // { // if (!String.IsNullOrEmpty(text)) // { // text = item.Key.Value + ' ' + text; // } // else // { // text = item.Key.Value; // } // break; // } //} if ((text.StartsWith(TShock.Config.CommandSpecifier) || text.StartsWith(TShock.Config.CommandSilentSpecifier)) && !string.IsNullOrWhiteSpace(text.Substring(1))) { try { args.Handled = true; if (!TShockAPI.Commands.HandleCommand(tsplr, text)) { // This is required in case anyone makes HandleCommand return false again TSPlayerB.SendErrorMessage(tsplr.Index, DefaultMessage: "The command could not be parsed.", PortugueseMessage: "O comando não pôde ser analisado.", SpanishMessage: "El comando no se pudo analizar."); Logger.doLogLang(DefaultMessage: $"Unable to parse command '{text}' from player '{tsplr.Name}'.", Hydra.Config.DebugLevel.Error, (TSPlayerB.Language)Enum.Parse(typeof(TSPlayerB.Language), Base.Config.DefaultHydraLanguage), _name, PortugueseMessage: $"Não foi possível parsear o comando '{text}' executado pelo jogador '{tsplr.Name}'.", SpanishMessage: $"El comando no se pudo analizar '{text}' realizado por el jugador '{tsplr.Name}'."); } } catch (Exception ex) { Logger.doLogLang(DefaultMessage: $"An exception occurred executing a command.", Hydra.Config.DebugLevel.Critical, (TSPlayerB.Language)Enum.Parse(typeof(TSPlayerB.Language), Base.Config.DefaultHydraLanguage), _name, PortugueseMessage: $"Ocorreu uma exceção ao executar um comando.", SpanishMessage: $"Se produjo una excepción al ejecutar un comando."); TShock.Log.Error(ex.ToString()); } } else { if (TShock.Config.EnableChatAboveHeads) { TShock.Config.EnableChatAboveHeads = false; Logger.doLog($"ChatAboveHeads not yet implemented in {_name}, using default", Hydra.Config.DebugLevel.Critical, _name); } if (!tsplr.HasPermission(TShockAPI.Permissions.canchat)) { args.Handled = true; } else if (tsplr.mute) { TSPlayerB.SendErrorMessage(tsplr.Index, DefaultMessage: "You have been muted!", PortugueseMessage: "Você foi silenciado!", SpanishMessage: "Has sido silenciado!"); args.Handled = true; } else if (!TShock.Config.EnableChatAboveHeads) { string PreNSuf = $"{tsplr.Group.Prefix}{tsplr.Name}{tsplr.Group.Suffix}: "; await Broadcast(PreNSuf, args.Text, tsplr.Group.R, tsplr.Group.G, tsplr.Group.B, tsplr, args); //text = String.Format(Config.ChatFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix, // args.Text); //Hooks.PlayerHooks.OnPlayerChat(tsplr, args.Text, ref text); //Utils.Broadcast(text, tsplr.Group.R, tsplr.Group.G, tsplr.Group.B); //var hexValue = tsplr.Group.R.ToString("X2") + tsplr.Group.G.ToString("X2") + tsplr.Group.B.ToString("X2"); //string c = Convert.ToInt32(hexValue, 16).ToString(); args.Handled = true; } //else //{ // Player ply = Main.player[args.Who]; // string name = ply.name; // ply.name = String.Format(TShock.Config.ChatAboveHeadsFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix); // //Update the player's name to format text nicely. This needs to be done because Terraria automatically formats messages against our will // NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, -1, NetworkText.FromLiteral(ply.name), args.Who, 0, 0, 0, 0); // //Give that poor player their name back :'c // ply.name = name; // PlayerHooks.OnPlayerChat(tsplr, args.Text, ref text); // NetMessage.SendData((int)PacketTypes.ChatText, -1, args.Who, text, args.Who, tsplr.Group.R, tsplr.Group.G, tsplr.Group.B); // NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, -1, name, args.Who, 0, 0, 0, 0); // //Downgrade to 1.3.0 // ////This netpacket is used to send chat text from the server to clients, in this case on behalf of a client // //Terraria.Net.NetPacket packet = Terraria.GameContent.NetModules.NetTextModule.SerializeServerMessage( // // NetworkText.FromLiteral(text), new Color(tsplr.Group.R, tsplr.Group.G, tsplr.Group.B), (byte)args.Who // //); // ////Broadcast to everyone except the player who sent the message. // ////This is so that we can send them the same nicely formatted message that everyone else gets // //Terraria.Net.NetManager.Instance.Broadcast(packet, args.Who); // //Reset their name // //NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, -1, NetworkText.FromLiteral(name), args.Who, 0, 0, 0, 0); // string msg = String.Format("<{0}> {1}", // String.Format(TShock.Config.ChatAboveHeadsFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix), // text // ); ; // //Send the original sender their nicely formatted message, and do all the loggy things // tsplr.SendMessage(msg, tsplr.Group.R, tsplr.Group.G, tsplr.Group.B); // TSPlayer.Server.SendMessage(msg, tsplr.Group.R, tsplr.Group.G, tsplr.Group.B); // TShock.Log.Info("Broadcast: {0}", msg); // args.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); }
public static void OnGreetPlayer(GreetPlayerEventArgs args) { var player = TShockB.Players[args.Who]; if (player == null) { args.Handled = true; return; } string playername = $"[c/4747BF:{player.Name}]"; if (!Main.player[player.Index].Male) { playername = $"[c/800080:{player.Name}]"; } string via = "[c/ff4500:(via PC)]"; if (TSPlayerB.isMobile[player.Index]) { via = "[c/ff198d:(via Mobile)]"; } string country = $" ({player.Country})"; if (country.Contains("N/A") || !TShock.Config.EnableGeoIP) { country = string.Empty; } if (!player.SilentJoinInProgress) { TShockB.AllSendMessage(DefaultMessage: $"{playername}{country} has joined the server {via}!", Color.White, PortugueseMessage: $"{playername}{country} entrou no servidor {via}!", SpanishMessage: $"{playername}{country} entró al servidor {(via.Contains("(via PC)") ? "[c/ff4500:(a través de PC)]" : "[c/ff198d:(vía teléfono móvil)]")}!", ignore: player); } Logger.doLog($"{player.Name}{country} has joined the server {(TSPlayerB.isMobile[player.Index] ? "(via Mobile)" : "(via PC)")}!", Config.DebugLevel.Info); if (TShock.Config.DisplayIPToAdmins) { TShock.Utils.SendLogs(string.Format("{0} IP => {1}", player.Name, player.IP), Color.Blue); } TSPlayerB.SendFileTextAsMessage(player.Index, FileToolsB.MotdPath); string pvpMode = TShock.Config.PvPMode.ToLowerInvariant(); if (pvpMode == "always") { player.TPlayer.hostile = true; player.SendData(PacketTypes.TogglePvp, "", player.Index); TSPlayer.All.SendData(PacketTypes.TogglePvp, "", player.Index); } if (!player.IsLoggedIn) { if (Main.ServerSideCharacter) { TSPlayerB.IsDisabledForSSC[player.Index] = true; TSPlayerB.SendErrorMessage(player.Index, DefaultMessage: String.Format("Server side characters is enabled!\nPlease [c/ffd700:{0}register] or [c/ffd700:{0}login] to play!", TShockAPI.Commands.Specifier), PortugueseMessage: "SSC está ativo neste servidor.\nEfetue [c/ffd700:{TShockAPI.Commands.Specifier}registro] ou [c/ffd700:{TShockAPI.Commands.Specifier}login] para jogar.", SpanishMessage: $"SSC está activo en este servidor.\nInicia [c/ffd700:{TShockAPI.Commands.Specifier}sesión] o [c/ffd700:{TShockAPI.Commands.Specifier}registrarse] para jugar"); player.LoginHarassed = true; } else if (TShock.Config.RequireLogin) { TSPlayerB.SendErrorMessage(player.Index, DefaultMessage: $"Please [c/ffd700:{TShockAPI.Commands.Specifier}register] or [c/ffd700:{TShockAPI.Commands.Specifier}login] to play!", PortugueseMessage: $"Efetue [c/ffd700:{TShockAPI.Commands.Specifier}registro] ou [c/ffd700:{TShockAPI.Commands.Specifier}login] para jogar.", SpanishMessage: $"Inicia [c/ffd700:{TShockAPI.Commands.Specifier}sesión] o [c/ffd700:{TShockAPI.Commands.Specifier}registrarse] para jugar"); player.LoginHarassed = true; } } player.LastNetPosition = new Vector2(Main.spawnTileX * 16f, Main.spawnTileY * 16f); if (TShock.Config.RememberLeavePos && (TShock.RememberedPos.GetLeavePos(player.Name, player.IP) != Vector2.Zero) && !player.LoginHarassed) { player.RPPending = 1; TSPlayerB.SendInfoMessage(player.Index, DefaultMessage: "You will be teleported to your last known location...", PortugueseMessage: "Você será teleportado para sua última localização...", SpanishMessage: "Serás teletransportado a tu última ubicación..."); } args.Handled = true; }