CleanDecalsReaction.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using Content.Server.Decals;
  2. using Content.Shared.Chemistry.Reaction;
  3. using Content.Shared.Chemistry.Reagent;
  4. using Content.Shared.Decals;
  5. using Content.Shared.FixedPoint;
  6. using Robust.Shared.Map;
  7. using Robust.Shared.Map.Components;
  8. using System.Numerics;
  9. namespace Content.Server.Chemistry.TileReactions;
  10. /// <summary>
  11. /// Purges all cleanable decals on a tile.
  12. /// </summary>
  13. [DataDefinition]
  14. public sealed partial class CleanDecalsReaction : ITileReaction
  15. {
  16. /// <summary>
  17. /// For every cleaned decal we lose this much reagent.
  18. /// </summary>
  19. [DataField]
  20. public FixedPoint2 CleanCost { get; private set; } = FixedPoint2.New(0.25f);
  21. public FixedPoint2 TileReact(TileRef tile,
  22. ReagentPrototype reagent,
  23. FixedPoint2 reactVolume,
  24. IEntityManager entityManager,
  25. List<ReagentData>? data)
  26. {
  27. if (reactVolume <= CleanCost ||
  28. !entityManager.TryGetComponent<MapGridComponent>(tile.GridUid, out var grid) ||
  29. !entityManager.TryGetComponent<DecalGridComponent>(tile.GridUid, out var decalGrid))
  30. {
  31. return FixedPoint2.Zero;
  32. }
  33. var lookupSystem = entityManager.System<EntityLookupSystem>();
  34. var decalSystem = entityManager.System<DecalSystem>();
  35. // Very generous hitbox.
  36. var decals = decalSystem
  37. .GetDecalsIntersecting(tile.GridUid, lookupSystem.GetLocalBounds(tile, grid.TileSize).Enlarged(0.5f).Translated(new Vector2(-0.5f, -0.5f)));
  38. var amount = FixedPoint2.Zero;
  39. foreach (var decal in decals)
  40. {
  41. if (!decal.Decal.Cleanable)
  42. continue;
  43. if (amount + CleanCost > reactVolume)
  44. break;
  45. decalSystem.RemoveDecal(tile.GridUid, decal.Index, decalGrid);
  46. amount += CleanCost;
  47. }
  48. return amount;
  49. }
  50. }