Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of PlantEverything v1.20.0
Advize_PlantEverything.dll
Decompiled 6 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using ServerSync; using SoftReferenceableAssets; using TMPro; using UnityEngine; [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyFileVersion("1.20.0.0")] [assembly: Guid("85f3bb36-d51d-4e6c-a523-feb593b3156f")] [assembly: ComVisible(false)] [assembly: AssemblyTrademark("")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyProduct("Valheim Game Modification")] [assembly: AssemblyCompany("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyDescription("")] [assembly: AssemblyTitle("Advize_PlantEverything")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.20.0.0")] [module: <61d5a0c8-7033-4c14-9538-d7c2ea223f4e>RefSafetyRules(11)] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<84adf9e7-029e-45be-a120-84c13b7de805>Embedded] internal sealed class <84adf9e7-029e-45be-a120-84c13b7de805>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] [CompilerGenerated] [<84adf9e7-029e-45be-a120-84c13b7de805>Embedded] internal sealed class <b6194257-56e0-4089-8df8-6802074f0169>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <b6194257-56e0-4089-8df8-6802074f0169>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <b6194257-56e0-4089-8df8-6802074f0169>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] [<84adf9e7-029e-45be-a120-84c13b7de805>Embedded] [CompilerGenerated] internal sealed class <bf8dd59c-bead-48b7-8dff-298aa7098003>NullableContextAttribute : Attribute { public readonly byte Flag; public <bf8dd59c-bead-48b7-8dff-298aa7098003>NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] [<84adf9e7-029e-45be-a120-84c13b7de805>Embedded] internal sealed class <61d5a0c8-7033-4c14-9538-d7c2ea223f4e>RefSafetyRulesAttribute : Attribute { public readonly int Version; public <61d5a0c8-7033-4c14-9538-d7c2ea223f4e>RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } internal class ConfigurationManagerAttributes { public bool? Browsable; [<b6194257-56e0-4089-8df8-6802074f0169>Nullable(2)] public string Category; public int? Order; public bool? ReadOnly; } namespace Advize_PlantEverything { public static class SeasonsCompatibility { private static bool _isInitialized; private static bool _isReady; private const string GUID = "shudnal.Seasons"; private static Assembly _assembly; private static FieldInfo _seasonState; private static MethodInfo _getSecondsToRespawnPickable; private static MethodInfo _getSecondsToGrowPlant; public static bool IsReady { get { if (!_isInitialized) { Initialize(); } return _isReady; } } public static double GetSecondsToRespawnPickable(Pickable pickable) { return (double)_getSecondsToRespawnPickable.Invoke(_seasonState.GetValue(_seasonState), new object[1] { pickable }); } public static double GetSecondsToGrowPlant(Plant plant) { return (double)_getSecondsToGrowPlant.Invoke(_seasonState.GetValue(_seasonState), new object[1] { plant }); } private static void Initialize() { _isInitialized = true; if (Chainloader.PluginInfos.TryGetValue("shudnal.Seasons", out var value)) { _assembly = Assembly.GetAssembly(((object)value.Instance).GetType()); if (_assembly != null) { _seasonState = AccessTools.Field(_assembly.GetType("Seasons.Seasons"), "seasonState"); _getSecondsToRespawnPickable = AccessTools.Method(_seasonState.FieldType, "GetSecondsToRespawnPickable", (Type[])null, (Type[])null); _getSecondsToGrowPlant = AccessTools.Method(_seasonState.FieldType, "GetSecondsToGrowPlant", (Type[])null, (Type[])null); } } _isReady = _seasonState != null && _getSecondsToRespawnPickable != null && _getSecondsToGrowPlant != null; } } internal static class ConfigEventHandlers { private static bool s_reInitQueueInProcess = false; private static bool s_isLocalConfigChange = false; private static bool s_configSettingChangedFirst = false; private static bool s_configFileChangedFirst = false; private static readonly HashSet<Action> s_reInitMethodSet = new HashSet<Action>(); private static readonly Queue<Action> s_reInitMethodQueue = new Queue<Action>(); private static readonly Dictionary<string, Action[]> s_initMethods = new Dictionary<string, Action[]> { { "Core", new Action[7] { PluginInitUtils.InitPieceRefs, PluginInitUtils.InitPieces, PluginInitUtils.InitSaplingRefs, PluginInitUtils.InitSaplings, PluginInitUtils.InitCrops, PluginInitUtils.InitVines, PluginInitUtils.InitCultivator } }, { "Piece", new Action[3] { PluginInitUtils.InitPieceRefs, PluginInitUtils.InitPieces, PluginInitUtils.InitCultivator } }, { "Sapling", new Action[3] { PluginInitUtils.InitSaplingRefs, PluginInitUtils.InitSaplings, PluginInitUtils.InitCultivator } }, { "Seed", new Action[1] { PluginInitUtils.ModifyTreeDrops } }, { "Crop", new Action[1] { PluginInitUtils.InitCrops } }, { "Vine", new Action[1] { PluginInitUtils.InitVines } } }; private static bool PerformingLocalConfigChange { get { return s_isLocalConfigChange; } set { StaticMembers.Dbgl("Config change " + (value ? "is" : "was") + " local.", forceLog: false, (LogLevel)16); s_isLocalConfigChange = value; } } private static bool ShouldQueueMethod { get { if (!StaticMembers.isDedicatedServer && !StaticMembers.config.IsSourceOfTruth) { return !PerformingLocalConfigChange; } return false; } } private static void QueueReInitMethod(Action method) { if (!s_reInitQueueInProcess) { StaticMembers.Dbgl("Beginning method queue.", forceLog: false, (LogLevel)16); s_reInitQueueInProcess = true; } if (s_reInitMethodSet.Add(method)) { StaticMembers.Dbgl("Adding method to queue.", forceLog: false, (LogLevel)16); s_reInitMethodQueue.Enqueue(method); } } internal static void ProcessReInitQueue() { StaticMembers.Dbgl("Processing ReInit queue.", forceLog: false, (LogLevel)16); if (s_reInitMethodQueue.Count == 0 && !StaticMembers.isDedicatedServer && !StaticMembers.config.IsSourceOfTruth && StaticMembers.config.InitialSyncDone) { PerformingLocalConfigChange = true; return; } while (s_reInitMethodQueue.Count > 0) { s_reInitMethodQueue.Dequeue()(); } s_reInitMethodSet.Clear(); s_reInitQueueInProcess = false; } private static void HandleSettingChange(string category) { if (ShouldQueueMethod) { Array.ForEach(s_initMethods[category], QueueReInitMethod); return; } Array.ForEach(s_initMethods[category], delegate(Action initMethod) { initMethod(); }); PerformingLocalConfigChange = false; } internal static void CoreSettingChanged(object o, EventArgs e) { StaticMembers.Dbgl("Config setting changed, scheduling re-initialization of mod", forceLog: false, (LogLevel)16); HandleSettingChange("Core"); } internal static void PieceSettingChanged(object o, EventArgs e) { StaticMembers.Dbgl("Config setting changed, scheduling re-initialization of pieces", forceLog: false, (LogLevel)16); HandleSettingChange("Piece"); } internal static void SaplingSettingChanged(object o, EventArgs e) { StaticMembers.Dbgl("Config setting changed, scheduling re-initialization of saplings", forceLog: false, (LogLevel)16); HandleSettingChange("Sapling"); } internal static void SeedSettingChanged(object o, EventArgs e) { StaticMembers.Dbgl("Config setting changed, scheduling modification of TreeBase drop tables", forceLog: false, (LogLevel)16); HandleSettingChange("Seed"); } internal static void CropSettingChanged(object o, EventArgs e) { StaticMembers.Dbgl("Config setting changed, scheduling re-initialization of crops", forceLog: false, (LogLevel)16); HandleSettingChange("Crop"); } internal static void VineSettingChanged(object o, EventArgs e) { StaticMembers.Dbgl("Config setting changed, scheduling re-initialization of vines", forceLog: false, (LogLevel)16); HandleSettingChange("Vine"); } internal static void ExtraResourcesChanged() { StaticMembers.Dbgl("ExtraResourcesChanged", forceLog: false, (LogLevel)16); StaticMembers.deserializedExtraResources.Clear(); foreach (string item2 in StaticMembers.config.SyncedExtraResources.Value) { ExtraResource item = PluginUtils.DeserializeExtraResource(item2); StaticMembers.deserializedExtraResources.Add(item); } if (Object.op_Implicit((Object)(object)ZNetScene.s_instance)) { PluginInitUtils.InitExtraResourceRefs(ZNetScene.s_instance); PieceSettingChanged(null, null); } } internal static void ExtraResourcesFileOrSettingChanged(object sender, EventArgs e) { StaticMembers.Dbgl("ExtraResources file or setting has changed", forceLog: false, (LogLevel)16); if (ConfigWatcher.ExtraResourcesWatcher == null) { ConfigWatcher.InitExtraResourcesWatcher(); } if (StaticMembers.config.IsSourceOfTruth) { if (StaticMembers.config.EnableExtraResources) { StaticMembers.Dbgl("IsSourceOfTruth: true, loading extra resources from disk", forceLog: false, (LogLevel)16); PluginUtils.LoadExtraResources(); } else { StaticMembers.config.SyncedExtraResources.AssignLocalValue(new List<string>()); } } else { StaticMembers.Dbgl("IsSourceOfTruth: false, extra resources will not be loaded from disk", forceLog: false, (LogLevel)16); } } internal static void ConfigSettingChanged(object sender, EventArgs e) { if (!s_configFileChangedFirst && !ShouldQueueMethod) { s_configSettingChangedFirst = true; StaticMembers.Dbgl("SAVING", forceLog: false, (LogLevel)16); StaticMembers.config.Save(); } else { s_configFileChangedFirst = false; } } internal static void ConfigFileChanged(object sender, EventArgs e) { s_configFileChangedFirst = !s_configSettingChangedFirst; if (StaticMembers.isDedicatedServer || s_configFileChangedFirst) { StaticMembers.Dbgl("RELOADING", forceLog: false, (LogLevel)16); StaticMembers.config.Reload(); } s_configSettingChangedFirst = false; } internal static void ConfigManagerDisplayingWindowChanged(object sender, EventArgs e) { if (!ConfigManagerHelper.IsConfigManagerWindowActive) { StaticMembers.Dbgl("Configuration Manager Window Closed", forceLog: false, (LogLevel)16); } } } [<b6194257-56e0-4089-8df8-6802074f0169>Nullable(0)] [<bf8dd59c-bead-48b7-8dff-298aa7098003>NullableContext(2)] internal class ConfigManagerHelper { private static object _configManagerInstance; private static Type _configManagerType; private static MethodInfo _buildSettingList; private static PropertyInfo _displayingWindowProperty; internal static bool IsConfigManagerWindowActive { get { object obj = _displayingWindowProperty?.GetValue(_configManagerInstance); bool flag = default(bool); int num; if (obj is bool) { flag = (bool)obj; num = 1; } else { num = 0; } return (byte)((uint)num & (flag ? 1u : 0u)) != 0; } } internal static void Initialize() { _configManagerType = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault([<bf8dd59c-bead-48b7-8dff-298aa7098003>NullableContext(0)] (Assembly a) => a.GetName().Name == "ConfigurationManager")?.GetType("ConfigurationManager.ConfigurationManager"); _configManagerInstance = ((_configManagerType == null) ? null : Chainloader.ManagerObject.GetComponent(_configManagerType)); _buildSettingList = _configManagerType?.GetMethod("BuildSettingList"); _displayingWindowProperty = _configManagerType?.GetProperty("DisplayingWindow"); EventInfo eventInfo = _configManagerInstance?.GetType().GetEvent("DisplayingWindowChanged"); if ((object)eventInfo != null) { EventHandler eventHandler = ConfigEventHandlers.ConfigManagerDisplayingWindowChanged; Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, eventHandler.Target, eventHandler.Method); eventInfo.AddEventHandler(_configManagerInstance, handler); } } internal static void ReloadConfigDisplay() { _buildSettingList?.Invoke(_configManagerInstance, Array.Empty<object>()); } } internal sealed class ConfigWatcher { internal static FileSystemWatcher ExtraResourcesWatcher; internal static void InitConfigWatcher() { FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, "advize.PlantEverything.cfg"); fileSystemWatcher.Changed += ConfigEventHandlers.ConfigFileChanged; fileSystemWatcher.Created += ConfigEventHandlers.ConfigFileChanged; fileSystemWatcher.Renamed += ConfigEventHandlers.ConfigFileChanged; fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; fileSystemWatcher.IncludeSubdirectories = true; fileSystemWatcher.EnableRaisingEvents = true; } internal static void InitExtraResourcesWatcher() { ExtraResourcesWatcher = new FileSystemWatcher(StaticMembers.CustomConfigPath, "ExtraResources.json"); ExtraResourcesWatcher.Changed += ConfigEventHandlers.ExtraResourcesFileOrSettingChanged; ExtraResourcesWatcher.Created += ConfigEventHandlers.ExtraResourcesFileOrSettingChanged; ExtraResourcesWatcher.Renamed += ConfigEventHandlers.ExtraResourcesFileOrSettingChanged; ExtraResourcesWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; ExtraResourcesWatcher.IncludeSubdirectories = true; ExtraResourcesWatcher.EnableRaisingEvents = true; } } internal struct ExtraResource { public string prefabName; public string resourceName; public int resourceCost; public bool groundOnly; public string pieceName; public string pieceDescription; internal readonly bool IsValid() { if (prefabName != null && !prefabName.StartsWith("PE_Fake") && resourceName != null) { return resourceCost != 0; } return false; } } internal static class PluginInitUtils { internal static void InitPrefabRefs() { //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Expected O, but got Unknown StaticMembers.Dbgl("InitPrefabRefs", forceLog: false, (LogLevel)16); if (StaticMembers.prefabRefs.Count > 0) { return; } Dictionary<string, AssetID> allAssetPathsInBundleMappedToAssetID = Runtime.GetAllAssetPathsInBundleMappedToAssetID(); bool flag = false; StaticContent.VanillaPrefabRefs.ForEach(delegate(string s) { StaticMembers.prefabRefs.Add(s, null); }); StaticContent.VanillaPrefabRefs.Clear(); StaticMembers.deserializedExtraResources.ForEach(delegate(ExtraResource er) { StaticMembers.prefabRefs[er.prefabName] = null; }); SoftReference<GameObject> val = default(SoftReference<GameObject>); foreach (string key3 in allAssetPathsInBundleMappedToAssetID.Keys) { if (!key3.EndsWith(".prefab", StringComparison.Ordinal)) { continue; } string key2 = key3.Split(new char[1] { '/' }).Last().Replace(".prefab", ""); if (StaticMembers.prefabRefs.ContainsKey(key2)) { val..ctor(allAssetPathsInBundleMappedToAssetID[key3]); val.Load(); StaticMembers.prefabRefs[key2] = val.Asset; if (!StaticMembers.prefabRefs.Any((KeyValuePair<string, GameObject> key) => !Object.op_Implicit((Object)(object)key.Value))) { StaticMembers.Dbgl("Found all prefab references.", forceLog: false, (LogLevel)16); flag = true; break; } } } if (!flag) { StaticMembers.Dbgl("Could not find all prefab references, attempting alternate prefab detection method.", forceLog: false, (LogLevel)16); List<string> list = (from key in StaticMembers.prefabRefs where !Object.op_Implicit((Object)(object)key.Value) select key into kvp select kvp.Key).ToList(); Object[] array = Resources.FindObjectsOfTypeAll(typeof(GameObject)); for (int i = 0; i < array.Length; i++) { GameObject val2 = (GameObject)array[i]; if (list.Contains(((Object)val2).name)) { StaticMembers.prefabRefs[((Object)val2).name] = val2; list.Remove(((Object)val2).name); if (!list.Any()) { StaticMembers.Dbgl("Found all prefab references on second attempt.", forceLog: false, (LogLevel)16); break; } } } foreach (string item in list) { StaticMembers.Dbgl("prefabRefs[" + item + "] value is null, removing key and value pair.", forceLog: false, (LogLevel)16); StaticMembers.prefabRefs.Remove(item); } } StaticContent.CustomPrefabRefs.ForEach(delegate(string s) { StaticMembers.prefabRefs.Add(s, PluginUtils.CreatePrefab(s)); }); StaticContent.CustomPrefabRefs.Clear(); } internal static bool InitExtraResourceRefs(ZNetScene instance, bool logErrors = false) { StaticMembers.Dbgl("InitExtraResourceRefs", forceLog: false, (LogLevel)16); bool result = false; foreach (ExtraResource deserializedExtraResource in StaticMembers.deserializedExtraResources) { if (!StaticMembers.prefabRefs.TryGetValue(deserializedExtraResource.prefabName, out var value)) { value = instance.GetPrefab(deserializedExtraResource.prefabName); if (Object.op_Implicit((Object)(object)value)) { StaticMembers.prefabRefs[deserializedExtraResource.prefabName] = value; StaticMembers.Dbgl("Added " + deserializedExtraResource.prefabName + " to prefabRefs", forceLog: false, (LogLevel)16); result = true; } else { StaticMembers.Dbgl("Could not find prefab reference for " + deserializedExtraResource.prefabName + ", skipping entry.", logErrors || StaticMembers.config.EnableDebugMessages, (LogLevel)4); } } } return result; } internal static void InitPieceRefs() { StaticMembers.Dbgl("InitPieceRefs", forceLog: false, (LogLevel)16); if (StaticMembers.pieceRefs.Count > 0) { PluginUtils.RemoveFromCultivator(StaticMembers.pieceRefs.ConvertAll((Converter<PieceDB, PrefabDB>)((PieceDB x) => x))); StaticMembers.pieceRefs.Clear(); } StaticMembers.pieceRefs = StaticContent.GeneratePieceRefs(); } internal static void InitPieces() { //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Expected O, but got Unknown //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Expected O, but got Unknown //IL_023b: Unknown result type (might be due to invalid IL or missing references) //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Expected O, but got Unknown //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Expected O, but got Unknown //IL_03be: Unknown result type (might be due to invalid IL or missing references) //IL_03c3: Unknown result type (might be due to invalid IL or missing references) //IL_02bf: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_02cb: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Unknown result type (might be due to invalid IL or missing references) //IL_02db: Unknown result type (might be due to invalid IL or missing references) //IL_02e1: Unknown result type (might be due to invalid IL or missing references) //IL_02e8: Unknown result type (might be due to invalid IL or missing references) StaticMembers.Dbgl("InitPieces", forceLog: false, (LogLevel)16); foreach (PieceDB pdb in StaticMembers.pieceRefs) { if (StaticMembers.config.DisabledResourceNames.Contains(pdb.key)) { StaticMembers.Dbgl("Resource disabled: " + pdb.key + ", skipping.", forceLog: false, (LogLevel)16); pdb.enabled = false; } ItemDrop component = ObjectDB.instance.GetItemPrefab(pdb.Resource.Key).GetComponent<ItemDrop>(); if (pdb.Resources.Count > 0) { List<Requirement> list = new List<Requirement>(); foreach (string key in pdb.Resources.Keys) { list.Add(new Requirement { m_resItem = ObjectDB.instance.GetItemPrefab(key).GetComponent<ItemDrop>(), m_amount = pdb.Resources[key], m_recover = pdb.recover }); } pdb.Piece.m_resources = list.ToArray(); } else { pdb.Piece.m_resources = (Requirement[])(object)new Requirement[1] { new Requirement { m_resItem = component, m_amount = pdb.ResourceCost, m_recover = pdb.recover } }; } pdb.Piece.m_icon = (pdb.icon ? PluginUtils.CreateSprite(pdb.key + "PieceIcon.png", new Rect(0f, 0f, 64f, 64f)) : component.m_itemData.GetIcon()); pdb.Piece.m_placeEffect.m_effectPrefabs = (EffectData[])(object)new EffectData[2] { new EffectData { m_prefab = StaticMembers.prefabRefs["vfx_Place_wood_pole"], m_enabled = true }, new EffectData { m_prefab = StaticMembers.prefabRefs["sfx_build_cultivator"], m_enabled = true } }; if (pdb.snapPoints != null) { Transform val = pdb.Prefab.transform.Find("_snappoint"); if (StaticMembers.config.SnappableVines) { if (!Object.op_Implicit((Object)(object)val)) { foreach (Vector3 snapPoint in pdb.snapPoints) { GameObject val2 = new GameObject("_snappoint") { tag = "snappoint" }; val2.transform.position = snapPoint; val2.transform.SetParent(pdb.Prefab.transform); val2.SetActive(false); } } } else { while (Object.op_Implicit((Object)(object)val)) { Object.DestroyImmediate((Object)(object)((Component)val).gameObject); val = pdb.Prefab.transform.Find("_snappoint"); } } } Pickable component2 = pdb.Prefab.GetComponent<Pickable>(); if (!Object.op_Implicit((Object)(object)component2) || StaticMembers.deserializedExtraResources.Any((ExtraResource x) => x.prefabName == pdb.key)) { continue; } component2.m_respawnTimeMinutes = pdb.respawnTime; component2.m_amount = pdb.resourceReturn; pdb.Piece.m_onlyInBiome = pdb.biome; if (pdb.hideWhenPicked) { component2.m_hideWhenPicked = ((pdb.respawnTime > 0) ? ((Component)component2).gameObject : null); } Transform val3 = pdb.Prefab.transform.Find("visual"); if (!Object.op_Implicit((Object)(object)val3)) { continue; } Transform val4 = StaticMembers.prefabRefs[pdb.key + "_Picked"].transform.Find("PE_Picked"); if (Object.op_Implicit((Object)(object)val4)) { if (StaticMembers.config.ShowPickableSpawners) { val4.SetParent(pdb.Prefab.transform); } if (!StaticMembers.piecesInitialized) { MeshRenderer component3 = ((Component)val4).GetComponent<MeshRenderer>(); MeshRenderer component4 = ((Component)val3).GetComponent<MeshRenderer>(); ((Renderer)component3).sharedMaterials = ((pdb.key == "Pickable_Thistle") ? ((Renderer)((Component)val3.Find("default")).GetComponent<MeshRenderer>()).sharedMaterials : ((Renderer)component4).sharedMaterials); if (pdb.key.Contains("Dandelion")) { Material val5 = ((Renderer)component4).sharedMaterials[0]; ((Renderer)component3).sharedMaterials = (Material[])(object)new Material[2] { val5, val5 }; } } } else { Transform val6 = StaticMembers.prefabRefs[pdb.key].transform.Find("PE_Picked"); if (!StaticMembers.config.ShowPickableSpawners && Object.op_Implicit((Object)(object)val6)) { val6.SetParent(StaticMembers.prefabRefs[pdb.key + "_Picked"].transform); } } if (pdb.extraDrops) { component2.m_extraDrops.m_drops.Clear(); } } StaticMembers.piecesInitialized = true; } internal static void InitSaplingRefs() { StaticMembers.Dbgl("InitSaplingRefs", forceLog: false, (LogLevel)16); if (StaticMembers.saplingRefs.Count > 0) { PluginUtils.RemoveFromCultivator(StaticMembers.saplingRefs.ConvertAll((Converter<SaplingDB, PrefabDB>)((SaplingDB x) => x))); StaticMembers.saplingRefs.Clear(); } StaticMembers.saplingRefs = StaticContent.GenerateCustomSaplingRefs(); } internal static void InitSaplings() { //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Expected O, but got Unknown //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_094c: Unknown result type (might be due to invalid IL or missing references) //IL_0958: Unknown result type (might be due to invalid IL or missing references) //IL_0959: Unknown result type (might be due to invalid IL or missing references) //IL_095b: Unknown result type (might be due to invalid IL or missing references) //IL_0960: Unknown result type (might be due to invalid IL or missing references) //IL_0962: Unknown result type (might be due to invalid IL or missing references) //IL_0953: Unknown result type (might be due to invalid IL or missing references) //IL_078a: Unknown result type (might be due to invalid IL or missing references) StaticMembers.Dbgl("InitSaplings", forceLog: false, (LogLevel)16); ModifyTreeDrops(); AssetID val2 = default(AssetID); SoftReference<Shader> val3 = default(SoftReference<Shader>); foreach (SaplingDB item in StaticContent.GenerateVanillaSaplingRefs().Concat(StaticMembers.saplingRefs)) { Plant component = item.Prefab.GetComponent<Plant>(); Piece component2 = item.Prefab.GetComponent<Piece>(); component.m_growTime = (component.m_growTimeMax = item.growTime); component.m_growRadius = item.growRadius; component.m_minScale = item.minScale; component.m_maxScale = item.maxScale; component2.m_onlyInBiome = (component.m_biome = item.biome); component.m_tolerateCold = item.tolerateCold || !StaticMembers.config.PlantsRequireShielding; component.m_tolerateHeat = item.tolerateHeat || !StaticMembers.config.PlantsRequireShielding; component.m_destroyIfCantGrow = (component2.m_groundOnly = !StaticMembers.config.PlaceAnywhere); if (!StaticMembers.saplingRefs.Contains(item)) { continue; } component.m_grownPrefabs = item.grownPrefabs; List<Requirement> list = new List<Requirement>(); foreach (string key in item.Resources.Keys) { list.Add(new Requirement { m_resItem = ObjectDB.instance.GetItemPrefab(key).GetComponent<ItemDrop>(), m_amount = item.Resources[key], m_recover = false }); } component2.m_resources = list.ToArray(); if (StaticMembers.config.DisabledResourceNames.Contains(item.key)) { StaticMembers.Dbgl("Resource disabled: " + item.key, forceLog: false, (LogLevel)16); item.enabled = false; } if (StaticMembers.saplingsInitialized) { continue; } string[] array = new string[2] { "healthy", "unhealthy" }; Transform val = StaticMembers.prefabRefs["Birch_Sapling"].transform.Find(array[0]); Shader shader; if (!StaticMembers.isDedicatedServer) { AssetID.TryParse("f6de4704e075b4095ae641aed283b641", ref val2); val3..ctor(val2); val3.Load(); shader = val3.Asset; } else { shader = Shader.Find("Custom/Piece"); } if (item.source != "AshlandsTree3") { string[] array2 = array; foreach (string text in array2) { ((Component)item.Prefab.transform.Find(text)).GetComponent<MeshFilter>().mesh = ((Component)val.Find("Birch_Sapling")).GetComponent<MeshFilter>().mesh; } } switch (item.source) { case "YggaShoot_small1": { string[] array7 = new string[6] { "birchleafs002", "birchleafs003", "birchleafs008", "birchleafs009", "birchleafs010", "birchleafs011" }; Material[] sharedMaterials3 = (Material[])(object)new Material[1] { ((Renderer)((Component)StaticMembers.prefabRefs[item.source].transform.Find("beech")).GetComponent<MeshRenderer>()).sharedMaterials[0] }; Material[] sharedMaterials4 = (Material[])(object)new Material[1] { ((Renderer)((Component)StaticMembers.prefabRefs[item.source].transform.Find("beech")).GetComponent<MeshRenderer>()).sharedMaterials[1] }; string[] array2 = array; foreach (string text7 in array2) { ((Renderer)((Component)item.Prefab.transform.Find(text7)).GetComponent<MeshRenderer>()).sharedMaterials = sharedMaterials4; } array2 = array7; foreach (string text8 in array2) { string[] array6 = array; foreach (string text9 in array6) { ((Component)item.Prefab.transform.Find(text9).Find(text8)).GetComponent<MeshFilter>().mesh = ((Component)val.Find(text8)).GetComponent<MeshFilter>().mesh; ((Renderer)((Component)item.Prefab.transform.Find(text9).Find(text8)).GetComponent<MeshRenderer>()).sharedMaterials = sharedMaterials3; } } break; } case "SwampTree1": { Material[] array4 = (Material[])(object)new Material[1] { ((Renderer)((Component)StaticMembers.prefabRefs[item.source].transform.Find("swamptree1")).GetComponent<MeshRenderer>()).sharedMaterials[0] }; array4[0].shader = shader; string[] array2 = array; foreach (string text3 in array2) { ((Renderer)((Component)item.Prefab.transform.Find(text3)).GetComponent<MeshRenderer>()).sharedMaterials = array4; } break; } case "Birch1_aut": { string[] array5 = new string[6] { "birchleafs002", "birchleafs003", "birchleafs008", "birchleafs009", "birchleafs010", "birchleafs011" }; Material[] sharedMaterials = (Material[])(object)new Material[1] { ((Renderer)((Component)StaticMembers.prefabRefs[item.source].transform.Find("Lod0")).GetComponent<MeshRenderer>()).sharedMaterials[0] }; Material[] sharedMaterials2 = (Material[])(object)new Material[1] { ((Renderer)((Component)val.Find("Birch_Sapling")).GetComponent<MeshRenderer>()).sharedMaterials[0] }; string[] array2 = array; foreach (string text4 in array2) { ((Renderer)((Component)item.Prefab.transform.Find(text4)).GetComponent<MeshRenderer>()).sharedMaterials = sharedMaterials2; } array2 = array5; foreach (string text5 in array2) { string[] array6 = array; foreach (string text6 in array6) { ((Component)item.Prefab.transform.Find(text6).Find(text5)).GetComponent<MeshFilter>().mesh = ((Component)val.Find(text5)).GetComponent<MeshFilter>().mesh; ((Renderer)((Component)item.Prefab.transform.Find(text6).Find(text5)).GetComponent<MeshRenderer>()).sharedMaterials = sharedMaterials; } } break; } case "AshlandsTree3": { Transform val4 = StaticMembers.prefabRefs[item.source].transform.Find("default"); MeshRenderer component3 = ((Component)val4).GetComponent<MeshRenderer>(); Material[] array3 = (Material[])(object)new Material[1] { ((Renderer)component3).sharedMaterials[0] }; array3[0].shader = shader; array3[0].SetTexture("_EmissionMap", ((Renderer)component3).sharedMaterials[0].GetTexture("_EmissiveTex")); string[] array2 = array; foreach (string text2 in array2) { ((Component)item.Prefab.transform.Find(text2)).GetComponent<MeshFilter>().mesh = ((Component)val4).GetComponent<MeshFilter>().mesh; ((Renderer)((Component)item.Prefab.transform.Find(text2)).GetComponent<MeshRenderer>()).sharedMaterials = array3; } break; } } component2.m_icon = (item.icon ? PluginUtils.CreateSprite(item.key + "PieceIcon.png", new Rect(0f, 0f, 64f, 64f)) : component2.m_resources[0].m_resItem.m_itemData.GetIcon()); component2.m_placeEffect.m_effectPrefabs[0].m_prefab = StaticMembers.prefabRefs["vfx_Place_wood_pole"]; component2.m_placeEffect.m_effectPrefabs[1].m_prefab = StaticMembers.prefabRefs["sfx_build_cultivator"]; item.Prefab.GetComponent<Destructible>().m_hitEffect.m_effectPrefabs = StaticMembers.prefabRefs["Birch_Sapling"].GetComponent<Destructible>().m_hitEffect.m_effectPrefabs; } StaticMembers.saplingsInitialized = true; if (StaticMembers.moddedSaplingRefs.Count == 0) { return; } bool overrideModdedSaplings = StaticMembers.config.OverrideModdedSaplings; foreach (ModdedPlantDB moddedSaplingRef in StaticMembers.moddedSaplingRefs) { if (!Object.op_Implicit((Object)(object)moddedSaplingRef.Prefab)) { StaticMembers.Dbgl(moddedSaplingRef.key + " reference is null, skipping application of modded sapling override settings", forceLog: true, (LogLevel)4); continue; } Piece component4 = moddedSaplingRef.Prefab.GetComponent<Piece>(); Plant component5 = moddedSaplingRef.Prefab.GetComponent<Plant>(); component5.m_growTime = (overrideModdedSaplings ? StaticMembers.config.ModdedSaplingGrowthTime : moddedSaplingRef.growTime); component5.m_growTimeMax = (overrideModdedSaplings ? StaticMembers.config.ModdedSaplingGrowthTime : moddedSaplingRef.growTimeMax); component5.m_growRadius = (overrideModdedSaplings ? StaticMembers.config.ModdedSaplingGrowRadius : moddedSaplingRef.growRadius); component5.m_minScale = (overrideModdedSaplings ? StaticMembers.config.ModdedSaplingMinScale : moddedSaplingRef.minScale); component5.m_maxScale = (overrideModdedSaplings ? StaticMembers.config.ModdedSaplingMaxScale : moddedSaplingRef.maxScale); component4.m_onlyInBiome = (component5.m_biome = ((overrideModdedSaplings && !StaticMembers.config.EnforceBiomes) ? StaticMembers.AllBiomes : moddedSaplingRef.biome)); component5.m_tolerateCold = moddedSaplingRef.tolerateCold || !StaticMembers.config.PlantsRequireShielding; component5.m_tolerateHeat = moddedSaplingRef.tolerateHeat || !StaticMembers.config.PlantsRequireShielding; component5.m_destroyIfCantGrow = (component4.m_groundOnly = !StaticMembers.config.PlaceAnywhere); } } internal static void ModifyTreeDrops() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) if (!StaticMembers.config.EnableSeedOverrides) { return; } foreach (KeyValuePair<GameObject, GameObject> treesToSeed in StaticContent.TreesToSeeds) { TreeBase component = treesToSeed.Key.GetComponent<TreeBase>(); DropData item = default(DropData); bool flag = false; foreach (DropData drop in component.m_dropWhenDestroyed.m_drops) { if (((object)drop.m_item).Equals((object?)treesToSeed.Value)) { flag = true; item = drop; break; } } if (flag) { component.m_dropWhenDestroyed.m_drops.Remove(item); } item.m_item = treesToSeed.Value; item.m_stackMin = StaticMembers.config.SeedDropMin; item.m_stackMax = StaticMembers.config.SeedDropMax; item.m_weight = 1f; component.m_dropWhenDestroyed.m_dropMin = StaticMembers.config.TreeDropMin; component.m_dropWhenDestroyed.m_dropMax = StaticMembers.config.TreeDropMax; component.m_dropWhenDestroyed.m_drops.Add(item); component.m_dropWhenDestroyed.m_dropChance = Mathf.Clamp(StaticMembers.config.DropChance, 0f, 1f); component.m_dropWhenDestroyed.m_oneOfEach = StaticMembers.config.OneOfEach; } } internal static void InitCrops() { //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02b2: Unknown result type (might be due to invalid IL or missing references) //IL_02ad: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Unknown result type (might be due to invalid IL or missing references) StaticMembers.Dbgl("InitCrops", forceLog: false, (LogLevel)16); bool enableCropOverrides = StaticMembers.config.EnableCropOverrides; foreach (PrefabDB item in StaticContent.GenerateCropRefs()) { Piece component = item.Prefab.GetComponent<Piece>(); Plant component2 = item.Prefab.GetComponent<Plant>(); Pickable component3 = component2.m_grownPrefabs[0].GetComponent<Pickable>(); component.m_resources[0].m_amount = item.resourceCost; ((StaticTarget)component).m_primaryTarget = (((StaticTarget)component).m_randomTarget = StaticMembers.config.EnemiesTargetCrops); component2.m_biome = item.biome; component2.m_tolerateCold = item.tolerateCold || !StaticMembers.config.PlantsRequireShielding; component2.m_tolerateHeat = item.tolerateHeat || !StaticMembers.config.PlantsRequireShielding; component2.m_minScale = (enableCropOverrides ? StaticMembers.config.CropMinScale : 0.9f); component2.m_maxScale = (enableCropOverrides ? StaticMembers.config.CropMaxScale : 1.1f); component2.m_growTime = (enableCropOverrides ? StaticMembers.config.CropGrowTimeMin : 4000f); component2.m_growTimeMax = (enableCropOverrides ? StaticMembers.config.CropGrowTimeMax : 5000f); component2.m_growRadius = (enableCropOverrides ? StaticMembers.config.CropGrowRadius : 0.5f); component2.m_needCultivatedGround = (component.m_cultivatedGroundOnly = !enableCropOverrides || StaticMembers.config.CropRequireCultivation); component3.m_amount = item.resourceReturn; component3.m_extraDrops.m_drops.Clear(); if (item.extraDrops && !enableCropOverrides) { component3.m_extraDrops.m_drops.Add(new DropData { m_item = component3.m_itemPrefab, m_stackMin = 1, m_stackMax = 1, m_weight = 0f }); } } if (StaticMembers.moddedCropRefs.Count == 0) { return; } enableCropOverrides = enableCropOverrides && StaticMembers.config.OverrideModdedCrops; foreach (ModdedPlantDB moddedCropRef in StaticMembers.moddedCropRefs) { if (!Object.op_Implicit((Object)(object)moddedCropRef.Prefab)) { StaticMembers.Dbgl(moddedCropRef.key + " reference is null, skipping application of crop override settings", forceLog: true, (LogLevel)4); continue; } Piece component4 = moddedCropRef.Prefab.GetComponent<Piece>(); Plant component5 = moddedCropRef.Prefab.GetComponent<Plant>(); ((StaticTarget)component4).m_primaryTarget = (((StaticTarget)component4).m_randomTarget = StaticMembers.config.EnemiesTargetCrops); component5.m_biome = ((enableCropOverrides && !StaticMembers.config.EnforceBiomesVanilla) ? StaticMembers.AllBiomes : moddedCropRef.biome); component5.m_tolerateCold = moddedCropRef.tolerateCold || !StaticMembers.config.PlantsRequireShielding; component5.m_tolerateHeat = moddedCropRef.tolerateHeat || !StaticMembers.config.PlantsRequireShielding; component5.m_minScale = (enableCropOverrides ? StaticMembers.config.CropMinScale : moddedCropRef.minScale); component5.m_maxScale = (enableCropOverrides ? StaticMembers.config.CropMaxScale : moddedCropRef.maxScale); component5.m_growTime = (enableCropOverrides ? StaticMembers.config.CropGrowTimeMin : moddedCropRef.growTime); component5.m_growTimeMax = (enableCropOverrides ? StaticMembers.config.CropGrowTimeMax : moddedCropRef.growTimeMax); component5.m_growRadius = (enableCropOverrides ? StaticMembers.config.CropGrowRadius : moddedCropRef.growRadius); component5.m_needCultivatedGround = (component4.m_cultivatedGroundOnly = !enableCropOverrides || StaticMembers.config.CropRequireCultivation); } } internal static void InitVines() { //IL_004f: Unknown result type (might be due to invalid IL or missing references) StaticMembers.Dbgl("InitVines", forceLog: false, (LogLevel)16); Plant component = StaticMembers.prefabRefs["VineAsh_sapling"].GetComponent<Plant>(); Pickable component2 = StaticMembers.prefabRefs["VineAsh"].GetComponent<Pickable>(); component.m_biome = (Biome)(StaticMembers.config.EnforceBiomesVanilla ? 827 : 895); component.m_needCultivatedGround = (StaticMembers.prefabRefs["VineAsh_sapling"].GetComponent<Piece>().m_cultivatedGroundOnly = !StaticMembers.config.EnableCropOverrides || StaticMembers.config.CropRequireCultivation); component.m_growTime = (StaticMembers.config.EnableVineOverrides ? StaticMembers.config.VinesGrowthTime : 200f); component.m_growTimeMax = (StaticMembers.config.EnableVineOverrides ? StaticMembers.config.VinesGrowthTime : 300f); component.m_attachDistance = (StaticMembers.config.EnableVineOverrides ? StaticMembers.config.VinesAttachDistance : 1.8f); component.m_growRadiusVines = (StaticMembers.config.EnableVineOverrides ? StaticMembers.config.VineGrowRadius : 1.8f); component.m_tolerateCold = !StaticMembers.config.PlantsRequireShielding; component2.m_amount = (StaticMembers.config.EnableVineOverrides ? StaticMembers.config.VineBerryReturn : 3); component2.m_respawnTimeInitMax = ((!StaticMembers.config.EnableVineOverrides) ? 150 : 0); component2.m_respawnTimeMinutes = (StaticMembers.config.EnableVineOverrides ? StaticMembers.config.VineBerryRespawnTime : 200); } internal static void InitCultivator() { StaticMembers.Dbgl("InitCultivator", forceLog: false, (LogLevel)16); PieceTable buildPieces = StaticMembers.prefabRefs["Cultivator"].GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces; for (int i = 0; i < StaticMembers.saplingRefs.Count; i++) { if (StaticMembers.saplingRefs[i].enabled && !buildPieces.m_pieces.Contains(StaticMembers.saplingRefs[i].Prefab)) { buildPieces.m_pieces.Insert(16, StaticMembers.saplingRefs[i].Prefab); } } for (int j = 0; j < StaticMembers.pieceRefs.Count; j++) { if (StaticMembers.pieceRefs[j].enabled && !buildPieces.m_pieces.Contains(StaticMembers.pieceRefs[j].Prefab)) { buildPieces.m_pieces.Add(StaticMembers.pieceRefs[j].Prefab); } } buildPieces.m_canRemovePieces = true; } public static void InitLocalization() { StaticMembers.Dbgl("InitLocalization", forceLog: false, (LogLevel)16); foreach (KeyValuePair<string, string> defaultLocalizedString in StaticContent.DefaultLocalizedStrings) { Localization.instance.AddWord("pe" + defaultLocalizedString.Key, defaultLocalizedString.Value); } StaticContent.DefaultLocalizedStrings.Clear(); } internal static void FullInit(ZNetScene instance) { StaticMembers.Dbgl("Performing full mod initialization", forceLog: false, (LogLevel)16); InitExtraResourceRefs(instance); InitPieceRefs(); InitPieces(); InitSaplingRefs(); InitSaplings(); InitCrops(); InitVines(); InitCultivator(); if (StaticContent.DefaultLocalizedStrings.Count > 0) { InitLocalization(); } for (int i = 0; i < StaticMembers.saplingRefs.Count; i++) { GameObject prefab = StaticMembers.saplingRefs[i].Prefab; if (!instance.m_prefabs.Contains(prefab)) { instance.m_prefabs.Add(prefab); instance.m_namedPrefabs.Add(instance.GetPrefabHash(prefab), prefab); } } } } internal static class StaticMembers { internal static ManualLogSource ModLogger = new ManualLogSource(" PlantEverything"); internal static ModConfig config; private static string customConfigPath; internal static readonly Dictionary<LogLevel, Action<string>> logActions = new Dictionary<LogLevel, Action<string>> { { (LogLevel)1, (Action<string>)ModLogger.LogFatal }, { (LogLevel)2, (Action<string>)ModLogger.LogError }, { (LogLevel)4, (Action<string>)ModLogger.LogWarning }, { (LogLevel)8, (Action<string>)ModLogger.LogMessage }, { (LogLevel)16, (Action<string>)ModLogger.LogInfo }, { (LogLevel)32, (Action<string>)ModLogger.LogDebug } }; internal static readonly Dictionary<string, GameObject> prefabRefs = new Dictionary<string, GameObject>(); internal static List<PieceDB> pieceRefs = new List<PieceDB>(); internal static List<SaplingDB> saplingRefs = new List<SaplingDB>(); internal static List<ModdedPlantDB> moddedCropRefs = new List<ModdedPlantDB>(); internal static List<ModdedPlantDB> moddedSaplingRefs = new List<ModdedPlantDB>(); internal static List<ExtraResource> deserializedExtraResources = new List<ExtraResource>(); internal static bool piecesInitialized = false; internal static bool saplingsInitialized = false; internal static bool resolveMissingReferences = false; internal static bool isDedicatedServer = false; internal static AssetBundle assetBundle; internal static readonly Dictionary<string, Texture2D> cachedTextures = new Dictionary<string, Texture2D>(); internal static readonly Dictionary<Texture2D, Sprite> cachedSprites = new Dictionary<Texture2D, Sprite>(); internal const Biome TemperateBiomes = 25; internal static Biome AllBiomes = PluginUtils.GetBiomeMask((Biome[])Enum.GetValues(typeof(Biome))); internal static readonly int PlaceAnywhereHash = StringExtensionMethods.GetStableHashCode("pe_placeAnywhere"); internal static string[] layersForPieceRemoval = new string[4] { "item", "piece_nonsolid", "Default_small", "Default" }; internal static string CustomConfigPath => customConfigPath ?? (customConfigPath = PluginUtils.SetupConfigDirectory()); internal static void Dbgl(string message, bool forceLog = false, LogLevel level = 16) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) if (forceLog || config.EnableDebugMessages) { logActions[level](message); } } } internal sealed class ModLocalization { public List<string> LocalizedStrings = new List<string>(); } internal static class PluginUtils { internal static bool HoldingCultivator { get { Player localPlayer = Player.m_localPlayer; return ((localPlayer == null) ? null : ((Humanoid)localPlayer).GetRightItem()?.m_shared.m_name) == "$item_cultivator"; } } internal static AssetBundle LoadAssetBundle(string fileName) { return AssetBundle.LoadFromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("Advize_PlantEverything.Assets." + fileName)); } internal static GameObject CreatePrefab(string name) { GameObject obj = StaticMembers.assetBundle.LoadAsset<GameObject>(name); obj.SetActive(true); return obj; } internal static Piece GetOrAddPieceComponent(GameObject go) { return go.GetComponent<Piece>() ?? go.AddComponent<Piece>(); } internal static string GetPrefabName(Component c) { return ((Object)c.transform.root).name.Replace("(Clone)", ""); } internal static bool IsModdedPrefab(Component c) { if (Object.op_Implicit((Object)(object)c)) { return StaticMembers.prefabRefs.ContainsKey(GetPrefabName(c)); } return false; } internal static bool IsModdedPrefabOrSapling(string s) { if (!s.StartsWith("$pe")) { return s.EndsWith("_sapling"); } return true; } internal static void RemoveFromCultivator(List<PrefabDB> prefabs) { if (HoldingCultivator) { SheatheCultivator(); } PieceTable pieceTable = StaticMembers.prefabRefs["Cultivator"].GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces; prefabs.ForEach(delegate(PrefabDB x) { pieceTable.m_pieces.Remove(x.Prefab); }); } internal static void SheatheCultivator() { StaticMembers.Dbgl("Cultivator updated through config change, unequipping cultivator.", forceLog: true, (LogLevel)16); if (!ZNet.instance.HaveStopped) { ((Humanoid)Player.m_localPlayer).HideHandItems(false, true); } } internal static Piece CreatePiece(PieceDB pdb) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) Piece orAddPieceComponent = GetOrAddPieceComponent(StaticMembers.prefabRefs[pdb.key]); orAddPieceComponent.m_name = (pdb.extraResource ? pdb.pieceName : ("$pe" + pdb.Name + "Name")); orAddPieceComponent.m_description = (pdb.extraResource ? pdb.pieceDescription : ("$pe" + pdb.Name + "Description")); orAddPieceComponent.m_category = (PieceCategory)0; orAddPieceComponent.m_cultivatedGroundOnly = (pdb.key.Contains("berryBush") || pdb.key.Contains("Pickable")) && StaticMembers.config.RequireCultivation; bool num = pdb.isGrounded ?? (!StaticMembers.config.PlaceAnywhere); bool groundOnly = num; orAddPieceComponent.m_groundPiece = num; orAddPieceComponent.m_groundOnly = groundOnly; orAddPieceComponent.m_canBeRemoved = pdb.canBeRemoved.GetValueOrDefault(true); orAddPieceComponent.m_targetNonPlayerBuilt = false; ((StaticTarget)orAddPieceComponent).m_randomTarget = StaticMembers.config.EnemiesTargetPieces; return orAddPieceComponent; } internal static Sprite CreateSprite(string fileName, Rect spriteSection) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) try { Texture2D val = LoadTexture(fileName); Sprite val2; if (StaticMembers.cachedSprites.ContainsKey(val)) { val2 = StaticMembers.cachedSprites[val]; } else { val2 = Sprite.Create(val, spriteSection, Vector2.zero); StaticMembers.cachedSprites.Add(val, val2); } return val2; } catch { StaticMembers.Dbgl("Unable to load texture", forceLog: true, (LogLevel)2); } return null; } private static Texture2D LoadTexture(string fileName) { Texture2D val; if (StaticMembers.cachedTextures.ContainsKey(fileName)) { val = StaticMembers.cachedTextures[fileName]; } else { val = StaticMembers.assetBundle.LoadAsset<Texture2D>(fileName); StaticMembers.cachedTextures.Add(fileName, val); } return val; } private static string SerializeExtraResource(ExtraResource extraResource, bool prettyPrint = true) { return JsonUtility.ToJson((object)extraResource, prettyPrint); } internal static ExtraResource DeserializeExtraResource(string extraResource) { return JsonUtility.FromJson<ExtraResource>(extraResource); } private static void SaveExtraResources() { string text = Path.Combine(StaticMembers.CustomConfigPath, "ExtraResources.json"); StaticMembers.Dbgl($"deserializedExtraResources.Count is {StaticMembers.deserializedExtraResources.Count}", forceLog: false, (LogLevel)16); string text2 = ""; text2 = text2 + SerializeExtraResource(StaticMembers.deserializedExtraResources[0]) + ";\n\n"; text2 = text2 + SerializeExtraResource(StaticMembers.deserializedExtraResources[1], prettyPrint: false) + ";\n"; File.WriteAllText(text, text2); StaticMembers.Dbgl("Serialized extraResources to " + text, forceLog: true, (LogLevel)16); } internal static void LoadExtraResources() { StaticMembers.Dbgl("LoadExtraResources", forceLog: false, (LogLevel)16); StaticMembers.deserializedExtraResources.Clear(); string text = "ExtraResources.json"; string text2 = Path.Combine(StaticMembers.CustomConfigPath, text); try { string[] array = File.ReadAllText(text2).Split(new char[1] { ';' }); foreach (string text3 in array) { if (!Utility.IsNullOrWhiteSpace(text3)) { ExtraResource item = DeserializeExtraResource(text3); if (item.IsValid()) { StaticMembers.deserializedExtraResources.Add(item); } else if (!item.prefabName.StartsWith("PE_Fake")) { StaticMembers.Dbgl("Invalid resource, " + item.prefabName + ", configured in " + text + ", skipping entry", forceLog: true, (LogLevel)4); } } } StaticMembers.Dbgl("Loaded extra resources from " + text2, forceLog: true, (LogLevel)16); StaticMembers.Dbgl("Assigning local value from deserializedExtraResources", forceLog: false, (LogLevel)16); List<string> resourcesToSync = new List<string>(); StaticMembers.deserializedExtraResources.ForEach(delegate(ExtraResource er) { resourcesToSync.Add(SerializeExtraResource(er)); }); StaticMembers.config.SyncedExtraResources.AssignLocalValue(resourcesToSync); } catch (Exception ex) { if (ex is FileNotFoundException) { StaticMembers.Dbgl("Error loading data from " + text + ". Generating new file with example values", forceLog: true, (LogLevel)4); StaticMembers.deserializedExtraResources = StaticContent.GenerateExampleResources(); SaveExtraResources(); } else { StaticMembers.Dbgl("Error loading data from " + text + ". Additional resources have not been added", forceLog: false, (LogLevel)4); StaticMembers.deserializedExtraResources.Clear(); } } } internal static void LoadLocalizedStrings() { string path = StaticMembers.config.Language + "_PlantEverything.json"; string text = Path.Combine(StaticMembers.CustomConfigPath, path); try { foreach (string localizedString in JsonUtility.FromJson<ModLocalization>(File.ReadAllText(text)).LocalizedStrings) { string[] array = localizedString.Split(new char[1] { ':' }); StaticContent.DefaultLocalizedStrings.Remove(array[0]); StaticContent.DefaultLocalizedStrings.Add(array[0], array[1]); } StaticMembers.Dbgl("Loaded localized strings from " + text, forceLog: false, (LogLevel)16); return; } catch { StaticMembers.Dbgl("EnableLocalization is true but unable to load localized text file, generating new one from default English values", forceLog: true, (LogLevel)16); } SerializeDict(); } private static void SerializeDict() { string text = Path.Combine(StaticMembers.CustomConfigPath, "english_PlantEverything.json"); ModLocalization modLocalization = new ModLocalization(); foreach (KeyValuePair<string, string> defaultLocalizedString in StaticContent.DefaultLocalizedStrings) { modLocalization.LocalizedStrings.Add(defaultLocalizedString.Key + ":" + defaultLocalizedString.Value); } File.WriteAllText(text, JsonUtility.ToJson((object)modLocalization, true)); StaticMembers.Dbgl("Saved english localized strings to " + text, forceLog: false, (LogLevel)16); } internal static Biome GetBiomeMask(Biome[] biomes) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) Biome val = (Biome)0; foreach (Biome val2 in biomes) { val |= val2; } return val; } internal static string SetupConfigDirectory() { string text = Path.Combine(Paths.ConfigPath, "PlantEverything"); if (!Directory.Exists(text)) { Directory.CreateDirectory(text); } return text; } } internal static class StaticContent { internal static Dictionary<string, string> DefaultLocalizedStrings = new Dictionary<string, string> { { "AncientSaplingName", "Ancient Sapling" }, { "AncientSaplingDescription", "" }, { "YggaSaplingName", "Ygga Sapling" }, { "YggaSaplingDescription", "" }, { "AutumnBirchSaplingName", "Autumn Birch Sapling" }, { "AutumnBirchSaplingDescription", "Plains Variant" }, { "AshwoodSaplingName", "Ashwood Sapling" }, { "AshwoodSaplingDescription", "" }, { "VineAshSaplingName", "Custom Ashvine" }, { "VineAshSaplingDescription", "Plants an Ashvine sapling with the colours defined in the mod config." }, { "RaspberryBushName", "Raspberry Bush" }, { "RaspberryBushDescription", "Plant raspberries to grow raspberry bushes." }, { "BlueberryBushName", "Blueberry Bush" }, { "BlueberryBushDescription", "Plant blueberries to grow blueberry bushes." }, { "CloudberryBushName", "Cloudberry Bush" }, { "CloudberryBushDescription", "Plant cloudberries to grow cloudberry bushes." }, { "PickableMushroomName", "Pickable Mushrooms" }, { "PickableMushroomDescription", "Plant mushrooms to grow more pickable mushrooms." }, { "PickableYellowMushroomName", "Pickable Yellow Mushrooms" }, { "PickableYellowMushroomDescription", "Plant yellow mushrooms to grow more pickable yellow mushrooms." }, { "PickableBlueMushroomName", "Pickable Blue Mushrooms" }, { "PickableBlueMushroomDescription", "Plant blue mushrooms to grow more pickable blue mushrooms." }, { "PickableThistleName", "Pickable Thistle" }, { "PickableThistleDescription", "Plant thistle to grow more pickable thistle." }, { "PickableDandelionName", "Pickable Dandelion" }, { "PickableDandelionDescription", "Plant dandelion to grow more pickable dandelion." }, { "BeechSmallName", "Small Beech Tree" }, { "BeechSmallDescription", "Plant a small beech tree." }, { "FirSmallName", "Small Fir Tree" }, { "FirSmallDescription", "Plant a small fir tree." }, { "FirSmallDeadName", "Small Dead Fir Tree" }, { "FirSmallDeadDescription", "Plant a small dead fir tree." }, { "Bush01Name", "Small Bush 1" }, { "Bush01Description", "Plant a small bush." }, { "Bush02Name", "Small Bush 2" }, { "Bush02Description", "Plant a small bush." }, { "PlainsBushName", "Small Plains Bush" }, { "PlainsBushDescription", "Plant a bush native to the plains." }, { "Shrub01Name", "Small Shrub 1" }, { "Shrub01Description", "Plant a small shrub." }, { "Shrub02Name", "Small Shrub 2" }, { "Shrub02Description", "Plant a small shrub." }, { "YggaShootName", "Small Ygga Shoot" }, { "YggaShootDescription", "Plant a small ygga shoot." }, { "VinesName", "Vines" }, { "VinesDescription", "Plant vines." }, { "AshlandsFernName", "Ashlands Fern" }, { "AshlandsFernDescription", "Plant a fern native to the ashlands." }, { "PickableBranchName", "Pickable Branch" }, { "PickableBranchDescription", "Plant respawning pickable branches." }, { "PickableStoneName", "Pickable Stone" }, { "PickableStoneDescription", "Plant pickable stone." }, { "PickableFlintName", "Pickable Flint" }, { "PickableFlintDescription", "Plant respawning pickable flint." }, { "PickableSmokePuffName", "Pickable Smoke Puff" }, { "PickableSmokePuffDescription", "Plant smoke puffs to grow more pickable smoke puffs." }, { "PickableFiddleheadName", "Pickable Fiddlehead" }, { "PickableFiddleheadDescription", "Plant fiddlehead to grow more pickable fiddlehead." }, { "GrowthTimeHoverPrefix", "Ready in" } }; internal static readonly List<string> VanillaPrefabRefs = new List<string> { "Acorn", "AncientSeed", "BeechSeeds", "BirchSeeds", "FirCone", "PineCone", "Sap", "Pickable_Branch", "Pickable_Dandelion", "Pickable_Fiddlehead", "Pickable_Flint", "Pickable_Mushroom", "Pickable_Mushroom_blue", "Pickable_Mushroom_yellow", "Pickable_SmokePuff", "Pickable_Stone", "Pickable_Thistle", "Cultivator", "sfx_build_cultivator", "vfx_Place_wood_pole", "sapling_barley", "sapling_carrot", "sapling_flax", "sapling_jotunpuffs", "sapling_magecap", "sapling_onion", "sapling_seedcarrot", "sapling_seedonion", "sapling_seedturnip", "sapling_turnip", "FernAshlands", "AshlandsTree3", "AshlandsTree4", "AshlandsTree5", "AshlandsTree6_big", "Beech1", "Beech_Sapling", "Beech_small1", "Birch1", "Birch1_aut", "Birch2", "Birch2_aut", "Birch_Sapling", "BlueberryBush", "Bush01", "Bush01_heath", "Bush02_en", "RaspberryBush", "CloudberryBush", "FirTree", "FirTree_Sapling", "FirTree_small", "FirTree_small_dead", "PineTree_Sapling", "Pinetree_01", "YggaShoot1", "YggaShoot2", "YggaShoot3", "YggaShoot_small1", "shrub_2", "shrub_2_heath", "SwampTree1", "vines", "VineAsh", "VineAsh_sapling", "Oak1", "Oak_Sapling" }; internal static readonly List<string> CustomPrefabRefs = new List<string> { "Ancient_Sapling", "Ygga_Sapling", "Autumn_Birch_Sapling", "Ashwood_Sapling", "Pickable_Dandelion_Picked", "Pickable_Thistle_Picked", "Pickable_Mushroom_Picked", "Pickable_Mushroom_yellow_Picked", "Pickable_Mushroom_blue_Picked", "Pickable_SmokePuff_Picked", "Pickable_Fiddlehead_Picked" }; private static Dictionary<GameObject, GameObject> treesToSeeds; internal static Dictionary<GameObject, GameObject> TreesToSeeds { get { object obj = treesToSeeds; if (obj == null) { obj = new Dictionary<GameObject, GameObject> { { StaticMembers.prefabRefs["Birch1"], StaticMembers.prefabRefs["BirchSeeds"] }, { StaticMembers.prefabRefs["Birch2"], StaticMembers.prefabRefs["BirchSeeds"] }, { StaticMembers.prefabRefs["Birch2_aut"], StaticMembers.prefabRefs["BirchSeeds"] }, { StaticMembers.prefabRefs["Birch1_aut"], StaticMembers.prefabRefs["BirchSeeds"] }, { StaticMembers.prefabRefs["Oak1"], StaticMembers.prefabRefs["Acorn"] }, { StaticMembers.prefabRefs["SwampTree1"], StaticMembers.prefabRefs["AncientSeed"] }, { StaticMembers.prefabRefs["Beech1"], StaticMembers.prefabRefs["BeechSeeds"] }, { StaticMembers.prefabRefs["Pinetree_01"], StaticMembers.prefabRefs["PineCone"] }, { StaticMembers.prefabRefs["FirTree"], StaticMembers.prefabRefs["FirCone"] } }; treesToSeeds = (Dictionary<GameObject, GameObject>)obj; } return (Dictionary<GameObject, GameObject>)obj; } } internal static List<ExtraResource> GenerateExampleResources() { return new List<ExtraResource>(2) { new ExtraResource { prefabName = "PE_FakePrefab1", resourceName = "PretendSeeds1", resourceCost = 1, groundOnly = true, pieceName = "PickableMushrooms", pieceDescription = "Plant this to grow more pickable mushrooms." }, new ExtraResource { prefabName = "PE_FakePrefab2", resourceName = "PretendSeeds2", resourceCost = 2, groundOnly = false } }; } internal static List<PieceDB> GeneratePieceRefs() { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0305: Unknown result type (might be due to invalid IL or missing references) //IL_037f: Unknown result type (might be due to invalid IL or missing references) //IL_03fa: Unknown result type (might be due to invalid IL or missing references) //IL_0475: Unknown result type (might be due to invalid IL or missing references) //IL_0784: Unknown result type (might be due to invalid IL or missing references) //IL_079e: Unknown result type (might be due to invalid IL or missing references) //IL_07b8: Unknown result type (might be due to invalid IL or missing references) //IL_07d2: Unknown result type (might be due to invalid IL or missing references) bool enforceBiomes = StaticMembers.config.EnforceBiomes; List<PieceDB> list = new List<PieceDB>(10) { new PieceDB { key = "RaspberryBush", ResourceCost = StaticMembers.config.RaspberryCost, resourceReturn = StaticMembers.config.RaspberryReturn, respawnTime = StaticMembers.config.RaspberryRespawnTime, biome = (Biome)(enforceBiomes ? 1 : 0), icon = true, isGrounded = true, recover = StaticMembers.config.RecoverResources }, new PieceDB { key = "BlueberryBush", ResourceCost = StaticMembers.config.BlueberryCost, resourceReturn = StaticMembers.config.BlueberryReturn, respawnTime = StaticMembers.config.BlueberryRespawnTime, biome = (Biome)(enforceBiomes ? 8 : 0), icon = true, isGrounded = true, recover = StaticMembers.config.RecoverResources }, new PieceDB { key = "CloudberryBush", ResourceCost = StaticMembers.config.CloudberryCost, resourceReturn = StaticMembers.config.CloudberryReturn, respawnTime = StaticMembers.config.CloudberryRespawnTime, biome = (Biome)(enforceBiomes ? 16 : 0), icon = true, isGrounded = true, recover = StaticMembers.config.RecoverResources }, new PieceDB { key = "Pickable_Mushroom", ResourceCost = StaticMembers.config.MushroomCost, resourceReturn = StaticMembers.config.MushroomReturn, respawnTime = StaticMembers.config.MushroomRespawnTime, recover = StaticMembers.config.RecoverResources, Name = "PickableMushroom", isGrounded = true }, new PieceDB { key = "Pickable_Mushroom_yellow", ResourceCost = StaticMembers.config.YellowMushroomCost, resourceReturn = StaticMembers.config.YellowMushroomReturn, respawnTime = StaticMembers.config.YellowMushroomRespawnTime, recover = StaticMembers.config.RecoverResources, Name = "PickableYellowMushroom", isGrounded = true }, new PieceDB { key = "Pickable_Mushroom_blue", ResourceCost = StaticMembers.config.BlueMushroomCost, resourceReturn = StaticMembers.config.BlueMushroomReturn, respawnTime = StaticMembers.config.BlueMushroomRespawnTime, recover = StaticMembers.config.RecoverResources, Name = "PickableBlueMushroom", isGrounded = true }, new PieceDB { key = "Pickable_Thistle", ResourceCost = StaticMembers.config.ThistleCost, resourceReturn = StaticMembers.config.ThistleReturn, respawnTime = StaticMembers.config.ThistleRespawnTime, biome = (Biome)(enforceBiomes ? 8 : 0), recover = StaticMembers.config.RecoverResources, Name = "PickableThistle", isGrounded = true }, new PieceDB { key = "Pickable_Dandelion", ResourceCost = StaticMembers.config.DandelionCost, resourceReturn = StaticMembers.config.DandelionReturn, respawnTime = StaticMembers.config.DandelionRespawnTime, biome = (Biome)(enforceBiomes ? 1 : 0), recover = StaticMembers.config.RecoverResources, Name = "PickableDandelion", isGrounded = true }, new PieceDB { key = "Pickable_SmokePuff", ResourceCost = StaticMembers.config.SmokePuffCost, resourceReturn = StaticMembers.config.SmokePuffReturn, respawnTime = StaticMembers.config.SmokePuffRespawnTime, biome = (Biome)(enforceBiomes ? 32 : 0), recover = StaticMembers.config.RecoverResources, Name = "PickableSmokePuff", isGrounded = true }, new PieceDB { key = "Pickable_Fiddlehead", ResourceCost = StaticMembers.config.FiddleheadCost, resourceReturn = StaticMembers.config.FiddleheadReturn, respawnTime = StaticMembers.config.FiddleheadRespawnTime, biome = (Biome)(enforceBiomes ? 32 : 0), icon = true, recover = StaticMembers.config.RecoverResources, Name = "PickableFiddlehead", isGrounded = true, extraDrops = true } }; if (StaticMembers.config.EnableMiscFlora) { list.AddRange(new <>z__ReadOnlyArray<PieceDB>(new PieceDB[11] { new PieceDB { key = "Beech_small1", Resource = new KeyValuePair<string, int>("BeechSeeds", 1), icon = true, Name = "BeechSmall", canBeRemoved = false }, new PieceDB { key = "FirTree_small", Resource = new KeyValuePair<string, int>("FirCone", 1), icon = true, Name = "FirSmall", canBeRemoved = false }, new PieceDB { key = "FirTree_small_dead", Resource = new KeyValuePair<string, int>("FirCone", 1), icon = true, Name = "FirSmallDead", canBeRemoved = false }, new PieceDB { key = "Bush01", Resource = new KeyValuePair<string, int>("Wood", 2), icon = true, canBeRemoved = false }, new PieceDB { key = "Bush01_heath", Resource = new KeyValuePair<string, int>("Wood", 2), icon = true, Name = "Bush02", canBeRemoved = false }, new PieceDB { key = "Bush02_en", Resource = new KeyValuePair<string, int>("Wood", 3), icon = true, Name = "PlainsBush", canBeRemoved = false }, new PieceDB { key = "shrub_2", Resource = new KeyValuePair<string, int>("Wood", 2), icon = true, Name = "Shrub01", canBeRemoved = false }, new PieceDB { key = "shrub_2_heath", Resource = new KeyValuePair<string, int>("Wood", 2), icon = true, Name = "Shrub02", canBeRemoved = false }, new PieceDB { key = "YggaShoot_small1", Resources = new Dictionary<string, int> { { "YggdrasilWood", 1 }, { "Wood", 2 } }, icon = true, Name = "YggaShoot", canBeRemoved = false }, new PieceDB { key = "vines", Resource = new KeyValuePair<string, int>("Wood", 2), icon = true, recover = true, Name = "Vines", isGrounded = false, snapPoints = new List<Vector3> { new Vector3(1f, 0.5f, 0f), new Vector3(-1f, 0.5f, 0f), new Vector3(1f, -1f, 0f), new Vector3(-1f, -1f, 0f) } }, new PieceDB { key = "FernAshlands", Resource = new KeyValuePair<string, int>("Wood", 2), icon = true, Name = "AshlandsFern", isGrounded = true, canBeRemoved = false } })); } if (StaticMembers.config.EnableDebris) { list.AddRange(new <>z__ReadOnlyArray<PieceDB>(new PieceDB[3] { new PieceDB { key = "Pickable_Branch", ResourceCost = StaticMembers.config.PickableBranchCost, resourceReturn = StaticMembers.config.PickableBranchReturn, respawnTime = StaticMembers.config.PickableBranchRespawnTime, recover = StaticMembers.config.RecoverResources, Name = "PickableBranch", isGrounded = true }, new PieceDB { key = "Pickable_Stone", ResourceCost = StaticMembers.config.PickableStoneCost, resourceReturn = StaticMembers.config.PickableStoneReturn, respawnTime = StaticMembers.config.PickableStoneRespawnTime, recover = StaticMembers.config.RecoverResources, Name = "PickableStone", isGrounded = true, hideWhenPicked = true }, new PieceDB { key = "Pickable_Flint", ResourceCost = StaticMembers.config.PickableFlintCost, resourceReturn = StaticMembers.config.PickableFlintReturn, respawnTime = StaticMembers.config.PickableFlintRespawnTime, recover = StaticMembers.config.RecoverResources, Name = "PickableFlint", isGrounded = true } })); } if (StaticMembers.config.EnableExtraResources) { List<string> list2 = StaticMembers.layersForPieceRemoval.ToList(); bool resolveMissingReferences = false; foreach (ExtraResource deserializedExtraResource in StaticMembers.deserializedExtraResources) { if (!StaticMembers.prefabRefs.ContainsKey(deserializedExtraResource.prefabName) || !Object.op_Implicit((Object)(object)StaticMembers.prefabRefs[deserializedExtraResource.prefabName])) { StaticMembers.Dbgl(deserializedExtraResource.prefabName + " is not in dictionary of prefab references or has a null value", forceLog: false, (LogLevel)4); resolveMissingReferences = true; continue; } ObjectDB instance = ObjectDB.instance; object obj; if (instance == null) { obj = null; } else { GameObject itemPrefab = instance.GetItemPrefab(deserializedExtraResource.resourceName); obj = ((itemPrefab != null) ? itemPrefab.GetComponent<ItemDrop>() : null); } if (!Object.op_Implicit((Object)obj)) { StaticMembers.Dbgl(deserializedExtraResource.prefabName + "'s required resource " + deserializedExtraResource.resourceName + " not found", forceLog: false, (LogLevel)4); resolveMissingReferences = true; continue; } list.Add(new PieceDB { key = deserializedExtraResource.prefabName, Resource = new KeyValuePair<string, int>(deserializedExtraResource.resourceName, deserializedExtraResource.resourceCost), isGrounded = deserializedExtraResource.groundOnly, extraResource = true, pieceName = ((deserializedExtraResource.pieceName == "") ? deserializedExtraResource.prefabName : deserializedExtraResource.pieceName), pieceDescription = deserializedExtraResource.pieceDescription }); Collider[] componentsInChildren = StaticMembers.prefabRefs[deserializedExtraResource.prefabName].GetComponentsInChildren<Collider>(); for (int i = 0; i < componentsInChildren.Length; i++) { string item = LayerMask.LayerToName(((Component)componentsInChildren[i]).gameObject.layer); list2.Add(item); } } StaticMembers.layersForPieceRemoval = list2.Distinct().ToArray(); StaticMembers.resolveMissingReferences = resolveMissingReferences; } return list; } internal static List<SaplingDB> GenerateCustomSaplingRefs() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02c1: Unknown result type (might be due to invalid IL or missing references) List<SaplingDB> list = new List<SaplingDB>(4); list.Add(new SaplingDB { key = "Ashwood_Sapling", biome = (Biome)(StaticMembers.config.EnforceBiomes ? 57 : ((int)StaticMembers.AllBiomes)), source = "AshlandsTree3", Resources = new Dictionary<string, int> { { "BeechSeeds", 1 }, { "SulfurStone", 1 } }, icon = true, growTime = StaticMembers.config.AshwoodGrowthTime, growRadius = StaticMembers.config.AshwoodGrowRadius, minScale = StaticMembers.config.AshwoodMinScale, maxScale = StaticMembers.config.AshwoodMaxScale, grownPrefabs = (GameObject[])(object)new GameObject[4] { StaticMembers.prefabRefs["AshlandsTree3"], StaticMembers.prefabRefs["AshlandsTree4"], StaticMembers.prefabRefs["AshlandsTree5"], StaticMembers.prefabRefs["AshlandsTree6_big"] }, tolerateHeat = true }); list.Add(new SaplingDB { key = "Ygga_Sapling", biome = (Biome)(StaticMembers.config.EnforceBiomes ? 537 : ((int)StaticMembers.AllBiomes)), source = "YggaShoot_small1", Resource = new KeyValuePair<string, int>("Sap", 1), icon = true, growTime = StaticMembers.config.YggaGrowthTime, growRadius = StaticMembers.config.YggaGrowRadius, minScale = StaticMembers.config.YggaMinScale, maxScale = StaticMembers.config.YggaMaxScale, grownPrefabs = (GameObject[])(object)new GameObject[3] { StaticMembers.prefabRefs["YggaShoot1"], StaticMembers.prefabRefs["YggaShoot2"], StaticMembers.prefabRefs["YggaShoot3"] } }); list.Add(new SaplingDB { key = "Ancient_Sapling", biome = (Biome)(StaticMembers.config.EnforceBiomes ? 27 : ((int)StaticMembers.AllBiomes)), source = "SwampTree1", Resource = new KeyValuePair<string, int>("AncientSeed", 1), icon = true, growTime = StaticMembers.config.AncientGrowthTime, growRadius = StaticMembers.config.AncientGrowRadius, minScale = StaticMembers.config.AncientMinScale, maxScale = StaticMembers.config.AncientMaxScale, grownPrefabs = (GameObject[])(object)new GameObject[1] { StaticMembers.prefabRefs["SwampTree1"] } }); list.Add(new SaplingDB { key = "Autumn_Birch_Sapling", biome = (Biome)(StaticMembers.config.EnforceBiomes ? 25 : ((int)StaticMembers.AllBiomes)), source = "Birch1_aut", Resource = new KeyValuePair<string, int>("BirchSeeds", 1), icon = true, growTime = StaticMembers.config.AutumnBirchGrowthTime, growRadius = StaticMembers.config.AutumnBirchGrowRadius, minScale = StaticMembers.config.AutumnBirchMinScale, maxScale = StaticMembers.config.AutumnBirchMaxScale, grownPrefabs = (GameObject[])(object)new GameObject[2] { StaticMembers.prefabRefs["Birch1_aut"], StaticMembers.prefabRefs["Birch2_aut"] } }); return list; } internal static List<SaplingDB> GenerateVanillaSaplingRefs() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) return new List<SaplingDB>(5) { new SaplingDB { key = "Beech_Sapling", biome = (Biome)(StaticMembers.config.EnforceBiomesVanilla ? 25 : ((int)StaticMembers.AllBiomes)), growTime = StaticMembers.config.BeechGrowthTime, growRadius = StaticMembers.config.BeechGrowRadius, minScale = StaticMembers.config.BeechMinScale, maxScale = StaticMembers.config.BeechMaxScale }, new SaplingDB { key = "PineTree_Sapling", biome = (Biome)(StaticMembers.config.EnforceBiomesVanilla ? 25 : ((int)StaticMembers.AllBiomes)), growTime = StaticMembers.config.PineGrowthTime, growRadius = StaticMembers.config.PineGrowRadius, minScale = StaticMembers.config.PineMinScale, maxScale = StaticMembers.config.PineMaxScale }, new SaplingDB { key = "FirTree_Sapling", biome = (Biome)(StaticMembers.config.EnforceBiomesVanilla ? 29 : ((int)StaticMembers.AllBiomes)), growTime = StaticMembers.config.FirGrowthTime, growRadius = StaticMembers.config.FirGrowRadius, minScale = StaticMembers.config.FirMinScale, maxScale = StaticMembers.config.FirMaxScale, tolerateCold = true }, new SaplingDB { key = "Birch_Sapling", biome = (Biome)(StaticMembers.config.EnforceBiomesVanilla ? 25 : ((int)StaticMembers.AllBiomes)), growTime = StaticMembers.config.BirchGrowthTime, growRadius = StaticMembers.config.BirchGrowRadius, minScale = StaticMembers.config.BirchMinScale, maxScale = StaticMembers.config.BirchMaxScale }, new SaplingDB { key = "Oak_Sapling", biome = (Biome)(StaticMembers.config.EnforceBiomesVanilla ? 25 : ((int)StaticMembers.AllBiomes)), growTime = StaticMembers.config.OakGrowthTime, growRadius = StaticMembers.config.OakGrowRadius, minScale = StaticMembers.config.OakMinScale, maxScale = StaticMembers.config.OakMaxScale } }; } internal static List<PrefabDB> GenerateCropRefs() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_0281: Unknown result type (might be due to invalid IL or missing references) //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_02d8: Unknown result type (might be due to invalid IL or missing references) //IL_02e4: Unknown result type (might be due to invalid IL or missing references) //IL_0336: Unknown result type (might be due to invalid IL or missing references) //IL_0342: Unknown result type (might be due to invalid IL or missing references) bool enableCropOverrides = StaticMembers.config.EnableCropOverrides; bool enforceBiomesVanilla = StaticMembers.config.EnforceBiomesVanilla; return new List<PrefabDB>(10) { new PrefabDB { key = "sapling_barley", biome = (Biome)(enforceBiomesVanilla ? 16 : ((int)StaticMembers.AllBiomes)), resourceCost = ((!enableCropOverrides) ? 1 : StaticMembers.config.BarleyCost), resourceReturn = (enableCropOverrides ? StaticMembers.config.BarleyReturn : 2) }, new PrefabDB { key = "sapling_carrot", biome = (Biome)(enforceBiomesVanilla ? 25 : ((int)StaticMembers.AllBiomes)), resourceCost = ((!enableCropOverrides) ? 1 : StaticMembers.config.CarrotCost), resourceReturn = ((!enableCropOverrides) ? 1 : StaticMembers.config.CarrotReturn) }, new PrefabDB { key = "sapling_flax", biome = (Biome)(enforceBiomesVanilla ? 16 : ((int)StaticMembers.AllBiomes)), resourceCost = ((!enableCropOverrides) ? 1 : StaticMembers.config.FlaxCost), resourceReturn = (enableCropOverrides ? StaticMembers.config.FlaxReturn : 2) }, new PrefabDB { key = "sapling_onion", biome = (Biome)(enforceBiomesVanilla ? 25 : ((int)StaticMembers.AllBiomes)), resourceCost = ((!enableCropOverrides) ? 1 : StaticMembers.config.OnionCost), resourceReturn = ((!enableCropOverrides) ? 1 : StaticMembers.config.OnionReturn) }, new PrefabDB { key = "sapling_seedcarrot", biome = (Biome)(enforceBiomesVanilla ? 25 : ((int)StaticMembers.AllBiomes)), resourceCost = ((!enableCropOverrides) ? 1 : StaticMembers.config.SeedCarrotCost), resourceReturn = (enableCropOverrides ? StaticMembers.config.SeedCarrotReturn : 3) }, new PrefabDB { key = "sapling_seedonion", biome = (Biome)(enforceBiomesVanilla ? 25 : ((int)StaticMembers.AllBiomes)), resourceCost = ((!enableCropOverrides) ? 1 : StaticMembers.config.SeedOnionCost), resourceReturn = (enableCropOverrides ? StaticMembers.config.SeedOnionReturn : 3) }, new PrefabDB { key = "sapling_seedturnip", biome = (Biome)(enforceBiomesVanilla ? 539 : ((int)StaticMembers.AllBiomes)), resourceCost = ((!enableCropOverrides) ? 1 : StaticMembers.config.SeedTurnipCost), resourceReturn = (enableCropOverrides ? StaticMembers.config.SeedTurnipReturn : 3) }, new PrefabDB { key = "sapling_turnip", biome = (Biome)(enforceBiomesVanilla ? 539 : ((int)StaticMembers.AllBiomes)), resourceCost = ((!enableCropOverrides) ? 1 : StaticMembers.config.TurnipCost), resourceReturn = ((!enableCropOverrides) ? 1 : StaticMembers.config.TurnipReturn) }, new PrefabDB { key = "sapling_magecap", biome = (Biome)(enforceBiomesVanilla ? 512 : ((int)StaticMembers.AllBiomes)), resourceCost = ((!enableCropOverrides) ? 1 : StaticMembers.config.MagecapCost), resourceReturn = ((!enableCropOverrides) ? 1 : StaticMembers.config.MagecapReturn), extraDrops = true }, new PrefabDB { key = "sapling_jotunpuffs", biome = (Biome)(enforceBiomesVanilla ? 512 : ((int)StaticMembers.AllBiomes)), resourceCost = ((!enableCropOverrides) ? 1 : StaticMembers.config.JotunPuffsCost), resourceReturn = ((!enableCropOverrides) ? 1 : StaticMembers.config.JotunPuffsReturn), extraDrops = true } }; } internal static List<ModdedPlantDB> GenerateCustomPlantRefs(List<GameObject> customPlants) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) List<ModdedPlantDB> list = new List<ModdedPlantDB>(); foreach (GameObject customPlant in customPlants) { Plant component = customPlant.GetComponent<Plant>(); list.Add(new ModdedPlantDB { key = ((Object)customPlant).name, biome = component.m_biome, tolerateCold = component.m_tolerateCold, tolerateHeat = component.m_tolerateHeat, minScale = component.m_minScale, maxScale = component.m_maxScale, growTime = component.m_growTime, growTimeMax = component.m_growTimeMax, growRadius = component.m_growRadius }); StaticMembers.prefabRefs[((Object)customPlant).name] = customPlant; } return list; } } internal sealed class ModConfig { private readonly ConfigFile ConfigFile; private readonly ConfigSync ConfigSync; private ConfigEntry<bool> serverConfigLocked; internal ConfigEntry<int> nexusID; private ConfigEntry<bool> enableDebugMessages; private ConfigEntry<bool> showPickableSpawners; private ConfigEntry<bool> enableMiscFlora; private ConfigEntry<bool> enableDebris; private ConfigEntry<bool> enableExtraResources; private ConfigEntry<bool> snappableVines; private ConfigEntry<bool> enableLocalization; private ConfigEntry<string> language; private ConfigEntry<string> disabledResourceNames; private ConfigEntry<bool> requireCultivation; private ConfigEntry<bool> placeAnywhere; private ConfigEntry<bool> enforceBiomes; private ConfigEntry<bool> enforceBiomesVanilla; private ConfigEntry<bool> plantsRequireShielding; private ConfigEntry<bool> canRemoveFlora; private ConfigEntry<bool> recoverResources; private ConfigEntry<bool> resourcesSpawnEmpty; private ConfigEntry<bool> enemiesTargetPieces; private ConfigEntry<int> raspberryCost; private ConfigEntry<int> blueberryCost; private ConfigEntry<int> cloudberryCost; private ConfigEntry<int> raspberryRespawnTime; private ConfigEntry<int> blueberryRespawnTime; private ConfigEntry<int> cloudberryRespawnTime; private ConfigEntry<int> raspberryReturn; private ConfigEntry<int> blueberryReturn; private ConfigEntry<int> cloudberryReturn; private ConfigEntry<bool> enableCropOverrides; private ConfigEntry<bool> overrideModdedCrops; private ConfigEntry<bool> cropRequireCultivation; private ConfigEntry<bool> cropRequireSunlight; private ConfigEntry<bool> cropRequireGrowthSpace; private ConfigEntry<bool> enemiesTargetCrops; private ConfigEntry<float> cropMinScale; private ConfigEntry<float> cropMaxScale; private ConfigEntry<float> cropGrowTimeMin; private ConfigEntry<float> cropGrowTimeMax; private ConfigEntry<float> cropGrowRadius; private ConfigEntry<int> barleyCost; private ConfigEntry<int> barleyReturn; private ConfigEntry<int> carrotCost; private ConfigEntry<int> carrotReturn; private ConfigEntry<int> flaxCost; private ConfigEntry<int> flaxReturn; private ConfigEntry<int> onionCost; private ConfigEntry<int> onionReturn; private ConfigEntry<int> seedCarrotCost; private ConfigEntry<int> seedCarrotReturn; private ConfigEntry<int> seedOnionCost; private ConfigEntry<int> seedOnionReturn; private ConfigEntry<int> seedTurnipCost; private ConfigEntry<int> seedTurnipReturn; private ConfigEntry<int> turnipCost; private ConfigEntry<int> turnipReturn; private ConfigEntry<int> magecapCost; private ConfigEntry<int> magecapReturn; private ConfigEntry<int> jotunPuffsCost; private ConfigEntry<int> jotunPuffsReturn; private ConfigEntry<int> pickableBranchCost; private ConfigEntry<int> pickableBranchReturn; private ConfigEntry<int> pickableBranchRespawnTime; private ConfigEntry<int> pickableStoneCost; private ConfigEntry<int> pickableStoneReturn; private ConfigEntry<int> pickableStoneRespawnTime; private ConfigEntry<int> pickableFlintCost; private ConfigEntry<int> pickableFlintReturn; private ConfigEntry<int> pickableFlintRespawnTime; private ConfigEntry<int> mushroomCost; private ConfigEntry<int> yellowMushroomCost; private ConfigEntry<int> blueMushroomCost; private ConfigEntry<int> smokePuffCost; private ConfigEntry<int> mushroomRespawnTime; private ConfigEntry<int> yellowMushroomRespawnTime; private ConfigEntry<int> blueMushroomRespawnTime; private ConfigEntry<int> smokePuffRespawnTime; private ConfigEntry<int> mushroomReturn; private ConfigEntry<int> yellowMushroomReturn; private ConfigEntry<int> blueMushroomReturn; private ConfigEntry<int> smokePuffReturn; private ConfigEntry<int> thistleCost; private ConfigEntry<int> dandelionCost; private ConfigEntry<int> fiddleheadCost; private ConfigEntry<int> thistleRespawnTime; private ConfigEntry<int> dandelionRespawnTime; private ConfigEntry<int> fiddleheadRespawnTime; private ConfigEntry<int> thistleReturn; private ConfigEntry<int> dandelionReturn; private ConfigEntry<int> fiddleheadReturn; private ConfigEntry<bool> overrideModdedSaplings; private ConfigEntry<float> moddedSaplingMinScale; private ConfigEntry<float> moddedSaplingMaxScale; private ConfigEntry<float> moddedSaplingGrowthTime; private ConfigEntry<float> moddedSaplingGrowRadius; private ConfigEntry<float> birchMinScale; private ConfigEntry<float> birchMaxScale; private ConfigEntry<float> oakMinScale; private ConfigEntry<float> oakMaxScale; private ConfigEntry<float> ancientMinScale; private ConfigEntry<float> ancientMaxScale; private ConfigEntry<float> birchGrowthTime; private ConfigEntry<float> oakGrowthTime; private ConfigEntry<float> ancientGrowthTime; private ConfigEntry<float> birchGrowRadius; private ConfigEntry<float> oakGrowRadius; private ConfigEntry<float> ancientGrowRadius; private ConfigEntry<float> beechGrowthTime; private ConfigEntry<float> pineGrowthTime; private ConfigEntry<float> firGrowthTime; private ConfigEntry<float> beechMinScale; private ConfigEntry<float> beechMaxScale; private ConfigEntry<float> pineMinScale; private ConfigEntry<float> pineMaxScale; private ConfigEntry<float> firMinScale; private ConfigEntry<float> firMaxScale; private ConfigEntry<float> beechGrowRadius; private ConfigEntry<float> pineGrowRadius; private ConfigEntry<float> firGrowRadius; private ConfigEntry<float> yggaMinScale; private ConfigEntry<float> yggaMaxScale; private ConfigEntry<float> yggaGrowthTime; private ConfigEntry<float> yggaGrowRadius; private ConfigEntry<float> autumnBirchMinScale; private ConfigEntry<float> autumnBirchMaxScale; private ConfigEntry<float> autumnBirchGrowthTime; private ConfigEntry<float> autumnBirchGrowRadius; private ConfigEntry<float> ashwoodMinScale; private ConfigEntry<float> ashwoodMaxScale; private ConfigEntry<float> ashwoodGrowthTime; private ConfigEntry<float> ashwoodGrowRadius; private ConfigEntry<bool> enableSeedOverrides; private ConfigEntry<int> seedDropMin; private ConfigEntry<int> seedDropMax; private ConfigEntry<int> treeDropMin; private ConfigEntry<int> treeDropMax; private ConfigEntry<float> dropChance; private ConfigEntry<bool> oneOfEach; private ConfigEntry<bool> enablePickableTimers; private ConfigEntry<bool> enablePlantTimers; private ConfigEntry<bool> growthAsPercentage; private ConfigEntry<bool> enableVineOverrides; private ConfigEntry<float> vineAttachDistance; private ConfigEntry<float> vineGrowRadius; private ConfigEntry<float> vineGrowthTime; private ConfigEntry<int> vineBerryRespawnTime; private ConfigEntry<int> vineBerryReturn; private CustomSyncedValue<List<string>> extraResources; private readonly ConfigurationManagerAttributes seedSettingAtrributes = new ConfigurationManagerAttributes(); private readonly List<ConfigurationManagerAttributes> cropSettingAttributes = new List<ConfigurationManagerAttributes>(2) { new ConfigurationManagerAttributes(), new ConfigurationManagerAttributes { Order = 27 } }; internal bool EnableDebugMessages => enableDebugMessages.Value; internal bool ShowPickableSpawners => showPickableSpawners.Value; internal bool EnableMiscFlora => enableMiscFlora.Value; internal bool EnableDebris => enableDebris.Value; internal bool EnableExtraResources => enableExtraResources.Value; internal bool SnappableVines => snappableVines.Value; internal bool EnableLocalization => enableLocalization.Value; internal string Language => language.Value; internal string[] DisabledResourceNames => disabledResourceNames.Value.Split(new char[1] { ',' }); internal bool RequireCultivation => requireCultivation.Value; internal bool PlaceAnywhere => placeAnywhere.Value; internal bool EnforceBiomes => enforceBiomes.Value; internal bool EnforceBiomesVanilla => enforceBiomesVanilla.Value; internal bool PlantsRequireShielding => plantsRequireShielding.Value; internal bool CanRemoveFlora => canRemoveFlora.Value; internal bool RecoverResources => recoverResources.Value; internal bool ResourcesSpawnEmpty => resourcesSpawnEmpty.Value; internal bool EnemiesTargetPieces => enemiesTargetPieces.Value; internal int RaspberryCost => raspberryCost.Value; internal int BlueberryCost => blueberryCost.Value; internal int CloudberryCost => cloudberryCost.Value; internal int RaspberryRespawnTime => raspberryRespawnTime.Value; internal int BlueberryRespawnTime => blueberryRespawnTime.Value; internal int CloudberryRespawnTime => cloudberryRespawnTime.Value; internal int RaspberryReturn => raspberryReturn.Value; internal int BlueberryReturn => blueberryReturn.Value; internal int CloudberryReturn => cloudberryReturn.Value; internal bool EnableCropOverrides => enableCropOverrides.Value; internal bool OverrideModdedCrops => overrideModdedCrops.Value; internal float CropMinScale => cropMinScale.Value; internal float CropMaxScale => cropMaxScale.Value; internal float CropGrowTimeMin => Mathf.Max(cropGrowTimeMin.Value, 10f); internal float CropGrowTimeMax => Mathf.Max(cropGrowTimeMax.Value, 10f); internal float CropGrowRadius => cropGrowRadius.Value; internal bool CropRequireCultivation => cropRequireCultivation.Value; internal bool CropRequireSunlight => cropRequireSunlight.Value; internal bool CropRequireGrowthSpace => cropRequireGrowthSpace.Value; internal bool EnemiesTargetCrops => enemiesTargetCrops.Value; internal int BarleyCost => barleyCost.Value; internal int BarleyReturn => barleyReturn.Value; internal int CarrotCost => carrotCost.Value; internal int CarrotReturn => carrotReturn.Value; internal int FlaxCost => flaxCost.Value; internal int FlaxReturn => flaxReturn.Value; internal int OnionCost => onionCost.Value; internal int OnionReturn => onionReturn.Value; internal int SeedCarrotCost => seedCarrotCost.Value; internal int SeedCarrotReturn => seedCarrotReturn.Value; internal int SeedOnionCost => seedOnionCost.Value; internal int SeedOnionReturn => seedOnionReturn.Value; internal int SeedTurnipCost => seedTurnipCost.Value; internal int SeedTurnipReturn => seedTurnipReturn.Value; internal int TurnipCost => turnipCost.Value; internal int TurnipReturn => turnipReturn.Value; internal int MagecapCost => magecapCost.Value; internal int MagecapReturn => magecapReturn.Value; internal int JotunPuffsCost => jotunPuffsCost.Value; internal int JotunPuffsReturn => jotunPuffsReturn.Value; internal int PickableBranchCost => pickableBranchCost.Value; internal int PickableBranchReturn => pickableBranchReturn.Value; internal int PickableBranchRespawnTime => pickableBranchRespawnTime.Value; internal int PickableStoneCost => pickableStoneCost.Value; internal int PickableStoneReturn => pickableStoneReturn.Value; internal int PickableStoneRespawnTime => pickableStoneRespawnTime.Value; internal int PickableFlintCost => pickableFlintCost.Value; internal int PickableFlintReturn => pickableFlintReturn.Value; internal int PickableFlintRespawnTime => pickableFlintRespawnTime.Value; internal int MushroomCost => mushroomCost.Value; internal int YellowMushroomCost => yellowMushroomCost.Value; internal int BlueMushroomCost => blueMushroomCost.Value; internal int SmokePuffCost => smokePuffCost.Value; internal int MushroomRespawnTime => mushroomRespawnTime.Value; internal int YellowMushroomRespawnTime => yellowMushroomRespawnTime.Value; internal int BlueMushroomRespawnTime => blueMushroomRespawnTime.Value; internal int SmokePuffRespawnTime => smokePuffRespawnTime.Value; internal int MushroomReturn => mushroomReturn.Value; internal int YellowMushroomReturn => yellowMushroomReturn.Value; internal int BlueMushroomReturn => blueMushroomReturn.Value; internal int SmokePuffReturn => smokePuffReturn.Value; internal int ThistleCost => thistleCost.Value; internal int DandelionCost => dandelionCost.Value; internal int Fidd