1
0

RiggableSystem.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using Content.Server.Administration.Logs;
  2. using Content.Server.Explosion.EntitySystems;
  3. using Content.Server.Kitchen.Components;
  4. using Content.Server.Power.Components;
  5. using Content.Shared.Chemistry.EntitySystems;
  6. using Content.Shared.Database;
  7. using Content.Shared.Rejuvenate;
  8. namespace Content.Server.Power.EntitySystems;
  9. /// <summary>
  10. /// Handles sabotaged/rigged objects
  11. /// </summary>
  12. public sealed class RiggableSystem : EntitySystem
  13. {
  14. [Dependency] private readonly ExplosionSystem _explosionSystem = default!;
  15. [Dependency] private readonly IAdminLogManager _adminLogger = default!;
  16. public override void Initialize()
  17. {
  18. base.Initialize();
  19. SubscribeLocalEvent<RiggableComponent, RejuvenateEvent>(OnRejuvenate);
  20. SubscribeLocalEvent<RiggableComponent, BeingMicrowavedEvent>(OnMicrowaved);
  21. SubscribeLocalEvent<RiggableComponent, SolutionContainerChangedEvent>(OnSolutionChanged);
  22. }
  23. private void OnRejuvenate(Entity<RiggableComponent> entity, ref RejuvenateEvent args)
  24. {
  25. entity.Comp.IsRigged = false;
  26. }
  27. private void OnMicrowaved(Entity<RiggableComponent> entity, ref BeingMicrowavedEvent args)
  28. {
  29. if (TryComp<BatteryComponent>(entity, out var batteryComponent))
  30. {
  31. if (batteryComponent.CurrentCharge == 0)
  32. return;
  33. }
  34. args.Handled = true;
  35. // What the fuck are you doing???
  36. Explode(entity.Owner, batteryComponent, args.User);
  37. }
  38. private void OnSolutionChanged(Entity<RiggableComponent> entity, ref SolutionContainerChangedEvent args)
  39. {
  40. if (args.SolutionId != entity.Comp.Solution)
  41. return;
  42. var wasRigged = entity.Comp.IsRigged;
  43. var quantity = args.Solution.GetReagentQuantity(entity.Comp.RequiredQuantity.Reagent);
  44. entity.Comp.IsRigged = quantity >= entity.Comp.RequiredQuantity.Quantity;
  45. if (entity.Comp.IsRigged && !wasRigged)
  46. {
  47. _adminLogger.Add(LogType.Explosion, LogImpact.Medium, $"{ToPrettyString(entity.Owner)} has been rigged up to explode when used.");
  48. }
  49. }
  50. public void Explode(EntityUid uid, BatteryComponent? battery = null, EntityUid? cause = null)
  51. {
  52. if (!Resolve(uid, ref battery))
  53. return;
  54. var radius = MathF.Min(5, MathF.Sqrt(battery.CurrentCharge) / 9);
  55. _explosionSystem.TriggerExplosive(uid, radius: radius, user:cause);
  56. QueueDel(uid);
  57. }
  58. }