diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index e3314934..e53473d4 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -696,8 +696,6 @@ namespace TShockAPI if (args.Player.Teleport(Main.spawnTileX, Main.spawnTileY)) args.Player.SendMessage("Teleported to the map's spawnpoint."); - else - args.Player.SendMessage("Teleport unavailable - Spawn point set to Bed. To unset, destroy Bed and suicide at least once.", Color.Red); } private static void TP(CommandArgs args) @@ -725,8 +723,6 @@ namespace TShockAPI var plr = players[0]; if (args.Player.Teleport(plr.TileX, plr.TileY + 3)) args.Player.SendMessage(string.Format("Teleported to {0}", plr.Name)); - else - args.Player.SendMessage("Teleport unavailable - Spawn point set to Bed. To unset, destroy Bed and suicide at least once.", Color.Red); } } @@ -762,8 +758,6 @@ namespace TShockAPI plr.SendMessage(string.Format("You were teleported to {0}.", plr.Name)); args.Player.SendMessage(string.Format("You brought {0} here.", plr.Name)); } - else - args.Player.SendMessage("Teleport unavailable - Target player has spawn point set to Bed.", Color.Red); } } @@ -851,9 +845,6 @@ namespace TShockAPI { if (args.Player.Teleport((int)warp.X, (int)warp.Y + 3)) args.Player.SendMessage("Warped to " + warpName, Color.Yellow); - else - args.Player.SendMessage("Warp unavailable - Spawn point set to Bed. To unset, destroy Bed and suicide at least once.", Color.Red); - } else { diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 0910422c..c25eca69 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -39,6 +39,7 @@ namespace TShockAPI public DateTime LastExplosive { get; set; } public bool InitSpawn = false; public bool DisplayLogs = true; + public Vector2 oldSpawn = Vector2.Zero; public bool RealPlayer { @@ -142,26 +143,48 @@ namespace TShockAPI int spawnTileY = Main.spawnTileY; Main.spawnTileX = tileX; Main.spawnTileY = tileY; - SendData(PacketTypes.WorldInfo); - SendTileSquare(tileX, tileY, 50); + SendData(PacketTypes.WorldInfo); + + //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) + SendTileSquare(tileX, tileY, 150); if (TPlayer.SpawnX > 0 && TPlayer.SpawnY > 0) { - Main.tile[TPlayer.SpawnX, TPlayer.SpawnY].active = false; - NetMessage.SendTileSquare(Index, TPlayer.SpawnX, TPlayer.SpawnY, 1); + int spX = TPlayer.SpawnX; + int spY = TPlayer.SpawnY; + Main.tile[spX, spY].active = false; + SendTileSquare(spX, spY); Spawn(); - Main.tile[TPlayer.SpawnX, TPlayer.SpawnY].active = true; - NetMessage.SendTileSquare(Index, TPlayer.SpawnX, TPlayer.SpawnY, 1); - SendMessage("Warning! Your bed spawn point has been destroyed because of warp", Color.Red); + Main.tile[spX, spY].active = true; + SendTileSquare(spX, spY); + oldSpawn = new Vector2(spX, spY); } else { - Spawn(); + //Checks if Player has spawn point set (Server may think player does not have spawn) + if (oldSpawn != Vector2.Zero) + { + Main.tile[(int)oldSpawn.X, (int)oldSpawn.Y].active = false; + SendTileSquare((int)oldSpawn.X, (int)oldSpawn.Y); + Spawn(); + Main.tile[(int)oldSpawn.X, (int)oldSpawn.Y].active = true; + SendTileSquare((int)oldSpawn.X, (int)oldSpawn.Y); + NetMessage.syncPlayers(); + } + //Player has no spawn point set + else + { + Spawn(); + } } Main.spawnTileX = spawnTileX; Main.spawnTileY = spawnTileY; + SendData(PacketTypes.WorldInfo); + return true; }