AddReagent.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using Content.Shared.Chemistry.EntitySystems;
  2. using Content.Shared.Administration;
  3. using Content.Shared.Chemistry.Components.SolutionManager;
  4. using Content.Shared.Chemistry.Reagent;
  5. using Content.Shared.FixedPoint;
  6. using Robust.Shared.Console;
  7. using Robust.Shared.Prototypes;
  8. using System.Linq;
  9. namespace Content.Server.Administration.Commands
  10. {
  11. /// <summary>
  12. /// Command that allows you to edit an existing solution by adding (or removing) reagents.
  13. /// </summary>
  14. [AdminCommand(AdminFlags.Admin)]
  15. public sealed class AddReagent : IConsoleCommand
  16. {
  17. [Dependency] private readonly IEntityManager _entManager = default!;
  18. [Dependency] private readonly IPrototypeManager _protomanager = default!;
  19. public string Command => "addreagent";
  20. public string Description => "Add (or remove) some amount of reagent from some solution.";
  21. public string Help => $"Usage: {Command} <target> <solution> <reagent> <quantity>";
  22. public void Execute(IConsoleShell shell, string argStr, string[] args)
  23. {
  24. if (args.Length < 4)
  25. {
  26. shell.WriteLine($"Not enough arguments.\n{Help}");
  27. return;
  28. }
  29. if (!NetEntity.TryParse(args[0], out var uidNet) || !_entManager.TryGetEntity(uidNet, out var uid))
  30. {
  31. shell.WriteLine($"Invalid entity id.");
  32. return;
  33. }
  34. if (!_entManager.TryGetComponent(uid, out SolutionContainerManagerComponent? man))
  35. {
  36. shell.WriteLine($"Entity does not have any solutions.");
  37. return;
  38. }
  39. var solutionContainerSystem = _entManager.System<SharedSolutionContainerSystem>();
  40. if (!solutionContainerSystem.TryGetSolution((uid.Value, man), args[1], out var solution))
  41. {
  42. var validSolutions = string.Join(", ", solutionContainerSystem.EnumerateSolutions((uid.Value, man)).Select(s => s.Name));
  43. shell.WriteLine($"Entity does not have a \"{args[1]}\" solution. Valid solutions are:\n{validSolutions}");
  44. return;
  45. }
  46. if (!_protomanager.HasIndex<ReagentPrototype>(args[2]))
  47. {
  48. shell.WriteLine($"Unknown reagent prototype");
  49. return;
  50. }
  51. if (!float.TryParse(args[3], out var quantityFloat))
  52. {
  53. shell.WriteLine($"Failed to parse quantity");
  54. return;
  55. }
  56. var quantity = FixedPoint2.New(MathF.Abs(quantityFloat));
  57. if (quantityFloat > 0)
  58. solutionContainerSystem.TryAddReagent(solution.Value, args[2], quantity, out _);
  59. else
  60. solutionContainerSystem.RemoveReagent(solution.Value, args[2], quantity);
  61. }
  62. }
  63. }