public bool SetInput(IStorage input)
        {
            if (OverridingMachine.SetInput(input))
            {
                return(true);
            }
            else
            {
                MassProductionMachineDefinition mpm = ModEntry.GetMPMMachine(OriginalMachineObject.name, OriginalMachineObject.GetMassProducerKey());

                if (mpm != null)
                {
                    //Check for special overriding logic, if any is required
                    string originalClassName = OriginalMachine.GetType().FullName;

                    if (VanillaOverrideList.GetFor(originalClassName) != null)
                    {
                        IVanillaOverride vanillaOverride = VanillaOverrideList.GetFor(originalClassName);

                        return(vanillaOverride.Automate_SetInput(input, mpm, OriginalMachine, OriginalMachineObject));
                    }
                    else
                    {
                        return(false);
                    }
                }
                else
                {
                    return(OriginalMachine.SetInput(input));
                }
            }
        }
        public ITrackedStack GetOutput()
        {
            ITrackedStack overrideOutput = OverridingMachine.GetOutput();

            if (overrideOutput != null)
            {
                return(overrideOutput);
            }
            else
            {
                MassProductionMachineDefinition mpm = ModEntry.GetMPMMachine(OriginalMachineObject.name, OriginalMachineObject.GetMassProducerKey());

                if (mpm != null)
                {
                    // Check for special overriding logic, if any is required
                    string originalClassName = OriginalMachine.GetType().FullName;

                    if (VanillaOverrideList.GetFor(originalClassName) != null)
                    {
                        IVanillaOverride vanillaOverride = VanillaOverrideList.GetFor(originalClassName);
                        overrideOutput = vanillaOverride.Automate_GetOutput(mpm, OriginalMachine, OriginalMachineObject);

                        return(overrideOutput);
                    }
                    else
                    {
                        return(null);
                    }
                }
                else
                {
                    return(OriginalMachine.GetOutput());
                }
            }
        }
예제 #3
0
        /// <summary>
        /// Adapted from https://github.com/Digus/StardewValleyMods/blob/master/PFMAutomate/Automate/CustomProducerMachine.cs
        /// </summary>
        /// <param name="item"></param>
        internal void Reset(Item item)
        {
            PFMCompatability.ClearProduction(Machine, Location);
            MassProductionMachineDefinition mpm = null;
            ProducerConfig producerConfig;

            if (IsMassProducer)
            {
                mpm            = ModEntry.GetMPMMachine(Machine.name, Machine.GetMassProducerKey());
                producerConfig = ProducerController.GetProducerConfig(mpm.BaseProducerName);
            }
            else
            {
                producerConfig = ProducerController.GetProducerConfig(Machine.name);
            }

            if (producerConfig == null)
            {
                return;
            }
            else if (producerConfig.NoInputStartMode != null || producerConfig.IncrementStatsOnOutput.Count > 0)
            {
                producerConfig.IncrementStats(item);
                if (producerConfig.NoInputStartMode == NoInputStartMode.Placement)
                {
                    if (ProducerController.GetProducerItem(Machine.Name, null) is ProducerRule producerRule)
                    {
                        try
                        {
                            if (producerConfig.CheckLocationCondition(Location) && producerConfig.CheckSeasonCondition())
                            {
                                if (mpm != null)
                                {
                                    PFMCompatability.ProduceOutput(producerRule, mpm.Settings, Machine, (i, q) => true, null, Location, producerConfig);
                                }
                                else
                                {
                                    ProducerRuleController.ProduceOutput(producerRule, Machine, (i, q) => true, null, Location, producerConfig);
                                }
                            }
                        }
                        catch (RestrictionException) { /*No action needed*/ }
                    }
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Gets the current configuration of the machine.
        /// </summary>
        /// <param name="mpm"></param>
        /// <returns></returns>
        private ProducerConfig GetCurrentConfig(out MassProductionMachineDefinition mpm)
        {
            mpm = null;
            ProducerConfig producerConfig;

            if (IsMassProducer)
            {
                mpm            = ModEntry.GetMPMMachine(Machine.name, Machine.GetMassProducerKey());
                producerConfig = ProducerController.GetProducerConfig(mpm.BaseProducerName);
            }
            else
            {
                producerConfig = ProducerController.GetProducerConfig(Machine.name);
            }

            return(producerConfig);
        }
예제 #5
0
        public bool Manual_PerformDropDownAction(SObject machine, MassProductionMachineDefinition mpm)
        {
            if (mpm != null)
            {
                int baitID           = 685;
                int quantityProduced = mpm.Settings.CalculateOutputProduced(Game1.random.Next(2, 6));
                int timeRequired     = mpm.Settings.CalculateTimeRequired(2600 - Game1.timeOfDay);

                machine.heldObject.Value      = new SObject(baitID, quantityProduced);
                machine.MinutesUntilReady     = timeRequired;
                machine.readyForHarvest.Value = false;
                machine.showNextIndex.Value   = false;

                return(true);
            }

            return(false);
        }
예제 #6
0
        /// <inheritdoc/>
        public ITrackedStack Automate_GetOutput(MassProductionMachineDefinition mpm, IMachine originalMachine, SObject originalMachineObject)
        {
            if (mpm != null)
            {
                int baitID           = 685;
                int quantityProduced = mpm.Settings.CalculateOutputProduced(Game1.random.Next(2, 6));
                int timeRequired     = mpm.Settings.CalculateTimeRequired(2600 - Game1.timeOfDay);

                return(new TrackedItem(originalMachineObject.heldObject.Value, item =>
                {
                    originalMachineObject.heldObject.Value = new SObject(baitID, quantityProduced);
                    originalMachineObject.MinutesUntilReady = timeRequired;
                    originalMachineObject.readyForHarvest.Value = false;
                    originalMachineObject.showNextIndex.Value = false;
                }));
            }

            return(originalMachine.GetOutput());
        }
예제 #7
0
        /// <summary>
        /// Adapted from https://github.com/Digus/StardewValleyMods/blob/master/PFMAutomate/Automate/CustomProducerMachine.cs
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public bool SetInput(IStorage input)
        {
            if (IsMassProducer)
            {
                MassProductionMachineDefinition mpm = ModEntry.GetMPMMachine(Machine.name, Machine.GetMassProducerKey());

                foreach (ITrackedStack trackedStack in input.GetItems())
                {
                    if (trackedStack.Sample is SObject objectInput && !objectInput.bigCraftable.Value &&
                        ProducerController.GetProducerItem(Machine.Name, objectInput) is ProducerRule producerRule &&
                        !PFMCompatability.IsInputExcluded(producerRule, mpm, objectInput))
                    {
                        ProducerConfig producerConfig = mpm.GetBaseProducerConfig();

                        if (producerConfig == null || (producerConfig.CheckLocationCondition(Location) && producerConfig.CheckSeasonCondition()))
                        {
                            List <InputInfo> inputsRequired = InputInfo.ConvertPFMInputs(producerRule, objectInput);

                            if (inputsRequired.Count > 0 &&
                                input.TryGetIngredient(objectInput.ParentSheetIndex, mpm.Settings.CalculateInputRequired(inputsRequired.First()), out IConsumable inputConsumable))
                            {
                                objectInput = inputConsumable.Sample as SObject;
                                List <IConsumable> requiredFuels = GetRequiredFuels(inputsRequired, mpm.Settings, input);

                                if (requiredFuels != null)
                                {
                                    try
                                    {
                                        Dictionary <int, int> fuelQuantities = new Dictionary <int, int>();

                                        foreach (InputInfo inputInfo in inputsRequired)
                                        {
                                            if (inputInfo.IsFuel)
                                            {
                                                fuelQuantities.Add(inputInfo.ID, mpm.Settings.CalculateInputRequired(inputInfo));
                                            }
                                        }

                                        Func <int, int, bool> fuelSearch   = (i, q) => input.TryGetIngredient(i, fuelQuantities[i], out IConsumable fuel);
                                        OutputConfig          outputConfig = PFMCompatability.ProduceOutput(producerRule, mpm.Settings, Machine, fuelSearch, null, Location, producerConfig,
                                                                                                            objectInput, inputQuantity: mpm.Settings.CalculateInputRequired(inputsRequired.First()), noSoundAndAnimation: true,
                                                                                                            inputInfo: inputsRequired);

                                        if (outputConfig != null)
                                        {
                                            inputConsumable.Take();
                                            requiredFuels.ForEach(f => f.Reduce());
                                            List <IConsumable> outputRequiredFuels = GetRequiredFuels(InputInfo.ConvertPFMInputs(outputConfig), mpm.Settings, input);
                                            outputRequiredFuels.ForEach(f => f.Reduce());
                                            return(true);
                                        }
                                    }
                                    catch (RestrictionException) { /* No action needed */ }
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                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))
                    {
                        ProducerConfig producerConfig = ProducerController.GetProducerConfig(Machine.name);

                        if (producerConfig == null || (producerConfig.CheckLocationCondition(Location) && producerConfig.CheckSeasonCondition()))
                        {
                            if (input.TryGetIngredient(objectInput.ParentSheetIndex, producerRule.InputStack, out IConsumable inputConsumable))
                            {
                                objectInput = inputConsumable.Sample as SObject;
                                List <IConsumable> requiredFuels = GetRequiredFuels(InputInfo.ConvertPFMInputs(producerRule, objectInput), null, input);

                                if (requiredFuels != null)
                                {
                                    try
                                    {
                                        Func <int, int, bool> fuelSearch   = (i, q) => input.TryGetIngredient(i, q, out IConsumable fuel);
                                        OutputConfig          outputConfig = ProducerRuleController.ProduceOutput(producerRule, Machine, fuelSearch, null, Location, producerConfig,
                                                                                                                  objectInput, noSoundAndAnimation: true);

                                        if (outputConfig != null)
                                        {
                                            inputConsumable.Take();
                                            requiredFuels.ForEach(f => f.Reduce());
                                            List <IConsumable> outputRequiredFuels = GetRequiredFuels(InputInfo.ConvertPFMInputs(outputConfig), null, input);
                                            outputRequiredFuels.ForEach(f => f.Reduce());
                                            return(true);
                                        }
                                    }
                                    catch (RestrictionException) { /* No action needed */ }
                                }
                            }
                        }
                    }
                }
            }

            return(false);
        }
예제 #8
0
 /// <inheritdoc/>
 public bool Manual_PerformObjectDropInAction(SObject machine, SObject input, bool probe, Farmer who, MassProductionMachineDefinition mpm)
 {
     return(false);
 }
예제 #9
0
 /// <inheritdoc/>
 public bool Automate_SetInput(IStorage input, MassProductionMachineDefinition mpm, IMachine originalMachine, SObject originalMachineObject)
 {
     return(false);
 }
        /// <inheritdoc/>
        public bool Automate_SetInput(IStorage input, MassProductionMachineDefinition mpm, IMachine originalMachine, SObject originalMachineObject)
        {
            if (mpm != null)
            {
                try
                {
                    ITrackedStack crop          = null;
                    InputInfo     cropInfo      = null;
                    int           inputQuantity = 0;

                    foreach (ITrackedStack item in input.GetItems())
                    {
                        if (IsValidCrop(item))
                        {
                            InputInfo inputInfo = new InputInfo()
                            {
                                ID           = item.Sample.ParentSheetIndex,
                                Name         = item.Sample.Name,
                                Quality      = 0,
                                IsFuel       = false,
                                BaseQuantity = 1
                            };

                            if (item.Sample is SObject obj)
                            {
                                inputInfo.Quality = obj.Quality;
                            }

                            inputQuantity = mpm.Settings.CalculateInputRequired(inputInfo);

                            if (item.Count >= inputQuantity)
                            {
                                crop     = item;
                                cropInfo = inputInfo;
                                break;
                            }
                        }
                    }

                    if (crop != null)
                    {
                        crop.Reduce(inputQuantity);
                        int seedID = SEED_LOOKUP[crop.Sample.ParentSheetIndex];

                        Random random = new Random((int)Game1.stats.DaysPlayed +
                                                   (int)Game1.uniqueIDForThisGame / 2 + (int)originalMachineObject.TileLocation.X + (int)originalMachineObject.TileLocation.Y * 77 + Game1.timeOfDay);
                        int outputID       = seedID;
                        int outputQuantity = mpm.Settings.CalculateOutputProduced(random.Next(1, 4), cropInfo);

                        if (random.NextDouble() < 0.005)
                        {
                            outputID       = 499;
                            outputQuantity = mpm.Settings.CalculateOutputProduced(1, cropInfo);
                        }
                        else if (random.NextDouble() < 0.02)
                        {
                            outputID       = 770;
                            outputQuantity = mpm.Settings.CalculateOutputProduced(random.Next(1, 5), cropInfo);
                        }

                        originalMachineObject.heldObject.Value  = new SObject(outputID, outputQuantity);
                        originalMachineObject.MinutesUntilReady = mpm.Settings.CalculateTimeRequired(20);

                        return(true);
                    }
                }
                catch (Exception e)
                {
                    ModEntry.Instance.Monitor.Log($"{e}", StardewModdingAPI.LogLevel.Error);
                }
            }
            else
            {
                return(originalMachine.SetInput(input));
            }

            return(false);
        }
 /// <inheritdoc/>
 public bool Manual_PerformDropDownAction(SObject machine, MassProductionMachineDefinition mpm)
 {
     return(false);
 }
 /// <inheritdoc/>
 public ITrackedStack Automate_GetOutput(MassProductionMachineDefinition mpm, IMachine originalMachine, SObject originalMachineObject)
 {
     return(null);
 }
        /// <inheritdoc/>
        public bool Manual_PerformObjectDropInAction(SObject machine, SObject input, bool probe, Farmer who, MassProductionMachineDefinition mpm)
        {
            if (!probe && mpm != null)
            {
                try
                {
                    InputInfo inputInfo     = InputInfo.ConvertInput(input, 1);
                    int       inputQuantity = mpm.Settings.CalculateInputRequired(inputInfo);

                    if (IsValidCrop(input) && input.Stack >= inputQuantity)
                    {
                        input.Stack -= inputQuantity;

                        int seedID = SEED_LOOKUP[input.ParentSheetIndex];

                        Random random = new Random((int)Game1.stats.DaysPlayed +
                                                   (int)Game1.uniqueIDForThisGame / 2 + (int)machine.TileLocation.X + (int)machine.TileLocation.Y * 77 + Game1.timeOfDay);
                        int outputID       = seedID;
                        int outputQuantity = mpm.Settings.CalculateOutputProduced(random.Next(1, 4), inputInfo);

                        if (random.NextDouble() < 0.005)
                        {
                            outputID       = 499;
                            outputQuantity = mpm.Settings.CalculateOutputProduced(1, inputInfo);
                        }
                        else if (random.NextDouble() < 0.02)
                        {
                            outputID       = 770;
                            outputQuantity = mpm.Settings.CalculateOutputProduced(random.Next(1, 5), inputInfo);
                        }

                        machine.heldObject.Value  = new SObject(outputID, outputQuantity);
                        machine.MinutesUntilReady = mpm.Settings.CalculateTimeRequired(20);

                        return(true);
                    }
                }
                catch (Exception e)
                {
                    ModEntry.Instance.Monitor.Log($"{e}", StardewModdingAPI.LogLevel.Error);
                }
            }

            return(false);
        }