1
0

SharedSolutionContainerSystem.Capabilities.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. using Content.Shared.Chemistry.Components;
  2. using Content.Shared.Kitchen.Components;
  3. using Content.Shared.Chemistry.Components.SolutionManager;
  4. using Content.Shared.Chemistry.Reaction;
  5. using Content.Shared.FixedPoint;
  6. using Robust.Shared.Utility;
  7. using System.Diagnostics.CodeAnalysis;
  8. using System.Text;
  9. namespace Content.Shared.Chemistry.EntitySystems;
  10. public abstract partial class SharedSolutionContainerSystem
  11. {
  12. #region Solution Accessors
  13. public bool TryGetRefillableSolution(Entity<RefillableSolutionComponent?, SolutionContainerManagerComponent?> entity, [NotNullWhen(true)] out Entity<SolutionComponent>? soln, [NotNullWhen(true)] out Solution? solution)
  14. {
  15. if (!Resolve(entity, ref entity.Comp1, logMissing: false))
  16. {
  17. (soln, solution) = (default!, null);
  18. return false;
  19. }
  20. return TryGetSolution((entity.Owner, entity.Comp2), entity.Comp1.Solution, out soln, out solution);
  21. }
  22. public bool TryGetDrainableSolution(Entity<DrainableSolutionComponent?, SolutionContainerManagerComponent?> entity, [NotNullWhen(true)] out Entity<SolutionComponent>? soln, [NotNullWhen(true)] out Solution? solution)
  23. {
  24. if (!Resolve(entity, ref entity.Comp1, logMissing: false))
  25. {
  26. (soln, solution) = (default!, null);
  27. return false;
  28. }
  29. return TryGetSolution((entity.Owner, entity.Comp2), entity.Comp1.Solution, out soln, out solution);
  30. }
  31. public bool TryGetExtractableSolution(Entity<ExtractableComponent?, SolutionContainerManagerComponent?> entity, [NotNullWhen(true)] out Entity<SolutionComponent>? soln, [NotNullWhen(true)] out Solution? solution)
  32. {
  33. if (!Resolve(entity, ref entity.Comp1, logMissing: false))
  34. {
  35. (soln, solution) = (default!, null);
  36. return false;
  37. }
  38. return TryGetSolution((entity.Owner, entity.Comp2), entity.Comp1.GrindableSolution, out soln, out solution);
  39. }
  40. public bool TryGetDumpableSolution(Entity<DumpableSolutionComponent?, SolutionContainerManagerComponent?> entity, [NotNullWhen(true)] out Entity<SolutionComponent>? soln, [NotNullWhen(true)] out Solution? solution)
  41. {
  42. if (!Resolve(entity, ref entity.Comp1, logMissing: false))
  43. {
  44. (soln, solution) = (default!, null);
  45. return false;
  46. }
  47. return TryGetSolution((entity.Owner, entity.Comp2), entity.Comp1.Solution, out soln, out solution);
  48. }
  49. public bool TryGetDrawableSolution(Entity<DrawableSolutionComponent?, SolutionContainerManagerComponent?> entity, [NotNullWhen(true)] out Entity<SolutionComponent>? soln, [NotNullWhen(true)] out Solution? solution)
  50. {
  51. if (!Resolve(entity, ref entity.Comp1, logMissing: false))
  52. {
  53. (soln, solution) = (default!, null);
  54. return false;
  55. }
  56. return TryGetSolution((entity.Owner, entity.Comp2), entity.Comp1.Solution, out soln, out solution);
  57. }
  58. public bool TryGetInjectableSolution(Entity<InjectableSolutionComponent?, SolutionContainerManagerComponent?> entity, [NotNullWhen(true)] out Entity<SolutionComponent>? soln, [NotNullWhen(true)] out Solution? solution)
  59. {
  60. if (!Resolve(entity, ref entity.Comp1, logMissing: false))
  61. {
  62. (soln, solution) = (default!, null);
  63. return false;
  64. }
  65. return TryGetSolution((entity.Owner, entity.Comp2), entity.Comp1.Solution, out soln, out solution);
  66. }
  67. public bool TryGetFitsInDispenser(Entity<FitsInDispenserComponent?, SolutionContainerManagerComponent?> entity, [NotNullWhen(true)] out Entity<SolutionComponent>? soln, [NotNullWhen(true)] out Solution? solution)
  68. {
  69. if (!Resolve(entity, ref entity.Comp1, logMissing: false))
  70. {
  71. (soln, solution) = (default!, null);
  72. return false;
  73. }
  74. return TryGetSolution((entity.Owner, entity.Comp2), entity.Comp1.Solution, out soln, out solution);
  75. }
  76. public bool TryGetMixableSolution(Entity<MixableSolutionComponent?, SolutionContainerManagerComponent?> entity, [NotNullWhen(true)] out Entity<SolutionComponent>? soln, [NotNullWhen(true)] out Solution? solution)
  77. {
  78. if (!Resolve(entity, ref entity.Comp1, logMissing: false))
  79. {
  80. (soln, solution) = (default!, null);
  81. return false;
  82. }
  83. return TryGetSolution((entity.Owner, entity.Comp2), entity.Comp1.Solution, out soln, out solution);
  84. }
  85. #endregion Solution Accessors
  86. #region Solution Modifiers
  87. public void Refill(Entity<RefillableSolutionComponent?> entity, Entity<SolutionComponent> soln, Solution refill)
  88. {
  89. if (!Resolve(entity, ref entity.Comp, logMissing: false))
  90. return;
  91. AddSolution(soln, refill);
  92. }
  93. public void Inject(Entity<InjectableSolutionComponent?> entity, Entity<SolutionComponent> soln, Solution inject)
  94. {
  95. if (!Resolve(entity, ref entity.Comp, logMissing: false))
  96. return;
  97. AddSolution(soln, inject);
  98. }
  99. public Solution Drain(Entity<DrainableSolutionComponent?> entity, Entity<SolutionComponent> soln, FixedPoint2 quantity)
  100. {
  101. if (!Resolve(entity, ref entity.Comp, logMissing: false))
  102. return new();
  103. return SplitSolution(soln, quantity);
  104. }
  105. public Solution Draw(Entity<DrawableSolutionComponent?> entity, Entity<SolutionComponent> soln, FixedPoint2 quantity)
  106. {
  107. if (!Resolve(entity, ref entity.Comp, logMissing: false))
  108. return new();
  109. return SplitSolution(soln, quantity);
  110. }
  111. #endregion Solution Modifiers
  112. public float PercentFull(EntityUid uid)
  113. {
  114. if (!TryGetDrainableSolution(uid, out _, out var solution) || solution.MaxVolume.Equals(FixedPoint2.Zero))
  115. return 0;
  116. return solution.FillFraction * 100;
  117. }
  118. #region Static Methods
  119. public static string ToPrettyString(Solution solution)
  120. {
  121. var sb = new StringBuilder();
  122. if (solution.Name == null)
  123. sb.Append("[");
  124. else
  125. sb.Append($"{solution.Name}:[");
  126. var first = true;
  127. foreach (var (id, quantity) in solution.Contents)
  128. {
  129. if (first)
  130. {
  131. first = false;
  132. }
  133. else
  134. {
  135. sb.Append(", ");
  136. }
  137. sb.AppendFormat("{0}: {1}u", id, quantity);
  138. }
  139. sb.Append(']');
  140. return sb.ToString();
  141. }
  142. #endregion Static Methods
  143. }