diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs index a9b99377..484cc524 100644 --- a/TShockAPI/Bouncer.cs +++ b/TShockAPI/Bouncer.cs @@ -1716,132 +1716,108 @@ namespace TShockAPI // Liquid anti-cheat // Arguably the banned buckets bit should be in the item bans system - if (amount != 0) + if (amount != 0 && !wasThereABombNearby) { - int bucket = -1; int selectedItemType = args.Player.TPlayer.inventory[args.Player.TPlayer.selectedItem].type; - if (selectedItemType == ItemID.EmptyBucket) - { - bucket = 0; - } - else if (selectedItemType == ItemID.WaterBucket) - { - bucket = 1; - } - else if (selectedItemType == ItemID.LavaBucket) - { - bucket = 2; - } - else if (selectedItemType == ItemID.HoneyBucket) - { - bucket = 3; - } - else if (selectedItemType == ItemID.BottomlessBucket || - selectedItemType == ItemID.SuperAbsorbantSponge) - { - bucket = 4; - } - else if (selectedItemType == ItemID.LavaAbsorbantSponge) - { - bucket = 5; - } - else if (selectedItemType == ItemID.BottomlessLavaBucket) - { - bucket = 6; - } - else if (selectedItemType == ItemID.BottomlessHoneyBucket - || selectedItemType == ItemID.HoneyAbsorbantSponge) - { - bucket = 7; - } - else if (selectedItemType == ItemID.BottomlessShimmerBucket) - { - bucket = 8; - } - else if (selectedItemType == ItemID.UltraAbsorbantSponge) - { - bucket = 9; - } - if (!wasThereABombNearby && type == LiquidType.Lava && !(bucket == 2 || bucket == 0 || bucket == 5 || bucket == 6 || bucket == 9)) + void Reject(string reason) { - TShock.Log.ConsoleDebug(GetString("Bouncer / OnLiquidSet rejected bucket check 1 from {0}", args.Player.Name)); + TShock.Log.ConsoleDebug(GetString("Bouncer / OnLiquidSet rejected liquid type {0} from {1} holding {2}", type, args.Player.Name, selectedItemType)); args.Player.SendErrorMessage(GetString("You do not have permission to perform this action.")); - args.Player.Disable(GetString("Spreading lava without holding a lava bucket"), DisableFlags.WriteToLogAndConsole); + args.Player.Disable(reason, DisableFlags.WriteToLogAndConsole); args.Player.SendTileSquareCentered(tileX, tileY, 1); args.Handled = true; + } + + if (TShock.ItemBans.DataModel.ItemIsBanned(EnglishLanguage.GetItemNameById(selectedItemType), args.Player)) + { + Reject(GetString("Using banned {0} to manipulate liquid", Lang.GetItemNameValue(selectedItemType))); return; } - if (!wasThereABombNearby && type == LiquidType.Lava && TShock.ItemBans.DataModel.ItemIsBanned("Lava Bucket", args.Player)) + switch (type) { - TShock.Log.ConsoleDebug(GetString("Bouncer / OnLiquidSet rejected lava bucket from {0}", args.Player.Name)); - args.Player.SendErrorMessage(GetString("You do not have permission to perform this action.")); - args.Player.Disable(GetString("Using banned lava bucket without permissions"), DisableFlags.WriteToLogAndConsole); - args.Player.SendTileSquareCentered(tileX, tileY, 1); - args.Handled = true; - return; + case LiquidType.Water: + if (TShock.ItemBans.DataModel.ItemIsBanned(EnglishLanguage.GetItemNameById(ItemID.WaterBucket), args.Player)) + { + Reject(GetString("Using banned water bucket without permissions")); + return; + } + break; + case LiquidType.Lava: + if (TShock.ItemBans.DataModel.ItemIsBanned(EnglishLanguage.GetItemNameById(ItemID.LavaBucket), args.Player)) + { + Reject(GetString("Using banned lava bucket without permissions")); + return; + } + break; + case LiquidType.Honey: + if (TShock.ItemBans.DataModel.ItemIsBanned(EnglishLanguage.GetItemNameById(ItemID.HoneyBucket), args.Player)) + { + Reject(GetString("Using banned honey bucket without permissions")); + return; + } + break; + case LiquidType.Shimmer: + if (TShock.ItemBans.DataModel.ItemIsBanned(EnglishLanguage.GetItemNameById(ItemID.BottomlessShimmerBucket), args.Player)) + { + Reject(GetString("Using banned shimmering water bucket without permissions")); + return; + } + break; + default: + Reject(GetString("Manipulating unknown liquid type")); + return; } - if (!wasThereABombNearby && type == LiquidType.Water && !(bucket == 1 || bucket == 0 || bucket == 4 || bucket == 9)) + switch (selectedItemType) { - TShock.Log.ConsoleDebug(GetString("Bouncer / OnLiquidSet rejected bucket check 2 from {0}", args.Player.Name)); - args.Player.SendErrorMessage(GetString("You do not have permission to perform this action.")); - args.Player.Disable(GetString("Spreading water without holding a water bucket"), DisableFlags.WriteToLogAndConsole); - args.Player.SendTileSquareCentered(tileX, tileY, 1); - args.Handled = true; - return; - } - - if (!wasThereABombNearby && type == LiquidType.Water && TShock.ItemBans.DataModel.ItemIsBanned("Water Bucket", args.Player)) - { - TShock.Log.ConsoleDebug(GetString("Bouncer / OnLiquidSet rejected bucket check 3 from {0}", args.Player.Name)); - args.Player.SendErrorMessage(GetString("You do not have permission to perform this action.")); - args.Player.Disable(GetString("Using banned water bucket without permissions"), DisableFlags.WriteToLogAndConsole); - args.Player.SendTileSquareCentered(tileX, tileY, 1); - args.Handled = true; - return; - } - - if (!wasThereABombNearby && type == LiquidType.Honey && !(bucket == 3 || bucket == 0 || bucket == 7 || bucket == 9)) - { - TShock.Log.ConsoleDebug(GetString("Bouncer / OnLiquidSet rejected bucket check 4 from {0}", args.Player.Name)); - args.Player.SendErrorMessage(GetString("You do not have permission to perform this action.")); - args.Player.Disable(GetString("Spreading honey without holding a honey bucket"), DisableFlags.WriteToLogAndConsole); - args.Player.SendTileSquareCentered(tileX, tileY, 1); - args.Handled = true; - return; - } - - if (!wasThereABombNearby && type == LiquidType.Honey && TShock.ItemBans.DataModel.ItemIsBanned("Honey Bucket", args.Player)) - { - TShock.Log.ConsoleDebug(GetString("Bouncer / OnLiquidSet rejected bucket check 5 from {0}", args.Player.Name)); - args.Player.SendErrorMessage(GetString("You do not have permission to perform this action.")); - args.Player.Disable(GetString("Using banned honey bucket without permissions"), DisableFlags.WriteToLogAndConsole); - args.Player.SendTileSquareCentered(tileX, tileY, 1); - args.Handled = true; - return; - } - - if (!wasThereABombNearby && type == LiquidType.Shimmer && !(bucket == 8 || bucket == 9)) - { - TShock.Log.ConsoleDebug(GetString("Bouncer / OnLiquidSet rejected bucket check 6 from {0}", args.Player.Name)); - args.Player.SendErrorMessage(GetString("You do not have permission to perform this action.")); - args.Player.Disable(GetString("Spreading shimmer without holding a shimmer bucket"), DisableFlags.WriteToLogAndConsole); - args.Player.SendTileSquareCentered(tileX, tileY, 1); - args.Handled = true; - return; - } - - if (!wasThereABombNearby && type == LiquidType.Shimmer && - TShock.ItemBans.DataModel.ItemIsBanned("Bottomless Shimmer Bucket", args.Player)) - { - TShock.Log.ConsoleDebug(GetString("Bouncer / OnLiquidSet rejected bucket check 7 from {0}", args.Player.Name)); - args.Player.SendErrorMessage(GetString("You do not have permission to perform this action.")); - args.Player.Disable(GetString("Using banned bottomless shimmer bucket without permissions"), DisableFlags.WriteToLogAndConsole); - args.Player.SendTileSquareCentered(tileX, tileY, 1); - args.Handled = true; - return; + case ItemID.WaterBucket: + case ItemID.BottomlessBucket: + if (type != LiquidType.Water) + { + Reject(GetString("Using {0} on non-water", Lang.GetItemNameValue(selectedItemType))); + return; + } + break; + case ItemID.HoneyBucket: + case ItemID.HoneyAbsorbantSponge: + case ItemID.BottomlessHoneyBucket: + if (type != LiquidType.Honey) + { + Reject(GetString("Using {0} on non-honey", Lang.GetItemNameValue(selectedItemType))); + return; + } + break; + case ItemID.LavaAbsorbantSponge: + case ItemID.BottomlessLavaBucket: + case ItemID.LavaBucket: + if (type != LiquidType.Lava) + { + Reject(GetString("Using {0} on non-lava", Lang.GetItemNameValue(selectedItemType))); + return; + } + break; + case ItemID.BottomlessShimmerBucket: + if (type != LiquidType.Shimmer) + { + Reject(GetString("Using {0} on non-shimmer", Lang.GetItemNameValue(selectedItemType))); + return; + } + break; + case ItemID.SuperAbsorbantSponge: + if (type != LiquidType.Water && type != LiquidType.Shimmer) + { + Reject(GetString("Using {0} on non-water or shimmer", Lang.GetItemNameValue(selectedItemType))); + return; + } + break; + case ItemID.EmptyBucket: + case ItemID.UltraAbsorbantSponge: + break; + default: + Reject(GetString("Using {0} to manipulate unknown liquid {1}", Lang.GetItemNameValue(selectedItemType), type)); + return; } } diff --git a/docs/changelog.md b/docs/changelog.md index 90ea0990..7e5fb590 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -85,6 +85,7 @@ Use past tense when adding new entries; sign your name off when you add or chang * This will make it so Bouncer rejections regarding `PlayerAddBuff` will now always include the sender index, buff type, receiver index, and time in ticks, allowing much faster triage of buff whitelist issues. * Allowed Digging Molecart and bomb fish to break tiles and place tracks (@sgkoishi) * Add built-in package management capabilities for plugins +* Fixed Super Sponge unable to absorb shimmer. (@sgkoishi, #2833) ## TShock 5.1.3 * Added support for Terraria 1.4.4.9 via OTAPI 3.1.20. (@SignatureBeef)