diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 253036b8..2be3728a 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -482,7 +482,7 @@ namespace TShockAPI if (TShock.RememberedPos.GetLeavePos(args.Player.Name, args.Player.IP) != Vector2.Zero) { Vector2 pos = TShock.RememberedPos.GetLeavePos(args.Player.Name, args.Player.IP); - args.Player.Teleport((int)pos.X, (int)pos.Y + 3); + args.Player.Teleport((int)pos.X*16, (int)pos.Y *16 + 48); } args.Player.LoginHarassed = false; @@ -1633,7 +1633,7 @@ namespace TShockAPI private static void Spawn(CommandArgs args) { - if (args.Player.Teleport(Main.spawnTileX, Main.spawnTileY)) + if (args.Player.Teleport(Main.spawnTileX*16, Main.spawnTileY*16)) args.Player.SendSuccessMessage("Teleported to the map's spawnpoint."); } @@ -1645,29 +1645,39 @@ namespace TShockAPI return; } - string plStr = String.Join(" ", args.Parameters); - var players = TShock.Utils.FindPlayer(plStr); - if (players.Count == 0) - args.Player.SendErrorMessage("Invalid player!"); - else if (players.Count > 1) - TShock.Utils.SendMultipleMatchError(args.Player, players.Select(p => p.Name)); - else if (!players[0].TPAllow && !args.Player.Group.HasPermission(Permissions.tpall)) + if (args.Parameters.Count < 2) { - var plr = players[0]; - args.Player.SendErrorMessage(plr.Name + " has prevented users from teleporting to them."); - plr.SendInfoMessage(args.Player.Name + " attempted to teleport to you."); + string plStr = String.Join(" ", args.Parameters); + var players = TShock.Utils.FindPlayer(plStr); + if (players.Count == 0) + args.Player.SendErrorMessage("Invalid player!"); + else if (players.Count > 1) + TShock.Utils.SendMultipleMatchError(args.Player, players.Select(p => p.Name)); + else if (!players[0].TPAllow && !args.Player.Group.HasPermission(Permissions.tpall)) + { + var plr = players[0]; + args.Player.SendErrorMessage(plr.Name + " has prevented users from teleporting to them."); + plr.SendInfoMessage(args.Player.Name + " attempted to teleport to you."); + } + else + { + var plr = players[0]; + if (args.Player.Teleport(plr.TileX*16, plr.TileY*16 + 48)) + { + args.Player.SendSuccessMessage(string.Format("Teleported to {0}.", plr.Name)); + if (!args.Player.Group.HasPermission(Permissions.tphide)) + plr.SendInfoMessage(args.Player.Name + " teleported to you."); + } + } } else { - var plr = players[0]; - if (args.Player.Teleport(plr.TileX, plr.TileY + 3)) - { - args.Player.SendSuccessMessage(string.Format("Teleported to {0}.", plr.Name)); - if (!args.Player.Group.HasPermission(Permissions.tphide)) - plr.SendInfoMessage(args.Player.Name + " teleported to you."); - } + float x = float.Parse(args.Parameters[0]); + float y = float.Parse(args.Parameters[1]); + args.Player.Teleport(x, y); + args.Player.SendSuccessMessage("Teleported!"); } - } + } private static void TPHere(CommandArgs args) { @@ -1686,7 +1696,7 @@ namespace TShockAPI { if (Main.player[i].active && (Main.player[i] != args.TPlayer)) { - if (TShock.Players[i].Teleport(args.Player.TileX, args.Player.TileY + 3)) + if (TShock.Players[i].Teleport(args.Player.TileX*16, args.Player.TileY*16 + 48)) TShock.Players[i].SendSuccessMessage(string.Format("You were teleported to {0}.", args.Player.Name) + "."); } } @@ -1705,7 +1715,7 @@ namespace TShockAPI else { var plr = players[0]; - if (plr.Teleport(args.Player.TileX, args.Player.TileY + 3)) + if (plr.Teleport(args.Player.TileX*16, args.Player.TileY*16 + 48)) { plr.SendInfoMessage(string.Format("You were teleported to {0}.", args.Player.Name)); args.Player.SendSuccessMessage(string.Format("You brought {0} here.", plr.Name)); @@ -1849,7 +1859,7 @@ namespace TShockAPI var plr = foundplr[0]; if (warp.WarpPos != Vector2.Zero) { - if (plr.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3)) + if (plr.Teleport((int)warp.WarpPos.X*16, (int)warp.WarpPos.Y*16 + 48)) { plr.SendSuccessMessage(string.Format("{0} warped you to {1}.", args.Player.Name, warpName)); args.Player.SendSuccessMessage(string.Format("You warped {0} to {1}.", plr.Name, warpName)); @@ -1867,7 +1877,7 @@ namespace TShockAPI var warp = TShock.Warps.FindWarp(warpName); if (warp.WarpPos != Vector2.Zero) { - if (args.Player.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3)) + if (args.Player.Teleport((int)warp.WarpPos.X*16, (int)warp.WarpPos.Y*16 + 48)) args.Player.SendSuccessMessage("Warped to " + warpName + "."); } else @@ -3025,7 +3035,7 @@ namespace TShockAPI break; } - args.Player.Teleport(region.Area.Center.X, region.Area.Center.Y + 3); + args.Player.Teleport(region.Area.Center.X*16, region.Area.Center.Y*16 + 48); break; } diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 6652060a..2f08c917 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -2037,8 +2037,8 @@ namespace TShockAPI args.Player.SendMessage("PvP is forced! Enable PvP or else you can't do anything!", Color.Red); } - int lastTileX = (int) (args.Player.LastNetPosition.X/16f); - int lastTileY = (int) (args.Player.LastNetPosition.Y/16f); + var lastTileX = args.Player.LastNetPosition.X; + var lastTileY = args.Player.LastNetPosition.Y; if (!args.Player.Teleport(lastTileX, lastTileY)) { args.Player.Spawn(); @@ -2057,9 +2057,9 @@ namespace TShockAPI TSCheckNoclip(pos, args.TPlayer.width, args.TPlayer.height) && !TShock.Config.IgnoreNoClip && !args.TPlayer.tongued) { - int lastTileX = (int)(args.Player.LastNetPosition.X / 16f); - int lastTileY = (int)(args.Player.LastNetPosition.Y / 16f); - if (!args.Player.Teleport(lastTileX, lastTileY + 3)) + var lastTileX = args.Player.LastNetPosition.X; + var lastTileY = args.Player.LastNetPosition.Y; + if (!args.Player.Teleport(lastTileX, lastTileY + 48)) { args.Player.SendErrorMessage("You got stuck in a solid object, Sent to spawn point."); args.Player.Spawn(); diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 1cf6d7a9..5adc563c 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -505,38 +505,10 @@ namespace TShockAPI } } - public bool Teleport(int tilex, int tiley) + public bool Teleport(float x, float y) { - InitSpawn = false; - - SendWorldInfo(tilex, tiley, true); - - //150 Should avoid all client crash errors - //The error occurs when a tile trys to update which the client hasnt load yet, Clients only update tiles withen 150 blocks - //Try 300 if it does not work (Higher number - Longer load times - Less chance of error) - //Should we properly send sections so that clients don't get tiles twice? - SendTileSquare(tilex, tiley, 150); - -/* //We shouldn't need this section anymore -it can prevent otherwise acceptable teleportation under some circumstances. - - if (!SendTileSquare(tilex, tiley, 150)) - { - InitSpawn = true; - SendWorldInfo(Main.spawnTileX, Main.spawnTileY, false); - return false; - } - -*/ - Spawn(-1, -1); - - SendWorldInfo(Main.spawnTileX, Main.spawnTileY, false); - - TPlayer.position.X = (float)(tilex * 16 + 8 - TPlayer.width /2); - TPlayer.position.Y = (float)(tiley * 16 - TPlayer.height); - //We need to send the tile data again to prevent clients from thinking they *really* destroyed blocks just now. - - SendTileSquare(tilex, tiley, 10); - + TPlayer.Teleport(new Vector2(x, y), 1); + NetMessage.SendData(65, -1, -1, "", 0, (float)TPlayer.whoAmi, x, y, 1); return true; } diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 602cf63b..35ec714f 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -639,12 +639,11 @@ namespace TShockAPI break; } } - int count = 0; + foreach (TSPlayer player in Players) { if (player != null && player.Active) { - count++; if (player.TilesDestroyed != null) { if (player.TileKillThreshold >= Config.TileKillThreshold) @@ -1073,7 +1072,7 @@ namespace TShockAPI if (RememberedPos.GetLeavePos(player.Name, player.IP) != Vector2.Zero){ var pos = RememberedPos.GetLeavePos(player.Name, player.IP); - player.Teleport((int) pos.X, (int) pos.Y + 3); + player.Teleport(pos.X*16, pos.Y*16 + 48); }} args.Handled = true;