From c6811c98edebbbf2256efda58395e055aa6c1167 Mon Sep 17 00:00:00 2001 From: Zt Wang Date: Tue, 21 Jun 2016 22:34:15 +0800 Subject: [PATCH] Add protection of gem locks in region --- TShockAPI/ConfigFile.cs | 4 ++ TShockAPI/GetDataHandlers.cs | 81 +++++++++++++++++++++++++++++++++++- 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index d3530088..c4f9cf35 100755 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -319,6 +319,10 @@ namespace TShockAPI [Description("Protect chests with region and build permissions.")] public bool RegionProtectChests; + /// RegionProtectGemLocks - Whether or not region protection should apply to gem locks. + [Description("Protect gem locks with region and build permissions.")] + public bool RegionProtectGemLocks = true; + /// DisableLoginBeforeJoin - This will prevent users from being able to login before connecting. [Description("Disable users from being able to login with account password when joining.")] public bool DisableLoginBeforeJoin; diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 202ea39c..f7448b65 100755 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -1249,7 +1249,8 @@ namespace TShockAPI { PacketTypes.DoorUse, HandleDoorUse }, { PacketTypes.CompleteAnglerQuest, HandleCompleteAnglerQuest }, { PacketTypes.NumberOfAnglerQuestsCompleted, HandleNumberOfAnglerQuestsCompleted }, - { PacketTypes.MassWireOperation, HandleMassWireOperation } + { PacketTypes.MassWireOperation, HandleMassWireOperation }, + { PacketTypes.GemLockToggle, HandleGemLockToggle } }; } @@ -3899,5 +3900,83 @@ namespace TShockAPI return false; } + + /// + /// For use with a ToggleGemLock event + /// + public class GemLockToggleEventArgs : HandledEventArgs + { + /// + /// X Location + /// + public Int32 X { get; set; } + /// + /// Y Location + /// + public Int32 Y { get; set; } + /// + /// On status + /// + public bool On { get; set; } + } + + /// + /// GemLockToggle - Called when a gem lock is switched + /// + public static HandlerList GemLockToggle; + + private static bool OnGemLockToggle(Int32 x, Int32 y, bool on) + { + if (GemLockToggle == null) + return false; + + var args = new GemLockToggleEventArgs + { + X = x, + Y = y, + On = on + }; + GemLockToggle.Invoke(null, args); + return args.Handled; + } + + private static bool HandleGemLockToggle(GetDataHandlerArgs args) + { + var x = (int)args.Data.ReadInt16(); + var y = (int)args.Data.ReadInt16(); + var on = args.Data.ReadBoolean(); + + if (x < 0 || y < 0 || x >= Main.maxTilesX || y >= Main.maxTilesY) + { + return true; + } + + if (OnGemLockToggle(x, y, on)) + { + return true; + } + + if (!TShock.Config.RegionProtectGemLocks) + { + return false; + } + + if (!TShock.Utils.TilePlacementValid(x, y) || (args.Player.Dead && TShock.Config.PreventDeadModification)) + { + return true; + } + + if (TShock.CheckIgnores(args.Player)) + { + return true; + } + + if (TShock.CheckTilePermission(args.Player, x, y)) + { + return true; + } + + return false; + } } }