diff --git a/Content.Server/Body/BodyCommands.cs b/Content.Server/Body/BodyCommands.cs index 899a793f6d..47da73fb64 100644 --- a/Content.Server/Body/BodyCommands.cs +++ b/Content.Server/Body/BodyCommands.cs @@ -1,14 +1,19 @@ #nullable enable -using System.Linq; using Content.Server.GameObjects.Components.Body; using Content.Shared.Body.Part; +using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Body; +using Content.Shared.GameObjects.Components.Damage; using Robust.Server.Interfaces.Console; using Robust.Server.Interfaces.Player; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Random; using Robust.Shared.IoC; using Robust.Shared.Prototypes; using Robust.Shared.Random; +using System; +using System.Linq; namespace Content.Server.Body { @@ -144,4 +149,89 @@ namespace Content.Server.Body shell.SendText(player, $"No mechanism was found with name {mechanismName}."); } } + + class HurtCommand : IClientCommand + { + public string Command => "hurt"; + public string Description => "Ouch"; + public string Help => $"Usage: {Command} () ()"; + + private void SendDamageTypes(IConsoleShell shell, IPlayerSession? player) + { + var msg = ""; + foreach (var dClass in Enum.GetNames(typeof(DamageClass))) + { + msg += $"\n{dClass}"; + var types = Enum.Parse(dClass).ToTypes(); + foreach (var dType in types) + { + msg += $"\n - {dType}"; + } + } + shell.SendText(player, $"Damage Types:{msg}"); + } + + public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) + { + // Check if we have enough for the dmg types to show + if (args.Length > 0 && args[0] == "?") + { + SendDamageTypes(shell, player); + return; + } + + // Not enough args + if (args.Length < 2) + { + shell.SendText(player, Help); + return; + } + + var ignoreResistance = false; + var entityUid = player != null && player.AttachedEntityUid.HasValue ? player.AttachedEntityUid.Value : EntityUid.Invalid; + if (!int.TryParse(args[1], out var amount) || + args.Length >= 3 && args[2] != "_" && !EntityUid.TryParse(args[2], out entityUid) || + args.Length >= 4 && !bool.TryParse(args[3], out ignoreResistance)) + { + shell.SendText(player, Help); + return; + } + + if (entityUid == EntityUid.Invalid) + { + shell.SendText(player, "Not a valid entity."); + return; + } + + if (!IoCManager.Resolve().TryGetEntity(entityUid, out var ent)) + { + shell.SendText(player, "Entity couldn't be found."); + return; + } + + if (!ent.TryGetComponent(out IDamageableComponent? damageable)) + { + shell.SendText(player, "Entity can't be damaged."); + return; + } + + if (Enum.TryParse(args[0], true, out var dmgClass)) + { + if (!damageable.ChangeDamage(dmgClass, amount, ignoreResistance)) + shell.SendText(player, "Something went wrong!"); + return; + } + // Fall back to DamageType + else if (Enum.TryParse(args[0], true, out var dmgType)) + { + if (!damageable.ChangeDamage(dmgType, amount, ignoreResistance)) + shell.SendText(player, "Something went wrong!"); + return; + } + else + { + SendDamageTypes(shell, player); + } + } + } } diff --git a/Resources/Groups/groups.yml b/Resources/Groups/groups.yml index f166b7f1c9..8762c7c671 100644 --- a/Resources/Groups/groups.yml +++ b/Resources/Groups/groups.yml @@ -106,6 +106,7 @@ - removedamageflag - godmode - deleteewi + - hurt CanViewVar: true CanAdminPlace: true CanAdminMenu: true @@ -205,6 +206,7 @@ - removedamageflag - godmode - deleteewi + - hurt CanViewVar: true CanAdminPlace: true CanScript: true