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;
+ }
}
}