public static void LoadContentPacksCommand(string command = null, string[] args = null)
        {
            Dictionary <int, string> objects = DataLoader.Helper.Content.Load <Dictionary <int, string> >("Data\\ObjectInformation", ContentSource.GameContent);

            foreach (IContentPack contentPack in Helper.ContentPacks.GetOwned())
            {
                if (File.Exists(Path.Combine(contentPack.DirectoryPath, ClonersDataJson)))
                {
                    CustomCrystalariumModEntry.ModMonitor.Log($"Reading content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}");
                    List <CustomCloner> clonerData = contentPack.ReadJsonFile <List <CustomCloner> >(ClonersDataJson);
                    foreach (var cloner in clonerData)
                    {
                        if (String.IsNullOrEmpty(cloner.Name))
                        {
                            CustomCrystalariumModEntry.ModMonitor.Log($"The cloner name property can't be null or empty. This cloner will be ignored.", LogLevel.Warn);
                        }
                        if (cloner.Name == "Crystalarium")
                        {
                            cloner.CloningData.ToList().ForEach(d =>
                            {
                                int?id = GetId(d.Key, objects);
                                if (id.HasValue && !CrystalariumDataId.ContainsKey(id.Value))
                                {
                                    CrystalariumDataId[id.Value] = d.Value;
                                    CustomCrystalariumModEntry.ModMonitor.Log($"Adding crystalarium data for item '{d.Key}' from mod '{contentPack.Manifest.UniqueID}'.", LogLevel.Trace);
                                }
                            });
                        }
                        else
                        {
                            cloner.ModUniqueID = contentPack.Manifest.UniqueID;
                            if (ClonerController.GetCloner(cloner.Name) is CustomCloner currentCloner)
                            {
                                if (currentCloner.ModUniqueID != cloner.ModUniqueID)
                                {
                                    CustomCrystalariumModEntry.ModMonitor.Log($"Both mods '{currentCloner.ModUniqueID}' and '{cloner.ModUniqueID}' have data for  '{cloner.Name}'. You should report the problem to these mod's authors. Data from mod '{currentCloner.ModUniqueID}' will be used.", LogLevel.Warn);
                                    continue;
                                }
                            }
                            cloner.CloningData.ToList().ForEach(d =>
                            {
                                int?id = GetId(d.Key, objects);
                                if (id.HasValue)
                                {
                                    cloner.CloningDataId[id.Value] = d.Value;
                                }
                            });
                            ClonerController.SetCloner(cloner);
                        }
                    }
                }
                else
                {
                    CustomCrystalariumModEntry.ModMonitor.Log($"Ignoring content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}\nIt does not have an CaskData.json file.", LogLevel.Warn);
                }
            }
        }
 public static void CheckForAction_postfix(ref Object __instance, Object __state, bool justCheckingForActivity)
 {
     if (ClonerController.GetCloner(__instance.Name) is CustomCloner cloner && __instance.Name != "Crystalarium" && __state != null && !justCheckingForActivity)
     {
         __instance.MinutesUntilReady = ClonerController.GetMinutesUntilReady(cloner, __state) ?? __instance.MinutesUntilReady;
         if (__instance.MinutesUntilReady != 0)
         {
             __instance.heldObject.Value = (Object)__state.getOne();
             __instance.initializeLightSource(__instance.TileLocation, false);
         }
     }
 }
 public static bool PerformRemoveAction(ref Object __instance, ref Vector2 tileLocation)
 {
     if (__instance.Name == "Crystalarium")
     {
         if (DataLoader.ModConfig.GetObjectBackOnChange && !DataLoader.ModConfig.GetObjectBackImmediately)
         {
             if (__instance.heldObject.Value != null)
             {
                 Game1.createItemDebris(__instance.heldObject.Value.getOne(), tileLocation * 64f, (Game1.player.FacingDirection + 2) % 4, (GameLocation)null, -1);
             }
         }
     }
     else if (ClonerController.GetCloner(__instance.Name) is CustomCloner cloner)
     {
         if (DataLoader.ModConfig.OverrideContentPackGetObjectProperties ? DataLoader.ModConfig.GetObjectBackOnChange && !DataLoader.ModConfig.GetObjectBackImmediately : cloner.GetObjectBackOnChange && !cloner.GetObjectBackImmediately)
         {
             if (__instance.heldObject.Value != null)
             {
                 Game1.createItemDebris(__instance.heldObject.Value.getOne(), tileLocation * 64f, (Game1.player.FacingDirection + 2) % 4, (GameLocation)null, -1);
             }
         }
     }
     return(true);
 }
        public static bool PerformObjectDropInAction(ref Object __instance, ref Item dropInItem, ref bool probe, ref Farmer who, ref bool __result)
        {
            if (dropInItem is Object object1)
            {
                if (!(__instance.heldObject.Value != null && !__instance.Name.Equals("Recycling Machine") &&
                      !__instance.Name.Equals("Crystalarium") && !ClonerController.HasCloner(__instance.Name) || object1 != null && (bool)(object1.bigCraftable.Value)))
                {
                    if (__instance.Name.Equals("Crystalarium") || ClonerController.HasCloner(__instance.Name))
                    {
                        if ((__instance.heldObject.Value == null || __instance.heldObject.Value.ParentSheetIndex != object1.ParentSheetIndex) &&
                            (__instance.heldObject.Value == null || __instance.MinutesUntilReady > 0))
                        {
                            int minutesUntilReady = 0;

                            Item currentObject = __instance.heldObject.Value;

                            if (__instance.Name.Equals("Crystalarium"))
                            {
                                if (DataLoader.CrystalariumDataId.ContainsKey(object1.ParentSheetIndex))
                                {
                                    minutesUntilReady = DataLoader.CrystalariumDataId[object1.ParentSheetIndex];
                                }
                                else if (DataLoader.CrystalariumDataId.ContainsKey(object1.Category))
                                {
                                    minutesUntilReady = DataLoader.CrystalariumDataId[object1.Category];
                                }
                                else if ((object1.Category == -2 || object1.Category == -12) && object1.ParentSheetIndex != 74)
                                {
                                    minutesUntilReady = DataLoader.Helper.Reflection.GetMethod(__instance, "getMinutesForCrystalarium").Invoke <int>(object1.ParentSheetIndex);
                                }
                                else
                                {
                                    return(true);
                                }
                            }
                            else if (ClonerController.GetCloner(__instance.Name) is CustomCloner cloner)
                            {
                                if (cloner.UsePfmForInput)
                                {
                                    return(true);
                                }
                                var clonerMinutes = ClonerController.GetMinutesUntilReady(cloner, object1);
                                if (clonerMinutes.HasValue)
                                {
                                    minutesUntilReady = clonerMinutes.Value;
                                }
                                else
                                {
                                    return(true);
                                }
                            }
                            if (__instance.bigCraftable.Value && !probe &&
                                (object1 != null && __instance.heldObject.Value == null))
                            {
                                __instance.scale.X = 5f;
                            }
                            __instance.heldObject.Value = (Object)object1.getOne();
                            if (!probe)
                            {
                                who.currentLocation.playSound("select");
                                __instance.MinutesUntilReady = minutesUntilReady;
                                if (__instance.Name.Equals("Crystalarium") || DataLoader.ModConfig.OverrideContentPackGetObjectProperties ? DataLoader.ModConfig.GetObjectBackImmediately : ClonerController.GetCloner(__instance.Name).GetObjectBackImmediately)
                                {
                                    __instance.MinutesUntilReady = 0;
                                    __instance.minutesElapsed(0, who.currentLocation);
                                }
                                else if (currentObject != null && (__instance.Name.Equals("Crystalarium") || DataLoader.ModConfig.OverrideContentPackGetObjectProperties ? DataLoader.ModConfig.GetObjectBackOnChange : ClonerController.GetCloner(__instance.Name).GetObjectBackOnChange))
                                {
                                    who.addItemByMenuIfNecessary(currentObject.getOne());
                                }
                                __instance.initializeLightSource(__instance.TileLocation, false);
                            }
                            __result = true;
                            return(false);
                        }
                    }
                }
            }
            return(true);
        }