using System.Numerics; using Content.Server.Decals; using Content.Shared.Chemistry.Reaction; using Content.Shared.Chemistry.Reagent; using Content.Shared.Decals; using Content.Shared.FixedPoint; using Robust.Shared.Map; using Robust.Shared.Map.Components; namespace Content.Server.Chemistry.TileReactions; /// /// Purges all cleanable decals on a tile. /// [DataDefinition] public sealed class CleanDecalsReaction : ITileReaction { /// /// For every cleaned decal we lose this much reagent. /// [DataField("cleanCost")] public FixedPoint2 CleanCost { get; private set; } = FixedPoint2.New(0.25f); public FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 reactVolume) { var entMan = IoCManager.Resolve(); if (reactVolume <= CleanCost || !entMan.TryGetComponent(tile.GridUid, out var grid) || !entMan.TryGetComponent(tile.GridUid, out var decalGrid)) { return FixedPoint2.Zero; } var lookupSystem = entMan.System(); var decalSystem = entMan.System(); // Very generous hitbox. var decals = decalSystem .GetDecalsIntersecting(tile.GridUid, lookupSystem.GetLocalBounds(tile, grid.TileSize).Enlarged(0.5f).Translated(new Vector2(-0.5f, -0.5f))); var amount = FixedPoint2.Zero; foreach (var decal in decals) { if (!decal.Decal.Cleanable) continue; decalSystem.RemoveDecal(tile.GridUid, decal.Index, decalGrid); amount += CleanCost; if (amount > reactVolume) break; } return amount; } }