public static bool LoadContentPack(IContentPack contentPack, EventArgs e) { string contentPackConfigJson = GetActualCaseForFileName(contentPack.DirectoryPath, ContentPackConfigJson); bool haveContentPackConfigFile = contentPackConfigJson != null; if (haveContentPackConfigFile) { ContentPackConfig contentPackConfig = contentPack.ReadJsonFile <ContentPackConfig>(contentPackConfigJson); ContentPackConfigController.AddConfig(contentPackConfig, contentPack.Manifest.UniqueID); } else { ProducerFrameworkModEntry.ModMonitor.Log($"Content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}\nIt does not have an {ContentPackConfigJson} file.", LogLevel.Trace); } string producersConfigJson = GetActualCaseForFileName(contentPack.DirectoryPath, ProducersConfigJson); bool haveProducersConfigFile = producersConfigJson != null; ProducerFrameworkModEntry.ModMonitor.Log($"Reading content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}"); if (haveProducersConfigFile) { List <ProducerConfig> producersConfigs = contentPack.ReadJsonFile <List <ProducerConfig> >(producersConfigJson); ProducerController.AddProducersConfig(producersConfigs, contentPack.Manifest.UniqueID); } else { ProducerFrameworkModEntry.ModMonitor.Log($"Content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}\nIt does not have an {ProducersConfigJson} file.", LogLevel.Trace); } if (e is SaveLoadedEventArgs) { string producerRulesJson = GetActualCaseForFileName(contentPack.DirectoryPath, ProducerRulesJson); bool haveProducerRulesFile = producerRulesJson != null; if (haveProducerRulesFile) { List <ProducerRule> producerItems = contentPack.ReadJsonFile <List <ProducerRule> >(producerRulesJson); ProducerController.AddProducerItems(producerItems, contentPack.Translation, contentPack.Manifest.UniqueID); } else { ProducerFrameworkModEntry.ModMonitor.Log($"Content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}\nIt does not have an {ProducerRulesJson} file.", LogLevel.Trace); } if (!haveProducerRulesFile && !haveProducersConfigFile) { ProducerFrameworkModEntry.ModMonitor.Log($"Ignoring content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}\nIt does not have any of the required files.", LogLevel.Warn); return(false); } } return(true); }
internal static bool minutesElapsedPrefix(Object __instance, ref int minutes, GameLocation environment, out bool __state) { __state = false; if (ProducerController.GetProducerConfig(__instance.Name) is ProducerConfig producerConfig) { if (!producerConfig.CheckWeatherCondition()) { return(false); } if (!producerConfig.CheckElapsedTimeCondition(ref minutes)) { return(false); } if (producerConfig.ProducerName == "Bee House" && producerConfig.WorkingOutdoors != true) { if (Game1.IsMasterGame) { __instance.minutesUntilReady.Value -= minutes; } if (__instance.minutesUntilReady.Value <= 0) { if (!__instance.readyForHarvest.Value) { environment.playSound("dwop", NetAudio.SoundContext.Default); } __instance.readyForHarvest.Value = true; __instance.minutesUntilReady.Value = 0; __instance.onReadyForHarvest(environment); __instance.showNextIndex.Value = true; if (__instance.lightSource != null) { environment.removeLightSource(__instance.lightSource.identifier.Value); __instance.lightSource = (LightSource)null; } } if (!__instance.readyForHarvest.Value && Game1.random.NextDouble() < 0.33) { __instance.addWorkingAnimation(environment); } return(false); } if (producerConfig.LightSource?.AlwaysOn == true && __instance.minutesUntilReady - minutes <= 0 && __instance.heldObject.Value != null && !__instance.readyForHarvest) { __state = true; } } return(true); }
internal static bool initializeLightSource(Object __instance, Vector2 tileLocation) { if (__instance.bigCraftable.Value) { if (ProducerController.GetProducerConfig(__instance.Name) is ProducerConfig producerConfig && producerConfig.LightSource is ContentPack.LightSourceConfig lightSourceConfig) { if (__instance.minutesUntilReady > 0 || lightSourceConfig.AlwaysOn) { LightSourceConfigController.CreateLightSource(__instance, tileLocation, lightSourceConfig); } return(false); } } return(true); }
internal static bool minutesElapsedPrefix(Object __instance, ref int minutes, GameLocation environment) { if (ProducerController.GetProducerConfig(__instance.Name) is ProducerConfig producerConfig) { if (!producerConfig.CheckWeatherCondition()) { return(false); } if (!producerConfig.CheckTimeCondition(ref minutes)) { return(false); } } return(true); }
public static void ClearProduction(Object producer, GameLocation location) { producer.heldObject.Value = (Object)null; producer.readyForHarvest.Value = false; producer.showNextIndex.Value = false; producer.minutesUntilReady.Value = -1; if (ProducerController.GetProducerConfig(producer.Name) is ProducerConfig producerConfig && producerConfig.LightSource?.AlwaysOn == true) { int identifier = LightSourceConfigController.GenerateIdentifier(producer.tileLocation); if (location.hasLightSource(identifier)) { location.removeLightSource(identifier); producer.initializeLightSource(producer.tileLocation); } } }
public static void PrepareOutput(Object producer, GameLocation location, Farmer who) { foreach (ProducerRule producerRule in ProducerController.GetProducerRules(producer.Name)) { if (producerRule.LookForInputWhenReady is InputSearchConfig inputSearchConfig) { if (producerRule.OutputConfigs.Find(o => o.OutputIndex == producer.heldObject.Value.ParentSheetIndex) is OutputConfig outputConfig) { Object input = ProducerRuleController.SearchInput(location, producer.tileLocation, inputSearchConfig); producer.heldObject.Value = OutputConfigController.CreateOutput(outputConfig, input, ProducerRuleController.GetRandomForProducing(producer.tileLocation)); OutputConfigController.LoadOutputName(outputConfig, producer.heldObject.Value, input, who); break; } } } }
internal static void checkForActionPostfix(Object __instance, Farmer who, bool justCheckingForActivity, bool __result, bool __state) { if (ProducerController.GetProducerConfig(__instance.Name) is ProducerConfig producerConfig && __instance.heldObject.Value == null) { if (__instance.MinutesUntilReady <= 0) { __instance.showNextIndex.Value = false; } if (!__state && !justCheckingForActivity && __result && producerConfig.LightSource?.AlwaysOn == true) { int identifier = LightSourceConfigController.GenerateIdentifier(__instance.tileLocation); if (who.currentLocation.hasLightSource(identifier)) { who.currentLocation.removeLightSource(identifier); __instance.initializeLightSource(__instance.tileLocation); } } } }
public static Vector2 getScale(Object __instance) { if (ProducerController.GetProducerConfig(__instance.Name) is ProducerConfig producerConfig && __instance.MinutesUntilReady > 0 && __instance.heldObject.Value != null) { if (producerConfig.DisableBouncingAnimationWhileWorking) { return(Vector2.Zero); } else if (!producerConfig.CheckLocationCondition(Game1.currentLocation)) { return(Vector2.Zero); } else if (!producerConfig.CheckSeasonCondition()) { return(Vector2.Zero); } else if (!producerConfig.CheckWeatherCondition()) { return(Vector2.Zero); } else if (producerConfig.WorkingTime != null) { if (producerConfig.WorkingTime.Begin <= producerConfig.WorkingTime.End) { if (Game1.timeOfDay < producerConfig.WorkingTime.Begin || Game1.timeOfDay >= producerConfig.WorkingTime.End) { return(Vector2.Zero); } } else { if (Game1.timeOfDay >= producerConfig.WorkingTime.End && Game1.timeOfDay < producerConfig.WorkingTime.Begin) { return(Vector2.Zero); } } } } return(__instance.getScale()); }
internal static bool minutesElapsedPrefix(Object __instance, ref int minutes, GameLocation environment, out bool __state) { __state = false; if (ProducerController.GetProducerConfig(__instance.Name) is ProducerConfig producerConfig) { if (!producerConfig.CheckWeatherCondition()) { return(false); } if (!producerConfig.CheckElapsedTimeCondition(ref minutes)) { return(false); } if (producerConfig.LightSource?.AlwaysOn == true && __instance.minutesUntilReady - minutes <= 0 && __instance.heldObject.Value != null && !__instance.readyForHarvest) { __state = true; } } return(true); }
public static bool DayUpdate(Object __instance, GameLocation location) { if (__instance.bigCraftable.Value) { if (ProducerController.GetProducerConfig(__instance.Name) is ProducerConfig producerConfig) { if (ProducerController.GetProducerItem(__instance.Name, null) is ProducerRule producerRule) { if (!producerConfig.CheckSeasonCondition() || !producerConfig.CheckLocationCondition(location)) { ProducerRuleController.ClearProduction(__instance); return(false); } else if (producerConfig.NoInputStartMode != null) { if (producerConfig.NoInputStartMode == NoInputStartMode.DayUpdate || (producerConfig.NoInputStartMode == NoInputStartMode.Placement)) { if (__instance.heldObject.Value == null) { try { Farmer who = Game1.getFarmer((long)__instance.owner); ProducerRuleController.ProduceOutput(producerRule, __instance, (i, q) => who.hasItemInInventory(i, q), who, who.currentLocation, producerConfig); } catch (RestrictionException) { //Does not show the restriction error since the machine is auto-starting. } } } return(false); } } } } return(true); }
public static void LoadContentPacks(object sender, EventArgs e) { foreach (IContentPack contentPack in Helper.ContentPacks.GetOwned()) { string producersConfigJson = GetActualCaseForFileName(contentPack.DirectoryPath, ProducersConfigJson); bool haveProducersConfigFile = producersConfigJson != null; if (haveProducersConfigFile) { ProducerFrameworkModEntry.ModMonitor.Log($"Reading content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}"); List <ProducerConfig> producersConfigs = contentPack.ReadJsonFile <List <ProducerConfig> >(producersConfigJson); ProducerController.AddProducersConfig(producersConfigs, contentPack.Manifest.UniqueID); } else { ProducerFrameworkModEntry.ModMonitor.Log($"Content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}\nIt does not have an {ProducersConfigJson} file.", LogLevel.Trace); } string producerRulesJson = GetActualCaseForFileName(contentPack.DirectoryPath, ProducerRulesJson); bool haveProducerRulesFile = producerRulesJson != null; if (haveProducerRulesFile) { ProducerFrameworkModEntry.ModMonitor.Log($"Reading content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}"); List <ProducerRule> producerItems = contentPack.ReadJsonFile <List <ProducerRule> >(producerRulesJson); ProducerController.AddProducerItems(producerItems, contentPack.Translation); } else { ProducerFrameworkModEntry.ModMonitor.Log($"Content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}\nIt does not have an {ProducerRulesJson} file.", LogLevel.Trace); } if (!haveProducerRulesFile && !haveProducersConfigFile) { ProducerFrameworkModEntry.ModMonitor.Log($"Ignoring content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}\nIt does not have any of the required files.", LogLevel.Warn); } } }
internal static bool PerformObjectDropInAction(Object __instance, Item dropInItem, bool probe, Farmer who, ref bool __result) { if (__instance.isTemporarilyInvisible || !(dropInItem is Object)) { return(false); } Object input = (Object)dropInItem; bool failLocationCondition = false; bool failSeasonCondition = false; if (__instance.heldObject.Value != null && !__instance.name.Equals("Crystalarium") || input.bigCraftable.Value) { return(true); } ProducerConfig producerConfig = ProducerController.GetProducerConfig(__instance.Name); GameLocation location = who.currentLocation; if (producerConfig != null) { if (!producerConfig.CheckLocationCondition(location)) { failLocationCondition = true; } if (!producerConfig.CheckSeasonCondition()) { failSeasonCondition = true; } if (producerConfig.NoInputStartMode != null) { return(false); } } if (ProducerController.GetProducerItem(__instance.name, input) is ProducerRule producerRule) { if (ProducerRuleController.IsInputExcluded(producerRule, input)) { return(true); } if (__instance.bigCraftable.Value && !probe && __instance.heldObject.Value == null) { __instance.scale.X = 5f; } try { if (failLocationCondition) { throw new RestrictionException(DataLoader.Helper.Translation.Get("Message.Condition.Location")); } if (failSeasonCondition) { throw new RestrictionException(DataLoader.Helper.Translation.Get("Message.Condition.Season")); } ProducerRuleController.ValidateIfInputStackLessThanRequired(producerRule, input); ProducerRuleController.ValidateIfAnyFuelStackLessThanRequired(producerRule, who); OutputConfig outputConfig = ProducerRuleController.ProduceOutput(producerRule, __instance, (i, q) => who.hasItemInInventory(i, q), who, location, producerConfig, input, probe); if (outputConfig != null) { if (!probe) { foreach (var fuel in producerRule.FuelList) { RemoveItemsFromInventory(who, fuel.Item1, fuel.Item2); } foreach (var fuel in outputConfig.FuelList) { RemoveItemsFromInventory(who, fuel.Item1, fuel.Item2); } input.Stack -= producerRule.InputStack; __result = input.Stack <= 0; } else { __result = true; } } } catch (RestrictionException e) { __result = false; if (e.Message != null && !probe && who.IsLocalPlayer) { Game1.showRedMessage(e.Message); } } return(false); } return(!failLocationCondition && !failSeasonCondition); }
internal static bool checkForActionPrefix(Object __instance, Farmer who, bool justCheckingForActivity, ref bool __result) { if (__instance.isTemporarilyInvisible || !__instance.readyForHarvest.Value || justCheckingForActivity) { return(true); } if (ProducerController.GetProducerConfig(__instance.Name) is ProducerConfig producerConfig) { if (producerConfig.NoInputStartMode != null || producerConfig.IncrementStatsOnOutput.Count > 0) { Object previousObject = __instance.heldObject.Value; if (who.isMoving()) { Game1.haltAfterCheck = false; } __instance.heldObject.Value = (Object)null; if (who.IsLocalPlayer) { if (!who.addItemToInventoryBool((Item)previousObject, false)) { __instance.heldObject.Value = previousObject; Game1.showRedMessage(Game1.content.LoadString("Strings\\StringsFromCSFiles:Crop.cs.588")); return(__result = false); } Game1.playSound("coin"); foreach (KeyValuePair <StardewStats, string> keyValuePair in producerConfig.IncrementStatsOnOutput) { if (keyValuePair.Value == null || keyValuePair.Value == previousObject.Name || keyValuePair.Value == previousObject.ParentSheetIndex.ToString() || keyValuePair.Value == previousObject.Category.ToString() || previousObject.HasContextTag(keyValuePair.Value)) { StatsController.IncrementStardewStats(keyValuePair.Key, previousObject.Stack); if (!producerConfig.MultipleStatsIncrement) { break; } } } } __instance.readyForHarvest.Value = false; __instance.showNextIndex.Value = false; __result = true; if (producerConfig.NoInputStartMode == NoInputStartMode.Placement) { if (ProducerController.GetProducerItem(__instance.Name, null) is ProducerRule producerRule) { try { if (!producerConfig.CheckLocationCondition(who.currentLocation)) { throw new RestrictionException(DataLoader.Helper.Translation.Get("Message.Condition.Location")); } else if (producerConfig.CheckSeasonCondition()) { __result = ProducerRuleController.ProduceOutput(producerRule, __instance, (i, q) => who.hasItemInInventory(i, q), who, who.currentLocation, producerConfig) != null; } } catch (RestrictionException e) { __result = false; if (e.Message != null && who.IsLocalPlayer) { Game1.showRedMessage(e.Message); } } } } return(false); } } return(true); }
internal static bool PerformObjectDropInAction(Object __instance, Item dropInItem, bool probe, Farmer who, ref bool __result) { if (__instance.isTemporarilyInvisible || !(dropInItem is Object)) { return(false); } Object input = (Object)dropInItem; if (ProducerController.GetProducerItem(__instance.name, input) is ProducerRule producerRule) { if (__instance.heldObject.Value != null && !__instance.name.Equals("Crystalarium") || (bool)((NetFieldBase <bool, NetBool>)input.bigCraftable)) { return(true); } if (ProducerRuleController.IsInputExcluded(producerRule, input)) { return(true); } if ((bool)((NetFieldBase <bool, NetBool>)__instance.bigCraftable) && !probe && (__instance.heldObject.Value == null)) { __instance.scale.X = 5f; } bool shouldDisplayMessages = !probe && who.IsLocalPlayer; if (ProducerRuleController.IsInputStackLessThanRequired(producerRule, input, shouldDisplayMessages)) { return(false); } if (ProducerRuleController.IsAnyFuelStackLessThanRequired(producerRule, who, shouldDisplayMessages)) { return(false); } Vector2 tileLocation = __instance.tileLocation.Value; Random random = ProducerRuleController.GetRandomForProducing(tileLocation); OutputConfig outputConfig = OutputConfigController.ChooseOutput(producerRule.OutputConfigs, random); Object output = OutputConfigController.CreateOutput(outputConfig, input, random); __instance.heldObject.Value = output; if (!probe) { OutputConfigController.LoadOutputName(outputConfig, __instance.heldObject.Value, input, who); GameLocation currentLocation = who.currentLocation; PlaySound(producerRule.Sounds, currentLocation); PlayDelayedSound(producerRule.DelayedSounds, currentLocation); __instance.minutesUntilReady.Value = producerRule.MinutesUntilReady; if (ProducerController.GetProducerConfig(__instance.Name) is ProducerConfig producerConfig) { __instance.showNextIndex.Value = producerConfig.AlternateFrameProducing; } if (producerRule.PlacingAnimation.HasValue) { AnimationController.DisplayAnimation(producerRule.PlacingAnimation.Value, producerRule.PlacingAnimationColor, currentLocation, tileLocation, new Vector2(producerRule.PlacingAnimationOffsetX, producerRule.PlacingAnimationOffsetY)); } __instance.initializeLightSource(tileLocation, false); foreach (var fuel in producerRule.FuelList) { RemoveItemsFromInventory(who, fuel.Item1, fuel.Item2); } producerRule.IncrementStatsOnInput.ForEach(s => StatsController.IncrementStardewStats(s, producerRule.InputStack)); input.Stack -= producerRule.InputStack; __result = input.Stack <= 0; } else { __result = true; } return(false); } return(true); }