SharedDrinkSystem.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using Content.Shared.Chemistry.Components.SolutionManager;
  2. using Content.Shared.Chemistry.EntitySystems;
  3. using Content.Shared.Examine;
  4. using Content.Shared.FixedPoint;
  5. using Content.Shared.Nutrition.Components;
  6. namespace Content.Shared.Nutrition.EntitySystems;
  7. public abstract partial class SharedDrinkSystem : EntitySystem
  8. {
  9. [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!;
  10. [Dependency] private readonly OpenableSystem _openable = default!;
  11. public override void Initialize()
  12. {
  13. base.Initialize();
  14. SubscribeLocalEvent<DrinkComponent, AttemptShakeEvent>(OnAttemptShake);
  15. SubscribeLocalEvent<DrinkComponent, ExaminedEvent>(OnExamined);
  16. }
  17. protected void OnAttemptShake(Entity<DrinkComponent> entity, ref AttemptShakeEvent args)
  18. {
  19. if (IsEmpty(entity, entity.Comp))
  20. args.Cancelled = true;
  21. }
  22. protected void OnExamined(Entity<DrinkComponent> entity, ref ExaminedEvent args)
  23. {
  24. TryComp<OpenableComponent>(entity, out var openable);
  25. if (_openable.IsClosed(entity.Owner, null, openable) || !args.IsInDetailsRange || !entity.Comp.Examinable)
  26. return;
  27. var empty = IsEmpty(entity, entity.Comp);
  28. if (empty)
  29. {
  30. args.PushMarkup(Loc.GetString("drink-component-on-examine-is-empty"));
  31. return;
  32. }
  33. if (HasComp<ExaminableSolutionComponent>(entity))
  34. {
  35. //provide exact measurement for beakers
  36. args.PushText(Loc.GetString("drink-component-on-examine-exact-volume", ("amount", DrinkVolume(entity, entity.Comp))));
  37. }
  38. else
  39. {
  40. //general approximation
  41. var remainingString = (int) _solutionContainer.PercentFull(entity) switch
  42. {
  43. 100 => "drink-component-on-examine-is-full",
  44. > 66 => "drink-component-on-examine-is-mostly-full",
  45. > 33 => HalfEmptyOrHalfFull(args),
  46. _ => "drink-component-on-examine-is-mostly-empty",
  47. };
  48. args.PushMarkup(Loc.GetString(remainingString));
  49. }
  50. }
  51. protected FixedPoint2 DrinkVolume(EntityUid uid, DrinkComponent? component = null)
  52. {
  53. if (!Resolve(uid, ref component))
  54. return FixedPoint2.Zero;
  55. if (!_solutionContainer.TryGetSolution(uid, component.Solution, out _, out var sol))
  56. return FixedPoint2.Zero;
  57. return sol.Volume;
  58. }
  59. protected bool IsEmpty(EntityUid uid, DrinkComponent? component = null)
  60. {
  61. if (!Resolve(uid, ref component))
  62. return true;
  63. return DrinkVolume(uid, component) <= 0;
  64. }
  65. // some see half empty, and others see half full
  66. private string HalfEmptyOrHalfFull(ExaminedEvent args)
  67. {
  68. string remainingString = "drink-component-on-examine-is-half-full";
  69. if (TryComp(args.Examiner, out MetaDataComponent? examiner) && examiner.EntityName.Length > 0
  70. && string.Compare(examiner.EntityName.Substring(0, 1), "m", StringComparison.InvariantCultureIgnoreCase) > 0)
  71. remainingString = "drink-component-on-examine-is-half-empty";
  72. return remainingString;
  73. }
  74. }