Move OnLiquidSet to Bouncer

This commit is contained in:
Lucas Nicodemus 2017-12-14 07:46:29 -07:00
parent 2f4b1a5bfc
commit 5cd5bdaaa0
3 changed files with 150 additions and 117 deletions

View file

@ -42,6 +42,7 @@ namespace TShockAPI
{
// Setup hooks
GetDataHandlers.LiquidSet.Register(OnLiquidSet);
GetDataHandlers.ProjectileKill.Register(OnProjectileKill);
GetDataHandlers.PlayerUpdate.Register(OnPlayerUpdate);
GetDataHandlers.KillMe.Register(OnKillMe);
@ -52,6 +53,146 @@ namespace TShockAPI
GetDataHandlers.TileEdit.Register(OnTileEdit);
}
/// <summary>Handles Bouncer's liquid set anti-cheat.</summary>
/// <param name="sender">The object that triggered the event.</param>
/// <param name="args">The packet arguments that the event has.</param>
internal void OnLiquidSet(object sender, GetDataHandlers.LiquidSetEventArgs args)
{
int tileX = args.TileX;
int tileY = args.TileY;
byte amount = args.Amount;
byte type = args.Type;
if (!TShock.Utils.TilePlacementValid(tileX, tileY) || (args.Player.Dead && TShock.Config.PreventDeadModification))
{
args.Handled = true;
return;
}
if (TShock.CheckIgnores(args.Player))
{
args.Player.SendTileSquare(tileX, tileY, 1);
args.Handled = true;
return;
}
if (args.Player.TileLiquidThreshold >= TShock.Config.TileLiquidThreshold)
{
args.Player.Disable("Reached TileLiquid threshold.", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
args.Handled = true;
return;
}
if (!args.Player.HasPermission(Permissions.ignoreliquidsetdetection))
{
args.Player.TileLiquidThreshold++;
}
// Liquid anti-cheat
// Arguably the banned buckets bit should be in the item bans system
if (amount != 0)
{
int bucket = -1;
if (args.Player.TPlayer.inventory[args.Player.TPlayer.selectedItem].type == ItemID.EmptyBucket)
{
bucket = 0;
}
else if (args.Player.TPlayer.inventory[args.Player.TPlayer.selectedItem].type == ItemID.WaterBucket)
{
bucket = 1;
}
else if (args.Player.TPlayer.inventory[args.Player.TPlayer.selectedItem].type == ItemID.LavaBucket)
{
bucket = 2;
}
else if (args.Player.TPlayer.inventory[args.Player.TPlayer.selectedItem].type == ItemID.HoneyBucket)
{
bucket = 3;
}
else if (args.Player.TPlayer.inventory[args.Player.TPlayer.selectedItem].type == ItemID.BottomlessBucket ||
args.Player.TPlayer.inventory[args.Player.TPlayer.selectedItem].type == ItemID.SuperAbsorbantSponge)
{
bucket = 4;
}
if (type == 1 && !(bucket == 2 || bucket == 0))
{
args.Player.SendErrorMessage("You do not have permission to perform this action.");
args.Player.Disable("Spreading lava without holding a lava bucket", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
args.Handled = true;
return;
}
if (type == 1 && TShock.Itembans.ItemIsBanned("Lava Bucket", args.Player))
{
args.Player.SendErrorMessage("You do not have permission to perform this action.");
args.Player.Disable("Using banned lava bucket without permissions", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
args.Handled = true;
return;
}
if (type == 0 && !(bucket == 1 || bucket == 0 || bucket == 4))
{
args.Player.SendErrorMessage("You do not have permission to perform this action.");
args.Player.Disable("Spreading water without holding a water bucket", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
args.Handled = true;
return;
}
if (type == 0 && TShock.Itembans.ItemIsBanned("Water Bucket", args.Player))
{
args.Player.SendErrorMessage("You do not have permission to perform this action.");
args.Player.Disable("Using banned water bucket without permissions", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
args.Handled = true;
return;
}
if (type == 2 && !(bucket == 3 || bucket == 0))
{
args.Player.SendErrorMessage("You do not have permission to perform this action.");
args.Player.Disable("Spreading honey without holding a honey bucket", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
args.Handled = true;
return;
}
if (type == 2 && TShock.Itembans.ItemIsBanned("Honey Bucket", args.Player))
{
args.Player.SendErrorMessage("You do not have permission to perform this action.");
args.Player.Disable("Using banned honey bucket without permissions", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
args.Handled = true;
return;
}
}
if (TShock.CheckTilePermission(args.Player, tileX, tileY))
{
args.Player.SendTileSquare(tileX, tileY, 1);
args.Handled = true;
return;
}
if (TShock.CheckRangePermission(args.Player, tileX, tileY, 16))
{
args.Player.SendTileSquare(tileX, tileY, 1);
args.Handled = true;
return;
}
if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000)
{
args.Player.SendTileSquare(tileX, tileY, 1);
args.Handled = true;
return;
}
}
/// <summary>Handles ProjectileKill events for throttling & out of bounds projectiles.</summary>
/// <param name="sender">The object that triggered the event.</param>
/// <param name="args">The packet arguments that the event has.</param>

View file

@ -795,6 +795,8 @@ namespace TShockAPI
/// </summary>
public class LiquidSetEventArgs : HandledEventArgs
{
/// <summary>The TSPlayer that triggered the event.</summary>
public TSPlayer Player { get; set; }
/// <summary>
/// X location of the tile
/// </summary>
@ -817,13 +819,14 @@ namespace TShockAPI
/// </summary>
public static HandlerList<LiquidSetEventArgs> LiquidSet;
private static bool OnLiquidSet(int tilex, int tiley, byte amount, byte type)
private static bool OnLiquidSet(TSPlayer player, int tilex, int tiley, byte amount, byte type)
{
if (LiquidSet == null)
return false;
var args = new LiquidSetEventArgs
{
Player = player,
TileX = tilex,
TileY = tiley,
Amount = amount,
@ -2325,121 +2328,9 @@ namespace TShockAPI
byte amount = args.Data.ReadInt8();
byte type = args.Data.ReadInt8();
if (OnLiquidSet(tileX, tileY, amount, type))
if (OnLiquidSet(args.Player, tileX, tileY, amount, type))
return true;
if (!TShock.Utils.TilePlacementValid(tileX, tileY) || (args.Player.Dead && TShock.Config.PreventDeadModification))
return true;
if (TShock.CheckIgnores(args.Player))
{
args.Player.SendTileSquare(tileX, tileY, 1);
return true;
}
if (args.Player.TileLiquidThreshold >= TShock.Config.TileLiquidThreshold)
{
args.Player.Disable("Reached TileLiquid threshold.", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
return true;
}
if (!args.Player.HasPermission(Permissions.ignoreliquidsetdetection))
{
args.Player.TileLiquidThreshold++;
}
if (amount != 0)
{
int bucket = -1;
if (args.TPlayer.inventory[args.TPlayer.selectedItem].type == 205)
{
bucket = 0;
}
else if (args.TPlayer.inventory[args.TPlayer.selectedItem].type == 206)
{
bucket = 1;
}
else if (args.TPlayer.inventory[args.TPlayer.selectedItem].type == 207)
{
bucket = 2;
}
else if (args.TPlayer.inventory[args.TPlayer.selectedItem].type == 1128)
{
bucket = 3;
}
else if (args.TPlayer.inventory[args.TPlayer.selectedItem].type == 3031 ||
args.TPlayer.inventory[args.TPlayer.selectedItem].type == 3032)
{
bucket = 4;
}
if (type == 1 && !(bucket == 2 || bucket == 0))
{
args.Player.SendErrorMessage("You do not have permission to perform this action.");
args.Player.Disable("Spreading lava without holding a lava bucket", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
return true;
}
if (type == 1 && TShock.Itembans.ItemIsBanned("Lava Bucket", args.Player))
{
args.Player.SendErrorMessage("You do not have permission to perform this action.");
args.Player.Disable("Using banned lava bucket without permissions", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
return true;
}
if (type == 0 && !(bucket == 1 || bucket == 0 || bucket == 4))
{
args.Player.SendErrorMessage("You do not have permission to perform this action.");
args.Player.Disable("Spreading water without holding a water bucket", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
return true;
}
if (type == 0 && TShock.Itembans.ItemIsBanned("Water Bucket", args.Player))
{
args.Player.SendErrorMessage("You do not have permission to perform this action.");
args.Player.Disable("Using banned water bucket without permissions", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
return true;
}
if (type == 2 && !(bucket == 3 || bucket == 0))
{
args.Player.SendErrorMessage("You do not have permission to perform this action.");
args.Player.Disable("Spreading honey without holding a honey bucket", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
return true;
}
if (type == 2 && TShock.Itembans.ItemIsBanned("Honey Bucket", args.Player))
{
args.Player.SendErrorMessage("You do not have permission to perform this action.");
args.Player.Disable("Using banned honey bucket without permissions", DisableFlags.WriteToLogAndConsole);
args.Player.SendTileSquare(tileX, tileY, 1);
return true;
}
}
if (TShock.CheckTilePermission(args.Player, tileX, tileY))
{
args.Player.SendTileSquare(tileX, tileY, 1);
return true;
}
if (TShock.CheckRangePermission(args.Player, tileX, tileY, 16))
{
args.Player.SendTileSquare(tileX, tileY, 1);
return true;
}
if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000)
{
args.Player.SendTileSquare(tileX, tileY, 1);
return true;
}
return false;
}