Пример #1
0
 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á]"));
 }
Пример #2
0
 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!");
 }
Пример #3
0
        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); }
            });
        }
Пример #4
0
        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;
                //}
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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;
        }