diff --git a/CHANGELOG.md b/CHANGELOG.md index a4aa51c8..27e3b404 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin * Plugins and ./bin dependencies are now loaded relative to the launcher, this improves the use of startup files (@SignatureBeef) * Added preliminary support for Terraria 1.4.4.5. (@drunderscore) * For clarity sake, we're listing the individual changes to Terraria's version, despite the fact that this version only supports the latest one. +* Don't allow players to sync loadout index whilst disabled (@drunderscore) ## TShock 4.5.18 * Fixed `TSPlayer.GiveItem` not working if the player is in lava. (@gohjoseph) diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 476c42e3..c7d11d92 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -162,7 +162,8 @@ namespace TShockAPI { PacketTypes.LandGolfBallInCup, HandleLandGolfBallInCup }, { PacketTypes.FishOutNPC, HandleFishOutNPC }, { PacketTypes.FoodPlatterTryPlacing, HandleFoodPlatterTryPlacing }, - { PacketTypes.SyncCavernMonsterType, HandleSyncCavernMonsterType } + { PacketTypes.SyncCavernMonsterType, HandleSyncCavernMonsterType }, + { PacketTypes.SyncLoadout, HandleSyncLoadout } }; } @@ -4325,6 +4326,27 @@ namespace TShockAPI return true; } + private static bool HandleSyncLoadout(GetDataHandlerArgs args) + { + var playerIndex = args.Data.ReadInt8(); + var loadoutIndex = args.Data.ReadInt8(); + + // When syncing a player's own loadout index, they then sync it back to us... + // So let's only care if the index has actually changed, otherwise we might end up in a loop... + if (loadoutIndex == args.TPlayer.CurrentLoadoutIndex) + return false; + + if (args.Player.IsBeingDisabled()) + { + TShock.Log.ConsoleDebug("GetDataHandlers / HandleSyncLoadout rejected loadout index sync {0}", args.Player.Name); + NetMessage.SendData((int)PacketTypes.SyncLoadout, number: args.Player.Index, number2: args.TPlayer.CurrentLoadoutIndex); + + return true; + } + + return false; + } + public enum DoorAction { OpenDoor = 0,