protected virtual void OnReaction(ReactionPrototype reaction, IEntity owner, ReagentUnit unitReactions) { foreach (var effect in reaction.Effects) { effect.React(owner, unitReactions.Double()); } }
/// <summary> /// Perform a reaction on a solution. This assumes all reaction criteria have already been checked and are met. /// </summary> /// <param name="solution">Solution to be reacted.</param> /// <param name="reaction">Reaction to occur.</param> /// <param name="unitReactions">The number of times to cause this reaction.</param> private void PerformReaction(ReactionPrototype reaction, ReagentUnit unitReactions) { //Remove non-catalysts foreach (var reactant in reaction.Reactants) { if (!reactant.Value.Catalyst) { var amountToRemove = unitReactions * reactant.Value.Amount; TryRemoveReagent(reactant.Key, amountToRemove); } } // Add products foreach (var product in reaction.Products) { TryAddReagent(product.Key, product.Value * unitReactions, out var acceptedQuantity, true); } // Trigger reaction effects foreach (var effect in reaction.Effects) { effect.React(Owner, unitReactions.Double()); } // Play reaction sound client-side _audioSystem.PlayAtCoords("/Audio/Effects/Chemistry/bubbles.ogg", Owner.Transform.Coordinates); }
/// <summary> /// Perform a reaction on a solution. This assumes all reaction criteria are met. /// Removes the reactants from the solution, then returns a solution with all products. /// </summary> private static Solution PerformReaction(Solution solution, IEntity owner, ReactionPrototype reaction, ReagentUnit unitReactions) { //Remove reactants foreach (var reactant in reaction.Reactants) { if (!reactant.Value.Catalyst) { var amountToRemove = unitReactions * reactant.Value.Amount; solution.RemoveReagent(reactant.Key, amountToRemove); } } //Create products var products = new Solution(); foreach (var product in reaction.Products) { products.AddReagent(product.Key, product.Value * unitReactions); } // Trigger reaction effects foreach (var effect in reaction.Effects) { effect.React(owner, unitReactions.Double()); } return(products); }