Pie transfer reagent on collision (#7802)

Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
This commit is contained in:
Ripmorld
2022-05-12 18:59:03 +08:00
committed by GitHub
parent 1720e0a45b
commit bd0d53bdd5
3 changed files with 32 additions and 4 deletions

View File

@@ -1,6 +1,7 @@
using System; using System;
using Content.Shared.Chemistry.Reagent; using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint; using Content.Shared.FixedPoint;
using Content.Shared.Inventory;
using Robust.Shared.GameObjects; using Robust.Shared.GameObjects;
using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.ViewVariables; using Robust.Shared.ViewVariables;
@@ -23,5 +24,11 @@ namespace Content.Server.Chemistry.Components
[DataField("transferEfficiency")] [DataField("transferEfficiency")]
private float _transferEfficiency = 1f; private float _transferEfficiency = 1f;
/// <summary>
/// If anything covers any of these slots then the injection fails.
/// </summary>
[DataField("blockSlots"), ViewVariables(VVAccess.ReadWrite)]
public SlotFlags BlockSlots = SlotFlags.MASK;
} }
} }

View File

@@ -2,18 +2,22 @@ using Content.Server.Body.Components;
using Content.Server.Body.Systems; using Content.Server.Body.Systems;
using Content.Server.Chemistry.Components; using Content.Server.Chemistry.Components;
using Content.Server.Chemistry.Components.SolutionManager; using Content.Server.Chemistry.Components.SolutionManager;
using Content.Server.Nutrition.EntitySystems;
using Content.Shared.Inventory;
using JetBrains.Annotations; using JetBrains.Annotations;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Physics.Dynamics; using Robust.Shared.Physics.Dynamics;
using Robust.Shared.Prototypes;
namespace Content.Server.Chemistry.EntitySystems namespace Content.Server.Chemistry.EntitySystems
{ {
[UsedImplicitly] [UsedImplicitly]
internal sealed class SolutionInjectOnCollideSystem : EntitySystem internal sealed class SolutionInjectOnCollideSystem : EntitySystem
{ {
[Dependency] private readonly IPrototypeManager _protoManager = default!;
[Dependency] private readonly SolutionContainerSystem _solutionsSystem = default!; [Dependency] private readonly SolutionContainerSystem _solutionsSystem = default!;
[Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!;
[Dependency] private readonly InventorySystem _inventorySystem = default!;
public override void Initialize() public override void Initialize()
{ {
@@ -30,15 +34,29 @@ namespace Content.Server.Chemistry.EntitySystems
private void HandleInjection(EntityUid uid, SolutionInjectOnCollideComponent component, StartCollideEvent args) private void HandleInjection(EntityUid uid, SolutionInjectOnCollideComponent component, StartCollideEvent args)
{ {
if (!EntityManager.TryGetComponent<BloodstreamComponent?>(args.OtherFixture.Body.Owner, out var bloodstream) || var target = args.OtherFixture.Body.Owner;
if (!args.OtherFixture.Body.Hard ||
!EntityManager.TryGetComponent<BloodstreamComponent>(target, out var bloodstream) ||
!_solutionsSystem.TryGetInjectableSolution(component.Owner, out var solution)) return; !_solutionsSystem.TryGetInjectableSolution(component.Owner, out var solution)) return;
if (component.BlockSlots != 0x0 && TryComp<InventoryComponent>(target, out var inventory))
{
var containerEnumerator = new InventorySystem.ContainerSlotEnumerator(target, inventory.TemplateId, _protoManager, _inventorySystem, component.BlockSlots);
while (containerEnumerator.MoveNext(out var container))
{
if (!container.ContainedEntity.HasValue) continue;
return;
}
}
var solRemoved = solution.SplitSolution(component.TransferAmount); var solRemoved = solution.SplitSolution(component.TransferAmount);
var solRemovedVol = solRemoved.TotalVolume; var solRemovedVol = solRemoved.TotalVolume;
var solToInject = solRemoved.SplitSolution(solRemovedVol * component.TransferEfficiency); var solToInject = solRemoved.SplitSolution(solRemovedVol * component.TransferEfficiency);
_bloodstreamSystem.TryAddToChemicals((args.OtherFixture.Body).Owner, solToInject, bloodstream); _bloodstreamSystem.TryAddToChemicals(target, solToInject, bloodstream);
} }
} }
} }

View File

@@ -114,6 +114,9 @@
- state: tin - state: tin
- state: plain - state: plain
- type: CreamPie - type: CreamPie
- type: SolutionInjectOnCollide
transferAmount: 20
transferEfficiency: 0.2
# Tastes like pie, cream, banana. # Tastes like pie, cream, banana.
- type: entity - type: entity