From 8ced5d5dfc36b02756aa83fde2074ae6ce04fdc6 Mon Sep 17 00:00:00 2001 From: Patrikkk Date: Mon, 18 May 2020 18:47:39 +0200 Subject: [PATCH 01/16] Adding new buffs to OnNPCAddBuff Missed these buffs with their bufftimes, so it was always caught by the bouncer, thinking players are hacking. --- TShockAPI/Bouncer.cs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs index 5fcc306f..11d293f0 100644 --- a/TShockAPI/Bouncer.cs +++ b/TShockAPI/Bouncer.cs @@ -1402,7 +1402,8 @@ namespace TShockAPI if (detectedNPCBuffTimeCheat) { - args.Player.Kick("Added buff to NPC abnormally.", true); + + args.Player.Kick($"Added buff to NPC abnormally.", true); args.Handled = true; } } @@ -1867,8 +1868,8 @@ namespace TShockAPI } } } - - + + // These time values are references from Projectile.cs, at npc.AddBuff() calls. private static Dictionary NPCAddBuffTimeMax = new Dictionary() { { BuffID.Poisoned, 3600 }, @@ -1891,9 +1892,18 @@ namespace TShockAPI { BuffID.BetsysCurse, 600 }, { BuffID.Oiled, 540 }, { BuffID.Confused, 450 }, // Brain of Confusion Internal Item ID: 3223 - { BuffID.Daybreak, 300 } // Solar Eruption Item ID: 3473, Daybreak Item ID: 3543 + { BuffID.Daybreak, 300 }, // Solar Eruption Item ID: 3473, Daybreak Item ID: 3543 + { BuffID.BlandWhipEnemyDebuff, 240 }, + { BuffID.SwordWhipNPCDebuff, 240 }, + { BuffID.ScytheWhipEnemyDebuff, 240 }, + { BuffID.FlameWhipEnemyDebuff, 240 }, + { BuffID.ThornWhipNPCDebuff, 240 }, + { BuffID.RainbowWhipNPCDebuff, 240 }, + { BuffID.MaceWhipNPCDebuff, 240 }, + { BuffID.GelBalloonBuff, 1800 } + }; - + /// /// Tile IDs that can be oriented: /// Cannon, From dce7e579a727a68913193b59f5aaec017c563c37 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 19 May 2020 00:53:05 +0000 Subject: [PATCH 02/16] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 44811b36..7449d87d 100644 --- a/README.md +++ b/README.md @@ -259,6 +259,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Rodrigo Rente

💻 📆 ⚠️
Stargazing Koishi

💻 🚇
Axeel

📖 📆 +
Patrikkk

💻 📖 ⚠️ From 6f1c6d2bd5bae3bc186f56a6d34e5b63b077a88c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 19 May 2020 00:53:06 +0000 Subject: [PATCH 03/16] docs: update README_cn.md [skip ci] --- README_cn.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README_cn.md b/README_cn.md index ff900a06..a824a2c5 100644 --- a/README_cn.md +++ b/README_cn.md @@ -76,6 +76,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Rodrigo Rente

💻 📆 ⚠️
Stargazing Koishi

💻 🚇
Axeel

📖 📆 +
Patrikkk

💻 📖 ⚠️ From f8670a02e1aed5bcd8e71d0ee93c2d80d84161c7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 19 May 2020 00:53:07 +0000 Subject: [PATCH 04/16] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6f9e5960..9ebc6ab5 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -46,6 +46,17 @@ "doc", "projectManagement" ] + }, + { + "login": "Patrikkk", + "name": "Patrikkk", + "avatar_url": "https://avatars0.githubusercontent.com/u/58985873?v=4", + "profile": "https://aurora-gaming.org/", + "contributions": [ + "code", + "doc", + "test" + ] } ], "contributorsPerLine": 7, From d8747c34e9d2226f202c771ef63841111994bc92 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Mon, 18 May 2020 18:25:07 -0700 Subject: [PATCH 05/16] Rename /bloodmoon to /tbloodmoon --- CHANGELOG.md | 3 ++- TShockAPI/Commands.cs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48596cb3..deb4bedb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,8 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin ## Upcoming changes -* Fixed NPC buff anticheat issue conflicting with Terraria gameplay changes (whips) (@Patrikkk) +* Fixed NPC buff anticheat issue conflicting with Terraria gameplay changes (whips). (@Patrikkk) +* Renamed `/bloodmoon` to `/tbloodmoon` because of conflict with Terraria reserved words. (@hakusaro) ## TShock 4.4.0 (Pre-release 1) * Added confused debuff to Bouncer for confusion applied from Brain of Confusion diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index d934d512..6c8d5723 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -478,7 +478,7 @@ namespace TShockAPI { HelpText = "Toggles build protection." }); - add(new Command(Permissions.bloodmoon, Bloodmoon, "bloodmoon") + add(new Command(Permissions.bloodmoon, Bloodmoon, "tbloodmoon") { HelpText = "Sets a blood moon." }); From 35198647a1944241ede866d5b61a7324decf29b7 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Mon, 18 May 2020 18:40:51 -0700 Subject: [PATCH 06/16] Presumptively fix MySQL 8 compat `Groups` is a reserved name in MySQL 8 and this should fix compat issues with it. --- TShockAPI/DB/RegionManager.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index d776028b..eaf8f1ba 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -141,7 +141,7 @@ namespace TShockAPI.DB try { database.Query( - "INSERT INTO Regions (X1, Y1, width, height, RegionName, WorldID, UserIds, Protected, Groups, Owner, Z) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10);", + "INSERT INTO Regions (X1, Y1, width, height, RegionName, WorldID, UserIds, Protected, `Groups`, Owner, Z) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10);", tx, ty, width, height, regionname, worldid, "", 1, "", owner, z); int id; using (QueryResult res = database.QueryReader("SELECT Id FROM Regions WHERE RegionName = @0 AND WorldID = @1", regionname, worldid)) @@ -609,7 +609,7 @@ namespace TShockAPI.DB { string mergedGroups = ""; using ( - var reader = database.QueryReader("SELECT Groups FROM Regions WHERE RegionName=@0 AND WorldID=@1", regionName, + var reader = database.QueryReader("SELECT `Groups` FROM Regions WHERE RegionName=@0 AND WorldID=@1", regionName, Main.worldID.ToString())) { if (reader.Read()) @@ -625,7 +625,7 @@ namespace TShockAPI.DB mergedGroups += ","; mergedGroups += groupName; - int q = database.Query("UPDATE Regions SET Groups=@0 WHERE RegionName=@1 AND WorldID=@2", mergedGroups, + int q = database.Query("UPDATE Regions SET `Groups`=@0 WHERE RegionName=@1 AND WorldID=@2", mergedGroups, regionName, Main.worldID.ToString()); Region r = GetRegionByName(regionName); @@ -654,7 +654,7 @@ namespace TShockAPI.DB { r.RemoveGroup(group); string groups = string.Join(",", r.AllowedGroups); - int q = database.Query("UPDATE Regions SET Groups=@0 WHERE RegionName=@1 AND WorldID=@2", groups, + int q = database.Query("UPDATE Regions SET `Groups`=@0 WHERE RegionName=@1 AND WorldID=@2", groups, regionName, Main.worldID.ToString()); if (q > 0) return true; From 240b6b71b0825f59f49f03871be6dc0e662e59f6 Mon Sep 17 00:00:00 2001 From: Chris <2648373+QuiCM@users.noreply.github.com> Date: Tue, 19 May 2020 13:20:45 +0930 Subject: [PATCH 07/16] Change toggleexpert command to change the world mode --- TShockAPI/Commands.cs | 50 +++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 6c8d5723..a3c9010c 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -470,9 +470,9 @@ namespace TShockAPI }); #endregion #region World Commands - add(new Command(Permissions.toggleexpert, ToggleExpert, "expert", "expertmode") + add(new Command(Permissions.toggleexpert, ChangeWorldMode, "worldmode", "gamemode") { - HelpText = "Toggles expert mode." + HelpText = "Changes the world mode." }); add(new Command(Permissions.antibuild, ToggleAntiBuild, "antibuild") { @@ -2143,17 +2143,45 @@ namespace TShockAPI } } - private static void ToggleExpert(CommandArgs args) + static Dictionary _worldModes = new Dictionary { - const int NormalMode = 0; - const int ExpertMode = 1; - if (Main.GameMode != ExpertMode) - Main.GameMode = ExpertMode; - else if (Main.GameMode == ExpertMode) - Main.GameMode = NormalMode; + { "normal", 1 }, + { "expert", 2 }, + { "master", 3 }, + { "creative", 4 }, + }; - TSPlayer.All.SendData(PacketTypes.WorldInfo); - args.Player.SendSuccessMessage("Expert mode is now {0}.", Main.expertMode ? "on" : "off"); + private static void ChangeWorldMode(CommandArgs args) + { + if (args.Parameters.Count < 1) + { + args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}worldmode ", Specifier); + args.Player.SendErrorMessage("Valid mode: {0}", String.Join(", ", _worldModes.Keys)); + return; + } + + int mode; + + if (int.TryParse(args.Parameters[0], out mode)) + { + if (mode < 1 || mode > 4) + { + args.Player.SendErrorMessage("Invalid mode! Valid modes: {0}", String.Join(", ", _worldModes.Keys)); + return; + } + } + else if (_worldModes.ContainsKey(args.Parameters[0].ToLowerInvariant())) + { + mode = _worldModes[args.Parameters[0].ToLowerInvariant()]; + } + else + { + args.Player.SendErrorMessage("Invalid mode! Valid modes: {0}", String.Join(", ", _worldModes.Keys)); + return; + } + + Main.GameMode = mode; + args.Player.SendSuccessMessage("World mode set to {0}", _worldModes.Keys.ElementAt(mode - 1)); } private static void Hardmode(CommandArgs args) From 31f9c570807c81437d16d8e151f78a80711cd0a0 Mon Sep 17 00:00:00 2001 From: Asada shinon Date: Tue, 19 May 2020 19:02:40 +0800 Subject: [PATCH 08/16] Quick Command ID Fix --- TShockAPI/Commands.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index a3c9010c..925ebf29 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -2145,10 +2145,10 @@ namespace TShockAPI static Dictionary _worldModes = new Dictionary { - { "normal", 1 }, - { "expert", 2 }, - { "master", 3 }, - { "creative", 4 }, + { "normal", 0 }, + { "expert", 1 }, + { "master", 2 }, + { "creative", 3 }, }; private static void ChangeWorldMode(CommandArgs args) From 0cd8a87178003221912599364c12728109bc8c2b Mon Sep 17 00:00:00 2001 From: Asada shinon Date: Tue, 19 May 2020 19:04:08 +0800 Subject: [PATCH 09/16] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index deb4bedb..5d46ae5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin ## Upcoming changes +* Fixed worldmode command (@Ristellise) * Fixed NPC buff anticheat issue conflicting with Terraria gameplay changes (whips). (@Patrikkk) * Renamed `/bloodmoon` to `/tbloodmoon` because of conflict with Terraria reserved words. (@hakusaro) From 57a8aacf393c5f528463ce021e3b3a2452d9d0dd Mon Sep 17 00:00:00 2001 From: Asada shinon Date: Tue, 19 May 2020 19:05:16 +0800 Subject: [PATCH 10/16] Elaborated Changes. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d46ae5b..ba8077e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin ## Upcoming changes -* Fixed worldmode command (@Ristellise) +* Fixed `/worldmode` command to correctly target world mode. (@Ristellise) * Fixed NPC buff anticheat issue conflicting with Terraria gameplay changes (whips). (@Patrikkk) * Renamed `/bloodmoon` to `/tbloodmoon` because of conflict with Terraria reserved words. (@hakusaro) From a178b31333ddd32ad25f4e4b2d346fed116e60ff Mon Sep 17 00:00:00 2001 From: Chris <2648373+QuiCM@users.noreply.github.com> Date: Tue, 19 May 2020 23:04:23 +0930 Subject: [PATCH 11/16] Fixes world mode some more --- TShockAPI/Commands.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 925ebf29..f5e37b85 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -2149,6 +2149,7 @@ namespace TShockAPI { "expert", 1 }, { "master", 2 }, { "creative", 3 }, + { "journey", 3 } }; private static void ChangeWorldMode(CommandArgs args) @@ -2164,7 +2165,7 @@ namespace TShockAPI if (int.TryParse(args.Parameters[0], out mode)) { - if (mode < 1 || mode > 4) + if (mode < 0 || mode > 3) { args.Player.SendErrorMessage("Invalid mode! Valid modes: {0}", String.Join(", ", _worldModes.Keys)); return; From 6ecdf8545f7eedd6726b00d36beb88777bb499b1 Mon Sep 17 00:00:00 2001 From: Chris <2648373+QuiCM@users.noreply.github.com> Date: Wed, 20 May 2020 00:11:04 +0930 Subject: [PATCH 12/16] Consolidated a number of world event commands into one master command `worldevent` is now the root for the following: Meteor, fullmoon, bloodmoon, eclipse, invasions, sandstorm, rain. Added a new set of permission nodes to represent world events: `tshock.world.events.*` --- TShockAPI/Commands.cs | 305 +++++++++++++++++++++++++-------------- TShockAPI/Permissions.cs | 10 ++ 2 files changed, 204 insertions(+), 111 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index f5e37b85..ee84fc34 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -400,10 +400,6 @@ namespace TShockAPI { HelpText = "Renames an NPC." }); - add(new Command(Permissions.invade, Invade, "invade") - { - HelpText = "Starts an NPC invasion." - }); add(new Command(Permissions.maxspawns, MaxSpawns, "maxspawns") { HelpText = "Sets the maximum number of NPCs." @@ -478,23 +474,11 @@ namespace TShockAPI { HelpText = "Toggles build protection." }); - add(new Command(Permissions.bloodmoon, Bloodmoon, "tbloodmoon") - { - HelpText = "Sets a blood moon." - }); add(new Command(Permissions.grow, Grow, "grow") { AllowServer = false, HelpText = "Grows plants at your location." }); - add(new Command(Permissions.dropmeteor, DropMeteor, "dropmeteor") - { - HelpText = "Drops a meteor somewhere in the world." - }); - add(new Command(Permissions.eclipse, Eclipse, "eclipse") - { - HelpText = "Sets an eclipse." - }); add(new Command(Permissions.halloween, ForceHalloween, "forcehalloween") { HelpText = "Toggles halloween mode (goodie bags, pumpkins, etc)." @@ -503,9 +487,9 @@ namespace TShockAPI { HelpText = "Toggles christmas mode (present spawning, santa, etc)." }); - add(new Command(Permissions.fullmoon, Fullmoon, "fullmoon") + add(new Command(Permissions.manageevents, ManageWorldEvent, "worldevent") { - HelpText = "Sets a full moon." + HelpText = "Enables starting and stopping various world events." }); add(new Command(Permissions.hardmode, Hardmode, "hardmode") { @@ -515,14 +499,6 @@ namespace TShockAPI { HelpText = "Toggles spawn protection." }); - add(new Command(Permissions.sandstorm, Sandstorm, "sandstorm") - { - HelpText = "Toggles sandstorms." - }); - add(new Command(Permissions.rain, Rain, "rain") - { - HelpText = "Toggles the rain." - }); add(new Command(Permissions.worldsave, Save, "save") { HelpText = "Saves the world file." @@ -1978,6 +1954,118 @@ namespace TShockAPI #region Cause Events and Spawn Monsters Commands + static readonly List _validEvents = new List() + { + "meteor", + "fullmoon", + "bloodmoon", + "eclipse", + "invasion", + "sandstorm", + "rain" + }; + static readonly List _validInvasions = new List() + { + "goblins", + "snowmen", + "pirates", + "pumpkinmoon", + "frostmoon" + }; + + private static void ManageWorldEvent(CommandArgs args) + { + if (args.Parameters.Count < 1) + { + args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}worldevent ", Specifier); + args.Player.SendErrorMessage("Valid event types: {0}", String.Join(", ", _validEvents)); + args.Player.SendErrorMessage("Valid invasion types if spawning an invasion: {0}", String.Join(", ", _validInvasions)); + return; + } + + var eventType = args.Parameters[0].ToLowerInvariant(); + + void FailedPermissionCheck() + { + args.Player.SendErrorMessage("You do not have sufficient permissions to start the {0} event.", eventType); + return; + } + + switch (eventType) + { + case "meteor": + if (!args.Player.HasPermission(Permissions.dropmeteor) && !args.Player.HasPermission(Permissions.managemeteorevent)) + { + FailedPermissionCheck(); + return; + } + + DropMeteor(args); + return; + + case "fullmoon": + case "full moon": + if (!args.Player.HasPermission(Permissions.fullmoon) && !args.Player.HasPermission(Permissions.managefullmoonevent)) + { + FailedPermissionCheck(); + return; + } + Fullmoon(args); + return; + + case "bloodmoon": + case "blood moon": + if (!args.Player.HasPermission(Permissions.bloodmoon) && !args.Player.HasPermission(Permissions.managebloodmoonevent)) + { + FailedPermissionCheck(); + return; + } + Bloodmoon(args); + return; + + case "eclipse": + if (!args.Player.HasPermission(Permissions.eclipse) && !args.Player.HasPermission(Permissions.manageeclipseevent)) + { + FailedPermissionCheck(); + return; + } + Eclipse(args); + return; + + case "invade": + case "invasion": + if (!args.Player.HasPermission(Permissions.invade) && !args.Player.HasPermission(Permissions.manageinvasionevent)) + { + FailedPermissionCheck(); + return; + } + Invade(args); + return; + + case "sandstorm": + if (!args.Player.HasPermission(Permissions.sandstorm) && !args.Player.HasPermission(Permissions.managesandstormevent)) + { + FailedPermissionCheck(); + return; + } + Sandstorm(args); + return; + + case "rain": + if (!args.Player.HasPermission(Permissions.rain) && !args.Player.HasPermission(Permissions.managerainevent)) + { + FailedPermissionCheck(); + return; + } + Rain(args); + return; + + default: + args.Player.SendErrorMessage("Invalid event type! Valid event types: {0}", String.Join(", ", _validEvents)); + return; + } + } + private static void DropMeteor(CommandArgs args) { WorldGen.spawnMeteor = false; @@ -2035,14 +2123,15 @@ namespace TShockAPI { if (Main.invasionSize <= 0) { - if (args.Parameters.Count < 1) + if (args.Parameters.Count < 2) { - args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}invade [wave]", Specifier); + args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}worldevent invasion [invasion type] [invasion wave]", Specifier); + args.Player.SendErrorMessage("Valid invasion types: {0}", String.Join(", ", _validInvasions)); return; } int wave = 1; - switch (args.Parameters[0].ToLower()) + switch (args.Parameters[1].ToLowerInvariant()) { case "goblin": case "goblins": @@ -2064,9 +2153,9 @@ namespace TShockAPI case "pumpkin": case "pumpkinmoon": - if (args.Parameters.Count > 1) + if (args.Parameters.Count > 2) { - if (!int.TryParse(args.Parameters[1], out wave) || wave <= 0) + if (!int.TryParse(args.Parameters[2], out wave) || wave <= 0) { args.Player.SendErrorMessage("Invalid wave!"); break; @@ -2082,9 +2171,9 @@ namespace TShockAPI case "frost": case "frostmoon": - if (args.Parameters.Count > 1) + if (args.Parameters.Count > 2) { - if (!int.TryParse(args.Parameters[1], out wave) || wave <= 0) + if (!int.TryParse(args.Parameters[2], out wave) || wave <= 0) { args.Player.SendErrorMessage("Invalid wave!"); return; @@ -2103,6 +2192,10 @@ namespace TShockAPI TSPlayer.All.SendInfoMessage("{0} has started a martian invasion.", args.Player.Name); TShock.Utils.StartInvasion(4); break; + + default: + args.Player.SendErrorMessage("Invalid invasion type! Valid invasion types: {0}", String.Join(", ", _validInvasions)); + break; } } else if (DD2Event.Ongoing) @@ -2117,6 +2210,71 @@ namespace TShockAPI } } + private static void Sandstorm(CommandArgs args) + { + if (Terraria.GameContent.Events.Sandstorm.Happening) + { + Terraria.GameContent.Events.Sandstorm.StopSandstorm(); + TSPlayer.All.SendInfoMessage("{0} stopped the sandstorm.", args.Player.Name); + } + else + { + Terraria.GameContent.Events.Sandstorm.StartSandstorm(); + TSPlayer.All.SendInfoMessage("{0} started a sandstorm.", args.Player.Name); + } + } + + private static void Rain(CommandArgs args) + { + bool slime = false; + if (args.Parameters.Count > 1 && args.Parameters[1].ToLowerInvariant() == "slime") + { + slime = true; + } + + if (!slime) + { + args.Player.SendInfoMessage("Use \"{0}worldevent rain slime\" to start slime rain!", Specifier); + } + + if (slime && Main.raining) //Slime rain cannot be activated during normal rain + { + args.Player.SendErrorMessage("You should stop the current downpour before beginning a slimier one!"); + return; + } + + if (slime && Main.slimeRain) //Toggle slime rain off + { + Main.StopSlimeRain(false); + TSPlayer.All.SendData(PacketTypes.WorldInfo); + TSPlayer.All.SendInfoMessage("{0} ended the slimey downpour.", args.Player.Name); + return; + } + + if (slime && !Main.slimeRain) //Toggle slime rain on + { + Main.StartSlimeRain(false); + TSPlayer.All.SendData(PacketTypes.WorldInfo); + TSPlayer.All.SendInfoMessage("{0} caused it to rain slime.", args.Player.Name); + } + + if (Main.raining && !slime) //Toggle rain off + { + Main.StopRain(); + TSPlayer.All.SendData(PacketTypes.WorldInfo); + TSPlayer.All.SendInfoMessage("{0} ended the downpour.", args.Player.Name); + return; + } + + if (!Main.raining && !slime) //Toggle rain on + { + Main.StartRain(); + TSPlayer.All.SendData(PacketTypes.WorldInfo); + TSPlayer.All.SendInfoMessage("{0} caused it to rain.", args.Player.Name); + return; + } + } + private static void ClearAnglerQuests(CommandArgs args) { if (args.Parameters.Count > 0) @@ -2148,8 +2306,8 @@ namespace TShockAPI { "normal", 0 }, { "expert", 1 }, { "master", 2 }, - { "creative", 3 }, - { "journey", 3 } + { "journey", 3 }, + { "creative", 3 } }; private static void ChangeWorldMode(CommandArgs args) @@ -2182,7 +2340,7 @@ namespace TShockAPI } Main.GameMode = mode; - args.Player.SendSuccessMessage("World mode set to {0}", _worldModes.Keys.ElementAt(mode - 1)); + args.Player.SendSuccessMessage("World mode set to {0}", _worldModes.Keys.ElementAt(mode)); } private static void Hardmode(CommandArgs args) @@ -4053,81 +4211,6 @@ namespace TShockAPI } } - private static void Sandstorm(CommandArgs args) - { - if (args.Parameters.Count < 1) - { - args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}sandstorm ", Specifier); - return; - } - - switch (args.Parameters[0].ToLowerInvariant()) - { - case "start": - Terraria.GameContent.Events.Sandstorm.StartSandstorm(); - TSPlayer.All.SendInfoMessage("{0} started a sandstorm.", args.Player.Name); - break; - case "stop": - Terraria.GameContent.Events.Sandstorm.StopSandstorm(); - TSPlayer.All.SendInfoMessage("{0} stopped the sandstorm.", args.Player.Name); - break; - default: - args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}sandstorm ", Specifier); - break; - } - } - - private static void Rain(CommandArgs args) - { - if (args.Parameters.Count < 1 || args.Parameters.Count > 2) - { - args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}rain [slime] ", Specifier); - return; - } - - int switchIndex = 0; - if (args.Parameters.Count == 2 && args.Parameters[0].ToLowerInvariant() == "slime") - { - switchIndex = 1; - } - - switch (args.Parameters[switchIndex].ToLower()) - { - case "start": - if (switchIndex == 1) - { - Main.StartSlimeRain(false); - TSPlayer.All.SendData(PacketTypes.WorldInfo); - TSPlayer.All.SendInfoMessage("{0} caused it to rain slime.", args.Player.Name); - } - else - { - Main.StartRain(); - TSPlayer.All.SendData(PacketTypes.WorldInfo); - TSPlayer.All.SendInfoMessage("{0} caused it to rain.", args.Player.Name); - } - break; - case "stop": - if (switchIndex == 1) - { - Main.StopSlimeRain(false); - TSPlayer.All.SendData(PacketTypes.WorldInfo); - TSPlayer.All.SendInfoMessage("{0} ended the slimey downpour.", args.Player.Name); - } - else - { - Main.StopRain(); - TSPlayer.All.SendData(PacketTypes.WorldInfo); - TSPlayer.All.SendInfoMessage("{0} ended the downpour.", args.Player.Name); - } - break; - default: - args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}rain [slime] ", Specifier); - break; - - } - } - private static void Slap(CommandArgs args) { if (args.Parameters.Count < 1 || args.Parameters.Count > 2) diff --git a/TShockAPI/Permissions.cs b/TShockAPI/Permissions.cs index 0aebd037..e0aca166 100644 --- a/TShockAPI/Permissions.cs +++ b/TShockAPI/Permissions.cs @@ -271,6 +271,16 @@ namespace TShockAPI // tshock.world nodes + [Description("User can use the 'worldevent' command")] + public static readonly string manageevents = "tshock.world.events"; + public static readonly string managebloodmoonevent = "tshock.world.events.bloodmoon"; + public static readonly string managefullmoonevent = "tshock.world.events.fullmoon"; + public static readonly string manageinvasionevent = "tshock.world.events.invasion"; + public static readonly string managemeteorevent = "tshock.world.events.meteor"; + public static readonly string manageeclipseevent = "tshock.world.events.eclipse"; + public static readonly string managesandstormevent = "tshock.world.events.sandstorm"; + public static readonly string managerainevent = "tshock.world.events.rain"; + [Description("User can change expert state.")] public static readonly string toggleexpert = "tshock.world.toggleexpert"; From 2df23c53b74280912815e34a1b943ada8ad86c9b Mon Sep 17 00:00:00 2001 From: Chris <2648373+QuiCM@users.noreply.github.com> Date: Wed, 20 May 2020 00:39:24 +0930 Subject: [PATCH 13/16] Add annotations to new permissions --- TShockAPI/Permissions.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/TShockAPI/Permissions.cs b/TShockAPI/Permissions.cs index e0aca166..b08c122d 100644 --- a/TShockAPI/Permissions.cs +++ b/TShockAPI/Permissions.cs @@ -273,12 +273,26 @@ namespace TShockAPI [Description("User can use the 'worldevent' command")] public static readonly string manageevents = "tshock.world.events"; + + [Description("User can use the 'bloodmoon' subcommand of the 'worldevent' command")] public static readonly string managebloodmoonevent = "tshock.world.events.bloodmoon"; + + [Description("User can use the 'fullmoon' subcommand of the 'worldevent' command")] public static readonly string managefullmoonevent = "tshock.world.events.fullmoon"; + + [Description("User can use the 'invasion' subcommand of the 'worldevent' command")] public static readonly string manageinvasionevent = "tshock.world.events.invasion"; + + [Description("User can use the 'meteor' subcommand of the 'worldevent' command")] public static readonly string managemeteorevent = "tshock.world.events.meteor"; + + [Description("User can use the 'eclipse' subcommand of the 'worldevent' command")] public static readonly string manageeclipseevent = "tshock.world.events.eclipse"; + + [Description("User can use the 'sandstorm' subcommand of the 'worldevent' command")] public static readonly string managesandstormevent = "tshock.world.events.sandstorm"; + + [Description("User can use the 'rain' subcommand of the 'worldevent' command")] public static readonly string managerainevent = "tshock.world.events.rain"; [Description("User can change expert state.")] From e1fa7aa55656c241188483129de49f4498b3ce6f Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 19 May 2020 15:06:09 -0700 Subject: [PATCH 14/16] Restructure folder structure of GHA artifacts --- .github/workflows/build.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9310765a..67a3ae87 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,11 +45,15 @@ jobs: run: | nuget restore TShock.sln "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\msbuild.exe" .\TShockAPI\TShockAPI.csproj /p:Configuration=Release - - name: Copy prebuilts into output folders + - name: Normalize release packaging shell: cmd run: | xcopy /Y prebuilts\*.* TShockAPI\bin\Release xcopy /Y prebuilts\*.* TShockAPI\bin\Debug + mkdir TShockAPI\bin\Debug\ServerPlugins + mkdir TShockAPI\bin\Release\ServerPlugins + move TShockAPI\bin\Release\TShockAPI.dll TShockAPI\bin\Release\ServerPlugins + move TShockAPI\bin\Debug\TShockAPI.dll TShockAPI\bin\Debug\ServerPlugins - uses: actions/upload-artifact@master with: name: Experimental TShock (not debug) From ad8a95643bf704c6840aab1d4a47ccd4c5bf6507 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 19 May 2020 20:49:12 -0700 Subject: [PATCH 15/16] Reconcile changelog with latest release UwU --- CHANGELOG.md | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba8077e9..2ef4591b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,28 @@ This is the rolling changelog for TShock for Terraria. Use past tense when adding new entries; sign your name off when you add or change something. This should primarily be things like user changes, not necessarily codebase changes unless it's really relevant or large. -## Upcoming changes - +## TShock 4.4.0 (Pre-release 3) * Fixed `/worldmode` command to correctly target world mode. (@Ristellise) +* The following commands have been removed: `tbloodmoon`, `invade`, `dropmeteor`. `fullmoon`, `sandstorm`, `rain`, `eclipse` +* The following command has been added to replace them: `worldevent`. This command requires the `tshock.world.events` permission. + * `worldevent` can be used as so: `worldevent [event type] [sub type] [wave (if invasion event)]` + * Valid event types are `meteor`, `fullmoon`, `bloodmoon`, `eclipse`, `invasion`, `sandstorm`, `rain` + * Valid sub types are `goblins`, `snowmen`, `pirates`, `pumpkinmoon`, `frostmoon` for invasions, and `slime` for rain. + +* A new set of permissions has been added under the node `tshock.world.events`: + * `tshock.world.events.bloodmoon`: Enables access to the `worldevent bloodmoon` command + * `tshock.world.events.fullmoon`: Enables access to the `worldevent fullmoon` command + * `tshock.world.events.invasion`: Enables access to the `worldevent invasion` command + * `tshock.world.events.eclipse`: Enables access to the `worldevent eclipse` command + * `tshock.world.events.sandstorm`: Enables access to the `worldevent sandstorm` command + * `tshock.world.events.rain`: Enables access to the `worldevent rain` command + * `tshock.world.events.meteor`: Enables access to the `worldevent meteor` command + +Please note that the permissions previously tied to the removed commands are also still used to confirm access to the new commands, so if you have existing configurations no one should have any new or lost access. + +## TShock 4.4.0 (Pre-release 2) +* Replaced `/expert` with `/worldmode` command. (@QuiCM) * Fixed NPC buff anticheat issue conflicting with Terraria gameplay changes (whips). (@Patrikkk) -* Renamed `/bloodmoon` to `/tbloodmoon` because of conflict with Terraria reserved words. (@hakusaro) ## TShock 4.4.0 (Pre-release 1) * Added confused debuff to Bouncer for confusion applied from Brain of Confusion From 19de42230490c04448a21653e76e80ebde14f718 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 19 May 2020 20:59:10 -0700 Subject: [PATCH 16/16] Add plugin site link to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7449d87d..0cc1eb0e 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ TShock is a toolbox for Terraria servers and communities. That toolbox is jam pa **We are currently polishing on Terraria 1.4.0.2 (curRelease = 226). For updates, check our [twitter, @Pryaxis](https://twitter.com/Pryaxis).** * Download: [Stable](https://github.com/TShock/TShock/releases) or [Experimental](#experimental-downloads). +* Download: [Plugins and tools](https://github.com/Pryaxis/plugins) that work with TShock, TSAPI, and Terraria. * Read [the documentation](https://tshock.readme.io/) to quickly get up to speed. * Join [Discord](https://discord.gg/Cav9nYX). * Use the ancient [old forums](https://tshock.co/xf/index.php?resources/) to find old stuff.