public bool SetInput(IStorage input) { foreach (ITrackedStack trackedStack in input.GetItems()) { if (trackedStack.Sample is SObject objectInput && !objectInput.bigCraftable.Value && ProducerController.GetProducerItem(_machine.Name, objectInput) is ProducerRule producerRule && !ProducerRuleController.IsInputExcluded(producerRule, objectInput)) { if (input.TryGetIngredient(objectInput.ParentSheetIndex, producerRule.InputStack, out IConsumable inputConsumable)) { objectInput = inputConsumable.Sample as SObject; List <IConsumable> requiredFuels = GetRequiredFuels(producerRule, input); if (requiredFuels != null) { Random random = ProducerRuleController.GetRandomForProducing(_machine.TileLocation); OutputConfig outputConfig = OutputConfigController.ChooseOutput(producerRule.OutputConfigs, random); SObject output = OutputConfigController.CreateOutput(outputConfig, objectInput, random); _machine.heldObject.Value = output; OutputConfigController.LoadOutputName(outputConfig, output, objectInput); _machine.MinutesUntilReady = producerRule.MinutesUntilReady; if (ProducerController.GetProducerConfig(_machine.Name) is ProducerConfig producerConfig) { _machine.showNextIndex.Value = producerConfig.AlternateFrameProducing; } _machine.initializeLightSource(_machine.TileLocation, false); producerRule.IncrementStatsOnInput.ForEach(s => StatsController.IncrementStardewStats(s, producerRule.InputStack)); inputConsumable.Take(); requiredFuels.ForEach(f => f.Reduce()); return(true); } } } } return(false); }
/// <summary> /// Makes the machine produce an appropriate output. /// Adapted from https://github.com/Digus/StardewValleyMods/blob/master/ProducerFrameworkMod/OutputConfigController.cs /// </summary> /// <param name="producerRule"></param> /// <param name="settings"></param> /// <param name="producer"></param> /// <param name="fuelSearch"></param> /// <param name="who"></param> /// <param name="location"></param> /// <param name="producerConfig"></param> /// <param name="input"></param> /// <param name="probe"></param> /// <param name="noSoundAndAnimation"></param> /// <returns>Base output config - no values altered for mass production machine</returns> public static OutputConfig ProduceOutput(ProducerRule producerRule, MPMSettings settings, SObject producer, Func <int, int, bool> fuelSearch, Farmer who, GameLocation location, ProducerConfig producerConfig = null, SObject input = null, int inputQuantity = 0, bool probe = false, bool noSoundAndAnimation = false, List <InputInfo> inputInfo = null) { if (who == null) { who = Game1.getFarmer((long)producer.owner); } if (inputInfo == null) { inputInfo = new List <InputInfo>(); } Vector2 tileLocation = producer.TileLocation; Random random = ProducerRuleController.GetRandomForProducing(tileLocation); OutputConfig outputConfig = OutputConfigController.ChooseOutput(producerRule.OutputConfigs, random, fuelSearch, location, input); if (outputConfig != null) { SObject output = producerRule.LookForInputWhenReady == null?OutputConfigController.CreateOutput(outputConfig, input, random) : new SObject(outputConfig.OutputIndex, 1); output.Stack = settings.CalculateOutputProduced(output.Stack, inputInfo.ToArray()); if (settings.Quality.HasValue) { if (settings.Quality == QualitySetting.KeepInput) { output.Quality = input.Quality; } else { output.Quality = settings.GetOutputQuality(); } } producer.heldObject.Value = output; if (!probe) { if (producerRule.LookForInputWhenReady == null) { OutputConfigController.LoadOutputName(outputConfig, producer.heldObject.Value, input, who); } //if (!noSoundAndAnimation) //{ // SoundUtil.PlaySound(producerRule.Sounds, location); // SoundUtil.PlayDelayedSound(producerRule.DelayedSounds, location); //} int minutesUntilReadyBase = outputConfig.MinutesUntilReady ?? producerRule.MinutesUntilReady; int minutesUntilReady = settings.CalculateTimeRequired(minutesUntilReadyBase, inputInfo.ToArray()); producer.minutesUntilReady.Value = minutesUntilReady; if (producerRule.SubtractTimeOfDay) { producer.minutesUntilReady.Value = Math.Max(producer.minutesUntilReady.Value - Game1.timeOfDay, 1); } if (producerConfig != null) { producer.showNextIndex.Value = producerConfig.AlternateFrameProducing; } //if (producerRule.PlacingAnimation.HasValue && !noSoundAndAnimation) //{ // AnimationController.DisplayAnimation(producerRule.PlacingAnimation.Value, // producerRule.PlacingAnimationColor, location, tileLocation, // new Vector2(producerRule.PlacingAnimationOffsetX, producerRule.PlacingAnimationOffsetY)); //} if (location.hasLightSource(LightSourceConfigController.GenerateIdentifier(tileLocation))) { location.removeLightSource(LightSourceConfigController.GenerateIdentifier(tileLocation)); } producer.initializeLightSource(tileLocation, false); int statsIncrement = inputQuantity; producerRule.IncrementStatsOnInput.ForEach(s => StatsController.IncrementStardewStats(s, statsIncrement)); } } return(outputConfig); }