diff --git a/TShockAPI/PacketBufferer.cs b/TShockAPI/PacketBufferer.cs index 72b1bb5b..4778e9dd 100644 --- a/TShockAPI/PacketBufferer.cs +++ b/TShockAPI/PacketBufferer.cs @@ -91,32 +91,49 @@ namespace TShockAPI } void GameHooks_Update(GameTime obj) + { + FlushAll(); + } + + public void FlushAll() { for (int i = 0; i < Netplay.serverSock.Length; i++) { - if (Netplay.serverSock[i] == null || !Netplay.serverSock[i].active) - continue; - - if (!Netplay.serverSock[i].tcpClient.Client.Poll(0, SelectMode.SelectWrite)) - continue; - - byte[] buff = buffers[i].GetBytes(BytesPerUpdate); - if (buff == null) - continue; - - try - { - Netplay.serverSock[i].tcpClient.Client.Send(buff); - } - catch (ObjectDisposedException) - { - } - catch (SocketException) - { - } + Flush(Netplay.serverSock[i]); } } + public bool Flush(ServerSock socket) + { + try + { + if (socket == null || !socket.active) + return false; + + if (!socket.tcpClient.Client.Poll(0, SelectMode.SelectWrite)) + return false; + + byte[] buff = buffers[socket.whoAmI].GetBytes(BytesPerUpdate); + if (buff == null) + return false; + + + socket.tcpClient.Client.Send(buff); + return true; + } + catch (ObjectDisposedException) + { + } + catch (SocketException) + { + } + catch (Exception e) + { + Log.ConsoleError(e.ToString()); + } + return false; + } + void ServerHooks_SocketReset(ServerSock socket) { diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 9cacefe0..a59fbc57 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -156,6 +156,16 @@ namespace TShockAPI public virtual void Disconnect(string reason) { SendData(PacketTypes.Disconnect, reason); + Flush(); + } + + public virtual void Flush() + { + var sock = Netplay.serverSock[Index]; + if (sock == null) + return; + + TShock.PacketBuffer.Flush(sock); } diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 68cd999d..397a7ab7 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -63,7 +63,7 @@ namespace TShockAPI public static ConfigFile Config { get; set; } public static IDbConnection DB; public static bool OverridePort; - static PacketBufferer bufferer; + public static PacketBufferer PacketBuffer; /// /// Called after TShock is initialized. Useful for plugins that needs hooks before tshock but also depend on tshock being loaded. @@ -178,7 +178,7 @@ namespace TShockAPI ServerHooks.Leave += OnLeave; ServerHooks.Chat += OnChat; ServerHooks.Command += ServerHooks_OnCommand; - NetHooks.GetData += GetData; + NetHooks.GetData += OnGetData; NetHooks.GreetPlayer += OnGreetPlayer; NpcHooks.StrikeNpc += NpcHooks_OnStrikeNpc; @@ -187,7 +187,7 @@ namespace TShockAPI //RconHandler.StartThread(); if (Config.BufferPackets) - bufferer = new PacketBufferer(); + PacketBuffer = new PacketBufferer(); Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); Log.ConsoleInfo("Backups " + (Backups.Interval > 0 ? "Enabled" : "Disabled")); @@ -211,7 +211,7 @@ namespace TShockAPI ServerHooks.Leave -= OnLeave; ServerHooks.Chat -= OnChat; ServerHooks.Command -= ServerHooks_OnCommand; - NetHooks.GetData -= GetData; + NetHooks.GetData -= OnGetData; NetHooks.GreetPlayer -= OnGreetPlayer; NpcHooks.StrikeNpc -= NpcHooks_OnStrikeNpc; if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) @@ -550,7 +550,7 @@ namespace TShockAPI } } - private void GetData(GetDataEventArgs e) + private void OnGetData(GetDataEventArgs e) { if (e.Handled) return; @@ -569,8 +569,7 @@ namespace TShockAPI return; } - //if (type == PacketTypes.SyncPlayers) - //Debug.WriteLine("Recv: {0:X} ({2}): {3} ({1:XX})", player.Index, (byte)type, player.TPlayer.dead ? "dead " : "alive", type.ToString()); + //Debug.WriteLine("Recv: {0:X} ({2}): {3} ({1:XX})", player.Index, (byte)type, player.TPlayer.dead ? "dead " : "alive", type); // Stop accepting updates from player as this player is going to be kicked/banned during OnUpdate (different thread so can produce race conditions) if ((Config.BanKillTileAbusers || Config.KickKillTileAbusers) && @@ -655,9 +654,9 @@ namespace TShockAPI /// False on exception public static bool SendBytes(ServerSock client, byte[] bytes) { - if (bufferer != null) + if (PacketBuffer != null) { - bufferer.SendBytes(client, bytes); + PacketBuffer.SendBytes(client, bytes); return true; }