1
0

HurtCommand.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using System.Diagnostics.CodeAnalysis;
  2. using System.Linq;
  3. using Content.Server.Administration;
  4. using Content.Shared.Administration;
  5. using Content.Shared.Damage;
  6. using Content.Shared.Damage.Prototypes;
  7. using Content.Shared.FixedPoint;
  8. using Robust.Shared.Console;
  9. using Robust.Shared.Prototypes;
  10. namespace Content.Server.Damage.Commands
  11. {
  12. [AdminCommand(AdminFlags.Fun)]
  13. sealed class DamageCommand : IConsoleCommand
  14. {
  15. [Dependency] private readonly IEntityManager _entManager = default!;
  16. [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
  17. public string Command => "damage";
  18. public string Description => Loc.GetString("damage-command-description");
  19. public string Help => Loc.GetString("damage-command-help", ("command", Command));
  20. public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  21. {
  22. if (args.Length == 1)
  23. {
  24. var types = _prototypeManager.EnumeratePrototypes<DamageTypePrototype>()
  25. .Select(p => new CompletionOption(p.ID));
  26. var groups = _prototypeManager.EnumeratePrototypes<DamageGroupPrototype>()
  27. .Select(p => new CompletionOption(p.ID));
  28. return CompletionResult.FromHintOptions(types.Concat(groups).OrderBy(p => p.Value),
  29. Loc.GetString("damage-command-arg-type"));
  30. }
  31. if (args.Length == 2)
  32. {
  33. return CompletionResult.FromHint(Loc.GetString("damage-command-arg-quantity"));
  34. }
  35. if (args.Length == 3)
  36. {
  37. // if type.Name is good enough for cvars, <bool> doesn't need localizing.
  38. return CompletionResult.FromHint("<bool>");
  39. }
  40. if (args.Length == 4)
  41. {
  42. return CompletionResult.FromHint(Loc.GetString("damage-command-arg-target"));
  43. }
  44. return CompletionResult.Empty;
  45. }
  46. private delegate void Damage(EntityUid entity, bool ignoreResistances);
  47. private bool TryParseDamageArgs(
  48. IConsoleShell shell,
  49. EntityUid target,
  50. string[] args,
  51. [NotNullWhen(true)] out Damage? func)
  52. {
  53. if (!float.TryParse(args[1], out var amount))
  54. {
  55. shell.WriteLine(Loc.GetString("damage-command-error-quantity", ("arg", args[1])));
  56. func = null;
  57. return false;
  58. }
  59. if (_prototypeManager.TryIndex<DamageGroupPrototype>(args[0], out var damageGroup))
  60. {
  61. func = (entity, ignoreResistances) =>
  62. {
  63. var damage = new DamageSpecifier(damageGroup, amount);
  64. _entManager.System<DamageableSystem>().TryChangeDamage(entity, damage, ignoreResistances);
  65. };
  66. return true;
  67. }
  68. // Fall back to DamageType
  69. if (_prototypeManager.TryIndex<DamageTypePrototype>(args[0], out var damageType))
  70. {
  71. func = (entity, ignoreResistances) =>
  72. {
  73. var damage = new DamageSpecifier(damageType, amount);
  74. _entManager.System<DamageableSystem>().TryChangeDamage(entity, damage, ignoreResistances);
  75. };
  76. return true;
  77. }
  78. shell.WriteLine(Loc.GetString("damage-command-error-type", ("arg", args[0])));
  79. func = null;
  80. return false;
  81. }
  82. public void Execute(IConsoleShell shell, string argStr, string[] args)
  83. {
  84. if (args.Length < 2 || args.Length > 4)
  85. {
  86. shell.WriteLine(Loc.GetString("damage-command-error-args"));
  87. return;
  88. }
  89. EntityUid? target;
  90. if (args.Length == 4)
  91. {
  92. if (!_entManager.TryParseNetEntity(args[3], out target) || !_entManager.EntityExists(target))
  93. {
  94. shell.WriteLine(Loc.GetString("damage-command-error-euid", ("arg", args[3])));
  95. return;
  96. }
  97. }
  98. else if (shell.Player?.AttachedEntity is { Valid: true } playerEntity)
  99. {
  100. target = playerEntity;
  101. }
  102. else
  103. {
  104. shell.WriteLine(Loc.GetString("damage-command-error-player"));
  105. return;
  106. }
  107. if (!TryParseDamageArgs(shell, target.Value, args, out var damageFunc))
  108. return;
  109. bool ignoreResistances;
  110. if (args.Length == 3)
  111. {
  112. if (!bool.TryParse(args[2], out ignoreResistances))
  113. {
  114. shell.WriteLine(Loc.GetString("damage-command-error-bool", ("arg", args[2])));
  115. return;
  116. }
  117. }
  118. else
  119. {
  120. ignoreResistances = false;
  121. }
  122. damageFunc(target.Value, ignoreResistances);
  123. }
  124. }
  125. }