diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs index 566e2fd3ef..21ed609c74 100644 --- a/Content.Client/Entry/IgnoredComponents.cs +++ b/Content.Client/Entry/IgnoredComponents.cs @@ -233,7 +233,7 @@ namespace Content.Client.Entry "ConveyorAssembly", "TwoWayLever", "FirelockElectronics", - "ChemicalInjectionProjectile", + "SolutionInjectOnCollide", "Machine", "MachinePart", "MachineFrame", diff --git a/Content.Server/Chemistry/Components/ChemicalInjectionProjectileComponent.cs b/Content.Server/Chemistry/Components/ChemicalInjectionProjectileComponent.cs deleted file mode 100644 index 89ccf14f7c..0000000000 --- a/Content.Server/Chemistry/Components/ChemicalInjectionProjectileComponent.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using Content.Server.Body.Circulatory; -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.GameObjects; -using Robust.Shared.Physics.Collision; -using Robust.Shared.Physics.Dynamics; -using Robust.Shared.Serialization.Manager.Attributes; -using Robust.Shared.ViewVariables; - -namespace Content.Server.Chemistry.Components -{ - [RegisterComponent] - public class ChemicalInjectionProjectileComponent : Component, IStartCollide - { - public override string Name => "ChemicalInjectionProjectile"; - - [ViewVariables] - private SolutionContainerComponent _solutionContainer = default!; - - [ViewVariables(VVAccess.ReadWrite)] - [DataField("transferAmount")] - public ReagentUnit TransferAmount { get; set; } = ReagentUnit.New(1); - - [ViewVariables(VVAccess.ReadWrite)] - public float TransferEfficiency { get => _transferEfficiency; set => _transferEfficiency = Math.Clamp(value, 0, 1); } - [DataField("transferEfficiency")] - private float _transferEfficiency = 1f; - - protected override void Initialize() - { - base.Initialize(); - _solutionContainer = Owner.EnsureComponent(); - } - - void IStartCollide.CollideWith(Fixture ourFixture, Fixture otherFixture, in Manifold manifold) - { - if (!otherFixture.Body.Owner.TryGetComponent(out var bloodstream)) - return; - - var solution = _solutionContainer.Solution; - var solRemoved = solution.SplitSolution(TransferAmount); - var solRemovedVol = solRemoved.TotalVolume; - - var solToInject = solRemoved.SplitSolution(solRemovedVol * TransferEfficiency); - - bloodstream.TryTransferSolution(solToInject); - } - } -} diff --git a/Content.Server/Chemistry/Components/SolutionInjectOnCollideComponent.cs b/Content.Server/Chemistry/Components/SolutionInjectOnCollideComponent.cs new file mode 100644 index 0000000000..85efc832bb --- /dev/null +++ b/Content.Server/Chemistry/Components/SolutionInjectOnCollideComponent.cs @@ -0,0 +1,27 @@ +using System; +using Content.Shared.Chemistry.Reagent; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization.Manager.Attributes; +using Robust.Shared.ViewVariables; + +namespace Content.Server.Chemistry.Components +{ + /// + /// On colliding with an entity that has a bloodstream will dump its solution onto them. + /// + [RegisterComponent] + internal sealed class SolutionInjectOnCollideComponent : Component + { + public override string Name => "SolutionInjectOnCollide"; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("transferAmount")] + public ReagentUnit TransferAmount { get; set; } = ReagentUnit.New(1); + + [ViewVariables(VVAccess.ReadWrite)] + public float TransferEfficiency { get => _transferEfficiency; set => _transferEfficiency = Math.Clamp(value, 0, 1); } + + [DataField("transferEfficiency")] + private float _transferEfficiency = 1f; + } +} diff --git a/Content.Server/Chemistry/EntitySystems/SolutionInjectOnCollideSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionInjectOnCollideSystem.cs new file mode 100644 index 0000000000..aa00ab6ac6 --- /dev/null +++ b/Content.Server/Chemistry/EntitySystems/SolutionInjectOnCollideSystem.cs @@ -0,0 +1,38 @@ +using Content.Server.Body.Circulatory; +using Content.Server.Chemistry.Components; +using JetBrains.Annotations; +using Robust.Shared.GameObjects; +using Robust.Shared.Physics.Dynamics; + +namespace Content.Server.Chemistry.EntitySystems +{ + [UsedImplicitly] + internal sealed class SolutionInjectOnCollideSystem : EntitySystem + { + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(HandleInit); + SubscribeLocalEvent(HandleInjection); + } + + private void HandleInit(EntityUid uid, SolutionInjectOnCollideComponent component, ComponentInit args) + { + component.Owner.EnsureComponentWarn($"{nameof(SolutionInjectOnCollideComponent)} requires a SolutionContainer on {component.Owner}!"); + } + + private void HandleInjection(EntityUid uid, SolutionInjectOnCollideComponent component, StartCollideEvent args) + { + if (!args.OtherFixture.Body.Owner.TryGetComponent(out var bloodstream) || + !ComponentManager.TryGetComponent(uid, out SolutionContainerComponent? solutionContainer)) return; + + var solution = solutionContainer.Solution; + var solRemoved = solution.SplitSolution(component.TransferAmount); + var solRemovedVol = solRemoved.TotalVolume; + + var solToInject = solRemoved.SplitSolution(solRemovedVol * component.TransferEfficiency); + + bloodstream.TryTransferSolution(solToInject); + } + } +} diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml index d3ed06e0ee..f2156645d8 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml @@ -92,5 +92,5 @@ - type: SolutionContainer maxVol: 15 caps: Refillable, Drainable - - type: ChemicalInjectionProjectile + - type: SolutionInjectOnCollide transferAmount: 15