using Content.Server.Chemistry.Components; using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Explosion.EntitySystems; using Content.Server.Popups; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Interaction; namespace Content.Server.Chemistry.EntitySystems; /// /// Entity system used to handle when solution containers are 'spiked' /// with another entity. Triggers the source entity afterwards. /// Uses refillable solution as the target solution, as that indicates /// 'easy' refills. /// /// Examples of spikable entity interactions include pills being dropped into glasses, /// eggs being cracked into bowls, and so on. /// public sealed class SolutionSpikableSystem : EntitySystem { [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly TriggerSystem _triggerSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; public override void Initialize() { SubscribeLocalEvent(OnInteractUsing); } private void OnInteractUsing(Entity entity, ref InteractUsingEvent args) { TrySpike(args.Used, args.Target, args.User, entity.Comp); } /// /// Immediately transfer all reagents from this entity, to the other entity. /// The source entity will then be acted on by TriggerSystem. /// /// Source of the solution. /// Target to spike with the solution from source. /// User spiking the target solution. private void TrySpike(EntityUid source, EntityUid target, EntityUid user, RefillableSolutionComponent? spikableTarget = null, SolutionSpikerComponent? spikableSource = null, SolutionContainerManagerComponent? managerSource = null, SolutionContainerManagerComponent? managerTarget = null) { if (!Resolve(source, ref spikableSource, ref managerSource, false) || !Resolve(target, ref spikableTarget, ref managerTarget, false) || !_solutionContainerSystem.TryGetRefillableSolution((target, spikableTarget, managerTarget), out var targetSoln, out var targetSolution) || !_solutionContainerSystem.TryGetSolution((source, managerSource), spikableSource.SourceSolution, out _, out var sourceSolution)) { return; } if (targetSolution.Volume == 0 && !spikableSource.IgnoreEmpty) { _popupSystem.PopupEntity(Loc.GetString(spikableSource.PopupEmpty, ("spiked-entity", target), ("spike-entity", source)), user, user); return; } if (!_solutionContainerSystem.ForceAddSolution(targetSoln.Value, sourceSolution)) return; _popupSystem.PopupEntity(Loc.GetString(spikableSource.Popup, ("spiked-entity", target), ("spike-entity", source)), user, user); sourceSolution.RemoveAllSolution(); _triggerSystem.Trigger(source, user); } }