diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index bffc67ea..81893761 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -140,7 +140,8 @@ namespace TShockAPI ChatCommands.Add(new Command(Permissions.tp, TPHere, "tphere") { AllowServer = false }); ChatCommands.Add(new Command(Permissions.tpallow, TPAllow, "tpallow") { AllowServer = false }); add(Permissions.kick, Kick, "kick"); - add(Permissions.ban, Ban, "ban", "banip", "listbans", "unban", "unbanip", "clearbans"); + add(Permissions.ban, DeprecateBans, "banip", "listbans", "unban", "unbanip", "clearbans"); + add(Permissions.ban, Ban, "ban"); add(Permissions.whitelist, Whitelist, "whitelist"); add(Permissions.maintenance, Off, "off", "exit"); add(Permissions.maintenance, Restart, "restart"); //Added restart command @@ -161,7 +162,8 @@ namespace TShockAPI add(Permissions.spawnboss, SkeletronPrime, "skeletronp", "prime"); add(Permissions.spawnboss, Hardcore, "hardcore"); add(Permissions.spawnmob, SpawnMob, "spawnmob", "sm"); - add(Permissions.warp, Warp, "warp", "setwarp", "delwarp", "sendwarp", "sw"); + add(Permissions.warp, Warp, "warp"); + add(null, DeprecateWarp, "setwarp", "sendwarp", "delwarp", "sw"); add(Permissions.managegroup, AddGroup, "addgroup"); add(Permissions.managegroup, DeleteGroup, "delgroup"); add(Permissions.managegroup, ModifyGroup, "modgroup"); @@ -209,6 +211,7 @@ namespace TShockAPI add(Permissions.cfg, WorldInfo, "world"); add(Permissions.savessi, SaveSSI, "savessi"); add(Permissions.savessi, OverrideSSI, "overridessi", "ossi"); + add(Permissions.xmas, ForceXmas, "forcexmas"); //add(null, TestCallbackCommand, "test"); } @@ -223,9 +226,9 @@ namespace TShockAPI string cmdName = args[0].ToLower(); args.RemoveAt(0); - Command cmd = ChatCommands.FirstOrDefault(c => c.HasAlias(cmdName)); + IEnumerable cmds = ChatCommands.Where(c => c.HasAlias(cmdName)); - if (cmd == null) + if (cmds.Count() == 0) { if (player.AwaitingResponse.ContainsKey(cmdName)) { @@ -237,23 +240,25 @@ namespace TShockAPI player.SendErrorMessage("Invalid command entered. Type /help for a list of valid commands."); return true; } - - if (!cmd.CanRun(player)) - { - TShock.Utils.SendLogs(string.Format("{0} tried to execute /{1}.", player.Name, cmdText), Color.Red); - player.SendErrorMessage("You do not have access to that command."); - } - else if (!cmd.AllowServer && !player.RealPlayer) - { - player.SendErrorMessage("You must use this command in-game."); - } - else - { - if (cmd.DoLog) - TShock.Utils.SendLogs(string.Format("{0} executed: /{1}.", player.Name, cmdText), Color.Red); - cmd.Run(cmdText, player, args); - } - return true; + foreach (Command cmd in cmds) + { + if (!cmd.CanRun(player)) + { + TShock.Utils.SendLogs(string.Format("{0} tried to execute /{1}.", player.Name, cmdText), Color.Red); + player.SendErrorMessage("You do not have access to that command."); + } + else if (!cmd.AllowServer && !player.RealPlayer) + { + player.SendErrorMessage("You must use this command in-game."); + } + else + { + if (cmd.DoLog) + TShock.Utils.SendLogs(string.Format("{0} executed: /{1}.", player.Name, cmdText), Color.Red); + cmd.Run(cmdText, player, args); + } + } + return true; } /// @@ -437,6 +442,8 @@ namespace TShockAPI args.Player.LoginHarassed = false; } + + Hooks.PlayerLoginEvent.OnPlayerLogin(args.Player); } else { @@ -798,10 +805,19 @@ namespace TShockAPI } } + private static void DeprecateBans(CommandArgs args) + { + args.Player.SendInfoMessage("All ban commands were merged into one in TShock 4.0."); + args.Player.SendInfoMessage("Syntax: /ban [option] [arguments]"); + args.Player.SendInfoMessage("Options: list, listip, clear, add, addip, del, delip"); + args.Player.SendInfoMessage("Arguments: list, listip, clear [code], add [name], addip [ip], del [name], delip [name]"); + args.Player.SendInfoMessage("In addition, a reason may be provided for all new bans after the arguments."); + return; + } + private static void Ban(CommandArgs args) { - - if (args.Parameters[0].ToLower() == "help") + if (args.Parameters.Count == 0 || args.Parameters[0].ToLower() == "help") { args.Player.SendInfoMessage("All ban commands were merged into one in TShock 4.0."); args.Player.SendInfoMessage("Syntax: /ban [option] [arguments]"); @@ -1136,6 +1152,38 @@ namespace TShockAPI } } + private static void ForceXmas(CommandArgs args) + { + if(args.Parameters.Count == 0) + { + args.Player.SendErrorMessage("Usage: /forcexmas [true/false]"); + args.Player.SendInfoMessage( + String.Format("The server is currently {0} force Christmas mode.", + (TShock.Config.ForceXmas ? "in" : "not in"))); + return; + } + + if(args.Parameters[0].ToLower() == "true") + { + TShock.Config.ForceXmas = true; + Main.checkXMas(); + } + else if(args.Parameters[0].ToLower() == "false") + { + TShock.Config.ForceXmas = false; + Main.checkXMas(); + } + else + { + args.Player.SendErrorMessage("Usage: /forcexmas [true/false]"); + return; + } + + args.Player.SendInfoMessage( + String.Format("The server is currently {0} force Christmas mode.", + (TShock.Config.ForceXmas ? "in" : "not in"))); + } + #endregion Player Management Commands #region Server Maintenence Commands @@ -1619,6 +1667,25 @@ namespace TShockAPI args.Player.TPAllow = !args.Player.TPAllow; } + private static void DeprecateWarp(CommandArgs args) + { + if (args.Player.Group.HasPermission(Permissions.managewarp)) + { + args.Player.SendInfoMessage("All warp commands were merged into one in TShock 4.0."); + args.Player.SendInfoMessage("Previous warps with spaces should be wrapped in single quotes."); + args.Player.SendInfoMessage("Invalid syntax. Syntax: /warp [command] [arguments]"); + args.Player.SendInfoMessage("Commands: add, del, hide, list, send, [warpname]"); + args.Player.SendInfoMessage("Arguments: add [warp name], del [warp name], list [page]"); + args.Player.SendInfoMessage("Arguments: send [player] [warp name], hide [warp name] [Enable(true/false)]"); + args.Player.SendInfoMessage("Examples: /warp add foobar, /warp hide foobar true, /warp foobar"); + } + else + { + args.Player.SendErrorMessage("Invalid syntax. Syntax: /warp [name] or /warp list "); + args.Player.SendErrorMessage("Previous warps with spaces should be wrapped in single quotes."); + } + } + private static void Warp(CommandArgs args) { bool hasManageWarpPermission = args.Player.Group.HasPermission(Permissions.managewarp); @@ -2267,8 +2334,19 @@ namespace TShockAPI return; } - int amount = Convert.ToInt32(args.Parameters[0]); - int.TryParse(args.Parameters[0], out amount); + int amount = -1; + if (!int.TryParse(args.Parameters[0], out amount)) + { + args.Player.SendWarningMessage(string.Format("Invalid spawnrate ({0})", args.Parameters[0])); + return; + } + + if (amount < 0) + { + args.Player.SendWarningMessage("Spawnrate cannot be negative!"); + return; + } + NPC.defaultSpawnRate = amount; TShock.Config.DefaultSpawnRate = amount; TSPlayer.All.SendInfoMessage(string.Format("{0} changed the spawn rate to {1}.", args.Player.Name, amount)); diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index d7b8063d..8ad3a8d4 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -243,6 +243,8 @@ namespace TShockAPI [Description("Hide stat tracker console messages.")] public bool HideStatTrackerDebugMessages = true; + [Description("Force Christmas only events to occur all year.")] public bool ForceXmas = false; + /// /// Reads a configuration file from a given path /// diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 6b34735b..c085a31b 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -1384,6 +1384,7 @@ namespace TShockAPI } args.Player.SendMessage("Authenticated as " + args.Player.Name + " successfully.", Color.LimeGreen); Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user " + args.Player.Name + "."); + Hooks.PlayerLoginEvent.OnPlayerLogin(args.Player); return true; } TShock.Utils.ForceKick(args.Player, "Invalid user account password.", true); diff --git a/TShockAPI/Hooks/PlayerLoginEvent.cs b/TShockAPI/Hooks/PlayerLoginEvent.cs new file mode 100644 index 00000000..b533720f --- /dev/null +++ b/TShockAPI/Hooks/PlayerLoginEvent.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TShockAPI.Hooks +{ + class PlayerLoginEventArgs + { + public TSPlayer Player { get; set; } + public PlayerLoginEventArgs(TSPlayer ply) + { + Player = ply; + } + } + + class PlayerLoginEvent + { + public delegate void PlayerLoginD(PlayerLoginEventArgs e); + public static event PlayerLoginD PlayerLogin; + public static void OnPlayerLogin(TSPlayer ply) + { + if(PlayerLogin == null) + { + return; + } + + PlayerLoginEventArgs args = new PlayerLoginEventArgs(ply); + PlayerLogin(args); + } + } +} diff --git a/TShockAPI/Permissions.cs b/TShockAPI/Permissions.cs index f80ed598..f7c1b2f1 100644 --- a/TShockAPI/Permissions.cs +++ b/TShockAPI/Permissions.cs @@ -169,6 +169,8 @@ namespace TShockAPI [Description("User can use rest api calls.")] public static readonly string restapi; + [Description("User can force the server to Christmas mode.")] public static readonly string xmas; + static Permissions() { foreach (var field in typeof (Permissions).GetFields()) diff --git a/TShockAPI/Properties/AssemblyInfo.cs b/TShockAPI/Properties/AssemblyInfo.cs index 568320d9..2705da44 100644 --- a/TShockAPI/Properties/AssemblyInfo.cs +++ b/TShockAPI/Properties/AssemblyInfo.cs @@ -48,5 +48,5 @@ using System.Runtime.InteropServices; // Build Number // MMdd of the build -[assembly: AssemblyVersion("3.9.1.0526")] -[assembly: AssemblyFileVersion("3.9.1.0526")] +[assembly: AssemblyVersion("4.0.0.0923")] +[assembly: AssemblyFileVersion("4.0.0.0923")] diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index f97a56fc..d1ccc3c4 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -40,11 +40,11 @@ namespace TShockAPI [APIVersion(1, 12)] public class TShock : TerrariaPlugin { - private const string LogFormatDefault = "yyyyMMddHHmmss"; + private const string LogFormatDefault = "yyyy-MM-dd_HH-mm-ss"; private static string LogFormat = LogFormatDefault; private static bool LogClear = false; public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version; - public static readonly string VersionCodename = "4.x & 50,000th download milestone"; + public static readonly string VersionCodename = "Welcome to the future."; public static string SavePath = "tshock"; @@ -223,6 +223,7 @@ namespace TShockAPI ProjectileHooks.SetDefaults += OnProjectileSetDefaults; WorldHooks.StartHardMode += OnStartHardMode; WorldHooks.SaveWorld += SaveManager.Instance.OnSaveWorld; + WorldHooks.ChristmasCheck += OnXmasCheck; NetHooks.NameCollision += NetHooks_NameCollision; GetDataHandlers.InitGetDataHandler(); @@ -323,6 +324,7 @@ namespace TShockAPI ProjectileHooks.SetDefaults -= OnProjectileSetDefaults; WorldHooks.StartHardMode -= OnStartHardMode; WorldHooks.SaveWorld -= SaveManager.Instance.OnSaveWorld; + WorldHooks.ChristmasCheck -= OnXmasCheck; NetHooks.NameCollision -= NetHooks_NameCollision; if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) @@ -367,6 +369,17 @@ namespace TShockAPI return; } + void OnXmasCheck(ChristmasCheckEventArgs args) + { + if (args.Handled) + return; + + if(Config.ForceXmas) + { + args.Xmas = true; + args.Handled = true; + } + } /// /// Handles exceptions that we didn't catch or that Red fucked up /// diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 468a4a30..42902da7 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -86,6 +86,7 @@ + @@ -188,7 +189,7 @@ - +