diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 2756486f..90708586 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -42,6 +42,8 @@ namespace TShockAPI public Vector2 oldSpawn = Vector2.Zero; public TSPlayer LastWhisper; public int LoginAttempts { get; set; } + public bool Teleporting = false; + public Vector2 TeleportCoords = new Vector2(-1, -1); Player FakePlayer = null; @@ -148,10 +150,8 @@ namespace TShockAPI public bool Teleport(int tileX, int tileY) { InitSpawn = false; - int spawnTileX = Main.spawnTileX; - int spawnTileY = Main.spawnTileY; - Main.spawnTileX = tileX; - Main.spawnTileY = tileY; + Teleporting = true; + TeleportCoords = new Vector2(tileX, tileY); SendData(PacketTypes.WorldInfo); @@ -189,9 +189,7 @@ namespace TShockAPI } } - Main.spawnTileX = spawnTileX; - Main.spawnTileY = spawnTileY; - + Teleporting = false; SendData(PacketTypes.WorldInfo); return true; diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 70a3dccd..4c6934fa 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -103,6 +103,7 @@ namespace TShockAPI ServerHooks.Command += ServerHooks_OnCommand; NetHooks.GetData += GetData; NetHooks.GreetPlayer += OnGreetPlayer; + NetHooks.SendData += OnSendData; NpcHooks.StrikeNpc += NpcHooks_OnStrikeNpc; AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; @@ -128,6 +129,7 @@ namespace TShockAPI ServerHooks.Command -= ServerHooks_OnCommand; NetHooks.GetData -= GetData; NetHooks.GreetPlayer -= OnGreetPlayer; + NetHooks.SendData -= OnSendData; NpcHooks.StrikeNpc -= NpcHooks_OnStrikeNpc; } @@ -435,6 +437,48 @@ namespace TShockAPI } } + private void OnSendData(SendDataEventArgs e) + { + //TODO - Clean this code up + switch (e.MsgID) + { + case PacketTypes.WorldInfo: + if (e.remoteClient >= 0 && Players[e.remoteClient] != null && Players[e.remoteClient].Teleporting) + { + var stream = new MemoryStream(); + var writer = new BinaryWriter(stream); + stream.Position = 4; + writer.Write(BitConverter.GetBytes(7), 0, 1); + writer.Write(Main.dayTime); + writer.Write((byte)Main.moonPhase); + writer.Write(Main.bloodMoon); + writer.Write((int)Main.time); + writer.Write(Main.maxTilesX); + writer.Write(Main.maxTilesY); + writer.Write((int)Players[e.remoteClient].TeleportCoords.X); + writer.Write((int)Players[e.remoteClient].TeleportCoords.Y); + writer.Write((int)Main.worldSurface); + writer.Write((int)Main.rockLayer); + writer.Write(Main.worldID); + writer.Write(0 + (WorldGen.shadowOrbSmashed ? 1 : 0) + (NPC.downedBoss1 ? 2 : 0) + (NPC.downedBoss2 ? 4 : 0) + (NPC.downedBoss3 ? 8 : 0)); + writer.Write(Main.worldName); + var length = stream.Position - 5; + stream.Position = 0; + writer.Write(length); + try + { + NetMessage.buffer[e.remoteClient].spamCount++; + Netplay.serverSock[e.remoteClient].networkStream.BeginWrite(stream.GetBuffer(), 0, (int)stream.Length, new AsyncCallback(Netplay.serverSock[e.remoteClient].ServerWriteCallBack), Netplay.serverSock[e.remoteClient].networkStream); + } + catch { } + e.Handled = true; + } + break; + default: + break; + } + } + private void OnGreetPlayer(int who, HandledEventArgs e) { var player = Players[who];