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()); } } }
/// <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*/ } } } } }
/// <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); }
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); }
/// <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()); }
/// <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); }
/// <inheritdoc/> public bool Manual_PerformObjectDropInAction(SObject machine, SObject input, bool probe, Farmer who, MassProductionMachineDefinition mpm) { return(false); }
/// <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); }