/// <summary> /// Updates a specified warpplate in the database. /// </summary> /// <param name="_warpplateToUpdate">The warpplate to update.</param> /// <param name="_type">The type of information being updated.</param> /// <param name="_oldName">If the name is being updated, the previous name of the warpplate.</param> public static void UpdateWarpplate(Warpplate _warpplateToUpdate, UpdateType _type, string _oldName = "") { string oldName = _warpplateToUpdate.Name; string query = "UPDATE `Warpplates` SET `"; switch (_type) { case UpdateType.Delay: query += $"delay` = {_warpplateToUpdate.Delay}"; break; case UpdateType.Destination: query += $"destination` = '{_warpplateToUpdate.DestinationWarpplate}'"; break; case UpdateType.Name: query += $"warpname` = '{_warpplateToUpdate.Name}'"; oldName = _oldName; break; case UpdateType.Size: query += $"width` = {_warpplateToUpdate.Area.Width} AND `height` = {_warpplateToUpdate.Area.Height}"; break; } query += $" WHERE `warpname` = '{oldName}'"; int result = db.Query(query); if (result != 1) { TShock.Log.ConsoleError("Failed to update warpplate information in database."); } }
//public void ConvertDB() //{ // try // { // database.Query("UPDATE Warpplates SET WorldID=@0, UserIds='', Delay=4", Main.worldID.ToString()); // ReloadAllWarpplates(); // } // catch (Exception ex) // { // TShock.Log.Error(ex.ToString()); // } //} public void ReloadAllWarpplates() { try { using (var reader = database.QueryReader("SELECT * FROM Warpplates WHERE WorldID=@0", Main.worldID.ToString())) { Warpplates.Clear(); while (reader.Read()) { int X1 = reader.Get <int>("X1"); int Y1 = reader.Get <int>("Y1"); int height = reader.Get <int>("height"); int width = reader.Get <int>("width"); int Protected = reader.Get <int>("Protected"); string mergedids = reader.Get <string>("UserIds"); string name = reader.Get <string>("WarpplateName"); string warpdest = reader.Get <string>("WarpplateDestination"); int Delay = reader.Get <int>("Delay"); string label = reader.Get <string>("Label"); string[] splitids = mergedids.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); Warpplate r = new Warpplate(new Vector2(X1, Y1), new Rectangle(X1, Y1, width, height), name, warpdest, Protected != 0, Main.worldID.ToString(), label) { Delay = Delay }; try { for (int i = 0; i < splitids.Length; i++) { if (Int32.TryParse(splitids[i], out int id)) // if unparsable, it's not an int, so silently skip { r.AllowedIDs.Add(id); } else { TShock.Log.Warn("One of your UserIDs is not a usable integer: " + splitids[i]); } } } catch (Exception e) { TShock.Log.Error("Your database contains invalid UserIDs (they should be ints)."); TShock.Log.Error("A lot of things will fail because of this. You must manually delete and re-create the allowed field."); TShock.Log.Error(e.ToString()); TShock.Log.Error(e.StackTrace); } Warpplates.Add(r); } } } catch (Exception ex) { TShock.Log.Error(ex.ToString()); } }
public string GetLabel(String name) { Warpplate wp = FindWarpplate(name); if (String.IsNullOrEmpty(wp.Label)) { return(name); } else { return(wp.Label); } }
/// <summary> /// Removes a specified warpplate from the database. /// </summary> /// <param name="_warpplateToRemove">The warpplate to be removed.</param> public static void RemoveWarpplate(Warpplate _warpplateToRemove) { string query = $"DELETE FROM `Warpplates` WHERE `warpname` = '{_warpplateToRemove.Name}';"; int result = db.Query(query); if (result != 1) { TShock.Log.ConsoleError("Failed to remove warpplate from database."); } else { warpplateList.Remove(_warpplateToRemove); } }
public bool adddestination(string WarpplateName, String WarpDestination) { Warpplate r = GetWarpplateByName(WarpplateName); if (r != null) { int q = database.Query("UPDATE Warpplates SET WarpplateDestination=@0 WHERE WarpplateName=@1 AND WorldID=@2;", WarpDestination, WarpplateName, Main.worldID.ToString()); r.DestinationWarpplate = WarpDestination; if (q > 0) { return(true); } } return(false); }
public bool DeleteWarpplate(string name) { Warpplate r = GetWarpplateByName(name); if (r != null) { int q = database.Query("DELETE FROM Warpplates WHERE WarpplateName=@0 AND WorldID=@1", name, Main.worldID.ToString()); Warpplates.Remove(r); if (q > 0) { return(true); } } return(false); }
/// <summary> /// Reloads the warpplates from the database. /// </summary> public static void ReloadWarpplates() { warpplateList.Clear(); string query = $"SELECT * FROM `Warpplates` WHERE `worldid` = {Main.worldID};"; using (var reader = db.QueryReader(query)) { while (reader.Read()) { Warpplate warpplate = new Warpplate( reader.Get <string>("warpname"), reader.Get <int>("x"), reader.Get <int>("y"), reader.Get <int>("width"), reader.Get <int>("height"), reader.Get <int>("delay"), reader.Get <string>("destination")); warpplateList.Add(warpplate); } } TShock.Log.Info("Reloaded warpplates from database."); }
/// <summary> /// Adds a new warpplate to the database. /// </summary> /// <param name="_newWarpplate">The warpplate to be added.</param> public static void AddWarpplate(Warpplate _newWarpplate) { string query = $"INSERT INTO `Warpplates` (`warpname`, `x`, `y`, `width`, `height`, `delay`, `destination`, `worldid`) " + $"VALUES ('{_newWarpplate.Name}', " + $"{_newWarpplate.Area.X}, " + $"{_newWarpplate.Area.Y}, " + $"{_newWarpplate.Area.Width}, " + $"{_newWarpplate.Area.Height}, " + $"{_newWarpplate.Delay}, " + $"'{_newWarpplate.DestinationWarpplate}', " + $"{Main.worldID});"; int result = db.Query(query); if (result != 1) { TShock.Log.ConsoleError("Failed to add warpplate to database."); } else { warpplateList.Add(_newWarpplate); } }
private void WarpplateCommands(CommandArgs args) { TSPlayer player = args.Player; if (args.Parameters.Count < 1 || args.Parameters.Count > 4) { sendInvalidSyntaxError(); return; } string baseCmd = args.Parameters[0].ToLower(); string specifier = args.Silent ? TShock.Config.CommandSilentSpecifier : TShock.Config.CommandSpecifier; switch (baseCmd) { //warpplate add <name> case "add": if (args.Parameters.Count < 2) { args.Player.SendErrorMessage($"Invalid syntax: {specifier}warpplate add <warpplate name>"); return; } if (Utils.GetNearbyWarpplates(args.Player.TileX, args.Player.TileY) != null) { args.Player.SendErrorMessage($"There is already a warpplate here!"); return; } Warpplate newWarpplate = new Warpplate(string.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)), args.Player.TileX, args.Player.TileY); DB.AddWarpplate(newWarpplate); args.Player.SendSuccessMessage($"Added warpplate {string.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1))} at your current location."); break; //warpplate del <name> case "del": case "delete": if (args.Parameters.Count < 2) { args.Player.SendErrorMessage($"Invalid syntax: {specifier}warpplate del <warpplate name>"); return; } Warpplate warpplate = Utils.GetWarpplateByName(string.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1))); if (warpplate == null) { args.Player.SendErrorMessage($"There is no warpplate by the name of {string.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1))}!"); return; } DB.RemoveWarpplate(warpplate); args.Player.SendSuccessMessage($"Removed warpplate {string.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1))}."); break; //warpplate mod <name> <type> <value> case "mod": case "modify": if (args.Parameters.Count != 4) { args.Player.SendErrorMessage($"Invalid syntax: {specifier}warpplate mod <name> <type> <value>"); return; } //Throwing this to separate method for cleaner code processModification(); break; //warpplate info <name> case "info": if (args.Parameters.Count < 2) { args.Player.SendErrorMessage($"Invalid syntax: {specifier}warpplate del <warpplate name>"); return; } Warpplate warpplateInfo = Utils.GetWarpplateByName(string.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1))); if (warpplateInfo == null) { args.Player.SendErrorMessage($"There is no warpplate by the name of {string.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1))}!"); return; } args.Player.SendInfoMessage($"Warpplate Name: {warpplateInfo.Name} ({warpplateInfo.Area.X}, {warpplateInfo.Area.Y})"); args.Player.SendInfoMessage($"Destination Warpplate Name: {warpplateInfo.DestinationWarpplate}"); args.Player.SendInfoMessage($"Delay: {warpplateInfo.Delay} | Width: {warpplateInfo.Area.Width} | Height: {warpplateInfo.Area.Height}"); break; default: sendInvalidSyntaxError(); break; } //Sends paginated list of commands. void sendInvalidSyntaxError() { args.Player.SendErrorMessage("Invalid syntax!"); List <string> listOfData = new List <string>() { "/warpplate add <name>", "/warpplate del <name>", "/warpplate info <name>", "/warpplate mod <name> <type> <value> - Type '/warpplate help mod 1' for mod sub-commands." }; PaginationTools.Settings settings = new PaginationTools.Settings() { HeaderFormat = "Warpplate Sub-Commands ({0}/{1}):", FooterFormat = $"Type {specifier}warpplate help {{0}} for more sub-commands." }; if (args.Parameters.Count == 2 && args.Parameters[0].ToLower() == "help" && int.TryParse(args.Parameters[1], out int pageNumber)) { PaginationTools.SendPage(args.Player, pageNumber, listOfData, settings); return; } else if (args.Parameters.Count == 3 && args.Parameters[0].ToLower() == "help" && args.Parameters[1].ToLower() == "mod" && int.TryParse(args.Parameters[2], out int pageNumber2)) { List <string> listOfData2 = new List <string>() { "/warpplate mod <name> name <new name>", "/warpplate mod <name> size <w,h>", "/warppalte mod <name> delay <delay in seconds>", "/warppalte mod <name> destination <destination warpplate name>" }; PaginationTools.Settings settings2 = new PaginationTools.Settings() { HeaderFormat = "Warpplate Mod Sub-Commands ({0}/{1}):", FooterFormat = $"Type {specifier}warpplate help mod {{0}} for more sub-commands." }; PaginationTools.SendPage(args.Player, pageNumber2, listOfData2, settings2); return; } PaginationTools.SendPage(args.Player, 1, listOfData, settings); } //Processes warpplate mod commands void processModification() { Warpplate warpplate = Utils.GetWarpplateByName(args.Parameters[1]); if (warpplate == null) { args.Player.SendErrorMessage($"No warpplate found by the name {warpplate.Name}!"); return; } string subcmd = args.Parameters[2].ToLower(); switch (subcmd) { //warpplate mod <name> dest <new destination> case "dest": case "destination": string destinationWarpplateName = string.Join(" ", args.Parameters[3]); if (destinationWarpplateName == "-n") { warpplate.DestinationWarpplate = null; DB.UpdateWarpplate(warpplate, DB.UpdateType.Destination); args.Player.SendSuccessMessage("Removed destination warpplate."); return; } if (Utils.GetWarpplateByName(destinationWarpplateName) == null) { args.Player.SendErrorMessage($"No warpplate found by the name {destinationWarpplateName}!"); return; } warpplate.DestinationWarpplate = destinationWarpplateName; DB.UpdateWarpplate(warpplate, DB.UpdateType.Destination); args.Player.SendSuccessMessage($"Set destination warpplate to {destinationWarpplateName}."); break; //warpplate mod <name> delay <delay> case "delay": if (int.TryParse(args.Parameters[3], out int newDelay)) { warpplate.Delay = newDelay; DB.UpdateWarpplate(warpplate, DB.UpdateType.Delay); args.Player.SendSuccessMessage($"Updated delay time to {newDelay} for warpplate {warpplate.Name}!"); } else { args.Player.SendErrorMessage("Invalid delay value!"); } break; //warpplate mod <name> size w,h case "size": string size = args.Parameters[3]; if (!size.Contains(",") || size.Split(',').Length != 2) { args.Player.SendErrorMessage("Invalid syntax: {specifier}warpplate mod <name> size w,h"); return; } if (int.TryParse(size.Split(',')[0], out int width) && (int.TryParse(size.Split(',')[1], out int height))) { //TODO: Set config for max width/height if (width < 1 || height < 1) { args.Player.SendErrorMessage("Invalid size!"); return; } warpplate.Area = new Rectangle(warpplate.Area.X, warpplate.Area.Y, width, height); DB.UpdateWarpplate(warpplate, DB.UpdateType.Size); args.Player.SendSuccessMessage($"Updated size of warpplate {warpplate.Name}!"); } else { args.Player.SendErrorMessage("Invalid size values!"); return; } break; //warpplate mod <name> name <new name> case "name": case "label": string name = string.Join(" ", args.Parameters.GetRange(3, args.Parameters.Count - 3)); string oldName = warpplate.Name; warpplate.Name = name; DB.UpdateWarpplate(warpplate, DB.UpdateType.Name, oldName); args.Player.SendSuccessMessage($"Updated name of warpplate to {warpplate.Name}!"); break; } } }
private void OnUpdate(EventArgs args) { //Only update every second. if ((DateTime.UtcNow - lastCheck).TotalSeconds >= 1) { lastCheck = DateTime.UtcNow; foreach (TSPlayer player in TShock.Players) { if (player == null || !player.RealPlayer || !player.HasPermission("warpplate.use") || !player.ContainsData(dataString)) { continue; } PlayerInfo playerInfo = player.GetData <PlayerInfo>(dataString); //If player doesn't want to be warped, ignore this player if (!playerInfo.WarpingEnabled) { continue; } //If player last warped within 3 seconds, ignore this player if (playerInfo.Cooldown > 0) { playerInfo.Cooldown--; player.SetData(dataString, playerInfo); continue; } //If player is not near a warpplate, ignore this player Warpplate fromWarpPlate = Utils.GetNearbyWarpplates(player.TileX, player.TileY); if (fromWarpPlate == null) { if (playerInfo.TimeStandingOnWarp > 0) { playerInfo.TimeStandingOnWarp = 0; player.SetData(dataString, playerInfo); } continue; } //If player is near a warpplate but that warpplate has no destination, ignore this player if (string.IsNullOrEmpty(fromWarpPlate.DestinationWarpplate)) { if (playerInfo.TimeStandingOnWarp > 0) { playerInfo.TimeStandingOnWarp = 0; player.SetData(dataString, playerInfo); } continue; } Warpplate toWarpPlate = Utils.GetWarpplateByName(fromWarpPlate.DestinationWarpplate); //If player is near a warpplate but hasn't been near it for Delay seconds, ignore this player if ((fromWarpPlate.Delay - playerInfo.TimeStandingOnWarp) > 0) { playerInfo.TimeStandingOnWarp++; player.SendWarningMessage($"You will be warped to '{toWarpPlate.Name}' in {(fromWarpPlate.Delay - playerInfo.TimeStandingOnWarp) + 1} seconds!"); player.SetData(dataString, playerInfo); continue; } //Finally, teleport player if all previous conditions were met if (player.Teleport((int)(toWarpPlate.Area.X * 16) + 2, (int)(toWarpPlate.Area.Y * 16) + 3)) { player.SendInfoMessage("You have been warped to " + toWarpPlate.Name + " via a warpplate"); } //Reset info playerInfo.TimeStandingOnWarp = 0; playerInfo.Cooldown = 3; //TODO: Config! player.SetData(dataString, playerInfo); } } }