FirestarterSystem.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using Content.Server.Atmos.Components;
  2. using Content.Shared.Actions.Events;
  3. using Content.Shared.Atmos.Components;
  4. using Content.Shared.Atmos.EntitySystems;
  5. using Robust.Shared.Audio.Systems;
  6. using Robust.Shared.Containers;
  7. using Robust.Shared.Map;
  8. namespace Content.Server.Atmos.EntitySystems;
  9. /// <summary>
  10. /// Adds an action ability that will cause all flammable targets in a radius to ignite, also heals the owner
  11. /// of the component when used.
  12. /// </summary>
  13. public sealed class FirestarterSystem : SharedFirestarterSystem
  14. {
  15. [Dependency] private readonly EntityLookupSystem _lookup = default!;
  16. [Dependency] private readonly FlammableSystem _flammable = default!;
  17. [Dependency] private readonly SharedAudioSystem _audio = default!;
  18. [Dependency] private readonly SharedContainerSystem _container = default!;
  19. private readonly HashSet<Entity<FlammableComponent>> _flammables = new();
  20. public override void Initialize()
  21. {
  22. base.Initialize();
  23. SubscribeLocalEvent<FirestarterComponent, FireStarterActionEvent>(OnStartFire);
  24. }
  25. /// <summary>
  26. /// Checks Radius for igniting nearby flammable objects
  27. /// </summary>
  28. private void OnStartFire(EntityUid uid, FirestarterComponent component, FireStarterActionEvent args)
  29. {
  30. if (_container.IsEntityOrParentInContainer(uid))
  31. return;
  32. var xform = Transform(uid);
  33. var ignitionRadius = component.IgnitionRadius;
  34. IgniteNearby(uid, xform.Coordinates, args.Severity, ignitionRadius);
  35. _audio.PlayPvs(component.IgniteSound, uid);
  36. args.Handled = true;
  37. }
  38. /// <summary>
  39. /// Ignites flammable objects within range.
  40. /// </summary>
  41. public void IgniteNearby(EntityUid uid, EntityCoordinates coordinates, float severity, float radius)
  42. {
  43. _flammables.Clear();
  44. _lookup.GetEntitiesInRange(coordinates, radius, _flammables);
  45. foreach (var flammable in _flammables)
  46. {
  47. var ent = flammable.Owner;
  48. var stackAmount = 2 + (int) (severity / 0.15f);
  49. _flammable.AdjustFireStacks(ent, stackAmount, flammable);
  50. _flammable.Ignite(ent, uid, flammable);
  51. }
  52. }
  53. }