Пример #1
0
        /// <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.");
            }
        }
Пример #2
0
        //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());
            }
        }
Пример #3
0
        public string GetLabel(String name)
        {
            Warpplate wp = FindWarpplate(name);

            if (String.IsNullOrEmpty(wp.Label))
            {
                return(name);
            }
            else
            {
                return(wp.Label);
            }
        }
Пример #4
0
        /// <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);
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        /// <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.");
        }
Пример #8
0
        /// <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);
            }
        }
Пример #9
0
        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;
                }
            }
        }
Пример #10
0
        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);
                }
            }
        }