diff --git a/Content.Server/Body/Systems/MetabolizerSystem.cs b/Content.Server/Body/Systems/MetabolizerSystem.cs index 0e54f37504..b8530fdd2f 100644 --- a/Content.Server/Body/Systems/MetabolizerSystem.cs +++ b/Content.Server/Body/Systems/MetabolizerSystem.cs @@ -158,7 +158,7 @@ namespace Content.Server.Body.Systems if (!effect.ShouldApply(args, _random)) continue; - effect.Metabolize(args); + effect.Effect(args); } } diff --git a/Content.Server/Chemistry/EntitySystems/ChemicalReactionSystem.cs b/Content.Server/Chemistry/EntitySystems/ChemicalReactionSystem.cs index d1a032b77f..36db8d549a 100644 --- a/Content.Server/Chemistry/EntitySystems/ChemicalReactionSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/ChemicalReactionSystem.cs @@ -10,9 +10,9 @@ namespace Content.Server.Chemistry.EntitySystems { public class ChemicalReactionSystem : SharedChemicalReactionSystem { - protected override void OnReaction(Solution solution, ReactionPrototype reaction, EntityUid ownerUid, FixedPoint2 unitReactions) + protected override void OnReaction(Solution solution, ReactionPrototype reaction, ReagentPrototype randomReagent, EntityUid ownerUid, FixedPoint2 unitReactions) { - base.OnReaction(solution, reaction, ownerUid, unitReactions); + base.OnReaction(solution, reaction, randomReagent, ownerUid, unitReactions); SoundSystem.Play(Filter.Pvs(ownerUid, entityManager:EntityManager), reaction.Sound.GetSound(), ownerUid); } diff --git a/Content.Server/Chemistry/ReactionEffects/AreaReactionEffect.cs b/Content.Server/Chemistry/ReactionEffects/AreaReactionEffect.cs index 07e5ed169a..4c424baea9 100644 --- a/Content.Server/Chemistry/ReactionEffects/AreaReactionEffect.cs +++ b/Content.Server/Chemistry/ReactionEffects/AreaReactionEffect.cs @@ -5,6 +5,7 @@ using Content.Server.Coordinates.Helpers; using Content.Shared.Audio; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reaction; +using Content.Shared.Chemistry.Reagent; using Content.Shared.Sound; using JetBrains.Annotations; using Robust.Shared.Audio; @@ -23,7 +24,7 @@ namespace Content.Server.Chemistry.ReactionEffects /// [UsedImplicitly] [ImplicitDataDefinitionForInheritors] - public abstract class AreaReactionEffect : IReactionEffect, ISerializationHooks + public abstract class AreaReactionEffect : ReagentEffect, ISerializationHooks { [Dependency] private readonly IMapManager _mapManager = default!; @@ -89,11 +90,14 @@ namespace Content.Server.Chemistry.ReactionEffects IoCManager.InjectDependencies(this); } - public void React(Solution solution, EntityUid solutionEntity, double intensity, IEntityManager entityManager) + public override void Effect(ReagentEffectArgs args) { - var splitSolution = EntitySystem.Get().SplitSolution(solutionEntity, solution, solution.MaxVolume); + if (args.Source == null) + return; + + var splitSolution = EntitySystem.Get().SplitSolution(args.SolutionEntity, args.Source, args.Source.MaxVolume); // We take the square root so it becomes harder to reach higher amount values - var amount = (int) Math.Round(_rangeConstant + _rangeMultiplier*Math.Sqrt(intensity)); + var amount = (int) Math.Round(_rangeConstant + _rangeMultiplier*Math.Sqrt(args.Quantity.Float())); amount = Math.Min(amount, _maxRange); if (_diluteReagents) @@ -117,13 +121,13 @@ namespace Content.Server.Chemistry.ReactionEffects splitSolution.RemoveSolution(splitSolution.TotalVolume * solutionFraction); } - var transform = entityManager.GetComponent(solutionEntity); + var transform = args.EntityManager.GetComponent(args.SolutionEntity); if (!_mapManager.TryFindGridAt(transform.MapPosition, out var grid)) return; var coords = grid.MapToGrid(transform.MapPosition); - var ent = entityManager.SpawnEntity(_prototypeId, coords.SnapToGrid()); + var ent = args.EntityManager.SpawnEntity(_prototypeId, coords.SnapToGrid()); var areaEffectComponent = GetAreaEffectComponent(ent); @@ -137,7 +141,7 @@ namespace Content.Server.Chemistry.ReactionEffects areaEffectComponent.TryAddSolution(splitSolution); areaEffectComponent.Start(amount, _duration, _spreadDelay, _removeDelay); - SoundSystem.Play(Filter.Pvs(solutionEntity), _sound.GetSound(), solutionEntity, AudioHelpers.WithVariation(0.125f)); + SoundSystem.Play(Filter.Pvs(args.SolutionEntity), _sound.GetSound(), args.SolutionEntity, AudioHelpers.WithVariation(0.125f)); } protected abstract SolutionAreaEffectComponent? GetAreaEffectComponent(IEntity entity); diff --git a/Content.Server/Chemistry/ReactionEffects/ExplosionReactionEffect.cs b/Content.Server/Chemistry/ReactionEffects/ExplosionReactionEffect.cs index 8c809d83fa..a63397fec4 100644 --- a/Content.Server/Chemistry/ReactionEffects/ExplosionReactionEffect.cs +++ b/Content.Server/Chemistry/ReactionEffects/ExplosionReactionEffect.cs @@ -1,15 +1,14 @@ using System; using Content.Server.Chemistry.Components.SolutionManager; using Content.Server.Explosion.EntitySystems; -using Content.Shared.Chemistry.Components; -using Content.Shared.Chemistry.Reaction; +using Content.Shared.Chemistry.Reagent; using Robust.Shared.GameObjects; using Robust.Shared.Serialization.Manager.Attributes; namespace Content.Server.Chemistry.ReactionEffects { [DataDefinition] - public class ExplosionReactionEffect : IReactionEffect + public class ExplosionReactionEffect : ReagentEffect { [DataField("devastationRange")] private float _devastationRange = 1; [DataField("heavyImpactRange")] private float _heavyImpactRange = 2; @@ -27,11 +26,11 @@ namespace Content.Server.Chemistry.ReactionEffects /// [DataField("maxScale")] private float _maxScale = 1; - public void React(Solution solution, EntityUid solutionEntity, double intensity, IEntityManager entityManager) + public override void Effect(ReagentEffectArgs args) { - var floatIntensity = (float) intensity; + var floatIntensity = (float) args.Quantity; - if (!entityManager.HasComponent(solutionEntity)) + if (!args.EntityManager.HasComponent(args.SolutionEntity)) return; //Handle scaling @@ -49,7 +48,7 @@ namespace Content.Server.Chemistry.ReactionEffects var finalHeavyImpactRange = (int)MathF.Round(_heavyImpactRange * floatIntensity); var finalLightImpactRange = (int)MathF.Round(_lightImpactRange * floatIntensity); var finalFlashRange = (int)MathF.Round(_flashRange * floatIntensity); - EntitySystem.Get().SpawnExplosion(solutionEntity, finalDevastationRange, + EntitySystem.Get().SpawnExplosion(args.SolutionEntity, finalDevastationRange, finalHeavyImpactRange, finalLightImpactRange, finalFlashRange); } } diff --git a/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs b/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs index dd22fbd231..744b6b1821 100644 --- a/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs +++ b/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs @@ -26,6 +26,9 @@ namespace Content.Server.Chemistry.ReagentEffectConditions public override bool Condition(ReagentEffectArgs args) { + if (args.Reagent == null) + return false; + if (Reagent == null) Reagent = args.Reagent.ID; diff --git a/Content.Server/Chemistry/ReagentEffects/AddToSolutionReaction.cs b/Content.Server/Chemistry/ReagentEffects/AddToSolutionReaction.cs index 11036849fa..d92ddf16d5 100644 --- a/Content.Server/Chemistry/ReagentEffects/AddToSolutionReaction.cs +++ b/Content.Server/Chemistry/ReagentEffects/AddToSolutionReaction.cs @@ -16,15 +16,18 @@ namespace Content.Server.Chemistry.ReagentEffects [DataField("solution")] private string _solution = "reagents"; - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { + if (args.Reagent == null) + return; + // TODO see if this is correct if (!EntitySystem.Get() .TryGetSolution(args.SolutionEntity, _solution, out var solutionContainer)) return; if (EntitySystem.Get() - .TryAddReagent(args.SolutionEntity, solutionContainer, args.Reagent.ID, args.Metabolizing, out var accepted)) + .TryAddReagent(args.SolutionEntity, solutionContainer, args.Reagent.ID, args.Quantity, out var accepted)) args.Source?.RemoveReagent(args.Reagent.ID, accepted); } } diff --git a/Content.Server/Chemistry/ReagentEffects/AdjustTemperature.cs b/Content.Server/Chemistry/ReagentEffects/AdjustTemperature.cs index 487c9f1676..bc1154d9c8 100644 --- a/Content.Server/Chemistry/ReagentEffects/AdjustTemperature.cs +++ b/Content.Server/Chemistry/ReagentEffects/AdjustTemperature.cs @@ -10,7 +10,7 @@ namespace Content.Server.Chemistry.ReagentEffects [DataField("amount")] public float Amount; - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent(args.SolutionEntity, out TemperatureComponent temp)) { diff --git a/Content.Server/Chemistry/ReagentEffects/ExtinguishReaction.cs b/Content.Server/Chemistry/ReagentEffects/ExtinguishReaction.cs index be34222439..05e11ecfcc 100644 --- a/Content.Server/Chemistry/ReagentEffects/ExtinguishReaction.cs +++ b/Content.Server/Chemistry/ReagentEffects/ExtinguishReaction.cs @@ -14,13 +14,13 @@ namespace Content.Server.Chemistry.ReagentEffects [UsedImplicitly] public class ExtinguishReaction : ReagentEffect { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out FlammableComponent? flammable)) return; var flammableSystem = EntitySystem.Get(); flammableSystem.Extinguish(args.SolutionEntity, flammable); - flammableSystem.AdjustFireStacks(args.SolutionEntity, -1.5f * (float) args.Metabolizing, flammable); + flammableSystem.AdjustFireStacks(args.SolutionEntity, -1.5f * (float) args.Quantity, flammable); } } } diff --git a/Content.Server/Chemistry/ReagentEffects/FlammableReaction.cs b/Content.Server/Chemistry/ReagentEffects/FlammableReaction.cs index 9c2471f2a0..f2544c2f1f 100644 --- a/Content.Server/Chemistry/ReagentEffects/FlammableReaction.cs +++ b/Content.Server/Chemistry/ReagentEffects/FlammableReaction.cs @@ -14,12 +14,12 @@ namespace Content.Server.Chemistry.ReagentEffects [UsedImplicitly] public class FlammableReaction : ReagentEffect { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out FlammableComponent? flammable)) return; - EntitySystem.Get().AdjustFireStacks(args.SolutionEntity, args.Metabolizing.Float() / 5f, flammable); - args.Source?.RemoveReagent(args.Reagent.ID, args.Metabolizing); + EntitySystem.Get().AdjustFireStacks(args.SolutionEntity, args.Quantity.Float() / 5f, flammable); + args.Source?.RemoveReagent(args.Reagent.ID, args.Quantity); } } } diff --git a/Content.Server/Chemistry/ReagentEffects/HealthChange.cs b/Content.Server/Chemistry/ReagentEffects/HealthChange.cs index 0536ed39c2..8afedb5614 100644 --- a/Content.Server/Chemistry/ReagentEffects/HealthChange.cs +++ b/Content.Server/Chemistry/ReagentEffects/HealthChange.cs @@ -19,9 +19,9 @@ namespace Content.Server.Chemistry.ReagentEffects [DataField("damage", required: true)] public DamageSpecifier Damage = default!; - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { - EntitySystem.Get().TryChangeDamage(args.SolutionEntity, Damage * args.Metabolizing, true); + EntitySystem.Get().TryChangeDamage(args.SolutionEntity, Damage * args.Quantity, true); } } } diff --git a/Content.Server/Chemistry/ReagentEffects/MovespeedModifier.cs b/Content.Server/Chemistry/ReagentEffects/MovespeedModifier.cs index a230c8ab91..6e900d388a 100644 --- a/Content.Server/Chemistry/ReagentEffects/MovespeedModifier.cs +++ b/Content.Server/Chemistry/ReagentEffects/MovespeedModifier.cs @@ -37,7 +37,7 @@ namespace Content.Server.Chemistry.ReagentEffects /// /// Remove reagent at set rate, changes the movespeed modifiers and adds a MovespeedModifierMetabolismComponent if not already there. /// - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { var status = args.EntityManager.EnsureComponent(args.SolutionEntity); @@ -48,7 +48,7 @@ namespace Content.Server.Chemistry.ReagentEffects status.WalkSpeedModifier = WalkSpeedModifier; status.SprintSpeedModifier = SprintSpeedModifier; - IncreaseTimer(status, StatusLifetime * args.Metabolizing.Float()); + IncreaseTimer(status, StatusLifetime * args.Quantity.Float()); if (modified) EntitySystem.Get().RefreshMovementSpeedModifiers(args.SolutionEntity); diff --git a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustHealth.cs b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustHealth.cs index 3a8174203c..537cc9e714 100644 --- a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustHealth.cs +++ b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustHealth.cs @@ -7,7 +7,7 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism { public class PlantAdjustHealth : PlantAdjustAttribute { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) return; diff --git a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustMutationLevel.cs b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustMutationLevel.cs index 98d8ae011a..6a4bde18c7 100644 --- a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustMutationLevel.cs +++ b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustMutationLevel.cs @@ -7,7 +7,7 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism { public class PlantAdjustMutationLevel : PlantAdjustAttribute { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) return; diff --git a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustMutationMod.cs b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustMutationMod.cs index 85d538e828..b4a62f120f 100644 --- a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustMutationMod.cs +++ b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustMutationMod.cs @@ -8,7 +8,7 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism [UsedImplicitly] public class PlantAdjustMutationMod : PlantAdjustAttribute { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) return; diff --git a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustNutrition.cs b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustNutrition.cs index e9d628ae5b..4b6cf36570 100644 --- a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustNutrition.cs +++ b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustNutrition.cs @@ -8,7 +8,7 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism [UsedImplicitly] public class PlantAdjustNutrition : PlantAdjustAttribute { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) return; diff --git a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustPests.cs b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustPests.cs index 53148214a7..77e36374de 100644 --- a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustPests.cs +++ b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustPests.cs @@ -8,7 +8,7 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism [UsedImplicitly] public class PlantAdjustPests : PlantAdjustAttribute { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) return; diff --git a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustToxins.cs b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustToxins.cs index 4e46fcb433..6dc0e3d0b6 100644 --- a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustToxins.cs +++ b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustToxins.cs @@ -8,7 +8,7 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism [UsedImplicitly] public class PlantAdjustToxins : PlantAdjustAttribute { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) return; diff --git a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustWater.cs b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustWater.cs index 1bd5f34784..561a6e1b94 100644 --- a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustWater.cs +++ b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustWater.cs @@ -8,7 +8,7 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism [UsedImplicitly] public class PlantAdjustWater : PlantAdjustAttribute { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) return; diff --git a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustWeeds.cs b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustWeeds.cs index fb561121f8..67b588bc97 100644 --- a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustWeeds.cs +++ b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAdjustWeeds.cs @@ -8,7 +8,7 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism [UsedImplicitly] public class PlantAdjustWeeds : PlantAdjustAttribute { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) return; diff --git a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAffectGrowth.cs b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAffectGrowth.cs index 5c26ab63ee..fd7327b4af 100644 --- a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAffectGrowth.cs +++ b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantAffectGrowth.cs @@ -8,7 +8,7 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism [UsedImplicitly] public class PlantAffectGrowth : PlantAdjustAttribute { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) return; diff --git a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantClonexadone.cs b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantClonexadone.cs index 43172d656f..d19938ec73 100644 --- a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantClonexadone.cs +++ b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantClonexadone.cs @@ -15,7 +15,7 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism [DataDefinition] public class PlantClonexadone : ReagentEffect { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out PlantHolderComponent? plantHolderComp) || plantHolderComp.Seed == null || plantHolderComp.Dead) diff --git a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantDiethylamine.cs b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantDiethylamine.cs index f8e771cd9f..5f22685ea0 100644 --- a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantDiethylamine.cs +++ b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/PlantDiethylamine.cs @@ -15,7 +15,7 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism [DataDefinition] public class PlantDiethylamine : ReagentEffect { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out PlantHolderComponent? plantHolderComp) || plantHolderComp.Seed == null || plantHolderComp.Dead || diff --git a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/RobustHarvest.cs b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/RobustHarvest.cs index ef4b777b47..8437ece9ba 100644 --- a/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/RobustHarvest.cs +++ b/Content.Server/Chemistry/ReagentEffects/PlantMetabolism/RobustHarvest.cs @@ -15,7 +15,7 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism [DataDefinition] public class RobustHarvest : ReagentEffect { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out PlantHolderComponent? plantHolderComp) || plantHolderComp.Seed == null || plantHolderComp.Dead || diff --git a/Content.Server/Chemistry/ReagentEffects/PopupMessage.cs b/Content.Server/Chemistry/ReagentEffects/PopupMessage.cs index 9ececb5473..bf448757b3 100644 --- a/Content.Server/Chemistry/ReagentEffects/PopupMessage.cs +++ b/Content.Server/Chemistry/ReagentEffects/PopupMessage.cs @@ -16,7 +16,7 @@ namespace Content.Server.Chemistry.ReagentEffects [DataField("type")] public PopupType Type = PopupType.Local; - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { var popupSys = args.EntityManager.EntitySysManager.GetEntitySystem(); var random = IoCManager.Resolve(); diff --git a/Content.Server/Chemistry/ReagentEffects/RemoveReagent.cs b/Content.Server/Chemistry/ReagentEffects/RemoveReagent.cs index c1dbb882c9..7757753cba 100644 --- a/Content.Server/Chemistry/ReagentEffects/RemoveReagent.cs +++ b/Content.Server/Chemistry/ReagentEffects/RemoveReagent.cs @@ -29,7 +29,7 @@ namespace Content.Server.Chemistry.ReagentEffects [DataField("amount", required: true)] public FixedPoint2 Amount = default!; - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (args.Source != null) { diff --git a/Content.Server/Chemistry/ReagentEffects/SatiateHunger.cs b/Content.Server/Chemistry/ReagentEffects/SatiateHunger.cs index e1a219f707..466bf8ff3e 100644 --- a/Content.Server/Chemistry/ReagentEffects/SatiateHunger.cs +++ b/Content.Server/Chemistry/ReagentEffects/SatiateHunger.cs @@ -18,10 +18,10 @@ namespace Content.Server.Chemistry.ReagentEffects [DataField("factor")] public float NutritionFactor { get; set; } = 3.0f; //Remove reagent at set rate, satiate hunger if a HungerComponent can be found - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent(args.SolutionEntity, out HungerComponent? hunger)) - hunger.UpdateFood(NutritionFactor * (float) args.Metabolizing); + hunger.UpdateFood(NutritionFactor * (float) args.Quantity); } } } diff --git a/Content.Server/Chemistry/ReagentEffects/SatiateThirst.cs b/Content.Server/Chemistry/ReagentEffects/SatiateThirst.cs index a53e8325da..42b0cf2391 100644 --- a/Content.Server/Chemistry/ReagentEffects/SatiateThirst.cs +++ b/Content.Server/Chemistry/ReagentEffects/SatiateThirst.cs @@ -18,10 +18,10 @@ namespace Content.Server.Chemistry.ReagentEffects public float HydrationFactor { get; set; } = 3.0f; /// Satiate thirst if a ThirstComponent can be found - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent(args.SolutionEntity, out ThirstComponent? thirst)) - thirst.UpdateThirst(HydrationFactor * (float) args.Metabolizing); + thirst.UpdateThirst(HydrationFactor * (float) args.Quantity); } } } diff --git a/Content.Server/Chemistry/ReagentEffects/StatusEffects/GenericStatusEffect.cs b/Content.Server/Chemistry/ReagentEffects/StatusEffects/GenericStatusEffect.cs index 66ae3e8215..b0c7f5711d 100644 --- a/Content.Server/Chemistry/ReagentEffects/StatusEffects/GenericStatusEffect.cs +++ b/Content.Server/Chemistry/ReagentEffects/StatusEffects/GenericStatusEffect.cs @@ -36,7 +36,7 @@ namespace Content.Server.Chemistry.ReagentEffects.StatusEffects [DataField("type")] public StatusEffectMetabolismType Type = StatusEffectMetabolismType.Add; - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { var statusSys = args.EntityManager.EntitySysManager.GetEntitySystem(); if (Type == StatusEffectMetabolismType.Add && Component != String.Empty) diff --git a/Content.Server/Chemistry/ReagentEffects/StatusEffects/Jitter.cs b/Content.Server/Chemistry/ReagentEffects/StatusEffects/Jitter.cs index 16b7ba43c0..5310d27e62 100644 --- a/Content.Server/Chemistry/ReagentEffects/StatusEffects/Jitter.cs +++ b/Content.Server/Chemistry/ReagentEffects/StatusEffects/Jitter.cs @@ -23,7 +23,7 @@ namespace Content.Server.Chemistry.ReagentEffects.StatusEffects [DataField("time")] public float Time = 2.0f; - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { args.EntityManager.EntitySysManager.GetEntitySystem() .DoJitter(args.SolutionEntity, TimeSpan.FromSeconds(Time), Amplitude, Frequency); diff --git a/Content.Server/Chemistry/ReagentEffects/WashCreamPieReaction.cs b/Content.Server/Chemistry/ReagentEffects/WashCreamPieReaction.cs index 0b8481422a..d3ba9545d8 100644 --- a/Content.Server/Chemistry/ReagentEffects/WashCreamPieReaction.cs +++ b/Content.Server/Chemistry/ReagentEffects/WashCreamPieReaction.cs @@ -14,7 +14,7 @@ namespace Content.Server.Chemistry.ReagentEffects [UsedImplicitly] public class WashCreamPieReaction : ReagentEffect { - public override void Metabolize(ReagentEffectArgs args) + public override void Effect(ReagentEffectArgs args) { if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out CreamPiedComponent? creamPied)) return; diff --git a/Content.Shared/Chemistry/ChemistrySystem.cs b/Content.Shared/Chemistry/ChemistrySystem.cs index 45ba6ad500..9917248a3d 100644 --- a/Content.Shared/Chemistry/ChemistrySystem.cs +++ b/Content.Shared/Chemistry/ChemistrySystem.cs @@ -53,7 +53,7 @@ namespace Content.Shared.Chemistry if (!effect.ShouldApply(args, _robustRandom)) continue; - effect.Metabolize(args); + effect.Effect(args); } } } diff --git a/Content.Shared/Chemistry/Reaction/IReactionEffect.cs b/Content.Shared/Chemistry/Reaction/IReactionEffect.cs deleted file mode 100644 index 9e0ac78ddf..0000000000 --- a/Content.Shared/Chemistry/Reaction/IReactionEffect.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Content.Shared.Chemistry.Components; -using Robust.Shared.GameObjects; - -namespace Content.Shared.Chemistry.Reaction -{ - /// - /// Chemical reaction effect on the world such as an explosion, EMP, or fire. - /// - public interface IReactionEffect - { - void React(Solution solution, EntityUid solutionEntity, double intensity, IEntityManager entityManager); - } -} diff --git a/Content.Shared/Chemistry/Reaction/ReactionPrototype.cs b/Content.Shared/Chemistry/Reaction/ReactionPrototype.cs index dc2edfa125..f163da7e83 100644 --- a/Content.Shared/Chemistry/Reaction/ReactionPrototype.cs +++ b/Content.Shared/Chemistry/Reaction/ReactionPrototype.cs @@ -14,10 +14,6 @@ namespace Content.Shared.Chemistry.Reaction [Prototype("reaction")] public class ReactionPrototype : IPrototype { - [DataField("reactants")] private Dictionary _reactants = new(); - [DataField("products")] private Dictionary _products = new(); - [DataField("effects", serverOnly: true)] private List _effects = new(); - [ViewVariables] [DataField("id", required: true)] public string ID { get; } = default!; @@ -28,15 +24,17 @@ namespace Content.Shared.Chemistry.Reaction /// /// Reactants required for the reaction to occur. /// - public IReadOnlyDictionary Reactants => _reactants; + [DataField("reactants")] public Dictionary Reactants = new(); + /// /// Reagents created when the reaction occurs. /// - public IReadOnlyDictionary Products => _products; + [DataField("products")] public Dictionary Products = new(); + /// /// Effects to be triggered when the reaction occurs. /// - public IReadOnlyList Effects => _effects; + [DataField("effects", serverOnly: true)] public List Effects = new(); // TODO SERV3: Empty on the client, (de)serialize on the server with module manager is server module [DataField("sound", serverOnly: true)] public SoundSpecifier Sound { get; private set; } = new SoundPathSpecifier("/Audio/Effects/Chemistry/bubbles.ogg"); diff --git a/Content.Shared/Chemistry/Reaction/SharedChemicalReactionSystem.cs b/Content.Shared/Chemistry/Reaction/SharedChemicalReactionSystem.cs index 408af8d1cc..970dad8b0f 100644 --- a/Content.Shared/Chemistry/Reaction/SharedChemicalReactionSystem.cs +++ b/Content.Shared/Chemistry/Reaction/SharedChemicalReactionSystem.cs @@ -6,6 +6,7 @@ using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Log; using Robust.Shared.Prototypes; +using Robust.Shared.Random; namespace Content.Shared.Chemistry.Reaction { @@ -16,6 +17,7 @@ namespace Content.Shared.Chemistry.Reaction private const int MaxReactionIterations = 20; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IRobustRandom _random = default!; public override void Initialize() { @@ -58,6 +60,9 @@ namespace Content.Shared.Chemistry.Reaction /// private Solution PerformReaction(Solution solution, EntityUid ownerUid, ReactionPrototype reaction, FixedPoint2 unitReactions) { + // We do this so that ReagentEffect can have something to work with, even if it's + // a little meaningless. + var randomReagent = _prototypeManager.Index(_random.Pick(reaction.Reactants).Key); //Remove reactants foreach (var reactant in reaction.Reactants) { @@ -76,16 +81,23 @@ namespace Content.Shared.Chemistry.Reaction } // Trigger reaction effects - OnReaction(solution, reaction, ownerUid, unitReactions); + OnReaction(solution, reaction, randomReagent, ownerUid, unitReactions); return products; } - protected virtual void OnReaction(Solution solution, ReactionPrototype reaction, EntityUid ownerUid, FixedPoint2 unitReactions) + protected virtual void OnReaction(Solution solution, ReactionPrototype reaction, ReagentPrototype randomReagent, EntityUid ownerUid, FixedPoint2 unitReactions) { + var args = new ReagentEffectArgs(ownerUid, null, solution, + randomReagent, + unitReactions, EntityManager, null); + foreach (var effect in reaction.Effects) { - effect.React(solution, ownerUid, unitReactions.Double(), EntityManager); + if (!effect.ShouldApply(args)) + continue; + + effect.Effect(args); } } diff --git a/Content.Shared/Chemistry/Reagent/ReagentEffect.cs b/Content.Shared/Chemistry/Reagent/ReagentEffect.cs index 8304ea7b86..087128f019 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentEffect.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentEffect.cs @@ -30,7 +30,7 @@ namespace Content.Shared.Chemistry.Reagent [DataField("probability")] public float Probability = 1.0f; - public abstract void Metabolize(ReagentEffectArgs args); + public abstract void Effect(ReagentEffectArgs args); } public static class ReagentEffectExt @@ -41,11 +41,6 @@ namespace Content.Shared.Chemistry.Reagent if (random == null) random = IoCManager.Resolve(); - - // Make sure we still have enough reagent to go... - if (args.Source != null && !args.Source.ContainsReagent(args.Reagent.ID)) - return false; - if (effect.Probability < 1.0f && !random.Prob(effect.Probability)) return false; @@ -74,7 +69,7 @@ namespace Content.Shared.Chemistry.Reagent EntityUid? OrganEntity, Solution? Source, ReagentPrototype Reagent, - FixedPoint2 Metabolizing, + FixedPoint2 Quantity, IEntityManager EntityManager, ReactionMethod? Method ); diff --git a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs index 530d68d507..8af9938a32 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs @@ -120,7 +120,7 @@ namespace Content.Shared.Chemistry.Reagent if (!plantMetabolizable.ShouldApply(args, random)) continue; - plantMetabolizable.Metabolize(args); + plantMetabolizable.Effect(args); } } }