public void React(ReactionMethod method, IEntity entity, ReagentPrototype reagent, ReagentUnit volume, Solution?source) { 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(entity, reagent, volume, source); }
public void ReactionEntity(IEntity?entity, ReactionMethod method, ReagentPrototype reagent, ReagentUnit reactVolume, Solution.Solution?source) { if (entity == null || entity.Deleted || !entity.TryGetComponent(out ReactiveComponent? reactive)) { return; } foreach (var reaction in reactive.Reactions) { // If we have a source solution, use the reagent quantity we have left. Otherwise, use the reaction volume specified. reaction.React(method, entity, reagent, source?.GetReagentQuantity(reagent.ID) ?? reactVolume, source); // Make sure we still have enough reagent to go... if (source != null && !source.ContainsReagent(reagent.ID)) { break; } } }
public void ReactionEntity(EntityUid uid, ReactionMethod method, ReagentPrototype reagent, FixedPoint2 reactVolume, Solution?source) { if (!EntityManager.TryGetComponent(uid, out ReactiveComponent? reactive)) { return; } // If we have a source solution, use the reagent quantity we have left. Otherwise, use the reaction volume specified. var args = new ReagentEffectArgs(uid, null, source, reagent, source?.GetReagentQuantity(reagent.ID) ?? reactVolume, EntityManager, method); // First, check if the reagent wants to apply any effects. if (reagent.ReactiveEffects != null && reactive.ReactiveGroups != null) { foreach (var(key, val) in reagent.ReactiveEffects) { if (!val.Methods.Contains(method)) { continue; } if (!reactive.ReactiveGroups.ContainsKey(key)) { continue; } if (!reactive.ReactiveGroups[key].Contains(method)) { continue; } foreach (var effect in val.Effects) { if (!effect.ShouldApply(args, _robustRandom)) { continue; } if (effect.ShouldLog) { var entity = args.SolutionEntity; _adminLogger.Add(LogType.ReagentEffect, effect.LogImpact, $"Reactive effect {effect.GetType().Name:effect} of reagent {reagent.ID:reagent} with method {method} applied on entity {ToPrettyString(entity):entity} at {Transform(entity).Coordinates:coordinates}"); } effect.Effect(args); } } } // Then, check if the prototype has any effects it can apply as well. if (reactive.Reactions != null) { foreach (var entry in reactive.Reactions) { if (!entry.Methods.Contains(method)) { continue; } if (entry.Reagents != null && !entry.Reagents.Contains(reagent.ID)) { continue; } foreach (var effect in entry.Effects) { if (!effect.ShouldApply(args, _robustRandom)) { continue; } if (effect.ShouldLog) { var entity = args.SolutionEntity; _adminLogger.Add(LogType.ReagentEffect, effect.LogImpact, $"Reactive effect {effect.GetType().Name:effect} of {ToPrettyString(entity):entity} using reagent {reagent.ID:reagent} with method {method} at {Transform(entity).Coordinates:coordinates}"); } effect.Effect(args); } } } }
protected abstract void React(IEntity entity, ReagentPrototype reagent, ReagentUnit volume, Solution?source);