MinSolution.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using Content.Shared.Chemistry.EntitySystems;
  2. using Content.Shared.Chemistry.Reagent;
  3. using Content.Shared.Construction;
  4. using Content.Shared.Examine;
  5. using Content.Shared.FixedPoint;
  6. using Robust.Shared.Prototypes;
  7. namespace Content.Server.Construction.Conditions;
  8. /// <summary>
  9. /// Requires that a certain solution has a minimum amount of a reagent to proceed.
  10. /// </summary>
  11. [DataDefinition]
  12. public sealed partial class MinSolution : IGraphCondition
  13. {
  14. /// <summary>
  15. /// The solution that needs to have the reagent.
  16. /// </summary>
  17. [DataField(required: true)]
  18. public string Solution = string.Empty;
  19. /// <summary>
  20. /// The reagent that needs to be present.
  21. /// </summary>
  22. [DataField(required: true)]
  23. public ReagentId Reagent = new();
  24. /// <summary>
  25. /// How much of the reagent must be present.
  26. /// </summary>
  27. [DataField]
  28. public FixedPoint2 Quantity = 1;
  29. public bool Condition(EntityUid uid, IEntityManager entMan)
  30. {
  31. var containerSys = entMan.System<SharedSolutionContainerSystem>();
  32. if (!containerSys.TryGetSolution(uid, Solution, out _, out var solution))
  33. return false;
  34. solution.TryGetReagentQuantity(Reagent, out var quantity);
  35. return quantity >= Quantity;
  36. }
  37. public bool DoExamine(ExaminedEvent args)
  38. {
  39. var entMan = IoCManager.Resolve<IEntityManager>();
  40. var uid = args.Examined;
  41. var containerSys = entMan.System<SharedSolutionContainerSystem>();
  42. if (!containerSys.TryGetSolution(uid, Solution, out _, out var solution))
  43. return false;
  44. solution.TryGetReagentQuantity(Reagent, out var quantity);
  45. // already has enough so dont show examine
  46. if (quantity >= Quantity)
  47. return false;
  48. args.PushMarkup(Loc.GetString("construction-examine-condition-min-solution",
  49. ("quantity", Quantity - quantity), ("reagent", Name())) + "\n");
  50. return true;
  51. }
  52. public IEnumerable<ConstructionGuideEntry> GenerateGuideEntry()
  53. {
  54. yield return new ConstructionGuideEntry()
  55. {
  56. Localization = "construction-guide-condition-min-solution",
  57. Arguments = new (string, object)[]
  58. {
  59. ("quantity", Quantity),
  60. ("reagent", Name())
  61. }
  62. };
  63. }
  64. private string Name()
  65. {
  66. var protoMan = IoCManager.Resolve<IPrototypeManager>();
  67. var proto = protoMan.Index<ReagentPrototype>(Reagent.Prototype);
  68. return proto.LocalizedName;
  69. }
  70. }