From b090b1fe967635375b53624d5ccbb5ce47955ce2 Mon Sep 17 00:00:00 2001 From: Steven French Date: Tue, 5 Jul 2011 21:08:11 +1200 Subject: [PATCH] Warps are now SQL based (sql branch) Need to make warps auto copy from old structure --- TShockAPI/Commands.cs | 21 +++-- TShockAPI/TShock.cs | 3 +- TShockAPI/WarpsManager.cs | 167 ++++++++++++-------------------------- 3 files changed, 65 insertions(+), 126 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index c666e8a3..7e9017cd 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -918,10 +918,9 @@ namespace TShockAPI { args.Player.SendMessage("Name reserved, use a different name", Color.Red); } - else if (WarpsManager.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldName)) + else if (TShock.Warps.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldName)) { args.Player.SendMessage("Set warp " + warpName, Color.Yellow); - WarpsManager.WriteSettings(); } else { @@ -937,7 +936,7 @@ namespace TShockAPI if (args.Parameters.Count > 0) { string warpName = String.Join(" ", args.Parameters); - if (WarpsManager.DeleteWarp(warpName)) + if (TShock.Warps.RemoveWarp(warpName)) args.Player.SendMessage("Deleted warp " + warpName, Color.Yellow); else args.Player.SendMessage("Could not find specified warp", Color.Red); @@ -957,16 +956,16 @@ namespace TShockAPI if (args.Parameters.Count > 1) int.TryParse(args.Parameters[1], out page); var sb = new StringBuilder(); - if (WarpsManager.Warps.Count > (15 * (page - 1))) + if (WarpManager.Warps.Count > (15 * (page - 1))) { for (int j = (15 * (page - 1)); j < (15 * page); j++) { - if (WarpsManager.Warps[j].WorldWarpName == Main.worldName) + if (WarpManager.Warps[j].WorldWarpName == Main.worldName) { if (sb.Length != 0) sb.Append(", "); - sb.Append("/").Append(WarpsManager.Warps[j].WarpName); - if (j == WarpsManager.Warps.Count - 1) + sb.Append("/").Append(WarpManager.Warps[j].WarpName); + if (j == WarpManager.Warps.Count - 1) { args.Player.SendMessage(sb.ToString(), Color.Yellow); break; @@ -979,7 +978,7 @@ namespace TShockAPI } } } - if (WarpsManager.Warps.Count > (15 * page)) + if (WarpManager.Warps.Count > (15 * page)) { args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow); } @@ -987,10 +986,10 @@ namespace TShockAPI else { string warpName = String.Join(" ", args.Parameters); - var warp = WarpsManager.FindWarp(warpName); - if (warp != Vector2.Zero) + var warp = TShock.Warps.FindWarp(warpName); + if (warp.WarpPos != Vector2.Zero) { - if (args.Player.Teleport((int)warp.X, (int)warp.Y + 3)) + if (args.Player.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3)) args.Player.SendMessage("Warped to " + warpName, Color.Yellow); } else diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index bb6fed51..13788936 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -43,6 +43,7 @@ namespace TShockAPI public static TSPlayer[] Players = new TSPlayer[Main.maxPlayers]; public static BanManager Bans; + public static WarpManager Warps; public static BackupManager Backups; public static ConfigFile Config { get; set; } @@ -109,6 +110,7 @@ namespace TShockAPI } Bans = new BanManager(DB); + Warps = new WarpManager(DB); Log.ConsoleInfo(string.Format("TShock Version {0} ({1}) now running.", Version, VersionCodename)); @@ -126,7 +128,6 @@ namespace TShockAPI GetDataHandlers.InitGetDataHandler(); Commands.InitCommands(); RegionManager.ReadAllSettings(); - WarpsManager.ReadAllSettings(); ItemManager.LoadBans(); Log.ConsoleInfo("AutoSave " + (TShock.Config.AutoSave ? "Enabled" : "Disabled")); diff --git a/TShockAPI/WarpsManager.cs b/TShockAPI/WarpsManager.cs index a034587a..8e1cd805 100644 --- a/TShockAPI/WarpsManager.cs +++ b/TShockAPI/WarpsManager.cs @@ -20,162 +20,101 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Data; +using Community.CsharpSqlite.SQLiteClient; using Microsoft.Xna.Framework; using System.Xml; using Terraria; namespace TShockAPI { - class WarpsManager + public class WarpManager { + private IDbConnection database; + public static List Warps = new List(); - public static bool AddWarp(int x, int y, string name, string worldname) + public WarpManager(IDbConnection db) { - foreach (Warp nametest in Warps) + database = db; + + using (var com = database.CreateCommand()) { - if (name.ToLower() == nametest.WarpName.ToLower()) - { - return false; - } + com.CommandText = + "CREATE TABLE IF NOT EXISTS \"Warps\" (\"X\" VARCHAR(4) NOT NULL UNIQUE, \"Y\" VARCHAR(4) NOT NULL UNIQUE , \"WarpName\" VARCHAR(32) NOT NULL , \"WorldName\" VARCHAR(255) NOT NULL );"; + com.ExecuteNonQuery(); } - Warps.Add(new Warp(new Vector2(x, y), name, worldname)); - return true; } - public static bool DeleteWarp(string name) + static IDbDataParameter AddParameter(IDbCommand command, string name, object data) { - foreach (Warp nametest in Warps) + var parm = command.CreateParameter(); + parm.ParameterName = name; + parm.Value = data; + command.Parameters.Add(parm); + return parm; + } + + public bool AddWarp(int x, int y, string name, string worldname) + { + try { - if (name.ToLower() == nametest.WarpName.ToLower() && nametest.WorldWarpName == Main.worldName) + using (var com = database.CreateCommand()) { - Warps.Remove(nametest); - WriteSettings(); - return true; + com.CommandText = "INSERT INTO Warps (X, Y, WarpName, WorldName) VALUES (@x, @y, @name, @worldname)"; + AddParameter(com, "@x", x); + AddParameter(com, "@y", y); + AddParameter(com, "@name", name.ToLower()); + AddParameter(com, "@worldname", worldname); + com.ExecuteNonQuery(); } + return true; + } + catch (SqliteExecutionException ex) + { } return false; } - public static Vector2 FindWarp(string name) - { - foreach (Warp nametest in Warps) - { - if (name.ToLower() == nametest.WarpName.ToLower() && nametest.WorldWarpName == Main.worldName) - { - return nametest.WarpPos; - } - } - return Vector2.Zero; - } - - public static void WriteSettings() + public bool RemoveWarp(string name) { try { - XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); - xmlWriterSettings.Indent = true; - xmlWriterSettings.NewLineChars = Environment.NewLine; - - using (XmlWriter settingsw = XmlWriter.Create(FileTools.WarpsPath, xmlWriterSettings)) + using (var com = database.CreateCommand()) { - settingsw.WriteStartDocument(); - settingsw.WriteStartElement("Warps"); - - foreach (Warp warp in Warps) - { - settingsw.WriteStartElement("Warp"); - settingsw.WriteElementString("WarpName", warp.WarpName); - settingsw.WriteElementString("X", warp.WarpPos.X.ToString()); - settingsw.WriteElementString("Y", warp.WarpPos.Y.ToString()); - settingsw.WriteElementString("WorldName", warp.WorldWarpName); - settingsw.WriteEndElement(); - } - - settingsw.WriteEndElement(); - settingsw.WriteEndDocument(); + com.CommandText = "DELETE FROM Warps WHERE WarpName=@name AND WorldName=@worldname"; + AddParameter(com, "@name", name.ToLower()); + AddParameter(com, "@worldname", Main.worldName); + com.ExecuteNonQuery(); + return true; } - Log.Info("Wrote Warps"); } - catch + catch (SqliteExecutionException ex) { - Log.Info("Could not write Warps"); } + return false; } - public static void ReadAllSettings() + public Warp FindWarp(string name) { try { - XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); - xmlReaderSettings.IgnoreWhitespace = true; - - using (XmlReader settingr = XmlReader.Create(FileTools.WarpsPath, xmlReaderSettings)) + using (var com = database.CreateCommand()) { - while (settingr.Read()) + com.CommandText = "SELECT * FROM Warps WHERE WarpName=@name AND WorldName=@worldname"; + AddParameter(com, "@name", name.ToLower()); + AddParameter(com, "@worldname", Main.worldName); + using (var reader = com.ExecuteReader()) { - if (settingr.IsStartElement()) - { - switch (settingr.Name) - { - case "Warps": - { - break; - } - case "Warp": - { - if (settingr.Read()) - { - string name = string.Empty; - int x = 0; - int y = 0; - string worldname = string.Empty; - - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - name = settingr.Value; - else - Log.Warn("Warp name is empty, This warp will not work"); - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - Int32.TryParse(settingr.Value, out x); - else - Log.Warn("x for warp " + name + " is empty"); - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - Int32.TryParse(settingr.Value, out y); - else - Log.Warn("y for warp " + name + " is empty"); - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - worldname = settingr.Value; - else - Log.Warn("Worldname for warp " + name + " is empty"); - - AddWarp(x, y, name, worldname); - } - break; - } - } - } + if (reader.Read()) + return new Warp(new Vector2(Int32.Parse((string)reader["X"]),Int32.Parse((string)reader["Y"])), (string)reader["WarpName"], (string)reader["WorldName"]); } } - Log.Info("Read Warps"); } - catch + catch (SqliteExecutionException ex) { - Log.Info("Could not read Warps"); - WriteSettings(); } + return new Warp(); } }