1
0

SharedAnomalyCoreSystem.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using Content.Shared.Anomaly.Components;
  2. using Content.Shared.Construction.Components;
  3. using Content.Shared.Containers.ItemSlots;
  4. using Content.Shared.Examine;
  5. using Content.Shared.Weapons.Melee.Components;
  6. using Robust.Shared.Physics;
  7. using Robust.Shared.Physics.Components;
  8. using Robust.Shared.Timing;
  9. namespace Content.Shared.Anomaly;
  10. /// <summary>
  11. /// This component reduces the value of the entity during decay
  12. /// </summary>
  13. public sealed class SharedAnomalyCoreSystem : EntitySystem
  14. {
  15. [Dependency] private readonly IGameTiming _gameTiming = default!;
  16. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  17. [Dependency] private readonly ItemSlotsSystem _itemSlots = default!;
  18. public override void Initialize()
  19. {
  20. SubscribeLocalEvent<AnomalyCoreComponent, MapInitEvent>(OnMapInit);
  21. SubscribeLocalEvent<CorePoweredThrowerComponent, AttemptMeleeThrowOnHitEvent>(OnAttemptMeleeThrowOnHit);
  22. SubscribeLocalEvent<CorePoweredThrowerComponent, ExaminedEvent>(OnCorePoweredExamined);
  23. }
  24. private void OnMapInit(Entity<AnomalyCoreComponent> core, ref MapInitEvent args)
  25. {
  26. core.Comp.DecayMoment = _gameTiming.CurTime + TimeSpan.FromSeconds(core.Comp.TimeToDecay);
  27. Dirty(core, core.Comp);
  28. }
  29. private void OnAttemptMeleeThrowOnHit(Entity<CorePoweredThrowerComponent> ent, ref AttemptMeleeThrowOnHitEvent args)
  30. {
  31. var (uid, comp) = ent;
  32. // don't waste charges on non-anchorable non-anomalous static bodies.
  33. if (!HasComp<AnomalyComponent>(args.Target)
  34. && !HasComp<AnchorableComponent>(args.Target)
  35. && TryComp<PhysicsComponent>(args.Target, out var body)
  36. && body.BodyType == BodyType.Static)
  37. return;
  38. args.Cancelled = true;
  39. args.Handled = true;
  40. if (!_itemSlots.TryGetSlot(uid, comp.CoreSlotId, out var slot))
  41. return;
  42. if (!TryComp<AnomalyCoreComponent>(slot.Item, out var coreComponent))
  43. return;
  44. if (coreComponent.IsDecayed)
  45. {
  46. if (coreComponent.Charge <= 0)
  47. return;
  48. args.Cancelled = false;
  49. coreComponent.Charge--;
  50. }
  51. else
  52. {
  53. args.Cancelled = false;
  54. }
  55. }
  56. private void OnCorePoweredExamined(Entity<CorePoweredThrowerComponent> ent, ref ExaminedEvent args)
  57. {
  58. var (uid, comp) = ent;
  59. if (!args.IsInDetailsRange)
  60. return;
  61. if (!_itemSlots.TryGetSlot(uid, comp.CoreSlotId, out var slot) ||
  62. !TryComp<AnomalyCoreComponent>(slot.Item, out var coreComponent))
  63. {
  64. args.PushMarkup(Loc.GetString("anomaly-gorilla-charge-none"));
  65. return;
  66. }
  67. if (coreComponent.IsDecayed)
  68. {
  69. args.PushMarkup(Loc.GetString("anomaly-gorilla-charge-limit", ("count", coreComponent.Charge)));
  70. }
  71. else
  72. {
  73. args.PushMarkup(Loc.GetString("anomaly-gorilla-charge-infinite"));
  74. }
  75. }
  76. public override void Update(float frameTime)
  77. {
  78. base.Update(frameTime);
  79. var query = EntityQueryEnumerator<AnomalyCoreComponent>();
  80. while (query.MoveNext(out var uid, out var component))
  81. {
  82. if (component.IsDecayed)
  83. continue;
  84. //When time runs out, we completely decompose
  85. if (component.DecayMoment < _gameTiming.CurTime)
  86. Decay(uid, component);
  87. }
  88. }
  89. private void Decay(EntityUid uid, AnomalyCoreComponent component)
  90. {
  91. _appearance.SetData(uid, AnomalyCoreVisuals.Decaying, false);
  92. component.IsDecayed = true;
  93. Dirty(uid, component);
  94. }
  95. }