Merge branch 'master' of github.com:TShock/TShock

This commit is contained in:
Lucas Nicodemus 2011-07-22 20:28:52 -06:00
commit 79e70bf90a
4 changed files with 222 additions and 190 deletions

View file

@ -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;
@ -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,40 +1126,60 @@ namespace TShockAPI
private static void UseWarp(CommandArgs args)
{
if (args.Parameters.Count > 0)
if (args.Parameters.Count < 1)
{
args.Player.SendMessage("Invalid syntax! Proper syntax: /warp [name] or /warp list <page>", Color.Red);
return;
}
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<Warp> Warps = TShock.Warps.ListAllWarps();
//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 (Warps.Count > (15 * (page - 1)))
if (args.Parameters.Count > 1)
{
for (int j = (15 * (page - 1)); j < (15 * page); j++)
if (!int.TryParse(args.Parameters[1], out page) || page < 1)
{
if (Warps[j].WorldWarpID == Main.worldName)
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)
{
if (sb.Length != 0)
sb.Append(", ");
sb.Append(Warps[j].WarpName);
if (j == Warps.Count - 1)
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<string>();
for (int i = 0; i < pagelimit && i + (page * pagelimit) < warps.Count; i++)
{
args.Player.SendMessage(sb.ToString(), Color.Yellow);
break;
nameslist.Add(warps[i].WarpName);
}
if ((j + 1) % 5 == 0)
//convert the list to an array for joining
var names = nameslist.ToArray();
for (int i = 0; i < names.Length; i += perline)
{
args.Player.SendMessage(sb.ToString(), Color.Yellow);
sb.Clear();
args.Player.SendMessage(string.Join(", ", names, i, Math.Min(names.Length - i, perline)), Color.Yellow);
}
}
}
}
if (Warps.Count > (15 * page))
if (page < pagecount)
{
args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow);
}
@ -1176,9 +1198,7 @@ namespace TShockAPI
args.Player.SendMessage("Specified warp not found", Color.Red);
}
}
}
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /warp [name] or warp list", Color.Red);
}
#endregion Teleport Commands
@ -1541,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();
{
if (!int.TryParse(args.Parameters[1], out page) || page < 1)
{
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
}
List<Region> Regions = TShock.Regions.ListAllRegions();
var regions = TShock.Regions.ListAllRegions(Main.worldName);
if (Regions.Count > (15 * (page - 1)))
//Check if they are trying to access a page that doesn't exist.
int pagecount = regions.Count / pagelimit;
if (page > pagecount)
{
for (int j = (15 * (page - 1)); j < (15 * page); j++)
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<string>();
for (int i = 0; i < pagelimit && i + (page * pagelimit) < regions.Count; i++)
{
if (Regions[j].RegionWorldID == Main.worldName)
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)
{
if (sb.Length != 0)
sb.Append(", ");
sb.Append(Regions[j].RegionName);
if (j == Regions.Count - 1)
{
args.Player.SendMessage(sb.ToString(), Color.Yellow);
break;
args.Player.SendMessage(string.Join(", ", names, i, Math.Min(names.Length - i, perline)), Color.Yellow);
}
if ((j + 1) % 5 == 0)
{
args.Player.SendMessage(sb.ToString(), Color.Yellow);
sb.Clear();
}
}
}
}
if (Regions.Count > (15 * page))
if (page < pagecount)
{
args.Player.SendMessage(string.Format("Type /region list {0} for more regions.", (page + 1)), Color.Yellow);
}
break;
}
case "help":

View file

@ -28,57 +28,15 @@ namespace TShockAPI.DB
"CREATE TABLE IF NOT EXISTS GroupList (GroupName VARCHAR(255) PRIMARY, Commands VARCHAR(255), OrderBy VARCHAR(255));";
com.ExecuteNonQuery();
}
if (TShock.Config.StorageType.ToLower() == "sqlite")
com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);";
else if (TShock.Config.StorageType.ToLower() == "mysql")
com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;";
com.AddParameter("@groupname", "trustedadmin");
com.AddParameter("@commands", "admin,maintenance,cfg,butcher,item,heal,immunetoban,ignorecheatdetection,ignoregriefdetection,usebanneditem,manageusers");
com.AddParameter("@order", "0");
com.ExecuteNonQuery();
com.Parameters.Clear();
//Add default groups
AddGroup("trustedadmin", "admin,maintenance,cfg,butcher,item,heal,immunetoban,ignorecheatdetection,ignoregriefdetection,usebanneditem,manageusers");
AddGroup("admin", "newadmin,ban,unban,whitelist,causeevents,spawnboss,spawnmob,managewarp,time,tp,pvpfun,kill,logs,immunetokick,tphere");
AddGroup("newadmin", "default,kick,editspawn,reservedslot");
AddGroup("default", "canwater,canlava,warp,canbuild");
AddGroup("vip", "default,canwater,canlava,warp,canbuild,reservedslot");
if (TShock.Config.StorageType.ToLower() == "sqlite")
com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);";
else if (TShock.Config.StorageType.ToLower() == "mysql")
com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;";
com.AddParameter("@groupname", "admin");
com.AddParameter("@commands", "newadmin,ban,unban,whitelist,causeevents,spawnboss,spawnmob,managewarp,time,tp,pvpfun,kill,logs,immunetokick,tphere");
com.AddParameter("@order", "0");
com.ExecuteNonQuery();
com.Parameters.Clear();
if (TShock.Config.StorageType.ToLower() == "sqlite")
com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);";
else if (TShock.Config.StorageType.ToLower() == "mysql")
com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;";
com.AddParameter("@groupname", "newadmin");
com.AddParameter("@commands", "default,kick,editspawn,reservedslot");
com.AddParameter("@order", "0");
com.ExecuteNonQuery();
com.Parameters.Clear();
if (TShock.Config.StorageType.ToLower() == "sqlite")
com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);";
else if (TShock.Config.StorageType.ToLower() == "mysql")
com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;";
com.AddParameter("@groupname", "default");
com.AddParameter("@commands", "canwater,canlava,warp,canbuild");
com.AddParameter("@order", "0");
com.ExecuteNonQuery();
com.Parameters.Clear();
if (TShock.Config.StorageType.ToLower() == "sqlite")
com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);";
else if (TShock.Config.StorageType.ToLower() == "mysql")
com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;";
com.AddParameter("@groupname", "vip");
com.AddParameter("@commands", "default,canwater,canlava,warp,canbuild,reservedslot");
com.AddParameter("@order", "0");
com.ExecuteNonQuery();
com.Parameters.Clear();
String file = Path.Combine(TShock.SavePath, "groups.txt");
if (File.Exists(file))
@ -91,10 +49,6 @@ namespace TShockAPI.DB
if (!line.Equals("") && !line.Substring(0, 1).Equals("#"))
{
String[] info = line.Split(' ');
if (TShock.Config.StorageType.ToLower() == "sqlite")
com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);";
else if (TShock.Config.StorageType.ToLower() == "mysql")
com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;";
String comms = "";
int size = info.Length;
int test = 0;
@ -107,11 +61,18 @@ namespace TShockAPI.DB
comms = comms + ",";
comms = comms + info[i].Trim();
}
com.AddParameter("@groupname", info[0].Trim().ToString());
using (var com = database.CreateCommand())
{
if (TShock.Config.StorageType.ToLower() == "sqlite")
com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);";
else if (TShock.Config.StorageType.ToLower() == "mysql")
com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;";
com.AddParameter("@groupname", info[0].Trim());
com.AddParameter("@commands", comms);
com.AddParameter("@order", hasOrder ? info[info.Length - 1] : "0");
com.ExecuteNonQuery();
com.Parameters.Clear();
}
}
}
}
@ -123,6 +84,28 @@ namespace TShockAPI.DB
File.Delete(file2);
File.Move(file, file2);
}
}
/// <summary>
/// Adds group with name and permissions if it does not exist.
/// </summary>
/// <param name="name">name of group</param>
/// <param name="commands">permissions</param>
public void AddGroup(string name, string commands)
{
using (var com = database.CreateCommand())
{
if (TShock.Config.StorageType.ToLower() == "sqlite")
com.CommandText =
"INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);";
else if (TShock.Config.StorageType.ToLower() == "mysql")
com.CommandText =
"INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;";
com.AddParameter("@groupname", name);
com.AddParameter("@commands", commands);
com.AddParameter("@order", "0");
com.ExecuteNonQuery();
}
}

View file

@ -120,7 +120,8 @@ namespace TShockAPI.DB
{
prot = 0;
}
else{
else
{
prot = 1;
}
break;
@ -151,7 +152,8 @@ namespace TShockAPI.DB
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.");
}
@ -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.");
@ -438,7 +441,8 @@ namespace TShockAPI.DB
{
ReloadAllRegions();
return true;
} else
}
else
{
return false;
}
@ -451,19 +455,24 @@ namespace TShockAPI.DB
}
}
public List<Region> ListAllRegions()
/// <summary>
/// Gets all the regions names from world
/// </summary>
/// <param name="worldid">World name to get regions from</param>
/// <returns>List of regions with only their names</returns>
public List<Region> ListAllRegions(string worldid)
{
List<Region> Regions = new List<Region>();
var regions = new List<Region>();
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<int>("X1"), reader.Get<int>("Y1"), reader.Get<int>("height"), reader.Get<int>("width")), reader.Get<string>("RegionName"), reader.Get<int>("Protected"), reader.Get<string>("WorldID")));
reader.Close();
regions.Add(new Region { RegionName = reader.Get<string>("RegionName") });
}
}
}
@ -471,7 +480,7 @@ namespace TShockAPI.DB
{
Log.Error(ex.ToString());
}
return Regions;
return regions;
}
}

View file

@ -215,20 +215,24 @@ namespace TShockAPI.DB
return new Warp();
}
public List<Warp> ListAllWarps()
/// <summary>
/// Gets all the warps names from world
/// </summary>
/// <param name="worldid">World name to get warps from</param>
/// <returns>List of warps with only their names</returns>
public List<Warp> ListAllWarps(string worldid)
{
List<Warp> Warps = new List<Warp>();
var warps = new List<Warp>();
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<int>("X"), reader.Get<int>("Y")), reader.Get<string>("WarpName"), reader.Get<string>("WorldID")));
reader.Close();
warps.Add(new Warp { WarpName = reader.Get<string>("WarpName") });
}
}
}
@ -236,7 +240,7 @@ namespace TShockAPI.DB
{
Log.Error(ex.ToString());
}
return Warps;
return warps;
}
}