ItemCounterSystem.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using Content.Shared.Rounding;
  2. using Content.Shared.Stacks;
  3. using Content.Shared.Storage.Components;
  4. using Content.Shared.Storage.EntitySystems;
  5. using Robust.Client.GameObjects;
  6. using Robust.Shared.Containers;
  7. namespace Content.Client.Storage.Systems;
  8. public sealed class ItemCounterSystem : SharedItemCounterSystem
  9. {
  10. [Dependency] private readonly AppearanceSystem _appearanceSystem = default!;
  11. public override void Initialize()
  12. {
  13. base.Initialize();
  14. SubscribeLocalEvent<ItemCounterComponent, AppearanceChangeEvent>(OnAppearanceChange);
  15. }
  16. private void OnAppearanceChange(EntityUid uid, ItemCounterComponent comp, ref AppearanceChangeEvent args)
  17. {
  18. if (args.Sprite == null || comp.LayerStates.Count < 1)
  19. return;
  20. // Skip processing if no actual
  21. if (!_appearanceSystem.TryGetData<int>(uid, StackVisuals.Actual, out var actual, args.Component))
  22. return;
  23. if (!_appearanceSystem.TryGetData<int>(uid, StackVisuals.MaxCount, out var maxCount, args.Component))
  24. maxCount = comp.LayerStates.Count;
  25. if (!_appearanceSystem.TryGetData<bool>(uid, StackVisuals.Hide, out var hidden, args.Component))
  26. hidden = false;
  27. if (comp.IsComposite)
  28. ProcessCompositeSprite(uid, actual, maxCount, comp.LayerStates, hidden, sprite: args.Sprite);
  29. else
  30. ProcessOpaqueSprite(uid, comp.BaseLayer, actual, maxCount, comp.LayerStates, hidden, sprite: args.Sprite);
  31. }
  32. public void ProcessOpaqueSprite(EntityUid uid, string layer, int count, int maxCount, List<string> states, bool hide = false, SpriteComponent? sprite = null)
  33. {
  34. if (!Resolve(uid, ref sprite)
  35. || !sprite.LayerMapTryGet(layer, out var layerKey, logError: true))
  36. return;
  37. var activeState = ContentHelpers.RoundToEqualLevels(count, maxCount, states.Count);
  38. sprite.LayerSetState(layerKey, states[activeState]);
  39. sprite.LayerSetVisible(layerKey, !hide);
  40. }
  41. public void ProcessCompositeSprite(EntityUid uid, int count, int maxCount, List<string> layers, bool hide = false, SpriteComponent? sprite = null)
  42. {
  43. if(!Resolve(uid, ref sprite))
  44. return;
  45. var activeTill = ContentHelpers.RoundToNearestLevels(count, maxCount, layers.Count);
  46. for(var i = 0; i < layers.Count; ++i)
  47. {
  48. sprite.LayerSetVisible(layers[i], !hide && i < activeTill);
  49. }
  50. }
  51. protected override int? GetCount(ContainerModifiedMessage msg, ItemCounterComponent itemCounter)
  52. {
  53. if (_appearanceSystem.TryGetData<int>(msg.Container.Owner, StackVisuals.Actual, out var actual))
  54. return actual;
  55. return null;
  56. }
  57. }