SmokeOnTriggerSystem.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using Content.Shared.Explosion.Components;
  2. using Content.Shared.Explosion.EntitySystems;
  3. using Content.Server.Fluids.EntitySystems;
  4. using Content.Server.Spreader;
  5. using Content.Shared.Chemistry.Components;
  6. using Content.Shared.Coordinates.Helpers;
  7. using Content.Shared.Maps;
  8. using Robust.Server.GameObjects;
  9. using Robust.Shared.Map;
  10. namespace Content.Server.Explosion.EntitySystems;
  11. /// <summary>
  12. /// Handles creating smoke when <see cref="SmokeOnTriggerComponent"/> is triggered.
  13. /// </summary>
  14. public sealed class SmokeOnTriggerSystem : SharedSmokeOnTriggerSystem
  15. {
  16. [Dependency] private readonly IMapManager _mapMan = default!;
  17. [Dependency] private readonly SmokeSystem _smoke = default!;
  18. [Dependency] private readonly TransformSystem _transform = default!;
  19. [Dependency] private readonly SpreaderSystem _spreader = default!;
  20. public override void Initialize()
  21. {
  22. base.Initialize();
  23. SubscribeLocalEvent<SmokeOnTriggerComponent, TriggerEvent>(OnTrigger);
  24. }
  25. private void OnTrigger(EntityUid uid, SmokeOnTriggerComponent comp, TriggerEvent args)
  26. {
  27. var xform = Transform(uid);
  28. var mapCoords = _transform.GetMapCoordinates(uid, xform);
  29. if (!_mapMan.TryFindGridAt(mapCoords, out _, out var grid) ||
  30. !grid.TryGetTileRef(xform.Coordinates, out var tileRef) ||
  31. tileRef.Tile.IsEmpty)
  32. {
  33. return;
  34. }
  35. if (_spreader.RequiresFloorToSpread(comp.SmokePrototype.ToString()) && tileRef.Tile.IsSpace())
  36. return;
  37. var coords = grid.MapToGrid(mapCoords);
  38. var ent = Spawn(comp.SmokePrototype, coords.SnapToGrid());
  39. if (!TryComp<SmokeComponent>(ent, out var smoke))
  40. {
  41. Log.Error($"Smoke prototype {comp.SmokePrototype} was missing SmokeComponent");
  42. Del(ent);
  43. return;
  44. }
  45. _smoke.StartSmoke(ent, comp.Solution, comp.Duration, comp.SpreadAmount, smoke);
  46. }
  47. }