Metabolism tweaks / metabolism 4.0 (#5246)

* Metabolism tweaks

* use MetabolismArgs and convert ReagentEntityReactions into ReagentEffects

* fork forgor 💀

* fixes
This commit is contained in:
mirrorcult
2021-11-10 03:11:28 -07:00
committed by GitHub
parent 6486e07077
commit 747f02f3f3
41 changed files with 328 additions and 291 deletions

View File

@@ -1,6 +1,7 @@
using System.Collections.Generic;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using JetBrains.Annotations;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization.Manager.Attributes;
@@ -21,6 +22,23 @@ namespace Content.Shared.Chemistry.Reagent
[DataField("conditions")]
public ReagentEffectCondition[]? Conditions;
public abstract void Metabolize(EntityUid solutionEntity, EntityUid organEntity, Solution.ReagentQuantity reagent, IEntityManager entityManager);
public abstract void Metabolize(ReagentEffectArgs args);
}
public enum ReactionMethod
{
Touch,
Injection,
Ingestion,
}
public readonly record struct ReagentEffectArgs(
EntityUid SolutionEntity,
EntityUid? OrganEntity,
Solution? Source,
ReagentPrototype Reagent,
FixedPoint2 Metabolizing,
IEntityManager EntityManager,
ReactionMethod? Method
);
}

View File

@@ -9,6 +9,6 @@ namespace Content.Shared.Chemistry.Reagent
[MeansImplicitUse]
public abstract class ReagentEffectCondition
{
public abstract bool Condition(EntityUid solutionEntity, EntityUid organEntity, Solution.ReagentQuantity reagent, IEntityManager entityManager);
public abstract bool Condition(ReagentEffectArgs args);
}
}

View File

@@ -1,56 +0,0 @@
using System;
using Content.Shared.FixedPoint;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.ViewVariables;
namespace Content.Shared.Chemistry.Reagent
{
public enum ReactionMethod
{
Touch,
Injection,
Ingestion,
}
[ImplicitDataDefinitionForInheritors]
public abstract class ReagentEntityReaction
{
[ViewVariables]
[DataField("touch")]
public bool Touch { get; } = false;
[ViewVariables]
[DataField("injection")]
public bool Injection { get; } = false;
[ViewVariables]
[DataField("ingestion")]
public bool Ingestion { get; } = false;
public void React(ReactionMethod method, EntityUid uid, ReagentPrototype reagent, FixedPoint2 volume, Components.Solution? source, IEntityManager entityManager)
{
switch (method)
{
case ReactionMethod.Touch:
if (!Touch)
return;
break;
case ReactionMethod.Injection:
if(!Injection)
return;
break;
case ReactionMethod.Ingestion:
if(!Ingestion)
return;
break;
default:
throw new ArgumentOutOfRangeException(nameof(method), method, null);
}
React(uid, reagent, volume, source, entityManager);
}
protected abstract void React(EntityUid uid, ReagentPrototype reagent, FixedPoint2 volume, Components.Solution? source, IEntityManager entityManager);
}
}

View File

@@ -106,7 +106,7 @@ namespace Content.Shared.Chemistry.Reagent
return removed;
}
public void ReactionPlant(EntityUid? plantHolder, Solution.ReagentQuantity amount)
public void ReactionPlant(EntityUid? plantHolder, Solution.ReagentQuantity amount, Solution solution)
{
if (plantHolder == null)
return;
@@ -114,7 +114,9 @@ namespace Content.Shared.Chemistry.Reagent
var entMan = IoCManager.Resolve<IEntityManager>();
foreach (var plantMetabolizable in _plantMetabolism)
{
plantMetabolizable.Metabolize(plantHolder.Value, plantHolder.Value, amount, entMan);
plantMetabolizable.Metabolize(
new ReagentEffectArgs(plantHolder.Value, null, solution, this, amount.Quantity, entMan, null)
);
}
}
}