1
0

MiningScannerSystem.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using Content.Shared.Inventory;
  2. using Content.Shared.Item.ItemToggle.Components;
  3. using Content.Shared.Mining.Components;
  4. using Robust.Shared.Audio.Systems;
  5. using Robust.Shared.Containers;
  6. using Robust.Shared.Network;
  7. using Robust.Shared.Timing;
  8. namespace Content.Shared.Mining;
  9. public sealed class MiningScannerSystem : EntitySystem
  10. {
  11. [Dependency] private readonly IGameTiming _timing = default!;
  12. [Dependency] private readonly INetManager _net = default!;
  13. [Dependency] private readonly SharedAudioSystem _audio = default!;
  14. [Dependency] private readonly SharedContainerSystem _container = default!;
  15. [Dependency] private readonly InventorySystem _inventory = default!;
  16. /// <inheritdoc/>
  17. public override void Initialize()
  18. {
  19. SubscribeLocalEvent<MiningScannerComponent, EntGotInsertedIntoContainerMessage>(OnInserted);
  20. SubscribeLocalEvent<MiningScannerComponent, EntGotRemovedFromContainerMessage>(OnRemoved);
  21. SubscribeLocalEvent<MiningScannerComponent, ItemToggledEvent>(OnToggled);
  22. }
  23. private void OnInserted(Entity<MiningScannerComponent> ent, ref EntGotInsertedIntoContainerMessage args)
  24. {
  25. UpdateViewerComponent(args.Container.Owner);
  26. }
  27. private void OnRemoved(Entity<MiningScannerComponent> ent, ref EntGotRemovedFromContainerMessage args)
  28. {
  29. UpdateViewerComponent(args.Container.Owner);
  30. }
  31. private void OnToggled(Entity<MiningScannerComponent> ent, ref ItemToggledEvent args)
  32. {
  33. if (_container.TryGetContainingContainer((ent.Owner, null, null), out var container))
  34. UpdateViewerComponent(container.Owner);
  35. }
  36. public void UpdateViewerComponent(EntityUid uid)
  37. {
  38. Entity<MiningScannerComponent>? scannerEnt = null;
  39. var ents = _inventory.GetHandOrInventoryEntities(uid);
  40. foreach (var ent in ents)
  41. {
  42. if (!TryComp<MiningScannerComponent>(ent, out var scannerComponent) ||
  43. !TryComp<ItemToggleComponent>(ent, out var toggle))
  44. continue;
  45. if (!toggle.Activated)
  46. continue;
  47. if (scannerEnt == null || scannerComponent.Range > scannerEnt.Value.Comp.Range)
  48. scannerEnt = (ent, scannerComponent);
  49. }
  50. if (_net.IsServer)
  51. {
  52. if (scannerEnt == null)
  53. {
  54. if (TryComp<MiningScannerViewerComponent>(uid, out var viewer))
  55. viewer.QueueRemoval = true;
  56. }
  57. else
  58. {
  59. var viewer = EnsureComp<MiningScannerViewerComponent>(uid);
  60. viewer.ViewRange = scannerEnt.Value.Comp.Range;
  61. viewer.QueueRemoval = false;
  62. viewer.NextPingTime = _timing.CurTime + viewer.PingDelay;
  63. Dirty(uid, viewer);
  64. }
  65. }
  66. }
  67. public override void Update(float frameTime)
  68. {
  69. base.Update(frameTime);
  70. var query = EntityQueryEnumerator<MiningScannerViewerComponent, TransformComponent>();
  71. while (query.MoveNext(out var uid, out var viewer, out var xform))
  72. {
  73. if (viewer.QueueRemoval)
  74. {
  75. RemCompDeferred(uid, viewer);
  76. continue;
  77. }
  78. if (_timing.CurTime < viewer.NextPingTime)
  79. continue;
  80. viewer.NextPingTime = _timing.CurTime + viewer.PingDelay;
  81. viewer.LastPingLocation = xform.Coordinates;
  82. if (_net.IsClient && _timing.IsFirstTimePredicted)
  83. _audio.PlayEntity(viewer.PingSound, uid, uid);
  84. }
  85. }
  86. }