public static OutputConfig ProduceOutput(ProducerRule producerRule, Object producer, Func <int, int, bool> fuelSearch, Farmer who, GameLocation location , ProducerConfig producerConfig = null, Object input = null , bool probe = false, bool noSoundAndAnimation = false) { if (who == null) { who = Game1.getFarmer((long)producer.owner); } Vector2 tileLocation = producer.TileLocation; Random random = ProducerRuleController.GetRandomForProducing(tileLocation); OutputConfig outputConfig = OutputConfigController.ChooseOutput(producerRule.OutputConfigs, random, fuelSearch, location, input); if (outputConfig != null) { Object output = producerRule.LookForInputWhenReady == null?OutputConfigController.CreateOutput(outputConfig, input, random) : new Object(outputConfig.OutputIndex, 1); 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); } producer.minutesUntilReady.Value = outputConfig.MinutesUntilReady ?? producerRule.MinutesUntilReady; if (producerRule.SubtractTimeOfDay) { producer.minutesUntilReady.Value = Math.Max(producer.minutesUntilReady.Value - Utility.ConvertTimeToMinutes(Game1.timeOfDay) + 360, 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); producerRule.IncrementStatsOnInput.ForEach(s => StatsController.IncrementStardewStats(s, producerRule.InputStack)); } } return(outputConfig); }