From fc329e21ca00596066730399c061944aba6a1ef3 Mon Sep 17 00:00:00 2001 From: Cai <13110818005@qq.com> Date: Wed, 17 Dec 2025 23:19:49 +0800 Subject: [PATCH 1/4] fix: allow dead hardcore players to move as ghosts closed: #3147 --- TShockAPI/Bouncer.cs | 6 +++--- TShockAPI/TShock.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs index 488abe617..a17ceccfc 100644 --- a/TShockAPI/Bouncer.cs +++ b/TShockAPI/Bouncer.cs @@ -582,8 +582,8 @@ internal void OnPlayerUpdate(object sender, GetDataHandlers.PlayerUpdateEventArg return; } - // Corpses don't move - if (args.Player.Dead) + // Corpses don't move, but ghost + if (args.Player.Dead && args.Player.Difficulty != 2) { TShock.Log.ConsoleDebug(GetString("Bouncer / OnPlayerUpdate rejected from (corpses don't move) {0}", args.Player.Name)); args.Handled = true; @@ -2505,7 +2505,7 @@ internal void OnPlaceItemFrame(object sender, GetDataHandlers.PlaceItemFrameEven Main.item[num].playerIndexTheItemIsReservedFor = args.Player.Index; NetMessage.SendData((int)PacketTypes.ItemDrop, args.Player.Index, -1, NetworkText.Empty, num, 1f); NetMessage.SendData((int)PacketTypes.ItemOwner, args.Player.Index, -1, NetworkText.Empty, num); - + TShock.Log.ConsoleDebug(GetString("Bouncer / OnPlaceItemFrame rejected permissions from {0}", args.Player.Name)); NetMessage.SendData((int)PacketTypes.UpdateTileEntity, -1, -1, NetworkText.Empty, args.ItemFrame.ID, 0, 1); args.Handled = true; diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 99153deb8..f73623a5b 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -1640,7 +1640,7 @@ private void OnGetData(GetDataEventArgs e) return; } - if ((player.State < (int)ConnectionState.Complete || player.Dead) && (int)type > 12 && (int)type != 16 && (int)type != 42 && (int)type != 50 && + if ((player.State < (int)ConnectionState.Complete || player.Dead) && (type != PacketTypes.PlayerUpdate || player.Difficulty != 2 || !player.Dead) && (int)type > 12 && (int)type != 16 && (int)type != 42 && (int)type != 50 && (int)type != 38 && (int)type != 21 && (int)type != 22 && type != PacketTypes.SyncLoadout) { e.Handled = true; From cf0fc50d8af8e1d5cff08db4eef35013e3feede4 Mon Sep 17 00:00:00 2001 From: Cai <13110818005@qq.com> Date: Wed, 17 Dec 2025 23:25:40 +0800 Subject: [PATCH 2/4] fix: use validated length for packet buffer --- TShockAPI/TShock.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index f73623a5b..9c0a1fcbf 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -1647,12 +1647,8 @@ private void OnGetData(GetDataEventArgs e) return; } - int length = e.Length - 1; - if (length < 0) - { - length = 0; - } - using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length - 1)) + int length = Math.Max(e.Length - 1, 0); + using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, length)) { // Exceptions are already handled e.Handled = GetDataHandlers.HandlerGetData(type, player, data); From abe3f2979ba4155223b0866dc2ad0bf1fadad9cc Mon Sep 17 00:00:00 2001 From: Cai <13110818005@qq.com> Date: Wed, 17 Dec 2025 23:27:21 +0800 Subject: [PATCH 3/4] refactor: replace magic numbers with PacketTypes enum --- TShockAPI/TShock.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 9c0a1fcbf..81017c600 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -1640,8 +1640,11 @@ private void OnGetData(GetDataEventArgs e) return; } - if ((player.State < (int)ConnectionState.Complete || player.Dead) && (type != PacketTypes.PlayerUpdate || player.Difficulty != 2 || !player.Dead) && (int)type > 12 && (int)type != 16 && (int)type != 42 && (int)type != 50 && - (int)type != 38 && (int)type != 21 && (int)type != 22 && type != PacketTypes.SyncLoadout) + if ((player.State < (int)ConnectionState.Complete || player.Dead) && + (type != PacketTypes.PlayerUpdate || player.Difficulty != 2 || !player.Dead) && + type > PacketTypes.PlayerSpawn && type != PacketTypes.PlayerHp && type != PacketTypes.PlayerMana && + type != PacketTypes.PlayerBuff && type != PacketTypes.PasswordSend && type != PacketTypes.ItemDrop && + type != PacketTypes.ItemOwner && type != PacketTypes.SyncLoadout) { e.Handled = true; return; From 5a465dc4fa08c880c694f42ca4b67dded51aa649 Mon Sep 17 00:00:00 2001 From: Cai <13110818005@qq.com> Date: Tue, 23 Dec 2025 00:31:38 +0800 Subject: [PATCH 4/4] chore: remove dead check in `OnGetData` --- TShockAPI/TShock.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 81017c600..e491b4cf4 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -1640,8 +1640,7 @@ private void OnGetData(GetDataEventArgs e) return; } - if ((player.State < (int)ConnectionState.Complete || player.Dead) && - (type != PacketTypes.PlayerUpdate || player.Difficulty != 2 || !player.Dead) && + if ((player.State < (int)ConnectionState.Complete) && type > PacketTypes.PlayerSpawn && type != PacketTypes.PlayerHp && type != PacketTypes.PlayerMana && type != PacketTypes.PlayerBuff && type != PacketTypes.PasswordSend && type != PacketTypes.ItemDrop && type != PacketTypes.ItemOwner && type != PacketTypes.SyncLoadout)