diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 50af3db8..4e75b806 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1561,40 +1561,56 @@ namespace TShockAPI } case "list": { - args.Player.SendMessage("Current Regions:", Color.Green); - int page = 1; + //How many regions per page + const int pagelimit = 15; + //How many regions per line + const int perline = 5; + //Pages start at 0 but are displayed and parsed at 1 + int page = 0; + + if (args.Parameters.Count > 1) - int.TryParse(args.Parameters[1], out page); - var sb = new StringBuilder(); - - List Regions = TShock.Regions.ListAllRegions(); - - if (Regions.Count > (15 * (page - 1))) { - for (int j = (15 * (page - 1)); j < (15 * page); j++) + if (!int.TryParse(args.Parameters[1], out page) || page < 1) { - if (Regions[j].RegionWorldID == Main.worldName) - { - if (sb.Length != 0) - sb.Append(", "); - sb.Append(Regions[j].RegionName); - if (j == Regions.Count - 1) - { - args.Player.SendMessage(sb.ToString(), Color.Yellow); - break; - } - if ((j + 1) % 5 == 0) - { - args.Player.SendMessage(sb.ToString(), Color.Yellow); - sb.Clear(); - } - } + args.Player.SendMessage(string.Format("Invalid page number ({0})", page), Color.Red); + return; } + page--; //Substract 1 as pages are parsed starting at 1 and not 0 } - if (Regions.Count > (15 * page)) + + var regions = TShock.Regions.ListAllRegions(Main.worldName); + + //Check if they are trying to access a page that doesn't exist. + int pagecount = regions.Count / pagelimit; + if (page > pagecount) + { + args.Player.SendMessage(string.Format("Page number exceeds pages ({0}/{1})", page + 1, pagecount + 1), Color.Red); + return; + } + + //Display the current page and the number of pages. + args.Player.SendMessage(string.Format("Current Regions ({0}/{1}):", page + 1, pagecount + 1), Color.Green); + + //Add up to pagelimit names to a list + var nameslist = new List(); + for (int i = 0; i < pagelimit && i + (page * pagelimit) < regions.Count; i++) + { + nameslist.Add(regions[i].RegionName); + } + + //convert the list to an array for joining + var names = nameslist.ToArray(); + for (int i = 0; i < names.Length; i += perline) + { + args.Player.SendMessage(string.Join(", ", names, i, Math.Min(names.Length - i, perline)), Color.Yellow); + } + + if (page < pagecount) { args.Player.SendMessage(string.Format("Type /region list {0} for more regions.", (page + 1)), Color.Yellow); } + break; } case "help": diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index f5d33d9d..3c42eeb4 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -74,7 +74,7 @@ namespace TShockAPI.DB switch (reader.NodeType) { case XmlNodeType.Element: - switch( reader.Name ) + switch (reader.Name) { case "ProtectedRegion": name = ""; @@ -96,22 +96,22 @@ namespace TShockAPI.DB case "Point1X": while (reader.NodeType != XmlNodeType.Text) reader.Read(); - int.TryParse( reader.Value, out x1 ); + int.TryParse(reader.Value, out x1); break; case "Point1Y": while (reader.NodeType != XmlNodeType.Text) reader.Read(); - int.TryParse(reader.Value, out y1); + int.TryParse(reader.Value, out y1); break; case "Point2X": while (reader.NodeType != XmlNodeType.Text) reader.Read(); - int.TryParse(reader.Value, out x2); + int.TryParse(reader.Value, out x2); break; case "Point2Y": while (reader.NodeType != XmlNodeType.Text) reader.Read(); - int.TryParse(reader.Value, out y2); + int.TryParse(reader.Value, out y2); break; case "Protected": while (reader.NodeType != XmlNodeType.Text) @@ -120,10 +120,11 @@ namespace TShockAPI.DB { prot = 0; } - else{ + else + { prot = 1; } - break; + break; case "WorldName": while (reader.NodeType != XmlNodeType.Text) reader.Read(); @@ -144,18 +145,19 @@ namespace TShockAPI.DB ips[i] = reader.Value; } ipstr = ""; - for( int i = 0; i < ips.Length; i++ ) + for (int i = 0; i < ips.Length; i++) { try { if (ipstr != "") ipstr += ","; ipstr += TShock.Users.GetUserID(ips[i]); - } catch (Exception) + } + catch (Exception) { Log.Error("An IP address failed to import. It wasn't a user in the new user system."); } - + } } @@ -166,7 +168,7 @@ namespace TShockAPI.DB com.AddParameter("@tx", x1); com.AddParameter("@ty", y1); com.AddParameter("@width", x2); - com.AddParameter("@height",y2); + com.AddParameter("@height", y2); com.AddParameter("@name", name); com.AddParameter("@worldid", world); com.AddParameter("@userids", ipstr); @@ -200,7 +202,7 @@ namespace TShockAPI.DB //File.Move(file, file2); } - if( updates > 0 ) + if (updates > 0) ReloadAllRegions(); } } @@ -225,7 +227,7 @@ namespace TShockAPI.DB { Log.Error(ex.ToString()); } - } + } public void ReloadAllRegions() { @@ -262,7 +264,8 @@ namespace TShockAPI.DB } r.RegionAllowedIDs[i] = Convert.ToInt32(SplitIDs[i]); } - } catch (Exception e) + } + catch (Exception e) { Log.Error("Your database contains invalid UserIDs (they should be ints)."); Log.Error("A lot of things will fail because of this. You must manually delete and re-create the allowed field."); @@ -374,7 +377,7 @@ namespace TShockAPI.DB public bool InArea(int x, int y) { - foreach(Region region in Regions) + foreach (Region region in Regions) { if (x >= region.RegionArea.Left && x <= region.RegionArea.Right && y >= region.RegionArea.Top && y <= region.RegionArea.Bottom && @@ -438,7 +441,8 @@ namespace TShockAPI.DB { ReloadAllRegions(); return true; - } else + } + else { return false; } @@ -451,19 +455,24 @@ namespace TShockAPI.DB } } - public List ListAllRegions() + /// + /// Gets all the regions names from world + /// + /// World name to get regions from + /// List of regions with only their names + public List ListAllRegions(string worldid) { - List Regions = new List(); + var regions = new List(); try { using (var com = database.CreateCommand()) { - com.CommandText = "SELECT * FROM Regions"; + com.CommandText = "SELECT RegionName FROM Regions WHERE WorldID=@worldid"; + com.AddParameter("@worldid", worldid); using (var reader = com.ExecuteReader()) { while (reader.Read()) - Regions.Add(new Region(new Rectangle(reader.Get("X1"), reader.Get("Y1"), reader.Get("height"), reader.Get("width")), reader.Get("RegionName"), reader.Get("Protected"), reader.Get("WorldID"))); - reader.Close(); + regions.Add(new Region { RegionName = reader.Get("RegionName") }); } } } @@ -471,7 +480,7 @@ namespace TShockAPI.DB { Log.Error(ex.ToString()); } - return Regions; + return regions; } }