diff --git a/Content.Server/Chemistry/Components/SolutionInjectOnCollideComponent.cs b/Content.Server/Chemistry/Components/SolutionInjectOnCollideComponent.cs index 073bc1167c..c1d0fec05a 100644 --- a/Content.Server/Chemistry/Components/SolutionInjectOnCollideComponent.cs +++ b/Content.Server/Chemistry/Components/SolutionInjectOnCollideComponent.cs @@ -1,29 +1,27 @@ using Content.Shared.FixedPoint; using Content.Shared.Inventory; -namespace Content.Server.Chemistry.Components +namespace Content.Server.Chemistry.Components; + +/// +/// On colliding with an entity that has a bloodstream will dump its solution onto them. +/// +[RegisterComponent] +public sealed partial class SolutionInjectOnCollideComponent : Component { + [ViewVariables(VVAccess.ReadWrite)] + [DataField("transferAmount")] + public FixedPoint2 TransferAmount = FixedPoint2.New(1); + + [ViewVariables(VVAccess.ReadWrite)] + public float TransferEfficiency { get => _transferEfficiency; set => _transferEfficiency = Math.Clamp(value, 0, 1); } + + [DataField("transferEfficiency")] + private float _transferEfficiency = 1f; + /// - /// On colliding with an entity that has a bloodstream will dump its solution onto them. + /// If anything covers any of these slots then the injection fails. /// - [RegisterComponent] - internal sealed partial class SolutionInjectOnCollideComponent : Component - { - - [ViewVariables(VVAccess.ReadWrite)] - [DataField("transferAmount")] - public FixedPoint2 TransferAmount { get; set; } = FixedPoint2.New(1); - - [ViewVariables(VVAccess.ReadWrite)] - public float TransferEfficiency { get => _transferEfficiency; set => _transferEfficiency = Math.Clamp(value, 0, 1); } - - [DataField("transferEfficiency")] - private float _transferEfficiency = 1f; - - /// - /// If anything covers any of these slots then the injection fails. - /// - [DataField("blockSlots"), ViewVariables(VVAccess.ReadWrite)] - public SlotFlags BlockSlots = SlotFlags.MASK; - } + [DataField("blockSlots"), ViewVariables(VVAccess.ReadWrite)] + public SlotFlags BlockSlots = SlotFlags.MASK; } diff --git a/Content.Server/Chemistry/EntitySystems/SolutionInjectOnCollideSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionInjectOnCollideSystem.cs index f881240a09..446be0ca77 100644 --- a/Content.Server/Chemistry/EntitySystems/SolutionInjectOnCollideSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/SolutionInjectOnCollideSystem.cs @@ -6,48 +6,47 @@ using Content.Shared.Inventory; using JetBrains.Annotations; using Robust.Shared.Physics.Events; -namespace Content.Server.Chemistry.EntitySystems +namespace Content.Server.Chemistry.EntitySystems; + +public sealed class SolutionInjectOnCollideSystem : EntitySystem { - [UsedImplicitly] - internal sealed class SolutionInjectOnCollideSystem : EntitySystem + [Dependency] private readonly SolutionContainerSystem _solutionContainersSystem = default!; + [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; + [Dependency] private readonly InventorySystem _inventorySystem = default!; + + public override void Initialize() { - [Dependency] private readonly SolutionContainerSystem _solutionContainersSystem = default!; - [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; - [Dependency] private readonly InventorySystem _inventorySystem = default!; + base.Initialize(); + SubscribeLocalEvent(HandleInjection); + } - public override void Initialize() + private void HandleInjection(Entity ent, ref StartCollideEvent args) + { + var component = ent.Comp; + var target = args.OtherEntity; + + if (!args.OtherBody.Hard || + !args.OurBody.Hard || + !EntityManager.TryGetComponent(target, out var bloodstream) || + !_solutionContainersSystem.TryGetInjectableSolution(ent.Owner, out var solution, out _)) { - base.Initialize(); - SubscribeLocalEvent(HandleInjection); + return; } - private void HandleInjection(Entity ent, ref StartCollideEvent args) + if (component.BlockSlots != 0x0) { - var component = ent.Comp; - var target = args.OtherEntity; + var containerEnumerator = _inventorySystem.GetSlotEnumerator(target, component.BlockSlots); - if (!args.OtherBody.Hard || - !EntityManager.TryGetComponent(target, out var bloodstream) || - !_solutionContainersSystem.TryGetInjectableSolution(ent.Owner, out var solution, out _)) - { + // TODO add a helper method for this? + if (containerEnumerator.MoveNext(out _)) return; - } - - if (component.BlockSlots != 0x0) - { - var containerEnumerator = _inventorySystem.GetSlotEnumerator(target, component.BlockSlots); - - // TODO add a helper method for this? - if (containerEnumerator.MoveNext(out _)) - return; - } - - var solRemoved = _solutionContainersSystem.SplitSolution(solution.Value, component.TransferAmount); - var solRemovedVol = solRemoved.Volume; - - var solToInject = solRemoved.SplitSolution(solRemovedVol * component.TransferEfficiency); - - _bloodstreamSystem.TryAddToChemicals(target, solToInject, bloodstream); } + + var solRemoved = _solutionContainersSystem.SplitSolution(solution.Value, component.TransferAmount); + var solRemovedVol = solRemoved.Volume; + + var solToInject = solRemoved.SplitSolution(solRemovedVol * component.TransferEfficiency); + + _bloodstreamSystem.TryAddToChemicals(target, solToInject, bloodstream); } }