using Content.Server.Chemistry.Components; using Content.Server.Explosion.EntitySystems; using Content.Server.Popups; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.FixedPoint; using Content.Shared.Interaction; using Robust.Shared.Player; 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 _solutionSystem = default!; [Dependency] private readonly TriggerSystem _triggerSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; public override void Initialize() { SubscribeLocalEvent(OnInteractUsing); } private void OnInteractUsing(EntityUid uid, RefillableSolutionComponent target, InteractUsingEvent args) { TrySpike(args.Used, args.Target, args.User, target); } /// /// 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) || !_solutionSystem.TryGetRefillableSolution(target, out var targetSolution, managerTarget, spikableTarget) || !managerSource.Solutions.TryGetValue(spikableSource.SourceSolution, 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 (!_solutionSystem.ForceAddSolution(target, targetSolution, sourceSolution)) return; _popupSystem.PopupEntity(Loc.GetString(spikableSource.Popup, ("spiked-entity", target), ("spike-entity", source)), user, user); sourceSolution.RemoveAllSolution(); _triggerSystem.Trigger(source, user); } }