From 1c2cead3c9f919874d98a024e25e4a89bc0f7b9a Mon Sep 17 00:00:00 2001 From: high Date: Fri, 22 Jul 2011 21:36:07 -0400 Subject: [PATCH] Fixed /warp list ListAllWarps now only returns names and only for the specified world. --- TShockAPI/Commands.cs | 126 ++++++++++++++++++++--------------- TShockAPI/DB/WarpsManager.cs | 24 ++++--- 2 files changed, 87 insertions(+), 63 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 11e7fc32..50af3db8 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -327,7 +327,8 @@ namespace TShockAPI args.Player.LoginAttempts++; return; } - } catch (Exception) + } + catch (Exception) { args.Player.SendMessage("There was an error processing your request. Maybe your account doesn't exist?", Color.Red); return; @@ -389,7 +390,7 @@ namespace TShockAPI else { args.Player.SendMessage("Account " + user.Name + " has already been registered.", Color.Green); - Log.ConsoleInfo(args.Player.Name + " failed to register an existing Account: " + user.Name); + Log.ConsoleInfo(args.Player.Name + " failed to register an existing Account: " + user.Name); } } @@ -727,7 +728,8 @@ namespace TShockAPI args.Player.SendMessage("This command will also change all Worlds to reference this WorldID."); args.Player.SendMessage("You must manually fix multi-world configurations."); args.Player.SendMessage("To confirm this: /convert yes"); - } else if (args.Parameters[0] == "yes") + } + else if (args.Parameters[0] == "yes") { TShock.Warps.ConvertDB(); TShock.Regions.ConvertDB(); @@ -1124,61 +1126,79 @@ namespace TShockAPI private static void UseWarp(CommandArgs args) { - if (args.Parameters.Count > 0) + if (args.Parameters.Count < 1) { - if (args.Parameters[0].Equals("list")) - { - args.Player.SendMessage("Current Warps:", Color.Green); - int page = 1; - if (args.Parameters.Count > 1) - int.TryParse(args.Parameters[1], out page); - var sb = new StringBuilder(); - List Warps = TShock.Warps.ListAllWarps(); + args.Player.SendMessage("Invalid syntax! Proper syntax: /warp [name] or /warp list ", Color.Red); + return; + } - if (Warps.Count > (15 * (page - 1))) - { - for (int j = (15 * (page - 1)); j < (15 * page); j++) - { - if (Warps[j].WorldWarpID == Main.worldName) - { - if (sb.Length != 0) - sb.Append(", "); - sb.Append(Warps[j].WarpName); - if (j == Warps.Count - 1) - { - args.Player.SendMessage(sb.ToString(), Color.Yellow); - break; - } - if ((j + 1) % 5 == 0) - { - args.Player.SendMessage(sb.ToString(), Color.Yellow); - sb.Clear(); - } - } - } - } - if (Warps.Count > (15 * page)) - { - args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow); - } - } - else + if (args.Parameters[0].Equals("list")) + { + //How many warps per page + const int pagelimit = 15; + //How many warps 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) { - string warpName = String.Join(" ", args.Parameters); - var warp = TShock.Warps.FindWarp(warpName); - if (warp.WarpPos != Vector2.Zero) + if (!int.TryParse(args.Parameters[1], out page) || page < 1) { - if (args.Player.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3)) - args.Player.SendMessage("Warped to " + warpName, Color.Yellow); - } - else - { - args.Player.SendMessage("Specified warp not found", Color.Red); + 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 + } + + var warps = TShock.Warps.ListAllWarps(Main.worldName); + + //Check if they are trying to access a page that doesn't exist. + int pagecount = warps.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 Warps ({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) < warps.Count; i++) + { + nameslist.Add(warps[i].WarpName); + } + + //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 /warp list {0} for more warps.", (page + 1)), Color.Yellow); } } else - args.Player.SendMessage("Invalid syntax! Proper syntax: /warp [name] or warp list", Color.Red); + { + string warpName = String.Join(" ", args.Parameters); + var warp = TShock.Warps.FindWarp(warpName); + if (warp.WarpPos != Vector2.Zero) + { + if (args.Player.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3)) + args.Player.SendMessage("Warped to " + warpName, Color.Yellow); + } + else + { + args.Player.SendMessage("Specified warp not found", Color.Red); + } + } + } #endregion Teleport Commands @@ -1375,7 +1395,7 @@ namespace TShockAPI { foreach (Region r in TShock.Regions.Regions) { - args.Player.SendMessage(r.RegionName + ": P: " + r.DisableBuild + " X: " + r.RegionArea.X + " Y: " + r.RegionArea.Y + " W: " + r.RegionArea.Width + " H: " + r.RegionArea.Height ); + args.Player.SendMessage(r.RegionName + ": P: " + r.DisableBuild + " X: " + r.RegionArea.X + " Y: " + r.RegionArea.Y + " W: " + r.RegionArea.Width + " H: " + r.RegionArea.Height); foreach (int s in r.RegionAllowedIDs) { args.Player.SendMessage(r.RegionName + ": " + s); @@ -1877,7 +1897,7 @@ namespace TShockAPI return; } int itemAmount = 0; - int.TryParse( args.Parameters[args.Parameters.Count - 1 ], out itemAmount ); + int.TryParse(args.Parameters[args.Parameters.Count - 1], out itemAmount); var items = Tools.GetItemByIdOrName(args.Parameters[0]); if (items.Count == 0) { @@ -1894,7 +1914,7 @@ namespace TShockAPI { if (args.Player.InventorySlotAvailable || item.name.Contains("Coin")) { - if( itemAmount == 0 || itemAmount > item.maxStack ) + if (itemAmount == 0 || itemAmount > item.maxStack) itemAmount = item.maxStack; args.Player.GiveItem(item.type, item.name, item.width, item.height, itemAmount); args.Player.SendMessage(string.Format("Gave {0} {1}(s).", itemAmount.ToString(), item.name)); diff --git a/TShockAPI/DB/WarpsManager.cs b/TShockAPI/DB/WarpsManager.cs index bbcafc8a..0187f16f 100644 --- a/TShockAPI/DB/WarpsManager.cs +++ b/TShockAPI/DB/WarpsManager.cs @@ -116,7 +116,7 @@ namespace TShockAPI.DB break; } } - + } reader.Close(); String path = Path.Combine(TShock.SavePath, "old_configs"); @@ -145,7 +145,7 @@ namespace TShockAPI.DB { Log.Error(ex.ToString()); } - } + } public bool AddWarp(int x, int y, string name, string worldid) { @@ -202,7 +202,7 @@ namespace TShockAPI.DB { if (reader.Read()) { - return new Warp(new Vector2(reader.Get("X"), reader.Get("Y")), reader.Get("WarpName"), reader.Get("WorldID")); + return new Warp(new Vector2(reader.Get("X"), reader.Get("Y")), reader.Get("WarpName"), reader.Get("WorldID")); } reader.Close(); } @@ -215,20 +215,24 @@ namespace TShockAPI.DB return new Warp(); } - public List ListAllWarps() + /// + /// Gets all the warps names from world + /// + /// World name to get warps from + /// List of warps with only their names + public List ListAllWarps(string worldid) { - List Warps = new List(); + var warps = new List(); try { using (var com = database.CreateCommand()) { - com.CommandText = "SELECT * FROM Warps"; + com.CommandText = "SELECT WarpName FROM Warps WHERE WorldID=@worldid"; + com.AddParameter("@worldid", worldid); using (var reader = com.ExecuteReader()) { while (reader.Read()) - Warps.Add(new Warp(new Vector2(reader.Get("X"), reader.Get("Y")), reader.Get("WarpName"), reader.Get("WorldID"))); - - reader.Close(); + warps.Add(new Warp { WarpName = reader.Get("WarpName") }); } } } @@ -236,7 +240,7 @@ namespace TShockAPI.DB { Log.Error(ex.ToString()); } - return Warps; + return warps; } }