1
0

TransformableContainerSystem.cs 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using Content.Server.Chemistry.Components;
  2. using Content.Shared.Chemistry.EntitySystems;
  3. using Content.Shared.Chemistry.Reagent;
  4. using Content.Shared.NameModifier.EntitySystems;
  5. using Robust.Shared.Prototypes;
  6. namespace Content.Server.Chemistry.EntitySystems;
  7. public sealed class TransformableContainerSystem : EntitySystem
  8. {
  9. [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
  10. [Dependency] private readonly SharedSolutionContainerSystem _solutionsSystem = default!;
  11. [Dependency] private readonly MetaDataSystem _metadataSystem = default!;
  12. [Dependency] private readonly NameModifierSystem _nameMod = default!;
  13. public override void Initialize()
  14. {
  15. base.Initialize();
  16. SubscribeLocalEvent<TransformableContainerComponent, MapInitEvent>(OnMapInit);
  17. SubscribeLocalEvent<TransformableContainerComponent, SolutionContainerChangedEvent>(OnSolutionChange);
  18. SubscribeLocalEvent<TransformableContainerComponent, RefreshNameModifiersEvent>(OnRefreshNameModifiers);
  19. }
  20. private void OnMapInit(Entity<TransformableContainerComponent> entity, ref MapInitEvent args)
  21. {
  22. var meta = MetaData(entity.Owner);
  23. if (string.IsNullOrEmpty(entity.Comp.InitialDescription))
  24. {
  25. entity.Comp.InitialDescription = meta.EntityDescription;
  26. }
  27. }
  28. private void OnSolutionChange(Entity<TransformableContainerComponent> entity, ref SolutionContainerChangedEvent args)
  29. {
  30. if (!_solutionsSystem.TryGetFitsInDispenser(entity.Owner, out _, out var solution))
  31. return;
  32. //Transform container into initial state when emptied
  33. if (entity.Comp.CurrentReagent != null && solution.Contents.Count == 0)
  34. {
  35. CancelTransformation(entity);
  36. }
  37. //the biggest reagent in the solution decides the appearance
  38. var reagentId = solution.GetPrimaryReagentId();
  39. //If biggest reagent didn't changed - don't change anything at all
  40. if (entity.Comp.CurrentReagent != null && entity.Comp.CurrentReagent.ID == reagentId?.Prototype)
  41. {
  42. return;
  43. }
  44. //Only reagents with spritePath property can change appearance of transformable containers!
  45. if (!string.IsNullOrWhiteSpace(reagentId?.Prototype)
  46. && _prototypeManager.TryIndex(reagentId.Value.Prototype, out ReagentPrototype? proto))
  47. {
  48. var metadata = MetaData(entity.Owner);
  49. _metadataSystem.SetEntityDescription(entity.Owner, proto.LocalizedDescription, metadata);
  50. entity.Comp.CurrentReagent = proto;
  51. entity.Comp.Transformed = true;
  52. }
  53. _nameMod.RefreshNameModifiers(entity.Owner);
  54. }
  55. private void OnRefreshNameModifiers(Entity<TransformableContainerComponent> entity, ref RefreshNameModifiersEvent args)
  56. {
  57. if (entity.Comp.CurrentReagent is { } currentReagent)
  58. {
  59. args.AddModifier("transformable-container-component-glass", priority: -1, ("reagent", currentReagent.LocalizedName));
  60. }
  61. }
  62. private void CancelTransformation(Entity<TransformableContainerComponent> entity)
  63. {
  64. entity.Comp.CurrentReagent = null;
  65. entity.Comp.Transformed = false;
  66. var metadata = MetaData(entity);
  67. _nameMod.RefreshNameModifiers(entity.Owner);
  68. if (!string.IsNullOrEmpty(entity.Comp.InitialDescription))
  69. {
  70. _metadataSystem.SetEntityDescription(entity.Owner, entity.Comp.InitialDescription, metadata);
  71. }
  72. }
  73. }