diff --git a/FlaggedRegion.cs b/FlaggedRegion.cs index a04f906..419871d 100644 --- a/FlaggedRegion.cs +++ b/FlaggedRegion.cs @@ -90,6 +90,10 @@ public List getFlags() { f.Add(Flags.HEAL); } + if ((flags & (int)Flags.NOPVP) == (int)Flags.NOPVP) + { + f.Add(Flags.NOPVP); + } return f; } diff --git a/Flags.cs b/Flags.cs index 7277fa5..9783b40 100644 --- a/Flags.cs +++ b/Flags.cs @@ -18,5 +18,6 @@ public enum Flags HEALONDAMAGE = 128, GODMOB = 256, HEAL = 512, + NOPVP = 1024, } } diff --git a/RegionFlags.cs b/RegionFlags.cs index 12f928c..6922af5 100644 --- a/RegionFlags.cs +++ b/RegionFlags.cs @@ -227,6 +227,12 @@ private void OnUpdate(EventArgs args) private void SetFlags( CommandArgs args ) { + if (args.Parameters.Count == 1 && args.Parameters[0] == "flags") + { + string flags = string.Join(", ", Enum.GetNames(typeof (Flags))); + args.Player.SendInfoMessage("Available flags: {0}", flags); + return; + } if( args.Parameters.Count < 3 ) { args.Player.SendMessage("Invalid usage: /rflags(/rf) set|rem [region name] [flag]", Color.Red); @@ -244,6 +250,7 @@ private void SetFlags( CommandArgs args ) switch( args.Parameters[0] ) { case "set": + case "add": { Flags enumval; @@ -282,7 +289,6 @@ private void SetFlags( CommandArgs args ) break; } } - Console.WriteLine(String.Join(", ", reg.getFlags())); } private void DefineRegion( CommandArgs args ) diff --git a/RegionPlayer.cs b/RegionPlayer.cs index cdfdd63..36491c6 100644 --- a/RegionPlayer.cs +++ b/RegionPlayer.cs @@ -11,7 +11,9 @@ namespace RegionFlags class RegionPlayer { private TSPlayer player; + private bool previousPVPMode = false; private bool forcedPVP = false; + private bool removedPVP = false; private PositionQueue positions; private FlaggedRegionManager regionManager; private DateTime lastWarned = DateTime.Now; @@ -33,7 +35,8 @@ public void Update() Region r = TShock.Regions.GetTopRegion( TShock.Regions.InAreaRegion(player.TileX, player.TileY) ); - bool inzone = false; + bool inPVPZone = false; + bool inNoPVPZone = false; bool warning = ((now - lastWarned).TotalSeconds > 5); @@ -65,15 +68,29 @@ public void Update() } if (flags.Contains(Flags.PVP)) { + if (!player.TPlayer.hostile) + { + player.SendMessage("PVP arena entered, pvp enabled.", Color.Green); + } + player.TPlayer.hostile = true; player.SendData(PacketTypes.TogglePvp); NetMessage.SendData((int) PacketTypes.TogglePvp, -1, -1, "", player.Index); - inzone = true; - if (!forcedPVP) + inPVPZone = true; + forcedPVP = true; + } + if (flags.Contains(Flags.NOPVP)) + { + if (player.TPlayer.hostile) { - forcedPVP = true; - player.SendMessage("PVP arena entered, pvp enabled.", Color.Green); + player.SendMessage("PVP free area entered, pvp disabled.", Color.Green); } + + player.TPlayer.hostile = false; + player.SendData(PacketTypes.TogglePvp); + NetMessage.SendData((int)PacketTypes.TogglePvp, -1, -1, "", player.Index); + inNoPVPZone = true; + removedPVP = true; } if (flags.Contains(Flags.HURT)) { @@ -102,7 +119,7 @@ public void Update() } } - if( !inzone && forcedPVP ) + if (!inPVPZone && forcedPVP) { forcedPVP = false; player.TPlayer.hostile = false; @@ -111,6 +128,15 @@ public void Update() player.SendMessage("PVP arena left, pvp disabled.", Color.Green); } + if (!inNoPVPZone && removedPVP) + { + removedPVP = false; + player.TPlayer.hostile = false; + player.SendData(PacketTypes.TogglePvp); + NetMessage.SendData((int)PacketTypes.TogglePvp, -1, -1, "", player.Index); + player.SendMessage("PVP free area left, pvp disabled.", Color.Green); + } + if ((now - lastUpdate).TotalSeconds > 1) { positions.enqueue(player.TPlayer.position); diff --git a/Utilities.cs b/Utilities.cs index c601ae7..2e19e39 100644 --- a/Utilities.cs +++ b/Utilities.cs @@ -21,6 +21,7 @@ public static void GiveItem(string name, int X, int Y, int width, int height, in Main.item[itemid].owner = id; Main.item[itemid].prefix = (byte)prefix; Main.item[itemid].velocity = velocity; + Main.item[itemid].noGrabDelay = 1; NetMessage.SendData((int)PacketTypes.ItemDrop, -1, -1, "", itemid, 0f, 0f, 0f); NetMessage.SendData((int)PacketTypes.ItemOwner, -1, -1, "", itemid, 0f, 0f, 0f); }