From 818e9ce24bb55087a6d750340a633a8265e95d22 Mon Sep 17 00:00:00 2001 From: stacey <57187883+moisterrific@users.noreply.github.com> Date: Sat, 31 Jul 2021 13:59:24 -0400 Subject: [PATCH 1/4] Add new Respawn command --- TShockAPI/Commands.cs | 55 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index cae1ebf3..501efe0f 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -599,6 +599,10 @@ namespace TShockAPI { HelpText = "Sends all tiles from the server to the player to resync the client with the actual world state." }); + add(new Command(Permissions.respawn, Respawn, "respawn") + { + HelpText = "Respawn yourself or another player." + }); #endregion add(new Command(Aliases, "aliases") @@ -5632,6 +5636,57 @@ namespace TShockAPI plr.SendErrorMessage("{0} just killed you!", args.Player.Name); } } + + private static void Respawn(CommandArgs args) + { + TSPlayer playerToRespawn; + if (args.Parameters.Count > 0) + { + if (!args.Player.HasPermission(Permissions.respawnother)) + { + args.Player.SendErrorMessage("You do not have permission to respawn another player."); + return; + } + string plStr = String.Join(" ", args.Parameters); + var players = TSPlayer.FindByNameOrID(plStr); + if (players.Count == 0) + { + args.Player.SendErrorMessage($"Could not find any player named \"{plStr}\""); + return; + } + else if (players.Count > 1) + { + args.Player.SendMultipleMatchError(players.Select(p => p.Name)); + return; + } + else + playerToRespawn = players[0]; + } + else if (!args.Player.RealPlayer) + { + args.Player.SendErrorMessage("You can't respawn the server console!"); + return; + } + else + playerToRespawn = args.Player; + + if (!playerToRespawn.Dead) + { + args.Player.SendErrorMessage($"{(playerToRespawn == args.Player ? "You" : playerToRespawn.Name)} {(playerToRespawn == args.Player ? "are" : "is")} not dead."); + return; + } + else + playerToRespawn.Spawn(PlayerSpawnContext.ReviveFromDeath); + + if (playerToRespawn != args.Player) + { + args.Player.SendSuccessMessage($"You have respawned {playerToRespawn.Name}"); + if (!args.Silent) + playerToRespawn.SendSuccessMessage($"{args.Player.Name} has respawned you."); + } + else + playerToRespawn.SendSuccessMessage("You have respawned yourself."); + } private static void Butcher(CommandArgs args) { From c1f14367e6b882cc282b66c9d1635b97551f941b Mon Sep 17 00:00:00 2001 From: stacey <57187883+moisterrific@users.noreply.github.com> Date: Sat, 31 Jul 2021 14:01:17 -0400 Subject: [PATCH 2/4] Add respawn and respawnother permissions --- TShockAPI/Permissions.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/TShockAPI/Permissions.cs b/TShockAPI/Permissions.cs index 7df1ca83..7de195d2 100644 --- a/TShockAPI/Permissions.cs +++ b/TShockAPI/Permissions.cs @@ -436,6 +436,12 @@ namespace TShockAPI [Description("User can kill others.")] public static readonly string kill = "tshock.kill"; + + [Description("Player can respawn themselves.")] + public static readonly string respawn = "tshock.respawn"; + + [Description("Player can respawn others.")] + public static readonly string respawnother = "tshock.respawn.other"; [Description("Allows you to bypass the max slots for up to 5 slots above your max.")] public static readonly string reservedslot = "tshock.reservedslot"; From f53ba4309390930941df1e8d5b8599860a8e2562 Mon Sep 17 00:00:00 2001 From: stacey <57187883+moisterrific@users.noreply.github.com> Date: Sat, 31 Jul 2021 14:05:59 -0400 Subject: [PATCH 3/4] Add respawn command to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73eb4121..031cb686 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin ## Upcoming changes * Fixed SendTileRectHandler not sending tile rect updates like Pylons/Mannequins to other clients. (@Stealownz) * Fix some typos that have been in the repository for over a lustrum. (@Killia0) +* Added a new `/respawn` command that lets you respawn yourself or another player. Respawning yourself requires the `tshock.respawn` permission and respawning others requires the `tshock.respawn.other` permission. The full command syntax is `/respawn [player]`. (@moisterrific) ## TShock 4.5.5 * Changed the world autosave message so that it no longer warns of a "potential lag spike." (@hakusaro) From aa4b735163ebcb15c33937d4931cb343f71b69a9 Mon Sep 17 00:00:00 2001 From: stacey <57187883+moisterrific@users.noreply.github.com> Date: Mon, 2 Aug 2021 11:15:21 -0400 Subject: [PATCH 4/4] Refactor for fail fast approach --- TShockAPI/Commands.cs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index bdce7fb3..f464470f 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -5666,6 +5666,11 @@ namespace TShockAPI private static void Respawn(CommandArgs args) { + if (!args.Player.RealPlayer) + { + args.Player.SendErrorMessage("You can't respawn the server console!"); + return; + } TSPlayer playerToRespawn; if (args.Parameters.Count > 0) { @@ -5681,20 +5686,14 @@ namespace TShockAPI args.Player.SendErrorMessage($"Could not find any player named \"{plStr}\""); return; } - else if (players.Count > 1) + if (players.Count > 1) { args.Player.SendMultipleMatchError(players.Select(p => p.Name)); return; } - else - playerToRespawn = players[0]; + playerToRespawn = players[0]; } - else if (!args.Player.RealPlayer) - { - args.Player.SendErrorMessage("You can't respawn the server console!"); - return; - } - else + else playerToRespawn = args.Player; if (!playerToRespawn.Dead) @@ -5702,8 +5701,7 @@ namespace TShockAPI args.Player.SendErrorMessage($"{(playerToRespawn == args.Player ? "You" : playerToRespawn.Name)} {(playerToRespawn == args.Player ? "are" : "is")} not dead."); return; } - else - playerToRespawn.Spawn(PlayerSpawnContext.ReviveFromDeath); + playerToRespawn.Spawn(PlayerSpawnContext.ReviveFromDeath); if (playerToRespawn != args.Player) {