From a5b19b10e05e4502dbfb6c0e4d4c3223142faa55 Mon Sep 17 00:00:00 2001 From: moneyl <8206401+Moneyl@users.noreply.github.com> Date: Sun, 13 Oct 2019 09:30:44 -0400 Subject: [PATCH] Add rejuvenate command (#380) * Add rejuvenate command Takes one or more entity uids as input. Attempts to find a DamageableComponent on that mob and heal all damage on it. * Add rejuvenate to right click menu * Update engine submodule * Make suggested changes - Remove redundant error checks in rejuvenate console command, add in relevant ones along with shell messages so the user knows what's going on. - Remove localization of group check on rejuvenate verb, since the translated version wouldn't be in groups.yml this would've broken the verb in other locales. - Have the rejuvenate verb attempt to heal the user by default if no arguments were provided to it. * More localization + help message formatting improvement * Add more suggested changes --- Content.Server/Administration/Rejuvenate.cs | 68 +++++++++++++++++++ .../Components/Damage/DamageableComponent.cs | 50 ++++++++++++++ Resources/Groups/groups.yml | 1 + 3 files changed, 119 insertions(+) create mode 100644 Content.Server/Administration/Rejuvenate.cs diff --git a/Content.Server/Administration/Rejuvenate.cs b/Content.Server/Administration/Rejuvenate.cs new file mode 100644 index 0000000000..7b372a3bd1 --- /dev/null +++ b/Content.Server/Administration/Rejuvenate.cs @@ -0,0 +1,68 @@ +using Content.Server.GameObjects; +using Robust.Server.Interfaces.Console; +using Robust.Server.Interfaces.Player; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Localization; + +namespace Content.Server.Administration +{ + class Rejuvenate : IClientCommand + { + public string Command => "rejuvenate"; + public string Description + { + get + { + var localizationManager = IoCManager.Resolve(); + return localizationManager.GetString("Fully heals a mob."); + } + } + public string Help + { + get + { + var localizationManager = IoCManager.Resolve(); + return localizationManager.GetString("Usage: rejuvenate ... \nAttempts to heal the user's mob if no arguments are provided."); + } + } + + public void Execute(IConsoleShell shell, IPlayerSession player, string[] args) + { + var localizationManager = IoCManager.Resolve(); + if (args.Length < 1 && player != null) //Try to heal the users mob if applicable + { + shell.SendText(player, localizationManager.GetString("Healing the user's mob since no arguments were provided.")); + if (player.AttachedEntity == null) + { + shell.SendText(player, localizationManager.GetString("There's no entity attached to the user.")); + return; + } + if (!player.AttachedEntity.TryGetComponent(out DamageableComponent damage)) + { + shell.SendText(player, localizationManager.GetString("The user's entity does not have a DamageableComponent.")); + return; + } + damage.HealAllDamage(); + return; + } + + var entityManager = IoCManager.Resolve(); + foreach (var arg in args) + { + if(!EntityUid.TryParse(arg, out var uid) || !entityManager.TryGetEntity(uid, out var entity)) + { + shell.SendText(player, localizationManager.GetString("Could not find entity {0}", arg)); + continue; + } + if (!entity.TryGetComponent(out DamageableComponent damage)) + { + shell.SendText(player, localizationManager.GetString("Entity {0} does not have a DamageableComponent.", arg)); + continue; + } + damage.HealAllDamage(); + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Damage/DamageableComponent.cs b/Content.Server/GameObjects/Components/Damage/DamageableComponent.cs index 46909bf75f..6ed3172312 100644 --- a/Content.Server/GameObjects/Components/Damage/DamageableComponent.cs +++ b/Content.Server/GameObjects/Components/Damage/DamageableComponent.cs @@ -1,11 +1,17 @@ using System; using System.Collections.Generic; +using System.Linq; using Content.Server.Interfaces; using Content.Server.Interfaces.GameObjects; using Content.Shared.GameObjects; +using Robust.Server.Interfaces.GameObjects; using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Localization; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; +using Robust.Server.Console; namespace Content.Server.GameObjects { @@ -105,6 +111,18 @@ namespace Content.Server.GameObjects TakeDamage(damageType, -amount); } + public void HealAllDamage() + { + var values = Enum.GetValues(typeof(DamageType)).Cast(); + foreach (var damageType in values) + { + if (CurrentDamage.ContainsKey(damageType) && damageType != DamageType.Total) + { + TakeHealing(damageType, CurrentDamage[damageType]); + } + } + } + void UpdateForDamageType(DamageType damageType, int oldValue) { int change = _currentDamage[damageType] - oldValue; @@ -169,6 +187,38 @@ namespace Content.Server.GameObjects Thresholds.Add(damageType, new List()); } } + + /// + /// Completely removes all damage from the DamageableComponent (heals the mob). + /// + [Verb] + private sealed class RejuvenateVerb : Verb + { + protected override string GetText(IEntity user, DamageableComponent component) => "Rejuvenate"; + + protected override VerbVisibility GetVisibility(IEntity user, DamageableComponent component) + { + var groupController = IoCManager.Resolve(); + + if (user.TryGetComponent(out var player)) + { + if (groupController.CanCommand(player.playerSession, "rejuvenate")) + return VerbVisibility.Visible; + } + return VerbVisibility.Invisible; + } + + protected override void Activate(IEntity user, DamageableComponent component) + { + var groupController = IoCManager.Resolve(); + if (user.TryGetComponent(out var player)) + { + if (groupController.CanCommand(player.playerSession, "rejuvenate")) + component.HealAllDamage(); + } + + } + } } } diff --git a/Resources/Groups/groups.yml b/Resources/Groups/groups.yml index 2aecb2f4ee..d09f07ba21 100644 --- a/Resources/Groups/groups.yml +++ b/Resources/Groups/groups.yml @@ -50,4 +50,5 @@ - endround - restartround - respawn + - rejuvenate CanViewVar: true