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.*`
This commit is contained in:
Chris 2020-05-20 00:11:04 +09:30
parent a178b31333
commit 6ecdf8545f
2 changed files with 204 additions and 111 deletions

View file

@ -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<string> _validEvents = new List<string>()
{
"meteor",
"fullmoon",
"bloodmoon",
"eclipse",
"invasion",
"sandstorm",
"rain"
};
static readonly List<string> _validInvasions = new List<string>()
{
"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 <event type>", 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 <invasion type> [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 <stop/start>", 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 <stop/start>", 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] <stop/start>", 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] <stop/start>", Specifier);
break;
}
}
private static void Slap(CommandArgs args)
{
if (args.Parameters.Count < 1 || args.Parameters.Count > 2)

View file

@ -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";