Add protection of gem locks in region

This commit is contained in:
Zt Wang 2016-06-21 22:34:15 +08:00
parent 392fbe79c8
commit c6811c98ed
2 changed files with 84 additions and 1 deletions

View file

@ -319,6 +319,10 @@ namespace TShockAPI
[Description("Protect chests with region and build permissions.")]
public bool RegionProtectChests;
/// <summary>RegionProtectGemLocks - Whether or not region protection should apply to gem locks.</summary>
[Description("Protect gem locks with region and build permissions.")]
public bool RegionProtectGemLocks = true;
/// <summary>DisableLoginBeforeJoin - This will prevent users from being able to login before connecting.</summary>
[Description("Disable users from being able to login with account password when joining.")]
public bool DisableLoginBeforeJoin;

View file

@ -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;
}
/// <summary>
/// For use with a ToggleGemLock event
/// </summary>
public class GemLockToggleEventArgs : HandledEventArgs
{
/// <summary>
/// X Location
/// </summary>
public Int32 X { get; set; }
/// <summary>
/// Y Location
/// </summary>
public Int32 Y { get; set; }
/// <summary>
/// On status
/// </summary>
public bool On { get; set; }
}
/// <summary>
/// GemLockToggle - Called when a gem lock is switched
/// </summary>
public static HandlerList<GemLockToggleEventArgs> 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;
}
}
}