diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 3939601f..f8a24160 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1149,12 +1149,44 @@ namespace TShockAPI args.Player.SendMessage("Cleared temp area", Color.Yellow); break; } + case "allow": + { + if (args.Parameters.Count > 2) + { + string playerName = args.Parameters[1]; + string regionName = ""; + + for (int i = 2; i < args.Parameters.Count; i++) + { + if (regionName == "") + { + regionName = args.Parameters[2]; + } + else + { + regionName = regionName + " " + args.Parameters[i]; + } + } + + if (RegionManager.AddNewUser(regionName, playerName)) + { + args.Player.SendMessage("Added user " + playerName + " to " + regionName, Color.Yellow); + RegionManager.WriteSettings(); + } + else + args.Player.SendMessage("Region " + regionName + " not found", Color.Red); + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [name] [region]", Color.Red); + break; + } case "help": default: { args.Player.SendMessage("Avialable region commands:", Color.Green); args.Player.SendMessage("/region set [1/2] /region define [name] /region protect [name] [true/false]", Color.Yellow); args.Player.SendMessage("/region delete [name] /region clear (temporary region)", Color.Yellow); + args.Player.SendMessage("/region allow [name] [regionname]", Color.Yellow); break; } } diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 863ec69c..24bd1cd5 100755 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -216,7 +216,7 @@ namespace TShockAPI return true; } } - if (!args.Player.Group.HasPermission("editspawn") && RegionManager.InProtectedArea(x, y)) + if (!args.Player.Group.HasPermission("editspawn") && RegionManager.InProtectedArea(x, y, args.Player.Name)) { args.Player.SendMessage("Region protected from changes.", Color.Red); args.Player.SendTileSquare(x, y); diff --git a/TShockAPI/RegionManager.cs b/TShockAPI/RegionManager.cs index 06465c4a..b27079b7 100644 --- a/TShockAPI/RegionManager.cs +++ b/TShockAPI/RegionManager.cs @@ -25,6 +25,20 @@ namespace TShockAPI return true; } + public static bool AddNewUser(string regionName, string name) + { + foreach (Region nametest in Regions) + { + if (regionName.ToLower() == nametest.RegionName.ToLower()) + { + nametest.RegionAllowedUsers.Add(name.ToLower()); + Console.WriteLine(nametest.RegionName); + return true; + } + } + return false; + } + public static bool DeleteRegion(string name) { foreach (Region nametest in Regions) @@ -53,18 +67,45 @@ namespace TShockAPI return false; } - public static bool InProtectedArea(int X, int Y) + public static bool InProtectedArea(int X, int Y, string name) { foreach(Region region in Regions) { - if (X >= region.RegionArea.Left && X <= region.RegionArea.Right && Y >= region.RegionArea.Top && Y <= region.RegionArea.Bottom && region.DisableBuild && Main.worldName == region.WorldRegionName) + if (X >= region.RegionArea.Left && X <= region.RegionArea.Right && Y >= region.RegionArea.Top && Y <= region.RegionArea.Bottom && region.DisableBuild && Main.worldName == region.WorldRegionName && (!AllowedUser(region.RegionName, name.ToLower()) || region.RegionAllowedUsers.Count == 0)) { + Console.WriteLine(region.RegionName); return true; } } return false; } + public static int GetRegionIndex(string regionName) + { + for(int i = 0; i< Regions.Count;i++) + { + if(Regions[i].RegionName == regionName) + return i; + } + return -1; + } + + public static bool AllowedUser(string regionName, string playerName) + { + int ID = -1; + if ((ID = GetRegionIndex(regionName)) != -1) + { + for (int i = 0; i < Regions[ID].RegionAllowedUsers.Count; i++) + { + if (Regions[ID].RegionAllowedUsers[i].ToLower() == playerName.ToLower()) + { + return true; + } + } + } + return false; + } + public static void WriteSettings() { try @@ -88,6 +129,11 @@ namespace TShockAPI settingsw.WriteElementString("Point2Y", region.RegionArea.Height.ToString()); settingsw.WriteElementString("Protected", region.DisableBuild.ToString()); settingsw.WriteElementString("WorldName", region.WorldRegionName); + settingsw.WriteElementString("AllowedUserCount", region.RegionAllowedUsers.Count.ToString()); + for (int i = 0; i < region.RegionAllowedUsers.Count; i++) + { + settingsw.WriteElementString("User", region.RegionAllowedUsers[i]); + } settingsw.WriteEndElement(); } @@ -132,6 +178,7 @@ namespace TShockAPI int height = 0; bool state = true; string worldname = null; + int playercount = 0; settingr.Read(); if (settingr.Value != "" || settingr.Value != null) @@ -188,7 +235,34 @@ namespace TShockAPI else Log.Warn("Worldname for region " + name + " is empty"); + Console.WriteLine(settingr.Value); + + settingr.Read(); + settingr.Read(); + settingr.Read(); + if (settingr.Value != "" || settingr.Value != null) + Int32.TryParse(settingr.Value, out playercount); + else + Log.Warn("Playercount for region " + name + " is empty"); + AddRegion(x, y, width, height, name, worldname); + + if (playercount > 0) + { + for (int i = 0; i < playercount; i++) + { + settingr.Read(); + settingr.Read(); + settingr.Read(); + if (settingr.Value != "" || settingr.Value != null) + { + int ID = RegionManager.GetRegionIndex(name); + Regions[ID].RegionAllowedUsers.Add(settingr.Value); + } + else + Log.Warn("Playername " + i + " for region " + name + " is empty"); + } + } } break; } @@ -212,6 +286,7 @@ namespace TShockAPI public string RegionName { get; set; } public bool DisableBuild { get; set; } public string WorldRegionName { get; set; } + public List RegionAllowedUsers = new List(); public Region(Rectangle region, string name, bool disablebuild, string worldname) { diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index e14bac7c..c8dff8d9 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -139,7 +139,8 @@ - "$(SolutionDir)\myass.bat" + +