Beispiel #1
0
        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);
        }
Beispiel #2
0
        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;
                }
            }
        }
Beispiel #3
0
        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);
                    }
                }
            }
        }
Beispiel #4
0
 protected abstract void React(IEntity entity, ReagentPrototype reagent, ReagentUnit volume, Solution?source);